diff --git a/Core/Core.vcxproj b/Core/Core.vcxproj index 1282b93d..f89c06d6 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 190d4263..641c6981 100644 --- a/Core/Core.vcxproj.filters +++ b/Core/Core.vcxproj.filters @@ -419,6 +419,9 @@ Nes\Mappers + + Nes\Mappers + diff --git a/Core/MMC3_49.h b/Core/MMC3_49.h new file mode 100644 index 00000000..04bf40ed --- /dev/null +++ b/Core/MMC3_49.h @@ -0,0 +1,63 @@ +#pragma once +#include "stdafx.h" +#include "MMC3.h" + +class MMC3_49 : public MMC3 +{ +private: + uint8_t _selectedBlock = 0; + uint8_t _prgReg = 0; + uint8_t _prgMode = 0; + +protected: + virtual uint16_t RegisterStartAddress() { return 0x6000; } + virtual uint16_t RegisterEndAddress() { return 0xFFFF; } + + virtual void StreamState(bool saving) + { + Stream(_selectedBlock); + Stream(_prgReg); + Stream(_prgMode); + MMC3::StreamState(saving); + } + + virtual void Reset(bool softReset) + { + _prgReg = 0; + _prgMode = false; + _selectedBlock = 0; + UpdateState(); + } + + virtual void SelectCHRPage(uint16_t slot, uint16_t page, ChrMemoryType memoryType = ChrMemoryType::Default) + { + page &= 0x7F; + page |= 0x80 * _selectedBlock; + MMC3::SelectCHRPage(slot, page, memoryType); + } + + virtual void SelectPRGPage(uint16_t slot, uint16_t page, PrgMemoryType memoryType = PrgMemoryType::PrgRom) + { + if(_prgMode) { + page &= 0x0F; + page |= 0x10 * _selectedBlock; + } else { + page = _prgReg * 4 + slot; + } + MMC3::SelectPRGPage(slot, page, memoryType); + } + + void WriteRegister(uint16_t addr, uint8_t value) + { + if(addr < 0x8000) { + if(CanWriteToWorkRam()) { + _selectedBlock = (value >> 6) & 0x03; + _prgReg = (value >> 4) & 0x03; + _prgMode = value & 0x01; + UpdateState(); + } + } else { + MMC3::WriteRegister(addr, value); + } + } +}; \ No newline at end of file diff --git a/Core/MapperFactory.cpp b/Core/MapperFactory.cpp index add13099..05036f93 100644 --- a/Core/MapperFactory.cpp +++ b/Core/MapperFactory.cpp @@ -35,6 +35,7 @@ #include "MMC3_37.h" #include "MMC3_44.h" #include "MMC3_47.h" +#include "MMC3_49.h" #include "MMC3_115.h" #include "MMC3_189.h" #include "MMC3_205.h" @@ -101,6 +102,7 @@ BaseMapper* MapperFactory::GetMapperFromID(ROMLoader &romLoader) case 38: return new UnlPci556(); case 44: return new MMC3_44(); case 47: return new MMC3_47(); + case 49: return new MMC3_49(); case 58: return new Mapper58(); case 66: return new GxRom(); case 70: return new Bandai74161_7432(false);