idle skipping works!
This commit is contained in:
+10
-30
@@ -96,49 +96,37 @@ void Core::StepRSP(const u32 cpuCycles) {
|
||||
}
|
||||
}
|
||||
|
||||
void Core::MaybeIdleSkip() {
|
||||
if (GetRegs().nextPC == GetRegs().pc)
|
||||
Scheduler::GetInstance().SkipToNext();
|
||||
}
|
||||
|
||||
void Core::Run(const float volumeL, const float volumeR) {
|
||||
MMIO &mmio = mem->mmio;
|
||||
|
||||
bool broken = false;
|
||||
for (int field = 0; field < mmio.vi.numFields; field++) {
|
||||
Scheduler::GetInstance().HandleEvents();
|
||||
u32 frameCycles = 0;
|
||||
for (int i = 0; i < mmio.vi.numHalflines; i++) {
|
||||
mmio.vi.current = (i << 1) + field;
|
||||
for (int halfline = 0; halfline < mmio.vi.numHalflines; halfline++) {
|
||||
mmio.vi.current = (halfline << 1) + field;
|
||||
|
||||
if ((mmio.vi.current & 0x3FE) == mmio.vi.intr) {
|
||||
mmio.mi.InterruptRaise(MI::Interrupt::VI);
|
||||
}
|
||||
|
||||
while (cycles < mem->mmio.vi.cyclesPerHalfline) {
|
||||
if (IsAnythingSkippable()) {
|
||||
const u32 taken = Scheduler::GetInstance().events.top().time - Scheduler::GetInstance().ticks;
|
||||
cycles += taken;
|
||||
frameCycles += taken;
|
||||
Scheduler::GetInstance().Tick(taken);
|
||||
isReadingAnyIO = false;
|
||||
continue;
|
||||
}
|
||||
for (int cycles = 0; cycles < mem->mmio.vi.cyclesPerHalfline;) {
|
||||
Scheduler::GetInstance().HandleEvents();
|
||||
|
||||
const u32 taken = StepCPU();
|
||||
cycles += taken;
|
||||
|
||||
if ((broken = breakpoints.contains(regs.nextPC)))
|
||||
break;
|
||||
|
||||
StepRSP(taken);
|
||||
frameCycles += taken;
|
||||
Scheduler::GetInstance().Tick(taken);
|
||||
}
|
||||
|
||||
if (broken)
|
||||
break;
|
||||
|
||||
cycles -= mmio.vi.cyclesPerHalfline;
|
||||
}
|
||||
|
||||
if (broken)
|
||||
break;
|
||||
|
||||
if ((mmio.vi.current & 0x3FE) == mmio.vi.intr) {
|
||||
mmio.mi.InterruptRaise(MI::Interrupt::VI);
|
||||
}
|
||||
@@ -146,13 +134,5 @@ void Core::Run(const float volumeL, const float volumeR) {
|
||||
mmio.ai.Step(frameCycles, volumeL, volumeR);
|
||||
Scheduler::GetInstance().Tick(frameCycles);
|
||||
}
|
||||
|
||||
if (broken)
|
||||
pause = true;
|
||||
}
|
||||
|
||||
bool Core::IsAnythingSkippable() {
|
||||
MMIO &mmio = mem->mmio;
|
||||
return (mmio.si.status.dmaBusy || mmio.pi.dmaBusy || mmio.pi.ioBusy) && isReadingAnyIO;
|
||||
}
|
||||
} // namespace n64
|
||||
|
||||
Reference in New Issue
Block a user