Update VRC4 with submapper

fixes 2-in-1 - Yuu Yuu + Dragonball Z
This commit is contained in:
alyosha-tas 2016-11-02 17:05:03 -04:00 committed by GitHub
parent 17d171148b
commit 0d0e6b5be4
1 changed files with 52 additions and 12 deletions

View File

@ -83,6 +83,8 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES
int latch6k_value;
bool isPirate = false;
// needed for 2-in-1 - Yuu Yuu + Dragonball Z [p1][!]
bool _isBMC = false;
public override void Dispose()
{
@ -114,19 +116,22 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES
void SyncPRG()
{
if (prg_mode)
if (!_isBMC)
{
prg_banks_8k[0] = 0xFE;
prg_banks_8k[1] = (byte)(prg_bank_reg_8k[1]);
prg_banks_8k[2] = (byte)(prg_bank_reg_8k[0]);
prg_banks_8k[3] = 0xFF;
}
else
{
prg_banks_8k[0] = (byte)(prg_bank_reg_8k[0]);
prg_banks_8k[1] = (byte)(prg_bank_reg_8k[1]);
prg_banks_8k[2] = 0xFE;
prg_banks_8k[3] = 0xFF;
if (prg_mode)
{
prg_banks_8k[0] = 0xFE;
prg_banks_8k[1] = (byte)(prg_bank_reg_8k[1]);
prg_banks_8k[2] = (byte)(prg_bank_reg_8k[0]);
prg_banks_8k[3] = 0xFF;
}
else
{
prg_banks_8k[0] = (byte)(prg_bank_reg_8k[0]);
prg_banks_8k[1] = (byte)(prg_bank_reg_8k[1]);
prg_banks_8k[2] = 0xFE;
prg_banks_8k[3] = 0xFF;
}
}
}
@ -172,6 +177,16 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES
remap = AddrA0A1_A2A3;
Cart.wram_size = 8;
break;
case "MAPPER023_BMC":
type = 4;
remap = AddrA0A1_A2A3;
Cart.wram_size = 8;
_isBMC = true;
prg_banks_8k[0] = (byte)(prg_bank_reg_8k[0]);
prg_banks_8k[1] = (byte)(prg_bank_reg_8k[1]);
prg_banks_8k[2] = 0xFE;
prg_banks_8k[3] = 0xFF;
break;
case "MAPPER025":
type = 4;
remap = AddrA3A2_A1A0;
@ -293,6 +308,31 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES
if ((addr & 1) == 1 && extrabig_chr)
chr_value = value & 0x1F;
// special instructions for BMC 2 in 1
if (_isBMC)
{
if (addr < 0x1000)
{
prg_banks_8k[prg_mode?1:0] = (byte)((prg_banks_8k[0] & 0x20) | (value & 0x1F));
return;
}
else if (addr >= 0x2000 && addr < 0x3000)
{
prg_banks_8k[1] = (byte)((prg_banks_8k[0] & 0x20) | (value & 0x1F));
return;
}
else if (addr >= 0x3000 && addr < 0x7000)
{
value = (byte)(value << 2 & 0x20);
prg_banks_8k[0] = (byte)(value | (prg_banks_8k[0] & 0x1F));
prg_banks_8k[1] = (byte)(value | (prg_banks_8k[1] & 0x1F));
prg_banks_8k[2] = (byte)(value | (prg_banks_8k[2] & 0x1F));
prg_banks_8k[3] = (byte)(value | (prg_banks_8k[3] & 0x1F));
return;
}
}
switch (addr)
{
default: