private void CpuLoop() { bool enabled = true; while (enabled) { if (WaitHandle.WaitAny(new WaitHandle[] { _continueSignal, _terminateSignal }) == 1) { enabled = false; } else { Cpu.Running = true; _continueSignal.Reset(); OnResumed(); int cycles = 0; do { cycles += Cpu.PerformNextInstruction(); if (cycles >= GameBoyGpu.FullFrameCycles * Cpu.SpeedMultiplier) { Spu.SpuStep(cycles / Cpu.SpeedMultiplier); cycles -= GameBoyGpu.FullFrameCycles * Cpu.SpeedMultiplier; if (EnableFrameLimit) { WaitHandle.WaitAny(new WaitHandle[] { _breakSignal, _frameStartSignal }); _frameStartSignal.Reset(); } } if (_breakpoints.TryGetValue(Cpu.Registers.PC, out var breakpoint) && breakpoint.Condition(Cpu)) { Cpu.IsBroken = true; } } while (!Cpu.IsBroken); _breakSignal.Reset(); Cpu.Running = false; OnPaused(); } } OnTerminated(); }