void Map4_Set_PPU_Banks() { if ( S.NesHeader.VROMSize > 0 ) { if ( Map4_Chr_Swap() ) { W.PPUBANK[0] = VROMPAGE(MS4.PPU[2] % (Map4_Vsz)); W.PPUBANK[1] = VROMPAGE(MS4.PPU[3] % (Map4_Vsz)); W.PPUBANK[2] = VROMPAGE(MS4.PPU[4] % (Map4_Vsz)); W.PPUBANK[3] = VROMPAGE(MS4.PPU[5] % (Map4_Vsz)); W.PPUBANK[4] = VROMPAGE((MS4.PPU[0] ) % (Map4_Vsz)); W.PPUBANK[5] = VROMPAGE((MS4.PPU[0]+1) % (Map4_Vsz)); W.PPUBANK[6] = VROMPAGE((MS4.PPU[1] ) % (Map4_Vsz)); W.PPUBANK[7] = VROMPAGE((MS4.PPU[1]+1) % (Map4_Vsz)); } else { W.PPUBANK[4] = VROMPAGE(MS4.PPU[2] % (Map4_Vsz)); W.PPUBANK[5] = VROMPAGE(MS4.PPU[3] % (Map4_Vsz)); W.PPUBANK[6] = VROMPAGE(MS4.PPU[4] % (Map4_Vsz)); W.PPUBANK[7] = VROMPAGE(MS4.PPU[5] % (Map4_Vsz)); W.PPUBANK[0] = VROMPAGE((MS4.PPU[0] ) % (Map4_Vsz)); W.PPUBANK[1] = VROMPAGE((MS4.PPU[0]+1) % (Map4_Vsz)); W.PPUBANK[2] = VROMPAGE((MS4.PPU[1] ) % (Map4_Vsz)); W.PPUBANK[3] = VROMPAGE((MS4.PPU[1]+1) % (Map4_Vsz)); } NESCore_Develop_Character_Data(); } else { W.PPUBANK[ 0 ] = CRAMPAGE( 0 ); W.PPUBANK[ 1 ] = CRAMPAGE( 1 ); W.PPUBANK[ 2 ] = CRAMPAGE( 2 ); W.PPUBANK[ 3 ] = CRAMPAGE( 3 ); W.PPUBANK[ 4 ] = CRAMPAGE( 4 ); W.PPUBANK[ 5 ] = CRAMPAGE( 5 ); W.PPUBANK[ 6 ] = CRAMPAGE( 6 ); W.PPUBANK[ 7 ] = CRAMPAGE( 7 ); NESCore_Develop_Character_Data(); } }
void Map4_Write( word wAddr, byte bData ) { dword dwBankNum; switch ( wAddr & 0xe001 ) { case 0x8000: MS4.Regs[ 0 ] = bData; Map4_Set_CPU_Banks(); break; case 0x8001: MS4.Regs[ 1 ] = bData; dwBankNum = MS4.Regs[ 1 ]; switch ( MS4.Regs[ 0 ] & 0x07 ) { /* Set PPU Banks */ case 0x00: if ( S.NesHeader.VROMSize > 0 ) { dwBankNum &= 0xfe; MS4.PPU[0] = dwBankNum; if ( Map4_Chr_Swap() ) { W.PPUBANK[4] = VROMPAGE((MS4.PPU[0] ) % (Map4_Vsz)); W.PPUBANK[5] = VROMPAGE((MS4.PPU[0]+1) % (Map4_Vsz)); } else { W.PPUBANK[0] = VROMPAGE((MS4.PPU[0] ) % (Map4_Vsz)); W.PPUBANK[1] = VROMPAGE((MS4.PPU[0]+1) % (Map4_Vsz)); } NESCore_Develop_Character_Data(); } break; case 0x01: if ( S.NesHeader.VROMSize > 0 ) { dwBankNum &= 0xfe; MS4.PPU[1] = dwBankNum; if ( Map4_Chr_Swap() ) { W.PPUBANK[6] = VROMPAGE((MS4.PPU[1] ) % (Map4_Vsz)); W.PPUBANK[7] = VROMPAGE((MS4.PPU[1]+1) % (Map4_Vsz)); } else { W.PPUBANK[2] = VROMPAGE((MS4.PPU[1] ) % (Map4_Vsz)); W.PPUBANK[3] = VROMPAGE((MS4.PPU[1]+1) % (Map4_Vsz)); } NESCore_Develop_Character_Data(); } break; case 0x02: if ( S.NesHeader.VROMSize > 0 ) { MS4.PPU[2] = dwBankNum; if ( Map4_Chr_Swap() ) W.PPUBANK[0] = VROMPAGE( MS4.PPU[2] % ( Map4_Vsz ) ); else W.PPUBANK[4] = VROMPAGE( MS4.PPU[2] % ( Map4_Vsz ) ); NESCore_Develop_Character_Data(); } break; case 0x03: if ( S.NesHeader.VROMSize > 0 ) { MS4.PPU[3] = dwBankNum; if ( Map4_Chr_Swap() ) W.PPUBANK[1] = VROMPAGE( MS4.PPU[3] % ( Map4_Vsz ) ); else W.PPUBANK[5] = VROMPAGE( MS4.PPU[3] % ( Map4_Vsz ) ); NESCore_Develop_Character_Data(); } break; case 0x04: if ( S.NesHeader.VROMSize > 0 ) { MS4.PPU[4] = dwBankNum; if ( Map4_Chr_Swap() ) W.PPUBANK[2] = VROMPAGE( MS4.PPU[4] % ( Map4_Vsz ) ); else W.PPUBANK[6] = VROMPAGE( MS4.PPU[4] % ( Map4_Vsz ) ); NESCore_Develop_Character_Data(); } break; case 0x05: if ( S.NesHeader.VROMSize > 0 ) { MS4.PPU[5] = dwBankNum; if ( Map4_Chr_Swap() ) W.PPUBANK[3] = VROMPAGE( MS4.PPU[5] % ( Map4_Vsz ) ); else W.PPUBANK[7] = VROMPAGE( MS4.PPU[5] % ( Map4_Vsz ) ); NESCore_Develop_Character_Data(); } break; /* Set ROM Banks */ case 0x06: MS4.Prg0 = dwBankNum; Map4_Set_CPU_Banks(); break; case 0x07: MS4.Prg1 = dwBankNum; Map4_Set_CPU_Banks(); break; } break; case 0xa000: MS4.Regs[ 2 ] = bData & 1; if (!S.ROM_FourScr) { if ( bData & 0x01 ) { NESCore_Mirroring( 0 ); } else { NESCore_Mirroring( 1 ); } } break; case 0xa001: MS4.Regs[ 3 ] = bData; break; case 0xe000: /* ACK IRQ */ MS4.IRQ_Enabled = 0; break; case 0xe001: /* Enable IRQ */ MS4.IRQ_Enabled = 1; break; } /* Old IRQ Technique */ /* if (wAddr >= 0xc000 && wAddr <= 0xdfff) { if (wAddr % 2 == 0) { MS4.IRQ_Counter = bData; } else { MS4.IRQ_Latch = bData; } } */ if (wAddr >= 0xc000 && wAddr <= 0xdfff) { if (wAddr % 2 == 0) { MS4.IRQ_Latch = bData; } else { MS4.IRQ_Counter = MS4.IRQ_Latch; } } }
/*-------------------------------------------------------------------*/ void Map4_Set_PPU_Banks() { if ( NesHeader.byVRomSize > 0 ) { if ( Map4_Chr_Swap() ) { PPUBANK[ 0 ] = VROMPAGE( Map4_Chr4 % ( NesHeader.byVRomSize << 3 ) ); PPUBANK[ 1 ] = VROMPAGE( Map4_Chr5 % ( NesHeader.byVRomSize << 3 ) ); PPUBANK[ 2 ] = VROMPAGE( Map4_Chr6 % ( NesHeader.byVRomSize << 3 ) ); PPUBANK[ 3 ] = VROMPAGE( Map4_Chr7 % ( NesHeader.byVRomSize << 3 ) ); PPUBANK[ 4 ] = VROMPAGE( ( Map4_Chr01 + 0 ) % ( NesHeader.byVRomSize << 3 ) ); PPUBANK[ 5 ] = VROMPAGE( ( Map4_Chr01 + 1 ) % ( NesHeader.byVRomSize << 3 ) ); PPUBANK[ 6 ] = VROMPAGE( ( Map4_Chr23 + 0 ) % ( NesHeader.byVRomSize << 3 ) ); PPUBANK[ 7 ] = VROMPAGE( ( Map4_Chr23 + 1 ) % ( NesHeader.byVRomSize << 3 ) ); InfoNES_SetupChr(); } else { PPUBANK[ 0 ] = VROMPAGE( ( Map4_Chr01 + 0 ) % ( NesHeader.byVRomSize << 3 ) ); PPUBANK[ 1 ] = VROMPAGE( ( Map4_Chr01 + 1 ) % ( NesHeader.byVRomSize << 3 ) ); PPUBANK[ 2 ] = VROMPAGE( ( Map4_Chr23 + 0 ) % ( NesHeader.byVRomSize << 3 ) ); PPUBANK[ 3 ] = VROMPAGE( ( Map4_Chr23 + 1 ) % ( NesHeader.byVRomSize << 3 ) ); PPUBANK[ 4 ] = VROMPAGE( Map4_Chr4 % ( NesHeader.byVRomSize << 3 ) ); PPUBANK[ 5 ] = VROMPAGE( Map4_Chr5 % ( NesHeader.byVRomSize << 3 ) ); PPUBANK[ 6 ] = VROMPAGE( Map4_Chr6 % ( NesHeader.byVRomSize << 3 ) ); PPUBANK[ 7 ] = VROMPAGE( Map4_Chr7 % ( NesHeader.byVRomSize << 3 ) ); InfoNES_SetupChr(); } } else { if ( Map4_Chr_Swap() ) { #if 0 PPUBANK[ 0 ] = VRAMPAGE0( 0 ); PPUBANK[ 1 ] = VRAMPAGE0( 1 ); PPUBANK[ 2 ] = VRAMPAGE0( 2 ); PPUBANK[ 3 ] = VRAMPAGE0( 3 ); PPUBANK[ 4 ] = VRAMPAGE1( 0 ); PPUBANK[ 5 ] = VRAMPAGE1( 1 ); PPUBANK[ 6 ] = VRAMPAGE1( 2 ); PPUBANK[ 7 ] = VRAMPAGE1( 3 ); #else PPUBANK[ 0 ] = CRAMPAGE( 0 ); PPUBANK[ 1 ] = CRAMPAGE( 1 ); PPUBANK[ 2 ] = CRAMPAGE( 2 ); PPUBANK[ 3 ] = CRAMPAGE( 3 ); PPUBANK[ 4 ] = CRAMPAGE( 4 ); PPUBANK[ 5 ] = CRAMPAGE( 5 ); PPUBANK[ 6 ] = CRAMPAGE( 6 ); PPUBANK[ 7 ] = CRAMPAGE( 7 ); #endif InfoNES_SetupChr(); } else { #if 0 PPUBANK[ 0 ] = VRAMPAGE1( 0 ); PPUBANK[ 1 ] = VRAMPAGE1( 1 ); PPUBANK[ 2 ] = VRAMPAGE1( 2 ); PPUBANK[ 3 ] = VRAMPAGE1( 3 ); PPUBANK[ 4 ] = VRAMPAGE0( 0 ); PPUBANK[ 5 ] = VRAMPAGE0( 1 ); PPUBANK[ 6 ] = VRAMPAGE0( 2 ); PPUBANK[ 7 ] = VRAMPAGE0( 3 ); #else PPUBANK[ 0 ] = CRAMPAGE( 0 ); PPUBANK[ 1 ] = CRAMPAGE( 1 ); PPUBANK[ 2 ] = CRAMPAGE( 2 ); PPUBANK[ 3 ] = CRAMPAGE( 3 ); PPUBANK[ 4 ] = CRAMPAGE( 4 ); PPUBANK[ 5 ] = CRAMPAGE( 5 ); PPUBANK[ 6 ] = CRAMPAGE( 6 ); PPUBANK[ 7 ] = CRAMPAGE( 7 ); #endif InfoNES_SetupChr(); } } }