//////////////////////////////////////////////////////////////////////////
// Mapper236  800-in-1                                                  //
//////////////////////////////////////////////////////////////////////////
void	Mapper236::Reset()
{
	SetPROM_32K_Bank( 0, 1, PROM_8K_SIZE-2, PROM_8K_SIZE-1 );

	bank = mode = 0;
}

void	Mapper236::Write( WORD addr, BYTE data )
{
	if( addr >= 0x8000 && addr <= 0xBFFF ) {
		bank = ((addr&0x03)<<4)|(bank&0x07);
	} else {
		bank = (addr&0x07)|(bank&0x30);
		mode = addr&0x30;
	}

	if( addr & 0x20 ) {
		SetVRAM_Mirror( VRAM_HMIRROR );
	} else {
		SetVRAM_Mirror( VRAM_VMIRROR );
	}

	switch( mode ) {
		case	0x00:
			bank |= 0x08;
			SetPROM_8K_Bank( 4, bank*2+0 );
			SetPROM_8K_Bank( 5, bank*2+1 );
			SetPROM_8K_Bank( 6, (bank|0x07)*2+0 );
			SetPROM_8K_Bank( 7, (bank|0x07)*2+1 );
			break;
		case	0x10:
			bank |= 0x37;
			SetPROM_8K_Bank( 4, bank*2+0 );
			SetPROM_8K_Bank( 5, bank*2+1 );
			SetPROM_8K_Bank( 6, (bank|0x07)*2+0 );
			SetPROM_8K_Bank( 7, (bank|0x07)*2+1 );
			break;
		case	0x20:
			bank |= 0x08;
			SetPROM_8K_Bank( 4, (bank&0xFE)*2+0 );
			SetPROM_8K_Bank( 5, (bank&0xFE)*2+1 );
			SetPROM_8K_Bank( 6, (bank&0xFE)*2+2 );
			SetPROM_8K_Bank( 7, (bank&0xFE)*2+3 );
			break;
		case	0x30:
			bank |= 0x08;
			SetPROM_8K_Bank( 4, bank*2+0 );
			SetPROM_8K_Bank( 5, bank*2+1 );
			SetPROM_8K_Bank( 6, bank*2+0 );
			SetPROM_8K_Bank( 7, bank*2+1 );
			break;
	}
}

void	Mapper236::SaveState( LPBYTE p )
{
	p[ 0] = bank;
	p[ 1] = mode;
}

void	Mapper236::LoadState( LPBYTE p )
{
	bank = p[ 0];
	mode = p[ 1];
}