mirror of
				https://git.tardis.systems/mirrors/yuzu
				synced 2025-11-04 04:34:07 +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