* movie recording: fixed bug when emulator allowed recording commands outside the range of FM2 specs (#615)

* movie recording: added "Insert coin" command
* updated docs accordingly

[[Split portion of a mixed commit.]]
This commit is contained in:
ansstuff 2013-06-15 18:46:52 +00:00
parent a136a7813c
commit c4eeddcf0c
6 changed files with 66 additions and 44 deletions

Binary file not shown.

View File

@ -143,20 +143,26 @@ static void FDSInit(void) {
SelectDisk = 0; SelectDisk = 0;
} }
void FCEU_FDSInsert(void) { void FCEU_FDSInsert(void)
if (FCEUI_EmulationPaused()) EmulationPaused |= 2; {
if (TotalSides == 0)
{
FCEU_DispMessage("Not FDS; can't eject disk.", 0);
return;
}
if (FCEUI_EmulationPaused())
EmulationPaused |= EMULATIONPAUSED_FA;
if (FCEUMOV_Mode(MOVIEMODE_RECORD)) if (FCEUMOV_Mode(MOVIEMODE_RECORD))
FCEUMOV_AddCommand(FCEUNPCMD_FDSINSERT); FCEUMOV_AddCommand(FCEUNPCMD_FDSINSERT);
if (TotalSides == 0) { if (InDisk == 255)
FCEU_DispMessage("Not FDS; can't eject disk.", 0); {
return;
}
if (InDisk == 255) {
FCEU_DispMessage("Disk %d Side %s Inserted", 0, SelectDisk >> 1, (SelectDisk & 1) ? "B" : "A"); FCEU_DispMessage("Disk %d Side %s Inserted", 0, SelectDisk >> 1, (SelectDisk & 1) ? "B" : "A");
InDisk = SelectDisk; InDisk = SelectDisk;
} else { } else
{
FCEU_DispMessage("Disk %d Side %s Ejected", 0, SelectDisk >> 1, (SelectDisk & 1) ? "B" : "A"); FCEU_DispMessage("Disk %d Side %s Ejected", 0, SelectDisk >> 1, (SelectDisk & 1) ? "B" : "A");
InDisk = 255; InDisk = 255;
} }
@ -167,20 +173,25 @@ void FCEU_FDSEject(void)
InDisk=255; InDisk=255;
} }
*/ */
void FCEU_FDSSelect(void) { void FCEU_FDSSelect(void)
if (FCEUI_EmulationPaused()) EmulationPaused |= 2; {
if (TotalSides == 0)
{
FCEU_DispMessage("Not FDS; can't select disk.", 0);
return;
}
if (InDisk != 255)
{
FCEU_DispMessage("Eject disk before selecting.", 0);
return;
}
if (FCEUI_EmulationPaused())
EmulationPaused |= EMULATIONPAUSED_FA;
if (FCEUMOV_Mode(MOVIEMODE_RECORD)) if (FCEUMOV_Mode(MOVIEMODE_RECORD))
FCEUMOV_AddCommand(FCEUNPCMD_FDSSELECT); FCEUMOV_AddCommand(FCEUNPCMD_FDSSELECT);
if (TotalSides == 0) {
FCEU_DispMessage("Not FDS; can't select disk.", 0);
return;
}
if (InDisk != 255) {
FCEU_DispMessage("Eject disk before selecting.", 0);
return;
}
SelectDisk = ((SelectDisk + 1) % TotalSides) & 3; SelectDisk = ((SelectDisk + 1) % TotalSides) & 3;
FCEU_DispMessage("Disk %d Side %c Selected", 0, SelectDisk >> 1, (SelectDisk & 1) ? 'B' : 'A'); FCEU_DispMessage("Disk %d Side %c Selected", 0, SelectDisk >> 1, (SelectDisk & 1) ? 'B' : 'A');
} }

View File

@ -12,6 +12,7 @@
#include "video.h" #include "video.h"
#include "movie.h" #include "movie.h"
#include "fds.h" #include "fds.h"
#include "vsuni.h"
#ifdef _S9XLUA_H #ifdef _S9XLUA_H
#include "fceulua.h" #include "fceulua.h"
#endif #endif
@ -345,10 +346,10 @@ void MovieRecord::dumpBinary(MovieData* md, EMUFILE* os, int index)
void MovieRecord::dump(MovieData* md, EMUFILE* os, int index) void MovieRecord::dump(MovieData* md, EMUFILE* os, int index)
{ {
//dump the misc commands // dump the commands
//*os << '|' << setw(1) << (int)commands; //*os << '|' << setw(1) << (int)commands;
os->fputc('|'); os->fputc('|');
putdec<uint8,1,true>(os,commands); putdec<uint8,3,false>(os, commands); // "variable length decimal integer"
//a special case: if fourscore is enabled, dump four gamepads //a special case: if fourscore is enabled, dump four gamepads
if(md->fourscore) if(md->fourscore)
@ -1003,14 +1004,16 @@ void FCEUMOV_AddInputState()
joyports[0].load(mr); joyports[0].load(mr);
joyports[1].load(mr); joyports[1].load(mr);
// replay commands // replay commands
if(mr->command_power()) if (mr->command_power())
PowerNES(); PowerNES();
if(mr->command_reset()) if (mr->command_reset())
ResetNES(); ResetNES();
if(mr->command_fds_insert()) if (mr->command_fds_insert())
FCEU_FDSInsert(); FCEU_FDSInsert();
if(mr->command_fds_select()) if (mr->command_fds_select())
FCEU_FDSSelect(); FCEU_FDSSelect();
if (mr->command_vs_insertcoin())
FCEU_VSUniCoin();
_currCommand = 0; _currCommand = 0;
} else } else
#endif #endif
@ -1038,6 +1041,8 @@ void FCEUMOV_AddInputState()
FCEU_FDSInsert(); FCEU_FDSInsert();
if(mr->command_fds_select()) if(mr->command_fds_select())
FCEU_FDSSelect(); FCEU_FDSSelect();
if (mr->command_vs_insertcoin())
FCEU_VSUniCoin();
joyports[0].load(mr); joyports[0].load(mr);
joyports[1].load(mr); joyports[1].load(mr);
@ -1093,12 +1098,16 @@ void FCEUMOV_AddCommand(int cmd)
if(movieMode != MOVIEMODE_RECORD && movieMode != MOVIEMODE_TASEDITOR) if(movieMode != MOVIEMODE_RECORD && movieMode != MOVIEMODE_TASEDITOR)
return; return;
//NOTE: EMOVIECMD matches FCEUNPCMD_RESET and FCEUNPCMD_POWER // translate "FCEU NetPlay" command to "FCEU Movie" command
//we are lucky (well, I planned it that way) switch (cmd)
{
switch(cmd) { case FCEUNPCMD_RESET: cmd = MOVIECMD_RESET; break;
case FCEUNPCMD_POWER: cmd = MOVIECMD_POWER; break;
case FCEUNPCMD_FDSINSERT: cmd = MOVIECMD_FDS_INSERT; break; case FCEUNPCMD_FDSINSERT: cmd = MOVIECMD_FDS_INSERT; break;
case FCEUNPCMD_FDSSELECT: cmd = MOVIECMD_FDS_SELECT; break; case FCEUNPCMD_FDSSELECT: cmd = MOVIECMD_FDS_SELECT; break;
case FCEUNPCMD_VSUNICOIN: cmd = MOVIECMD_VS_INSERTCOIN; break;
// all other netplay commands (e.g. FCEUNPCMD_VSUNIDIP0) are not supported by movie recorder for now
default: return;
} }
_currCommand |= cmd; _currCommand |= cmd;

View File

@ -67,7 +67,8 @@ enum EMOVIECMD
MOVIECMD_RESET = 1, MOVIECMD_RESET = 1,
MOVIECMD_POWER = 2, MOVIECMD_POWER = 2,
MOVIECMD_FDS_INSERT = 4, MOVIECMD_FDS_INSERT = 4,
MOVIECMD_FDS_SELECT = 8 MOVIECMD_FDS_SELECT = 8,
MOVIECMD_VS_INSERTCOIN = 16
}; };
EMOVIEMODE FCEUMOV_Mode(); EMOVIEMODE FCEUMOV_Mode();
@ -112,10 +113,11 @@ public:
//small now to save space; we might need to support more commands later. //small now to save space; we might need to support more commands later.
//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; } bool command_power() { return (commands & MOVIECMD_POWER) != 0; }
bool command_fds_insert() { return (commands&MOVIECMD_FDS_INSERT)!=0; } bool command_fds_insert() { return (commands & MOVIECMD_FDS_INSERT) != 0; }
bool command_fds_select() { return (commands&MOVIECMD_FDS_SELECT)!=0; } bool command_fds_select() { return (commands & MOVIECMD_FDS_SELECT) != 0; }
bool command_vs_insertcoin() { return (commands & MOVIECMD_VS_INSERTCOIN) != 0; }
void toggleBit(int joy, int bit) void toggleBit(int joy, int bit)
{ {

View File

@ -100,22 +100,22 @@ inline uint64 uint64DecFromIstream(EMUFILE* is) { return templateIntegerDecFromI
template<typename T, int DIGITS, bool PAD> void putdec(EMUFILE* os, T dec) template<typename T, int DIGITS, bool PAD> void putdec(EMUFILE* os, T dec)
{ {
char temp[DIGITS]; char temp[DIGITS];
int ctr = 0; int ctr = 0; // at least one char will always be outputted
for(int i=0;i<DIGITS;i++) for (int i = 0; i < DIGITS; ++i)
{ {
int quot = dec/10; int remainder = dec % 10;
int rem = dec%10; temp[(DIGITS - 1) - i] = '0' + remainder;
temp[DIGITS-1-i] = '0' + rem; if (!PAD)
if(!PAD)
{ {
if(rem != 0) ctr = i; if (remainder != 0)
ctr = i;
} }
dec = quot; dec /= 10;
} }
if(!PAD) if (!PAD)
os->fwrite(temp+DIGITS-ctr-1,ctr+1); os->fwrite(temp + (DIGITS - 1) - ctr, ctr + 1);
else else
os->fwrite(temp,DIGITS); os->fwrite(temp, DIGITS);
} }
std::string mass_replace(const std::string &source, const std::string &victim, const std::string &replacement); std::string mass_replace(const std::string &source, const std::string &victim, const std::string &replacement);

Binary file not shown.