SRAM preserved for power-on movies.

This commit is contained in:
grinvader
2005-03-27 10:38:27 +00:00
parent e38af682c8
commit e4b14bf130
3 changed files with 125 additions and 97 deletions

View File

@@ -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);

View File

@@ -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;

View File

@@ -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__