forked from sin365/AxibugEmuOnline
130 lines
5.3 KiB
C++
130 lines
5.3 KiB
C++
//////////////////////////////////////////////////////////////////////////
|
||
// Mapper068 SunSoft (After Burner II) //
|
||
//////////////////////////////////////////////////////////////////////////
|
||
void Mapper068::Reset()
|
||
{
|
||
reg[0] = reg[1] = reg[2] = reg[3] = 0;
|
||
coin = 0;
|
||
|
||
SetPROM_32K_Bank( 0, 1, PROM_8K_SIZE-2, PROM_8K_SIZE-1 );
|
||
}
|
||
|
||
#if 0
|
||
BYTE Mapper068::ExRead( WORD addr )
|
||
{
|
||
if( addr == 0x4020 ) {
|
||
DEBUGOUT( "RD $4020:%02X\n", coin );
|
||
return coin;
|
||
}
|
||
|
||
return addr>>8;
|
||
}
|
||
|
||
void Mapper068::ExWrite( WORD addr, BYTE data )
|
||
{
|
||
if( addr == 0x4020 ) {
|
||
DEBUGOUT( "WR $4020:%02X\n", data );
|
||
coin = data;
|
||
}
|
||
}
|
||
#endif
|
||
|
||
void Mapper068::Write( WORD addr, BYTE data )
|
||
{
|
||
switch( addr & 0xF000 ) {
|
||
case 0x8000:
|
||
SetVROM_2K_Bank( 0, data );
|
||
break;
|
||
case 0x9000:
|
||
SetVROM_2K_Bank( 2, data );
|
||
break;
|
||
case 0xA000:
|
||
SetVROM_2K_Bank( 4, data );
|
||
break;
|
||
case 0xB000:
|
||
SetVROM_2K_Bank( 6, data );
|
||
break;
|
||
|
||
case 0xC000:
|
||
reg[2] = data;
|
||
SetBank();
|
||
break;
|
||
case 0xD000:
|
||
reg[3] = data;
|
||
SetBank();
|
||
break;
|
||
case 0xE000:
|
||
reg[0] = (data & 0x10)>>4;
|
||
reg[1] = data & 0x03;
|
||
SetBank();
|
||
break;
|
||
|
||
case 0xF000:
|
||
SetPROM_16K_Bank( 4, data );
|
||
break;
|
||
}
|
||
}
|
||
|
||
void Mapper068::SetBank()
|
||
{
|
||
if( reg[0] ) {
|
||
switch( reg[1] ) {
|
||
case 0:
|
||
SetVROM_1K_Bank( 8, (INT)reg[2]+0x80 );
|
||
SetVROM_1K_Bank( 9, (INT)reg[3]+0x80 );
|
||
SetVROM_1K_Bank( 10, (INT)reg[2]+0x80 );
|
||
SetVROM_1K_Bank( 11, (INT)reg[3]+0x80 );
|
||
break;
|
||
case 1:
|
||
SetVROM_1K_Bank( 8, (INT)reg[2]+0x80 );
|
||
SetVROM_1K_Bank( 9, (INT)reg[2]+0x80 );
|
||
SetVROM_1K_Bank( 10, (INT)reg[3]+0x80 );
|
||
SetVROM_1K_Bank( 11, (INT)reg[3]+0x80 );
|
||
break;
|
||
case 2:
|
||
SetVROM_1K_Bank( 8, (INT)reg[2]+0x80 );
|
||
SetVROM_1K_Bank( 9, (INT)reg[2]+0x80 );
|
||
SetVROM_1K_Bank( 10, (INT)reg[2]+0x80 );
|
||
SetVROM_1K_Bank( 11, (INT)reg[2]+0x80 );
|
||
break;
|
||
case 3:
|
||
SetVROM_1K_Bank( 8, (INT)reg[3]+0x80 );
|
||
SetVROM_1K_Bank( 9, (INT)reg[3]+0x80 );
|
||
SetVROM_1K_Bank( 10, (INT)reg[3]+0x80 );
|
||
SetVROM_1K_Bank( 11, (INT)reg[3]+0x80 );
|
||
break;
|
||
}
|
||
} else {
|
||
switch( reg[1] ) {
|
||
case 0:
|
||
SetVRAM_Mirror( VRAM_VMIRROR );
|
||
break;
|
||
case 1:
|
||
SetVRAM_Mirror( VRAM_HMIRROR );
|
||
break;
|
||
case 2:
|
||
SetVRAM_Mirror( VRAM_MIRROR4L );
|
||
break;
|
||
case 3:
|
||
SetVRAM_Mirror( VRAM_MIRROR4H );
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
|
||
void Mapper068::SaveState( LPBYTE p )
|
||
{
|
||
p[0] = reg[0];
|
||
p[1] = reg[1];
|
||
p[2] = reg[2];
|
||
p[3] = reg[3];
|
||
}
|
||
|
||
void Mapper068::LoadState( LPBYTE p )
|
||
{
|
||
reg[0] = p[0];
|
||
reg[1] = p[1];
|
||
reg[2] = p[2];
|
||
reg[3] = p[3];
|
||
}
|