AxibugEmuOnline/References/VirtuaNESex_src_191105/NES/Mapper/Mapper170.cpp

156 lines
4.4 KiB
C++
Raw Normal View History

2024-08-05 17:58:53 +08:00
//////////////////////////////////////////////////////////////////////////
// Mapper170 PYRAMID //
//////////////////////////////////////////////////////////////////////////
void Mapper170::Reset()
{
for(INT i=0;i<8;i++) reg[i]=0;
for(i=0; i<32; i+=2)
{
memcpy( &WRAM00[0x400*i+0x000], PROM+0x400*((PROM_8K_SIZE*0x4+0x07)+i*8),0x400);
memcpy( &WRAM00[0x400*i+0x400], PROM+0x400*((PROM_8K_SIZE*0x4+0x0F)+i*8),0x400);
}
SetPROM_Bank0();
p_mode = 0;
NT_data = 0;
ex_slot2 = 0;
ex_slot3 = 0;
nes->ppu->SetExtLatchMode( TRUE );
dip_s++;
if(dip_s==4) dip_s=0;
Rom_Type = 0;
DWORD crc = nes->rom->GetPROM_CRC();
if( crc == 0xFE31765B ){ //[PYRAMID] PEC-9588 Computer & Game (C)
Rom_Type = 1;
SetPROM_32K_Bank( 0, 1, 0x3E, 0x3F );
}
if( crc == 0x428C1C1D //[FengLi] Zhong Ying Wen Dian Nao Ka (C)
|| crc == 0x836CDDEF ){ //[BaTong] Zhong Ying Wen Dian Nao Ka (C)
Rom_Type = 2;
SetPROM_32K_Bank( 0 );
}
}
BYTE Mapper170::ReadLow( WORD addr )
{
// DEBUGOUT( "ReadLow - addr= %04x ; dat= %03x\n", addr, Mapper::ReadLow( addr ) );
if(addr==0x5500) return ((dip_s&3)*0x10); //[0x00]=XinKe; [0x10]=KingWang; [0x20]=?ABC; [0x30]=KingWangEX
if(addr>=0x6000) return CPU_MEM_BANK[addr>>13][addr&0x1FFF];
return Mapper::ReadLow( addr );
}
void Mapper170::WriteLow( WORD addr, BYTE data )
{
// DEBUGOUT( "WriteLow - addr= %04x ; dat= %03x\n", addr, data );
if(addr>=0x6000) CPU_MEM_BANK[addr>>13][addr&0x1FFF]=data;
if(addr<0x6000){
reg[(addr&0x700)>>8] = data;
p_mode = reg[0]&0x80;
if((reg[0]&0x18)==0x18) SetVRAM_Mirror(VRAM_HMIRROR);
else SetVRAM_Mirror(VRAM_VMIRROR);
if( reg[0]&0x10 ){ // [PYRAMID] PEC-586 Computer & Game (C)
SetPROM_32K_Bank(reg[0]&0x07);
}else if((reg[0]&0x70)==0x40){
SetPROM_Bank0();
SetPROM_8K_Bank(4,(reg[0]&0x0F)|0x20);
}else if((reg[0]&0x70)==0x60){
SetPROM_Bank0();
SetPROM_8K_Bank(4,(reg[0]&0x0F)|0x30);
}else{
SetPROM_Bank0();
}
if(Rom_Type==1){ // [PYRAMID] PEC-9588 Computer & Game (C)
// DEBUGOUT( "MPRWR A=%04X D=%02X L=%3d CYC=%d\n", addr&0xFFFF, data&0xFF, nes->GetScanline(), nes->cpu->GetTotalCycles() );
switch( reg[0]&0x70 ) {
case 0x00:
SetPROM_16K_Bank( 4, reg[0]&0x0F );
SetPROM_16K_Bank( 6, 0x1F );
break;
case 0x10:
//
break;
case 0x20:
SetPROM_16K_Bank( 4, (reg[0]&0x0F) | 0x10 );
SetPROM_16K_Bank( 6, 0x1F );
break;
case 0x30: //С<><D0A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>2
ex_slot2 = 1;
// SetPROM_16K_Bank( 4, (reg[0]&0x0F) | 0x20 );
// SetPROM_16K_Bank( 6, 0x2F );
// SetPROM_32K_Bank((reg[0]&0x07)|0x20);
break;
case 0x40:
SetPROM_16K_Bank( 4, reg[0]&0x0F );
SetPROM_16K_Bank( 6, 0x1E );
break;
case 0x50: //С<><D0A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>3
ex_slot3 = 1;
break;
case 0x60:
SetPROM_16K_Bank( 4, (reg[0]&0x0F) | 0x10 );
SetPROM_16K_Bank( 6, 0x1E );
if(reg[0]>=0x6C) SetPROM_16K_Bank( 6, 0x1C );
break;
}
}
if(Rom_Type==2){
// DEBUGOUT( "MPRWR A=%04X D=%02X L=%3d CYC=%d\n", addr&0xFFFF, data&0xFF, nes->GetScanline(), nes->cpu->GetTotalCycles() );
SetPROM_32K_Bank(reg[0]&0x0F);
}
}
}
void Mapper170::PPU_Latch( WORD addr )
{
if((addr&0xF000)==0x2000){
NT_data=(addr>>8)&0x03;
}
}
void Mapper170::PPU_ExtLatchX( INT x )
{
a3 = (x&1)<<3;
}
void Mapper170::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){
if(NT_data&0x02) tileadr |= 0x1000;
else tileadr &= ~0x1000;
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];
}
}
BYTE Mapper170::PPU_ExtLatchSP() //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɫ<EFBFBD><C9AB><EFBFBD>⣬δ<E2A3AC><CEB4>ȫ
{
if(p_mode)
return 2; //<2F><>ʱ<EFBFBD><CAB1><EFBFBD>˴<EFBFBD><CBB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ԭ<EFBFBD><D4AD>δ֪<CEB4><D6AA>
return 0;
}
void Mapper170::SetPROM_Bank0(void)
{
SetPROM_Bank(4, &WRAM00[0x2000*0], 0);
SetPROM_Bank(5, &WRAM00[0x2000*1], 0);
SetPROM_Bank(6, &WRAM00[0x2000*2], 0);
SetPROM_Bank(7, &WRAM00[0x2000*3], 0);
}