SA1: Fixed crash when loading SA1 games with no SRAM

+ If battery flag is set but sram size is 0, backup IRAM instead
This commit is contained in:
Sour 2020-06-03 20:37:36 -04:00
parent 8a37a7ed76
commit e6a483c525
3 changed files with 35 additions and 9 deletions

View file

@ -733,7 +733,10 @@ void BaseCartridge::DisplayCartInfo()
MessageManager::Log("SRAM size: " + std::to_string(_saveRamSize / 1024) + " KB" + (_hasBattery ? " (with battery)" : ""));
}
if(_coprocessorRamSize > 0) {
MessageManager::Log("Coprocessor RAM size: " + std::to_string(_coprocessorRamSize / 1024) + " KB" + (_hasBattery ? " (with battery)" : ""));
MessageManager::Log("Coprocessor RAM size: " + std::to_string(_coprocessorRamSize / 1024) + " KB");
}
if(_hasBattery) {
MessageManager::Log("Battery: yes");
}
MessageManager::Log("-----------------------------");
}

View file

@ -13,6 +13,7 @@
#include "Sa1BwRamHandler.h"
#include "CpuBwRamHandler.h"
#include "MessageManager.h"
#include "BatteryManager.h"
#include "../Utilities/HexUtilities.h"
Sa1::Sa1(Console* console) : BaseCoprocessor(SnesMemoryType::Register)
@ -610,14 +611,17 @@ void Sa1::UpdateVectorMappings()
void Sa1::UpdateSaveRamMappings()
{
vector<unique_ptr<IMemoryHandler>> &saveRamHandlers = _cart->GetSaveRamHandlers();
MemoryMappings* cpuMappings = _memoryManager->GetMemoryMappings();
uint32_t bankNumber = _state.CpuBwBank & ((_cpuBwRamHandlers.size() / 2) - 1);
for(int i = 0; i <= 0x3F; i++) {
//S-CPU: 00-3F:6000-7FFF + 80-BF:6000-7FFF
cpuMappings->RegisterHandler(i, i, 0x6000, 0x6FFF, saveRamHandlers[bankNumber * 2].get());
cpuMappings->RegisterHandler(i, i, 0x7000, 0x7FFF, saveRamHandlers[bankNumber * 2 + 1].get());
cpuMappings->RegisterHandler(i + 0x80, i + 0x80, 0x6000, 0x6FFF, saveRamHandlers[bankNumber * 2].get());
cpuMappings->RegisterHandler(i + 0x80, i + 0x80, 0x7000, 0x7FFF, saveRamHandlers[bankNumber * 2 + 1].get());
if(saveRamHandlers.size() > 0) {
MemoryMappings* cpuMappings = _memoryManager->GetMemoryMappings();
uint32_t bank1 = (_state.CpuBwBank * 2) % saveRamHandlers.size();
uint32_t bank2 = (_state.CpuBwBank * 2 + 1) % saveRamHandlers.size();
for(int i = 0; i <= 0x3F; i++) {
//S-CPU: 00-3F:6000-7FFF + 80-BF:6000-7FFF
cpuMappings->RegisterHandler(i, i, 0x6000, 0x6FFF, saveRamHandlers[bank1].get());
cpuMappings->RegisterHandler(i, i, 0x7000, 0x7FFF, saveRamHandlers[bank2].get());
cpuMappings->RegisterHandler(i + 0x80, i + 0x80, 0x6000, 0x6FFF, saveRamHandlers[bank1].get());
cpuMappings->RegisterHandler(i + 0x80, i + 0x80, 0x7000, 0x7FFF, saveRamHandlers[bank2].get());
}
}
}
@ -810,6 +814,23 @@ MemoryMappings* Sa1::GetMemoryMappings()
return &_mappings;
}
void Sa1::LoadBattery()
{
if(_cpuBwRamHandlers.empty()) {
//When there is no actual save RAM and the battery flag is set, IRAM is backed up instead
//Used by Pachi-Slot Monogatari - PAL Kougyou Special
_console->GetBatteryManager()->LoadBattery(".srm", _iRam, Sa1::InternalRamSize);
}
}
void Sa1::SaveBattery()
{
if(_cpuBwRamHandlers.empty()) {
_console->GetBatteryManager()->SaveBattery(".srm", _iRam, Sa1::InternalRamSize);
}
}
void Sa1::Serialize(Serializer &s)
{
s.Stream(_cpu.get());

View file

@ -93,4 +93,6 @@ public:
uint16_t ReadVector(uint16_t vector);
MemoryMappings* GetMemoryMappings();
void LoadBattery();
void SaveBattery();
};