diff --git a/Core/Bmc8in1.h b/Core/Bmc8in1.h new file mode 100644 index 00000000..fc0cf66c --- /dev/null +++ b/Core/Bmc8in1.h @@ -0,0 +1,46 @@ +#pragma once +#include "stdafx.h" +#include "MMC3.h" + +class Bmc8in1 : public MMC3 +{ +private: + uint8_t _reg; + +protected: + void InitMapper() override + { + _reg = 0; + MMC3::InitMapper(); + } + + void StreamState(bool saving) override + { + MMC3::StreamState(saving); + Stream(_reg); + } + + void SelectCHRPage(uint16_t slot, uint16_t page, ChrMemoryType memoryType = ChrMemoryType::Default) override + { + MMC3::SelectCHRPage(slot, ((_reg & 0x0C) << 5) | (page & 0x7F), memoryType); + } + + void SelectPRGPage(uint16_t slot, uint16_t page, PrgMemoryType memoryType = PrgMemoryType::PrgRom) override + { + if(_reg & 0x10) { + MMC3::SelectPRGPage(slot, ((_reg & 0x0C) << 2) | (page & 0x0F)); + } else { + SelectPrgPage4x(0, (_reg & 0x0F) << 2); + } + } + + void WriteRegister(uint16_t addr, uint8_t value) override + { + if(addr & 0x1000) { + _reg = value; + UpdateState(); + } else { + MMC3::WriteRegister(addr, value); + } + } +}; \ No newline at end of file diff --git a/Core/Core.vcxproj b/Core/Core.vcxproj index 0f202033..0fc59cd8 100644 --- a/Core/Core.vcxproj +++ b/Core/Core.vcxproj @@ -518,6 +518,7 @@ + diff --git a/Core/Core.vcxproj.filters b/Core/Core.vcxproj.filters index cefa5e79..e65740ce 100644 --- a/Core/Core.vcxproj.filters +++ b/Core/Core.vcxproj.filters @@ -1375,6 +1375,9 @@ NetPlay\Messages + + Nes\Mappers\Unif + diff --git a/Core/MapperFactory.cpp b/Core/MapperFactory.cpp index c2e46eea..32c41734 100644 --- a/Core/MapperFactory.cpp +++ b/Core/MapperFactory.cpp @@ -26,6 +26,7 @@ #include "Bmc235.h" #include "Bmc255.h" #include "Bmc810544CA1.h" +#include "Bmc8in1.h" #include "BmcG146.h" #include "BmcNtd03.h" #include "BnRom.h" @@ -521,6 +522,7 @@ BaseMapper* MapperFactory::GetMapperFromID(RomData &romData) case UnifBoards::Bmc70in1B: return new Bmc70in1(); case UnifBoards::Bmc190in1: return new Bmc190in1(); case UnifBoards::Bmc810544CA1: return new Bmc810544CA1(); + case UnifBoards::Bmc8in1: return new Bmc8in1(); case UnifBoards::BmcF15: return new MMC3_BmcF15(); case UnifBoards::BmcG146: return new BmcG146(); case UnifBoards::BmdNtd03: return new BmcNtd03(); diff --git a/Core/UnifBoards.h b/Core/UnifBoards.h index 484b3427..05dd1f69 100644 --- a/Core/UnifBoards.h +++ b/Core/UnifBoards.h @@ -39,6 +39,7 @@ namespace UnifBoards { Bmc12in1, Bmc64in1NoRepeat, Bmc810544CA1, + Bmc8in1, BmcF15, Lh10, Ks7037, diff --git a/Core/UnifLoader.cpp b/Core/UnifLoader.cpp index 976ec15c..1cca8eb1 100644 --- a/Core/UnifLoader.cpp +++ b/Core/UnifLoader.cpp @@ -153,6 +153,6 @@ std::unordered_map UnifLoader::_boardMappings = std::unordered_map< { "F-15", UnifBoards::BmcF15 }, { "RT-01", UnifBoards::Rt01 }, { "81-01-31-C", UnifBoards::UnknownBoard }, - { "8-IN-1", UnifBoards::UnknownBoard }, + { "8-IN-1", UnifBoards::Bmc8in1 }, { "WS", UnifBoards::Super40in1Ws } }; \ No newline at end of file