From b360d27f225ea2db1a87408d3eaee6b41b29244b Mon Sep 17 00:00:00 2001 From: Andrea Odetti Date: Thu, 12 Nov 2020 19:31:35 +0000 Subject: [PATCH] split --- source/frontends/sa2/emulator.cpp | 31 ++++++++++++++++++++++++------- source/frontends/sa2/emulator.h | 2 ++ source/frontends/sa2/main.cpp | 1 + 3 files changed, 27 insertions(+), 7 deletions(-) diff --git a/source/frontends/sa2/emulator.cpp b/source/frontends/sa2/emulator.cpp index b1c834ce..30b327e3 100644 --- a/source/frontends/sa2/emulator.cpp +++ b/source/frontends/sa2/emulator.cpp @@ -182,21 +182,38 @@ Emulator::Emulator( , myFPS(getFPS()) , myMultiplier(1) , myFullscreen(false) + , myExtraCycles(0) { } void Emulator::executeOneFrame() { - const DWORD uCyclesToExecute = int(g_fCurrentCLK6502 / myFPS); - const UINT dwClksPerFrame = NTSC_GetCyclesPerFrame(); const bool bVideoUpdate = true; - const DWORD uActualCyclesExecuted = CpuExecute(uCyclesToExecute, bVideoUpdate); - g_dwCyclesThisFrame = (g_dwCyclesThisFrame + uActualCyclesExecuted) % dwClksPerFrame; + const int nExecutionPeriodUsec = 1000; // 1.0ms + const double fUsecPerSec = 1.e6; + const double fExecutionPeriodClks = int(g_fCurrentCLK6502 * (nExecutionPeriodUsec / fUsecPerSec)); - GetCardMgr().GetDisk2CardMgr().UpdateDriveState(uActualCyclesExecuted); - MB_PeriodicUpdate(uActualCyclesExecuted); - SpkrUpdate(uActualCyclesExecuted); + int totalCyclesExecuted = 0; + const DWORD uCyclesToExecute = int(g_fCurrentCLK6502 / myFPS) + myExtraCycles; + const UINT dwClksPerFrame = NTSC_GetCyclesPerFrame(); + while (totalCyclesExecuted < uCyclesToExecute) + { + // go in small steps of 1ms + const DWORD uActualCyclesExecuted = CpuExecute(fExecutionPeriodClks, bVideoUpdate); + totalCyclesExecuted += uActualCyclesExecuted; + g_dwCyclesThisFrame = (g_dwCyclesThisFrame + uActualCyclesExecuted) % dwClksPerFrame; + + GetCardMgr().GetDisk2CardMgr().UpdateDriveState(uActualCyclesExecuted); + MB_PeriodicUpdate(uActualCyclesExecuted); + SpkrUpdate(uActualCyclesExecuted); + } + + myExtraCycles = uCyclesToExecute - totalCyclesExecuted; +} + +void Emulator::refreshVideo() +{ // SDL2 seems to synch with screen refresh rate so we do not need to worry about timers const SDL_Rect srect = refreshTexture(myTexture); renderScreen(myRenderer, myTexture, srect); diff --git a/source/frontends/sa2/emulator.h b/source/frontends/sa2/emulator.h index ef1ecda6..54c794ce 100644 --- a/source/frontends/sa2/emulator.h +++ b/source/frontends/sa2/emulator.h @@ -13,6 +13,7 @@ public: ); void executeOneFrame(); + void refreshVideo(); void processEvents(bool & quit); private: @@ -27,4 +28,5 @@ private: int myMultiplier; bool myFullscreen; + int myExtraCycles; }; diff --git a/source/frontends/sa2/main.cpp b/source/frontends/sa2/main.cpp index 76e3aec9..a9e4b721 100644 --- a/source/frontends/sa2/main.cpp +++ b/source/frontends/sa2/main.cpp @@ -216,6 +216,7 @@ void run_sdl(int argc, const char * argv []) SDirectSound::writeAudio(); emulator.processEvents(quit); emulator.executeOneFrame(); + emulator.refreshVideo(); } while (!quit); SDirectSound::stop();