Files
player/Project/Src/NES/mapper/051.cpp

79 lines
1.8 KiB
C++
Raw Normal View History

2025-06-27 00:32:57 +08:00
/////////////////////////////////////////////////////////////////////
// Mapper 51
void NES_mapper51::Reset()
{
bank = 0;
mode = 1;
Sync_Prg_Banks();
parent_NES->ppu->vram_write_protect = 0;
}
void NES_mapper51::MemoryWriteSaveRAM(uint32 addr, uint8 data)
{
mode = ((data & 0x10) >> 3) | ((data & 0x02) >> 1);
Sync_Prg_Banks();
}
void NES_mapper51::MemoryWrite(uint32 addr, uint8 data)
{
bank = (data & 0x0f) << 2;
if(0xC000 <= addr && addr <= 0xDFFF)
{
mode = (mode & 0x01) | ((data & 0x10) >> 3);
}
Sync_Prg_Banks();
}
void NES_mapper51::Sync_Prg_Banks()
{
switch(mode)
{
case 0:
{
set_mirroring(NES_PPU::MIRROR_VERT);
set_CPU_bank3(bank | 0x2c | 3);
set_CPU_bank4(bank | 0x00 | 0);
set_CPU_bank5(bank | 0x00 | 1);
set_CPU_bank6(bank | 0x0c | 2);
set_CPU_bank7(bank | 0x0c | 3);
}
break;
case 1:
{
set_mirroring(NES_PPU::MIRROR_VERT);
set_CPU_bank3(bank | 0x20 | 3);
set_CPU_bank4(bank | 0x00 | 0);
set_CPU_bank5(bank | 0x00 | 1);
set_CPU_bank6(bank | 0x00 | 2);
set_CPU_bank7(bank | 0x00 | 3);
}
break;
case 2:
{
set_mirroring(NES_PPU::MIRROR_VERT);
set_CPU_bank3(bank | 0x2e | 3);
set_CPU_bank4(bank | 0x02 | 0);
set_CPU_bank5(bank | 0x02 | 1);
set_CPU_bank6(bank | 0x0e | 2);
set_CPU_bank7(bank | 0x0e | 3);
}
break;
case 3:
{
set_mirroring(NES_PPU::MIRROR_HORIZ);
set_CPU_bank3(bank | 0x20 | 3);
set_CPU_bank4(bank | 0x00 | 0);
set_CPU_bank5(bank | 0x00 | 1);
set_CPU_bank6(bank | 0x00 | 2);
set_CPU_bank7(bank | 0x00 | 3);
}
break;
}
}
/////////////////////////////////////////////////////////////////////