Exemple #1
0
void	Mapper075::Write( WORD addr, BYTE data )
{
	switch( addr & 0xF000 ) {
		case	0x8000:
			SetPROM_8K_Bank( 4, data );
			break;

		case	0x9000:
			if( data & 0x01 ) SetVRAM_Mirror( VRAM_HMIRROR );
			else		  SetVRAM_Mirror( VRAM_VMIRROR );

			reg[0] = (reg[0] & 0x0F) | ((data & 0x02) << 3);
			reg[1] = (reg[1] & 0x0F) | ((data & 0x04) << 2);
			SetVROM_4K_Bank( 0, reg[0] );
			SetVROM_4K_Bank( 4, reg[1] );
			break;

		case	0xA000:
			SetPROM_8K_Bank( 5, data );
			break;
		case	0xC000:
			SetPROM_8K_Bank( 6, data );
			break;

		case	0xE000:
			reg[0] = (reg[0] & 0x10) | (data & 0x0F);
			SetVROM_4K_Bank( 0, reg[0] );
			break;

		case	0xF000:
			reg[1] = (reg[1] & 0x10) | (data & 0x0F);
			SetVROM_4K_Bank( 4, reg[1] );
			break;
	}
}
Exemple #2
0
//////////////////////////////////////////////////////////////////////////
// Mapper009  Nintendo MMC2                                             //
//////////////////////////////////////////////////////////////////////////
void	Mapper009::Reset()
{
	SetPROM_32K_Bank( 0, PROM_8K_SIZE-3, PROM_8K_SIZE-2, PROM_8K_SIZE-1 );

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

	latch_a = 0xFE;
	latch_b = 0xFE;
	SetVROM_4K_Bank( 0, 4 );
	SetVROM_4K_Bank( 4, 0 );

	nes->ppu->SetChrLatchMode( TRUE );
}
Exemple #3
0
void	Mapper009::PPU_ChrLatch( WORD addr )
{
	if( (addr&0x1FF0) == 0x0FD0 && latch_a != 0xFD ) {
		latch_a = 0xFD;
		SetVROM_4K_Bank( 0, reg[0] );
	} else if( (addr&0x1FF0) == 0x0FE0 && latch_a != 0xFE ) {
		latch_a = 0xFE;
		SetVROM_4K_Bank( 0, reg[1] );
	} else if( (addr&0x1FF0) == 0x1FD0 && latch_b != 0xFD ) {
		latch_b = 0xFD;
		SetVROM_4K_Bank( 4, reg[2] );
	} else if( (addr&0x1FF0) == 0x1FE0 && latch_b != 0xFE ) {
		latch_b = 0xFE;
		SetVROM_4K_Bank( 4, reg[3] );
	}
}
Exemple #4
0
void	Mapper090::SetBank_PPU()
{
INT	bank[8];

	for( INT i = 0; i < 8; i++ ) {
		bank[i] = ((INT)chh_reg[i]<<8)|((INT)chl_reg[i]);
	}

	if( chr_size == 0 ) {
		SetVROM_8K_Bank( bank[0] );
	} else
	if( chr_size == 1 ) {
		SetVROM_4K_Bank( 0, bank[0] );
		SetVROM_4K_Bank( 4, bank[4] );
	} else
	if( chr_size == 2 ) {
		SetVROM_2K_Bank( 0, bank[0] );
		SetVROM_2K_Bank( 2, bank[2] );
		SetVROM_2K_Bank( 4, bank[4] );
		SetVROM_2K_Bank( 6, bank[6] );
	} else {
		SetVROM_8K_Bank( bank[0], bank[1], bank[2], bank[3], bank[4], bank[5], bank[6], bank[7] );
	}
}
Exemple #5
0
void	Mapper009::Write( WORD addr, BYTE data )
{
	switch( addr & 0xF000 ) {
		case	0xA000:
			SetPROM_8K_Bank( 4, data );
			break;
		case	0xB000:
			reg[0] = data;
			if( latch_a == 0xFD ) {
				SetVROM_4K_Bank( 0, reg[0] );
			}
			break;
		case	0xC000:
			reg[1] = data;
			if( latch_a == 0xFE ) {
				SetVROM_4K_Bank( 0, reg[1] );
			}
			break;
		case	0xD000:
			reg[2] = data;
			if( latch_b == 0xFD ) {
				SetVROM_4K_Bank( 4, reg[2] );
			}
			break;
		case	0xE000:
			reg[3] = data;
			if( latch_b == 0xFE ) {
				SetVROM_4K_Bank( 4, reg[3] );
			}
			break;
		case	0xF000:
			if( data & 0x01 ) SetVRAM_Mirror( VRAM_HMIRROR );
			else		  SetVRAM_Mirror( VRAM_VMIRROR );
			break;
	}
}
Exemple #6
0
void	Mapper001::Write( WORD addr, BYTE data )
{
//	DEBUGOUT( "MMC1 %04X=%02X\n", addr&0xFFFF,data&0xFF );

	if( wram_patch == 1 && addr == 0xBFFF ) {
		wram_count++;
		wram_bank += data&0x01;
		if( wram_count == 5 ) {
			if( wram_bank ) {
				SetPROM_Bank( 3, &WRAM[0x2000], BANKTYPE_RAM );
			} else {
				SetPROM_Bank( 3, &WRAM[0x0000], BANKTYPE_RAM );
			}
			wram_bank = wram_count = 0;
		}
	}

	if( patch != 1 ) {
		if((addr & 0x6000) != (last_addr & 0x6000)) {
			shift = regbuf = 0;
		}
		last_addr = addr;
	}

	if( data & 0x80 ) {
		shift = regbuf = 0;
//		reg[0] = 0x0C;		// D3=1,D2=1
		reg[0] |= 0x0C;		// D3=1,D2=1 残りはリセットされない
		return;
	}

	if( data&0x01 ) regbuf |= 1<<shift;
	if( ++shift < 5 )
		return;
	addr = (addr&0x7FFF)>>13;
	reg[addr] = regbuf;

//	DEBUGOUT( "MMC1 %d=%02X\n", addr&0xFFFF,regbuf&0xFF );

	regbuf = 0;
	shift = 0;

	if( patch != 1 ) {
	// For Normal Cartridge
		switch( addr ) {
			case	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 );
				}
				break;
			case	1:
				// Register #1
				if( VROM_1K_SIZE ) {
					if( reg[0] & 0x10 ) {
						// CHR 4K bank lower($0000-$0FFF)
						SetVROM_4K_Bank( 0, reg[1] );
						// CHR 4K bank higher($1000-$1FFF)
						SetVROM_4K_Bank( 4, reg[2] );
					} else {
						// CHR 8K bank($0000-$1FFF)
						SetVROM_8K_Bank( reg[1]>>1 );
					}
				} else {
					// For Romancia
					if( reg[0] & 0x10 ) {
						SetCRAM_4K_Bank( 0, reg[1] );
					}
				}
				break;
			case	2:
				// Register #2
				if( VROM_1K_SIZE ) {
					if( reg[0] & 0x10 ) {
						// CHR 4K bank lower($0000-$0FFF)
						SetVROM_4K_Bank( 0, reg[1] );
						// CHR 4K bank higher($1000-$1FFF)
						SetVROM_4K_Bank( 4, reg[2] );
					} else {
						// CHR 8K bank($0000-$1FFF)
						SetVROM_8K_Bank( reg[1]>>1 );
					}
				} else {
					// For Romancia
					if( reg[0] & 0x10 ) {
						SetCRAM_4K_Bank( 4, reg[2] );
					}
				}
				break;
			case	3:
				if( !(reg[0] & 0x08) ) {
				// PRG 32K bank ($8000-$FFFF)
					SetPROM_32K_Bank( reg[3]>>1 );
				} else {
void	Mapper122::WriteLow( WORD addr, BYTE data )
{
	if( addr == 0x6000 ) {
		SetVROM_4K_Bank( 0,  data & 0x07 );
		SetVROM_4K_Bank( 4, (data & 0x70)>>4 );
	}