AxibugEmuOnline/References/VirtuaNESex_src_191105/NES/Mapper/Mapper109.cpp

99 lines
1.8 KiB
C++
Raw Normal View History

2024-08-05 17:58:53 +08:00
//////////////////////////////////////////////////////////////////////////
// Mapper109 SACHEN The Great Wall SA-019 //
//////////////////////////////////////////////////////////////////////////
void Mapper109::Reset()
{
reg = 0;
SetPROM_32K_Bank( 0 );
chr0 = 0;
chr1 = 0;
chr2 = 0;
chr3 = 0;
SetBank_PPU();
chrmode0 = 0;
chrmode1 = 0;
}
void Mapper109::WriteLow( WORD addr, BYTE data )
{
switch( addr ) {
case 0x4100:
reg = data;
break;
case 0x4101:
switch( reg ) {
case 0:
chr0 = data;
SetBank_PPU();
break;
case 1:
chr1 = data;
SetBank_PPU();
break;
case 2:
chr2 = data;
SetBank_PPU();
break;
case 3:
chr3 = data;
SetBank_PPU();
break;
case 4:
chrmode0 = data & 0x01;
SetBank_PPU();
break;
case 5:
SetPROM_32K_Bank( data & 0x07 );
break;
case 6:
chrmode1 = data & 0x07;
SetBank_PPU();
break;
case 7:
if( data & 0x01 ) SetVRAM_Mirror( VRAM_HMIRROR );
else SetVRAM_Mirror( VRAM_VMIRROR );
break;
}
break;
}
}
void Mapper109::SetBank_PPU()
{
if( VROM_1K_SIZE ) {
SetVROM_1K_Bank( 0, chr0 );
SetVROM_1K_Bank( 1, chr1|((chrmode1<<3)&0x8) );
SetVROM_1K_Bank( 2, chr2|((chrmode1<<2)&0x8) );
SetVROM_1K_Bank( 3, chr3|((chrmode1<<1)&0x8) |(chrmode0*0x10) );
SetVROM_1K_Bank( 4, VROM_1K_SIZE-4 );
SetVROM_1K_Bank( 5, VROM_1K_SIZE-3 );
SetVROM_1K_Bank( 6, VROM_1K_SIZE-2 );
SetVROM_1K_Bank( 7, VROM_1K_SIZE-1 );
}
}
void Mapper109::SaveState( LPBYTE p )
{
p[ 0] = reg;
p[ 1] = chr0;
p[ 2] = chr1;
p[ 3] = chr2;
p[ 4] = chr3;
p[ 5] = chrmode0;
p[ 6] = chrmode1;
}
void Mapper109::LoadState( LPBYTE p )
{
reg = p[ 0];
chr0 = p[ 1];
chr1 = p[ 2];
chr2 = p[ 3];
chr3 = p[ 4];
chrmode0 = p[ 5];
chrmode1 = p[ 6];
}