diff --git a/Core/Core.vcxproj b/Core/Core.vcxproj
index 1e194ec5..2400b2b8 100644
--- a/Core/Core.vcxproj
+++ b/Core/Core.vcxproj
@@ -534,6 +534,7 @@
+
diff --git a/Core/Core.vcxproj.filters b/Core/Core.vcxproj.filters
index 0389378f..a622b9f4 100644
--- a/Core/Core.vcxproj.filters
+++ b/Core/Core.vcxproj.filters
@@ -1384,6 +1384,9 @@
Nes\Mappers\Unif
+
+ Nes\Mappers\Sachen
+
diff --git a/Core/MapperFactory.cpp b/Core/MapperFactory.cpp
index c73f09d8..f8602807 100644
--- a/Core/MapperFactory.cpp
+++ b/Core/MapperFactory.cpp
@@ -204,6 +204,7 @@
#include "Sachen74LS374N.h"
#include "Sachen74LS374NB.h"
#include "Sachen8259.h"
+#include "Sachen9602.h"
#include "SealieComputing.h"
#include "Smb2j.h"
#include "StudyBox.h"
@@ -553,6 +554,7 @@ BaseMapper* MapperFactory::GetMapperFromID(RomData &romData)
case UnifBoards::MaliSB: return new MMC3_MaliSB();
case UnifBoards::NovelDiamond: return new NovelDiamond();
case UnifBoards::Rt01: return new Rt01();
+ case UnifBoards::Sachen9602: return new Sachen9602();
case UnifBoards::Smb2j: return new Smb2j();
case UnifBoards::StreetHeroes: return new MMC3_StreetHeroes();
case UnifBoards::Super24in1Sc03: return new MMC3_Super24in1Sc03();
diff --git a/Core/Sachen9602.h b/Core/Sachen9602.h
new file mode 100644
index 00000000..49821647
--- /dev/null
+++ b/Core/Sachen9602.h
@@ -0,0 +1,50 @@
+#pragma once
+#include "stdafx.h"
+#include "MMC3.h"
+
+class Sachen9602 : public MMC3
+{
+private:
+ uint8_t _regs[2];
+
+protected:
+ bool ForceChrBattery() override { return true; }
+ uint32_t GetChrRamSize() override { return 0x8000; }
+
+ void InitMapper() override
+ {
+ _regs[0] = _regs[1] = 0;
+ MMC3::InitMapper();
+ }
+
+ void StreamState(bool saving) override
+ {
+ MMC3::StreamState(saving);
+ Stream(_regs[0], _regs[1]);
+ }
+
+ void SelectPRGPage(uint16_t slot, uint16_t page, PrgMemoryType memoryType = PrgMemoryType::PrgRom) override
+ {
+ MMC3::SelectPRGPage(slot, (page & 0x3F) | (_regs[1] << 6));
+ MMC3::SelectPRGPage(_prgMode ? 0 : 2, 0x3E);
+ MMC3::SelectPRGPage(3, 0x3F);
+ }
+
+ void WriteRegister(uint16_t addr, uint8_t value) override
+ {
+ switch(addr & 0xE001) {
+ case 0x8000:
+ _regs[0] = value;
+ break;
+
+ case 0x8001:
+ if((_regs[0] & 0x07) < 6) {
+ _regs[1] = value >> 6;
+ value &= 0x1F;
+ UpdatePrgMapping();
+ }
+ break;
+ }
+ MMC3::WriteRegister(addr, value);
+ }
+};
\ No newline at end of file
diff --git a/Core/UnifBoards.h b/Core/UnifBoards.h
index 7cd07753..1a830658 100644
--- a/Core/UnifBoards.h
+++ b/Core/UnifBoards.h
@@ -56,5 +56,6 @@ namespace UnifBoards {
Fk23Ca,
Unl255in1,
UnlD1038,
+ Sachen9602,
};
}
\ No newline at end of file
diff --git a/Core/UnifLoader.cpp b/Core/UnifLoader.cpp
index 7bcc6789..5f9a91a8 100644
--- a/Core/UnifLoader.cpp
+++ b/Core/UnifLoader.cpp
@@ -91,7 +91,7 @@ std::unordered_map UnifLoader::_boardMappings = std::unordered_map<
{ "SA-016-1M", 146 },
{ "SA-72007", 145 },
{ "SA-72008", 133 },
- { "SA-9602B", UnifBoards::UnknownBoard },
+ { "SA-9602B", UnifBoards::Sachen9602 },
{ "SA-NROM", 143 },
{ "SAROM", 1 },
{ "SBROM", 1 },