From 8798a73deb2f46f37203657d1a9c606790240fa5 Mon Sep 17 00:00:00 2001 From: Sour Date: Sat, 29 Feb 2020 17:15:23 -0500 Subject: [PATCH] SPC7110: Added support for the mappings used by the tenkai translation rom --- Core/Spc7110.cpp | 31 +++++++++++++++++++------------ Core/Spc7110.h | 3 +++ 2 files changed, 22 insertions(+), 12 deletions(-) diff --git a/Core/Spc7110.cpp b/Core/Spc7110.cpp index 0afad77..77f6e1a 100644 --- a/Core/Spc7110.cpp +++ b/Core/Spc7110.cpp @@ -5,6 +5,7 @@ #include "MemoryMappings.h" #include "BaseCartridge.h" #include "MemoryManager.h" +#include "EmuSettings.h" #include "BatteryManager.h" #include "MessageManager.h" #include "../Utilities/HexUtilities.h" @@ -12,11 +13,12 @@ Spc7110::Spc7110(Console* console, bool useRtc) { _console = console; + _cart = console->GetCartridge().get(); _useRtc = useRtc; MemoryMappings* mappings = console->GetMemoryManager()->GetMemoryMappings(); - vector>& prgRomHandlers = console->GetCartridge()->GetPrgRomHandlers(); - vector>& saveRamHandlers = console->GetCartridge()->GetSaveRamHandlers(); + vector>& prgRomHandlers = _cart->GetPrgRomHandlers(); + vector>& saveRamHandlers = _cart->GetSaveRamHandlers(); //Regular A Bus register handler, keep a reference to it, it'll be overwritten below _cpuRegisterHandler = mappings->GetHandler(0x4000); @@ -35,7 +37,15 @@ Spc7110::Spc7110(Console* console, bool useRtc) mappings->RegisterHandler(0x00, 0x3F, 0x8000, 0xFFFF, prgRomHandlers, 8); mappings->RegisterHandler(0x80, 0xBF, 0x8000, 0xFFFF, prgRomHandlers, 8); - mappings->RegisterHandler(0x40, 0x4F, 0x0000, 0xFFFF, prgRomHandlers); + bool enableStrictBoardMappings = console->GetSettings()->GetEmulationConfig().EnableStrictBoardMappings; + uint32_t romSize = _cart->DebugGetPrgRomSize(); + if(!enableStrictBoardMappings && _cart->DebugGetPrgRomSize() >= 0x600000) { + mappings->RegisterHandler(0x40, 0x4F, 0x0000, 0xFFFF, prgRomHandlers, 0, 0x600); + _realDataRomSize = romSize - 0x200000; + } else { + mappings->RegisterHandler(0x40, 0x4F, 0x0000, 0xFFFF, prgRomHandlers); + _realDataRomSize = romSize - 0x100000; + } mappings->RegisterHandler(0xC0, 0xCF, 0x0000, 0xFFFF, prgRomHandlers); Reset(); @@ -255,9 +265,9 @@ void Spc7110::Write(uint32_t addr, uint8_t value) void Spc7110::UpdateMappings() { MemoryMappings* mappings = _console->GetMemoryManager()->GetMemoryMappings(); - vector>& prgRomHandlers = _console->GetCartridge()->GetPrgRomHandlers(); + vector>& prgRomHandlers = _cart->GetPrgRomHandlers(); - uint32_t dataRomSize = ((uint32_t)prgRomHandlers.size() - 0x100); + uint32_t dataRomSize = _realDataRomSize >> 12; for(int i = 0; i < 3; i++) { mappings->RegisterHandler(0xD0 + (i * 0x10), 0xDF + (i * 0x10), 0x0000, 0xFFFF, prgRomHandlers, 0, 0x100 + ((_dataRomBanks[i] * 0x100) % dataRomSize)); } @@ -307,16 +317,13 @@ void Spc7110::ProcessDivision() uint8_t Spc7110::ReadDataRom(uint32_t addr) { - uint32_t size = 1 << (_dataRomSize & 0x03); - uint32_t mask = 0x100000 * size - 1; - if((_dataRomSize & 0x03) != 0x03 && (addr & 0x400000)) { + uint32_t configSize = 0x100000 * (1 << (_dataRomSize & 0x03)); + uint32_t dataRomSize = std::min(configSize, _realDataRomSize); + if(addr >= dataRomSize) { return 0x00; } - uint32_t realDataRomSize = _console->GetCartridge()->DebugGetPrgRomSize() - 0x100000; - mask = std::min(mask, realDataRomSize - 1); - - return _console->GetCartridge()->DebugGetPrgRom()[0x100000 + (addr & mask)]; + return _cart->DebugGetPrgRom()[0x100000 + addr]; } void Spc7110::FillReadBuffer() diff --git a/Core/Spc7110.h b/Core/Spc7110.h index f3ae6db..027bf8f 100644 --- a/Core/Spc7110.h +++ b/Core/Spc7110.h @@ -7,6 +7,7 @@ class Console; class Spc7110Decomp; class IMemoryHandler; +class BaseCartridge; class Spc7110 : public BaseCoprocessor { @@ -16,7 +17,9 @@ private: IMemoryHandler* _cpuRegisterHandler = nullptr; Console* _console = nullptr; + BaseCartridge* _cart = nullptr; bool _useRtc = false; + uint32_t _realDataRomSize = 0; //Decomp uint32_t _directoryBase = 0;