aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorGravatar bunnei <ericbunnie@gmail.com>2014-04-05 15:23:59 -0400
committerGravatar bunnei <ericbunnie@gmail.com>2014-04-05 15:23:59 -0400
commited15feebf1cc60356e374e3492e6086066a7d09e (patch)
treef5f647e2a5b0d86aa0687ce48d40797cc076483e /src
parent02bcb4cfad8ab76b57b6be8a4591bc6f29246909 (diff)
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.
Diffstat (limited to 'src')
-rw-r--r--src/core/src/arm/arm_interface.h43
-rw-r--r--src/core/src/arm/interpreter/arm_interpreter.h7
-rw-r--r--src/core/src/hw/hw_lcd.cpp6
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 80518a77..daf35b51 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 89f871fa..074149f1 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 19e3b4ab..7e372834 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");
}