From 11e84829e4d18cd39be0d8522010fd33650cfd3a Mon Sep 17 00:00:00 2001 From: xhainingx Date: Thu, 18 Apr 2013 04:17:34 +0000 Subject: [PATCH] added --periodicsaves command line argument in sdl.cpp:DoFun(), it will save to the state specified by --savestate periodically. The interval is currently decided by a #define in sdl.h. I have it this way because you have to mod by the interval, and having this be a compile time value lets the compiler optimize out the modulo operation. Since this check will happen so frequently I thought this was better. However, if this is better suited to something configurable, I am willing to change it. --- trunk/src/drivers/sdl/sdl.cpp | 36 +++++++++++++++++++++++------------ trunk/src/drivers/sdl/sdl.h | 4 ++++ 2 files changed, 28 insertions(+), 12 deletions(-) diff --git a/trunk/src/drivers/sdl/sdl.cpp b/trunk/src/drivers/sdl/sdl.cpp index 01f9503d..54ae6f50 100644 --- a/trunk/src/drivers/sdl/sdl.cpp +++ b/trunk/src/drivers/sdl/sdl.cpp @@ -48,20 +48,21 @@ #include #include + extern double g_fpsScale; extern bool MaxSpeed; +int isloaded; + bool turbo = false; int closeFinishedMovie = 0; -int CloseGame(void); +int eoptions=0; static int inited = 0; -int eoptions=0; - static void DriverKill(void); static int DriverInitialize(FCEUGI *gi); uint64 FCEUD_GetTime(); @@ -129,7 +130,9 @@ static const char *DriverUsage= "--loadstate {0-9|>9} load from the given state when the game is loaded\n" "--savestate {0-9|>9} save to the given state when the game is closed\n" " to not save/load automatically provide a number\n" -" greater than 9\n"; +" greater than 9\n" +"--periodicsaves {0|1} enable automatic periodic saving. This will save to\n" +" the state passed to --savestate\n"; // these should be moved to the man file @@ -242,7 +245,7 @@ CloseGame() int state_to_save; g_config->getOption("SDL.AutoSaveState", &state_to_save); - if (state_to_save != INVALID_STATE){ + if (state_to_save < 10 && state_to_save >= 0){ FCEUI_SelectState(state_to_save, 0); FCEUI_SaveState(NULL); } @@ -263,7 +266,7 @@ CloseGame() void FCEUD_Update(uint8 *XBuf, int32 *Buffer, int Count); -static void DoFun(int frameskip) +static void DoFun(int frameskip, int periodic_saves) { uint8 *gfx; int32 *sound; @@ -272,9 +275,9 @@ static void DoFun(int frameskip) static int opause = 0; //TODO peroidic saves, working on it right now - //if (FCEUD_GetTime() % 5000 == 0){ - // FCEUI_SaveState(NULL); - //} + if (periodic_saves && FCEUD_GetTime() % PERIODIC_SAVE_INTERVAL < 30){ + FCEUI_SaveState(NULL); + } #ifdef FRAMESKIP fskipc = (fskipc + 1) % (frameskip + 1); #endif @@ -877,6 +880,15 @@ int main(int argc, char *argv[]) } } + int periodic_saves; + int save_state; + g_config->getOption("SDL.PeriodicSaves", &periodic_saves); + g_config->getOption("SDL.AutoSaveState", &save_state); + if(periodic_saves && save_state < 10 && save_state >= 0){ + FCEUI_SelectState(save_state, 0); + } else { + periodic_saves = 0; + } #ifdef _S9XLUA_H // load lua script if option passed @@ -903,7 +915,7 @@ int main(int argc, char *argv[]) while(1) { if(GameInfo) - DoFun(frameskip); + DoFun(frameskip, periodic_saves); else SDL_Delay(1); while(gtk_events_pending()) @@ -914,12 +926,12 @@ int main(int argc, char *argv[]) else { while(GameInfo) - DoFun(frameskip); + DoFun(frameskip, periodic_saves); } #else while(GameInfo) { - DoFun(frameskip); + DoFun(frameskip, periodic_saves); } #endif CloseGame(); diff --git a/trunk/src/drivers/sdl/sdl.h b/trunk/src/drivers/sdl/sdl.h index de96b781..0dc6b251 100644 --- a/trunk/src/drivers/sdl/sdl.h +++ b/trunk/src/drivers/sdl/sdl.h @@ -11,6 +11,10 @@ #include "dface.h" #include "input.h" +// I'm using this as a #define so the compiler can optimize the +// modulo operation +#define PERIODIC_SAVE_INTERVAL 5000 // milliseconds + const int INVALID_STATE = 99; extern int noGui;