void open_debugger(int reason, uint32_t data) { if (inDebugger) { /* Prevent recurse */ return; } if ((reason == DBG_STEP) && debugger.stepOverFirstStep) { if (((cpuEvents & EVENT_DEBUG_STEP_NEXT) && !(debugger.data.block[cpu.registers.PC] & DBG_TEMP_EXEC_BREAKPOINT)) || (cpuEvents & EVENT_DEBUG_STEP_OUT)) { debugger.stepOverFirstStep = false; gui_debugger_raise_or_disable(inDebugger = false); return; } debug_clear_temp_break(); } debugger.cpu_cycles = cpu.cycles; debugger.cpu_next = cpu.next; debugger.total_cycles = cpu.cycles + cpu.cycles_offset; if (debugger.currentBuffPos) { debugger.buffer[debugger.currentBuffPos] = '\0'; gui_console_printf("%s", debugger.buffer); debugger.currentBuffPos = 0; } if (debugger.currentErrBuffPos) { debugger.errBuffer[debugger.currentErrBuffPos] = '\0'; gui_console_err_printf("%s", debugger.errBuffer); debugger.currentErrBuffPos = 0; } inDebugger = true; gui_debugger_send_command(reason, data); while (inDebugger) { gui_emu_sleep(50); } cpu.next = debugger.cpu_next; cpu.cycles = debugger.cpu_cycles; cpu.cycles_offset = debugger.total_cycles - cpu.cycles; if (cpuEvents & EVENT_DEBUG_STEP) { cpu.next = cpu.cycles + 1; } }
/* since it is called outside of cpu_execute(). Which means no read/write errors. */ void open_debugger(int reason, uint32_t address) { if (inDebugger) { return; // don't recurse } debugger.cpu_cycles = cpu.cycles; gui_debugger_entered_or_left(inDebugger = true); if (debugger.stepOverAddress < 0x1000000) { debugger.data.block[debugger.stepOverAddress] &= ~DBG_STEP_OVER_BREAKPOINT; debugger.stepOverAddress = UINT32_C(0xFFFFFFFF); } gui_debugger_send_command(reason, address); do { gui_emu_sleep(); } while(inDebugger); gui_debugger_entered_or_left(inDebugger = false); cpu.cycles = debugger.cpu_cycles; if (cpu_events & EVENT_DEBUG_STEP) { cpu.next = cpu.cycles + 1; } }