diff --git a/Core/Core.vcxproj b/Core/Core.vcxproj
index f3fa080d..98f16683 100644
--- a/Core/Core.vcxproj
+++ b/Core/Core.vcxproj
@@ -526,6 +526,7 @@
+
diff --git a/Core/Core.vcxproj.filters b/Core/Core.vcxproj.filters
index 6d75af38..28d788dd 100644
--- a/Core/Core.vcxproj.filters
+++ b/Core/Core.vcxproj.filters
@@ -1426,6 +1426,9 @@
Nes\Mappers\Unif
+
+ Nes\Mappers\Unif
+
diff --git a/Core/DragonFighter.h b/Core/DragonFighter.h
new file mode 100644
index 00000000..45fcb94d
--- /dev/null
+++ b/Core/DragonFighter.h
@@ -0,0 +1,72 @@
+#pragma once
+#include "stdafx.h"
+#include "MMC3.h"
+
+class DragonFighter : public MMC3
+{
+private:
+ uint8_t _exRegs[3];
+
+protected:
+ bool AllowRegisterRead() override { return true; }
+
+ void InitMapper() override
+ {
+ memset(_exRegs, 0, sizeof(_exRegs));
+
+ MMC3::InitMapper();
+ AddRegisterRange(0x6000, 0x6FFF, MemoryOperation::Any);
+ RemoveRegisterRange(0x8000, 0xFFFF, MemoryOperation::Read);
+ }
+
+ void StreamState(bool saving) override
+ {
+ MMC3::StreamState(saving);
+ Stream(_exRegs[0], _exRegs[1], _exRegs[2]);
+ }
+
+ void SelectCHRPage(uint16_t slot, uint16_t page, ChrMemoryType memoryType = ChrMemoryType::Default) override
+ {
+ if(slot == 0) {
+ SelectChrPage2x(0, ((page >> 1) ^ _exRegs[1]) << 1);
+ } else if(slot == 2) {
+ SelectChrPage2x(1, ((page >> 1) | ((_exRegs[2] & 0x40) << 1)) << 1);
+ } else if(slot == 4) {
+ SelectChrPage4x(1, (_exRegs[2] & 0x3F) << 2);
+ }
+ }
+
+ void SelectPRGPage(uint16_t slot, uint16_t page, PrgMemoryType memoryType = PrgMemoryType::PrgRom) override
+ {
+ if(slot == 0) {
+ MMC3::SelectPRGPage(slot, _exRegs[0] & 0x1F);
+ } else {
+ MMC3::SelectPRGPage(slot, page);
+ }
+ }
+
+ uint8_t ReadRegister(uint16_t addr) override
+ {
+ if(!(addr & 0x01)) {
+ if((_exRegs[0] & 0xE0) == 0xC0) {
+ _exRegs[1] = CPU::DebugReadByte(0x6A);
+ } else {
+ _exRegs[2] = CPU::DebugReadByte(0xFF);
+ }
+ UpdateState();
+ }
+ return 0;
+ }
+
+ void WriteRegister(uint16_t addr, uint8_t value) override
+ {
+ if(addr < 0x8000) {
+ if(!(addr & 0x01)) {
+ _exRegs[0] = value;
+ UpdateState();
+ }
+ } else {
+ MMC3::WriteRegister(addr, value);
+ }
+ }
+};
\ No newline at end of file
diff --git a/Core/MapperFactory.cpp b/Core/MapperFactory.cpp
index efbb02e3..d0dd1b72 100644
--- a/Core/MapperFactory.cpp
+++ b/Core/MapperFactory.cpp
@@ -44,6 +44,7 @@
#include "ColorDreams46.h"
#include "Dance2000.h"
#include "DaouInfosys.h"
+#include "DragonFighter.h"
#include "DreamTech01.h"
#include "Edu2000.h"
#include "Eh8813A.h"
@@ -553,6 +554,7 @@ BaseMapper* MapperFactory::GetMapperFromID(RomData &romData)
case UnifBoards::CityFighter: return new CityFighter();
case UnifBoards::Coolboy: return new MMC3_Coolboy();
case UnifBoards::Dance2000: return new Dance2000();
+ case UnifBoards::DragonFighter: return new DragonFighter();
case UnifBoards::DreamTech01: return new DreamTech01();
case UnifBoards::Edu2000: return new Edu2000();
case UnifBoards::Eh8813A: return new Eh8813A();
diff --git a/Core/UnifBoards.h b/Core/UnifBoards.h
index a5367fe0..0eaea866 100644
--- a/Core/UnifBoards.h
+++ b/Core/UnifBoards.h
@@ -68,5 +68,6 @@ namespace UnifBoards {
Yoko,
Unl8237A,
BmcHpxx,
+ DragonFighter,
};
}
\ No newline at end of file
diff --git a/Core/UnifLoader.cpp b/Core/UnifLoader.cpp
index fd2cb0cc..44350e62 100644
--- a/Core/UnifLoader.cpp
+++ b/Core/UnifLoader.cpp
@@ -147,7 +147,7 @@ std::unordered_map UnifLoader::_boardMappings = std::unordered_map<
{ "YOKO", UnifBoards::Yoko },
{ "SB-2000", UnifBoards::UnknownBoard },
{ "158B", UnifBoards::Unl158B },
- { "DRAGONFIGHTER", UnifBoards::UnknownBoard },
+ { "DRAGONFIGHTER", UnifBoards::DragonFighter },
{ "EH8813A", UnifBoards::Eh8813A },
{ "HP898F", UnifBoards::Hp898f },
{ "F-15", UnifBoards::BmcF15 },