diff options
Diffstat (limited to 'src/Savestate.h')
-rw-r--r-- | src/Savestate.h | 78 |
1 files changed, 67 insertions, 11 deletions
diff --git a/src/Savestate.h b/src/Savestate.h index a2216ce..0aef517 100644 --- a/src/Savestate.h +++ b/src/Savestate.h @@ -19,6 +19,7 @@ #ifndef SAVESTATE_H #define SAVESTATE_H +#include <cstring> #include <string> #include <stdio.h> #include "types.h" @@ -29,37 +30,92 @@ class Savestate { public: - Savestate(const std::string& filename, bool save); + static constexpr u32 DEFAULT_SIZE = 32 * 1024 * 1024; // 32 MB + Savestate(void* buffer, u32 size, bool save); + explicit Savestate(u32 initial_size = DEFAULT_SIZE); + ~Savestate(); bool Error; bool Saving; - u32 VersionMajor; - u32 VersionMinor; u32 CurSection; void Section(const char* magic); - void Var8(u8* var); - void Var16(u16* var); - void Var32(u32* var); - void Var64(u64* var); + void Var8(u8* var) + { + VarArray(var, sizeof(*var)); + } + + void Var16(u16* var) + { + VarArray(var, sizeof(*var)); + } + + void Var32(u32* var) + { + VarArray(var, sizeof(*var)); + } + + void Var64(u64* var) + { + VarArray(var, sizeof(*var)); + } void Bool32(bool* var); void VarArray(void* data, u32 len); - bool IsAtleastVersion(u32 major, u32 minor) + void Finish(); + + // TODO rewinds the stream + void Rewind(bool save); + + bool IsAtLeastVersion(u32 major, u32 minor) { - if (VersionMajor > major) return true; - if (VersionMajor == major && VersionMinor >= minor) return true; + u16 major_version = MajorVersion(); + if (MajorVersion() > major) return true; + if (major_version == major && MinorVersion() >= minor) return true; return false; } + void* Buffer() { return buffer; } + [[nodiscard]] const void* Buffer() const { return buffer; } + + [[nodiscard]] u32 BufferLength() const { return buffer_length; } + + [[nodiscard]] u32 Length() const { return buffer_offset; } + + [[nodiscard]] u16 MajorVersion() const + { + // major version is stored at offset 0x04 + u16 major = 0; + memcpy(&major, buffer + 0x04, sizeof(major)); + return major; + } + + [[nodiscard]] u16 MinorVersion() const + { + // minor version is stored at offset 0x06 + u16 minor = 0; + memcpy(&minor, buffer + 0x06, sizeof(minor)); + return minor; + } + private: - FILE* file; + static constexpr u32 NO_SECTION = 0xffffffff; + void CloseCurrentSection(); + bool Resize(u32 new_length); + void WriteSavestateHeader(); + void WriteStateLength(); + u32 FindSection(const char* magic) const; + u8* buffer; + u32 buffer_offset; + u32 buffer_length; + bool buffer_owned; + bool finished; }; #endif // SAVESTATE_H |