diff --git a/Core/Core.vcxproj b/Core/Core.vcxproj
index cbb5ee0a..867a9974 100644
--- a/Core/Core.vcxproj
+++ b/Core/Core.vcxproj
@@ -458,6 +458,7 @@
+
diff --git a/Core/Core.vcxproj.filters b/Core/Core.vcxproj.filters
index a8e239b3..bc7429a5 100644
--- a/Core/Core.vcxproj.filters
+++ b/Core/Core.vcxproj.filters
@@ -868,6 +868,9 @@
Nes\Mappers\Unnamed
+
+ Nes\Mappers\Unnamed
+
diff --git a/Core/Mapper222.h b/Core/Mapper222.h
new file mode 100644
index 00000000..cb060c2c
--- /dev/null
+++ b/Core/Mapper222.h
@@ -0,0 +1,83 @@
+#pragma once
+#include "stdafx.h"
+#include "BaseMapper.h"
+#include "PPU.h"
+#include "CPU.h"
+
+class Mapper222 : public BaseMapper
+{
+private:
+ uint16_t _irqCounter;
+ uint32_t _cyclesDown;
+ uint32_t _lastCycle;
+
+protected:
+ virtual uint16_t GetPRGPageSize() { return 0x2000; }
+ virtual uint16_t GetCHRPageSize() { return 0x400; }
+
+ void InitMapper()
+ {
+ _irqCounter = 0;
+ _cyclesDown = 0;
+ _lastCycle = 0;
+
+ SelectPrgPage2x(1, -2);
+ }
+
+ void StreamState(bool saving)
+ {
+ BaseMapper::StreamState(saving);
+ Stream(_irqCounter, _cyclesDown, _lastCycle);
+ }
+
+ virtual void NotifyVRAMAddressChange(uint16_t addr)
+ {
+ uint32_t cycle = PPU::GetFrameCycle();
+
+ if((addr & 0x1000) == 0) {
+ if(_cyclesDown == 0) {
+ _cyclesDown = 1;
+ } else {
+ if(_lastCycle > cycle) {
+ //We changed frames
+ _cyclesDown += (89342 - _lastCycle) + cycle;
+ } else {
+ _cyclesDown += (cycle - _lastCycle);
+ }
+ }
+ } else if(addr & 0x1000) {
+ if(_cyclesDown > 8) {
+ if(_irqCounter) {
+ _irqCounter++;
+ if(_irqCounter >= 240) {
+ CPU::SetIRQSource(IRQSource::External);
+ _irqCounter = 0;
+ }
+ }
+ }
+ _cyclesDown = 0;
+ }
+ _lastCycle = cycle;
+ }
+
+ void WriteRegister(uint16_t addr, uint8_t value)
+ {
+ switch(addr & 0xF003) {
+ case 0x8000: SelectPRGPage(0, value); break;
+ case 0x9000: SetMirroringType(value & 0x01 ? MirroringType::Horizontal : MirroringType::Vertical); break;
+ case 0xA000: SelectPRGPage(1, value); break;
+ case 0xB000: SelectCHRPage(0, value); break;
+ case 0xB002: SelectCHRPage(1, value); break;
+ case 0xC000: SelectCHRPage(2, value); break;
+ case 0xC002: SelectCHRPage(3, value); break;
+ case 0xD000: SelectCHRPage(4, value); break;
+ case 0xD002: SelectCHRPage(5, value); break;
+ case 0xE000: SelectCHRPage(6, value); break;
+ case 0xE002: SelectCHRPage(7, value); break;
+ case 0xF000:
+ _irqCounter = value;
+ CPU::ClearIRQSource(IRQSource::External);
+ break;
+ }
+ }
+};
\ No newline at end of file
diff --git a/Core/MapperFactory.cpp b/Core/MapperFactory.cpp
index 5abf0b72..592ebb84 100644
--- a/Core/MapperFactory.cpp
+++ b/Core/MapperFactory.cpp
@@ -63,6 +63,7 @@
#include "Mapper212.h"
#include "Mapper218.h"
#include "Mapper221.h"
+#include "Mapper222.h"
#include "Mapper225.h"
#include "Mapper226.h"
#include "Mapper227.h"
@@ -181,7 +182,7 @@ Supported mappers:
| |===| |163|164|165|166|167|168|===|170|171|172|173|===|175|
|176|177|178|179|180| |182| |184|185| |187|188|189|===|191|
|192|193|194|195| |197| | |200|201|202|203| |205|206|207|
-| |209|210|211|212| | | | | |218| | |221| | |
+| |209|210|211|212| | | | | |218| | |221|222| |
| |225|226|227|228|229|230|231|232|233|234|235| |===|238|===|
|240|241|242|243|244|245|246|===|===|249|250|===|252| |254| |
-----------------------------------------------------------------
@@ -368,6 +369,7 @@ BaseMapper* MapperFactory::GetMapperFromID(RomData &romData)
case 212: return new Mapper212();
case 218: return new Mapper218();
case 221: return new Mapper221();
+ case 222: return new Mapper222();
case 225: return new Mapper225();
case 226: return new Mapper226();
case 227: return new Mapper227();