Files
player/Project/Src/NES/mapper/009.cpp
2025-06-27 00:32:57 +08:00

168 lines
2.8 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "nes_mapper.h"
void MAP9_set_VROM_1000(void);
void MAP9_set_VROM_0000(void);
uint8 MAP9_regs[6];
uint8 MAP9_latch_0000;
uint8 MAP9_latch_1000;
/////////////////////////////////////////////////////////////////////
// Mapper 9
void MAP9_Reset()
{
int i;
// // set CPU bank pointers
// set_CPU_banks(0,num_8k_ROM_banks-3,num_8k_ROM_banks-2,num_8k_ROM_banks-1);
for( i = 0; i < sizeof(MAP9_regs)/sizeof(MAP9_regs[0]); i++)
MAP9_regs[i] = 0;
MAP9_regs[2] = 4;
MAP9_latch_0000 = 0xFE;
MAP9_latch_1000 = 0xFE;
MAP9_set_VROM_0000();
MAP9_set_VROM_1000();
}
void MAP9_PPU_Latch_FDFE(uint32 addr)
{
if(addr & 0x1000)
{
MAP9_latch_1000 = (addr & 0x0FF0) >> 4;
MAP9_set_VROM_1000();
}
else
{
MAP9_latch_0000 = (addr & 0x0FF0) >> 4;
MAP9_set_VROM_0000();
}
}
void MAP9_set_VROM_0000()
{
int bank_num = (MAP9_latch_0000 == 0xFD) ? MAP9_regs[1] : MAP9_regs[2];
bank_num <<= 2;
set_PPU_bank0(bank_num+0);
set_PPU_bank1(bank_num+1);
set_PPU_bank2(bank_num+2);
set_PPU_bank3(bank_num+3);
}
void MAP9_set_VROM_1000()
{
int bank_num = (MAP9_latch_1000 == 0xFD) ? MAP9_regs[3] : MAP9_regs[4];
bank_num <<= 2;
set_PPU_bank4(bank_num+0);
set_PPU_bank5(bank_num+1);
set_PPU_bank6(bank_num+2);
set_PPU_bank7(bank_num+3);
}
void MAP9_MemoryWrite(uint16 addr, uint8 data)
{
uint8 bank_num ;
switch(addr & 0xF000)
{
case 0xA000:
{
MAP9_regs[0] = data;
// 8K ROM bank at $8000
bank_num = MAP9_regs[0];
set_CPU_bank4(bank_num);
}
break;
case 0xB000:
{
// B000-BFFF: select 4k VROM for (0000) $FD latch
MAP9_regs[1] = data;
MAP9_set_VROM_0000();
}
break;
case 0xC000:
{
// C000-CFFF: select 4k VROM for (0000) $FE latch
MAP9_regs[2] = data;
MAP9_set_VROM_0000();
}
break;
case 0xD000:
{
// D000-DFFF: select 4k VROM for (1000) $FD latch
MAP9_regs[3] = data;
MAP9_set_VROM_1000();
}
break;
case 0xE000:
{
// E000-EFFF: select 4k VROM for (1000) $FE latch
MAP9_regs[4] = data;
MAP9_set_VROM_1000();
}
break;
case 0xF000:
{
MAP9_regs[5] = data;
if(MAP9_regs[5] & 0x01)
{
set_mirroring(0,0,1,1);//ˮƽ<CBAE><C6BD><EFBFBD><EFBFBD>InfoNES_Mirroring( 0 ); //0011
//set_mirroring(NES_PPU::MIRROR_HORIZ);
}
else
{
set_mirroring(0,1,0,1);//<2F><>ֱ<EFBFBD><D6B1><EFBFBD><EFBFBD>InfoNES_Mirroring( 1 ); //0101
//set_mirroring(NES_PPU::MIRROR_VERT);
}
}
break;
}
}
void MAP9_SNSS_fixup()
{
MAP9_set_VROM_0000();
MAP9_set_VROM_1000();
}
void MAP9_Init()
{
NES_Mapper->Reset = MAP9_Reset;
NES_Mapper->Write = MAP9_MemoryWrite;
}