SRAM preserved for power-on movies.
This commit is contained in:
@@ -1807,14 +1807,31 @@ unsigned int showinfogui()
|
|||||||
extern unsigned int nmiprevaddrl, nmiprevaddrh, nmirept, nmiprevline, nmistatus;
|
extern unsigned int nmiprevaddrl, nmiprevaddrh, nmirept, nmiprevline, nmistatus;
|
||||||
extern unsigned int spcnumread, spchalted;
|
extern unsigned int spcnumread, spchalted;
|
||||||
extern unsigned char NextLineCache, sramsavedis, sndrot, regsbackup[3019];
|
extern unsigned char NextLineCache, sramsavedis, sndrot, regsbackup[3019];
|
||||||
extern unsigned char yesoutofmemory;
|
extern unsigned char yesoutofmemory, fnames[512];
|
||||||
|
|
||||||
void SetupROM();
|
void SetupROM();
|
||||||
void initsnes();
|
void initsnes();
|
||||||
void outofmemfix();
|
void outofmemfix();
|
||||||
void GUIDoReset();
|
void GUIDoReset();
|
||||||
|
|
||||||
void powercycle()
|
bool loadSRAM(char *sramname)
|
||||||
|
{
|
||||||
|
FILE *sramfp;
|
||||||
|
int sramsize;
|
||||||
|
|
||||||
|
if ((sramfp = fopen(sramname, "rb")))
|
||||||
|
{
|
||||||
|
fseek(sramfp, 0, SEEK_END);
|
||||||
|
sramsize = ftell(sramfp);
|
||||||
|
rewind(sramfp);
|
||||||
|
if (sramsize) { fread(sram, 1, sramsize, sramfp); }
|
||||||
|
fclose(sramfp);
|
||||||
|
return (true);
|
||||||
|
}
|
||||||
|
else { return(false); }
|
||||||
|
}
|
||||||
|
|
||||||
|
void powercycle(bool sramload)
|
||||||
{
|
{
|
||||||
memset(sram, 0xFF, 8192*4);
|
memset(sram, 0xFF, 8192*4);
|
||||||
clearSPCRAM();
|
clearSPCRAM();
|
||||||
@@ -1829,6 +1846,7 @@ void powercycle()
|
|||||||
NextLineCache = 0;
|
NextLineCache = 0;
|
||||||
curexecstate = 1;
|
curexecstate = 1;
|
||||||
|
|
||||||
|
if (sramload) { loadSRAM(fnames+1); }
|
||||||
asm_call(SetupROM);
|
asm_call(SetupROM);
|
||||||
asm_call(initsnes);
|
asm_call(initsnes);
|
||||||
|
|
||||||
|
|||||||
@@ -49,13 +49,15 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|||||||
extern unsigned int versionNumber, CRC32, cur_zst_size;
|
extern unsigned int versionNumber, CRC32, cur_zst_size;
|
||||||
extern unsigned int JoyAOrig, JoyBOrig, JoyCOrig, JoyDOrig, JoyEOrig;
|
extern unsigned int JoyAOrig, JoyBOrig, JoyCOrig, JoyDOrig, JoyEOrig;
|
||||||
extern unsigned int MsgCount, MessageOn;
|
extern unsigned int MsgCount, MessageOn;
|
||||||
extern unsigned char MovieStartMethod, GUIReset, ReturnFromSPCStall;
|
extern unsigned char MovieStartMethod, GUIReset, ReturnFromSPCStall, GUIQuit;
|
||||||
extern unsigned char MovieProcessing, *Msgptr;
|
extern unsigned char MovieProcessing, *Msgptr, fnamest[512];
|
||||||
|
extern unsigned char CMovieExt;
|
||||||
extern bool romispal;
|
extern bool romispal;
|
||||||
bool firstloop;
|
bool firstloop;
|
||||||
|
|
||||||
void GUIDoReset();
|
void GUIDoReset();
|
||||||
void powercycle();
|
void powercycle(bool);
|
||||||
|
void zst_sram_load(FILE *);
|
||||||
void zst_save(FILE *, bool);
|
void zst_save(FILE *, bool);
|
||||||
bool zst_load(FILE *);
|
bool zst_load(FILE *);
|
||||||
|
|
||||||
@@ -556,7 +558,7 @@ static void zmv_create(char *filename)
|
|||||||
case zmv_sm_zst:
|
case zmv_sm_zst:
|
||||||
break;
|
break;
|
||||||
case zmv_sm_power:
|
case zmv_sm_power:
|
||||||
powercycle();
|
powercycle(true);
|
||||||
break;
|
break;
|
||||||
case zmv_sm_reset:
|
case zmv_sm_reset:
|
||||||
GUIReset = 1;
|
GUIReset = 1;
|
||||||
@@ -712,6 +714,8 @@ static bool zmv_open(char *filename)
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
MovieStartMethod = (unsigned char)zmv_vars.header.zmv_flag.start_method;
|
||||||
|
|
||||||
if (zmv_vars.header.zsnes_version != (versionNumber & 0xFFFF))
|
if (zmv_vars.header.zsnes_version != (versionNumber & 0xFFFF))
|
||||||
{
|
{
|
||||||
zst_load(zmv_vars.fp);
|
zst_load(zmv_vars.fp);
|
||||||
@@ -725,24 +729,23 @@ static bool zmv_open(char *filename)
|
|||||||
zst_load(zmv_vars.fp);
|
zst_load(zmv_vars.fp);
|
||||||
break;
|
break;
|
||||||
case zmv_sm_power:
|
case zmv_sm_power:
|
||||||
powercycle();
|
powercycle(false);
|
||||||
fseek(zmv_vars.fp, zmv_vars.header.zst_size, SEEK_CUR);
|
zst_sram_load(zmv_vars.fp);
|
||||||
break;
|
break;
|
||||||
case zmv_sm_reset:
|
case zmv_sm_reset:
|
||||||
GUIReset = 1;
|
GUIReset = 1;
|
||||||
asm_call(GUIDoReset);
|
asm_call(GUIDoReset);
|
||||||
ReturnFromSPCStall = 0;
|
ReturnFromSPCStall = 0;
|
||||||
fseek(zmv_vars.fp, zmv_vars.header.zst_size, SEEK_CUR);
|
zst_sram_load(zmv_vars.fp);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
zmv_open_vars.input_start_pos = ftell(zmv_vars.fp);
|
||||||
Msgptr = "MOVIE STARTED.";
|
Msgptr = "MOVIE STARTED.";
|
||||||
}
|
}
|
||||||
|
|
||||||
firstloop = true;
|
firstloop = true;
|
||||||
|
|
||||||
zmv_open_vars.input_start_pos = ftell(zmv_vars.fp);
|
|
||||||
|
|
||||||
fseek(zmv_vars.fp, -(EXT_CHAP_COUNT_END_DIST), SEEK_END);
|
fseek(zmv_vars.fp, -(EXT_CHAP_COUNT_END_DIST), SEEK_END);
|
||||||
zmv_open_vars.external_chapter_count = fread2(zmv_vars.fp);
|
zmv_open_vars.external_chapter_count = fread2(zmv_vars.fp);
|
||||||
|
|
||||||
@@ -1314,6 +1317,7 @@ static void MovieSub_Close()
|
|||||||
{
|
{
|
||||||
if (MovieSub.fp)
|
if (MovieSub.fp)
|
||||||
{
|
{
|
||||||
|
MessageOn = 0;
|
||||||
fclose(MovieSub.fp);
|
fclose(MovieSub.fp);
|
||||||
MovieSub.fp = 0;
|
MovieSub.fp = 0;
|
||||||
}
|
}
|
||||||
@@ -1390,6 +1394,14 @@ MovieProcessing
|
|||||||
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
extern bool SRAMState, SloMo50;
|
||||||
|
bool PrevSRAMState;
|
||||||
|
extern unsigned int statefileloc;
|
||||||
|
extern unsigned char ComboCounter, MovieRecordWinVal, RewindStates;
|
||||||
|
char MovieFrameStr[10];
|
||||||
|
void SRAMChdir();
|
||||||
|
void ChangetoLOADdir();
|
||||||
|
|
||||||
void MovieInsertChapter()
|
void MovieInsertChapter()
|
||||||
{
|
{
|
||||||
switch (MovieProcessing)
|
switch (MovieProcessing)
|
||||||
@@ -1452,9 +1464,6 @@ void MovieSeekBehind()
|
|||||||
MessageOn = MsgCount;
|
MessageOn = MsgCount;
|
||||||
}
|
}
|
||||||
|
|
||||||
extern bool SRAMState;
|
|
||||||
bool PrevSRAMState;
|
|
||||||
|
|
||||||
void Replay()
|
void Replay()
|
||||||
{
|
{
|
||||||
if (zmv_replay())
|
if (zmv_replay())
|
||||||
@@ -1486,19 +1495,12 @@ void Replay()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
extern bool SloMo50;
|
|
||||||
extern unsigned char ComboCounter;
|
|
||||||
|
|
||||||
void ProcessMovies()
|
void ProcessMovies()
|
||||||
{
|
{
|
||||||
if (MovieProcessing == 2) { zmv_record(SloMo50 ? true : false, ComboCounter); }
|
if (MovieProcessing == 2) { zmv_record(SloMo50 ? true : false, ComboCounter); }
|
||||||
else { Replay(); }
|
else { Replay(); }
|
||||||
}
|
}
|
||||||
|
|
||||||
// The following will maybe end up in guic.c once we get it started.
|
|
||||||
// It came from guiwindp.inc and gui.asm, after all
|
|
||||||
extern unsigned char MovieRecordWinVal;
|
|
||||||
|
|
||||||
void SkipMovie()
|
void SkipMovie()
|
||||||
{
|
{
|
||||||
MovieRecordWinVal = 0;
|
MovieRecordWinVal = 0;
|
||||||
@@ -1513,6 +1515,7 @@ void MovieStop()
|
|||||||
case 1:
|
case 1:
|
||||||
zmv_replay_finished();
|
zmv_replay_finished();
|
||||||
MovieSub_Close();
|
MovieSub_Close();
|
||||||
|
SRAMState = PrevSRAMState;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 2:
|
case 2:
|
||||||
@@ -1527,27 +1530,19 @@ void MovieStop()
|
|||||||
|
|
||||||
zmv_dealloc_rewind_buffer();
|
zmv_dealloc_rewind_buffer();
|
||||||
MovieProcessing = 0;
|
MovieProcessing = 0;
|
||||||
SRAMState = PrevSRAMState;
|
|
||||||
}
|
}
|
||||||
else { firstloop = false; }
|
else { firstloop = false; }
|
||||||
}
|
}
|
||||||
|
|
||||||
extern unsigned int statefileloc;
|
|
||||||
extern unsigned char GUIQuit, fnamest[512], CMovieExt;
|
|
||||||
extern unsigned char RewindStates;
|
|
||||||
|
|
||||||
void SRAMChdir();
|
|
||||||
void ChangetoLOADdir();
|
|
||||||
|
|
||||||
void MoviePlay()
|
void MoviePlay()
|
||||||
{
|
{
|
||||||
unsigned char FileExt[4];
|
unsigned char FileExt[4];
|
||||||
|
|
||||||
if (!MovieProcessing)
|
|
||||||
{
|
|
||||||
PrevSRAMState = SRAMState;
|
PrevSRAMState = SRAMState;
|
||||||
SRAMState = true;
|
SRAMState = true;
|
||||||
|
|
||||||
|
if (!MovieProcessing)
|
||||||
|
{
|
||||||
GUIQuit = 2;
|
GUIQuit = 2;
|
||||||
memcpy(FileExt, &fnamest[statefileloc-3], 4);
|
memcpy(FileExt, &fnamest[statefileloc-3], 4);
|
||||||
memcpy(&fnamest[statefileloc-3], ".zmv", 4);
|
memcpy(&fnamest[statefileloc-3], ".zmv", 4);
|
||||||
@@ -1602,9 +1597,6 @@ void MovieRecord()
|
|||||||
|
|
||||||
if (!(tempfhandle = fopen(fnamest+1,"rb")))
|
if (!(tempfhandle = fopen(fnamest+1,"rb")))
|
||||||
{
|
{
|
||||||
PrevSRAMState = SRAMState;
|
|
||||||
SRAMState = true;
|
|
||||||
|
|
||||||
zmv_create(fnamest+1);
|
zmv_create(fnamest+1);
|
||||||
zmv_alloc_rewind_buffer(RewindStates);
|
zmv_alloc_rewind_buffer(RewindStates);
|
||||||
MovieProcessing = 2;
|
MovieProcessing = 2;
|
||||||
@@ -1618,12 +1610,11 @@ void MovieRecord()
|
|||||||
}
|
}
|
||||||
|
|
||||||
asm_call(ChangetoLOADdir);
|
asm_call(ChangetoLOADdir);
|
||||||
|
|
||||||
memcpy (&fnamest[statefileloc-3], FileExt, 4);
|
memcpy (&fnamest[statefileloc-3], FileExt, 4);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
char MovieFrameStr[10];
|
|
||||||
|
|
||||||
void GetMovieFrameStr()
|
void GetMovieFrameStr()
|
||||||
{
|
{
|
||||||
*MovieFrameStr = 0;
|
*MovieFrameStr = 0;
|
||||||
|
|||||||
@@ -973,6 +973,25 @@ bool zst_load(FILE *fp)
|
|||||||
return(true);
|
return(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void zst_sram_load(FILE *fp)
|
||||||
|
{
|
||||||
|
fseek(fp, sizeof(zst_header_cur)-1 + PH65816regsize + 199635, SEEK_CUR);
|
||||||
|
if (spcon) { fseek(fp, PHspcsave + PHdspsave + sizeof(DSPMem), SEEK_CUR); }
|
||||||
|
if (C4Enable) { fseek(fp, 8192, SEEK_CUR); }
|
||||||
|
if (SFXEnable) { fseek(fp, PHnum2writesfxreg + 131072, SEEK_CUR); }
|
||||||
|
if (SA1Enable)
|
||||||
|
{
|
||||||
|
fseek(fp, PHnum2writesa1reg, SEEK_CUR);
|
||||||
|
fread(SA1RAMArea, 1, 131072, fp); // SA-1 sram
|
||||||
|
fseek(fp, 15, SEEK_CUR);
|
||||||
|
}
|
||||||
|
if (DSP1Type) { fseek(fp, 2874, SEEK_CUR); }
|
||||||
|
if (SETAEnable) { fread(setaramdata, 1, 4096, fp); } // SETA sram
|
||||||
|
if (SPC7110Enable) { fseek(fp, PHnum2writespc7110reg + 65536, SEEK_CUR); }
|
||||||
|
fseek(fp, 227, SEEK_CUR);
|
||||||
|
if (ramsize) { fread(sram, 1, ramsize, fp); } // normal sram
|
||||||
|
}
|
||||||
|
|
||||||
void stateloader (unsigned char *statename, unsigned char keycheck, unsigned char xfercheck)
|
void stateloader (unsigned char *statename, unsigned char keycheck, unsigned char xfercheck)
|
||||||
{
|
{
|
||||||
#ifdef __LINUX__
|
#ifdef __LINUX__
|
||||||
|
|||||||
Reference in New Issue
Block a user