⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mapper005.cpp

📁 著名的任天堂FC游戏机模拟器VirtuaNes 085版的源码!
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		CPU_MEM_PAGE[page] = data;
	} else {
		CPU_MEM_TYPE[page] = BANKTYPE_ROM;
	}
}

void	Mapper005::SetBank_PPU()
{
INT	i;

	if( chr_mode == 0 ) {
	// PPU SP Bank
		switch( chr_size ) {
			case	0:
				SetVROM_8K_Bank( chr_page[0][7] );
				break;
			case	1:
				SetVROM_4K_Bank( 0, chr_page[0][3] );
				SetVROM_4K_Bank( 4, chr_page[0][7] );
				break;
			case	2:
				SetVROM_2K_Bank( 0, chr_page[0][1] );
				SetVROM_2K_Bank( 2, chr_page[0][3] );
				SetVROM_2K_Bank( 4, chr_page[0][5] );
				SetVROM_2K_Bank( 6, chr_page[0][7] );
				break;
			case	3:
				SetVROM_8K_Bank( chr_page[0][0],
						 chr_page[0][1],
						 chr_page[0][2],
						 chr_page[0][3],
						 chr_page[0][4],
						 chr_page[0][5],
						 chr_page[0][6],
						 chr_page[0][7] );
				break;
		}
	} else if( chr_mode == 1 ) {
		// PPU BG Bank
		switch( chr_size ) {
			case	0:
				for( i = 0; i < 8; i++ ) {
					BG_MEM_BANK[i] = VROM+0x2000*(chr_page[1][7]%VROM_8K_SIZE)+0x0400*i;
					BG_MEM_PAGE[i] = (chr_page[1][7]%VROM_8K_SIZE)*8+i;
				}
				break;
			case	1:
				for( i = 0; i < 4; i++ ) {
					BG_MEM_BANK[i+0] = VROM+0x1000*(chr_page[1][3]%VROM_4K_SIZE)+0x0400*i;
					BG_MEM_BANK[i+4] = VROM+0x1000*(chr_page[1][7]%VROM_4K_SIZE)+0x0400*i;
					BG_MEM_PAGE[i+0] = (chr_page[1][3]%VROM_4K_SIZE)*4+i;
					BG_MEM_PAGE[i+4] = (chr_page[1][7]%VROM_4K_SIZE)*4+i;
				}
				break;
			case	2:
				for( i = 0; i < 2; i++ ) {
					BG_MEM_BANK[i+0] = VROM+0x0800*(chr_page[1][1]%VROM_2K_SIZE)+0x0400*i;
					BG_MEM_BANK[i+2] = VROM+0x0800*(chr_page[1][3]%VROM_2K_SIZE)+0x0400*i;
					BG_MEM_BANK[i+4] = VROM+0x0800*(chr_page[1][5]%VROM_2K_SIZE)+0x0400*i;
					BG_MEM_BANK[i+6] = VROM+0x0800*(chr_page[1][7]%VROM_2K_SIZE)+0x0400*i;
					BG_MEM_PAGE[i+0] = (chr_page[1][1]%VROM_2K_SIZE)*2+i;
					BG_MEM_PAGE[i+2] = (chr_page[1][3]%VROM_2K_SIZE)*2+i;
					BG_MEM_PAGE[i+4] = (chr_page[1][5]%VROM_2K_SIZE)*2+i;
					BG_MEM_PAGE[i+6] = (chr_page[1][7]%VROM_2K_SIZE)*2+i;
				}
				break;
			case	3:
				for( i = 0; i < 8; i++ ) {
					BG_MEM_BANK[i] = VROM+0x0400*(chr_page[1][i]%VROM_1K_SIZE);
					BG_MEM_PAGE[i] = (chr_page[1][i]%VROM_1K_SIZE)+i;
				}
				break;
		}
	}
}

void	Mapper005::HSync( INT scanline )
{
	if( irq_type & MMC5_IRQ_METAL ) {
		if( irq_scanline == irq_line ) {
			irq_status |= 0x80;
		}
	}

//	if( nes->ppu->IsDispON() && scanline < 239 ) {
	if( nes->ppu->IsDispON() && scanline < 240 ) {
		irq_scanline++;
		irq_status |= 0x40;
		irq_clear = 0;
	} else if( irq_type & MMC5_IRQ_METAL ) {
		irq_scanline = 0;
		irq_status &= ~0x80;
		irq_status &= ~0x40;
	}

	if( !(irq_type & MMC5_IRQ_METAL) ) {
		if( irq_scanline == irq_line ) {
			irq_status |= 0x80;
		}

		if( ++irq_clear > 2 ) {
			irq_scanline = 0;
			irq_status &= ~0x80;
			irq_status &= ~0x40;

			nes->cpu->ClrIRQ( IRQ_MAPPER );
		}
	}

	if( (irq_enable & 0x80) && (irq_status & 0x80) && (irq_status & 0x40) ) {
		nes->cpu->SetIRQ( IRQ_MAPPER );
///		nes->cpu->IRQ_NotPending();
#if	0
{
LPBYTE	lpScn = nes->ppu->GetScreenPtr();

	lpScn = lpScn+(256+16)*scanline;

	for( INT i = 0; i < 256+16; i++ ) {
		lpScn[i] = 22;
	}
}
#endif
	}

	// For Split mode!
	if( scanline == 0 ) {
		split_yofs = split_scroll&0x07;
		split_addr = ((split_scroll&0xF8)<<2);
	} else if( nes->ppu->IsDispON() ) {
		if( split_yofs == 7 ) {
			split_yofs = 0;
			if( (split_addr & 0x03E0) == 0x03A0 ) {
				split_addr &= 0x001F;
			} else {
				if( (split_addr & 0x03E0) == 0x03E0 ) {
					split_addr &= 0x001F;
				} else {
					split_addr += 0x0020;
				}
			}
		} else {
			split_yofs++;
		}
	}
}

void	Mapper005::PPU_ExtLatchX( INT x )
{
	split_x = x;
}

void	Mapper005::PPU_ExtLatch( WORD addr, BYTE& chr_l, BYTE& chr_h, BYTE& attr )
{
WORD	ntbladr, attradr, tileadr, tileofs;
WORD	tile_yofs;
DWORD	tilebank;
BOOL	bSplit;

	tile_yofs = nes->ppu->GetTILEY();

	bSplit = FALSE;
	if( split_control & 0x80 ) {
		if( !(split_control&0x40) ) {
		// Left side
			if( (split_control&0x1F) > split_x ) {
				bSplit = TRUE;
			}
		} else {
		// Right side
			if( (split_control&0x1F) <= split_x ) {
				bSplit = TRUE;
			}
		}
	}

	if( !bSplit ) {
		if( nametable_type[(addr&0x0C00)>>10] == 3 ) {
		// Fill mode
			if( graphic_mode == 1 ) {
			// ExGraphic mode
				ntbladr = 0x2000+(addr&0x0FFF);
				// Get Nametable
				tileadr = fill_chr*0x10+tile_yofs;
				// Get TileBank
				tilebank = 0x1000*((VRAM[0x0800+(ntbladr&0x03FF)]&0x3F)%VROM_4K_SIZE);
				// Attribute
				attr = (fill_pal<<2)&0x0C;
				// Get Pattern
				chr_l = VROM[tilebank+tileadr  ];
				chr_h = VROM[tilebank+tileadr+8];
			} else {
			// Normal
				tileofs = (PPUREG[0]&PPU_BGTBL_BIT)?0x1000:0x0000;
				tileadr = tileofs+fill_chr*0x10+tile_yofs;
				attr = (fill_pal<<2)&0x0C;
				// Get Pattern
				if( chr_type ) {
					chr_l = PPU_MEM_BANK[tileadr>>10][ tileadr&0x03FF   ];
					chr_h = PPU_MEM_BANK[tileadr>>10][(tileadr&0x03FF)+8];
				} else {
					chr_l = BG_MEM_BANK[tileadr>>10][ tileadr&0x03FF   ];
					chr_h = BG_MEM_BANK[tileadr>>10][(tileadr&0x03FF)+8];
				}
			}
		} else if( graphic_mode == 1 ) {
		// ExGraphic mode
			ntbladr = 0x2000+(addr&0x0FFF);
			// Get Nametable
			tileadr = (WORD)PPU_MEM_BANK[ntbladr>>10][ntbladr&0x03FF]*0x10+tile_yofs;
			// Get TileBank
			tilebank = 0x1000*((VRAM[0x0800+(ntbladr&0x03FF)]&0x3F)%VROM_4K_SIZE);
			// Get Attribute
			attr = (VRAM[0x0800+(ntbladr&0x03FF)]&0xC0)>>4;
			// Get Pattern
			chr_l = VROM[tilebank+tileadr  ];
			chr_h = VROM[tilebank+tileadr+8];
		} else {
		// Normal or ExVRAM
			tileofs = (PPUREG[0]&PPU_BGTBL_BIT)?0x1000:0x0000;
			ntbladr = 0x2000+(addr&0x0FFF);
			attradr = 0x23C0+(addr&0x0C00)+((addr&0x0380)>>4)+((addr&0x001C)>>2);
			// Get Nametable
			tileadr = tileofs+PPU_MEM_BANK[ntbladr>>10][ntbladr&0x03FF]*0x10+tile_yofs;
			// Get Attribute
			attr = PPU_MEM_BANK[attradr>>10][attradr&0x03FF];
			if( ntbladr & 0x0002 ) attr >>= 2;
			if( ntbladr & 0x0040 ) attr >>= 4;
			attr = (attr&0x03)<<2;
			// Get Pattern
			if( chr_type ) {
				chr_l = PPU_MEM_BANK[tileadr>>10][ tileadr&0x03FF   ];
				chr_h = PPU_MEM_BANK[tileadr>>10][(tileadr&0x03FF)+8];
			} else {
				chr_l = BG_MEM_BANK[tileadr>>10][ tileadr&0x03FF   ];
				chr_h = BG_MEM_BANK[tileadr>>10][(tileadr&0x03FF)+8];
			}
		}
	} else {
		ntbladr = ((split_addr&0x03E0)|(split_x&0x1F))&0x03FF;
		// Get Split TileBank
		tilebank = 0x1000*((INT)split_page%VROM_4K_SIZE);
		tileadr  = (WORD)VRAM[0x0800+ntbladr]*0x10+split_yofs;
		// Get Attribute
		attradr = 0x03C0+((ntbladr&0x0380)>>4)+((ntbladr&0x001C)>>2);
		attr = VRAM[0x0800+attradr];
		if( ntbladr & 0x0002 ) attr >>= 2;
		if( ntbladr & 0x0040 ) attr >>= 4;
		attr = (attr&0x03)<<2;
		// Get Pattern
		chr_l = VROM[tilebank+tileadr  ];
		chr_h = VROM[tilebank+tileadr+8];
	}
}

void	Mapper005::SaveState( LPBYTE p )
{
	p[ 0] = prg_size;
	p[ 1] = chr_size;
	p[ 2] = sram_we_a;
	p[ 3] = sram_we_b;
	p[ 4] = graphic_mode;
	p[ 5] = nametable_mode;
	p[ 6] = nametable_type[0];
	p[ 7] = nametable_type[1];
	p[ 8] = nametable_type[2];
	p[ 9] = nametable_type[3];
	p[10] = sram_page;
	p[11] = fill_chr;
	p[12] = fill_pal;
	p[13] = split_control;
	p[14] = split_scroll;
	p[15] = split_page;
	p[16] = chr_mode;
	p[17] = irq_status;
	p[18] = irq_enable;
	p[19] = irq_line;
	p[20] = irq_scanline;
	p[21] = irq_clear;
	p[22] = mult_a;
	p[23] = mult_b;

	INT	i, j;
	for( j = 0; j < 2; j++ ) {
		for( i = 0; i < 8; i++ ) {
			p[24+j*8+i] = chr_page[j][i];
		}
	}
	for( i = 0; i < 8; i++ ) {
		p[40+i] = BG_MEM_PAGE[i];
	}
}

void	Mapper005::LoadState( LPBYTE p )
{
	prg_size	  = p[ 0];
	chr_size	  = p[ 1];
	sram_we_a	  = p[ 2];
	sram_we_b	  = p[ 3];
	graphic_mode	  = p[ 4];
	nametable_mode	  = p[ 5];
	nametable_type[0] = p[ 6];
	nametable_type[1] = p[ 7];
	nametable_type[2] = p[ 8];
	nametable_type[3] = p[ 9];
	sram_page	  = p[10];
	fill_chr	  = p[11];
	fill_pal	  = p[12];
	split_control	  = p[13];
	split_scroll	  = p[14];
	split_page	  = p[15];
	chr_mode          = p[16];
	irq_status	  = p[17];
	irq_enable	  = p[18];
	irq_line	  = p[19];
	irq_scanline	  = p[20];
	irq_clear	  = p[21];
	mult_a		  = p[22];
	mult_b		  = p[23];

	INT	i, j;

	for( j = 0; j < 2; j++ ) {
		for( i = 0; i < 8; i++ ) {
			chr_page[j][i] = p[24+j*8+i];
		}
	}
	// BG僶儞僋偺嵞愝掕張棟
	for( i = 0; i < 8; i++ ) {
		BG_MEM_PAGE[i] = p[40+i]%VROM_1K_SIZE;
	}
	for( i = 0; i < 8; i++ ) {
		BG_MEM_BANK[i] = VROM+0x0400*BG_MEM_PAGE[i];
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -