Small cleanup, new zmv format basic record/replay features now functionnal.
This commit is contained in:
@@ -78,7 +78,7 @@ EXTSYM oamaddrs,processmouse,resolutn,showvideo,snesmouse,starthdma
|
||||
EXTSYM switchtonmi,switchtovirq,totlines,updatetimer,SA1Swap,SA1DoIRQ
|
||||
EXTSYM JoyAOrig,JoyANow,JoyBOrig,JoyBNow,JoyCOrig,JoyCNow,JoyDOrig,JoyDNow
|
||||
EXTSYM JoyEOrig,JoyENow,chaton,chatstrL,chatRTL,chatstrR,SA1Message
|
||||
EXTSYM MultiTapStat,MovieCounter,idledetectspc,SA1Control,SA1Enable,SA1IRQEnable
|
||||
EXTSYM MultiTapStat,idledetectspc,SA1Control,SA1Enable,SA1IRQEnable
|
||||
EXTSYM SPC700read,SPC700write,numspcvblleft,spc700idle,SA1Status,SA1IRQExec
|
||||
EXTSYM ForceNewGfxOff,LethEnData,C4Pause,GUIQuit
|
||||
EXTSYM IRAM,SA1Ptr,SA1BWPtr
|
||||
|
||||
@@ -130,7 +130,6 @@ extern unsigned int versionNumber;
|
||||
extern unsigned int CRC32;
|
||||
extern unsigned int cur_zst_size;
|
||||
extern bool romispal;
|
||||
extern unsigned int PJoyAOrig, PJoyBOrig, PJoyCOrig, PJoyDOrig, PJoyEOrig;
|
||||
extern unsigned int JoyAOrig, JoyBOrig, JoyCOrig, JoyDOrig, JoyEOrig;
|
||||
|
||||
|
||||
@@ -535,23 +534,25 @@ void zmv_create(char *filename)
|
||||
#define RECORD_PAD(prev, cur, bit) \
|
||||
if (cur != prev) \
|
||||
{ \
|
||||
prev = cur; \
|
||||
prev = (cur >> 20); \
|
||||
flag |= BIT(bit); \
|
||||
\
|
||||
if (nibble & 1) \
|
||||
{ \
|
||||
press_buf[nibble/2] |= (unsigned char)(prev & 0x0F); \
|
||||
press_buf[nibble/2] |= ((unsigned char)(prev & 0x0F)) << 4; \
|
||||
nibble++; \
|
||||
press_buf[nibble/2] = (unsigned char)((prev >> 4) & 0xFF); \
|
||||
press_buf[nibble/2] = (unsigned char)(prev >> 4); \
|
||||
nibble += 2; \
|
||||
} \
|
||||
else \
|
||||
{ \
|
||||
press_buf[nibble/2] = (unsigned char)(prev & 0xFF); \
|
||||
nibble += 2; \
|
||||
press_buf[nibble/2] = ((unsigned char)((prev >> 8) & 0x0F)) << 4; \
|
||||
press_buf[nibble/2] = (unsigned char)(prev >> 8); \
|
||||
nibble++; \
|
||||
} \
|
||||
\
|
||||
prev <<= 20; \
|
||||
}
|
||||
|
||||
void zmv_record()
|
||||
@@ -562,11 +563,11 @@ void zmv_record()
|
||||
|
||||
zmv_vars.header.frames++;
|
||||
|
||||
RECORD_PAD(zmv_vars.last_joy_state.A, PJoyAOrig, 7);
|
||||
RECORD_PAD(zmv_vars.last_joy_state.B, PJoyBOrig, 6);
|
||||
RECORD_PAD(zmv_vars.last_joy_state.C, PJoyCOrig, 5);
|
||||
RECORD_PAD(zmv_vars.last_joy_state.D, PJoyDOrig, 4);
|
||||
RECORD_PAD(zmv_vars.last_joy_state.E, PJoyEOrig, 3);
|
||||
RECORD_PAD(zmv_vars.last_joy_state.A, JoyAOrig, 7);
|
||||
RECORD_PAD(zmv_vars.last_joy_state.B, JoyBOrig, 6);
|
||||
RECORD_PAD(zmv_vars.last_joy_state.C, JoyCOrig, 5);
|
||||
RECORD_PAD(zmv_vars.last_joy_state.D, JoyDOrig, 4);
|
||||
RECORD_PAD(zmv_vars.last_joy_state.E, JoyEOrig, 3);
|
||||
|
||||
zmv_vars.write_buffer[zmv_vars.write_buffer_loc] = flag;
|
||||
zmv_vars.write_buffer_loc++;
|
||||
@@ -643,7 +644,6 @@ struct
|
||||
unsigned int frames_replayed;
|
||||
} zmv_open_vars; //Additional vars for open/replay of a ZMV
|
||||
|
||||
|
||||
bool zmv_open(char *filename)
|
||||
{
|
||||
memset(&zmv_vars, 0, sizeof(zmv_vars));
|
||||
@@ -651,7 +651,7 @@ bool zmv_open(char *filename)
|
||||
|
||||
zmv_vars.fp = fopen(filename,"r+b");
|
||||
if (zmv_vars.fp && zmv_header_read(&zmv_vars.header, zmv_vars.fp) &&
|
||||
!strncpy(zmv_vars.header.magic, "ZMV", 3))
|
||||
!strncmp(zmv_vars.header.magic, "ZMV", 3))
|
||||
{
|
||||
size_t input_start_pos;
|
||||
unsigned short i;
|
||||
@@ -693,9 +693,10 @@ bool zmv_open(char *filename)
|
||||
{ \
|
||||
if (mid_byte) \
|
||||
{ \
|
||||
cur = byte & 0x0F; \
|
||||
cur = (byte & 0xF0) >> 4; \
|
||||
fread(&byte, 1, 1, zmv_vars.fp); \
|
||||
cur |= ((unsigned short)byte) << 4; \
|
||||
cur |= ((unsigned long)byte) << 4; \
|
||||
cur <<= 20; \
|
||||
mid_byte = false; \
|
||||
} \
|
||||
else \
|
||||
@@ -703,18 +704,19 @@ bool zmv_open(char *filename)
|
||||
fread(&byte, 1, 1, zmv_vars.fp); \
|
||||
cur = byte; \
|
||||
fread(&byte, 1, 1, zmv_vars.fp); \
|
||||
cur |= ((unsigned short)(byte & 0xF0)) << 4; \
|
||||
cur |= ((unsigned long)(byte & 0xF)) << 8; \
|
||||
cur <<= 20; \
|
||||
mid_byte = true; \
|
||||
} \
|
||||
}
|
||||
|
||||
void zmv_replay()
|
||||
bool zmv_replay()
|
||||
{
|
||||
if (zmv_open_vars.frames_replayed < zmv_vars.header.frames)
|
||||
{
|
||||
unsigned char flag = 0;
|
||||
bool mid_byte = false;
|
||||
unsigned char byte;
|
||||
bool mid_byte = false;
|
||||
|
||||
fread(&flag, 1, 1, zmv_vars.fp);
|
||||
|
||||
@@ -724,14 +726,16 @@ void zmv_replay()
|
||||
fread(&flag, 1, 1, zmv_vars.fp);
|
||||
}
|
||||
|
||||
REPLAY_PAD(PJoyAOrig, 7);
|
||||
REPLAY_PAD(PJoyBOrig, 6);
|
||||
REPLAY_PAD(PJoyCOrig, 5);
|
||||
REPLAY_PAD(PJoyDOrig, 4);
|
||||
REPLAY_PAD(PJoyEOrig, 3);
|
||||
REPLAY_PAD(JoyAOrig, 7);
|
||||
REPLAY_PAD(JoyBOrig, 6);
|
||||
REPLAY_PAD(JoyCOrig, 5);
|
||||
REPLAY_PAD(JoyDOrig, 4);
|
||||
REPLAY_PAD(JoyEOrig, 3);
|
||||
|
||||
zmv_open_vars.frames_replayed++;
|
||||
return(true);
|
||||
}
|
||||
return(false);
|
||||
}
|
||||
|
||||
void zmv_next_chapter()
|
||||
@@ -856,43 +860,15 @@ extern unsigned int MsgCount, MessageOn;
|
||||
extern unsigned char MovieTemp, MovieProcessing, *Msgptr;
|
||||
char *txtmovieended = "MOVIE FINISHED.";
|
||||
|
||||
static FILE *movfhandle;
|
||||
|
||||
void Replay()
|
||||
{
|
||||
if (fread(&MovieTemp, 1, 1, movfhandle))
|
||||
if (zmv_replay())
|
||||
{
|
||||
if (MovieTemp < 2) // 1 or 0 are correct values
|
||||
char *sub;
|
||||
if ((sub = MovieSub_GetData()))
|
||||
{
|
||||
char *sub;
|
||||
|
||||
if (MovieTemp == 0) // 0 means the input has changed
|
||||
{
|
||||
fread(&PJoyAOrig, 1, 4, movfhandle);
|
||||
fread(&PJoyBOrig, 1, 4, movfhandle);
|
||||
fread(&PJoyCOrig, 1, 4, movfhandle);
|
||||
fread(&PJoyDOrig, 1, 4, movfhandle);
|
||||
fread(&PJoyEOrig, 1, 4, movfhandle);
|
||||
}
|
||||
|
||||
JoyAOrig = PJoyAOrig;
|
||||
JoyBOrig = PJoyBOrig;
|
||||
JoyCOrig = PJoyCOrig;
|
||||
JoyDOrig = PJoyDOrig;
|
||||
JoyEOrig = PJoyEOrig;
|
||||
|
||||
if ((sub = MovieSub_GetData()))
|
||||
{
|
||||
Msgptr = sub;
|
||||
MessageOn = MovieSub_GetDuration();
|
||||
}
|
||||
}
|
||||
else // anything else is bad - the file isn't a movie.
|
||||
{
|
||||
MovieProcessing = 0;
|
||||
|
||||
fclose(movfhandle);
|
||||
MovieSub_Close();
|
||||
Msgptr = sub;
|
||||
MessageOn = MovieSub_GetDuration();
|
||||
}
|
||||
}
|
||||
else
|
||||
@@ -901,7 +877,7 @@ void Replay()
|
||||
MessageOn = MsgCount;
|
||||
MovieProcessing = 0;
|
||||
|
||||
fclose(movfhandle);
|
||||
zmv_replay_finished();
|
||||
MovieSub_Close();
|
||||
}
|
||||
}
|
||||
@@ -934,7 +910,7 @@ void MovieStop()
|
||||
{
|
||||
switch (MovieProcessing)
|
||||
{
|
||||
case 1: fclose(movfhandle); break;
|
||||
case 1: zmv_replay_finished(); break;
|
||||
case 2: zmv_record_finish(); break;
|
||||
}
|
||||
MovieProcessing = 0;
|
||||
@@ -956,76 +932,29 @@ void MoviePlay()
|
||||
|
||||
GUICBHold &= 0xFFFFFF00;
|
||||
|
||||
if (CNetType != 20)
|
||||
if (!MovieProcessing)
|
||||
{
|
||||
MovieCounter= 0;
|
||||
GUIQuit = 2;
|
||||
memcpy (FileExt, &fnamest[statefileloc-3], 4);
|
||||
memcpy (&fnamest[statefileloc-3], ".zmv", 4);
|
||||
fnamest[statefileloc] = CMovieExt;
|
||||
|
||||
if (!MovieProcessing)
|
||||
SRAMChdir();
|
||||
|
||||
if (zmv_open(fnamest+1))
|
||||
{
|
||||
GUIQuit = 2;
|
||||
memcpy (FileExt, &fnamest[statefileloc-3], 4);
|
||||
memcpy (&fnamest[statefileloc-3], ".zmv", 4);
|
||||
fnamest[statefileloc] = CMovieExt;
|
||||
|
||||
SRAMChdir();
|
||||
loadstate2();
|
||||
|
||||
if ((movfhandle = fopen(fnamest+1,"rb")) != NULL)
|
||||
{
|
||||
memcpy(&fnamest[statefileloc-3], ".sub", 4);
|
||||
if (isdigit(CMovieExt)) { fnamest[statefileloc] = CMovieExt; }
|
||||
MovieSub_Open(fnamest+1);
|
||||
|
||||
fseek(movfhandle, Totalbyteloaded, SEEK_SET);
|
||||
fread(RecData, 1, 16, movfhandle);
|
||||
printf("Movie made with version: %d\n", RecData[1]);
|
||||
|
||||
if (RecData[2] == 1)
|
||||
{
|
||||
timer2upd = bytemerger(RecData[6], RecData[5], RecData[4], RecData[3]);
|
||||
curexecstate = bytemerger(RecData[10], RecData[9], RecData[9], RecData[7]);
|
||||
nmiprevaddrl = 0;
|
||||
nmiprevaddrh = 0;
|
||||
nmirept = 0;
|
||||
nmiprevline = 224;
|
||||
nmistatus = 0;
|
||||
spcnumread = 0;
|
||||
spchalted = 0xFFFFFFFF;
|
||||
NextLineCache = 0;
|
||||
}
|
||||
|
||||
if (soundon == RecData[0])
|
||||
{
|
||||
if (ramsize) { fread(sram, 1, ramsize, movfhandle); }
|
||||
|
||||
MovieProcessing = 1;
|
||||
PJoyAOrig = 0;
|
||||
PJoyBOrig = 0;
|
||||
PJoyCOrig = 0;
|
||||
PJoyDOrig = 0;
|
||||
PJoyEOrig = 0;
|
||||
sramsavedis = 1;
|
||||
UseRemoteSRAMData = 0;
|
||||
DSPMem[0x08] = 0;
|
||||
DSPMem[0x18] = 0;
|
||||
DSPMem[0x28] = 0;
|
||||
DSPMem[0x38] = 0;
|
||||
DSPMem[0x48] = 0;
|
||||
DSPMem[0x58] = 0;
|
||||
DSPMem[0x68] = 0;
|
||||
DSPMem[0x78] = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
Msgptr = (!soundon) ? UnableMovie3 : UnableMovie2;
|
||||
MessageOn = MsgCount;
|
||||
fclose(movfhandle);
|
||||
}
|
||||
}
|
||||
|
||||
memcpy (&fnamest[statefileloc-3], FileExt, 4);
|
||||
asm_call(ChangetoLOADdir);
|
||||
MovieProcessing = 1;
|
||||
memcpy(&fnamest[statefileloc-3], ".sub", 4);
|
||||
if (isdigit(CMovieExt)) { fnamest[statefileloc] = CMovieExt; }
|
||||
MovieSub_Open(fnamest+1);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
memcpy (&fnamest[statefileloc-3], FileExt, 4);
|
||||
asm_call(ChangetoLOADdir);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user