Update for VS TKO Boxing

NOTE:

TKO bosing needs a signal from coin reader for 2 frames, not just 1.
Need to account for this in controls
This commit is contained in:
alyosha-tas 2016-11-08 22:48:20 -05:00 committed by GitHub
parent 798f7d7549
commit 6a4515298c
1 changed files with 54 additions and 24 deletions

View File

@ -108,6 +108,10 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES
//let's make the extra space here, instead of in the main NES to avoid confusion
byte[] CIRAM_VS = new byte[0x800];
// security reading index for tko boxing
int tko_security = 0;
static byte[] TKO = new byte[] { 0xFF, 0xBF, 0xB7, 0x97, 0x97, 0x17, 0x57, 0x4F, 0x6F, 0x6B, 0xEB, 0xA9, 0xB1, 0x90, 0x94, 0x14,
0x56, 0x4E, 0x6F, 0x6B, 0xEB, 0xA9, 0xB1, 0x90, 0xD4, 0x5C, 0x3E, 0x26, 0x87, 0x83, 0x13, 0x51};
public override void Dispose()
{
@ -121,6 +125,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES
if (NES._isVS)
ser.Sync("CIRAM_VS", ref CIRAM_VS, false);
ser.Sync("tko security", ref tko_security);
mapper.SyncState(ser);
}
@ -214,42 +219,67 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES
return ROM[addr];
}
// the one VS system game that uses mapper 206 (Super Xevious) has security hardware in the EXP memory region
// I don't know the details, but it's obvious at least what values it expects to read from where
// there are 3 namco games which each use their own ICs for security in different ways
// for convenience they are assigned in the VS_security setting
// 16 = Super Xevious
// 32 = TKO Boxing
// 48 = RBI Baseball
public override byte ReadEXP(int addr)
{
if (!NES._isVS)
return base.ReadEXP(addr);
else
{
addr += 0x4000;
if (addr == 0x54FF)
return 0x05;
else if (addr == 0x5678)
{
if (NES.cpu.X == 0x0C)
return 0;
else
return 1;
}
else if (addr == 0x578F)
if (Cart.vs_security == 16)
{
if (NES.cpu.X == 0x0C)
return 0xD1;
else
return 0x89;
}
else if (addr == 0x5567)
{
if (NES.cpu.X == 0x0C)
return 0x3E;
else
return 0x37;
}
addr += 0x4000;
if (addr == 0x54FF)
return 0x05;
else if (addr == 0x5678)
{
if (NES.cpu.X == 0x0C)
return 0;
else
return 1;
}
else if (addr == 0x578F)
{
if (NES.cpu.X == 0x0C)
return 0xD1;
else
return 0x89;
}
else if (addr == 0x5567)
{
if (NES.cpu.X == 0x0C)
return 0x3E;
else
return 0x37;
}
else
return base.ReadEXP(addr - 0x4000);
}
else if (Cart.vs_security==32)
{
if (addr==0x1E00)
{
tko_security = 0;
return 0xAA; //not used??
}
if (addr == 0x1E01)
{
tko_security++;
return TKO[tko_security - 1];
}
return NES.DB;
}
else
return base.ReadEXP(addr - 0x4000);
{
return 0;
}
}
}