void CPUDebugger::op_step() { bool break_event = false; usage[regs.pc] &= ~(UsageFlagM | UsageFlagX); usage[regs.pc] |= UsageOpcode | (regs.p.m << 1) | (regs.p.x << 0); opcode_pc = regs.pc; if(debugger.step_cpu && (debugger.step_type == Debugger::StepType::StepInto || (debugger.step_type >= Debugger::StepType::StepOver && debugger.call_count < 0))) { debugger.break_event = Debugger::BreakEvent::CPUStep; debugger.step_type = Debugger::StepType::None; scheduler.exit(Scheduler::ExitReason::DebuggerEvent); } else { if (debugger.break_on_wdm) { uint8 opcode = disassembler_read(opcode_pc); if (opcode == 0x42) { debugger.breakpoint_hit = Debugger::SoftBreakCPU; debugger.break_event = Debugger::BreakEvent::BreakpointHit; scheduler.exit(Scheduler::ExitReason::DebuggerEvent); } } debugger.breakpoint_test(Debugger::Breakpoint::Source::CPUBus, Debugger::Breakpoint::Mode::Exec, regs.pc, 0x00); } if(step_event) step_event(); // adjust call count if this is a call or return // (or if we're stepping over and no call occurred) // (TODO: track interrupts as well?) if (debugger.step_cpu) { if (debugger.step_over_new && debugger.call_count == 0) { debugger.call_count = -1; debugger.step_over_new = false; } uint8 opcode = disassembler_read(opcode_pc); if (opcode == 0x20 || opcode == 0x22 || opcode == 0xfc) { debugger.call_count++; } else if (opcode == 0x60 || opcode == 0x6b) { debugger.call_count--; } } CPU::op_step(); synchronize_smp(); }
void SMPDebugger::op_step() { bool break_event = false; usage[regs.pc] |= UsageExec; opcode_pc = regs.pc; opcode_edge = true; debugger.breakpoint_test(Debugger::Breakpoint::Source::APURAM, Debugger::Breakpoint::Mode::Exec, regs.pc, 0x00); if(step_event && step_event() == true) { debugger.break_event = Debugger::BreakEvent::SMPStep; scheduler.exit(Scheduler::ExitReason::DebuggerEvent); } opcode_edge = false; SMP::op_step(); synchronize_cpu(); }
void sSMPDebugger::op_step() { bool break_event = false; usage[regs.pc] |= UsageExec; opcode_pc = regs.pc; if(debugger.step_smp) { debugger.break_event = Debugger::BreakEvent::SMPStep; scheduler.exit(Scheduler::ExitReason::DebuggerEvent); } else { debugger.breakpoint_test(Debugger::Breakpoint::Source::APURAM, Debugger::Breakpoint::Mode::Exec, regs.pc, 0x00); } if(step_event) step_event(); sSMP::op_step(); scheduler.sync_smpcpu(); }
void CPUDebugger::op_step() { bool break_event = false; usage[regs.pc] &= ~(UsageFlagM | UsageFlagX); usage[regs.pc] |= UsageExec | (regs.p.m << 1) | (regs.p.x << 0); opcode_pc = regs.pc; if(debugger.step_cpu) { debugger.break_event = Debugger::BreakEvent::CPUStep; scheduler.exit(Scheduler::ExitReason::DebuggerEvent); } else { debugger.breakpoint_test(Debugger::Breakpoint::Source::CPUBus, Debugger::Breakpoint::Mode::Exec, regs.pc, 0x00); } if(step_event) step_event(); CPU::op_step(); synchronize_smp(); }
void SFXDebugger::op_step() { bool break_event = false; // subtract 1 since r15 will have already advanced one byte // (putting the current opcode in the pipeline) opcode_pc = (regs.pbr << 16) + regs.r[15] - 1; usage[opcode_pc] |= UsageOpcode; if(debugger.step_sfx && (debugger.step_type == Debugger::StepType::StepInto || (debugger.step_type >= Debugger::StepType::StepOver && debugger.call_count < 0))) { debugger.break_event = Debugger::BreakEvent::SFXStep; debugger.step_type = Debugger::StepType::None; scheduler.exit(Scheduler::ExitReason::DebuggerEvent); } else { debugger.breakpoint_test(Debugger::Breakpoint::Source::SFXBus, Debugger::Breakpoint::Mode::Exec, opcode_pc, 0x00); } if(step_event) step_event(); }