forked from sin365/AxibugEmuOnline
154 lines
5.2 KiB
C++
154 lines
5.2 KiB
C++
//////////////////////////////////////////////////////////////////////////
|
||
// Mapper165 Fire Emblem Chinese version //
|
||
//////////////////////////////////////////////////////////////////////////
|
||
void Mapper165::Reset()
|
||
{
|
||
for( INT i = 0; i < 8; i++ ) {
|
||
reg[i] = 0x00;
|
||
}
|
||
prg0 = 0;
|
||
prg1 = 1;
|
||
SetBank_CPU();
|
||
|
||
chr0 = 0;
|
||
chr1 = 0;
|
||
chr2 = 4;
|
||
chr3 = 4;
|
||
latch = 0xFD;
|
||
SetBank_PPU();
|
||
|
||
we_sram = 0; // Disable
|
||
|
||
nes->ppu->SetChrLatchMode( TRUE );
|
||
}
|
||
|
||
void Mapper165::Write( WORD addr, BYTE data )
|
||
{
|
||
|
||
switch( addr & 0xE001 ) {
|
||
case 0x8000:
|
||
reg[0] = data;
|
||
SetBank_CPU();
|
||
SetBank_PPU();
|
||
break;
|
||
case 0x8001:
|
||
reg[1] = data;
|
||
|
||
switch( reg[0] & 0x07 ) {
|
||
case 0x00:
|
||
chr0 = data & 0xFC;
|
||
if( latch == 0xFD )
|
||
SetBank_PPU();
|
||
break;
|
||
case 0x01:
|
||
chr1 = data & 0xFC;
|
||
if( latch == 0xFE )
|
||
SetBank_PPU();
|
||
break;
|
||
|
||
case 0x02:
|
||
chr2 = data & 0xFC;
|
||
if( latch == 0xFD )
|
||
SetBank_PPU();
|
||
break;
|
||
case 0x04:
|
||
chr3 = data & 0xFC;
|
||
if( latch == 0xFE )
|
||
SetBank_PPU();
|
||
break;
|
||
|
||
case 0x06:
|
||
prg0 = data;
|
||
SetBank_CPU();
|
||
break;
|
||
case 0x07:
|
||
prg1 = data;
|
||
SetBank_CPU();
|
||
break;
|
||
}
|
||
break;
|
||
case 0xA000:
|
||
reg[2] = data;
|
||
if( data & 0x01 )
|
||
{
|
||
SetVRAM_Mirror( VRAM_HMIRROR );
|
||
}else{
|
||
SetVRAM_Mirror( VRAM_VMIRROR );
|
||
}
|
||
break;
|
||
case 0xA001:
|
||
reg[3] = data;
|
||
break;
|
||
default:
|
||
break;
|
||
}
|
||
|
||
}
|
||
|
||
void Mapper165::SetBank_CPU()
|
||
{
|
||
SetPROM_32K_Bank( prg0, prg1, PROM_8K_SIZE-2, PROM_8K_SIZE-1 );
|
||
}
|
||
|
||
void Mapper165::SetBank_PPU()
|
||
{
|
||
if(latch==0xFD){
|
||
SetBank_PPUSUB( 0, chr0 );
|
||
SetBank_PPUSUB( 4, chr2 );
|
||
}else{
|
||
SetBank_PPUSUB( 0, chr1 );
|
||
SetBank_PPUSUB( 4, chr3 );
|
||
}
|
||
}
|
||
|
||
void Mapper165::SetBank_PPUSUB( int bank, int page )
|
||
{
|
||
if( page == 0 ) {
|
||
SetCRAM_4K_Bank( bank, page>>2 );
|
||
} else {
|
||
SetVROM_4K_Bank( bank, page>>2 );
|
||
}
|
||
}
|
||
|
||
void Mapper165::PPU_ChrLatch( WORD addr )
|
||
{
|
||
WORD mask = addr&0x1FF0;
|
||
|
||
if( mask == 0x1FD0 ) {
|
||
latch = 0xFD;
|
||
SetBank_PPU();
|
||
} else if( mask == 0x1FE0 ) {
|
||
latch = 0xFE;
|
||
SetBank_PPU();
|
||
}
|
||
|
||
}
|
||
|
||
void Mapper165::SaveState( LPBYTE p )
|
||
{
|
||
for( INT i = 0; i < 8; i++ ) {
|
||
p[i] = reg[i];
|
||
}
|
||
p[ 8] = prg0;
|
||
p[ 9] = prg1;
|
||
p[10] = chr0;
|
||
p[11] = chr1;
|
||
p[12] = chr2;
|
||
p[13] = chr3;
|
||
p[14] = latch;
|
||
}
|
||
|
||
void Mapper165::LoadState( LPBYTE p )
|
||
{
|
||
for( INT i = 0; i < 8; i++ ) {
|
||
reg[i] = p[i];
|
||
}
|
||
prg0 = p[ 8];
|
||
prg1 = p[ 9];
|
||
chr0 = p[10];
|
||
chr1 = p[11];
|
||
chr2 = p[12];
|
||
chr3 = p[13];
|
||
latch = p[14];
|
||
}
|