135 lines
5.8 KiB
C++
135 lines
5.8 KiB
C++
//////////////////////////////////////////////////////////////////////////
|
||
// Mapper105 Nintendo World Championship //
|
||
//////////////////////////////////////////////////////////////////////////
|
||
|
||
void Mapper105::Reset()
|
||
{
|
||
SetPROM_32K_Bank( 0 );
|
||
|
||
reg[0] = 0x0C;
|
||
reg[1] = 0x00;
|
||
reg[2] = 0x00;
|
||
reg[3] = 0x10;
|
||
|
||
bits = 0;
|
||
write_count = 0;
|
||
|
||
irq_counter = 0;
|
||
irq_enable = 0;
|
||
init_state = 0;
|
||
}
|
||
|
||
void Mapper105::Write( WORD addr, BYTE data )
|
||
{
|
||
WORD reg_num = (addr & 0x7FFF) >> 13;
|
||
|
||
if( data & 0x80 ) {
|
||
bits = write_count = 0;
|
||
if( reg_num == 0 ) {
|
||
reg[reg_num] |= 0x0C;
|
||
}
|
||
} else {
|
||
bits |= (data & 1) << write_count++;
|
||
if( write_count == 5) {
|
||
reg[reg_num] = bits & 0x1F;
|
||
bits = write_count = 0;
|
||
}
|
||
}
|
||
|
||
if( reg[0] & 0x02 ) {
|
||
if( reg[0] & 0x01 ) {
|
||
SetVRAM_Mirror( VRAM_HMIRROR );
|
||
} else {
|
||
SetVRAM_Mirror( VRAM_VMIRROR );
|
||
}
|
||
} else {
|
||
if( reg[0] & 0x01 ) {
|
||
SetVRAM_Mirror( VRAM_MIRROR4H );
|
||
} else {
|
||
SetVRAM_Mirror( VRAM_MIRROR4L );
|
||
}
|
||
}
|
||
|
||
switch( init_state ) {
|
||
case 0:
|
||
case 1:
|
||
init_state++;
|
||
break;
|
||
case 2:
|
||
if(reg[1] & 0x08) {
|
||
if (reg[0] & 0x08) {
|
||
if (reg[0] & 0x04) {
|
||
SetPROM_8K_Bank(4,((reg[3] & 0x07) * 2 + 16));
|
||
SetPROM_8K_Bank(5,((reg[3] & 0x07) * 2 + 17));
|
||
SetPROM_8K_Bank(6,30);
|
||
SetPROM_8K_Bank(7,31);
|
||
} else {
|
||
SetPROM_8K_Bank(4,16);
|
||
SetPROM_8K_Bank(5,17);
|
||
SetPROM_8K_Bank(6,((reg[3] & 0x07) * 2 + 16));
|
||
SetPROM_8K_Bank(7,((reg[3] & 0x07) * 2 + 17));
|
||
}
|
||
} else {
|
||
SetPROM_8K_Bank(4,((reg[3] & 0x06) * 2 + 16));
|
||
SetPROM_8K_Bank(5,((reg[3] & 0x06) * 2 + 17));
|
||
SetPROM_8K_Bank(6,((reg[3] & 0x06) * 2 + 18));
|
||
SetPROM_8K_Bank(7,((reg[3] & 0x06) * 2 + 19));
|
||
}
|
||
} else {
|
||
SetPROM_8K_Bank(4,((reg[1] & 0x06) * 2 + 0));
|
||
SetPROM_8K_Bank(5,((reg[1] & 0x06) * 2 + 1));
|
||
SetPROM_8K_Bank(6,((reg[1] & 0x06) * 2 + 2));
|
||
SetPROM_8K_Bank(7,((reg[1] & 0x06) * 2 + 3));
|
||
}
|
||
|
||
if( reg[1] & 0x10 ) {
|
||
irq_counter = 0;
|
||
irq_enable = 0;
|
||
} else {
|
||
irq_enable = 1;
|
||
}
|
||
// nes->cpu->ClrIRQ( IRQ_MAPPER );
|
||
break;
|
||
default:
|
||
break;
|
||
}
|
||
}
|
||
|
||
void Mapper105::HSync( INT scanline )
|
||
{
|
||
if( !scanline ) {
|
||
if( irq_enable ) {
|
||
irq_counter += 29781;
|
||
}
|
||
if( ((irq_counter | 0x21FFFFFF) & 0x3E000000) == 0x3E000000 ) {
|
||
// nes->cpu->IRQ_NotPending();
|
||
// nes->cpu->SetIRQ( IRQ_MAPPER );
|
||
nes->cpu->SetIRQ( IRQ_TRIGGER2 );
|
||
}
|
||
}
|
||
}
|
||
|
||
void Mapper105::SaveState( LPBYTE p )
|
||
{
|
||
for( INT i = 0; i < 4; i++ ) {
|
||
p[i] = reg[i];
|
||
}
|
||
p[ 8] = init_state;
|
||
p[ 9] = write_count;
|
||
p[10] = bits;
|
||
p[11] = irq_enable;
|
||
*((INT*)&p[12]) = irq_counter;
|
||
}
|
||
|
||
void Mapper105::LoadState( LPBYTE p )
|
||
{
|
||
for( INT i = 0; i < 4; i++ ) {
|
||
reg[i] = p[i];
|
||
}
|
||
init_state = p[ 8];
|
||
write_count = p[ 9];
|
||
bits = p[10];
|
||
irq_enable = p[11];
|
||
irq_counter = *((INT*)&p[12]);
|
||
}
|