Debugger: GB Event Viewer - Fixed tooltip display for DMA reads/writes
This commit is contained in:
parent
1689ea4d3f
commit
8a37a7ed76
5 changed files with 25 additions and 10 deletions
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
|
@ -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);
|
||||
|
|
|
@ -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();
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue