diff --git a/Core/Core.vcxproj b/Core/Core.vcxproj index dde6b3fd..d8241ed8 100644 --- a/Core/Core.vcxproj +++ b/Core/Core.vcxproj @@ -439,6 +439,7 @@ + diff --git a/Core/Core.vcxproj.filters b/Core/Core.vcxproj.filters index ada49cfa..4274fa9d 100644 --- a/Core/Core.vcxproj.filters +++ b/Core/Core.vcxproj.filters @@ -1114,6 +1114,9 @@ Nes\Mappers + + Nes\Mappers\Unif + diff --git a/Core/Eh8813A.h b/Core/Eh8813A.h new file mode 100644 index 00000000..92d636e8 --- /dev/null +++ b/Core/Eh8813A.h @@ -0,0 +1,58 @@ +#pragma once +#include "stdafx.h" +#include "BaseMapper.h" + +class Eh8813A : public BaseMapper +{ +private: + uint8_t _dipSwitch; + bool _alterReadAddress; + +protected: + uint16_t GetPRGPageSize() override { return 0x4000; } + uint16_t GetCHRPageSize() override { return 0x2000; } + bool AllowRegisterRead() override { return true; } + + void InitMapper() override + { + _dipSwitch = -1; + SetMirroringType(MirroringType::Vertical); + } + + void Reset(bool softReset) override + { + WriteRegister(0x8000, 0); + _dipSwitch++; + _alterReadAddress = false; + } + + void StreamState(bool saving) override + { + BaseMapper::StreamState(saving); + Stream(_dipSwitch, _alterReadAddress); + } + + uint8_t ReadRegister(uint16_t addr) override + { + if(_alterReadAddress) { + addr = (addr & 0xFFF0) + _dipSwitch; + } + return InternalReadRam(addr); + } + + void WriteRegister(uint16_t addr, uint8_t value) override + { + if((addr & 0x0100) == 0) { + _alterReadAddress = (addr & 0x40) == 0x40; + + if(addr & 0x80) { + SelectPRGPage(0, addr & 0x07); + SelectPRGPage(1, addr & 0x07); + } else { + SelectPrgPage2x(0, addr & 0x06); + } + + SelectCHRPage(0, value & 0x0F); + } + } +}; \ No newline at end of file diff --git a/Core/MapperFactory.cpp b/Core/MapperFactory.cpp index d7fa8679..3dc99254 100644 --- a/Core/MapperFactory.cpp +++ b/Core/MapperFactory.cpp @@ -39,6 +39,7 @@ #include "DaouInfosys.h" #include "DreamTech01.h" #include "Edu2000.h" +#include "Eh8813A.h" #include "FDS.h" #include "FrontFareast.h" #include "Ghostbusters63in1.h" @@ -250,7 +251,7 @@ Supported mappers: |===|===|===|===|132|133|134|===|136|137|138|139|140|141|142|143| |144|145|146|147|148|149|150|151|152|153|154|155|156|157|???|159| |---|===|162|163|164|165|166|167|168|===|170|171|172|173|===|175| -|176|177|178|179|180|---|182|183|184|185|186|187|188|189|===|191| +|176|177|178|179|180|---|182|183|184|185|186|187|188|189|190|191| |192|193|194|195|196|197| |199|200|201|202|203|204|205|206|207| |???|209|210|211|212|213|214|215|216|217|218|219|220|221|222|???| |???|225|226|227|228|229|230|231|232|233|234|235|236|===|238|===| @@ -508,6 +509,7 @@ BaseMapper* MapperFactory::GetMapperFromID(RomData &romData) case UnifBoards::Coolboy: return new MMC3_Coolboy(); case UnifBoards::DreamTech01: return new DreamTech01(); case UnifBoards::Edu2000: return new Edu2000(); + case UnifBoards::Eh8813A: return new Eh8813A(); case UnifBoards::Ghostbusters63in1: return new Ghostbusters63in1(); case UnifBoards::Gs2004: return new Gs2004(); case UnifBoards::Gs2013: return new Gs2013(); diff --git a/Core/UnifBoards.h b/Core/UnifBoards.h index 3cde7ed3..a8a818b9 100644 --- a/Core/UnifBoards.h +++ b/Core/UnifBoards.h @@ -12,6 +12,7 @@ namespace UnifBoards { StreetHeroes, DreamTech01, Edu2000, + Eh8813A, Gs2013, Gs2004, NovelDiamond, diff --git a/Core/UnifLoader.h b/Core/UnifLoader.h index 26bd6be6..9938457b 100644 --- a/Core/UnifLoader.h +++ b/Core/UnifLoader.h @@ -153,7 +153,7 @@ private: { "SB-2000", UnifBoards::UnknownBoard }, { "158B", UnifBoards::UnknownBoard }, { "DRAGONFIGHTER", UnifBoards::UnknownBoard }, - { "EH8813A", UnifBoards::UnknownBoard }, + { "EH8813A", UnifBoards::Eh8813A }, { "HP898F", UnifBoards::Hp898f }, { "F-15", UnifBoards::BmcF15 }, { "RT-01", UnifBoards::Rt01 },