Skip to content
This repository has been archived by the owner on Sep 11, 2023. It is now read-only.

add some mmc3-based mappers #82

Merged
merged 22 commits into from
Mar 21, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 21 additions & 0 deletions Core/Core.vcxproj
Original file line number Diff line number Diff line change
Expand Up @@ -796,8 +796,29 @@
<ClInclude Include="MMC3_249.h" />
<ClInclude Include="MMC3_250.h" />
<ClInclude Include="MMC3_254.h" />
<ClInclude Include="MMC3_267.h" />
<ClInclude Include="MMC3_45.h" />
<ClInclude Include="MMC3_334.h" />
<ClInclude Include="MMC3_353.h" />
<ClInclude Include="MMC3_364.h" />
<ClInclude Include="MMC3_370.h" />
<ClInclude Include="MMC3_372.h" />
<ClInclude Include="MMC3_376.h" />
<ClInclude Include="MMC3_377.h" />
<ClInclude Include="MMC3_383.h" />
<ClInclude Include="MMC3_391.h" />
<ClInclude Include="MMC3_393.h" />
<ClInclude Include="MMC3_395.h" />
<ClInclude Include="MMC3_401.h" />
<ClInclude Include="MMC3_410.h" />
<ClInclude Include="MMC3_411.h" />
<ClInclude Include="MMC3_412.h" />
<ClInclude Include="MMC3_422.h" />
<ClInclude Include="MMC3_430.h" />
<ClInclude Include="MMC3_432.h" />
<ClInclude Include="MMC3_441.h" />
<ClInclude Include="MMC3_444.h" />
<ClInclude Include="MMC3_445.h" />
<ClInclude Include="MMC3_534.h" />
<ClInclude Include="Mapper57.h" />
<ClInclude Include="Mapper61.h" />
Expand Down
63 changes: 63 additions & 0 deletions Core/Core.vcxproj.filters
Original file line number Diff line number Diff line change
Expand Up @@ -1459,6 +1459,69 @@
<ClInclude Include="MMC3_224.h">
<Filter>Nes\Mappers\MMC</Filter>
</ClInclude>
<ClInclude Include="MMC3_334.h">
<Filter>Nes\Mappers\MMC</Filter>
</ClInclude>
<ClInclude Include="MMC3_353.h">
<Filter>Nes\Mappers\MMC</Filter>
</ClInclude>
<ClInclude Include="MMC3_364.h">
<Filter>Nes\Mappers\MMC</Filter>
</ClInclude>
<ClInclude Include="MMC3_370.h">
<Filter>Nes\Mappers\MMC</Filter>
</ClInclude>
<ClInclude Include="MMC3_372.h">
<Filter>Nes\Mappers\MMC</Filter>
</ClInclude>
<ClInclude Include="MMC3_383.h">
<Filter>Nes\Mappers\MMC</Filter>
</ClInclude>
<ClInclude Include="MMC3_391.h">
<Filter>Nes\Mappers\MMC</Filter>
</ClInclude>
<ClInclude Include="MMC3_393.h">
<Filter>Nes\Mappers\MMC</Filter>
</ClInclude>
<ClInclude Include="MMC3_395.h">
<Filter>Nes\Mappers\MMC</Filter>
</ClInclude>
<ClInclude Include="MMC3_401.h">
<Filter>Nes\Mappers\MMC</Filter>
</ClInclude>
<ClInclude Include="MMC3_410.h">
<Filter>Nes\Mappers\MMC</Filter>
</ClInclude>
<ClInclude Include="MMC3_411.h">
<Filter>Nes\Mappers\MMC</Filter>
</ClInclude>
<ClInclude Include="MMC3_412.h">
<Filter>Nes\Mappers\MMC</Filter>
</ClInclude>
<ClInclude Include="MMC3_267.h">
<Filter>Nes\Mappers\MMC</Filter>
</ClInclude>
<ClInclude Include="MMC3_430.h">
<Filter>Nes\Mappers\MMC</Filter>
</ClInclude>
<ClInclude Include="MMC3_376.h">
<Filter>Nes\Mappers\MMC</Filter>
</ClInclude>
<ClInclude Include="MMC3_377.h">
<Filter>Nes\Mappers\MMC</Filter>
</ClInclude>
<ClInclude Include="MMC3_432.h">
<Filter>Nes\Mappers\MMC</Filter>
</ClInclude>
<ClInclude Include="MMC3_441.h">
<Filter>Nes\Mappers\MMC</Filter>
</ClInclude>
<ClInclude Include="MMC3_444.h">
<Filter>Nes\Mappers\MMC</Filter>
</ClInclude>
<ClInclude Include="MMC3_445.h">
<Filter>Nes\Mappers\MMC</Filter>
</ClInclude>
<ClInclude Include="FamicomBox.h">
<Filter>Nes\Mappers\Unif</Filter>
</ClInclude>
Expand Down
52 changes: 52 additions & 0 deletions Core/MMC3_267.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
#pragma once
#include "stdafx.h"
#include "MMC3.h"

class MMC3_267 : public MMC3
{
private:
uint8_t _outerBank = 0;

protected:
virtual uint16_t RegisterStartAddress() override { return 0x6000; }
virtual uint16_t RegisterEndAddress() override { return 0xFFFF; }

virtual void Reset(bool softreset) override
{
_outerBank = 0;
MMC3::UpdateState();
}

virtual void StreamState(bool saving) override
{
MMC3::StreamState(saving);
Stream(_outerBank);
}

virtual void SelectCHRPage(uint16_t slot, uint16_t page, ChrMemoryType memoryType = ChrMemoryType::Default) override
{
page &= 0x7F;
page |= (((_outerBank >> 2) & 0x08) | (_outerBank & 0x06)) << 6;
MMC3::SelectCHRPage(slot, page, memoryType);
}

virtual void SelectPRGPage(uint16_t slot, uint16_t page, PrgMemoryType memoryType = PrgMemoryType::PrgRom) override
{
page &= 0x1F;
page |= (((_outerBank >> 2) & 0x08) | (_outerBank & 0x06)) << 4;
MMC3::SelectPRGPage(slot, page, memoryType);
}

void WriteRegister(uint16_t addr, uint8_t value) override
{
if(addr < 0x8000) {
if(!(_outerBank & 0x80)) {
_outerBank = value;
MMC3::UpdatePrgMapping();
MMC3::UpdateChrMapping();
}
} else {
MMC3::WriteRegister(addr, value);
}
}
};
45 changes: 45 additions & 0 deletions Core/MMC3_334.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
#pragma once
#include "MMC3.h"

class MMC3_334 : public MMC3
{
protected:
uint32_t GetDipSwitchCount() override { return 1; }
bool AllowRegisterRead() override { return true; }

void InitMapper() override
{
MMC3::InitMapper();
SelectPrgPage4x(0, -4);
SelectChrPage8x(0, 0);
AddRegisterRange(0x6000, 0x7FFF, MemoryOperation::Any);
RemoveRegisterRange(0x8000, 0xFFFF, MemoryOperation::Read);
}

void UpdatePrgMapping() override
{
}

uint8_t ReadRegister(uint16_t addr) override
{
uint8_t value = _console->GetMemoryManager()->GetOpenBus();

if(addr & 0x02) {
value &= ~0x01;
value |= GetDipSwitches() & 0x01;
}

return value;
}

void WriteRegister(uint16_t addr, uint8_t value) override
{
if(addr < 0x8000) {
if(!(addr & 0x01)) {
SelectPrgPage4x(0, (value & 0xFE) << 1);
}
} else {
MMC3::WriteRegister(addr, value);
}
}
};
94 changes: 94 additions & 0 deletions Core/MMC3_353.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
#pragma once
#include "MMC3.h"

class MMC3_353 : public MMC3
{
protected:
uint16_t GetChrRamPageSize() override { return 0x2000; }
uint32_t GetChrRamSize() override { return 0x2000; }

uint8_t _exReg;

void InitMapper() override
{
_exReg = 0;
MMC3::InitMapper();
}

void Reset(bool softreset)
{
_exReg = 0;
MMC3::UpdateState();
}

void UpdateMirroring() override
{
if(!(_exReg == 0)) {
MMC3::UpdateMirroring();
}
}

void SelectCHRPage(uint16_t slot, uint16_t page, ChrMemoryType memoryType) override
{
if((_exReg == 2) && (MMC3::_registers[0] & 0x80)) {
MMC3::SelectChrPage8x(0, 0, ChrMemoryType::ChrRam);
} else {
MMC3::SelectCHRPage(slot, (_exReg << 7) | (page & 0x7F), memoryType);
}
}

void SelectPRGPage(uint16_t slot, uint16_t page, PrgMemoryType memoryType = PrgMemoryType::PrgRom) override
{
if(_exReg == 2) {
page &= 0x0F;
page |= ((MMC3::_registers[0] >> 3) & 0x10);
page |= (_exReg << 5);
} else {
page &= 0x1F;
page |= (_exReg << 5);
}

MMC3::SelectPRGPage(slot, page);

if((_exReg == 3) && !(MMC3::_registers[0] & 0x80)) {
MMC3::SelectPRGPage(2, MMC3::_registers[6] | 0x70);
MMC3::SelectPRGPage(3, MMC3::_registers[7] | 0x70);
}
}

void WriteRegister(uint16_t addr, uint8_t value) override
{
if((addr & 0x80) == 0x80) {
_exReg = (addr >> 13) & 0x03;
UpdatePrgMapping();
UpdateChrMapping();
} else {
if((_exReg == 0) && (addr & 0xE001) == 0x8001) {
uint8_t nametable = value >> 7;

if(GetChrMode() == 0) {
switch(GetCurrentRegister()) {
case 0:
SetNametable(0, nametable);
SetNametable(1, nametable);
break;

case 1:
SetNametable(2, nametable);
SetNametable(3, nametable);
break;
}
} else {
switch(GetCurrentRegister()) {
case 2: SetNametable(0, nametable); break;
case 3: SetNametable(1, nametable); break;
case 4: SetNametable(2, nametable); break;
case 5: SetNametable(3, nametable); break;
}
}
}

MMC3::WriteRegister(addr, value);
}
}
};
38 changes: 38 additions & 0 deletions Core/MMC3_364.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
#pragma once
#include "MMC3.h"

class MMC3_364 : public MMC3
{
protected:
uint8_t _exReg;

void InitMapper() override
{
_exReg = 0;
MMC3::InitMapper();
AddRegisterRange(0x7000, 0x7FFF, MemoryOperation::Write);
}

void SelectCHRPage(uint16_t slot, uint16_t page, ChrMemoryType memoryType) override
{
uint8_t mask = (_exReg & 0x20) ? 0x7F : 0xFF;
MMC3::SelectCHRPage(slot, ((_exReg << 4) & 0x100) | (page & mask));
}

void SelectPRGPage(uint16_t slot, uint16_t page, PrgMemoryType memoryType = PrgMemoryType::PrgRom) override
{
uint8_t mask = (_exReg & 0x20) ? 0x0F : 0x1F;
MMC3::SelectPRGPage(slot, ((_exReg >> 1) & 0x20) | (page & mask));
}

void WriteRegister(uint16_t addr, uint8_t value) override
{
if(addr <= 0x7FFF) {
_exReg = value;
UpdatePrgMapping();
UpdateChrMapping();
} else {
MMC3::WriteRegister(addr, value);
}
}
};
Loading