Exemplo n.º 1
0
//////////////////////////////////////////////////////////////////////////
// Mapper000                                                            //
//////////////////////////////////////////////////////////////////////////
void	Mapper000::Reset()
{
	switch( PROM_16K_SIZE ) {
		default:
		case	1:	// 16K only
			SetPROM_16K_Bank( 4, 0 );
			SetPROM_16K_Bank( 6, 0 );
			break;
		case	2:	// 32K
			SetPROM_32K_Bank( 0 );
			break;
	}

	DWORD	crc = nes->rom->GetPROM_CRC();
	if( crc == 0x4e7db5af ) {	// Circus Charlie(J)
		nes->SetRenderMethod( NES::POST_RENDER );
	}
	if( crc == 0x57970078 ) {	// F-1 Race(J)
		nes->SetRenderMethod( NES::POST_RENDER );
	}
	if( crc == 0xaf2bbcbc		// Mach Rider(JU)
	 || crc == 0x3acd4bf1 ) {	// Mach Rider(Alt)(JU)
		nes->SetRenderMethod( NES::POST_RENDER );
	}
}
Exemplo n.º 2
0
//////////////////////////////////////////////////////////////////////////
// Mapper202  150-in-1                                                  //
//////////////////////////////////////////////////////////////////////////
void	Mapper202::Reset()
{
    SetPROM_16K_Bank( 4, 6 );
    SetPROM_16K_Bank( 6, 7 );

    if( VROM_1K_SIZE ) {
        SetVROM_8K_Bank( 0 );
    }
}
Exemplo n.º 3
0
//////////////////////////////////////////////////////////////////////////
// Mapper175  15-in-1 (Kaiser)                                          //
//////////////////////////////////////////////////////////////////////////
void	Mapper175::Reset()
{
	SetPROM_16K_Bank( 4, 0 );
	SetPROM_16K_Bank( 6, 0 );
	reg_dat = 0;

	if( VROM_1K_SIZE ) {
		SetVROM_8K_Bank( 0 );
	}
}
Exemplo n.º 4
0
//////////////////////////////////////////////////////////////////////////
// Mapper201  21-in-1                                                   //
//////////////////////////////////////////////////////////////////////////
void	Mapper201::Reset()
{
//	SetPROM_32K_Bank( 0, 1, PROM_8K_SIZE-2, PROM_8K_SIZE-1 );
	SetPROM_16K_Bank( 4, 0 );
	SetPROM_16K_Bank( 6, 0 );

	if( VROM_1K_SIZE ) {
		SetVROM_8K_Bank( 0 );
	}
}
Exemplo n.º 5
0
void	Mapper073::Write( WORD addr, BYTE data )
{
	switch( addr ) {
		case	0xF000:
			SetPROM_16K_Bank( 4, data );
			break;

		case	0x8000:
			irq_counter = (irq_counter & 0xFFF0) | (data & 0x0F);
			break;
		case	0x9000:
			irq_counter = (irq_counter & 0xFF0F) | ((data & 0x0F) << 4);
			break;
		case	0xA000:
			irq_counter = (irq_counter & 0xF0FF) | ((data & 0x0F) << 8);
			break;
		case	0xB000:
			irq_counter = (irq_counter & 0x0FFF) | ((data & 0x0F) << 12);
			break;
		case	0xC000:
			irq_enable = data & 0x02;
			nes->cpu->ClrIRQ( IRQ_MAPPER );
			break;
		case	0xD000:
			nes->cpu->ClrIRQ( IRQ_MAPPER );
			break;
	}
}
Exemplo n.º 6
0
void	Mapper002::Write( WORD addr, BYTE data )
{
	if( patch != 2 )
		SetPROM_16K_Bank( 4, data );
	else
		SetPROM_16K_Bank( 4, data>>4 );
}
Exemplo n.º 7
0
void	Mapper175::Read( WORD addr, BYTE data)
{
	if( addr == 0xFFFC ) {
		SetPROM_16K_Bank( 4, reg_dat & 0x0F );
		SetPROM_8K_Bank( 6, (reg_dat & 0x0F)*2 );
	}
}
Exemplo n.º 8
0
void	Mapper058::Write( WORD addr, BYTE data )
{
	if( addr & 0x40 ) {
		SetPROM_16K_Bank( 4, addr&0x07 );
		SetPROM_16K_Bank( 6, addr&0x07 );
	} else {
		SetPROM_32K_Bank( (addr&0x06)>>1 );
	}

	if( VROM_1K_SIZE ) {
		SetVROM_8K_Bank( (addr&0x38)>>3 );
	}

	if( data & 0x02 ) SetVRAM_Mirror( VRAM_VMIRROR );
	else		  SetVRAM_Mirror( VRAM_HMIRROR );
}
Exemplo n.º 9
0
void	Mapper188::Write( WORD addr, BYTE data )
{
	if( data ) {
		if( data & 0x10 ) {
			data &= 0x07;
			SetPROM_16K_Bank( 4, data );
		} else {
			SetPROM_16K_Bank( 4, data+8 );
		}
	} else {
		if( PROM_8K_SIZE == 0x10 ) {
			SetPROM_16K_Bank( 4, 7 );
		} else {
			SetPROM_16K_Bank( 4, 8 );
		}
	}
}
Exemplo n.º 10
0
void	Mapper002::WriteLow( WORD addr, BYTE data )
{
	if( !nes->rom->IsSAVERAM() ) {
		if( addr >= 0x5000 && patch == 1 )
			SetPROM_16K_Bank( 4, data );
	} else {
		Mapper::WriteLow( addr, data );
	}
}
Exemplo n.º 11
0
void	Mapper114::SetBank_CPU()
{
	if( reg_m & 0x80 ) {
		SetPROM_16K_Bank( 4, reg_m & 0x1F );
	} else {
		SetPROM_8K_Bank( 4, reg_b[4] );
		SetPROM_8K_Bank( 5, reg_b[5] );
	}
}
Exemplo n.º 12
0
//////////////////////////////////////////////////////////////////////////
// Mapper003 CNROM                                                      //
//////////////////////////////////////////////////////////////////////////
void	Mapper003::Reset()
{
	switch( PROM_16K_SIZE ) {
		case	1:	// 16K only
			SetPROM_16K_Bank( 4, 0 );
			SetPROM_16K_Bank( 6, 0 );
			break;
		case	2:	// 32K
			SetPROM_32K_Bank( 0 );
			break;
	}
//	nes->SetRenderMethod( NES::TILE_RENDER );
	DWORD	crc = nes->rom->GetPROM_CRC();

	if( crc == 0x2b72fe7e ) {	// Ganso Saiyuuki - Super Monkey Dai Bouken(J)
		nes->SetRenderMethod( NES::TILE_RENDER );
		nes->ppu->SetExtNameTableMode( TRUE );
	}

//	if( crc == 0xE44D95B5 ) {	// ‚Ђ݂‚—
//	}
}
Exemplo n.º 13
0
//////////////////////////////////////////////////////////////////////////
// Mapper185  Character disable protect                                 //
//////////////////////////////////////////////////////////////////////////
void	Mapper185::Reset()
{
	switch( PROM_16K_SIZE ) {
		case	1:	// 16K only
			SetPROM_16K_Bank( 4, 0 );
			SetPROM_16K_Bank( 6, 0 );
			break;
		case	2:	// 32K
			SetPROM_32K_Bank( 0 );
			break;
	}

	for( INT i = 0; i < 0x400; i++ ) {
		VRAM[0x800+i] = 0xFF;
	}

	patch = 0;

	DWORD	crc = nes->rom->GetPROM_CRC();
	if( crc == 0xb36457c7 ) {	// Spy vs Spy(J)
		patch = 1;
	}
}
Exemplo n.º 14
0
void	Mapper071::Write( WORD addr, BYTE data )
{
	switch( addr&0xF000 ) {
		case	0x9000:
			if( data&0x10 ) SetVRAM_Mirror( VRAM_MIRROR4H );
			else		SetVRAM_Mirror( VRAM_MIRROR4L );
			break;

		case	0xC000:
		case	0xD000:
		case	0xE000:
		case	0xF000:
			SetPROM_16K_Bank( 4, data );
			break;
	}
}
Exemplo n.º 15
0
void	Mapper083::Write( WORD addr, BYTE data )
{
//DEBUGOUT( "MPRWR A=%04X D=%02X L=%3d CYC=%d\n", addr&0xFFFF, data&0xFF, nes->GetScanline(), nes->cpu->GetTotalCycles() );
	switch( addr ) {
		case	0x8000:
		case	0xB000:
		case	0xB0FF:
		case	0xB1FF:
			reg[0] = data;
			chr_bank = (data&0x30)<<4;
			SetPROM_16K_Bank( 4, data );
			SetPROM_16K_Bank( 6, (data&0x30)|0x0F );
			break;

		case	0x8100:
			reg[1] = data & 0x80;
			data &= 0x03;
			if( data == 0 )	     SetVRAM_Mirror( VRAM_VMIRROR );
			else if( data == 1 ) SetVRAM_Mirror( VRAM_HMIRROR );
			else if( data == 2 ) SetVRAM_Mirror( VRAM_MIRROR4L );
			else		     SetVRAM_Mirror( VRAM_MIRROR4H );
			break;

		case	0x8200:
			irq_counter = (irq_counter&0xFF00)|(INT)data;
//			nes->cpu->ClrIRQ( IRQ_MAPPER );
			break;
		case	0x8201:
			irq_counter = (irq_counter&0x00FF)|((INT)data<<8);
			irq_enable = reg[1];
//			nes->cpu->ClrIRQ( IRQ_MAPPER );
			break;

		case	0x8300:
			SetPROM_8K_Bank( 4, data );
			break;
		case	0x8301:
			SetPROM_8K_Bank( 5, data );
			break;
		case	0x8302:
			SetPROM_8K_Bank( 6, data );
			break;

		case	0x8310:
			if( patch ) {
				SetVROM_2K_Bank( 0, chr_bank|data );
			} else {
				SetVROM_1K_Bank( 0, chr_bank|data );
			}
			break;
		case	0x8311:
			if( patch ) {
				SetVROM_2K_Bank( 2, chr_bank|data );
			} else {
				SetVROM_1K_Bank( 1, chr_bank|data );
			}
			break;
		case	0x8312:
			SetVROM_1K_Bank( 2, chr_bank|data );
			break;
		case	0x8313:
			SetVROM_1K_Bank( 3, chr_bank|data );
			break;
		case	0x8314:
			SetVROM_1K_Bank( 4, chr_bank|data );
			break;
		case	0x8315:
			SetVROM_1K_Bank( 5, chr_bank|data );
			break;
		case	0x8316:
			if( patch ) {
				SetVROM_2K_Bank( 4, chr_bank|data );
			} else {
				SetVROM_1K_Bank( 6, chr_bank|data );
			}
			break;
		case	0x8317:
			if( patch ) {
				SetVROM_2K_Bank( 6, chr_bank|data );
			} else {
				SetVROM_1K_Bank( 7, chr_bank|data );
			}
			break;

		case	0x8318:
			SetPROM_16K_Bank( 4, (reg[0]&0x30)|data );
			break;
	}
}
Exemplo n.º 16
0
// Normal mapper #16
void	Mapper016::WriteSubA( WORD addr, BYTE data )
{
	switch( addr & 0x000F ) {
		case	0x0000:
		case	0x0001:
		case	0x0002:
		case	0x0003:
		case	0x0004:
		case	0x0005:
		case	0x0006:
		case	0x0007:
			if( VROM_1K_SIZE ) {
				SetVROM_1K_Bank( addr&0x0007, data );
			}
			if( eeprom_type == 2 ) {
				reg[0] = data;
				x24c01.Write( (data&0x08)?0xFF:0, (reg[1]&0x40)?0xFF:0 );
			}
			break;

		case	0x0008:
			SetPROM_16K_Bank( 4, data );
			break;

		case	0x0009:
			data &= 0x03;
			if( data == 0 )	     SetVRAM_Mirror( VRAM_VMIRROR );
			else if( data == 1 ) SetVRAM_Mirror( VRAM_HMIRROR );
			else if( data == 2 ) SetVRAM_Mirror( VRAM_MIRROR4L );
			else		     SetVRAM_Mirror( VRAM_MIRROR4H );
			break;

		case	0x000A:
			irq_enable = data & 0x01;
			irq_counter = irq_latch;
			nes->cpu->ClrIRQ( IRQ_MAPPER );
			break;
		case	0x000B:
			irq_latch = (irq_latch & 0xFF00) | data;
			irq_counter = (irq_counter & 0xFF00) | data;
			break;
		case	0x000C:
			irq_latch = ((INT)data << 8) | (irq_latch & 0x00FF);
			irq_counter = ((INT)data << 8) | (irq_counter & 0x00FF);
			break;

		case	0x000D:
			// EEPTYPE0(DragonBallZ)
			if( eeprom_type == 0 ) {
				x24c01.Write( (data&0x20)?0xFF:0, (data&0x40)?0xFF:0 );
			}
			// EEPTYPE1(DragonBallZ2,Z3,Z Gaiden)
			if( eeprom_type == 1 ) {
				x24c02.Write( (data&0x20)?0xFF:0, (data&0x40)?0xFF:0 );
			}
			// EEPTYPE2(DATACH)
			if( eeprom_type == 2 ) {
				reg[1] = data;
				x24c02.Write( (data&0x20)?0xFF:0, (data&0x40)?0xFF:0 );
				x24c01.Write( (reg[0]&0x08)?0xFF:0, (data&0x40)?0xFF:0 );
			}
			break;
	}
}
Exemplo n.º 17
0
void	Mapper071::WriteLow( WORD addr, BYTE data )
{
	if( (addr&0xE000)==0x6000 ) {
		SetPROM_16K_Bank( 4, data );
	}
}
Exemplo n.º 18
0
//////////////////////////////////////////////////////////////////////////
// Mapper001  Nintendo MMC1                                             //
//////////////////////////////////////////////////////////////////////////
void	Mapper001::Reset()
{
	reg[0] = 0x0C;		// D3=1,D2=1
	reg[1] = reg[2] = reg[3] = 0;
	shift = regbuf = 0;

	patch = 0;
	wram_patch = 0;

	if( PROM_16K_SIZE < 32 ) {
		SetPROM_32K_Bank( 0, 1, PROM_8K_SIZE-2, PROM_8K_SIZE-1 );
	} else {
		// For 512K/1M byte Cartridge
		SetPROM_16K_Bank( 4, 0 );
		SetPROM_16K_Bank( 6, 16-1 );

		patch = 1;
	}

	if( VROM_8K_SIZE ) {
//		SetVROM_8K_Bank( 0 );
	}

	DWORD	crc = nes->rom->GetPROM_CRC();

	if( crc == 0xb8e16bd0 ) {	// Snow Bros.(J)
		patch = 2;
	}
//	if( crc == 0x9b565541 ) {	// Triathron, The(J)
//		nes->SetFrameIRQmode( FALSE );
//	}
	if( crc == 0xc96c6f04 ) {	// Venus Senki(J)
		nes->SetRenderMethod( NES::POST_ALL_RENDER );
	}
//	if( crc == 0x5e3f7004 ) {	// Softball Tengoku(J)
//	}

	if( crc == 0x4d2edf70 ) {	// Night Rider(J)
		nes->SetRenderMethod( NES::TILE_RENDER );
	}
	if( crc == 0xcd2a73f0 ) {	// Pirates!(U)
		nes->SetRenderMethod( NES::TILE_RENDER );
		patch = 2;
	}

//	if( crc == 0x09efe54b ) {	// Majaventure - Mahjong Senki(J)
//		nes->SetFrameIRQmode( FALSE );
//	}

	if( crc == 0x11469ce3 ) {	// Viva! Las Vegas(J)
	}
	if( crc == 0xd878ebf5 ) {	// Ninja Ryukenden(J)
		nes->SetRenderMethod( NES::POST_ALL_RENDER );
	}

//	if( crc == 0x7bd7b849 ) {	// Nekketsu Koukou - Dodgeball Bu(J)
//	}

	if( crc == 0x466efdc2 ) {	// Final Fantasy(J)
		nes->SetRenderMethod( NES::TILE_RENDER );
		nes->ppu->SetExtMonoMode( TRUE );
	}
	if( crc == 0xc9556b36 ) {	// Final Fantasy I&II(J)
		nes->SetRenderMethod( NES::TILE_RENDER );
		nes->ppu->SetExtMonoMode( TRUE );
		nes->SetSAVERAM_SIZE( 16*1024 );
		wram_patch = 2;
	}

	if( crc == 0x717e1169 ) {	// Cosmic Wars(J)
		nes->SetRenderMethod( NES::PRE_ALL_RENDER );
	}

	if( crc == 0xC05D2034 ) {	// Snake's Revenge(U)
		nes->SetRenderMethod( NES::PRE_ALL_RENDER );
	}

	if( crc == 0xb8747abf		// Best Play - Pro Yakyuu Special(J)
	 || crc == 0x29449ba9		// Nobunaga no Yabou - Zenkoku Ban(J)
	 || crc == 0x2b11e0b0		// Nobunaga no Yabou - Zenkoku Ban(J)(alt)
	 || crc == 0x4642dda6		// Nobunaga's Ambition(U)
	 || crc == 0xfb69743a		// Aoki Ookami to Shiroki Mejika - Genghis Khan(J)
	 || crc == 0x2225c20f		// Genghis Khan(U)
	 || crc == 0xabbf7217		// Sangokushi(J)
	) {

		nes->SetSAVERAM_SIZE( 16*1024 );
		wram_patch = 1;
		wram_bank  = 0;
		wram_count = 0;
	}
}