diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/Config.cpp | 4 | ||||
-rw-r--r-- | src/Config.h | 2 | ||||
-rw-r--r-- | src/NDS.cpp | 6 | ||||
-rw-r--r-- | src/NDS.h | 1 | ||||
-rw-r--r-- | src/NDSCart.cpp | 12 | ||||
-rw-r--r-- | src/NDSCart.h | 2 | ||||
-rw-r--r-- | src/libui_sdl/main.cpp | 60 |
7 files changed, 79 insertions, 8 deletions
diff --git a/src/Config.cpp b/src/Config.cpp index d98ffd3..035c304 100644 --- a/src/Config.cpp +++ b/src/Config.cpp @@ -53,6 +53,8 @@ int Threaded3D; int SocketBindAnyAddr; +int SavestateRelocSRAM; + typedef struct { char Name[16]; @@ -107,6 +109,8 @@ ConfigEntry ConfigFile[] = {"SockBindAnyAddr", 0, &SocketBindAnyAddr, 0, NULL, 0}, + {"SavStaRelocSRAM", 0, &SavestateRelocSRAM, 1, NULL, 0}, + {"", -1, NULL, 0, NULL, 0} }; diff --git a/src/Config.h b/src/Config.h index 08e4e86..d7b0858 100644 --- a/src/Config.h +++ b/src/Config.h @@ -46,6 +46,8 @@ extern int Threaded3D; extern int SocketBindAnyAddr; +extern int SavestateRelocSRAM; + } #endif // CONFIG_H diff --git a/src/NDS.cpp b/src/NDS.cpp index 8528307..e0086c8 100644 --- a/src/NDS.cpp +++ b/src/NDS.cpp @@ -562,6 +562,12 @@ void LoadBIOS() Running = true; } +void RelocateSave(const char* path, bool write) +{ + printf("SRAM: relocating to %s (write=%s)\n", path, write?"true":"false"); + NDSCart::RelocateSave(path, write); +} + void CalcIterationCycles() { @@ -114,6 +114,7 @@ bool DoSavestate(Savestate* file); bool LoadROM(const char* path, const char* sram, bool direct); void LoadBIOS(); void SetupDirectBoot(); +void RelocateSave(const char* path, bool write); u32 RunFrame(); diff --git a/src/NDSCart.cpp b/src/NDSCart.cpp index 44d6ca9..03dfe4c 100644 --- a/src/NDSCart.cpp +++ b/src/NDSCart.cpp @@ -196,8 +196,14 @@ void LoadSave(const char* path) StatusReg = 0x00; } -void RelocateSave(const char* path) +void RelocateSave(const char* path, bool write) { + if (!write) + { + LoadSave(path); // lazy + return; + } + strncpy(SRAMPath, path, 1023); SRAMPath[1023] = '\0'; @@ -1143,10 +1149,10 @@ bool LoadROM(const char* path, const char* sram, bool direct) return true; } -void RelocateSave(const char* path) +void RelocateSave(const char* path, bool write) { // herp derp - NDSCart_SRAM::RelocateSave(path); + NDSCart_SRAM::RelocateSave(path, write); } void ReadROM(u32 addr, u32 len, u32 offset) diff --git a/src/NDSCart.h b/src/NDSCart.h index ee6ebdb..ac8f8fe 100644 --- a/src/NDSCart.h +++ b/src/NDSCart.h @@ -45,7 +45,7 @@ void Reset(); void DoSavestate(Savestate* file); bool LoadROM(const char* path, const char* sram, bool direct); -void RelocateSave(const char* path); +void RelocateSave(const char* path, bool write); void WriteROMCnt(u32 val); u32 ReadROMData(); diff --git a/src/libui_sdl/main.cpp b/src/libui_sdl/main.cpp index bea9685..149e356 100644 --- a/src/libui_sdl/main.cpp +++ b/src/libui_sdl/main.cpp @@ -65,6 +65,8 @@ uiMenuItem* MenuItem_Pause; uiMenuItem* MenuItem_Reset; uiMenuItem* MenuItem_Stop; +uiMenuItem* MenuItem_SavestateSRAMReloc; + uiMenuItem* MenuItem_ScreenRot[4]; uiMenuItem* MenuItem_ScreenGap[6]; uiMenuItem* MenuItem_ScreenLayout[3]; @@ -818,7 +820,10 @@ void TryLoadROM(char* file, int prevstatus) SetupSRAMPath(); if (NDS::LoadROM(ROMPath, SRAMPath, Config::DirectBoot)) + { + strncpy(PrevSRAMPath, SRAMPath, 1024); // safety Run(); + } else { uiMsgBoxError(MainWindow, @@ -846,11 +851,10 @@ void GetSavestateName(int slot, char* filename, int len) } else { - int len = strlen(ROMPath); - pos = len; + int l = strlen(ROMPath); + pos = l; while (ROMPath[pos] != '.' && pos > 0) pos--; - if (pos == 0) pos = len; - else pos++; + if (pos == 0) pos = l; // avoid buffer overflow. shoddy if (pos > len-5) pos = len-5; @@ -913,6 +917,18 @@ void LoadState(int slot) NDS::DoSavestate(state); delete state; + if (Config::SavestateRelocSRAM && ROMPath[0]!='\0') + { + strncpy(PrevSRAMPath, SRAMPath, 1024); + + strncpy(SRAMPath, filename, 1019); + int len = strlen(SRAMPath); + strcpy(&SRAMPath[len], ".sav"); + SRAMPath[len+4] = '\0'; + + NDS::RelocateSave(SRAMPath, false); + } + EmuRunning = prevstatus; } @@ -956,6 +972,16 @@ void SaveState(int slot) if (slot > 0) uiMenuItemEnable(MenuItem_LoadStateSlot[slot-1]); + + if (Config::SavestateRelocSRAM && ROMPath[0]!='\0') + { + strncpy(SRAMPath, filename, 1019); + int len = strlen(SRAMPath); + strcpy(&SRAMPath[len], ".sav"); + SRAMPath[len+4] = '\0'; + + NDS::RelocateSave(SRAMPath, true); + } } EmuRunning = prevstatus; @@ -974,6 +1000,12 @@ void UndoStateLoad() NDS::DoSavestate(backup); delete backup; + if (ROMPath[0]!='\0') + { + strncpy(SRAMPath, PrevSRAMPath, 1024); + NDS::RelocateSave(SRAMPath, false); + } + EmuRunning = prevstatus; } @@ -1096,7 +1128,10 @@ void OnReset(uiMenuItem* item, uiWindow* window, void* blarg) if (ROMPath[0] == '\0') NDS::LoadBIOS(); else + { + SetupSRAMPath(); NDS::LoadROM(ROMPath, SRAMPath, Config::DirectBoot); + } Run(); } @@ -1119,6 +1154,12 @@ void OnOpenInputConfig(uiMenuItem* item, uiWindow* window, void* blarg) } +void OnSetSavestateSRAMReloc(uiMenuItem* item, uiWindow* window, void* param) +{ + Config::SavestateRelocSRAM = uiMenuItemChecked(item) ? 1:0; +} + + void EnsureProperMinSize() { bool isHori = (ScreenRotation == 1 || ScreenRotation == 3); @@ -1368,6 +1409,15 @@ int main(int argc, char** argv) uiMenuItemOnClicked(menuitem, OnOpenInputConfig, NULL); uiMenuAppendSeparator(menu); { + uiMenu* submenu = uiNewMenu("Savestate settings"); + + MenuItem_SavestateSRAMReloc = uiMenuAppendCheckItem(submenu, "Separate savefiles"); + uiMenuItemOnClicked(MenuItem_SavestateSRAMReloc, OnSetSavestateSRAMReloc, NULL); + + uiMenuAppendSubmenu(menu, submenu); + } + uiMenuAppendSeparator(menu); + { uiMenu* submenu = uiNewMenu("Screen rotation"); for (int i = 0; i < 4; i++) @@ -1471,6 +1521,8 @@ int main(int argc, char** argv) SANITIZE(ScreenSizing, 0, 3); #undef SANITIZE + uiMenuItemSetChecked(MenuItem_SavestateSRAMReloc, Config::SavestateRelocSRAM?1:0); + uiMenuItemSetChecked(MenuItem_ScreenRot[ScreenRotation], 1); uiMenuItemSetChecked(MenuItem_ScreenLayout[ScreenLayout], 1); uiMenuItemSetChecked(MenuItem_ScreenSizing[ScreenSizing], 1); |