Debugger: GB - Added uninit read break option
This commit is contained in:
parent
556d060b02
commit
9b1f6ef3f9
5 changed files with 25 additions and 12 deletions
|
@ -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()
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue