aboutsummaryrefslogtreecommitdiff
path: root/src/NDS.cpp
diff options
context:
space:
mode:
authorJesse Talavera-Greenberg <jesse@jesse.tg>2023-06-12 17:56:09 -0400
committerGitHub <noreply@github.com>2023-06-12 23:56:09 +0200
commit391ad8c95e9b942ff39705f2c3cd5359aef633b3 (patch)
tree7718e0b201ebddf66ec1ca74f0866fe9adbeb32c /src/NDS.cpp
parentca7fb4f55e8fdad53993ba279b073f97f453c13c (diff)
Implement in-memory savestates (#1693)
* Refactor Savestate::Var{8,16,32,64} - They now delegate to VarArray - They're declared in the class header so they're likely to be inlined * First crack at refactoring Savestate to work in-memory - Well, third, but who's counting? * Implement Savestate::Finish * Remove the VersionMajor and VersionMinor fields - Instead, pull their values directly from the savestate buffer * Mark a new constructor as explicit * Rename Reset to Rewind * Fix a linebreak * Implement Savestate::Rewind * Add ROMManager::ClearBackupState * Refactor ROMManager to use the refactored Savestate * Capitalize "Least" - It was driving me nuts * Add a log call * Increase default Savestate buffer length to 32MB * Use C-style file I/O instead of C++-style - Dumping bytes to a file with C++'s standard library is a MONSTROUS PAIN IN THE ASS * Quote the savestate's file path for clarity * Write the savestate's length into the header * Add some extra logging calls * Fix section-loading * Remove the deprecated Savestate constructor * Convert a char* to a u32 with memcpy, not a cast * Fix section-handling in loads * Include <cstring> in Savestate.h - This was causing a build error on Linux
Diffstat (limited to 'src/NDS.cpp')
-rw-r--r--src/NDS.cpp11
1 files changed, 10 insertions, 1 deletions
diff --git a/src/NDS.cpp b/src/NDS.cpp
index b5c00db..e37a194 100644
--- a/src/NDS.cpp
+++ b/src/NDS.cpp
@@ -815,7 +815,10 @@ bool DoSavestate(Savestate* file)
u32 console;
file->Var32(&console);
if (console != ConsoleType)
+ {
+ Log(LogLevel::Error, "savestate: Expected console type %d, got console type %d. cannot load.\n", ConsoleType, console);
return false;
+ }
}
file->VarArray(MainRAM, MainRAMMaxSize);
@@ -870,7 +873,11 @@ bool DoSavestate(Savestate* file)
file->VarArray(DMA9Fill, 4*sizeof(u32));
- if (!DoSavestate_Scheduler(file)) return false;
+ if (!DoSavestate_Scheduler(file))
+ {
+ Platform::Log(Platform::LogLevel::Error, "savestate: failed to %s scheduler state\n", file->Saving ? "save" : "load");
+ return false;
+ }
file->Var32(&SchedListMask);
file->Var64(&ARM9Timestamp);
file->Var64(&ARM9Target);
@@ -937,6 +944,8 @@ bool DoSavestate(Savestate* file)
}
#endif
+ file->Finish();
+
return true;
}