From 5e6578a4a0bf080f8279bdf8bd880cd8a60fe309 Mon Sep 17 00:00:00 2001 From: Sour Date: Fri, 22 Jun 2018 14:23:26 -0400 Subject: [PATCH] Added support for GN-45 boards --- Core/BmcGn45.h | 64 ++++++++++++++++++++++++++++++++ Core/Core.vcxproj | 1 + Core/Core.vcxproj.filters | 3 ++ Core/MapperFactory.cpp | 4 +- Core/UnifBoards.h | 1 + Core/UnifLoader.cpp | 1 + GUI.NET/Dependencies/MesenDB.txt | 7 ++-- Libretro/MesenDB.inc | 5 ++- 8 files changed, 80 insertions(+), 6 deletions(-) create mode 100644 Core/BmcGn45.h diff --git a/Core/BmcGn45.h b/Core/BmcGn45.h new file mode 100644 index 00000000..fd721d42 --- /dev/null +++ b/Core/BmcGn45.h @@ -0,0 +1,64 @@ +#pragma once +#include "stdafx.h" +#include "MMC3.h" + +class BmcGn45 : public MMC3 +{ +private: + uint8_t _selectedBlock = 0; + bool _wramEnabled = false; + +protected: + uint16_t RegisterStartAddress() override { return 0x6000; } + uint16_t RegisterEndAddress() override { return 0xFFFF; } + + void StreamState(bool saving) override + { + MMC3::StreamState(saving); + Stream(_selectedBlock, _wramEnabled); + } + + void Reset(bool softReset) override + { + MMC3::Reset(softReset); + + if(softReset) { + _selectedBlock = 0; + _wramEnabled = false; + ResetMmc3(); + UpdateState(); + } + } + + void SelectCHRPage(uint16_t slot, uint16_t page, ChrMemoryType memoryType = ChrMemoryType::Default) override + { + MMC3::SelectCHRPage(slot, (page & 0x7F) | (_selectedBlock << 3), memoryType); + } + + void SelectPRGPage(uint16_t slot, uint16_t page, PrgMemoryType memoryType = PrgMemoryType::PrgRom) override + { + MMC3::SelectPRGPage(slot, (page & 0x0F) | _selectedBlock, memoryType); + } + + void WriteRegister(uint16_t addr, uint8_t value) override + { + if(addr < 0x7000) { + if(!_wramEnabled) { + _selectedBlock = addr & 0x30; + _wramEnabled = (addr & 0x80) != 0; + UpdateState(); + } else { + WritePrgRam(addr, value); + } + } else if(addr < 0x8000) { + if(!_wramEnabled) { + _selectedBlock = value & 0x30; + UpdateState(); + } else { + WritePrgRam(addr, value); + } + } else { + MMC3::WriteRegister(addr, value); + } + } +}; \ No newline at end of file diff --git a/Core/Core.vcxproj b/Core/Core.vcxproj index 98f16683..be7d5dcc 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 28d788dd..83c58224 100644 --- a/Core/Core.vcxproj.filters +++ b/Core/Core.vcxproj.filters @@ -1429,6 +1429,9 @@ Nes\Mappers\Unif + + Nes\Mappers\Unif + diff --git a/Core/MapperFactory.cpp b/Core/MapperFactory.cpp index de8eeeb9..e6429779 100644 --- a/Core/MapperFactory.cpp +++ b/Core/MapperFactory.cpp @@ -31,6 +31,7 @@ #include "Bmc830118C.h" #include "Bmc8in1.h" #include "BmcG146.h" +#include "BmcGn45.h" #include "BmcNtd03.h" #include "BnRom.h" #include "Bs5.h" @@ -547,6 +548,7 @@ BaseMapper* MapperFactory::GetMapperFromID(RomData &romData) case UnifBoards::Bmc8in1: return new Bmc8in1(); case UnifBoards::BmcF15: return new MMC3_BmcF15(); case UnifBoards::BmcG146: return new BmcG146(); + case UnifBoards::BmcGn45: return new BmcGn45(); case UnifBoards::BmcHpxx: return new BmcHpxx(); case UnifBoards::BmcNtd03: return new BmcNtd03(); case UnifBoards::Bs5: return new Bs5(); @@ -560,7 +562,7 @@ BaseMapper* MapperFactory::GetMapperFromID(RomData &romData) case UnifBoards::Eh8813A: return new Eh8813A(); case UnifBoards::Fk23C: return new MMC3_Fk23C(false); case UnifBoards::Fk23Ca: return new MMC3_Fk23C(true); - case UnifBoards::Ghostbusters63in1: return new Ghostbusters63in1(); + case UnifBoards::Ghostbusters63in1: return new Ghostbusters63in1(); case UnifBoards::Gs2004: return new Gs2004(); case UnifBoards::Gs2013: return new Gs2013(); case UnifBoards::Hp898f: return new Hp898f(); diff --git a/Core/UnifBoards.h b/Core/UnifBoards.h index 0eaea866..a402d720 100644 --- a/Core/UnifBoards.h +++ b/Core/UnifBoards.h @@ -69,5 +69,6 @@ namespace UnifBoards { Unl8237A, BmcHpxx, DragonFighter, + BmcGn45, }; } \ No newline at end of file diff --git a/Core/UnifLoader.cpp b/Core/UnifLoader.cpp index 44350e62..b82d691b 100644 --- a/Core/UnifLoader.cpp +++ b/Core/UnifLoader.cpp @@ -159,4 +159,5 @@ std::unordered_map UnifLoader::_boardMappings = std::unordered_map< { "WAIXING-FW01", 227 }, { "WAIXING-FS005", UnifBoards::UnknownBoard }, { "HPxx", UnifBoards::BmcHpxx }, + { "GN-45", UnifBoards::BmcGn45 }, //Doesn't actually exist as a UNIF file (used to assign a mapper to GN-45 boards) }; \ No newline at end of file diff --git a/GUI.NET/Dependencies/MesenDB.txt b/GUI.NET/Dependencies/MesenDB.txt index f24362ae..c80d3439 100644 --- a/GUI.NET/Dependencies/MesenDB.txt +++ b/GUI.NET/Dependencies/MesenDB.txt @@ -4,7 +4,7 @@ # # Automatically generated database based on Nestopia's DB and NesCartDB # -# Generated on 2018-04-16 using: +# Generated on 2018-06-22 using: # -NesCartDB (dated 2017-08-21) # -Nestopia UE's latest DB (dated 2015-10-22) # @@ -4893,7 +4893,7 @@ 5033AF84,NesNtsc,UNK,,,4,128,128,,0,0,0,h,,, 5034B399,NesNtsc,UNK,,,0,16,8,,0,0,0,h,,, 5034F443,NesNtsc,UNK,,,2,128,,,0,0,0,v,,, -503566B2,NesNtsc,UNK,,,205,512,512,,0,0,0,h,,, +503566B2,NesNtsc,BMC-GN-45,,,65000,512,512,,0,0,0,h,,, 503D9FA7,NesNtsc,UNK,,,4,128,128,,0,0,0,h,,, 5047CDB4,NesNtsc,UNK,,,1,128,128,,0,0,0,h,,, 504BDFB8,NesNtsc,UNK,,,4,256,128,,0,8,1,h,,, @@ -5514,6 +5514,7 @@ 5A9664D0,Famicom,,,,4,128,256,,0,0,0,,,, 5A9D96D3,NesNtsc,UNK,,,4,128,128,,0,0,0,h,,, 5A9EA721,NesNtsc,UNK,,,1,128,128,,0,0,0,h,,, +5AA23A15,NesNtsc,BMC-GN-45,,,65000,512,512,,0,0,0,h,,, 5AAA3239,NesNtsc,UNK,,,1,128,128,,0,0,0,h,,, 5AAC2B09,NesNtsc,UNK,,,4,256,128,,0,8,1,h,,, 5AAFFF2A,NesNtsc,UNK,,,4,128,160,,0,0,0,h,,, @@ -14977,7 +14978,7 @@ F6AB12A2,NesNtsc,UNK,,,1,128,128,,0,0,0,h,,, F6AF241B,NesNtsc,UNK,,,4,256,256,,0,8,1,h,,, F6B68541,NesNtsc,UNK,,,3,32,32,,0,0,0,v,,, F6B9799C,NesNtsc,NES-SNROM,NES-SNROM-05,MMC1B2,1,256,,8,0,8,1,,,, -F6B9D088,NesNtsc,UNK,,,205,512,512,,0,0,0,h,,, +F6B9D088,NesNtsc,BMC-GN-45,,,65000,512,512,,0,0,0,h,,, F6BB3AC2,NesNtsc,UNK,,,4,128,128,,0,0,0,v,,, F6BCA10F,NesNtsc,UNK,,,0,32,8,,0,0,0,v,,, F6BD8E31,NesNtsc,UNK,,,90,512,512,,0,0,0,h,,, diff --git a/Libretro/MesenDB.inc b/Libretro/MesenDB.inc index 6bd06781..e24b5196 100644 --- a/Libretro/MesenDB.inc +++ b/Libretro/MesenDB.inc @@ -4880,7 +4880,7 @@ "5033AF84,NesNtsc,UNK,,,4,128,128,,0,0,0,h,,,", "5034B399,NesNtsc,UNK,,,0,16,8,,0,0,0,h,,,", "5034F443,NesNtsc,UNK,,,2,128,,,0,0,0,v,,,", -"503566B2,NesNtsc,UNK,,,205,512,512,,0,0,0,h,,,", +"503566B2,NesNtsc,BMC-GN-45,,,65000,512,512,,0,0,0,h,,,", "503D9FA7,NesNtsc,UNK,,,4,128,128,,0,0,0,h,,,", "5047CDB4,NesNtsc,UNK,,,1,128,128,,0,0,0,h,,,", "504BDFB8,NesNtsc,UNK,,,4,256,128,,0,8,1,h,,,", @@ -5501,6 +5501,7 @@ "5A9664D0,Famicom,,,,4,128,256,,0,0,0,,,,", "5A9D96D3,NesNtsc,UNK,,,4,128,128,,0,0,0,h,,,", "5A9EA721,NesNtsc,UNK,,,1,128,128,,0,0,0,h,,,", +"5AA23A15,NesNtsc,BMC-GN-45,,,65000,512,512,,0,0,0,h,,,", "5AAA3239,NesNtsc,UNK,,,1,128,128,,0,0,0,h,,,", "5AAC2B09,NesNtsc,UNK,,,4,256,128,,0,8,1,h,,,", "5AAFFF2A,NesNtsc,UNK,,,4,128,160,,0,0,0,h,,,", @@ -14964,7 +14965,7 @@ "F6AF241B,NesNtsc,UNK,,,4,256,256,,0,8,1,h,,,", "F6B68541,NesNtsc,UNK,,,3,32,32,,0,0,0,v,,,", "F6B9799C,NesNtsc,NES-SNROM,NES-SNROM-05,MMC1B2,1,256,,8,0,8,1,,,,", -"F6B9D088,NesNtsc,UNK,,,205,512,512,,0,0,0,h,,,", +"F6B9D088,NesNtsc,BMC-GN-45,,,65000,512,512,,0,0,0,h,,,", "F6BB3AC2,NesNtsc,UNK,,,4,128,128,,0,0,0,v,,,", "F6BCA10F,NesNtsc,UNK,,,0,32,8,,0,0,0,v,,,", "F6BD8E31,NesNtsc,UNK,,,90,512,512,,0,0,0,h,,,",