From ed15feebf1cc60356e374e3492e6086066a7d09e Mon Sep 17 00:00:00 2001 From: bunnei Date: Sat, 5 Apr 2014 15:23:59 -0400 Subject: changed hw_lcd to use ARM core correct tick counter instead of [what was actually] just an instruction count. this seems to fix timing issues with the 3DS_Homebrew_Pong3Dv2 demo. --- src/core/src/arm/arm_interface.h | 43 +++++++++++++++++++++++--- src/core/src/arm/interpreter/arm_interpreter.h | 7 +++++ src/core/src/hw/hw_lcd.cpp | 6 ++-- 3 files changed, 48 insertions(+), 8 deletions(-) diff --git a/src/core/src/arm/arm_interface.h b/src/core/src/arm/arm_interface.h index 80518a779..daf35b51d 100644 --- a/src/core/src/arm/arm_interface.h +++ b/src/core/src/arm/arm_interface.h @@ -24,32 +24,65 @@ #pragma once +#include "common.h" #include "common_types.h" /// Generic ARM11 CPU interface class ARM_Interface { public: ARM_Interface() { + num_instructions_ = 0; } ~ARM_Interface() { } + /// Step CPU by one instruction void Step() { ExecuteInstruction(); - ticks_++; + num_instructions_++; } - - virtual void SetPC(u32 pc) = 0; + + /** + * Set the Program Counter to an address + * @param addr Address to set PC to + */ + virtual void SetPC(u32 addr) = 0; + + /* + * Get the current Program Counter + * @return Returns current PC + */ virtual u32 PC() = 0; + + /** + * Get an ARM register + * @param index Register index (0-15) + * @return Returns the value in the register + */ virtual u32 Reg(int index) = 0; + + /** + * Get the current CPSR register + * @return Returns the value of the CPSR register + */ virtual u32 CPSR() = 0; - u64 ticks() { return ticks_; } + /** + * Returns the number of clock ticks since the last rese + * @return Returns number of clock ticks + */ + virtual u64 GetTicks() = 0; + + /// Getter for num_instructions_ + u64 num_instructions() { return num_instructions_; } private: + /// Execture next instruction virtual void ExecuteInstruction() = 0; - u64 ticks_; + u64 num_instructions_; ///< Number of instructions executed + + DISALLOW_COPY_AND_ASSIGN(ARM_Interface); }; diff --git a/src/core/src/arm/interpreter/arm_interpreter.h b/src/core/src/arm/interpreter/arm_interpreter.h index 89f871fa9..074149f1b 100644 --- a/src/core/src/arm/interpreter/arm_interpreter.h +++ b/src/core/src/arm/interpreter/arm_interpreter.h @@ -24,6 +24,7 @@ #pragma once +#include "common.h" #include "common_types.h" #include "arm/arm_interface.h" @@ -45,6 +46,12 @@ public: u32 CPSR(); + u64 GetTicks() { + return ARMul_Time(state); + } + private: ARMul_State* state; + + DISALLOW_COPY_AND_ASSIGN(ARM_Interpreter); }; diff --git a/src/core/src/hw/hw_lcd.cpp b/src/core/src/hw/hw_lcd.cpp index 19e3b4ab4..7e3728346 100644 --- a/src/core/src/hw/hw_lcd.cpp +++ b/src/core/src/hw/hw_lcd.cpp @@ -28,7 +28,7 @@ namespace LCD { -static const u32 kFrameTicks = 268123480 / 30; // 268MHz / 30 frames per second +static const u32 kFrameTicks = 268123480 / 60; ///< 268MHz / 60 frames per second u64 g_last_ticks = 0; ///< Last CPU ticks @@ -42,7 +42,7 @@ inline void Write(u32 addr, const T data) { /// Update hardware void Update() { - u64 current_ticks = Core::g_app_core->ticks(); + u64 current_ticks = Core::g_app_core->GetTicks(); if ((current_ticks - g_last_ticks) >= kFrameTicks) { g_last_ticks = current_ticks; @@ -52,7 +52,7 @@ void Update() { /// Initialize hardware void Init() { - g_last_ticks = Core::g_app_core->ticks(); + g_last_ticks = Core::g_app_core->GetTicks(); NOTICE_LOG(LCD, "LCD initialized OK"); } -- cgit v1.2.3