97 lines
1.7 KiB
C++
97 lines
1.7 KiB
C++
//////////////////////////////////////////////////////////////////////////
|
|
// Mapper012 Subor Computer V4.0 //
|
|
//////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
void Mapper167::Reset()
|
|
{
|
|
DWORD crc;
|
|
|
|
regs[0] = 0;
|
|
regs[1] = 0;
|
|
regs[2] = 0;
|
|
regs[3] = 0;
|
|
|
|
crc = nes->rom->GetPROM_CRC();
|
|
if(crc==0x82F1Fb96){
|
|
// Subor Computer(Russia)
|
|
rom_type = 1;
|
|
}else{
|
|
// Subor Computer(Chinese)
|
|
rom_type = 0;
|
|
}
|
|
|
|
SetBank_CPU();
|
|
SetBank_PPU();
|
|
}
|
|
|
|
void Mapper167::Write(WORD addr, BYTE data)
|
|
{
|
|
int idx;
|
|
|
|
idx = (addr>>13)&0x03;
|
|
regs[idx]=data;
|
|
SetBank_CPU();
|
|
SetBank_PPU();
|
|
// DEBUGOUT("write to %04x:%02x\n", addr, data);
|
|
}
|
|
|
|
|
|
void Mapper167::SetBank_CPU()
|
|
{
|
|
int base, bank;
|
|
|
|
base = ((regs[0]^regs[1])&0x10)<<1;
|
|
bank = (regs[2]^regs[3])&0x1f;
|
|
|
|
if(regs[1]&0x08){
|
|
bank &= 0xfe;
|
|
if(rom_type==0){
|
|
SetPROM_16K_Bank(4, base+bank+1);
|
|
SetPROM_16K_Bank(6, base+bank+0);
|
|
}else{
|
|
SetPROM_16K_Bank(6, base+bank+1);
|
|
SetPROM_16K_Bank(4, base+bank+0);
|
|
}
|
|
// DEBUGOUT("32K MODE!\n");
|
|
}else{
|
|
if(regs[1]&0x04){
|
|
SetPROM_16K_Bank(4, 0x1f);
|
|
SetPROM_16K_Bank(6, base+bank);
|
|
// DEBUGOUT("HIGH 16K MODE!\n");
|
|
}else{
|
|
SetPROM_16K_Bank(4, base+bank);
|
|
if(rom_type==0){
|
|
SetPROM_16K_Bank(6, 0x20);
|
|
}else{
|
|
SetPROM_16K_Bank(6, 0x07);
|
|
}
|
|
// DEBUGOUT("LOW 16K MODE!\n");
|
|
}
|
|
}
|
|
|
|
|
|
}
|
|
|
|
void Mapper167::SetBank_PPU()
|
|
{
|
|
SetCRAM_8K_Bank(0);
|
|
}
|
|
|
|
void Mapper167::SaveState( LPBYTE p )
|
|
{
|
|
p[0] = regs[0];
|
|
p[1] = regs[1];
|
|
p[2] = regs[2];
|
|
p[3] = regs[3];
|
|
p[4] = rom_type;
|
|
}
|
|
|
|
void Mapper167::LoadState( LPBYTE p )
|
|
{
|
|
regs[0] = p[0];
|
|
regs[1] = p[1];
|
|
regs[2] = p[2];
|
|
regs[3] = p[3];
|
|
rom_type = p[4];
|
|
} |