Пример #1
0
        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();
        }