diff options
Diffstat (limited to 'src/core/arm')
-rw-r--r-- | src/core/arm/arm_interface.h | 2 | ||||
-rw-r--r-- | src/core/arm/dyncom/arm_dyncom.cpp | 8 |
2 files changed, 9 insertions, 1 deletions
diff --git a/src/core/arm/arm_interface.h b/src/core/arm/arm_interface.h index 3b7209418..d3bd4a9a3 100644 --- a/src/core/arm/arm_interface.h +++ b/src/core/arm/arm_interface.h @@ -103,6 +103,8 @@ public: return num_instructions; } + s64 down_count; ///< A decreasing counter of remaining cycles before the next event, decreased by the cpu run loop + protected: /** diff --git a/src/core/arm/dyncom/arm_dyncom.cpp b/src/core/arm/dyncom/arm_dyncom.cpp index a838fd25a..c779e3fd4 100644 --- a/src/core/arm/dyncom/arm_dyncom.cpp +++ b/src/core/arm/dyncom/arm_dyncom.cpp @@ -9,6 +9,8 @@ #include "core/arm/dyncom/arm_dyncom.h" #include "core/arm/dyncom/arm_dyncom_interpreter.h" +#include "core/core_timing.h" + const static cpu_config_t s_arm11_cpu_info = { "armv6", "arm11", 0x0007b000, 0x0007f000, NONCACHE }; @@ -77,6 +79,9 @@ u64 ARM_DynCom::GetTicks() const { void ARM_DynCom::AddTicks(u64 ticks) { this->ticks += ticks; + down_count -= ticks; + if (down_count < 0) + CoreTiming::Advance(); } void ARM_DynCom::ExecuteInstructions(int num_instructions) { @@ -85,7 +90,8 @@ void ARM_DynCom::ExecuteInstructions(int num_instructions) { // 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()); + unsigned ticks_executed = InterpreterMainLoop(state.get()); + AddTicks(ticks_executed); } void ARM_DynCom::SaveContext(ThreadContext& ctx) { |