diff --git a/src/drivers/win/config.cpp b/src/drivers/win/config.cpp index 0f284425..213078ca 100644 --- a/src/drivers/win/config.cpp +++ b/src/drivers/win/config.cpp @@ -45,7 +45,7 @@ extern CFGSTRUCT NetplayConfig[]; extern CFGSTRUCT InputConfig[]; extern CFGSTRUCT HotkeyConfig[]; extern int autoHoldKey, autoHoldClearKey; -extern int EnableAutosave; +extern int EnableAutosave, AutosaveQty, AutosaveFrequency; extern int AFon, AFoff, AutoFireOffset; extern int DesynchAutoFire; extern bool lagCounterDisplay; @@ -222,6 +222,8 @@ static CFGSTRUCT fceuconfig[] = { AC(MemWCollapsed), AC(BindToMain), AC(EnableAutosave), + AC(AutosaveQty), + AC(AutosaveFrequency), AC(frameAdvanceLagSkip), AC(debuggerAutoload), AC(allowUDLR), diff --git a/src/drivers/win/input.cpp b/src/drivers/win/input.cpp index a1b45c5b..46f4ba66 100644 --- a/src/drivers/win/input.cpp +++ b/src/drivers/win/input.cpp @@ -1098,6 +1098,10 @@ BOOL CALLBACK InputConCallB(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPara ); } + // Fix to deal with corrupted config. + if (InputType[port]>SI_COUNT || InputType[port]<0) + InputType[port]=SI_UNSET; + // Update the combobox selection according to the // currently selected input mode. SendDlgItemMessage(hwndDlg, @@ -1133,6 +1137,9 @@ BOOL CALLBACK InputConCallB(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPara ); } + if (InputType[FAMICOM_POSITION]>SI_COUNT || InputType[FAMICOM_POSITION]<0) + InputType[FAMICOM_POSITION]=SI_UNSET; + // Update the combobox selection according to the // currently selected input mode. SendDlgItemMessage( diff --git a/src/fceu.cpp b/src/fceu.cpp index ec4308ef..29a68c13 100644 --- a/src/fceu.cpp +++ b/src/fceu.cpp @@ -183,8 +183,10 @@ int frameAdvanceDelay; //indicates that the emulation core just frame advanced (consumed the frame advance state and paused) bool JustFrameAdvanced=false; -static int AutosaveStatus[4] = {0, 0, 0, 0}; //is it safe to load Auto-savestate +static int *AutosaveStatus; //is it safe to load Auto-savestate static int AutosaveIndex = 0; //which Auto-savestate we're on +int AutosaveQty = 4; // Number of Autosaves to store +int AutosaveFrequency = 256; // Number of frames between autosaves // Flag that indicates whether the Auto-save option is enabled or not int EnableAutosave = 0; @@ -406,8 +408,10 @@ FCEUGI *FCEUI_LoadGameVirtual(const char *name, int OverwriteVidMode) ResetGameLoaded(); - AutosaveStatus[0] = AutosaveStatus[1] = 0; - AutosaveStatus[2] = AutosaveStatus[3] = 0; + if (!AutosaveStatus) + AutosaveStatus = (int*)malloc(sizeof(int)*AutosaveQty); + for (AutosaveIndex=0; AutosaveIndex= AutosaveFrequency) { - AutosaveIndex = (AutosaveIndex + 1) % 4; + AutosaveCounter = 0; + AutosaveIndex = (AutosaveIndex + 1) % AutosaveQty; f = strdup(FCEU_MakeFName(FCEUMKF_AUTOSTATE,AutosaveIndex,0).c_str()); FCEUSS_Save(f); AutoSS = true; //Flag that an auto-savestate was made @@ -962,9 +966,9 @@ void FCEUI_Autosave(void) free(f); //Set pointer to previous available slot - if(AutosaveStatus[(AutosaveIndex + 3)%4] == 1) + if(AutosaveStatus[(AutosaveIndex + AutosaveQty-1)%AutosaveQty] == 1) { - AutosaveIndex = (AutosaveIndex + 3)%4; + AutosaveIndex = (AutosaveIndex + AutosaveQty-1)%AutosaveQty; } //Reset time to next Auto-save