From 5c1ac8dd540e939e27309d716e6f237b0cf69297 Mon Sep 17 00:00:00 2001 From: Sour Date: Sun, 8 Jul 2018 16:24:14 -0400 Subject: [PATCH] Added support for mapper 323 (FARID-SLROM) --- Core/Core.vcxproj | 1 + Core/Core.vcxproj.filters | 3 +++ Core/FaridSlrom.h | 55 +++++++++++++++++++++++++++++++++++++++ Core/MapperFactory.cpp | 3 ++- Core/UnifLoader.cpp | 1 + 5 files changed, 62 insertions(+), 1 deletion(-) create mode 100644 Core/FaridSlrom.h diff --git a/Core/Core.vcxproj b/Core/Core.vcxproj index 725b9c78..0efc8daa 100644 --- a/Core/Core.vcxproj +++ b/Core/Core.vcxproj @@ -531,6 +531,7 @@ + diff --git a/Core/Core.vcxproj.filters b/Core/Core.vcxproj.filters index 92bc2d60..c8340bec 100644 --- a/Core/Core.vcxproj.filters +++ b/Core/Core.vcxproj.filters @@ -1459,6 +1459,9 @@ Nes\Mappers\Unif + + Nes\Mappers\Unif + diff --git a/Core/FaridSlrom.h b/Core/FaridSlrom.h new file mode 100644 index 00000000..652ad691 --- /dev/null +++ b/Core/FaridSlrom.h @@ -0,0 +1,55 @@ +#pragma once +#include "MMC1.h" + +class FaridSlrom : public MMC1 +{ +private: + uint8_t _outerBank; + bool _locked; + +protected: + void InitMapper() override + { + AddRegisterRange(0x6000, 0x7FFF, MemoryOperation::Write); + MMC1::InitMapper(); + } + + void Reset(bool softReset) override + { + MMC1::Reset(softReset); + + _outerBank = 0; + _locked = false; + UpdateState(); + } + + void StreamState(bool saving) override + { + MMC1::StreamState(saving); + Stream(_outerBank, _locked); + } + + void SelectCHRPage(uint16_t slot, uint16_t page, ChrMemoryType memoryType) override + { + MMC1::SelectCHRPage(slot, (_outerBank << 2) | (page & 0x1F), memoryType); + } + + void SelectPRGPage(uint16_t slot, uint16_t page, PrgMemoryType memoryType) override + { + MMC1::SelectPRGPage(slot, _outerBank | (page & 0x07), memoryType); + } + + void WriteRegister(uint16_t addr, uint8_t value) override + { + if(addr < 0x8000) { + bool wramEnabled = (_state.RegE000 & 0x10) == 0; + if(wramEnabled && !_locked) { + _outerBank = (value & 0x70) >> 1; + _locked = (value & 0x08) == 0x08; + UpdateState(); + } + } else { + MMC1::WriteRegister(addr, value); + } + } +}; \ No newline at end of file diff --git a/Core/MapperFactory.cpp b/Core/MapperFactory.cpp index dce8e262..6c43383d 100644 --- a/Core/MapperFactory.cpp +++ b/Core/MapperFactory.cpp @@ -55,6 +55,7 @@ #include "Edu2000.h" #include "Eh8813A.h" #include "FamicomBox.h" +#include "FaridSlrom.h" #include "FDS.h" #include "FrontFareast.h" #include "Ghostbusters63in1.h" @@ -590,7 +591,7 @@ BaseMapper* MapperFactory::GetMapperFromID(RomData &romData) case 320: return new Bmc830425C4391T(); //321 case 322: break; //K-3033 - case 323: break; //FARID_SLROM_8-IN-1 + case 323: return new FaridSlrom(); case 324: break; //FARID_UNROM_8-IN-1 case 325: return new MMC3_MaliSB(); case 327: break; //10-24-C-A1 diff --git a/Core/UnifLoader.cpp b/Core/UnifLoader.cpp index aef5b8f0..f184e8b7 100644 --- a/Core/UnifLoader.cpp +++ b/Core/UnifLoader.cpp @@ -43,6 +43,7 @@ std::unordered_map UnifLoader::_boardMappings = std::unordered_map< { "ELROM", 5 }, { "ETROM", 5 }, { "EWROM", 5 }, + { "FARID_SLROM_8-IN-1", 323 }, { "FK23C", UnifBoards::Fk23C }, { "FK23CA", UnifBoards::Fk23Ca }, { "FS304", 162 },