//////////////////////////////////////////////////////////////////////////
// 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--;
			}
		}
	}
}