Просмотр исходного кода

Core: Cleaned up SingleStep(), updated default LCD refresh to assume each instruction is ~3 cycles

bunnei 12 лет назад
Родитель
Сommit
0deeda54ee
2 измененных файлов с 14 добавлено и 12 удалено
  1. 12 11
      src/core/core.cpp
  2. 2 1
      src/core/hw/lcd.h

+ 12 - 11
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;
 }
 

+ 2 - 1
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;