void DisassemblyDialog::stepOver() { if (!r5900Debug.isAlive() || !r5900Debug.isCpuPaused() || currentCpu == NULL) return; // todo: breakpoints for iop if (currentCpu != eeTab) return; CtrlDisassemblyView* disassembly = currentCpu->getDisassembly(); // If the current PC is on a breakpoint, the user doesn't want to do nothing. CBreakPoints::SetSkipFirst(r5900Debug.getPC()); u32 currentPc = r5900Debug.getPC(); MIPSAnalyst::MipsOpcodeInfo info = MIPSAnalyst::GetOpcodeInfo(&r5900Debug,r5900Debug.getPC()); u32 breakpointAddress = currentPc+disassembly->getInstructionSizeAt(currentPc); if (info.isBranch) { if (info.isConditional == false) { if (info.isLinkedBranch) // jal, jalr { // it's a function call with a delay slot - skip that too breakpointAddress += 4; } else { // j, ... // in case of absolute branches, set the breakpoint at the branch target breakpointAddress = info.branchTarget; } } else { // beq, ... if (info.conditionMet) { breakpointAddress = info.branchTarget; } else { breakpointAddress = currentPc+2*4; disassembly->scrollStepping(breakpointAddress); } } } else { disassembly->scrollStepping(breakpointAddress); } CBreakPoints::AddBreakPoint(breakpointAddress,true); r5900Debug.resumeCpu(); }
void DisassemblyDialog::stepInto() { if (!r5900Debug.isAlive() || !r5900Debug.isCpuPaused() || currentCpu == NULL) return; // todo: breakpoints for iop if (currentCpu != eeTab) return; CtrlDisassemblyView* disassembly = currentCpu->getDisassembly(); // If the current PC is on a breakpoint, the user doesn't want to do nothing. CBreakPoints::SetSkipFirst(r5900Debug.getPC()); u32 currentPc = r5900Debug.getPC(); MIPSAnalyst::MipsOpcodeInfo info = MIPSAnalyst::GetOpcodeInfo(&r5900Debug,r5900Debug.getPC()); u32 breakpointAddress = currentPc+disassembly->getInstructionSizeAt(currentPc); if (info.isBranch) { if (info.isConditional == false) { breakpointAddress = info.branchTarget; } else { if (info.conditionMet) { breakpointAddress = info.branchTarget; } else { breakpointAddress = currentPc+2*4; disassembly->scrollStepping(breakpointAddress); } } } if (info.isSyscall) breakpointAddress = info.branchTarget; CBreakPoints::AddBreakPoint(breakpointAddress,true); r5900Debug.resumeCpu(); }