Debugger: GB - Added uninit read break option

This commit is contained in:
Sour 2020-06-06 23:12:03 -04:00
parent 556d060b02
commit 9b1f6ef3f9
5 changed files with 25 additions and 12 deletions

View file

@ -22,11 +22,11 @@
GbDebugger::GbDebugger(Debugger* debugger)
{
_debugger = debugger;
_console = debugger->GetConsole().get();
_traceLogger = debugger->GetTraceLogger().get();
_disassembler = debugger->GetDisassembler().get();
_memoryAccessCounter = debugger->GetMemoryAccessCounter().get();
_gameboy = debugger->GetConsole()->GetCartridge()->GetGameboy();
_memoryManager = debugger->GetConsole()->GetMemoryManager().get();
_settings = debugger->GetConsole()->GetSettings().get();
_codeDataLogger.reset(new CodeDataLogger(_gameboy->DebugGetMemorySize(SnesMemoryType::GbPrgRom), CpuType::Gameboy));
@ -35,6 +35,11 @@ GbDebugger::GbDebugger(Debugger* debugger)
_breakpointManager.reset(new BreakpointManager(debugger, CpuType::Gameboy, _eventManager.get()));
_step.reset(new StepRequest());
_assembler.reset(new GbAssembler(debugger->GetLabelManager()));
if(_gameboy->GetState().MemoryManager.ApuCycleCount == 0) {
//Enable breaking on uninit reads when debugger is opened at power on
_enableBreakOnUninitRead = true;
}
}
GbDebugger::~GbDebugger()
@ -97,18 +102,27 @@ void GbDebugger::ProcessRead(uint16_t addr, uint8_t value, MemoryOperationType t
_step->StepCount--;
}
_memoryAccessCounter->ProcessMemoryExec(addressInfo, _memoryManager->GetMasterClock());
_memoryAccessCounter->ProcessMemoryExec(addressInfo, _console->GetMasterClock());
} else if(type == MemoryOperationType::ExecOperand) {
if(addressInfo.Address >= 0 && addressInfo.Type == SnesMemoryType::GbPrgRom) {
_codeDataLogger->SetFlags(addressInfo.Address, CdlFlags::Code);
}
_memoryAccessCounter->ProcessMemoryExec(addressInfo, _memoryManager->GetMasterClock());
_memoryAccessCounter->ProcessMemoryExec(addressInfo, _console->GetMasterClock());
} else {
if(addressInfo.Address >= 0 && addressInfo.Type == SnesMemoryType::GbPrgRom) {
_codeDataLogger->SetFlags(addressInfo.Address, CdlFlags::Data);
}
_memoryAccessCounter->ProcessMemoryRead(addressInfo, _memoryManager->GetMasterClock());
if(addr < 0xFE00 || addr >= 0xFF80) {
if(_memoryAccessCounter->ProcessMemoryRead(addressInfo, _console->GetMasterClock())) {
//Memory access was a read on an uninitialized memory address
if(_enableBreakOnUninitRead && _settings->CheckDebuggerFlag(DebuggerFlags::BreakOnUninitRead)) {
breakSource = BreakSource::BreakOnUninitMemoryRead;
_step->StepCount = 0;
}
}
}
if(addr == 0xFFFF || (addr >= 0xFE00 && addr < 0xFF80) || (addr >= 0x8000 && addr <= 0x9FFF)) {
_eventManager->AddEvent(DebugEventType::Register, operation);
}
@ -131,7 +145,7 @@ void GbDebugger::ProcessWrite(uint16_t addr, uint8_t value, MemoryOperationType
_eventManager->AddEvent(DebugEventType::Register, operation);
}
_memoryAccessCounter->ProcessMemoryWrite(addressInfo, _memoryManager->GetMasterClock());
_memoryAccessCounter->ProcessMemoryWrite(addressInfo, _console->GetMasterClock());
}
void GbDebugger::Run()

View file

@ -9,7 +9,7 @@ class TraceLogger;
class Gameboy;
class CallstackManager;
class MemoryAccessCounter;
class MemoryManager;
class Console;
class BreakpointManager;
class EmuSettings;
class GbEventManager;
@ -19,10 +19,10 @@ class CodeDataLogger;
class GbDebugger final : public IDebugger
{
Debugger* _debugger;
Console* _console;
Disassembler* _disassembler;
TraceLogger* _traceLogger;
MemoryAccessCounter* _memoryAccessCounter;
MemoryManager* _memoryManager;
Gameboy* _gameboy;
EmuSettings* _settings;
@ -35,6 +35,7 @@ class GbDebugger final : public IDebugger
uint8_t _prevOpCode = 0xFF;
uint32_t _prevProgramCounter = 0;
bool _enableBreakOnUninitRead = false;
public:
GbDebugger(Debugger* debugger);

View file

@ -32,7 +32,7 @@ MemoryAccessCounter::MemoryAccessCounter(Debugger* debugger, Console *console)
bool MemoryAccessCounter::IsAddressUninitialized(AddressInfo &addressInfo)
{
if(addressInfo.Type != SnesMemoryType::PrgRom && addressInfo.Type != SnesMemoryType::SaveRam) {
if(addressInfo.Type != SnesMemoryType::PrgRom && addressInfo.Type != SnesMemoryType::SaveRam && addressInfo.Type != SnesMemoryType::GbPrgRom && addressInfo.Type != SnesMemoryType::GbBootRom) {
return _counters[(int)addressInfo.Type][addressInfo.Address].WriteCount == 0;
}
return false;

View file

@ -152,8 +152,6 @@ namespace Mesen.GUI.Debugger
mnuBreakOnWdm.Visible = false;
mnuBreakOnCop.Visible = false;
mnuBreakOnStp.Visible = false;
sepBreakOnUnitRead.Visible = false;
mnuBreakOnUnitRead.Visible = false;
ctrlPpuStatus.Visible = false;
this.ctrlGameboyStatus = new ctrlGameboyStatus();

View file

@ -477,9 +477,9 @@ namespace Mesen.GUI.Forms
//Remove/disable all tools that aren't useful when running a plain GB game
mnuGbDebugger.Text = isGameboyMode ? "Debugger" : "Game Boy Debugger";
mnuDebugger.Enabled = !isGameboyMode;
mnuDebugger.Enabled = running && !isGameboyMode;
mnuDebugger.Visible = !isGameboyMode;
mnuSpcDebugger.Enabled = !isGameboyMode;
mnuSpcDebugger.Enabled = running && !isGameboyMode;
mnuSpcDebugger.Visible = !isGameboyMode;
sepCoprocessors.Visible = !isGameboyMode;
}