diff --git a/libgambatte/src/mem/cartridge.cpp b/libgambatte/src/mem/cartridge.cpp index 7539be22bf..4117c86f54 100644 --- a/libgambatte/src/mem/cartridge.cpp +++ b/libgambatte/src/mem/cartridge.cpp @@ -21,6 +21,7 @@ #include #include #include +#include namespace gambatte { @@ -500,11 +501,15 @@ void Cartridge::setStatePtrs(SaveState &state) { state.mem.vram.set(memptrs.vramdata(), memptrs.vramdataend() - memptrs.vramdata()); state.mem.sram.set(memptrs.rambankdata(), memptrs.rambankdataend() - memptrs.rambankdata()); state.mem.wram.set(memptrs.wramdata(0), memptrs.wramdataend() - memptrs.wramdata(0)); + } void Cartridge::loadState(const SaveState &state) { rtc.loadState(state); mbc->loadState(state.mem); + //if (state.mem.using_bios) { + // bios_remap(0); + //} } static void enforce8bit(unsigned char *data, unsigned long sz) { @@ -528,11 +533,13 @@ void Cartridge::bios_remap(int setting) { // disable the BIOS if writing 1 or 0x22 (GBC) if (setting == 1 || setting == 0x11) { std::memcpy(memptrs.romdata(), memptrs.notbiosdata_, loc_bios_length); + using_bios = false; } // we'll also use it to reset to BIOS on reset if (setting == 0) { std::memcpy(memptrs.romdata(), memptrs.biosdata_, loc_bios_length); + using_bios = true; } } @@ -633,7 +640,7 @@ int Cartridge::loadROM(const char *romfiledata, unsigned romfilelength, const ch std::printf("rambanks: %u\n", rambanks); const std::size_t filesize = romfilelength; //rom->size(); - rombanks = std::fmax(pow2ceil(filesize / 0x4000), 2u); + rombanks = std::max(pow2ceil(filesize / 0x4000), 2u); std::printf("rombanks: %u\n", static_cast(filesize / 0x4000)); mbc.reset(); @@ -653,9 +660,12 @@ int Cartridge::loadROM(const char *romfiledata, unsigned romfilelength, const ch //we want to copy in the bios data only if it exists if (use_bios) { + using_bios = true; + memptrs.use_bios = true; + memptrs.biosdata_ = new unsigned char[biosfilelength]; memptrs.notbiosdata_ = new unsigned char[biosfilelength]; - + std::memcpy(memptrs.biosdata_, biosfiledata, biosfilelength); std::memcpy(memptrs.notbiosdata_, romfiledata, biosfilelength); @@ -778,6 +788,11 @@ SYNCFUNC(Cartridge) SSS(memptrs); SSS(rtc); TSS(mbc); + NSS(using_bios); + + if (using_bios) { + bios_remap(0); + } } } diff --git a/libgambatte/src/mem/cartridge.h b/libgambatte/src/mem/cartridge.h index 51c73d1ece..c3a3d7ce27 100644 --- a/libgambatte/src/mem/cartridge.h +++ b/libgambatte/src/mem/cartridge.h @@ -68,6 +68,7 @@ public: void loadState(const SaveState &); bool use_bios; + bool using_bios; unsigned loc_bios_length; bool loaded() const { return mbc.get(); } diff --git a/libgambatte/src/mem/memptrs.cpp b/libgambatte/src/mem/memptrs.cpp index 425b9b4e61..4ddf5e0149 100644 --- a/libgambatte/src/mem/memptrs.cpp +++ b/libgambatte/src/mem/memptrs.cpp @@ -31,12 +31,15 @@ MemPtrs::MemPtrs() MemPtrs::~MemPtrs() { delete []memchunk_; + if (use_bios) + { + delete[]biosdata_; + delete[]notbiosdata_; + } } void MemPtrs::reset(const unsigned rombanks, const unsigned rambanks, const unsigned wrambanks) { delete []memchunk_; - delete []biosdata_; - delete []notbiosdata_; memchunk_len = 0x4000 + rombanks * 0x4000ul + 0x4000 + rambanks * 0x2000ul + wrambanks * 0x1000ul + 0x4000; memchunk_ = new unsigned char[memchunk_len]; @@ -223,6 +226,10 @@ SYNCFUNC(MemPtrs) MSS(rambankdata_); MSS(wramdataend_); NSS(oamDmaSrc_); + + NSS(biosdata_); + NSS(notbiosdata_); + NSS(use_bios); } } diff --git a/libgambatte/src/mem/memptrs.h b/libgambatte/src/mem/memptrs.h index ec63dd4a8b..3c63670907 100644 --- a/libgambatte/src/mem/memptrs.h +++ b/libgambatte/src/mem/memptrs.h @@ -53,6 +53,7 @@ class MemPtrs { public: unsigned char *biosdata_; unsigned char *notbiosdata_; + bool use_bios; enum RamFlag { READ_EN = 1, WRITE_EN = 2, RTC_EN = 4 };