Core: Have only one function to do what R4300iOp::ExecuteOps and R4300iOp::ExecuteCPU was doing

This commit is contained in:
zilmar 2024-10-24 09:59:41 +10:30
parent c39582b9ed
commit 5750d3df80
4 changed files with 10 additions and 123 deletions

View File

@ -73,10 +73,8 @@ void R4300iOp::InPermLoop()
} }
} }
void R4300iOp::ExecuteCPU() void R4300iOp::ExecuteOps(uint32_t Cycles)
{ {
WriteTrace(TraceN64System, TraceDebug, "Start");
bool & Done = m_System.m_EndEmulation; bool & Done = m_System.m_EndEmulation;
PIPELINE_STAGE & PipelineStage = m_System.m_PipelineStage; PIPELINE_STAGE & PipelineStage = m_System.m_PipelineStage;
uint64_t & JumpToLocation = m_System.m_JumpToLocation; uint64_t & JumpToLocation = m_System.m_JumpToLocation;
@ -88,7 +86,7 @@ void R4300iOp::ExecuteCPU()
int32_t & NextTimer = *g_NextTimer; int32_t & NextTimer = *g_NextTimer;
bool CheckTimer = false; bool CheckTimer = false;
while (!Done) while (!Done && Cycles > 0)
{ {
if ((uint64_t)((int32_t)m_PROGRAM_COUNTER) != m_PROGRAM_COUNTER) if ((uint64_t)((int32_t)m_PROGRAM_COUNTER) != m_PROGRAM_COUNTER)
{ {
@ -136,16 +134,13 @@ void R4300iOp::ExecuteCPU()
g_Debugger->CPUStep(); g_Debugger->CPUStep();
} }
/* if (PROGRAM_COUNTER > 0x80000300 && PROGRAM_COUNTER < 0x80380000)
{
WriteTraceF((TraceType)(TraceError | TraceNoHeader),"%X: %s",m_PROGRAM_COUNTER,R4300iInstruction(m_PROGRAM_COUNTER, Opcode.Value).NameAndParam().c_str());
// WriteTraceF((TraceType)(TraceError | TraceNoHeader),"%X: %s t9: %08X v1: %08X",m_PROGRAM_COUNTER,R4300iInstruction(m_PROGRAM_COUNTER, Opcode.Value).NameAndParam().c_str(),m_GPR[0x19].UW[0],m_GPR[0x03].UW[0]);
// WriteTraceF((TraceType)(TraceError | TraceNoHeader),"%X: %d %d",m_PROGRAM_COUNTER,*g_NextTimer,g_SystemTimer->CurrentType());
} */
(this->*Jump_Opcode[m_Opcode.op])(); (this->*Jump_Opcode[m_Opcode.op])();
m_GPR[0].DW = 0; // MIPS $zero hard-wired to 0 m_GPR[0].DW = 0; // MIPS $zero hard-wired to 0
NextTimer -= CountPerOp; NextTimer -= CountPerOp;
if (Cycles != (uint32_t)-1)
{
Cycles -= CountPerOp;
}
if (CDebugSettings::HaveDebugger()) if (CDebugSettings::HaveDebugger())
{ {
@ -205,115 +200,7 @@ void R4300iOp::ExecuteCPU()
g_Notify->BreakPoint(__FILE__, __LINE__); g_Notify->BreakPoint(__FILE__, __LINE__);
} }
} }
WriteTrace(TraceN64System, TraceDebug, "Done"); g_SystemTimer->UpdateTimers();
}
void R4300iOp::ExecuteOps(int32_t Cycles)
{
bool & Done = m_System.m_EndEmulation;
PIPELINE_STAGE & PipelineStage = m_System.m_PipelineStage;
uint64_t & JumpDelayLocation = m_System.m_JumpDelayLocation;
uint64_t & JumpToLocation = m_System.m_JumpToLocation;
bool & TestTimer = m_System.m_TestTimer;
CSystemEvents & SystemEvents = m_System.m_SystemEvents;
const bool & DoSomething = SystemEvents.DoSomething();
uint32_t CountPerOp = m_System.CountPerOp();
bool CheckTimer = false;
while (!Done)
{
if (Cycles <= 0)
{
g_SystemTimer->UpdateTimers();
return;
}
if (m_MMU.MemoryValue32((uint32_t)m_PROGRAM_COUNTER, m_Opcode.Value))
{
/*if (PROGRAM_COUNTER > 0x80000300 && PROGRAM_COUNTER< 0x80380000)
{
WriteTraceF((TraceType)(TraceError | TraceNoHeader),"%X: %s",m_PROGRAM_COUNTER,R4300iInstruction(m_PROGRAM_COUNTER, Opcode.Value).NameAndParam().c_str());
//WriteTraceF((TraceType)(TraceError | TraceNoHeader),"%X: %s t9: %08X v1: %08X",m_PROGRAM_COUNTER,R4300iInstruction(m_PROGRAM_COUNTER, Opcode.Value).NameAndParam().c_str(),m_GPR[0x19].UW[0],m_GPR[0x03].UW[0]);
//WriteTraceF((TraceType)(TraceError | TraceNoHeader),"%X: %d %d",m_PROGRAM_COUNTER,*g_NextTimer,g_SystemTimer->CurrentType());
}*/
/*if (PROGRAM_COUNTER > 0x80323000 && PROGRAM_COUNTER< 0x80380000)
{
WriteTraceF((TraceType)(TraceError | TraceNoHeader),"%X: %s",m_PROGRAM_COUNTER,R4300iInstruction(m_PROGRAM_COUNTER, Opcode.Value).NameAndParam().c_str());
//WriteTraceF((TraceType)(TraceError | TraceNoHeader),"%X: %s t9: %08X v1: %08X",m_PROGRAM_COUNTER,R4300iInstruction(m_PROGRAM_COUNTER, Opcode.Value).NameAndParam().c_str(),m_GPR[0x19].UW[0],m_GPR[0x03].UW[0]);
//WriteTraceF((TraceType)(TraceError | TraceNoHeader),"%X: %d %d",m_PROGRAM_COUNTER,*g_NextTimer,g_SystemTimer->CurrentType());
}*/
(this->*Jump_Opcode[m_Opcode.op])();
m_GPR[0].DW = 0; /* MIPS $zero hard-wired to 0 */
Cycles -= CountPerOp;
*g_NextTimer -= CountPerOp;
/*static uint32_t TestAddress = 0x80077B0C, TestValue = 0, CurrentValue = 0;
if (m_MMU.MemoryValue32(TestAddress, TestValue))
{
if (TestValue != CurrentValue)
{
WriteTraceF(TraceError,"%X: %X changed (%s)",PROGRAM_COUNTER,TestAddress,R4300iInstruction(PROGRAM_COUNTER, m_Opcode.Value).NameAndParam().c_str());
CurrentValue = TestValue;
}
}*/
switch (PipelineStage)
{
case PIPELINE_STAGE_NORMAL:
m_PROGRAM_COUNTER += 4;
break;
case PIPELINE_STAGE_DELAY_SLOT:
PipelineStage = PIPELINE_STAGE_JUMP;
m_PROGRAM_COUNTER += 4;
break;
case PIPELINE_STAGE_PERMLOOP_DO_DELAY:
PipelineStage = PIPELINE_STAGE_PERMLOOP_DELAY_DONE;
m_PROGRAM_COUNTER += 4;
break;
case PIPELINE_STAGE_JUMP:
CheckTimer = (JumpToLocation < m_PROGRAM_COUNTER || TestTimer);
m_PROGRAM_COUNTER = JumpToLocation;
PipelineStage = PIPELINE_STAGE_NORMAL;
if (CheckTimer)
{
TestTimer = false;
if (*g_NextTimer < 0)
{
g_SystemTimer->TimerDone();
}
if (DoSomething)
{
SystemEvents.ExecuteEvents();
}
}
break;
case PIPELINE_STAGE_JUMP_DELAY_SLOT:
PipelineStage = PIPELINE_STAGE_JUMP;
m_PROGRAM_COUNTER = JumpToLocation;
JumpToLocation = JumpDelayLocation;
break;
case PIPELINE_STAGE_PERMLOOP_DELAY_DONE:
m_PROGRAM_COUNTER = JumpToLocation;
PipelineStage = PIPELINE_STAGE_NORMAL;
InPermLoop();
g_SystemTimer->TimerDone();
if (DoSomething)
{
SystemEvents.ExecuteEvents();
}
break;
default:
g_Notify->BreakPoint(__FILE__, __LINE__);
}
}
else
{
m_Reg.TriggerAddressException((int32_t)m_PROGRAM_COUNTER, EXC_RMISS);
m_PROGRAM_COUNTER = JumpToLocation;
PipelineStage = PIPELINE_STAGE_NORMAL;
}
}
} }
void R4300iOp::SPECIAL() void R4300iOp::SPECIAL()

View File

@ -17,7 +17,7 @@ public:
~R4300iOp(void); ~R4300iOp(void);
void ExecuteCPU(); void ExecuteCPU();
void ExecuteOps(int32_t Cycles); void ExecuteOps(uint32_t Cycles);
void InPermLoop(); void InPermLoop();
R4300iOpcode Opcode(void) const R4300iOpcode Opcode(void) const

View File

@ -1052,7 +1052,7 @@ void CN64System::ExecuteCPU()
void CN64System::ExecuteInterpret() void CN64System::ExecuteInterpret()
{ {
SetActiveSystem(); SetActiveSystem();
m_OpCodes.ExecuteCPU(); m_OpCodes.ExecuteOps((uint32_t)-1);
} }
void CN64System::ExecuteRecompiler() void CN64System::ExecuteRecompiler()

View File

@ -47,7 +47,6 @@ public:
CN64System(CPlugins * Plugins, uint32_t randomizer_seed, bool SavesReadOnly, bool SyncSystem); CN64System(CPlugins * Plugins, uint32_t randomizer_seed, bool SavesReadOnly, bool SyncSystem);
virtual ~CN64System(void); virtual ~CN64System(void);
bool m_EndEmulation;
SAVE_CHIP_TYPE m_SaveUsing; SAVE_CHIP_TYPE m_SaveUsing;
// Methods // Methods
@ -189,6 +188,7 @@ private:
CProfiling m_CPU_Usage; // Used to track the CPU usage CProfiling m_CPU_Usage; // Used to track the CPU usage
CRecompiler * m_Recomp; CRecompiler * m_Recomp;
CSpeedLimiter m_Limiter; CSpeedLimiter m_Limiter;
bool m_EndEmulation;
bool m_InReset; bool m_InReset;
int32_t m_NextTimer; int32_t m_NextTimer;
CSystemTimer m_SystemTimer; CSystemTimer m_SystemTimer;