From 0deeda54eefb18aaf6a62b8ec139cfe9bd21769c Mon Sep 17 00:00:00 2001
From: bunnei <ericbunnie@gmail.com>
Date: Fri, 6 Jun 2014 00:06:33 -0400
Subject: [PATCH] Core: Cleaned up SingleStep(), updated default LCD refresh to
 assume each instruction is ~3 cycles

---
 src/core/core.cpp | 23 ++++++++++++-----------
 src/core/hw/lcd.h |  3 ++-
 2 files changed, 14 insertions(+), 12 deletions(-)

diff --git a/src/core/core.cpp b/src/core/core.cpp
index 6ec25fdd4..26d52f7be 100644
--- a/src/core/core.cpp
+++ b/src/core/core.cpp
@@ -18,14 +18,15 @@
 
 namespace Core {
 
-ARM_Disasm*     g_disasm    = NULL; ///< ARM disassembler
-ARM_Interface*  g_app_core  = NULL; ///< ARM11 application core
-ARM_Interface*  g_sys_core  = NULL; ///< ARM11 system (OS) core
+u64             g_last_ticks    = 0;    ///< Last CPU ticks
+ARM_Disasm*     g_disasm        = NULL; ///< ARM disassembler
+ARM_Interface*  g_app_core      = NULL; ///< ARM11 application core
+ARM_Interface*  g_sys_core      = NULL; ///< ARM11 system (OS) core
 
 /// Run the core CPU loop
 void RunLoop() {
     for (;;){
-        g_app_core->Run(LCD::kFrameTicks / 3);
+        g_app_core->Run(LCD::kFrameTicks);
         HW::Update();
         Kernel::Reschedule();
     }
@@ -33,16 +34,14 @@ void RunLoop() {
 
 /// Step the CPU one instruction
 void SingleStep() {
-    static int ticks = 0;
-
     g_app_core->Step();
-    
-    if ((ticks >= LCD::kFrameTicks / 3) || HLE::g_reschedule) {
+
+    // Update and reschedule after approx. 1 frame
+    u64 current_ticks = Core::g_app_core->GetTicks();
+    if ((current_ticks - g_last_ticks) >= LCD::kFrameTicks || HLE::g_reschedule) {
+        g_last_ticks = current_ticks;
         HW::Update();
         Kernel::Reschedule();
-        ticks = 0;
-    } else {
-        ticks++;
     }
 }
 
@@ -64,6 +63,8 @@ int Init() {
     g_app_core = new ARM_Interpreter();
     g_sys_core = new ARM_Interpreter();
 
+    g_last_ticks = Core::g_app_core->GetTicks();
+
     return 0;
 }
 
diff --git a/src/core/hw/lcd.h b/src/core/hw/lcd.h
index 41baa51d0..7484f8f66 100644
--- a/src/core/hw/lcd.h
+++ b/src/core/hw/lcd.h
@@ -8,7 +8,8 @@
 
 namespace LCD {
 
-static const u32 kFrameTicks = 268123480 / 60;  ///< 268MHz / 60 frames per second
+static const u32 kFrameCycles   = 268123480 / 60;   ///< 268MHz / 60 frames per second
+static const u32 kFrameTicks    = kFrameCycles / 3; ///< Approximate number of instructions/frame
 
 struct Registers {
     u32 framebuffer_top_left_1;