diff --git a/Core/Core.vcxproj b/Core/Core.vcxproj
index 72745b29..e80612e7 100644
--- a/Core/Core.vcxproj
+++ b/Core/Core.vcxproj
@@ -386,6 +386,7 @@
+
diff --git a/Core/Core.vcxproj.filters b/Core/Core.vcxproj.filters
index 7b313d1b..1f4950e6 100644
--- a/Core/Core.vcxproj.filters
+++ b/Core/Core.vcxproj.filters
@@ -376,5 +376,8 @@
Source Files
+
+ Header Files\Mappers
+
\ No newline at end of file
diff --git a/Core/MapperFactory.cpp b/Core/MapperFactory.cpp
index e69ca3bb..775ce225 100644
--- a/Core/MapperFactory.cpp
+++ b/Core/MapperFactory.cpp
@@ -27,6 +27,7 @@
#include "TaitoX1005.h"
#include "UnlPci556.h"
#include "UNROM.h"
+#include "VRC1.h"
#include "VRC2_4.h"
#include "BF909x.h"
@@ -64,6 +65,7 @@ BaseMapper* MapperFactory::GetMapperFromID(uint8_t mapperID)
case 66: return new GxRom();
case 70: return new Bandai74161_7432(false);
case 71: return new BF909x();
+ case 75: return new VRC1();
case 79: return new Nina03_06();
case 80: return new TaitoX1005();
case 87: return new JalecoJfxx(false);
diff --git a/Core/VRC1.h b/Core/VRC1.h
new file mode 100644
index 00000000..9e44c76b
--- /dev/null
+++ b/Core/VRC1.h
@@ -0,0 +1,60 @@
+#pragma once
+#include "stdafx.h"
+#include "BaseMapper.h"
+
+class VRC1 : public BaseMapper
+{
+private:
+ uint8_t _chrBanks[2];
+
+ void UpdateChrBanks()
+ {
+ SelectCHRPage(0, _chrBanks[0]);
+ SelectCHRPage(1, _chrBanks[1]);
+ }
+
+protected:
+ virtual uint16_t GetPRGPageSize() { return 0x2000; }
+ virtual uint16_t GetCHRPageSize() { return 0x1000; }
+
+ void InitMapper()
+ {
+ SelectPRGPage(3, -1);
+ }
+
+ virtual void StreamState(bool saving)
+ {
+ BaseMapper::StreamState(saving);
+ StreamArray(_chrBanks, 2);
+ }
+
+ void WriteRegister(uint16_t addr, uint8_t value)
+ {
+ switch(addr & 0xF000) {
+ case 0x8000: SelectPRGPage(0, value & 0x0F); break;
+
+ case 0x9000:
+ if(GetMirroringType() != MirroringType::FourScreens) {
+ //"The mirroring bit is ignored if the cartridge is wired for 4-screen VRAM, as is typical for Vs. System games using the VRC1."
+ SetMirroringType((value & 0x01) == 0x01 ? MirroringType::Horizontal : MirroringType::Vertical);
+ }
+ _chrBanks[0] = (_chrBanks[0] & 0x0F) | ((value & 0x02) << 3);
+ _chrBanks[1] = (_chrBanks[1] & 0x0F) | ((value & 0x04) << 2);
+ UpdateChrBanks();
+ break;
+
+ case 0xA000: SelectPRGPage(1, value & 0x0F); break;
+ case 0xC000: SelectPRGPage(2, value & 0x0F); break;
+
+ case 0xE000:
+ _chrBanks[0] = (_chrBanks[0] & 0x10) | (value & 0x0F);
+ UpdateChrBanks();
+ break;
+
+ case 0xF000:
+ _chrBanks[1] = (_chrBanks[1] & 0x10) | (value & 0x0F);
+ UpdateChrBanks();
+ break;
+ }
+ }
+};
\ No newline at end of file