From 5b35a8333a55309d9b90835e12fbed43e1221467 Mon Sep 17 00:00:00 2001 From: Sour Date: Wed, 6 Mar 2019 22:23:50 -0500 Subject: [PATCH] Fixed issues/crashes when loading games with sram sizes below 4kb --- Core/BaseCartridge.cpp | 8 +++++--- Core/MemoryManager.cpp | 2 +- Core/RamHandler.h | 12 +++++++----- 3 files changed, 13 insertions(+), 9 deletions(-) diff --git a/Core/BaseCartridge.cpp b/Core/BaseCartridge.cpp index 79170cf..91d3cdf 100644 --- a/Core/BaseCartridge.cpp +++ b/Core/BaseCartridge.cpp @@ -147,11 +147,11 @@ void BaseCartridge::MapBanks(MemoryManager &mm, vector(new RomHandler(_prgRom, i, SnesMemoryType::PrgRom))); + _prgRomHandlers.push_back(unique_ptr(new RomHandler(_prgRom, i, _prgRomSize, SnesMemoryType::PrgRom))); } for(uint32_t i = 0; i < _saveRamSize; i += 0x1000) { - _saveRamHandlers.push_back(unique_ptr(new RamHandler(_saveRam, i, SnesMemoryType::SaveRam))); + _saveRamHandlers.push_back(unique_ptr(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("-----------------------------"); } \ No newline at end of file diff --git a/Core/MemoryManager.cpp b/Core/MemoryManager.cpp index e4e379b..2a305d0 100644 --- a/Core/MemoryManager.cpp +++ b/Core/MemoryManager.cpp @@ -39,7 +39,7 @@ void MemoryManager::Initialize(shared_ptr console) //memset(_workRam, 0, 128 * 1024); for(uint32_t i = 0; i < 128 * 1024; i += 0x1000) { - _workRamHandlers.push_back(unique_ptr(new RamHandler(_workRam, i, SnesMemoryType::WorkRam))); + _workRamHandlers.push_back(unique_ptr(new RamHandler(_workRam, i, MemoryManager::WorkRamSize, SnesMemoryType::WorkRam))); RegisterHandler(0x7E0000 | i, 0x7E0000 | (i + 0xFFF), _workRamHandlers[_workRamHandlers.size() - 1].get()); } diff --git a/Core/RamHandler.h b/Core/RamHandler.h index 9ee4102..d56397b 100644 --- a/Core/RamHandler.h +++ b/Core/RamHandler.h @@ -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; }