diff options
| author | bunnei <bunneidev@gmail.com> | 2014-11-11 20:01:14 -0500 |
|---|---|---|
| committer | bunnei <bunneidev@gmail.com> | 2014-11-11 20:01:14 -0500 |
| commit | 16e3a7f9b011cb3496ac2e9e4d39494701d6f5e4 (patch) | |
| tree | 6caa9a609493f968b2a9f744f78b9aba8b887f6e /src/core/arm/dyncom/arm_dyncom.cpp | |
| parent | ac8b38e54d2a22754b146944dfa27c240a2b6921 (diff) | |
| parent | b8e6f52419816a7afa6629c401c23faf8ae8ae67 (diff) | |
Merge pull request #186 from bunnei/fix-dyncom-bugs
Fix dyncom bugs
Diffstat (limited to 'src/core/arm/dyncom/arm_dyncom.cpp')
| -rw-r--r-- | src/core/arm/dyncom/arm_dyncom.cpp | 11 |
1 files changed, 7 insertions, 4 deletions
diff --git a/src/core/arm/dyncom/arm_dyncom.cpp b/src/core/arm/dyncom/arm_dyncom.cpp index 669b612fc..a3ed3e31e 100644 --- a/src/core/arm/dyncom/arm_dyncom.cpp +++ b/src/core/arm/dyncom/arm_dyncom.cpp @@ -60,7 +60,7 @@ void ARM_DynCom::SetPC(u32 pc) { * @return Returns current PC */ u32 ARM_DynCom::GetPC() const { - return state->pc; + return state->Reg[15]; } /** @@ -110,9 +110,12 @@ u64 ARM_DynCom::GetTicks() const { * @param num_instructions Number of instructions to executes */ void ARM_DynCom::ExecuteInstructions(int num_instructions) { - ticks += num_instructions; state->NumInstrsToExecute = num_instructions; - InterpreterMainLoop(state.get()); + + // Dyncom only breaks on instruction dispatch. This only happens on every instruction when + // executing one instruction at a time. Otherwise, if a block is being executed, more + // instructions may actually be executed than specified. + ticks += InterpreterMainLoop(state.get()); } /** @@ -126,7 +129,7 @@ void ARM_DynCom::SaveContext(ThreadContext& ctx) { ctx.sp = state->Reg[13]; ctx.lr = state->Reg[14]; - ctx.pc = state->pc; + ctx.pc = state->Reg[15]; ctx.cpsr = state->Cpsr; ctx.fpscr = state->VFP[1]; |
