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 },