NesHawk - more missing variables in savestates
This commit is contained in:
parent
659831c534
commit
0d4dd3855b
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue