diff --git a/Core/Core.vcxproj b/Core/Core.vcxproj
index a57cbae9..d5f24ab3 100644
--- a/Core/Core.vcxproj
+++ b/Core/Core.vcxproj
@@ -372,6 +372,7 @@
+
diff --git a/Core/Core.vcxproj.filters b/Core/Core.vcxproj.filters
index 4f2a4fff..a60d5cd8 100644
--- a/Core/Core.vcxproj.filters
+++ b/Core/Core.vcxproj.filters
@@ -380,6 +380,9 @@
Nes\Mappers
+
+ Nes\Mappers
+
diff --git a/Core/Mapper58.h b/Core/Mapper58.h
new file mode 100644
index 00000000..93d19a94
--- /dev/null
+++ b/Core/Mapper58.h
@@ -0,0 +1,32 @@
+#pragma once
+#include "stdafx.h"
+#include "BaseMapper.h"
+
+class Mapper58 : public BaseMapper
+{
+protected:
+ virtual uint16_t GetPRGPageSize() { return 0x4000; }
+ virtual uint16_t GetCHRPageSize() { return 0x2000; }
+
+ void InitMapper()
+ {
+ SelectPRGPage(0, 0);
+ SelectPRGPage(1, 1);
+ SelectCHRPage(0, 0);
+ }
+
+ void WriteRegister(uint16_t addr, uint8_t value)
+ {
+ uint8_t prgBank = addr & 0x07;
+ if(addr & 0x40) {
+ SelectPRGPage(0, prgBank);
+ SelectPRGPage(1, prgBank);
+ } else {
+ SelectPRGPage(0, prgBank & 0xFE);
+ SelectPRGPage(1, (prgBank & 0xFE) + 1);
+ }
+ SelectCHRPage(0, (addr >> 3) & 0x07);
+
+ SetMirroringType(addr & 0x80 ? MirroringType::Horizontal : MirroringType::Vertical);
+ }
+};
diff --git a/Core/MapperFactory.cpp b/Core/MapperFactory.cpp
index 946e58f5..658f01e4 100644
--- a/Core/MapperFactory.cpp
+++ b/Core/MapperFactory.cpp
@@ -15,6 +15,7 @@
#include "IremTamS1.h"
#include "JalecoJfxx.h"
#include "JalecoSs88006.h"
+#include "Mapper58.h"
#include "Mapper200.h"
#include "Mapper231.h"
#include "Mapper240.h"
@@ -85,6 +86,7 @@ BaseMapper* MapperFactory::GetMapperFromID(ROMLoader &romLoader)
case 34: return (romLoader.GetChrSize() > 0) ? (BaseMapper*)new Nina01() : (BaseMapper*)new BnRom(); //BnROM uses CHR RAM (so no CHR rom in the .NES file)
case 37: break;
case 38: return new UnlPci556();
+ case 58: return new Mapper58();
case 66: return new GxRom();
case 70: return new Bandai74161_7432(false);
case 71: return new BF909x();