Exemplo n.º 1
0
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;
    }
}
Exemplo n.º 2
0
/* 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;
    }
}