From 7cceefd7fc6cf7a31910cacd2ca3dc0607cea35b Mon Sep 17 00:00:00 2001 From: SimoneN64 Date: Tue, 7 Nov 2023 22:52:01 +0100 Subject: [PATCH] Share save data for sram and flash --- src/backend/core/Mem.cpp | 31 +++++++++++++++++-------------- src/backend/core/Mem.hpp | 6 +++--- src/backend/core/mem/Flash.cpp | 32 ++++++++++++++++++-------------- 3 files changed, 38 insertions(+), 31 deletions(-) diff --git a/src/backend/core/Mem.cpp b/src/backend/core/Mem.cpp index a6be0990..5324859b 100644 --- a/src/backend/core/Mem.cpp +++ b/src/backend/core/Mem.cpp @@ -7,7 +7,7 @@ #include namespace n64 { -Mem::Mem() { +Mem::Mem() : flash(saveData) { memset(readPages, 0, PAGE_COUNT); memset(writePages, 0, PAGE_COUNT); @@ -24,10 +24,11 @@ Mem::Mem() { void Mem::Reset() { memset(rom.cart, 0, CART_SIZE); flash.Reset(); - if(sram.is_mapped()) { + if (saveData.is_mapped()) { std::error_code error; - sram.sync(error); - sram.unmap(); + saveData.sync(error); + if (error) { Util::panic("Could not sync save data"); } + saveData.unmap(); } mmio.Reset(); } @@ -36,10 +37,10 @@ void Mem::LoadSRAM(SaveType save_type, fs::path path) { if(save_type == SAVE_SRAM_256k) { std::error_code error; sramPath = path.replace_extension(".sram").string(); - if(sram.is_mapped()) { - sram.sync(error); + if(saveData.is_mapped()) { + saveData.sync(error); if(error) { Util::panic("Could not sync {}", sramPath); } - sram.unmap(); + saveData.unmap(); } FILE *f = fopen(sramPath.c_str(), "rb"); @@ -56,7 +57,7 @@ void Mem::LoadSRAM(SaveType save_type, fs::path path) { Util::panic("Corrupt SRAM!"); } fclose(f); - sram = mio::make_mmap_sink( + saveData = mio::make_mmap_sink( sramPath, 0, mio::map_entire_file, error); if (error) { Util::panic("Could not open {}", sramPath); } } @@ -578,8 +579,9 @@ u8 Mem::BackupRead8(u32 addr) { Util::panic("Invalid backup Read8 if save data is not initialized"); } case SAVE_SRAM_256k: - if(sram.is_mapped()) { - return sram[addr & 0x8000]; + if(saveData.is_mapped()) { + assert(addr < saveData.size()); + return saveData[addr]; } else { Util::panic("Invalid backup Read8 if save data is not initialized"); } @@ -602,8 +604,9 @@ void Mem::BackupWrite8(u32 addr, u8 val) { } break; case SAVE_SRAM_256k: - if(sram.is_mapped()) { - sram[addr & 0x8000] = val; + if(saveData.is_mapped()) { + assert(addr < saveData.size()); + saveData[addr] = val; } else { Util::panic("Invalid backup Write8 if save data is not initialized"); } @@ -623,7 +626,7 @@ std::vector Mem::Serialize() { res.insert(res.begin(), sMMIO.begin(), sMMIO.end()); res.insert(res.end(), sFLASH.begin(), sFLASH.end()); - res.insert(res.end(), sram.begin(), sram.end()); + res.insert(res.end(), saveData.begin(), saveData.end()); return res; } @@ -631,6 +634,6 @@ std::vector Mem::Serialize() { void Mem::Deserialize(const std::vector& data) { mmio.Deserialize(std::vector(data.begin(), data.begin() + mmioSize)); flash.Deserialize(std::vector(data.begin() + mmioSize, data.begin() + mmioSize + flashSize)); - memcpy(sram.data(), data.data() + mmioSize + flashSize, sram.size()); + memcpy(saveData.data(), data.data() + mmioSize + flashSize, saveData.size()); } } \ No newline at end of file diff --git a/src/backend/core/Mem.hpp b/src/backend/core/Mem.hpp index d149a126..0d7af78f 100644 --- a/src/backend/core/Mem.hpp +++ b/src/backend/core/Mem.hpp @@ -42,7 +42,7 @@ enum FlashState : u8 { }; struct Flash { - Flash() = default; + Flash(mio::mmap_sink&); ~Flash() = default; void Reset(); void Load(SaveType, const std::string&); @@ -51,8 +51,8 @@ struct Flash { size_t eraseOffs{}; size_t writeOffs{}; u8 writeBuf[128]{}; - mio::mmap_sink flash; std::string flashPath{}; + mio::mmap_sink& saveData; enum FlashCommands : u8 { FLASH_COMMAND_EXECUTE = 0xD2, @@ -237,9 +237,9 @@ private: friend struct AI; friend struct RSP; friend struct Core; - mio::mmap_sink sram; u8 isviewer[ISVIEWER_SIZE]{}; std::string sramPath{}; + mio::mmap_sink saveData; int mmioSize, flashSize; FORCE_INLINE bool IsROMPAL() { diff --git a/src/backend/core/mem/Flash.cpp b/src/backend/core/mem/Flash.cpp index dc6530c1..a95028ab 100644 --- a/src/backend/core/mem/Flash.cpp +++ b/src/backend/core/mem/Flash.cpp @@ -3,24 +3,20 @@ namespace n64 { constexpr auto FLASH_SIZE = 1_mb; +Flash::Flash(mio::mmap_sink &saveData) : saveData(saveData) {} + void Flash::Reset() { state = Idle; - if (flash.is_mapped()) { - std::error_code error; - flash.sync(error); - if (error) { Util::panic("Could not sync {}", flashPath); } - flash.unmap(); - } } void Flash::Load(SaveType saveType, const std::string& path) { if(saveType == SAVE_FLASH_1m) { flashPath = fs::path(path).replace_extension(".flash").string(); std::error_code error; - if (flash.is_mapped()) { - flash.sync(error); + if (saveData.is_mapped()) { + saveData.sync(error); if (error) { Util::panic("Could not sync {}", flashPath); } - flash.unmap(); + saveData.unmap(); } FILE *f = fopen(flashPath.c_str(), "rb"); @@ -38,7 +34,7 @@ void Flash::Load(SaveType saveType, const std::string& path) { } fclose(f); - flash = mio::make_mmap_sink( + saveData = mio::make_mmap_sink( flashPath, 0, mio::map_entire_file, error); if (error) { Util::panic("Could not open {}", path); } } @@ -50,13 +46,21 @@ void Flash::CommandExecute() { case FlashState::Idle: break; case FlashState::Erase: - for (int i = 0; i < 128; i++) { - flash[eraseOffs + i] = 0xFF; + if(saveData.is_mapped()) { + for (int i = 0; i < 128; i++) { + saveData[eraseOffs + i] = 0xFF; + } + } else { + Util::panic("Accessing flash when not mapped!"); } break; case FlashState::Write: - for (int i = 0; i < 128; i++) { - flash[writeOffs + i] = writeBuf[i]; + if(saveData.is_mapped()) { + for (int i = 0; i < 128; i++) { + saveData[writeOffs + i] = writeBuf[i]; + } + } else { + Util::panic("Accessing flash when not mapped!"); } break; case FlashState::Read: