📄 mapper005.cpp
字号:
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 + -