mirror of
https://git.code.sf.net/p/fuse-emulator/fuse
synced 2026-01-27 01:41:34 +03:00
Reset rzx_instructions_offset on rollback to fix replay of rolled back
recordings (and some refactoring). Legacy-ID: 2669
This commit is contained in:
@@ -1481,3 +1481,5 @@
|
||||
Stuart Brady)
|
||||
20061217 machine.c: load rom into correct memory bank (fixes If1 ROM paging)
|
||||
(Fred).
|
||||
20061217 menu.c,rzx.[ch]: reset rzx_instructions_offset on rollback to fix
|
||||
replay of rolled back recordings (and some refactoring).
|
||||
|
||||
26
menu.c
26
menu.c
@@ -97,7 +97,6 @@ MENU_CALLBACK( menu_file_recording_insertsnapshot )
|
||||
|
||||
MENU_CALLBACK( menu_file_recording_rollback )
|
||||
{
|
||||
libspectrum_snap *snap;
|
||||
libspectrum_error error;
|
||||
|
||||
if( !rzx_recording ) return;
|
||||
@@ -106,13 +105,7 @@ MENU_CALLBACK( menu_file_recording_rollback )
|
||||
|
||||
fuse_emulation_pause();
|
||||
|
||||
error = libspectrum_rzx_rollback( rzx, &snap );
|
||||
if( error ) { fuse_emulation_unpause(); return; }
|
||||
|
||||
error = snapshot_copy_from( snap );
|
||||
if( error ) { fuse_emulation_unpause(); return; }
|
||||
|
||||
error = libspectrum_rzx_start_input( rzx, tstates );
|
||||
error = rzx_rollback();
|
||||
if( error ) { fuse_emulation_unpause(); return; }
|
||||
|
||||
fuse_emulation_unpause();
|
||||
@@ -120,9 +113,6 @@ MENU_CALLBACK( menu_file_recording_rollback )
|
||||
|
||||
MENU_CALLBACK( menu_file_recording_rollbackto )
|
||||
{
|
||||
GSList *rollback_points;
|
||||
libspectrum_snap *snap;
|
||||
int which;
|
||||
libspectrum_error error;
|
||||
|
||||
if( !rzx_recording ) return;
|
||||
@@ -131,19 +121,7 @@ MENU_CALLBACK( menu_file_recording_rollbackto )
|
||||
|
||||
fuse_emulation_pause();
|
||||
|
||||
rollback_points = rzx_get_rollback_list( rzx );
|
||||
|
||||
which = ui_get_rollback_point( rollback_points );
|
||||
|
||||
if( which == -1 ) { fuse_emulation_unpause(); return; }
|
||||
|
||||
error = libspectrum_rzx_rollback_to( rzx, &snap, which );
|
||||
if( error ) { fuse_emulation_unpause(); return; }
|
||||
|
||||
error = snapshot_copy_from( snap );
|
||||
if( error ) { fuse_emulation_unpause(); return; }
|
||||
|
||||
error = libspectrum_rzx_start_input( rzx, tstates );
|
||||
error = rzx_rollback_to();
|
||||
if( error ) { fuse_emulation_unpause(); return; }
|
||||
|
||||
fuse_emulation_unpause();
|
||||
|
||||
58
rzx.c
58
rzx.c
@@ -423,8 +423,8 @@ int rzx_end( void )
|
||||
return 0;
|
||||
}
|
||||
|
||||
GSList*
|
||||
rzx_get_rollback_list( libspectrum_rzx *rzx )
|
||||
static GSList*
|
||||
get_rollback_list( libspectrum_rzx *rzx )
|
||||
{
|
||||
libspectrum_rzx_iterator it;
|
||||
GSList *rollback_points;
|
||||
@@ -461,3 +461,57 @@ rzx_get_rollback_list( libspectrum_rzx *rzx )
|
||||
|
||||
return rollback_points;
|
||||
}
|
||||
|
||||
static int
|
||||
start_after_rollback( libspectrum_snap *snap )
|
||||
{
|
||||
int error;
|
||||
|
||||
error = snapshot_copy_from( snap );
|
||||
if( error ) return error;
|
||||
|
||||
error = libspectrum_rzx_start_input( rzx, tstates );
|
||||
if( error ) return error;
|
||||
|
||||
error = counter_reset();
|
||||
if( error ) return error;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
rzx_rollback( void )
|
||||
{
|
||||
libspectrum_snap *snap;
|
||||
int error;
|
||||
|
||||
error = libspectrum_rzx_rollback( rzx, &snap );
|
||||
if( error ) return error;
|
||||
|
||||
error = start_after_rollback( snap );
|
||||
if( error ) return error;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
rzx_rollback_to( void )
|
||||
{
|
||||
GSList *rollback_points;
|
||||
libspectrum_snap *snap;
|
||||
int which, error;
|
||||
|
||||
rollback_points = get_rollback_list( rzx );
|
||||
|
||||
which = ui_get_rollback_point( rollback_points );
|
||||
|
||||
if( which == -1 ) return 1;
|
||||
|
||||
error = libspectrum_rzx_rollback_to( rzx, &snap, which );
|
||||
if( error ) return error;
|
||||
|
||||
error = start_after_rollback( snap );
|
||||
if( error ) return error;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user