From 38aa8aafcdf89540b38820ca5e96739fc6583e34 Mon Sep 17 00:00:00 2001 From: n-a-c-h <> Date: Sat, 2 Apr 2005 22:54:28 +0000 Subject: [PATCH] Movies can now record reset. Todo: Make reset during movie replay not crash, anyone want to help with this? --- zsnes/src/cpu/execute.asm | 10 +++++++++- zsnes/src/zmovie.c | 26 +++++++++++++++++++++----- 2 files changed, 30 insertions(+), 6 deletions(-) diff --git a/zsnes/src/cpu/execute.asm b/zsnes/src/cpu/execute.asm index 70d47005..4d0dc210 100644 --- a/zsnes/src/cpu/execute.asm +++ b/zsnes/src/cpu/execute.asm @@ -108,7 +108,7 @@ EXTSYM SfxSFR,nosprincr EXTSYM cpucycle,debstop,switchtovirqdeb,debstop3,switchtonmideb EXTSYM NetPlayNoMore,MovieSeekBehind EXTSYM statefileloc,CHIPBATT,SaveSramData,BackupCVFrame,RestoreCVFrame,loadstate -EXTSYM KeyInsrtChap,KeyNextChap,KeyPrevChap,MovieInsertChapter,MovieSeekAhead +EXTSYM KeyInsrtChap,KeyNextChap,KeyPrevChap,MovieInsertChapter,MovieSeekAhead,ResetDuringMovie,MovieExitLoop %ifdef __MSDOS__ EXTSYM dssel @@ -977,7 +977,13 @@ reexecuteb2: .activatereset pushad mov byte[GUIReset],1 + cmp byte[MovieProcessing],2 ;Recording + jne .nomovierecording + call ResetDuringMovie + jmp .movieendif +.nomovierecording call GUIDoReset +.movieendif popad mov byte[ReturnFromSPCStall],0 jmp continueprog @@ -2724,6 +2730,8 @@ NEWSYM cpuover pushad call ProcessMovies popad + cmp byte[MovieExitLoop],1 + je execloop.startagain ;Where do we jump to? .noprocmovie test byte[INTEnab],1 diff --git a/zsnes/src/zmovie.c b/zsnes/src/zmovie.c index 736062e3..71a99101 100644 --- a/zsnes/src/zmovie.c +++ b/zsnes/src/zmovie.c @@ -841,17 +841,17 @@ static bool zmv_open(char *filename) return(false); } -static void zmv_replay_command(enum zmv_commands command) +//If this returns true, the caller should not proccess another input +static bool zmv_replay_command(enum zmv_commands command) { switch (command) { case zmv_command_reset: GUIReset = 1; - asm_call(GUIDoReset); - ReturnFromSPCStall = 0; - zst_sram_load(zmv_vars.fp); + return(true); break; } + return(false); } #define RESTORE_PAD(cur, prev) cur = (((unsigned int)prev) << 20) | 0x8000 @@ -901,7 +901,10 @@ static bool zmv_replay() if (flag & BIT(0)) //Command { - zmv_replay_command(flag >> 1); + if (zmv_replay_command(flag >> 1)); + { + return(true); + } return(zmv_replay()); } @@ -1762,12 +1765,22 @@ void Replay() } } +bool MovieExitLoop = false; void ProcessMovies() { + MovieExitLoop = false; switch (MovieProcessing) { case MOVIE_PLAYBACK: Replay(); + if (GUIReset == 1) + { + SetMovieMode(MOVIE_OFF); + asm_call(GUIDoReset); + SetMovieMode(MOVIE_PLAYBACK); + ReturnFromSPCStall = 0; + MovieExitLoop = true; + } break; case MOVIE_RECORD: zmv_record(SloMo50 ? true : false, ComboCounter); @@ -1781,6 +1794,9 @@ void ProcessMovies() void ResetDuringMovie() { zmv_record_command(zmv_command_reset); + SetMovieMode(MOVIE_OFF); + asm_call(GUIDoReset); + SetMovieMode(MOVIE_RECORD); } void SkipMovie()