diff --git a/src/backend/core/mmio/PIF.cpp b/src/backend/core/mmio/PIF.cpp index 0b6728bd..7d86579d 100644 --- a/src/backend/core/mmio/PIF.cpp +++ b/src/backend/core/mmio/PIF.cpp @@ -10,10 +10,17 @@ #define MEMPAK_SIZE 32768 namespace n64 { -void PIF::LoadMempak(fs::path path) { - if (mempak) - free(mempak); +PIF::PIF() { mempak = (u8*)calloc(MEMPAK_SIZE, 1); +} + +void PIF::Reset() { + memset(joybusDevices, 0, sizeof(JoybusDevice) * 6); + memset(bootrom, 0, PIF_BOOTROM_SIZE); + memset(ram, 0, PIF_RAM_SIZE); +} + +void PIF::LoadMempak(fs::path path) { mempakPath = path.replace_extension(".mempak").string(); FILE* f = fopen(mempakPath.c_str(), "rb"); if (!f) { @@ -79,11 +86,15 @@ void PIF::LoadEeprom(SaveType saveType, fs::path path) { PIF::~PIF() { FILE* f = fopen(mempakPath.c_str(), "wb"); - fwrite(mempak, 1, MEMPAK_SIZE, f); - fclose(f); + if(f) { + fwrite(mempak, 1, MEMPAK_SIZE, f); + fclose(f); + } f = fopen(eepromPath.c_str(), "wb"); - fwrite(eeprom, 1, eepromSize, f); - fclose(f); + if(f) { + fwrite(eeprom, 1, eepromSize, f); + fclose(f); + } } enum CMDIndexes { diff --git a/src/backend/core/mmio/PIF.hpp b/src/backend/core/mmio/PIF.hpp index f290027e..af8ad6fc 100644 --- a/src/backend/core/mmio/PIF.hpp +++ b/src/backend/core/mmio/PIF.hpp @@ -91,7 +91,9 @@ enum CICType { struct CartInfo; struct PIF { + PIF(); ~PIF(); + void Reset(); void LoadMempak(fs::path); void LoadEeprom(SaveType, fs::path); void ProcessCommands(Mem&); @@ -115,13 +117,13 @@ struct PIF { std::string mempakPath{}, eepromPath{}; size_t eepromSize{}; - u8 Read(u32 addr) { + FORCE_INLINE u8 Read(u32 addr) { addr &= 0x7FF; if(addr < 0x7c0) return bootrom[addr]; return ram[addr & PIF_RAM_DSIZE]; } - void Write(u32 addr, u8 val) { + FORCE_INLINE void Write(u32 addr, u8 val) { addr &= 0x7FF; if(addr < 0x7c0) return; ram[addr & PIF_RAM_DSIZE] = val; diff --git a/src/backend/core/mmio/SI.cpp b/src/backend/core/mmio/SI.cpp index 2e3c5365..e60efa2f 100644 --- a/src/backend/core/mmio/SI.cpp +++ b/src/backend/core/mmio/SI.cpp @@ -11,9 +11,7 @@ void SI::Reset() { status.raw = 0; dramAddr = 0; pifAddr = 0; - memset(&pif.joybusDevices, 0, sizeof(JoybusDevice) * 6); - memset(&pif.bootrom, 0, PIF_BOOTROM_SIZE); - memset(&pif.ram, 0, PIF_RAM_SIZE); + pif.Reset(); } auto SI::Read(MI& mi, u32 addr) const -> u32 {