diff --git a/Core/Core.vcxproj b/Core/Core.vcxproj index 72745b29..e80612e7 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 7b313d1b..1f4950e6 100644 --- a/Core/Core.vcxproj.filters +++ b/Core/Core.vcxproj.filters @@ -376,5 +376,8 @@ Source Files + + Header Files\Mappers + \ No newline at end of file diff --git a/Core/MapperFactory.cpp b/Core/MapperFactory.cpp index e69ca3bb..775ce225 100644 --- a/Core/MapperFactory.cpp +++ b/Core/MapperFactory.cpp @@ -27,6 +27,7 @@ #include "TaitoX1005.h" #include "UnlPci556.h" #include "UNROM.h" +#include "VRC1.h" #include "VRC2_4.h" #include "BF909x.h" @@ -64,6 +65,7 @@ BaseMapper* MapperFactory::GetMapperFromID(uint8_t mapperID) case 66: return new GxRom(); case 70: return new Bandai74161_7432(false); case 71: return new BF909x(); + case 75: return new VRC1(); case 79: return new Nina03_06(); case 80: return new TaitoX1005(); case 87: return new JalecoJfxx(false); diff --git a/Core/VRC1.h b/Core/VRC1.h new file mode 100644 index 00000000..9e44c76b --- /dev/null +++ b/Core/VRC1.h @@ -0,0 +1,60 @@ +#pragma once +#include "stdafx.h" +#include "BaseMapper.h" + +class VRC1 : public BaseMapper +{ +private: + uint8_t _chrBanks[2]; + + void UpdateChrBanks() + { + SelectCHRPage(0, _chrBanks[0]); + SelectCHRPage(1, _chrBanks[1]); + } + +protected: + virtual uint16_t GetPRGPageSize() { return 0x2000; } + virtual uint16_t GetCHRPageSize() { return 0x1000; } + + void InitMapper() + { + SelectPRGPage(3, -1); + } + + virtual void StreamState(bool saving) + { + BaseMapper::StreamState(saving); + StreamArray(_chrBanks, 2); + } + + void WriteRegister(uint16_t addr, uint8_t value) + { + switch(addr & 0xF000) { + case 0x8000: SelectPRGPage(0, value & 0x0F); break; + + case 0x9000: + if(GetMirroringType() != MirroringType::FourScreens) { + //"The mirroring bit is ignored if the cartridge is wired for 4-screen VRAM, as is typical for Vs. System games using the VRC1." + SetMirroringType((value & 0x01) == 0x01 ? MirroringType::Horizontal : MirroringType::Vertical); + } + _chrBanks[0] = (_chrBanks[0] & 0x0F) | ((value & 0x02) << 3); + _chrBanks[1] = (_chrBanks[1] & 0x0F) | ((value & 0x04) << 2); + UpdateChrBanks(); + break; + + case 0xA000: SelectPRGPage(1, value & 0x0F); break; + case 0xC000: SelectPRGPage(2, value & 0x0F); break; + + case 0xE000: + _chrBanks[0] = (_chrBanks[0] & 0x10) | (value & 0x0F); + UpdateChrBanks(); + break; + + case 0xF000: + _chrBanks[1] = (_chrBanks[1] & 0x10) | (value & 0x0F); + UpdateChrBanks(); + break; + } + } +}; \ No newline at end of file