mirror of
https://github.com/Michael-Prince-Sharpe/bsnes-classic.git
synced 2025-04-02 10:21:42 -04:00
101 lines
2.6 KiB
C++
101 lines
2.6 KiB
C++
#ifdef SYSTEM_CPP
|
|
|
|
Debugger debugger;
|
|
|
|
void Debugger::breakpoint_test(Debugger::Breakpoint::Source source, Debugger::Breakpoint::Mode mode, unsigned addr, uint8 data) {
|
|
for(unsigned i = 0; i < Breakpoints; i++) {
|
|
if(breakpoint[i].enabled == false) continue;
|
|
if(breakpoint[i].source != source) continue;
|
|
if(breakpoint[i].mode != mode) continue;
|
|
if(breakpoint[i].data != -1 && breakpoint[i].data != data) continue;
|
|
|
|
if(source == Debugger::Breakpoint::Source::CPUBus) {
|
|
if(bus.is_mirror(breakpoint[i].addr, addr) == false) continue;
|
|
} else {
|
|
if(breakpoint[i].addr != addr) continue;
|
|
}
|
|
|
|
breakpoint[i].counter++;
|
|
breakpoint_hit = i;
|
|
break_event = BreakEvent::BreakpointHit;
|
|
scheduler.exit(Scheduler::ExitReason::DebuggerEvent);
|
|
break;
|
|
}
|
|
}
|
|
|
|
uint8 Debugger::read(Debugger::MemorySource source, unsigned addr) {
|
|
switch(source) {
|
|
case MemorySource::CPUBus: {
|
|
return bus.read(addr & 0xffffff);
|
|
} break;
|
|
|
|
case MemorySource::APUBus: {
|
|
if((addr & 0xffc0) == 0xffc0) return smp.iplrom[addr & 0x3f];
|
|
return memory::apuram.read(addr & 0xffff);
|
|
} break;
|
|
|
|
case MemorySource::APURAM: {
|
|
return memory::apuram.read(addr & 0xffff);
|
|
} break;
|
|
|
|
case MemorySource::VRAM: {
|
|
return memory::vram.read(addr & 0xffff);
|
|
} break;
|
|
|
|
case MemorySource::OAM: {
|
|
if(addr & 0x0200) return memory::oam.read(0x0200 + (addr & 0x1f));
|
|
return memory::oam.read(addr & 0x01ff);
|
|
} break;
|
|
|
|
case MemorySource::CGRAM: {
|
|
return memory::cgram.read(addr & 0x01ff);
|
|
} break;
|
|
}
|
|
|
|
return 0x00;
|
|
}
|
|
|
|
void Debugger::write(Debugger::MemorySource source, unsigned addr, uint8 data) {
|
|
switch(source) {
|
|
case MemorySource::CPUBus: {
|
|
bus.write(addr & 0xffffff, data);
|
|
} break;
|
|
|
|
case MemorySource::APURAM: {
|
|
memory::apuram.write(addr & 0xffff, data);
|
|
} break;
|
|
|
|
case MemorySource::VRAM: {
|
|
memory::vram.write(addr & 0xffff, data);
|
|
} break;
|
|
|
|
case MemorySource::OAM: {
|
|
if(addr & 0x0200) memory::oam.write(0x0200 + (addr & 0x1f), data);
|
|
else memory::oam.write(addr & 0x01ff, data);
|
|
} break;
|
|
|
|
case MemorySource::CGRAM: {
|
|
memory::cgram.write(addr & 0x01ff, data);
|
|
} break;
|
|
}
|
|
}
|
|
|
|
Debugger::Debugger() {
|
|
break_event = BreakEvent::None;
|
|
|
|
for(unsigned n = 0; n < Breakpoints; n++) {
|
|
breakpoint[n].enabled = false;
|
|
breakpoint[n].addr = 0;
|
|
breakpoint[n].data = -1;
|
|
breakpoint[n].mode = Breakpoint::Mode::Exec;
|
|
breakpoint[n].source = Breakpoint::Source::CPUBus;
|
|
breakpoint[n].counter = 0;
|
|
}
|
|
breakpoint_hit = 0;
|
|
|
|
step_cpu = false;
|
|
step_smp = false;
|
|
bus_access = false;
|
|
}
|
|
|
|
#endif
|