Pause rewind now mostly implemented.
This commit is contained in:
@@ -56,6 +56,7 @@ EXTSYM MovieSeekBehind,SaveSramData,BackupCVFrame,RestoreCVFrame,loadstate
|
|||||||
EXTSYM KeyInsrtChap,KeyNextChap,KeyPrevChap,MovieInsertChapter,MovieSeekAhead
|
EXTSYM KeyInsrtChap,KeyNextChap,KeyPrevChap,MovieInsertChapter,MovieSeekAhead
|
||||||
EXTSYM ResetDuringMovie,EMUPauseKey,INCRFrameKey,MovieWaiting,NoInputRead
|
EXTSYM ResetDuringMovie,EMUPauseKey,INCRFrameKey,MovieWaiting,NoInputRead
|
||||||
EXTSYM AllocatedRewindStates,SlowDownLock,FastForwardLock
|
EXTSYM AllocatedRewindStates,SlowDownLock,FastForwardLock
|
||||||
|
EXTSYM PauseFrameMode,RestorePauseFrame
|
||||||
|
|
||||||
%ifdef __MSDOS__
|
%ifdef __MSDOS__
|
||||||
EXTSYM dssel
|
EXTSYM dssel
|
||||||
@@ -1425,24 +1426,40 @@ NEWSYM cpuover
|
|||||||
.noinputread
|
.noinputread
|
||||||
|
|
||||||
;Pause and Frame increment
|
;Pause and Frame increment
|
||||||
|
cmp byte[PauseFrameMode],2
|
||||||
|
jne .nopauseframemode2
|
||||||
|
pushad
|
||||||
|
call RestorePauseFrame
|
||||||
|
popad
|
||||||
|
.nopauseframemode2
|
||||||
|
|
||||||
|
cmp byte[EMUPause],1
|
||||||
|
jne .noemupause
|
||||||
|
|
||||||
|
; 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
|
||||||
|
.nopauseframemode1
|
||||||
|
|
||||||
cmp byte[INCRFrame],1
|
cmp byte[INCRFrame],1
|
||||||
jne .noframeincr
|
jne .noframeincr
|
||||||
xor byte[INCRFrame],1
|
xor byte[INCRFrame],1
|
||||||
jmp .noemupause
|
jmp .noemupause
|
||||||
.noframeincr
|
.noframeincr
|
||||||
cmp byte[EMUPause],1
|
|
||||||
jne .noemupause
|
|
||||||
mov byte[SlowDownLock],0 ; prevents some random desyncs
|
|
||||||
mov byte[FastForwardLock],0 ; prevents some random desyncs
|
|
||||||
|
|
||||||
call ProcessRewind
|
|
||||||
|
|
||||||
;Update screen (we should also kill sound)
|
;Update screen (we should also kill sound)
|
||||||
pushad
|
pushad
|
||||||
|
call StartDrawNewGfx
|
||||||
call showvideo
|
call showvideo
|
||||||
popad
|
popad
|
||||||
|
|
||||||
;jmp .nocache
|
|
||||||
jmp .nonewgfx
|
jmp .nonewgfx
|
||||||
.noemupause
|
.noemupause
|
||||||
|
|
||||||
|
|||||||
@@ -220,18 +220,28 @@ void ClearCacheCheck()
|
|||||||
}
|
}
|
||||||
|
|
||||||
//Code to handle special frames for pausing, and desync checking
|
//Code to handle special frames for pausing, and desync checking
|
||||||
unsigned char *SpecialPauseBackup = 0;
|
unsigned char *SpecialPauseBackup = 0, PauseFrameMode = 0;
|
||||||
|
/*
|
||||||
|
Pause frame modes
|
||||||
|
|
||||||
|
0 - no pause frame stored
|
||||||
|
1 - pause frame stored
|
||||||
|
2 - pause frame ready for reload
|
||||||
|
*/
|
||||||
|
|
||||||
void *doMemAlloc(size_t);
|
void *doMemAlloc(size_t);
|
||||||
|
|
||||||
void BackupPauseFrame()
|
void BackupPauseFrame()
|
||||||
{
|
{
|
||||||
copy_state_data(SpecialPauseBackup, memcpyinc, csm_save_rewind);
|
copy_state_data(SpecialPauseBackup, memcpyinc, csm_save_rewind);
|
||||||
|
PauseFrameMode = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
void RestorePauseFrame()
|
void RestorePauseFrame()
|
||||||
{
|
{
|
||||||
copy_state_data(SpecialPauseBackup, memcpyrinc, csm_load_rewind);
|
copy_state_data(SpecialPauseBackup, memcpyrinc, csm_load_rewind);
|
||||||
ClearCacheCheck();
|
ClearCacheCheck();
|
||||||
|
PauseFrameMode = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
#define ActualRewindFrames (RewindFrames * (romispal ? 10 : 12))
|
#define ActualRewindFrames (RewindFrames * (romispal ? 10 : 12))
|
||||||
@@ -285,14 +295,16 @@ void RestoreCVFrame()
|
|||||||
zmv_rewind_load(LatestRewindPos, true);
|
zmv_rewind_load(LatestRewindPos, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((EMUPause = PauseRewind)) //Yes this if supposed to have a single equal
|
EMUPause = PauseRewind;
|
||||||
{
|
|
||||||
BackupPauseFrame();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
copy_state_data(RewindBufferPos, memcpyrinc, csm_load_rewind);
|
copy_state_data(RewindBufferPos, memcpyrinc, csm_load_rewind);
|
||||||
|
|
||||||
|
if (EMUPause)
|
||||||
|
{
|
||||||
|
BackupPauseFrame();
|
||||||
|
}
|
||||||
|
|
||||||
ClearCacheCheck();
|
ClearCacheCheck();
|
||||||
|
|
||||||
RewindTimer = ActualRewindFrames;
|
RewindTimer = ActualRewindFrames;
|
||||||
|
|||||||
Reference in New Issue
Block a user