From 0f894584aa2c5dfa9c9c037f3d00c3dc0507da8d Mon Sep 17 00:00:00 2001 From: Souryo Date: Fri, 21 Apr 2017 10:13:29 -0400 Subject: [PATCH] Mapper 111 support (missing flashing support) --- Core/Cheapocabra.h | 65 +++++++++++++++++++++++++++++++++++++++ Core/Core.vcxproj | 1 + Core/Core.vcxproj.filters | 9 ++++-- Core/MapperFactory.cpp | 4 ++- 4 files changed, 75 insertions(+), 4 deletions(-) create mode 100644 Core/Cheapocabra.h diff --git a/Core/Cheapocabra.h b/Core/Cheapocabra.h new file mode 100644 index 00000000..cc2dee4a --- /dev/null +++ b/Core/Cheapocabra.h @@ -0,0 +1,65 @@ +#pragma once +#include "stdafx.h" +#include "BaseMapper.h" + +//Missing Flash rom support, and only tested via a test rom +class Cheapocabra : public BaseMapper +{ +private: + uint8_t _reg; + uint8_t* _extraNametables[4]; + +protected: + virtual uint16_t GetPRGPageSize() override { return 0x8000; } + virtual uint16_t GetCHRPageSize() override { return 0x2000; } + virtual uint16_t RegisterStartAddress() override { return 0x5000; } + virtual uint16_t RegisterEndAddress() override { return 0x5FFF; } + virtual uint32_t GetChrRamSize() override { return 0x8000; } + + void InitMapper() override + { + AddRegisterRange(0x7000, 0x7FFF, MemoryOperation::Write); + for(int i = 0; i < 4; i++) { + _extraNametables[i] = new uint8_t[0x400]; + BaseMapper::InitializeRam(_extraNametables[i], 0x400); + AddNametable(4 + i, _extraNametables[i]); + } + _reg = 0; + UpdateState(); + } + + virtual ~Cheapocabra() + { + delete[] _extraNametables[0]; + delete[] _extraNametables[1]; + delete[] _extraNametables[2]; + delete[] _extraNametables[3]; + } + + void StreamState(bool saving) override + { + BaseMapper::StreamState(saving); + ArrayInfo extraNametable0{ _extraNametables[0], 0x400 }; + ArrayInfo extraNametable1{ _extraNametables[1], 0x400 }; + ArrayInfo extraNametable2{ _extraNametables[2], 0x400 }; + ArrayInfo extraNametable3{ _extraNametables[3], 0x400 }; + Stream(_reg, extraNametable0, extraNametable1, extraNametable2, extraNametable3); + } + + void UpdateState() + { + SelectPRGPage(0, _reg & 0x0F); + SelectCHRPage(0, (_reg >> 4) & 0x01); + if(_reg & 0x20) { + SetNametables(4, 5, 6, 7); + } else { + SetNametables(0, 1, 2, 3); + } + } + + void WriteRegister(uint16_t addr, uint8_t value) override + { + _reg = value; + UpdateState(); + } +}; \ No newline at end of file diff --git a/Core/Core.vcxproj b/Core/Core.vcxproj index c1148297..5927b628 100644 --- a/Core/Core.vcxproj +++ b/Core/Core.vcxproj @@ -440,6 +440,7 @@ + diff --git a/Core/Core.vcxproj.filters b/Core/Core.vcxproj.filters index 0c28090f..ffe5ead2 100644 --- a/Core/Core.vcxproj.filters +++ b/Core/Core.vcxproj.filters @@ -1144,6 +1144,9 @@ Movies + + Nes\Mappers + @@ -1323,9 +1326,6 @@ Debugger - - Misc - Nes\APU\Filters @@ -1350,5 +1350,8 @@ Movies + + Debugger + \ No newline at end of file diff --git a/Core/MapperFactory.cpp b/Core/MapperFactory.cpp index 99b4ab73..ef0f1bed 100644 --- a/Core/MapperFactory.cpp +++ b/Core/MapperFactory.cpp @@ -32,6 +32,7 @@ #include "Bs5.h" #include "Caltron41.h" #include "Cc21.h" +#include "Cheapocabra.h" #include "CNROM.h" #include "CpRom.h" #include "ColorDreams.h" @@ -251,7 +252,7 @@ Supported mappers: | 48| 49| 50| 51| 52| 53| 54|???| 56| 57| 58|===| 60| 61| 62| 63| | 64| 65| 66| 67| 68| 69| 70| 71| 72| 73| 74| 75| 76| 77| 78| 79| | 80|===| 82| 83|===| 85| 86| 87| 88| 89| 90| 91| 92| 93| 94| 95| -| 96| 97|===| 99|...|101|===|103|104|105|106|107|108|===|===|===| +| 96| 97|===| 99|...|101|===|103|104|105|106|107|108|===|===|111| |112|113|114|115| |117|118|119|120|121|===|123|===|125|126|===| |===|===|===|===|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| @@ -374,6 +375,7 @@ BaseMapper* MapperFactory::GetMapperFromID(RomData &romData) case 106: return new Mapper106(); case 107: return new Mapper107(); case 108: return new Mapper108(); + case 111: return new Cheapocabra(); case 112: return new Mapper112(); case 113: return new Nina03_06(true); case 114: return new MMC3_114();