reset/power recording and playback support.

This commit is contained in:
zeromus 2008-11-02 18:21:44 +00:00
parent b39baa43ee
commit 6f4928726e
3 changed files with 16 additions and 7 deletions

View File

@ -944,6 +944,7 @@ bool FCEU_IsValidUI(EFCEUI ui)
case FCEUI_POWER: case FCEUI_POWER:
if(!GameInfo) return false; if(!GameInfo) return false;
if(FCEUMOV_Mode(MOVIEMODE_RECORD)) return true;
if(!FCEUMOV_Mode(MOVIEMODE_INACTIVE)) return false; if(!FCEUMOV_Mode(MOVIEMODE_INACTIVE)) return false;
break; break;
@ -995,7 +996,7 @@ class NROM : FCEUXCart {
public: public:
virtual void Power() { virtual void Power() {
SetReadHandler(0x8000,0xFFFF,CartBR); SetReadHandler(0x8000,0xFFFF,CartBR);
setprg16(0x8000,0); setprg16(0x8000,0);
setprg16(0xC000,~0); setprg16(0xC000,~0);
setchr8(0); setchr8(0);

View File

@ -831,6 +831,8 @@ void FCEUI_SaveMovie(const char *fname, EMOVIE_FLAG flags, std::wstring author)
FCEU_DispMessage("Movie recording started."); FCEU_DispMessage("Movie recording started.");
} }
static int _currCommand = 0;
//the main interaction point between the emulator and the movie system. //the main interaction point between the emulator and the movie system.
//either dumps the current joystick state or loads one state from the movie //either dumps the current joystick state or loads one state from the movie
void FCEUMOV_AddInputState() void FCEUMOV_AddInputState()
@ -870,7 +872,10 @@ void FCEUMOV_AddInputState()
{ {
MovieRecord* mr = &currMovieData.records[currFrameCounter]; MovieRecord* mr = &currMovieData.records[currFrameCounter];
//reset if necessary //reset and power cycle if necessary
if(mr->command_power())
PowerNES();
if(mr->command_reset()) if(mr->command_reset())
ResetNES(); ResetNES();
@ -901,7 +906,8 @@ void FCEUMOV_AddInputState()
joyports[0].log(&mr); joyports[0].log(&mr);
joyports[1].log(&mr); joyports[1].log(&mr);
mr.commands = 0; mr.commands = _currCommand;
_currCommand = 0;
mr.dump(&currMovieData, osRecordingMovie,currMovieData.records.size()); mr.dump(&currMovieData, osRecordingMovie,currMovieData.records.size());
currMovieData.records.push_back(mr); currMovieData.records.push_back(mr);
@ -920,11 +926,11 @@ void FCEUMOV_AddCommand(int cmd)
// do nothing if not recording a movie // do nothing if not recording a movie
if(movieMode != MOVIEMODE_RECORD) if(movieMode != MOVIEMODE_RECORD)
return; return;
//printf("%d\n",cmd);
//MBG TODO BIG TODO TODO TODO //NOTE: EMOVIECMD matches FCEUNPCMD_RESET and FCEUNPCMD_POWER
//DoEncode((cmd>>3)&0x3,cmd&0x7,1); //we are lucky (well, I planned it that way)
_currCommand |= cmd;
} }
void FCEU_DrawMovies(uint8 *XBuf) void FCEU_DrawMovies(uint8 *XBuf)

View File

@ -61,6 +61,7 @@ enum EMOVIEMODE
enum EMOVIECMD enum EMOVIECMD
{ {
MOVIECMD_RESET = 1, MOVIECMD_RESET = 1,
MOVIECMD_POWER = 2,
}; };
EMOVIEMODE FCEUMOV_Mode(); EMOVIEMODE FCEUMOV_Mode();
@ -97,6 +98,7 @@ public:
//the disk format will support up to 64bit if necessary //the disk format will support up to 64bit if necessary
uint8 commands; uint8 commands;
bool command_reset() { return (commands&MOVIECMD_RESET)!=0; } bool command_reset() { return (commands&MOVIECMD_RESET)!=0; }
bool command_power() { return (commands&MOVIECMD_POWER)!=0; }
void toggleBit(int joy, int bit) void toggleBit(int joy, int bit)
{ {