156 lines
4.4 KiB
C++
156 lines
4.4 KiB
C++
//////////////////////////////////////////////////////////////////////////
|
||
// 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);
|
||
} |