From 366d4aec808e291a875351e0d2dedc8c58bc0796 Mon Sep 17 00:00:00 2001 From: Souryo Date: Mon, 4 Aug 2014 15:55:20 -0400 Subject: [PATCH] Mapper 189 support --- Core/Core.vcxproj | 1 + Core/Core.vcxproj.filters | 3 +++ Core/MMC3.h | 8 +++++--- Core/MMC3_189.h | 41 +++++++++++++++++++++++++++++++++++++++ Core/MapperFactory.cpp | 2 ++ 5 files changed, 52 insertions(+), 3 deletions(-) create mode 100644 Core/MMC3_189.h diff --git a/Core/Core.vcxproj b/Core/Core.vcxproj index 3687eaa2..729ca40e 100644 --- a/Core/Core.vcxproj +++ b/Core/Core.vcxproj @@ -112,6 +112,7 @@ + diff --git a/Core/Core.vcxproj.filters b/Core/Core.vcxproj.filters index 8107ea53..614876d1 100644 --- a/Core/Core.vcxproj.filters +++ b/Core/Core.vcxproj.filters @@ -188,6 +188,9 @@ Header Files\Mappers + + Header Files\Mappers + diff --git a/Core/MMC3.h b/Core/MMC3.h index f1484c5c..4b304afc 100644 --- a/Core/MMC3.h +++ b/Core/MMC3.h @@ -1,3 +1,5 @@ +#pragma once + #include "stdafx.h" #include "BaseMapper.h" #include "CPU.h" @@ -61,7 +63,8 @@ class MMC3 : public BaseMapper _wramWriteProtected = false; } - void UpdateState() + protected: + virtual void UpdateState() { _currentRegister = _state.Reg8000 & 0x07; _chrMode = (_state.Reg8000 & 0x80) >> 7; @@ -110,8 +113,7 @@ class MMC3 : public BaseMapper } - protected: - void StreamState(bool saving) + virtual void StreamState(bool saving) { Stream(_state.Reg8000); Stream(_state.RegA000); diff --git a/Core/MMC3_189.h b/Core/MMC3_189.h new file mode 100644 index 00000000..c42c28d4 --- /dev/null +++ b/Core/MMC3_189.h @@ -0,0 +1,41 @@ +#pragma once + +#include "stdafx.h" +#include "MMC3.h" + +class MMC3_189 : public MMC3 +{ +private: + uint8_t _prgReg = 0; + + virtual uint16_t RegisterStartAddress() { return 0x4120; } + + virtual void WriteRegister(uint16_t addr, uint8_t value) + { + if(addr <= 0x4FFF) { + _prgReg = value; + UpdateState(); + } else { + MMC3::WriteRegister(addr, value); + } + } + + virtual void UpdateState() + { + MMC3::UpdateState(); + + //"$4120-7FFF: [AAAA BBBB]" + //" 'A' and 'B' bits of the $4120 reg seem to be effectively OR'd." + uint8_t prgPage = (((_prgReg) | (_prgReg >> 4)) & 0x07) * 4; + SelectPRGPage(0, prgPage); + SelectPRGPage(1, prgPage+1); + SelectPRGPage(2, prgPage+2); + SelectPRGPage(3, prgPage+3); + } + + virtual void StreamState(bool saving) + { + MMC3::StreamState(saving); + Stream(_prgReg); + } +}; \ No newline at end of file diff --git a/Core/MapperFactory.cpp b/Core/MapperFactory.cpp index d8f35f7e..bd41ce61 100644 --- a/Core/MapperFactory.cpp +++ b/Core/MapperFactory.cpp @@ -9,6 +9,7 @@ #include "MMC1.h" #include "MMC2.h" #include "MMC3.h" +#include "MMC3_189.h" #include "Nanjing.h" #include "NROM.h" #include "UNROM.h" @@ -35,6 +36,7 @@ BaseMapper* MapperFactory::GetMapperFromID(uint8_t mapperID) case 27: return new VRC2_4(VRCVariant::VRC4_27); //Untested case 71: return new UNROM(); //TODO: "It's largely a clone of UNROM, and Camerica games were initially emulated under iNES Mapper 002 before 071 was assigned." case 163: return new Nanjing(); + case 189: return new MMC3_189(); default: Console::DisplayMessage(L"Unsupported mapper, cannot load file."); }