AxibugEmuOnline/References/VirtuaNESex_src_191105/NES/Mapper/Mapper164.cpp
2024-08-05 17:58:53 +08:00

128 lines
2.6 KiB
C++

//////////////////////////////////////////////////////////////////////////
// Mapper164 Pocket Monster Gold //
//////////////////////////////////////////////////////////////////////////
void Mapper164::Reset()
{
reg5000 = 0;
reg5100 = 0;
SetBank_CPU();
SetBank_PPU();
nes->ppu->SetExtLatchMode( TRUE );
}
void Mapper164::WriteLow(WORD addr, BYTE data)
{
if(addr==0x5000){
p_mode = data>>7;
reg5000 = data;
SetBank_CPU();
SetBank_PPU();
}else if(addr==0x5100){
reg5100 = data;
SetBank_CPU();
SetBank_PPU();
}else if(addr>=0x6000){
CPU_MEM_BANK[addr>>13][addr&0x1FFF] = data;
}else{
DEBUGOUT("write to %04x:%02x\n", addr, data);
}
}
void Mapper164::SetBank_CPU()
{
int mode, base, bank;
base = (reg5100&1)<<5;
mode = (reg5000>>4)&0x07;
switch(mode){
case 0:
case 2:
case 4:
case 6: /* NORMAL MODE */
bank = (reg5000&0x0f);
bank += (reg5000&0x20)>>1;
SetPROM_16K_Bank(4, bank+base);
SetPROM_16K_Bank(6, base+0x1f);
DEBUGOUT("-- normal mode: mode=%d, bank=%d --\n", mode, bank);
break;
case 1:
case 3: /* REG MODE */
DEBUGOUT("-- reg mode --\n");
break;
case 5: /* 32K MODE */
bank = (reg5000&0x0f);
SetPROM_32K_Bank(bank+(base>>1));
// DEBUGOUT("-- 32K MODE: bank=%02x --\n", bank);
break;
case 7: /* HALF MODE */
bank = (reg5000&0x0f);
bank += (bank&0x08)<<1;
SetPROM_16K_Bank(4, bank+base);
bank = (bank&0x10)+0x0f;
SetPROM_16K_Bank(6, base+0x1f);
DEBUGOUT("-- half mode --\n");
break;
default:
break;
};
}
void Mapper164::SetBank_PPU()
{
SetCRAM_8K_Bank(0);
}
void Mapper164::PPU_ExtLatchX( INT x )
{
a3 = (x&1)<<3;
}
void Mapper164::PPU_ExtLatch( WORD ntbladr, BYTE& chr_l, BYTE& chr_h, BYTE& attr )
{
INT loopy_v = nes->ppu->GetPPUADDR();
INT loopy_y = nes->ppu->GetTILEY();
INT tileofs = (PPUREG[0]&PPU_BGTBL_BIT)<<8;
INT attradr = 0x23C0+(loopy_v&0x0C00)+((loopy_v&0x0380)>>4);
INT attrsft = (ntbladr&0x0040)>>4;
LPBYTE pNTBL = PPU_MEM_BANK[ntbladr>>10];
INT ntbl_x = ntbladr&0x001F;
INT tileadr;
attradr &= 0x3FF;
attr = ((pNTBL[attradr+(ntbl_x>>2)]>>((ntbl_x&2)+attrsft))&3)<<2;
tileadr = tileofs+pNTBL[ntbladr&0x03FF]*0x10+loopy_y;
if(p_mode){
tileadr = (tileadr&0xfff7)|a3;
chr_l = chr_h = PPU_MEM_BANK[tileadr>>10][ tileadr&0x03FF ];
}else{
chr_l = PPU_MEM_BANK[tileadr>>10][ tileadr&0x03FF ];
chr_h = PPU_MEM_BANK[tileadr>>10][(tileadr&0x03FF)+8];
}
}
void Mapper164::SaveState( LPBYTE p )
{
p[0] = reg5000;
p[1] = reg5100;
p[2] = a3;
p[3] = p_mode;
}
void Mapper164::LoadState( LPBYTE p )
{
reg5000 = p[0];
reg5100 = p[1];
a3 = p[2];
p_mode = p[3];
}