From 61046ac147270cd1bf9315341ec93ae08da4520a Mon Sep 17 00:00:00 2001 From: n-a-c-h <> Date: Sun, 15 May 2005 13:24:19 +0000 Subject: [PATCH] Pause for rewind and state load now work correctly. --- zsnes/src/cpu/execute.asm | 40 ++++++++++++++++++++++++++++++--------- zsnes/src/zstate.c | 27 +++++++++++++------------- 2 files changed, 44 insertions(+), 23 deletions(-) diff --git a/zsnes/src/cpu/execute.asm b/zsnes/src/cpu/execute.asm index 920c58bd..219b10a9 100644 --- a/zsnes/src/cpu/execute.asm +++ b/zsnes/src/cpu/execute.asm @@ -56,7 +56,7 @@ EXTSYM MovieSeekBehind,SaveSramData,BackupCVFrame,RestoreCVFrame,loadstate EXTSYM KeyInsrtChap,KeyNextChap,KeyPrevChap,MovieInsertChapter,MovieSeekAhead EXTSYM ResetDuringMovie,EMUPauseKey,INCRFrameKey,MovieWaiting,NoInputRead EXTSYM AllocatedRewindStates,SlowDownLock,FastForwardLock -EXTSYM PauseFrameMode,RestorePauseFrame +EXTSYM PauseFrameMode,RestorePauseFrame,BackupPauseFrame %ifdef __MSDOS__ EXTSYM dssel @@ -98,6 +98,13 @@ NEWSYM ProcessRewind call RestoreCVFrame popad + cmp byte[PauseFrameMode],1 + jne .notpauserewind + pushad + call BackupPauseFrame + popad +.notpauserewind + mov esi,[tempesi] mov edi,[tempedi] mov ebp,[tempebp] @@ -1426,12 +1433,16 @@ NEWSYM cpuover .noinputread ;Pause and Frame increment - cmp byte[PauseFrameMode],2 - jne .nopauseframemode2 + cmp byte[PauseFrameMode],3 + jne .nopauseframemode3 pushad call RestorePauseFrame popad -.nopauseframemode2 + mov esi,[tempesi] + mov edi,[tempedi] + mov ebp,[tempebp] + mov edx,[tempedx] +.nopauseframemode3 cmp byte[EMUPause],1 jne .noemupause @@ -1439,14 +1450,25 @@ NEWSYM cpuover ; prevents some random desyncs mov byte[SlowDownLock],0 mov byte[FastForwardLock],0 - - call ProcessRewind - + cmp byte[PauseFrameMode],1 jne .nopauseframemode1 - mov byte[PauseFrameMode],2 - jmp .noprocmovie + mov [tempedx],edx + mov [tempesi],esi + mov [tempedi],edi + mov [tempebp],ebp + pushad + call BackupPauseFrame + popad .nopauseframemode1 + + call ProcessRewind + + cmp byte[PauseFrameMode],2 + jne .nopauseframemode2 + mov byte[PauseFrameMode],3 + jmp .noprocmovie +.nopauseframemode2 cmp byte[INCRFrame],1 jne .noframeincr diff --git a/zsnes/src/zstate.c b/zsnes/src/zstate.c index c7c9de6f..660c2aa2 100755 --- a/zsnes/src/zstate.c +++ b/zsnes/src/zstate.c @@ -225,8 +225,9 @@ unsigned char *SpecialPauseBackup = 0, PauseFrameMode = 0; Pause frame modes 0 - no pause frame stored -1 - pause frame stored -2 - pause frame ready for reload +1 - pause frame ready to be stored +2 - pause frame stored +3 - pause frame ready for reload */ void *doMemAlloc(size_t); @@ -234,7 +235,7 @@ void *doMemAlloc(size_t); void BackupPauseFrame() { copy_state_data(SpecialPauseBackup, memcpyinc, csm_save_rewind); - PauseFrameMode = 1; + PauseFrameMode = 2; } void RestorePauseFrame() @@ -295,16 +296,14 @@ void RestoreCVFrame() zmv_rewind_load(LatestRewindPos, true); } - EMUPause = PauseRewind; + if (PauseRewind) + { + PauseFrameMode = EMUPause = true; + } } copy_state_data(RewindBufferPos, memcpyrinc, csm_load_rewind); - if (EMUPause) - { - BackupPauseFrame(); - } - ClearCacheCheck(); RewindTimer = ActualRewindFrames; @@ -859,10 +858,10 @@ void stateloader (unsigned char *statename, unsigned char keycheck, unsigned cha Msgptr = "RR STATE LOADED."; MessageOn = MsgCount; - if ((EMUPause = PauseLoad)) //Yes this if supposed to have a single equal + if (PauseRewind) { - BackupPauseFrame(); - } + PauseFrameMode = EMUPause = true; + } } return; case 2: @@ -885,9 +884,9 @@ void stateloader (unsigned char *statename, unsigned char keycheck, unsigned cha { Msgptr = txtloadmsg; // 'STATE X LOADED.' - if ((EMUPause = PauseLoad)) //Yes this if supposed to have a single equal + if (PauseRewind) { - BackupPauseFrame(); + PauseFrameMode = EMUPause = true; } } else