AxibugEmuOnline/References/VirtuaNESex_src_191105/NES/Mapper/BoardDragonFighter.cpp
2024-08-05 17:58:53 +08:00

115 lines
2.3 KiB
C++

//////////////////////////////////////////////////////////////////////////
// BoardDragonFighter //
//////////////////////////////////////////////////////////////////////////
void BoardDragonFighter::Reset()
{
chr0 = chr1 = 0;
reg[0] = reg[1] = 0;
irq_enable = 0;
irq_counter = 0;
irq_latch = 0;
irq_request = 0;
SetPROM_32K_Bank( 0, PROM_8K_SIZE-1, PROM_8K_SIZE-2, PROM_8K_SIZE-1 );
SetVROM_8K_Bank( 0 );
}
BYTE BoardDragonFighter::ReadLow( WORD addr )
{
switch( addr ) {
case 0x6000:
SetVROM_4K_Bank( 4, RAM[0xFF]&0x3F );
break;
case 0x6002:
SetVROM_4K_Bank( 4, RAM[0xFF]&0x3F );
if(chr0){
if(RAM[0x4F]==RAM[0x6A])
SetVROM_2K_Bank( 0, ((reg[1]>>1)^RAM[0x4F]) );
else
SetVROM_2K_Bank( 0, ((reg[1]>>1)^RAM[0x4F]) + 0x80 );
}
chr0 = 0;
break;
case 0x6004:
if(chr1)
SetVROM_2K_Bank( 2, (reg[1]>>1) + (RAM[0xFF]&0x40)*2 );
chr1 = 0;
break;
}
if(addr>=0x6000) return CPU_MEM_BANK[addr>>13][addr&0x1FFF];
return Mapper::ReadLow( addr );
}
void BoardDragonFighter::Write( WORD addr, BYTE data )
{
switch( addr & 0xE001 ) {
case 0x8000:
reg[0] = data;
break;
case 0x8001:
reg[1] = data;
switch( reg[0] & 0x07 ) {
case 0x00:
chr0 = 1;
if((addr&0xF000)==0x9000){
SetVROM_2K_Bank( 0, reg[1]>>1 );
chr0 = 0;
}
break;
case 0x01:
chr1 = 1;
break;
case 0x06:
SetPROM_8K_Bank( 4, reg[1] );
break;
case 0x07:
SetPROM_8K_Bank( 5, reg[1] );
break;
}
break;
case 0xA000:
if(data&0x01) SetVRAM_Mirror( VRAM_HMIRROR );
else SetVRAM_Mirror( VRAM_VMIRROR );
break;
case 0xC000:
irq_counter = data;
irq_request = 0;
break;
case 0xC001:
irq_latch = data;
irq_request = 0;
break;
case 0xE000:
irq_enable = 0;
irq_request = 0;
nes->cpu->ClrIRQ( IRQ_MAPPER );
break;
case 0xE001:
irq_enable = 1;
irq_request = 0;
break;
}
}
void BoardDragonFighter::HSync(int scanline)
{
if( (scanline >= 0 && scanline <= 239) ) {
if( nes->ppu->IsDispON() ) {
if( irq_enable && !irq_request ) {
if( scanline == 0 ) {
if( irq_counter ) {
irq_counter -= 1;
}
}
if(!(irq_counter)){
irq_request = 0xFF;
irq_counter = irq_latch;
nes->cpu->SetIRQ( IRQ_MAPPER );
}
irq_counter--;
}
}
}
}