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)" : ""));
|
MessageManager::Log("SRAM size: " + std::to_string(_saveRamSize / 1024) + " KB" + (_hasBattery ? " (with battery)" : ""));
|
||||||
}
|
}
|
||||||
if(_coprocessorRamSize > 0) {
|
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("-----------------------------");
|
MessageManager::Log("-----------------------------");
|
||||||
}
|
}
|
||||||
|
|
37
Core/Sa1.cpp
37
Core/Sa1.cpp
|
@ -13,6 +13,7 @@
|
||||||
#include "Sa1BwRamHandler.h"
|
#include "Sa1BwRamHandler.h"
|
||||||
#include "CpuBwRamHandler.h"
|
#include "CpuBwRamHandler.h"
|
||||||
#include "MessageManager.h"
|
#include "MessageManager.h"
|
||||||
|
#include "BatteryManager.h"
|
||||||
#include "../Utilities/HexUtilities.h"
|
#include "../Utilities/HexUtilities.h"
|
||||||
|
|
||||||
Sa1::Sa1(Console* console) : BaseCoprocessor(SnesMemoryType::Register)
|
Sa1::Sa1(Console* console) : BaseCoprocessor(SnesMemoryType::Register)
|
||||||
|
@ -610,14 +611,17 @@ void Sa1::UpdateVectorMappings()
|
||||||
void Sa1::UpdateSaveRamMappings()
|
void Sa1::UpdateSaveRamMappings()
|
||||||
{
|
{
|
||||||
vector<unique_ptr<IMemoryHandler>> &saveRamHandlers = _cart->GetSaveRamHandlers();
|
vector<unique_ptr<IMemoryHandler>> &saveRamHandlers = _cart->GetSaveRamHandlers();
|
||||||
MemoryMappings* cpuMappings = _memoryManager->GetMemoryMappings();
|
if(saveRamHandlers.size() > 0) {
|
||||||
uint32_t bankNumber = _state.CpuBwBank & ((_cpuBwRamHandlers.size() / 2) - 1);
|
MemoryMappings* cpuMappings = _memoryManager->GetMemoryMappings();
|
||||||
for(int i = 0; i <= 0x3F; i++) {
|
uint32_t bank1 = (_state.CpuBwBank * 2) % saveRamHandlers.size();
|
||||||
//S-CPU: 00-3F:6000-7FFF + 80-BF:6000-7FFF
|
uint32_t bank2 = (_state.CpuBwBank * 2 + 1) % saveRamHandlers.size();
|
||||||
cpuMappings->RegisterHandler(i, i, 0x6000, 0x6FFF, saveRamHandlers[bankNumber * 2].get());
|
for(int i = 0; i <= 0x3F; i++) {
|
||||||
cpuMappings->RegisterHandler(i, i, 0x7000, 0x7FFF, saveRamHandlers[bankNumber * 2 + 1].get());
|
//S-CPU: 00-3F:6000-7FFF + 80-BF:6000-7FFF
|
||||||
cpuMappings->RegisterHandler(i + 0x80, i + 0x80, 0x6000, 0x6FFF, saveRamHandlers[bankNumber * 2].get());
|
cpuMappings->RegisterHandler(i, i, 0x6000, 0x6FFF, saveRamHandlers[bank1].get());
|
||||||
cpuMappings->RegisterHandler(i + 0x80, i + 0x80, 0x7000, 0x7FFF, saveRamHandlers[bankNumber * 2 + 1].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;
|
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)
|
void Sa1::Serialize(Serializer &s)
|
||||||
{
|
{
|
||||||
s.Stream(_cpu.get());
|
s.Stream(_cpu.get());
|
||||||
|
|
|
@ -93,4 +93,6 @@ public:
|
||||||
|
|
||||||
uint16_t ReadVector(uint16_t vector);
|
uint16_t ReadVector(uint16_t vector);
|
||||||
MemoryMappings* GetMemoryMappings();
|
MemoryMappings* GetMemoryMappings();
|
||||||
|
void LoadBattery();
|
||||||
|
void SaveBattery();
|
||||||
};
|
};
|
||||||
|
|
Loading…
Add table
Reference in a new issue