diff --git a/Core/Core.vcxproj b/Core/Core.vcxproj index 73e4cb21..a3a3c627 100644 --- a/Core/Core.vcxproj +++ b/Core/Core.vcxproj @@ -548,6 +548,7 @@ + diff --git a/Core/Core.vcxproj.filters b/Core/Core.vcxproj.filters index 6522ef54..4e0e5dec 100644 --- a/Core/Core.vcxproj.filters +++ b/Core/Core.vcxproj.filters @@ -1057,6 +1057,9 @@ Nes\Mappers\Unif + + Nes\Mappers\Unif + diff --git a/Core/MMC3_BmcF15.h b/Core/MMC3_BmcF15.h new file mode 100644 index 00000000..aec24a6a --- /dev/null +++ b/Core/MMC3_BmcF15.h @@ -0,0 +1,44 @@ +#pragma once +#include "stdafx.h" +#include "MMC3.h" + +class MMC3_BmcF15 : public MMC3 +{ +private: + uint8_t _exReg; + +protected: + void InitMapper() override + { + AddRegisterRange(0x6000, 0xFFFF, MemoryOperation::Write); + _exReg = 0; + MMC3::InitMapper(); + } + + void StreamState(bool saving) override + { + MMC3::StreamState(saving); + Stream(_exReg); + } + + void UpdatePrgMapping() override + { + uint32_t bank = _exReg & 0x0F; + uint32_t mode = (_exReg & 0x08) >> 3; + uint32_t mask = ~mode; + SelectPrgPage2x(0, (bank & mask) << 1); + SelectPrgPage2x(1, ((bank & mask) | mode) << 1); + } + + void WriteRegister(uint16_t addr, uint8_t value) override + { + if(addr < 0x8000) { + if(GetState().RegA001 & 0x80) { + _exReg = value & 0x0F; + UpdatePrgMapping(); + } + } else { + MMC3::WriteRegister(addr, value); + } + } +}; \ No newline at end of file diff --git a/Core/MapperFactory.cpp b/Core/MapperFactory.cpp index 9f674bc2..e50f5fa4 100644 --- a/Core/MapperFactory.cpp +++ b/Core/MapperFactory.cpp @@ -148,6 +148,7 @@ #include "MMC3_249.h" #include "MMC3_250.h" #include "MMC3_254.h" +#include "MMC3_BmcF15.h" #include "MMC3_ChrRam.h" #include "MMC3_Coolboy.h" #include "MMC3_Kof97.h" @@ -485,6 +486,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::BmcF15: return new MMC3_BmcF15(); case UnifBoards::BmcG146: return new BmcG146(); case UnifBoards::BmdNtd03: return new BmcNtd03(); case UnifBoards::Bs5: return new Bs5(); diff --git a/Core/UnifBoards.h b/Core/UnifBoards.h index a6233c81..b1369ce9 100644 --- a/Core/UnifBoards.h +++ b/Core/UnifBoards.h @@ -38,5 +38,6 @@ namespace UnifBoards { Bmc12in1, Bmc64in1NoRepeat, Bmc810544CA1, + BmcF15, }; } \ No newline at end of file diff --git a/Core/UnifLoader.h b/Core/UnifLoader.h index 1655ff74..63f75a4f 100644 --- a/Core/UnifLoader.h +++ b/Core/UnifLoader.h @@ -155,7 +155,7 @@ private: { "DRAGONFIGHTER", UnifBoards::UnknownBoard }, { "EH8813A", UnifBoards::UnknownBoard }, { "HP898F", UnifBoards::Hp898f }, - { "F-15", UnifBoards::UnknownBoard }, + { "F-15", UnifBoards::BmcF15 }, { "RT-01", UnifBoards::Rt01 }, { "81-01-31-C", UnifBoards::UnknownBoard }, { "8-IN-1", UnifBoards::UnknownBoard },