mirror of
				https://github.com/PabloMK7/citra.git
				synced 2025-10-31 13:50:03 +00:00 
			
		
		
		
	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:
		
							parent
							
								
									02bcb4cfad
								
							
						
					
					
						commit
						ed15feebf1
					
				
					 3 changed files with 48 additions and 8 deletions
				
			
		|  | @ -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"); | ||||
| } | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue