diff --git a/Core/Bmc830425C4391T.h b/Core/Bmc830425C4391T.h new file mode 100644 index 00000000..0d7e3590 --- /dev/null +++ b/Core/Bmc830425C4391T.h @@ -0,0 +1,55 @@ +#pragma once +#include "stdafx.h" +#include "BaseMapper.h" + +class Bmc830425C4391T : public BaseMapper +{ +private: + uint8_t _innerReg; + uint8_t _outerReg; + uint8_t _prgMode; + +protected: + virtual uint16_t GetPRGPageSize() override { return 0x4000; } + virtual uint16_t GetCHRPageSize() override { return 0x2000; } + + void InitMapper() override + { + _innerReg = 0; + _outerReg = 0; + _prgMode = 0; + + SelectCHRPage(0, 0); + UpdateState(); + } + + void StreamState(bool saving) override + { + BaseMapper::StreamState(saving); + Stream(_innerReg, _outerReg, _prgMode); + } + + void UpdateState() + { + if(_prgMode) { + //UNROM mode + SelectPRGPage(0, (_innerReg & 0x07) | (_outerReg << 3)); + SelectPRGPage(1, 0x07 | (_outerReg << 3)); + } else { + //UOROM mode + //FIXME: Mermaid game doesn't work + SelectPRGPage(0, _innerReg | (_outerReg << 3)); + SelectPRGPage(1, 0x0F | (_outerReg << 3)); + } + } + + void WriteRegister(uint16_t addr, uint8_t value) override + { + _innerReg = value & 0x0F; + if((addr & 0xF0E0) == 0xF0E0) { + _outerReg = addr & 0x0F; + _prgMode = (addr >> 4) & 0x01; + } + UpdateState(); + } +}; diff --git a/Core/Core.vcxproj b/Core/Core.vcxproj index 23c92ac5..725b9c78 100644 --- a/Core/Core.vcxproj +++ b/Core/Core.vcxproj @@ -522,6 +522,7 @@ + diff --git a/Core/Core.vcxproj.filters b/Core/Core.vcxproj.filters index e1dc1eaa..92bc2d60 100644 --- a/Core/Core.vcxproj.filters +++ b/Core/Core.vcxproj.filters @@ -1456,6 +1456,9 @@ Nes\Mappers\Unif + + Nes\Mappers\Unif + diff --git a/Core/MapperFactory.cpp b/Core/MapperFactory.cpp index 57c459a3..dce8e262 100644 --- a/Core/MapperFactory.cpp +++ b/Core/MapperFactory.cpp @@ -32,6 +32,7 @@ #include "Bmc80013B.h" #include "Bmc810544CA1.h" #include "Bmc830118C.h" +#include "Bmc830425C4391T.h" #include "Bmc8in1.h" #include "BmcG146.h" #include "BmcGn45.h" @@ -586,7 +587,7 @@ BaseMapper* MapperFactory::GetMapperFromID(RomData &romData) case 315: break; //830134C //316-318 case 319: return new Hp898f(); - case 320: break; //830425C-4391T + case 320: return new Bmc830425C4391T(); //321 case 322: break; //K-3033 case 323: break; //FARID_SLROM_8-IN-1 diff --git a/Core/UnifLoader.cpp b/Core/UnifLoader.cpp index 0a5349f8..aef5b8f0 100644 --- a/Core/UnifLoader.cpp +++ b/Core/UnifLoader.cpp @@ -17,6 +17,7 @@ std::unordered_map UnifLoader::_boardMappings = std::unordered_map< { "70in1", 236 }, { "70in1B", 236 }, { "810544-C-A1", 261 }, + { "830425C-4391T", 320 }, { "8157", 301 }, { "8237", 215 }, { "8237A", UnifBoards::Unl8237A },