Debugger: GB Event Viewer - Fixed tooltip display for DMA reads/writes

This commit is contained in:
Sour 2020-06-02 20:42:58 -04:00
parent 1689ea4d3f
commit 8a37a7ed76
5 changed files with 25 additions and 10 deletions

View file

@ -366,7 +366,7 @@ void GbCpu::HalfCycle()
uint8_t GbCpu::ReadOpCode()
{
HalfCycle();
uint8_t value = _memoryManager->Read(_state.PC, MemoryOperationType::ExecOpCode);
uint8_t value = _memoryManager->Read<MemoryOperationType::ExecOpCode>(_state.PC);
HalfCycle();
_state.PC++;
return value;
@ -375,7 +375,7 @@ uint8_t GbCpu::ReadOpCode()
uint8_t GbCpu::ReadCode()
{
HalfCycle();
uint8_t value = _memoryManager->Read(_state.PC, MemoryOperationType::ExecOperand);
uint8_t value = _memoryManager->Read<MemoryOperationType::ExecOperand>(_state.PC);
HalfCycle();
_state.PC++;
return value;
@ -391,7 +391,7 @@ uint16_t GbCpu::ReadCodeWord()
uint8_t GbCpu::Read(uint16_t addr)
{
HalfCycle();
uint8_t value = _memoryManager->Read(addr, MemoryOperationType::Read);
uint8_t value = _memoryManager->Read<MemoryOperationType::Read>(addr);
HalfCycle();
return value;
}

View file

@ -117,11 +117,11 @@ void GbDmaController::ProcessDmaBlock()
//2 or 4 cycles per byte transfered (2x more cycles in high speed mode - effective speed is the same in both modes
_memoryManager->Exec();
uint8_t value = _memoryManager->Read(_state.CgbDmaSource + i, MemoryOperationType::DmaRead);
uint8_t value = _memoryManager->Read<MemoryOperationType::DmaRead>(_state.CgbDmaSource + i);
if(_memoryManager->IsHighSpeed()) {
_memoryManager->Exec();
}
_memoryManager->Write(dst, value);
_memoryManager->Write<MemoryOperationType::DmaWrite>(dst, value);
}
//Source/Dest/Length are all modified by the DMA process and keep their last value after DMA completes

View file

@ -139,7 +139,8 @@ void GbMemoryManager::Unmap(uint16_t start, uint16_t end)
}
}
uint8_t GbMemoryManager::Read(uint16_t addr, MemoryOperationType opType)
template<MemoryOperationType opType>
uint8_t GbMemoryManager::Read(uint16_t addr)
{
uint8_t value = 0;
if(_state.IsReadRegister[addr >> 8]) {
@ -174,9 +175,10 @@ uint8_t GbMemoryManager::ReadDma(uint16_t addr)
return value;
}
template<MemoryOperationType type>
void GbMemoryManager::Write(uint16_t addr, uint8_t value)
{
_console->ProcessMemoryWrite<CpuType::Gameboy>(addr, value, MemoryOperationType::Write);
_console->ProcessMemoryWrite<CpuType::Gameboy>(addr, value, type);
if(_state.IsWriteRegister[addr >> 8]) {
WriteRegister(addr, value);
} else if(_writes[addr >> 8]) {
@ -458,3 +460,10 @@ void GbMemoryManager::Serialize(Serializer& s)
RefreshMappings();
}
}
template uint8_t GbMemoryManager::Read<MemoryOperationType::Read>(uint16_t addr);
template uint8_t GbMemoryManager::Read<MemoryOperationType::ExecOpCode>(uint16_t addr);
template uint8_t GbMemoryManager::Read<MemoryOperationType::ExecOperand>(uint16_t addr);
template uint8_t GbMemoryManager::Read<MemoryOperationType::DmaRead>(uint16_t addr);
template void GbMemoryManager::Write<MemoryOperationType::Write>(uint16_t addr, uint8_t value);
template void GbMemoryManager::Write<MemoryOperationType::DmaWrite>(uint16_t addr, uint8_t value);

View file

@ -14,6 +14,8 @@ class EmuSettings;
class Console;
class ControlManager;
enum class MemoryOperationType;
class GbMemoryManager : public ISerializable
{
private:
@ -48,10 +50,14 @@ public:
void Exec();
uint8_t Read(uint16_t addr, MemoryOperationType opType);
template<MemoryOperationType type = MemoryOperationType::Read>
uint8_t Read(uint16_t addr);
bool IsOamDmaRunning();
void WriteDma(uint16_t addr, uint8_t value);
uint8_t ReadDma(uint16_t addr);
template<MemoryOperationType type = MemoryOperationType::Write>
void Write(uint16_t addr, uint8_t value);
uint8_t ReadRegister(uint16_t addr);

View file

@ -234,7 +234,7 @@ namespace Mesen.GUI.Debugger
switch(evt.Type) {
case DebugEventType.Register:
bool isWrite = evt.Operation.Type == MemoryOperationType.Write || evt.Operation.Type == MemoryOperationType.DmaWrite;
bool isDma = evt.Operation.Type == MemoryOperationType.DmaWrite|| evt.Operation.Type == MemoryOperationType.DmaRead;
bool isDma = evt.Operation.Type == MemoryOperationType.DmaWrite || evt.Operation.Type == MemoryOperationType.DmaRead;
CodeLabel label = LabelManager.GetLabel(new AddressInfo() { Address = (int)evt.Operation.Address, Type = SnesMemoryType.CpuMemory });
string registerText = "$" + evt.Operation.Address.ToString("X4");
@ -245,7 +245,7 @@ namespace Mesen.GUI.Debugger
values["Register"] = registerText + (isWrite ? " (Write)" : " (Read)") + (isDma ? " (DMA)" : "");
values["Value"] = "$" + evt.Operation.Value.ToString("X2");
if(isDma) {
if(isDma && !_isGameboy) {
bool indirectHdma = false;
values["Channel"] = (evt.DmaChannel & 0x07).ToString();