mirror of
				https://git.tardis.systems/mirrors/yuzu
				synced 2025-10-31 10:44:49 +01: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
					
				| @ -24,32 +24,65 @@ | |||||||
| 
 | 
 | ||||||
| #pragma once | #pragma once | ||||||
| 
 | 
 | ||||||
|  | #include "common.h" | ||||||
| #include "common_types.h" | #include "common_types.h" | ||||||
| 
 | 
 | ||||||
| /// Generic ARM11 CPU interface
 | /// Generic ARM11 CPU interface
 | ||||||
| class ARM_Interface { | class ARM_Interface { | ||||||
| public: | public: | ||||||
|     ARM_Interface() { |     ARM_Interface() { | ||||||
|  |         num_instructions_ = 0; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     ~ARM_Interface() { |     ~ARM_Interface() { | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |     /// Step CPU by one instruction
 | ||||||
|     void Step() { |     void Step() { | ||||||
|         ExecuteInstruction(); |         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; |     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; |     virtual u32 Reg(int index) = 0; | ||||||
|  | 
 | ||||||
|  |     /**
 | ||||||
|  |      * Get the current CPSR register | ||||||
|  |      * @return Returns the value of the CPSR register | ||||||
|  |      */ | ||||||
|     virtual u32 CPSR() = 0;   |     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: | private: | ||||||
|      |      | ||||||
|  |     /// Execture next instruction
 | ||||||
|     virtual void ExecuteInstruction() = 0; |     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 | #pragma once | ||||||
| 
 | 
 | ||||||
|  | #include "common.h" | ||||||
| #include "common_types.h" | #include "common_types.h" | ||||||
| #include "arm/arm_interface.h" | #include "arm/arm_interface.h" | ||||||
| 
 | 
 | ||||||
| @ -45,6 +46,12 @@ public: | |||||||
| 
 | 
 | ||||||
|     u32 CPSR(); |     u32 CPSR(); | ||||||
| 
 | 
 | ||||||
|  |     u64 GetTicks() { | ||||||
|  |         return ARMul_Time(state); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
| private: | private: | ||||||
|     ARMul_State* state; |     ARMul_State* state; | ||||||
|  | 
 | ||||||
|  |     DISALLOW_COPY_AND_ASSIGN(ARM_Interpreter); | ||||||
| }; | }; | ||||||
|  | |||||||
| @ -28,7 +28,7 @@ | |||||||
| 
 | 
 | ||||||
| namespace LCD { | 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
 | u64 g_last_ticks = 0; ///< Last CPU ticks
 | ||||||
| 
 | 
 | ||||||
| @ -42,7 +42,7 @@ inline void Write(u32 addr, const T data) { | |||||||
| 
 | 
 | ||||||
| /// Update hardware
 | /// Update hardware
 | ||||||
| void Update() { | 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) { |     if ((current_ticks - g_last_ticks) >= kFrameTicks) { | ||||||
|         g_last_ticks = current_ticks; |         g_last_ticks = current_ticks; | ||||||
| @ -52,7 +52,7 @@ void Update() { | |||||||
| 
 | 
 | ||||||
| /// Initialize hardware
 | /// Initialize hardware
 | ||||||
| void Init() { | void Init() { | ||||||
|     g_last_ticks = Core::g_app_core->ticks(); |     g_last_ticks = Core::g_app_core->GetTicks(); | ||||||
| 
 | 
 | ||||||
|     NOTICE_LOG(LCD, "LCD initialized OK"); |     NOTICE_LOG(LCD, "LCD initialized OK"); | ||||||
| } | } | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user