Cart: Save/load .srm save ram files

This commit is contained in:
Sour 2019-02-24 20:04:59 -05:00
parent 069c8dc42d
commit 853821de2f
3 changed files with 51 additions and 10 deletions

View file

@ -5,9 +5,12 @@
#include "MemoryManager.h"
#include "IMemoryHandler.h"
#include "../Utilities/VirtualFile.h"
#include "../Utilities/FolderUtilities.h"
BaseCartridge::~BaseCartridge()
{
SaveBattery();
delete[] _prgRom;
delete[] _saveRam;
}
@ -19,6 +22,7 @@ shared_ptr<BaseCartridge> BaseCartridge::CreateCartridge(VirtualFile &romFile, V
romFile.ReadFile(romData);
shared_ptr<BaseCartridge> cart(new BaseCartridge());
cart->_romPath = romFile.GetFilePath();
cart->_prgRomSize = (uint32_t)romData.size();
cart->_prgRom = new uint8_t[cart->_prgRomSize];
memcpy(cart->_prgRom, romData.data(), cart->_prgRomSize);
@ -46,13 +50,41 @@ void BaseCartridge::Init()
//HiROM
headerOffset = 0xFFB0;
} else {
throw new std::runtime_error("invalid rom (?)");
headerOffset = 0x7FB0;
//throw std::runtime_error("invalid rom (?)");
}
_cartInfo = *(SnesCartInformation*)(&_prgRom[headerOffset]);
_saveRamSize = _cartInfo.SramSize > 0 ? 1024 * (1 << _cartInfo.SramSize) : 0;
_saveRam = new uint8_t[_saveRamSize];
LoadBattery();
}
void BaseCartridge::LoadBattery()
{
if(_saveRamSize > 0) {
string saveFilePath = FolderUtilities::CombinePath(FolderUtilities::GetSaveFolder(), FolderUtilities::GetFilename(_romPath, false) + ".srm");
VirtualFile saveFile(saveFilePath);
if(saveFile.IsValid()) {
vector<uint8_t> saveData;
saveFile.ReadFile(saveData);
if(saveData.size() == _saveRamSize) {
memcpy(_saveRam, saveData.data(), _saveRamSize);
}
}
}
}
void BaseCartridge::SaveBattery()
{
if(_saveRamSize > 0) {
string saveFilePath = FolderUtilities::CombinePath(FolderUtilities::GetSaveFolder(), FolderUtilities::GetFilename(_romPath, false) + ".srm");
ofstream saveFile(saveFilePath, ios::binary);
saveFile.write((char*)_saveRam, _saveRamSize);
}
}
CartFlags::CartFlags BaseCartridge::GetCartFlags()
@ -111,18 +143,24 @@ void BaseCartridge::RegisterHandlers(MemoryManager &mm)
}
if(GetCartFlags() & CartFlags::LoRom) {
MapBanks(mm, _prgRomHandlers, 0x00, 0x6F, 0x08, 0x0F, 0, true);
MapBanks(mm, _saveRamHandlers, 0x70, 0x7D, 0x00, 0x0F, 0, true);
if(_saveRamSize > 0) {
MapBanks(mm, _prgRomHandlers, 0x00, 0x6F, 0x08, 0x0F, 0, true);
MapBanks(mm, _saveRamHandlers, 0x70, 0x7D, 0x00, 0x0F, 0, true);
MapBanks(mm, _prgRomHandlers, 0x80, 0xEF, 0x08, 0x0F, 0, true);
MapBanks(mm, _saveRamHandlers, 0xF0, 0xFF, 0x00, 0x0F, 0, true);
MapBanks(mm, _prgRomHandlers, 0x80, 0xEF, 0x08, 0x0F, 0, true);
MapBanks(mm, _saveRamHandlers, 0xF0, 0xFF, 0x00, 0x0F, 0, true);
} else {
MapBanks(mm, _prgRomHandlers, 0x00, 0x7D, 0x08, 0x0F, 0, true);
MapBanks(mm, _prgRomHandlers, 0x80, 0xEF, 0x08, 0x0F, 0, true);
}
} else {
MapBanks(mm, _prgRomHandlers, 0x40, 0x7D, 0x00, 0x0F, 0, true);
MapBanks(mm, _prgRomHandlers, 0xC0, 0xFF, 0x00, 0x0F, 0, true);
MapBanks(mm, _prgRomHandlers, 0x00, 0x3F, 0x08, 0x0F, 8, true);
MapBanks(mm, _prgRomHandlers, 0x40, 0x7D, 0x00, 0x0F, 0, true);
MapBanks(mm, _prgRomHandlers, 0x80, 0xBF, 0x08, 0x0F, 8, true);
MapBanks(mm, _prgRomHandlers, 0xC0, 0xFF, 0x00, 0x0F, 0, true);
MapBanks(mm, _saveRamHandlers, 0x20, 0x3F, 0x06, 0x07, 0, true);
MapBanks(mm, _saveRamHandlers, 0xA0, 0xBF, 0x06, 0x07, 0, true);
}
}

View file

@ -47,6 +47,8 @@ private:
vector<unique_ptr<IMemoryHandler>> _saveRamHandlers;
SnesCartInformation _cartInfo;
string _romPath;
uint8_t* _prgRom = nullptr;
uint8_t* _saveRam = nullptr;
@ -54,6 +56,9 @@ private:
uint32_t _saveRamSize = 0;
void MapBanks(MemoryManager &mm, vector<unique_ptr<IMemoryHandler>> &handlers, uint8_t startBank, uint8_t endBank, uint16_t startPage = 0, uint16_t endPage = 0x0F, uint16_t pageIncrement = 0, bool mirror = false);
void LoadBattery();
void SaveBattery();
public:
~BaseCartridge();

View file

@ -90,7 +90,6 @@ public:
private:
shared_ptr<Console> _console;
shared_ptr<BaseCartridge> _cart;
shared_ptr<CpuRegisterHandler> _cpuRegisterHandler;
InternalRegisters* _regs;
shared_ptr<Ppu> _ppu;
@ -111,7 +110,6 @@ public:
_lastMasterClock = 0;
_masterClock = 0;
_console = console;
_cart = console->GetCartridge();
_regs = console->GetInternalRegisters().get();
_ppu = console->GetPpu();
@ -152,7 +150,7 @@ public:
RegisterHandler((i << 16) | 0x1000, (i << 16) | 0x1FFF, _workRamHandlers[1].get());
}
_cart->RegisterHandlers(*this);
console->GetCartridge()->RegisterHandlers(*this);
GenerateMasterClockTable();
}