mirror of
				https://github.com/PabloMK7/citra.git
				synced 2025-10-30 21:30:04 +00:00 
			
		
		
		
	updated how we call ARM core to make things much faster
This commit is contained in:
		
							parent
							
								
									a4fd257469
								
							
						
					
					
						commit
						265c770a9d
					
				
					 8 changed files with 44 additions and 30 deletions
				
			
		|  | @ -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; | ||||
| } | ||||
|  |  | |||
|  | @ -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(); | ||||
|  |  | |||
|  | @ -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: | ||||
| 
 | ||||
|  |  | |||
|  | @ -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); | ||||
| } | ||||
|  |  | |||
|  | @ -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: | ||||
| 
 | ||||
|  |  | |||
|  | @ -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 */ | ||||
|  |  | |||
|  | @ -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; | ||||
|  |  | |||
|  | @ -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
 | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue