Merge branch 'dev' of git.sr.ht:~irisz64/kaizen into dev
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -28,6 +28,8 @@ struct Core {
|
||||
return *GetInstance().mem;
|
||||
}
|
||||
|
||||
int StepCPU();
|
||||
void StepRSP(int cpuCycles);
|
||||
void Stop();
|
||||
void Reset();
|
||||
void LoadROM(const std::string &);
|
||||
|
||||
Reference in New Issue
Block a user