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 },