Fixed issues/crashes when loading games with sram sizes below 4kb

This commit is contained in:
Sour 2019-03-06 22:23:50 -05:00
parent 0218d57de7
commit 5b35a8333a
3 changed files with 13 additions and 9 deletions

View file

@ -147,11 +147,11 @@ void BaseCartridge::MapBanks(MemoryManager &mm, vector<unique_ptr<IMemoryHandler
void BaseCartridge::RegisterHandlers(MemoryManager &mm)
{
for(uint32_t i = 0; i < _prgRomSize; i += 0x1000) {
_prgRomHandlers.push_back(unique_ptr<RomHandler>(new RomHandler(_prgRom, i, SnesMemoryType::PrgRom)));
_prgRomHandlers.push_back(unique_ptr<RomHandler>(new RomHandler(_prgRom, i, _prgRomSize, SnesMemoryType::PrgRom)));
}
for(uint32_t i = 0; i < _saveRamSize; i += 0x1000) {
_saveRamHandlers.push_back(unique_ptr<RamHandler>(new RamHandler(_saveRam, i, SnesMemoryType::SaveRam)));
_saveRamHandlers.push_back(unique_ptr<RamHandler>(new RamHandler(_saveRam, i, _saveRamSize, SnesMemoryType::SaveRam)));
}
if(GetCartFlags() & CartFlags::LoRom) {
@ -208,6 +208,8 @@ void BaseCartridge::DisplayCartInfo()
MessageManager::Log("File size: " + std::to_string(_prgRomSize / 1024) + " KB");
MessageManager::Log("ROM size: " + std::to_string((0x400 << _cartInfo.RomSize) / 1024) + " KB");
MessageManager::Log("SRAM size: " + std::to_string(1 << _cartInfo.SramSize) + " KB");
if(_saveRamSize > 0) {
MessageManager::Log("SRAM size: " + std::to_string(_saveRamSize / 1024) + " KB");
}
MessageManager::Log("-----------------------------");
}

View file

@ -39,7 +39,7 @@ void MemoryManager::Initialize(shared_ptr<Console> console)
//memset(_workRam, 0, 128 * 1024);
for(uint32_t i = 0; i < 128 * 1024; i += 0x1000) {
_workRamHandlers.push_back(unique_ptr<RamHandler>(new RamHandler(_workRam, i, SnesMemoryType::WorkRam)));
_workRamHandlers.push_back(unique_ptr<RamHandler>(new RamHandler(_workRam, i, MemoryManager::WorkRamSize, SnesMemoryType::WorkRam)));
RegisterHandler(0x7E0000 | i, 0x7E0000 | (i + 0xFFF), _workRamHandlers[_workRamHandlers.size() - 1].get());
}

View file

@ -8,35 +8,37 @@ class RamHandler : public IMemoryHandler
private:
uint8_t * _ram;
uint32_t _offset;
uint32_t _mask;
SnesMemoryType _memoryType;
public:
RamHandler(uint8_t *ram, uint32_t offset, SnesMemoryType memoryType)
RamHandler(uint8_t *ram, uint32_t offset, uint32_t size, SnesMemoryType memoryType)
{
_ram = ram + offset;
_offset = offset;
_mask = (size - 1) & 0xFFF;
_memoryType = memoryType;
}
uint8_t Read(uint32_t addr) override
{
return _ram[addr & 0xFFF];
return _ram[addr & _mask];
}
uint8_t Peek(uint32_t addr) override
{
return _ram[addr & 0xFFF];
return _ram[addr & _mask];
}
void Write(uint32_t addr, uint8_t value) override
{
_ram[addr & 0xFFF] = value;
_ram[addr & _mask] = value;
}
AddressInfo GetAbsoluteAddress(uint32_t address) override
{
AddressInfo info;
info.Address = _offset + (address & 0xFFF);
info.Address = _offset + (address & _mask);
info.Type = _memoryType;
return info;
}