diff --git a/source/Applewin.cpp b/source/Applewin.cpp index 26aaa8c6..b7423717 100644 --- a/source/Applewin.cpp +++ b/source/Applewin.cpp @@ -232,6 +232,9 @@ void ContinueExecution(void) if (g_bFullSpeed) { + if (!bWasFullSpeed) + VideoRedrawScreenDuringFullSpeed(0, true); // Init for full-speed mode + // Don't call Spkr_Mute() - will get speaker clicks MB_Mute(); SysClk_StopTimer(); @@ -249,7 +252,6 @@ void ContinueExecution(void) { if (bWasFullSpeed) { - VideoRedrawScreenDuringFullSpeed(0, true); // Invalidate the copies of video memory VideoRedrawScreenAfterFullSpeed(g_dwCyclesThisFrame); } diff --git a/source/Video.cpp b/source/Video.cpp index b38fdfa3..191fca27 100644 --- a/source/Video.cpp +++ b/source/Video.cpp @@ -1052,16 +1052,25 @@ void VideoDisplayLogo () // . 10s only update if HIRES changes (17s for Debug build) // . ~9s no update during full-speed (but IBIZA.DSK doesn't show anything!) -void VideoRedrawScreenDuringFullSpeed(DWORD dwCyclesThisFrame, bool bInvalidate /*=false*/) +void VideoRedrawScreenDuringFullSpeed(DWORD dwCyclesThisFrame, bool bInit /*=false*/) { + static DWORD dwFullSpeedStartTime = 0; static bool bValid = false; - if (bInvalidate) + if (bInit) { + // Just entered full-speed mode bValid = false; + dwFullSpeedStartTime = GetTickCount(); return; } + DWORD dwFullSpeedDuration = GetTickCount() - dwFullSpeedStartTime; + if (dwFullSpeedDuration <= 16) // Only update after every realtime ~17ms of *continuous* full-speed + return; + + dwFullSpeedStartTime += dwFullSpeedDuration; + // static BYTE text_main[1024*2] = {0}; // page1 & 2 diff --git a/source/Video.h b/source/Video.h index 29cee8d8..8190b8fe 100644 --- a/source/Video.h +++ b/source/Video.h @@ -169,7 +169,7 @@ void VideoDestroy (); void VideoDisplayLogo (); void VideoInitialize (); void VideoRealizePalette (HDC); -void VideoRedrawScreenDuringFullSpeed(DWORD dwCyclesThisFrame, bool bInvalidate = false); +void VideoRedrawScreenDuringFullSpeed(DWORD dwCyclesThisFrame, bool bInit = false); void VideoRedrawScreenAfterFullSpeed(DWORD dwCyclesThisFrame); void VideoRedrawScreen (UINT uDelayRefresh = 0); void VideoRefreshScreen (int bVideoFlags, UINT uDelayRefresh =0 );