private bool ProcessEvents(MegaDriveHost host, uint ticks)
        {
            var quit = false;

            while (SDL_PollEvent(out var e) != 0)
            {
                switch (e.type)
                {
                case SDL_EventType.SDL_QUIT:
                    quit = true;
                    break;

                case SDL_EventType.SDL_MOUSEMOTION:
                    _lastCursorMoveTick = ticks;
                    break;

                case SDL_EventType.SDL_KEYDOWN:
                    var keysym = e.key.keysym;
                    switch (keysym.scancode)
                    {
                    case SDL_Scancode.SDL_SCANCODE_R:
                        if ((keysym.mod & SDL_Keymod.KMOD_LCTRL) != 0 ||
                            (keysym.mod & SDL_Keymod.KMOD_RCTRL) != 0)
                        {
                            host.Reset();
                        }
                        break;

                    case SDL_Scancode.SDL_SCANCODE_RETURN:
                        if (GetKeyState(SDL_Scancode.SDL_SCANCODE_LALT) || GetKeyState(SDL_Scancode.SDL_SCANCODE_RALT))
                        {
                            ToggleFullscreen();
                        }
                        break;
                    }
                    break;
                }
            }
            return(quit);
        }
        public void Run(Sram sram, MegaDriveHost host, CancellationToken ct = default)
        {
            InitialiseAudio((int)host.SampleRate);

            _host       = host;
            host.Client = this;
            var tickWait         = (uint)Math.Floor(1000.0 / host.FPS);
            var lastTicks        = 0U;
            var lastRefreshVideo = 0U;
            var quit             = false;
            var ff = false;

            while (!quit && !ct.IsCancellationRequested)
            {
                var ticks = SDL_GetTicks();
                var diff  = ticks - lastTicks;
                if (diff >= tickWait || ff)
                {
                    lastTicks = ticks;
                    if (!ff || ticks > lastRefreshVideo + 30)
                    {
                        RefreshVideo     = true;
                        lastRefreshVideo = ticks;
                    }
                    else
                    {
                        RefreshVideo = false;
                    }

                    if (_lastCursorMoveTick + CURSOR_HIDE_DELAY < ticks)
                    {
                        SDL_ShowCursor(0);
                    }
                    else
                    {
                        SDL_ShowCursor(1);
                    }

                    if (_lastControllerCheck + CONTROLLER_CHECK_INTERVAL < ticks)
                    {
                        _lastControllerCheck = ticks;
                        RecheckControllers();
                    }

                    if (_lastSramSaveTick + SRAM_SAVE_INTERVAL < ticks)
                    {
                        _lastSramSaveTick = ticks;
                        if (sram.Update())
                        {
                            sram.Save();
                        }
                    }

                    SDL_PumpEvents();
                    UpdateKeyboardState();
                    OnUpdate();

                    ff = FastForward || GetKeyState(SDL_Scancode.SDL_SCANCODE_BACKSPACE);
                    if (ff)
                    {
                        SDL_ClearQueuedAudio(_audioDevice);
                    }

                    quit = ProcessEvents(host, ticks);
                }
                else
                {
                    SDL_Delay(tickWait - diff);
                }
            }
        }
Esempio n. 3
0
 public Sram(MegaDriveHost host, string path)
 {
     _host = host;
     _path = path;
 }