m6502_Debug() moved to m6502_debugger.c

This commit is contained in:
tudnai 2022-11-16 21:30:25 -08:00
parent 52cdd84aad
commit a04df3c1b2
4 changed files with 110 additions and 109 deletions

View File

@ -415,114 +415,6 @@ void m6502_Run() {
}
void m6502_Debug(void) {
m6502.clktime += m6502.clkfrm;
// m6502.clkfrm = 0;
m6502.lastIO = 0;
m6502.interrupt = NO_INT; // TODO: This should be taken care by the interrupt handler
m6502_dbg_on();
if( diskAccelerator_count ) {
if( --diskAccelerator_count <= 0 ) {
// make sure we only adjust clock once to get back to normal
diskAccelerator_count = 0;
clk_6502_per_frm = clk_6502_per_frm_set;
}
}
clk_6502_per_frm_max = clk_6502_per_frm;
for ( m6502.clkfrm = m6502_Step(); m6502.clkfrm < clk_6502_per_frm_max ; m6502.clkfrm += m6502_Step() ) {
switch (m6502.interrupt) {
case HALT:
if (m6502.debugger.mask.hlt) {
cpuState = cpuState_halted;
// m6502.debugger.wMask = 0;
return;
}
break;
case BREAK:
if (m6502.debugger.mask.brk) {
cpuState = cpuState_halted;
// m6502.debugger.wMask = 0;
return;
}
break;
case IRQ:
if (m6502.debugger.mask.irq) {
cpuState = cpuState_halted;
// m6502.debugger.wMask = 0;
return;
}
break;
case NMI:
if (m6502.debugger.mask.nmi) {
cpuState = cpuState_halted;
// m6502.debugger.wMask = 0;
return;
}
break;
case INV:
if (m6502.debugger.mask.inv) {
cpuState = cpuState_halted;
// m6502.debugger.wMask = 0;
return;
}
break;
case RET:
// Step_Out & Step_Over: Return to caller
if (m6502.debugger.mask.out) {
if ( m6502.SP >= m6502.debugger.SP ) {
cpuState = cpuState_halted;
// m6502.debugger.wMask = 0;
return;
}
}
break;
case HARDRESET:
hardReset();
break;
case SOFTRESET:
softReset();
break;
default:
// Step_Out: If there was a POP (PLA, PLX, PLY, PLP), then we should update the monitoring stack pointer
// (so we can return to the caller, not stopping at the POP)
if ( m6502.SP > m6502.debugger.SP ) {
m6502.debugger.SP = m6502.SP;
}
break;
}
m6502.interrupt = NO_INT;
if ( m6502_dbg_bp_is_exists(m6502.PC) ) {
cpuState = cpuState_halted;
// m6502.debugger.wMask = 0;
// m6502.debugger.on = 0;
m6502.interrupt = BREAKPOINT;
return;
}
}
// play the entire sound buffer for this frame
spkr_update();
// this will take care of turning off disk motor sound when time is up
spkr_update_disk_sfx();
}
void read_rom( const char * bundlePath, const char * filename, uint8_t * rom, const uint16_t addr, const uint16_t size ) {
char fullPath[256];

View File

@ -242,7 +242,6 @@ extern void rom_loadFile( const char * bundlePath, const char * filename );
extern void tst6502(void);
extern void m6502_ColdReset( const char * bundlePath, const char * romFilePath );
extern void m6502_Run(void);
extern void m6502_Debug(void);
INLINE int m6502_Step(void);
extern void interrupt_IRQ(void);

View File

@ -97,6 +97,115 @@ INLINE int m6502_Disass_1_Instr(void) {
return 2;
}
void m6502_Debug(void) {
m6502.clktime += m6502.clkfrm;
// m6502.clkfrm = 0;
m6502.lastIO = 0;
m6502.interrupt = NO_INT; // TODO: This should be taken care by the interrupt handler
m6502_dbg_on();
if( diskAccelerator_count ) {
if( --diskAccelerator_count <= 0 ) {
// make sure we only adjust clock once to get back to normal
diskAccelerator_count = 0;
clk_6502_per_frm = clk_6502_per_frm_set;
}
}
clk_6502_per_frm_max = clk_6502_per_frm;
for ( m6502.clkfrm = m6502_Step(); m6502.clkfrm < clk_6502_per_frm_max ; m6502.clkfrm += m6502_Step() ) {
switch (m6502.interrupt) {
case HALT:
if (m6502.debugger.mask.hlt) {
cpuState = cpuState_halted;
// m6502.debugger.wMask = 0;
return;
}
break;
case BREAK:
if (m6502.debugger.mask.brk) {
cpuState = cpuState_halted;
// m6502.debugger.wMask = 0;
return;
}
break;
case IRQ:
if (m6502.debugger.mask.irq) {
cpuState = cpuState_halted;
// m6502.debugger.wMask = 0;
return;
}
break;
case NMI:
if (m6502.debugger.mask.nmi) {
cpuState = cpuState_halted;
// m6502.debugger.wMask = 0;
return;
}
break;
case INV:
if (m6502.debugger.mask.inv) {
cpuState = cpuState_halted;
// m6502.debugger.wMask = 0;
return;
}
break;
case RET:
// Step_Out & Step_Over: Return to caller
if (m6502.debugger.mask.out) {
if ( m6502.SP >= m6502.debugger.SP ) {
cpuState = cpuState_halted;
// m6502.debugger.wMask = 0;
return;
}
}
break;
case HARDRESET:
hardReset();
break;
case SOFTRESET:
softReset();
break;
default:
// Step_Out: If there was a POP (PLA, PLX, PLY, PLP), then we should update the monitoring stack pointer
// (so we can return to the caller, not stopping at the POP)
if ( m6502.SP > m6502.debugger.SP ) {
m6502.debugger.SP = m6502.SP;
}
break;
}
m6502.interrupt = NO_INT;
if ( m6502_dbg_bp_is_exists(m6502.PC) ) {
cpuState = cpuState_halted;
// m6502.debugger.wMask = 0;
// m6502.debugger.on = 0;
m6502.interrupt = BREAKPOINT;
return;
}
}
// play the entire sound buffer for this frame
spkr_update();
// this will take care of turning off disk motor sound when time is up
spkr_update_disk_sfx();
}
/// Turn On Debugger
void m6502_dbg_on(void) {
m6502.debugger.on = 1;

View File

@ -12,6 +12,7 @@
extern uint16_t disass_addr;
extern int m6502_Disass_1_Instr(void);
extern void m6502_Debug(void);
extern void m6502_dbg_on(void);
extern void m6502_dbg_off(void);
extern void m6502_dbg_init(void);