AxibugEmuOnline/References/virtuanessrc097-master/NES/Mapper/Mapper105.cpp

135 lines
5.8 KiB
C++
Raw Normal View History

<EFBFBD><EFBFBD>//////////////////////////////////////////////////////////////////////////
// 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]);
}