135 lines
2.8 KiB
C++
135 lines
2.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]);
|
|
}
|