//////////////////////////////////////////////////////////////////////////
// Mapper243  PC-Sachen/Hacker                                          //
//////////////////////////////////////////////////////////////////////////
void	Mapper243::Reset()
{
	SetPROM_32K_Bank( 0 );
	if( VROM_8K_SIZE > 4 ) {
		SetVROM_8K_Bank( 4 );
	} else if( VROM_8K_SIZE ) {
		SetVROM_8K_Bank( 0 );
	}

	SetVRAM_Mirror( VRAM_HMIRROR );

	reg[0] = 0;
	reg[1] = 0;
	reg[2] = 3;
	reg[3] = 0;
}

void	Mapper243::WriteLow( WORD addr, BYTE data )
{
	if( (addr&0x4101) == 0x4100 ) {
		reg[0] = data;
	} else if( (addr&0x4101) == 0x4101 ) {
		switch( reg[0] & 0x07 ) {
			case	0:
				reg[1] = 0;
				reg[2] = 3;
				break;
			case	4:
				reg[2] = (reg[2]&0x06)|(data&0x01);
				break;
			case	5:
				reg[1] = data&0x01;
				break;
			case	6:
				reg[2] = (reg[2]&0x01)|((data&0x03)<<1);
				break;
			case	7:
				reg[3] = data&0x01;
				break;
			default:
				break;
		}

		SetPROM_32K_Bank( reg[1] );
		SetVROM_8K_Bank( reg[2]*8+0, reg[2]*8+1, reg[2]*8+2, reg[2]*8+3,
				 reg[2]*8+4, reg[2]*8+5, reg[2]*8+6, reg[2]*8+7 );

		if( reg[3] ) {
			SetVRAM_Mirror( VRAM_VMIRROR );
		} else {
			SetVRAM_Mirror( VRAM_HMIRROR );
		}
	}
}

void	Mapper243::SaveState( LPBYTE p )
{
	p[0] = reg[0];
	p[1] = reg[1];
	p[2] = reg[2];
	p[3] = reg[3];
}

void	Mapper243::LoadState( LPBYTE p )
{
	reg[0] = p[0];
	reg[1] = p[1];
	reg[2] = p[2];
	reg[3] = p[3];
}