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.
This commit is contained in:
		| @@ -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); | ||||
| }; | ||||
|   | ||||
| @@ -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); | ||||
| }; | ||||
|   | ||||
| @@ -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"); | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user