NesHawk - more missing variables in savestates

This commit is contained in:
adelikat 2020-03-19 20:02:22 -05:00
parent 659831c534
commit 0d4dd3855b
3 changed files with 114 additions and 109 deletions

View File

@ -20,31 +20,29 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES
[NES.INESBoardImplPriorityAttribute]
public sealed class ExROM : NesBoardBase
{
//configuraton
int prg_bank_mask_8k, chr_bank_mask_1k; //board setup (to be isolated from mmc5 code later, when we need the separate mmc5 class)
private int prg_bank_mask_8k, chr_bank_mask_1k; //board setup (to be isolated from mmc5 code later, when we need the separate mmc5 class)
//state
int irq_target, irq_counter;
bool irq_enabled, irq_pending, in_frame;
int exram_mode, chr_mode, prg_mode;
int chr_reg_high;
int ab_mode;
int[] regs_a = new int[8];
int[] regs_b = new int[4];
int[] regs_prg = new int[4];
int[] nt_modes = new int[4];
byte nt_fill_tile, nt_fill_attrib;
int wram_bank;
byte[] EXRAM = new byte[1024];
byte multiplicand, multiplier;
MMC5Audio audio;
//regeneratable state
int[] a_banks_1k = new int[8];
int[] b_banks_1k = new int[8];
int[] prg_banks_8k = new int[4];
byte product_low, product_high;
int last_nt_read;
bool irq_audio;
private int irq_target, irq_counter;
private bool irq_enabled, irq_pending, in_frame;
private int exram_mode, chr_mode, prg_mode;
private int chr_reg_high;
private int ab_mode;
private int[] regs_a = new int[8];
private int[] regs_b = new int[4];
private int[] regs_prg = new int[4];
private int[] nt_modes = new int[4];
private byte nt_fill_tile, nt_fill_attrib;
private int wram_bank;
private byte[] EXRAM = new byte[1024];
private byte multiplicand, multiplier;
private MMC5Audio audio;
private int[] _aBanks1K = new int[8];
private int[] _bBanks1K = new int[8];
private int[] _prgBanks8K = new int[4];
private byte product_low, product_high;
private int last_nt_read;
private bool irq_audio;
public MemoryDomain GetExRAM()
{
@ -61,6 +59,9 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES
public override void SyncState(Serializer ser)
{
base.SyncState(ser);
ser.Sync(nameof(_aBanks1K), ref _aBanks1K, false);
ser.Sync(nameof(_bBanks1K), ref _bBanks1K, false);
ser.Sync(nameof(_prgBanks8K), ref _prgBanks8K, false);
ser.Sync(nameof(irq_target), ref irq_target);
ser.Sync(nameof(irq_counter), ref irq_counter);
ser.Sync(nameof(irq_enabled), ref irq_enabled);
@ -147,7 +148,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES
int PRGGetBank(int addr, out bool ram)
{
int bank_8k = addr >> 13;
bank_8k = prg_banks_8k[bank_8k];
bank_8k = _prgBanks8K[bank_8k];
ram = (bank_8k & 0x80) == 0;
if (!ram)
bank_8k &= prg_bank_mask_8k;
@ -248,19 +249,19 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES
{
bool isPattern = NES.ppu.PPUON;
if (NES.ppu.ppuphase == PPU.PPU_PHASE_OBJ && isPattern)
bank_1k = a_banks_1k[bank_1k];
bank_1k = _aBanks1K[bank_1k];
else if (NES.ppu.ppuphase == PPU.PPU_PHASE_BG && isPattern)
bank_1k = b_banks_1k[bank_1k];
bank_1k = _bBanks1K[bank_1k];
else
{
bank_1k = ab_mode == 0
? a_banks_1k[bank_1k]
: b_banks_1k[bank_1k];
? _aBanks1K[bank_1k]
: _bBanks1K[bank_1k];
}
}
else
{
bank_1k = a_banks_1k[bank_1k];
bank_1k = _aBanks1K[bank_1k];
}
bank_1k &= chr_bank_mask_1k;
@ -724,22 +725,22 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES
switch (prg_mode)
{
case 0:
SetBank(prg_banks_8k, 0, 4, regs_prg[3]&~3);
SetBank(_prgBanks8K, 0, 4, regs_prg[3]&~3);
break;
case 1:
SetBank(prg_banks_8k, 0, 2, regs_prg[1] & ~1);
SetBank(prg_banks_8k, 2, 2, regs_prg[3] & ~1);
SetBank(_prgBanks8K, 0, 2, regs_prg[1] & ~1);
SetBank(_prgBanks8K, 2, 2, regs_prg[3] & ~1);
break;
case 2:
SetBank(prg_banks_8k, 0, 2, regs_prg[1] & ~1);
SetBank(prg_banks_8k, 2, 1, regs_prg[2]);
SetBank(prg_banks_8k, 3, 1, regs_prg[3]);
SetBank(_prgBanks8K, 0, 2, regs_prg[1] & ~1);
SetBank(_prgBanks8K, 2, 1, regs_prg[2]);
SetBank(_prgBanks8K, 3, 1, regs_prg[3]);
break;
case 3:
SetBank(prg_banks_8k, 0, 1, regs_prg[0]);
SetBank(prg_banks_8k, 1, 1, regs_prg[1]);
SetBank(prg_banks_8k, 2, 1, regs_prg[2]);
SetBank(prg_banks_8k, 3, 1, regs_prg[3]);
SetBank(_prgBanks8K, 0, 1, regs_prg[0]);
SetBank(_prgBanks8K, 1, 1, regs_prg[1]);
SetBank(_prgBanks8K, 2, 1, regs_prg[2]);
SetBank(_prgBanks8K, 3, 1, regs_prg[3]);
break;
}
}
@ -753,42 +754,42 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES
switch (chr_mode)
{
case 0:
SetBank(a_banks_1k, 0, 8, regs_a[7] * 8);
SetBank(b_banks_1k, 0, 8, regs_b[3] * 8);
SetBank(_aBanks1K, 0, 8, regs_a[7] * 8);
SetBank(_bBanks1K, 0, 8, regs_b[3] * 8);
break;
case 1:
SetBank(a_banks_1k, 0, 4, regs_a[3] * 4);
SetBank(a_banks_1k, 4, 4, regs_a[7] * 4);
SetBank(b_banks_1k, 0, 4, regs_b[3] * 4);
SetBank(b_banks_1k, 4, 4, regs_b[3] * 4);
SetBank(_aBanks1K, 0, 4, regs_a[3] * 4);
SetBank(_aBanks1K, 4, 4, regs_a[7] * 4);
SetBank(_bBanks1K, 0, 4, regs_b[3] * 4);
SetBank(_bBanks1K, 4, 4, regs_b[3] * 4);
break;
case 2:
SetBank(a_banks_1k, 0, 2, regs_a[1] * 2);
SetBank(a_banks_1k, 2, 2, regs_a[3] * 2);
SetBank(a_banks_1k, 4, 2, regs_a[5] * 2);
SetBank(a_banks_1k, 6, 2, regs_a[7] * 2);
SetBank(b_banks_1k, 0, 2, regs_b[1] * 2);
SetBank(b_banks_1k, 2, 2, regs_b[3] * 2);
SetBank(b_banks_1k, 4, 2, regs_b[1] * 2);
SetBank(b_banks_1k, 6, 2, regs_b[3] * 2);
SetBank(_aBanks1K, 0, 2, regs_a[1] * 2);
SetBank(_aBanks1K, 2, 2, regs_a[3] * 2);
SetBank(_aBanks1K, 4, 2, regs_a[5] * 2);
SetBank(_aBanks1K, 6, 2, regs_a[7] * 2);
SetBank(_bBanks1K, 0, 2, regs_b[1] * 2);
SetBank(_bBanks1K, 2, 2, regs_b[3] * 2);
SetBank(_bBanks1K, 4, 2, regs_b[1] * 2);
SetBank(_bBanks1K, 6, 2, regs_b[3] * 2);
break;
case 3:
SetBank(a_banks_1k, 0, 1, regs_a[0]);
SetBank(a_banks_1k, 1, 1, regs_a[1]);
SetBank(a_banks_1k, 2, 1, regs_a[2]);
SetBank(a_banks_1k, 3, 1, regs_a[3]);
SetBank(a_banks_1k, 4, 1, regs_a[4]);
SetBank(a_banks_1k, 5, 1, regs_a[5]);
SetBank(a_banks_1k, 6, 1, regs_a[6]);
SetBank(a_banks_1k, 7, 1, regs_a[7]);
SetBank(b_banks_1k, 0, 1, regs_b[0]);
SetBank(b_banks_1k, 1, 1, regs_b[1]);
SetBank(b_banks_1k, 2, 1, regs_b[2]);
SetBank(b_banks_1k, 3, 1, regs_b[3]);
SetBank(b_banks_1k, 4, 1, regs_b[0]);
SetBank(b_banks_1k, 5, 1, regs_b[1]);
SetBank(b_banks_1k, 6, 1, regs_b[2]);
SetBank(b_banks_1k, 7, 1, regs_b[3]);
SetBank(_aBanks1K, 0, 1, regs_a[0]);
SetBank(_aBanks1K, 1, 1, regs_a[1]);
SetBank(_aBanks1K, 2, 1, regs_a[2]);
SetBank(_aBanks1K, 3, 1, regs_a[3]);
SetBank(_aBanks1K, 4, 1, regs_a[4]);
SetBank(_aBanks1K, 5, 1, regs_a[5]);
SetBank(_aBanks1K, 6, 1, regs_a[6]);
SetBank(_aBanks1K, 7, 1, regs_a[7]);
SetBank(_bBanks1K, 0, 1, regs_b[0]);
SetBank(_bBanks1K, 1, 1, regs_b[1]);
SetBank(_bBanks1K, 2, 1, regs_b[2]);
SetBank(_bBanks1K, 3, 1, regs_b[3]);
SetBank(_bBanks1K, 4, 1, regs_b[0]);
SetBank(_bBanks1K, 5, 1, regs_b[1]);
SetBank(_bBanks1K, 6, 1, regs_b[2]);
SetBank(_bBanks1K, 7, 1, regs_b[3]);
break;
}
}

View File

@ -12,16 +12,15 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES
int reg_addr;
byte[] regs = new byte[8];
//volatile state
int[] chr_regs_1k = new int[8];
byte[] prg_regs_8k = new byte[4];
private int[] _chrRegs1K = new int[8];
private byte[] _prgRegs8K = new byte[4];
public override bool Configure(NES.EDetectionOrigin origin)
{
//analyze board type
switch (Cart.board_type)
{
case "MAPPER112":
case "MAPPER112":
break;
default:
return false;
@ -42,6 +41,9 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES
ser.Sync(nameof(reg_addr), ref reg_addr);
ser.Sync(nameof(regs), ref regs, false);
ser.Sync(nameof(chr_outer_reg), ref chr_outer_reg);
ser.Sync(nameof(_chrRegs1K), ref _chrRegs1K, false);
ser.Sync(nameof(_prgRegs8K), ref _prgRegs8K, false);
Sync();
}
@ -77,10 +79,10 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES
void Sync()
{
prg_regs_8k[0] = regs[0];
prg_regs_8k[1] = regs[1];
prg_regs_8k[2] = 0xFE;
prg_regs_8k[3] = 0xFF;
_prgRegs8K[0] = regs[0];
_prgRegs8K[1] = regs[1];
_prgRegs8K[2] = 0xFE;
_prgRegs8K[3] = 0xFF;
byte r0_0 = (byte)(regs[2] & ~1);
byte r0_1 = (byte)(regs[2] | 1);
@ -92,27 +94,27 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES
int temp6 = (chr_outer_reg & 0x40) << 2;
int temp7 = (chr_outer_reg & 0x80) << 1;
chr_regs_1k[0] = r0_0;
chr_regs_1k[1] = r0_1;
chr_regs_1k[2] = r1_0;
chr_regs_1k[3] = r1_1;
chr_regs_1k[4] = temp4 | regs[4];
chr_regs_1k[5] = temp5 | regs[5];
chr_regs_1k[6] = temp6 | regs[6];
chr_regs_1k[7] = temp7 | regs[7];
_chrRegs1K[0] = r0_0;
_chrRegs1K[1] = r0_1;
_chrRegs1K[2] = r1_0;
_chrRegs1K[3] = r1_1;
_chrRegs1K[4] = temp4 | regs[4];
_chrRegs1K[5] = temp5 | regs[5];
_chrRegs1K[6] = temp6 | regs[6];
_chrRegs1K[7] = temp7 | regs[7];
}
public int Get_PRGBank_8K(int addr)
{
int bank_8k = addr >> 13;
bank_8k = prg_regs_8k[bank_8k];
bank_8k = _prgRegs8K[bank_8k];
return bank_8k;
}
public int Get_CHRBank_1K(int addr)
{
int bank_1k = addr >> 10;
bank_1k = chr_regs_1k[bank_1k];
bank_1k = _chrRegs1K[bank_1k];
return bank_1k;
}

View File

@ -11,6 +11,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES
public sealed class VRC2_4 : NesBoardBase
{
#region addressmaps
// remaps addresses into vrc2b form
// all varieties of vrc2&4 require A15 = 1 (ie, we're in 8000:ffff), and key on A14:A12 in the same way
// in addition, each variety has two other bits; a "low bit" and a "high bit"
@ -56,35 +57,35 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES
#endregion
//configuration
int prg_bank_mask_8k, chr_bank_mask_1k;
int prg_reg_mask_8k;
Func<int, int> remap;
Func<int, int> fix_chr;
int type;
bool latch6k_exists = false;
private int prg_bank_mask_8k, chr_bank_mask_1k;
private int prg_reg_mask_8k;
private Func<int, int> remap;
private Func<int, int> fix_chr;
private int type;
private bool latch6k_exists = false;
// it's been verified that this should be true on all real VRC4 chips, and
// that some vrc4 boards support it: http://forums.nesdev.com/viewtopic.php?t=8569
// but no vrc4 game ever used it
bool extrabig_chr = false;
private bool extrabig_chr = false;
//state
public int[] prg_bank_reg_8k = new int[2];
private int[] prg_bank_reg_8k = new int[2];
public int[] chr_bank_reg_1k = new int[16];
bool prg_mode;
private bool _prgMode;
public byte[] prg_banks_8k = new byte[4];
public int[] chr_banks_1k = new int[8];
bool irq_mode;
bool irq_enabled, irq_pending, irq_autoen;
byte irq_reload;
byte irq_counter;
int irq_prescaler;
private bool irq_mode;
private bool irq_enabled, irq_pending, irq_autoen;
private byte irq_reload;
private byte irq_counter;
private int irq_prescaler;
public int extra_vrom;
int latch6k_value;
private int latch6k_value;
bool isPirate = false;
private bool isPirate = false;
// needed for 2-in-1 - Yuu Yuu + Dragonball Z [p1][!]
bool _isBMC = false;
private bool _isBMC = false;
public override void SyncState(Serializer ser)
{
@ -99,6 +100,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES
ser.Sync(nameof(irq_counter), ref irq_counter);
ser.Sync(nameof(irq_prescaler), ref irq_prescaler);
ser.Sync(nameof(extra_vrom), ref extra_vrom);
ser.Sync(nameof(_prgMode), ref _prgMode);
if (latch6k_exists)
ser.Sync(nameof(latch6k_value), ref latch6k_value);
//SyncPRG();
@ -113,7 +115,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES
{
if (!_isBMC)
{
if (prg_mode)
if (_prgMode)
{
prg_banks_8k[0] = 0xFE;
prg_banks_8k[1] = (byte)(prg_bank_reg_8k[1]);
@ -308,7 +310,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES
{
if (addr < 0x1000)
{
prg_banks_8k[prg_mode?1:0] = (byte)((prg_banks_8k[0] & 0x20) | (value & 0x1F));
prg_banks_8k[_prgMode?1:0] = (byte)((prg_banks_8k[0] & 0x20) | (value & 0x1F));
return;
}
else if (addr >= 0x2000 && addr < 0x3000)
@ -358,7 +360,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES
case 0x1002: //$9002
case 0x1003: //$9003
if (type == 4) prg_mode = value.Bit(1);
if (type == 4) _prgMode = value.Bit(1);
else goto case 0x1000;
SyncPRG();
break;