AxibugEmuOnline/References/VirtuaNESex_src_191105/NES/Mapper/Mapper051.cpp
2024-08-05 17:58:53 +08:00

80 lines
1.8 KiB
C++

//////////////////////////////////////////////////////////////////////////
// Mapper051 11-in-1 //
//////////////////////////////////////////////////////////////////////////
void Mapper051::Reset()
{
bank = 0;
mode = 1;
SetBank_CPU();
SetCRAM_8K_Bank( 0 );
}
void Mapper051::WriteLow( WORD addr, BYTE data )
{
if( addr>=0x6000 ) {
mode = ((data & 0x10) >> 3) | ((data & 0x02) >> 1);
SetBank_CPU();
}
}
void Mapper051::Write( WORD addr, BYTE data )
{
bank = (data & 0x0f) << 2;
if( 0xC000 <= addr && addr <= 0xDFFF ) {
mode = (mode & 0x01) | ((data & 0x10) >> 3);
}
SetBank_CPU();
}
void Mapper051::SetBank_CPU()
{
switch(mode) {
case 0:
SetVRAM_Mirror( VRAM_VMIRROR );
SetPROM_8K_Bank( 3, (bank|0x2c|3) );
SetPROM_8K_Bank( 4, (bank|0x00|0) );
SetPROM_8K_Bank( 5, (bank|0x00|1) );
SetPROM_8K_Bank( 6, (bank|0x0c|2) );
SetPROM_8K_Bank( 7, (bank|0x0c|3) );
break;
case 1:
SetVRAM_Mirror( VRAM_VMIRROR );
SetPROM_8K_Bank( 3, (bank|0x20|3) );
SetPROM_8K_Bank( 4, (bank|0x00|0) );
SetPROM_8K_Bank( 5, (bank|0x00|1) );
SetPROM_8K_Bank( 6, (bank|0x00|2) );
SetPROM_8K_Bank( 7, (bank|0x00|3) );
break;
case 2:
SetVRAM_Mirror( VRAM_VMIRROR );
SetPROM_8K_Bank( 3, (bank|0x2e|3) );
SetPROM_8K_Bank( 4, (bank|0x02|0) );
SetPROM_8K_Bank( 5, (bank|0x02|1) );
SetPROM_8K_Bank( 6, (bank|0x0e|2) );
SetPROM_8K_Bank( 7, (bank|0x0e|3) );
break;
case 3:
SetVRAM_Mirror( VRAM_HMIRROR );
SetPROM_8K_Bank( 3, (bank|0x20|3) );
SetPROM_8K_Bank( 4, (bank|0x00|0) );
SetPROM_8K_Bank( 5, (bank|0x00|1) );
SetPROM_8K_Bank( 6, (bank|0x00|2) );
SetPROM_8K_Bank( 7, (bank|0x00|3) );
break;
}
}
void Mapper051::SaveState( LPBYTE p )
{
p[ 0] = mode;
p[ 1] = bank;
}
void Mapper051::LoadState( LPBYTE p )
{
mode = p[ 0];
bank = p[ 1];
}