diff --git a/Core/Core.vcxproj b/Core/Core.vcxproj
index d1811eae..54f4583e 100644
--- a/Core/Core.vcxproj
+++ b/Core/Core.vcxproj
@@ -533,6 +533,7 @@
+
diff --git a/Core/Core.vcxproj.filters b/Core/Core.vcxproj.filters
index d3d06573..72748664 100644
--- a/Core/Core.vcxproj.filters
+++ b/Core/Core.vcxproj.filters
@@ -1402,6 +1402,9 @@
Nes\Mappers\Unif
+
+ Nes\Mappers\Unif
+
diff --git a/Core/Kaiser7031.h b/Core/Kaiser7031.h
new file mode 100644
index 00000000..07fa4bf0
--- /dev/null
+++ b/Core/Kaiser7031.h
@@ -0,0 +1,47 @@
+#pragma once
+#include "stdafx.h"
+#include "BaseMapper.h"
+
+class Kaiser7031 : public BaseMapper
+{
+private:
+ uint8_t _regs[4];
+
+protected:
+ uint16_t GetPRGPageSize() override { return 0x800; }
+ uint16_t GetCHRPageSize() override { return 0x2000; }
+
+ void InitMapper() override
+ {
+ SetMirroringType(MirroringType::Vertical);
+ memset(_regs, 0, sizeof(_regs));
+ for(int i = 0; i < 16; i++) {
+ SelectPRGPage(i, 15 - i);
+ }
+ SelectCHRPage(0, 0);
+ UpdateState();
+ }
+
+ void StreamState(bool saving) override
+ {
+ BaseMapper::StreamState(saving);
+ Stream(_regs[0], _regs[1], _regs[2], _regs[3]);
+
+ if(!saving) {
+ UpdateState();
+ }
+ }
+
+ void UpdateState()
+ {
+ for(int i = 0; i < 4; i++) {
+ SetCpuMemoryMapping(0x6000 + i * 0x800, 0x67FF + i * 0x800, _regs[i], PrgMemoryType::PrgRom);
+ }
+ }
+
+ void WriteRegister(uint16_t addr, uint8_t value) override
+ {
+ _regs[(addr >> 11) & 0x03] = value;
+ UpdateState();
+ }
+};
\ No newline at end of file
diff --git a/Core/MapperFactory.cpp b/Core/MapperFactory.cpp
index c4007b68..d58ac712 100644
--- a/Core/MapperFactory.cpp
+++ b/Core/MapperFactory.cpp
@@ -74,6 +74,7 @@
#include "Kaiser7016.h"
#include "Kaiser7017.h"
#include "Kaiser7022.h"
+#include "Kaiser7031.h"
#include "Kaiser7037.h"
#include "Kaiser7057.h"
#include "Kaiser7058.h"
@@ -556,6 +557,7 @@ BaseMapper* MapperFactory::GetMapperFromID(RomData &romData)
case UnifBoards::Ks7013B: return new Kaiser7013B();
case UnifBoards::Ks7016: return new Kaiser7016();
case UnifBoards::Ks7017: return new Kaiser7017();
+ case UnifBoards::Ks7031: return new Kaiser7031();
case UnifBoards::Ks7037: return new Kaiser7037();
case UnifBoards::Ks7057: return new Kaiser7057();
case UnifBoards::Lh10: return new Lh10();
diff --git a/Core/UnifBoards.h b/Core/UnifBoards.h
index d8dd10f9..e126c4c5 100644
--- a/Core/UnifBoards.h
+++ b/Core/UnifBoards.h
@@ -43,12 +43,13 @@ namespace UnifBoards {
Bmc8in1,
BmcF15,
Lh10,
+ Ks7012,
+ Ks7013B,
+ Ks7016,
+ Ks7017,
+ Ks7031,
Ks7037,
Ks7057,
- Ks7017,
- Ks7016,
- Ks7013B,
- Ks7012,
MaliSB,
Unl43272,
Bmc411120C,
diff --git a/Core/UnifLoader.cpp b/Core/UnifLoader.cpp
index 19a42dc6..b47e9aaa 100644
--- a/Core/UnifLoader.cpp
+++ b/Core/UnifLoader.cpp
@@ -60,7 +60,7 @@ std::unordered_map UnifLoader::_boardMappings = std::unordered_map<
{ "KS7016", UnifBoards::Ks7016 },
{ "KS7017", UnifBoards::Ks7017 },
{ "KS7030", UnifBoards::UnknownBoard },
- { "KS7031", UnifBoards::UnknownBoard },
+ { "KS7031", UnifBoards::Ks7031 },
{ "KS7032", 142 },
{ "KS7037", UnifBoards::Ks7037 },
{ "KS7057", UnifBoards::Ks7057 },