diff --git a/src/backend/Core.cpp b/src/backend/Core.cpp index 65dac597..a2395639 100644 --- a/src/backend/Core.cpp +++ b/src/backend/Core.cpp @@ -60,6 +60,32 @@ void Core::LoadROM(const std::string &rom_) { romLoaded = true; } +int Core::StepCPU() { + return cpu->Step() + regs.PopStalledCycles(); +} + +void Core::StepRSP(int cpuCycles) { + MMIO &mmio = mem->mmio; + + if (mmio.rsp.spStatus.halt) { + regs.steps = 0; + mmio.rsp.steps = 0; + return; + } + + static constexpr int cpuRatio = 3, rspRatio = 2; + + regs.steps += cpuCycles; + int sets = regs.steps / cpuRatio; + mmio.rsp.steps += sets * rspRatio; + regs.steps -= sets * cpuRatio; + + while (mmio.rsp.steps > 0) { + mmio.rsp.steps--; + mmio.rsp.Step(); + } +} + void Core::Run(float volumeL, float volumeR) { MMIO &mmio = mem->mmio; @@ -72,28 +98,9 @@ void Core::Run(float volumeL, float volumeR) { mmio.mi.InterruptRaise(MI::Interrupt::VI); } - for (; cycles < mem->mmio.vi.cyclesPerHalfline; cycles++, frameCycles++) { - u32 taken = cpu->Step(); - taken += regs.PopStalledCycles(); - - if(!Util::Error::IsHandled()) - return; - - regs.steps += taken; - if (mmio.rsp.spStatus.halt) { - regs.steps = 0; - mmio.rsp.steps = 0; - } else { - while (regs.steps > 2) { - mmio.rsp.steps += 2; - regs.steps -= 3; - } - - while (mmio.rsp.steps > 0) { - mmio.rsp.steps--; - mmio.rsp.Step(); - } - } + while(cycles < mem->mmio.vi.cyclesPerHalfline) { + u32 taken = StepCPU(); + StepRSP(taken); cycles += taken; frameCycles += taken; diff --git a/src/backend/Core.hpp b/src/backend/Core.hpp index c11741e1..87ca650c 100644 --- a/src/backend/Core.hpp +++ b/src/backend/Core.hpp @@ -28,6 +28,8 @@ struct Core { return *GetInstance().mem; } + int StepCPU(); + void StepRSP(int cpuCycles); void Stop(); void Reset(); void LoadROM(const std::string &);