aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar bunnei <ericbunnie@gmail.com>2014-05-17 11:59:18 -0400
committerGravatar bunnei <ericbunnie@gmail.com>2014-05-17 11:59:18 -0400
commit265c770a9d663b96a9a422201bac3dd454fa95c0 (patch)
treee7a1682450b857d80cc2ed0f863f4a82b81142bd
parenta4fd257469bc06d1474a2e6e8df9dbd233ac79a5 (diff)
updated how we call ARM core to make things much faster
-rw-r--r--src/citra/citra.cpp12
-rw-r--r--src/citra_qt/bootmanager.cpp3
-rw-r--r--src/core/arm/arm_interface.h21
-rw-r--r--src/core/arm/interpreter/arm_interpreter.cpp19
-rw-r--r--src/core/arm/interpreter/arm_interpreter.h7
-rw-r--r--src/core/arm/interpreter/armdefs.h1
-rw-r--r--src/core/arm/interpreter/armemu.cpp2
-rw-r--r--src/core/core.cpp9
8 files changed, 44 insertions, 30 deletions
diff --git a/src/citra/citra.cpp b/src/citra/citra.cpp
index d55b9739..6f3bc6f8 100644
--- a/src/citra/citra.cpp
+++ b/src/citra/citra.cpp
@@ -18,26 +18,24 @@
int __cdecl main(int argc, char **argv) {
std::string program_dir = File::GetCurrentDir();
- LogManager::Init();
+ LogManager::Init();
EmuWindow_GLFW* emu_window = new EmuWindow_GLFW;
- System::Init(emu_window);
+ System::Init(emu_window);
std::string boot_filename = "homebrew.elf";
std::string error_str;
-
+
bool res = Loader::LoadFile(boot_filename, &error_str);
if (!res) {
ERROR_LOG(BOOT, "Failed to load ROM: %s", error_str.c_str());
}
- for (;;) {
- Core::SingleStep();
- }
+ Core::RunLoop();
delete emu_window;
- return 0;
+ return 0;
}
diff --git a/src/citra_qt/bootmanager.cpp b/src/citra_qt/bootmanager.cpp
index 31958ac2..cf9e1bff 100644
--- a/src/citra_qt/bootmanager.cpp
+++ b/src/citra_qt/bootmanager.cpp
@@ -6,6 +6,8 @@
#include "core/core.h"
#include "core/loader.h"
+#include "core/hw/hw.h"
+
#include "video_core/video_core.h"
#include "version.h"
@@ -40,6 +42,7 @@ void EmuThread::run()
emit CPUStepped();
}
}
+ HW::Update();
}
Core::Stop();
diff --git a/src/core/arm/arm_interface.h b/src/core/arm/arm_interface.h
index 4dfe0570..9fdc7ba3 100644
--- a/src/core/arm/arm_interface.h
+++ b/src/core/arm/arm_interface.h
@@ -17,12 +17,20 @@ public:
~ARM_Interface() {
}
+ /**
+ * Runs the CPU for the given number of instructions
+ * @param num_instructions Number of instructions to run
+ */
+ void Run(int num_instructions) {
+ ExecuteInstructions(num_instructions);
+ m_num_instructions += num_instructions;
+ }
+
/// Step CPU by one instruction
void Step() {
- ExecuteInstruction();
- m_num_instructions++;
+ Run(1);
}
-
+
/**
* Set the Program Counter to an address
* @param addr Address to set PC to
@@ -68,8 +76,11 @@ public:
protected:
- /// Execture next instruction
- virtual void ExecuteInstruction() = 0;
+ /**
+ * Executes the given number of instructions
+ * @param num_instructions Number of instructions to executes
+ */
+ virtual void ExecuteInstructions(int num_instructions) = 0;
private:
diff --git a/src/core/arm/interpreter/arm_interpreter.cpp b/src/core/arm/interpreter/arm_interpreter.cpp
index 4652803d..23d96d29 100644
--- a/src/core/arm/interpreter/arm_interpreter.cpp
+++ b/src/core/arm/interpreter/arm_interpreter.cpp
@@ -85,16 +85,11 @@ u64 ARM_Interpreter::GetTicks() const {
return ARMul_Time(m_state);
}
-/// Execture next instruction
-void ARM_Interpreter::ExecuteInstruction() {
- m_state->step++;
- m_state->cycle++;
- m_state->EndCondition = 0;
- m_state->stop_simulator = 0;
- m_state->NextInstr = RESUME;
- m_state->last_pc = m_state->Reg[15];
- m_state->Reg[15] = ARMul_DoInstr(m_state);
- m_state->Cpsr = ((m_state->Cpsr & 0x0fffffdf) | (m_state->NFlag << 31) | (m_state->ZFlag << 30) |
- (m_state->CFlag << 29) | (m_state->VFlag << 28) | (m_state->TFlag << 5));
- m_state->NextInstr |= PRIMEPIPE; // Flush pipe
+/**
+ * Executes the given number of instructions
+ * @param num_instructions Number of instructions to executes
+ */
+void ARM_Interpreter::ExecuteInstructions(int num_instructions) {
+ m_state->NumInstrsToExecute = num_instructions;
+ ARMul_Emulate32(m_state);
}
diff --git a/src/core/arm/interpreter/arm_interpreter.h b/src/core/arm/interpreter/arm_interpreter.h
index 625c0c65..50902508 100644
--- a/src/core/arm/interpreter/arm_interpreter.h
+++ b/src/core/arm/interpreter/arm_interpreter.h
@@ -56,8 +56,11 @@ public:
protected:
- /// Execture next instruction
- void ExecuteInstruction();
+ /**
+ * Executes the given number of instructions
+ * @param num_instructions Number of instructions to executes
+ */
+ void ExecuteInstructions(int num_instructions);
private:
diff --git a/src/core/arm/interpreter/armdefs.h b/src/core/arm/interpreter/armdefs.h
index 821825ae..5b2abc7f 100644
--- a/src/core/arm/interpreter/armdefs.h
+++ b/src/core/arm/interpreter/armdefs.h
@@ -288,6 +288,7 @@ struct ARMul_State
ARMword loaded_addr, decoded_addr; /* saved pipeline state addr*/
unsigned int NumScycles, NumNcycles, NumIcycles, NumCcycles, NumFcycles; /* emulated cycles used */
unsigned long long NumInstrs; /* the number of instructions executed */
+ unsigned NumInstrsToExecute;
unsigned NextInstr;
unsigned VectorCatch; /* caught exception mask */
unsigned CallDebug; /* set to call the debugger */
diff --git a/src/core/arm/interpreter/armemu.cpp b/src/core/arm/interpreter/armemu.cpp
index 87141653..32e315f4 100644
--- a/src/core/arm/interpreter/armemu.cpp
+++ b/src/core/arm/interpreter/armemu.cpp
@@ -4734,7 +4734,7 @@ TEST_EMULATE:
else if (state->Emulate != RUN)
break;
}
- while (!state->stop_simulator);
+ while (state->NumInstrsToExecute--);
state->decoded = decoded;
state->loaded = loaded;
diff --git a/src/core/core.cpp b/src/core/core.cpp
index 859a62c7..61c237b2 100644
--- a/src/core/core.cpp
+++ b/src/core/core.cpp
@@ -4,8 +4,9 @@
#include "common/common_types.h"
#include "common/log.h"
-#include "core/core.h"
+#include "common/symbols.h"
+#include "core/core.h"
#include "core/mem_map.h"
#include "core/hw/hw.h"
#include "core/arm/disassembler/arm_disasm.h"
@@ -19,13 +20,15 @@ ARM_Interface* g_sys_core = NULL; ///< ARM11 system (OS) core
/// Run the core CPU loop
void RunLoop() {
- // TODO(ShizZy): ImplementMe
+ for (;;){
+ g_app_core->Run(10000);
+ HW::Update();
+ }
}
/// Step the CPU one instruction
void SingleStep() {
g_app_core->Step();
- HW::Update();
}
/// Halt the core