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:
parent
8a37a7ed76
commit
e6a483c525
3 changed files with 35 additions and 9 deletions
|
@ -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("-----------------------------");
|
||||
}
|
||||
|
|
37
Core/Sa1.cpp
37
Core/Sa1.cpp
|
@ -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());
|
||||
|
|
|
@ -93,4 +93,6 @@ public:
|
|||
|
||||
uint16_t ReadVector(uint16_t vector);
|
||||
MemoryMappings* GetMemoryMappings();
|
||||
void LoadBattery();
|
||||
void SaveBattery();
|
||||
};
|
||||
|
|
Loading…
Add table
Reference in a new issue