fix missing savestate data in some NESHawk mappers, note this is a breaking savestate change for these boards, but they were broken anyway, these were critical fields to savestate
This commit is contained in:
parent
8bcab5af79
commit
659831c534
|
@ -9,7 +9,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES
|
|||
public class ConyA : NesBoardBase
|
||||
{
|
||||
private byte[] prg_regs = new byte[4];
|
||||
private byte[] low = new byte[4]; // some kind of security feature?
|
||||
private byte[] _low = new byte[4]; // some kind of security feature?
|
||||
private byte[] chr_regs = new byte[8];
|
||||
|
||||
private int prg_bank_mask_16k, prg_bank_mask_8k, chr_bank_mask_2k;
|
||||
|
@ -51,6 +51,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES
|
|||
ser.Sync(nameof(mode), ref mode);
|
||||
ser.Sync(nameof(is_2k_bank), ref is_2k_bank);
|
||||
ser.Sync(nameof(is_not_2k_bank), ref is_not_2k_bank);
|
||||
ser.Sync(nameof(_low), ref _low, false);
|
||||
}
|
||||
|
||||
public void Mirroring()
|
||||
|
@ -158,10 +159,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES
|
|||
bank = prg_bank_mask_8k;
|
||||
|
||||
return Rom[(bank << 13) + (addr & 0x1FFF)];
|
||||
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public override void ClockCpu()
|
||||
|
@ -181,7 +179,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES
|
|||
public override void WriteExp(int addr, byte value)
|
||||
{
|
||||
if (addr >= 0x1100 && addr <= 0x1103)
|
||||
low[addr & 0x3] = value;
|
||||
_low[addr & 0x3] = value;
|
||||
else
|
||||
base.WriteExp(addr, value);
|
||||
}
|
||||
|
@ -191,7 +189,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES
|
|||
if (addr == 0x1000)
|
||||
return (byte)((NES.DB & 0xFC) | 0);
|
||||
else if (addr >= 0x1100 && addr <= 0x1103)
|
||||
return low[addr & 0x3];
|
||||
return _low[addr & 0x3];
|
||||
else
|
||||
return base.ReadExp(addr);
|
||||
|
||||
|
@ -201,7 +199,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES
|
|||
public class ConyB : NesBoardBase
|
||||
{
|
||||
private byte[] prg_regs = new byte[4];
|
||||
private byte[] low = new byte[4]; // some kind of security feature?
|
||||
private byte[] _low = new byte[4]; // some kind of security feature?
|
||||
private byte[] chr_regs = new byte[8];
|
||||
|
||||
private int prg_bank_mask_16k, prg_bank_mask_8k, chr_bank_mask_2k;
|
||||
|
@ -242,6 +240,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES
|
|||
ser.Sync(nameof(mode), ref mode);
|
||||
ser.Sync(nameof(is_2k_bank), ref is_2k_bank);
|
||||
ser.Sync(nameof(is_not_2k_bank), ref is_not_2k_bank);
|
||||
ser.Sync(nameof(_low), ref _low, false);
|
||||
}
|
||||
|
||||
public void Mirroring()
|
||||
|
@ -370,7 +369,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES
|
|||
public override void WriteExp(int addr, byte value)
|
||||
{
|
||||
if (addr >= 0x1100 && addr <= 0x1103)
|
||||
low[addr & 0x3] = value;
|
||||
_low[addr & 0x3] = value;
|
||||
else
|
||||
base.WriteExp(addr, value);
|
||||
}
|
||||
|
@ -380,7 +379,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES
|
|||
if (addr == 0x1000)
|
||||
return (byte)((NES.DB & 0xFC) | 0);
|
||||
else if (addr >= 0x1100 && addr <= 0x1103)
|
||||
return low[addr & 0x3];
|
||||
return _low[addr & 0x3];
|
||||
else
|
||||
return base.ReadExp(addr);
|
||||
|
||||
|
@ -395,8 +394,8 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES
|
|||
private byte[] chr_regs = new byte[8];
|
||||
|
||||
private int prg_bank_mask_16k;
|
||||
private int IRQCount;
|
||||
private bool IRQa, IRQ_enable;
|
||||
private int _irqCount;
|
||||
private bool _irqA, _irqEnable;
|
||||
|
||||
public override bool Configure(NES.EDetectionOrigin origin)
|
||||
{
|
||||
|
@ -427,6 +426,9 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES
|
|||
base.SyncState(ser);
|
||||
ser.Sync(nameof(chr_regs), ref chr_regs, false);
|
||||
ser.Sync(nameof(prg_regs), ref prg_regs, false);
|
||||
ser.Sync(nameof(_irqCount), ref _irqCount);
|
||||
ser.Sync(nameof(_irqA), ref _irqA);
|
||||
ser.Sync(nameof(_irqEnable), ref _irqEnable);
|
||||
}
|
||||
|
||||
public override void WritePrg(int addr, byte value)
|
||||
|
@ -443,19 +445,19 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES
|
|||
|
||||
else if (addr == 0x200)
|
||||
{
|
||||
IRQCount &= 0xFF00; IRQCount |= value;
|
||||
_irqCount &= 0xFF00; _irqCount |= value;
|
||||
IrqSignal = false;
|
||||
}
|
||||
|
||||
else if (addr == 0x201)
|
||||
{
|
||||
IRQCount &= 0xFF;
|
||||
IRQCount |= value << 8;
|
||||
IRQa = true;
|
||||
_irqCount &= 0xFF;
|
||||
_irqCount |= value << 8;
|
||||
_irqA = true;
|
||||
}
|
||||
else if (addr == 0x0100)
|
||||
{
|
||||
IRQ_enable = value.Bit(7);
|
||||
_irqEnable = value.Bit(7);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -483,13 +485,13 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES
|
|||
|
||||
public override void ClockCpu()
|
||||
{
|
||||
if (IRQa)
|
||||
if (_irqA)
|
||||
{
|
||||
IRQCount--;
|
||||
if (IRQCount == 0)
|
||||
_irqCount--;
|
||||
if (_irqCount == 0)
|
||||
{
|
||||
IRQCount = 0xFFFF;
|
||||
IrqSignal = IRQ_enable;
|
||||
_irqCount = 0xFFFF;
|
||||
IrqSignal = _irqEnable;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -4,13 +4,13 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES
|
|||
{
|
||||
public sealed class Mapper142 : NesBoardBase
|
||||
{
|
||||
private byte[] reg = new byte[8];
|
||||
private byte cmd;
|
||||
private int lastBank;
|
||||
private byte[] _reg = new byte[8];
|
||||
private byte _cmd;
|
||||
private int _lastBank;
|
||||
|
||||
private bool isirqused = false;
|
||||
private byte IRQa = 0;
|
||||
private int IRQCount = 0;
|
||||
private bool _isIrqUsed;
|
||||
private byte _irqA;
|
||||
private int _irqCount;
|
||||
|
||||
public override bool Configure(NES.EDetectionOrigin origin)
|
||||
{
|
||||
|
@ -22,25 +22,37 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES
|
|||
default:
|
||||
return false;
|
||||
}
|
||||
|
||||
SetMirrorType(EMirrorType.Horizontal);
|
||||
lastBank = Cart.prg_size / 8 - 1;
|
||||
_lastBank = Cart.prg_size / 8 - 1;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public override void SyncState(Serializer ser)
|
||||
{
|
||||
base.SyncState(ser);
|
||||
ser.Sync(nameof(_reg), ref _reg, false);
|
||||
ser.Sync(nameof(_cmd), ref _cmd);
|
||||
ser.Sync(nameof(_lastBank), ref _lastBank);
|
||||
ser.Sync(nameof(_isIrqUsed), ref _isIrqUsed);
|
||||
ser.Sync(nameof(_irqA), ref _irqA);
|
||||
ser.Sync(nameof(_irqCount), ref _irqCount);
|
||||
}
|
||||
|
||||
public override byte ReadWram(int addr)
|
||||
{
|
||||
return Rom[(reg[4] << 13) + (addr & 0x1FFF)];
|
||||
return Rom[(_reg[4] << 13) + (addr & 0x1FFF)];
|
||||
}
|
||||
|
||||
public override byte ReadPrg(int addr)
|
||||
{
|
||||
|
||||
if (addr < 0x2000) { return Rom[(reg[1] << 13) + (addr & 0x1FFF)]; }
|
||||
if (addr < 0x4000) { return Rom[(reg[2] << 13) + (addr & 0x1FFF)]; }
|
||||
if (addr < 0x6000) { return Rom[(reg[3] << 13) + (addr & 0x1FFF)]; }
|
||||
if (addr < 0x2000) { return Rom[(_reg[1] << 13) + (addr & 0x1FFF)]; }
|
||||
if (addr < 0x4000) { return Rom[(_reg[2] << 13) + (addr & 0x1FFF)]; }
|
||||
if (addr < 0x6000) { return Rom[(_reg[3] << 13) + (addr & 0x1FFF)]; }
|
||||
|
||||
return Rom[(lastBank << 13) + (addr & 0x1FFF)];
|
||||
return Rom[(_lastBank << 13) + (addr & 0x1FFF)];
|
||||
}
|
||||
|
||||
public override void WriteExp(int addr, byte value)
|
||||
|
@ -60,13 +72,13 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES
|
|||
|
||||
private void IRQHook(int a)
|
||||
{
|
||||
if (IRQa > 0)
|
||||
if (_irqA > 0)
|
||||
{
|
||||
IRQCount += a;
|
||||
if (IRQCount >= 0xFFFF)
|
||||
_irqCount += a;
|
||||
if (_irqCount >= 0xFFFF)
|
||||
{
|
||||
IRQa = 0;
|
||||
IRQCount = 0;
|
||||
_irqA = 0;
|
||||
_irqCount = 0;
|
||||
|
||||
IrqSignal = true;
|
||||
}
|
||||
|
@ -84,37 +96,37 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES
|
|||
{
|
||||
case 0x8000:
|
||||
IrqSignal = false;
|
||||
IRQCount = (IRQCount & 0x000F) | (value & 0x0F);
|
||||
isirqused = true;
|
||||
_irqCount = (_irqCount & 0x000F) | (value & 0x0F);
|
||||
_isIrqUsed = true;
|
||||
break;
|
||||
case 0x9000:
|
||||
IrqSignal = false;
|
||||
IRQCount = (IRQCount & 0x00F0) | ((value & 0x0F) << 4);
|
||||
isirqused = true;
|
||||
_irqCount = (_irqCount & 0x00F0) | ((value & 0x0F) << 4);
|
||||
_isIrqUsed = true;
|
||||
break;
|
||||
case 0xA000:
|
||||
IrqSignal = false;
|
||||
IRQCount = (IRQCount & 0x0F00) | ((value & 0x0F) << 8);
|
||||
isirqused = true;
|
||||
_irqCount = (_irqCount & 0x0F00) | ((value & 0x0F) << 8);
|
||||
_isIrqUsed = true;
|
||||
break;
|
||||
case 0xB000:
|
||||
IrqSignal = false;
|
||||
IRQCount = (IRQCount & 0xF000) | (value << 12);
|
||||
isirqused = true;
|
||||
_irqCount = (_irqCount & 0xF000) | (value << 12);
|
||||
_isIrqUsed = true;
|
||||
break;
|
||||
case 0xC000:
|
||||
if (isirqused)
|
||||
if (_isIrqUsed)
|
||||
{
|
||||
IrqSignal = false;
|
||||
IRQa = 1;
|
||||
_irqA = 1;
|
||||
}
|
||||
break;
|
||||
|
||||
case 0xE000:
|
||||
cmd = (byte)(value & 7);
|
||||
_cmd = (byte)(value & 7);
|
||||
break;
|
||||
case 0xF000:
|
||||
reg[cmd] = value;
|
||||
_reg[_cmd] = value;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -5,17 +5,13 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES
|
|||
{
|
||||
public sealed class Mapper227 : NesBoardBase
|
||||
{
|
||||
//configuration
|
||||
int prg_bank_mask_16k;
|
||||
|
||||
//state
|
||||
int prg;
|
||||
bool vram_protected;
|
||||
byte[] prg_banks_16k = new byte[2];
|
||||
|
||||
//1200-in-1
|
||||
//[NJXXX] Xiang Shuai Chuan Qi
|
||||
private int _prgBankMask16K;
|
||||
private int prg;
|
||||
private bool _vramProtected;
|
||||
private byte[] _prgBanks16K = new byte[2];
|
||||
|
||||
// 1200-in-1
|
||||
// [NJXXX] Xiang Shuai Chuan Qi
|
||||
public override bool Configure(NES.EDetectionOrigin origin)
|
||||
{
|
||||
//configure
|
||||
|
@ -28,20 +24,27 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES
|
|||
default:
|
||||
return false;
|
||||
}
|
||||
prg_bank_mask_16k = (Cart.prg_size / 16) - 1;
|
||||
_prgBankMask16K = (Cart.prg_size / 16) - 1;
|
||||
|
||||
SetMirrorType(EMirrorType.Vertical);
|
||||
vram_protected = false;
|
||||
prg_banks_16k[0] = prg_banks_16k[1] = 0;
|
||||
_vramProtected = false;
|
||||
_prgBanks16K[0] = _prgBanks16K[1] = 0;
|
||||
return true;
|
||||
}
|
||||
|
||||
public override void SyncState(Serializer ser)
|
||||
{
|
||||
base.SyncState(ser);
|
||||
ser.Sync(nameof(prg), ref prg);
|
||||
ser.Sync(nameof(_prgBanks16K), ref _prgBanks16K, false);
|
||||
}
|
||||
|
||||
public override byte ReadPrg(int addr)
|
||||
{
|
||||
int bank_16k = addr >> 14;
|
||||
int ofs = addr & ((1 << 14) - 1);
|
||||
bank_16k = prg_banks_16k[bank_16k];
|
||||
bank_16k &= prg_bank_mask_16k;
|
||||
bank_16k = _prgBanks16K[bank_16k];
|
||||
bank_16k &= _prgBankMask16K;
|
||||
addr = (bank_16k << 14) | ofs;
|
||||
return Rom[addr];
|
||||
}
|
||||
|
@ -63,58 +66,51 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES
|
|||
|
||||
if (o == true && S == false)
|
||||
{
|
||||
prg_banks_16k[0] = (byte)(p);
|
||||
prg_banks_16k[1] = (byte)(p);
|
||||
_prgBanks16K[0] = (byte)(p);
|
||||
_prgBanks16K[1] = (byte)(p);
|
||||
}
|
||||
if (o == true && S == true)
|
||||
{
|
||||
prg_banks_16k[0] = (byte)((p & ~1));
|
||||
prg_banks_16k[1] = (byte)((p & ~1) + 1);
|
||||
_prgBanks16K[0] = (byte)((p & ~1));
|
||||
_prgBanks16K[1] = (byte)((p & ~1) + 1);
|
||||
}
|
||||
if (o == false && S == false && L == false)
|
||||
{
|
||||
prg_banks_16k[0] = (byte)p;
|
||||
prg_banks_16k[1] = (byte)(p & 0x38);
|
||||
_prgBanks16K[0] = (byte)p;
|
||||
_prgBanks16K[1] = (byte)(p & 0x38);
|
||||
}
|
||||
if (o == false && S == true && L == false)
|
||||
{
|
||||
prg_banks_16k[0] = (byte)(p & 0x3E);
|
||||
prg_banks_16k[1] = (byte)(p & 0x38);
|
||||
_prgBanks16K[0] = (byte)(p & 0x3E);
|
||||
_prgBanks16K[1] = (byte)(p & 0x38);
|
||||
}
|
||||
if (o == false && S == false && L == true)
|
||||
{
|
||||
prg_banks_16k[0] = (byte)p;
|
||||
prg_banks_16k[1] = (byte)(p | 0x07);
|
||||
_prgBanks16K[0] = (byte)p;
|
||||
_prgBanks16K[1] = (byte)(p | 0x07);
|
||||
}
|
||||
if (o == false && S == true && L == true)
|
||||
{
|
||||
prg_banks_16k[0] = (byte)(p & 0x3E);
|
||||
prg_banks_16k[1] = (byte)(p | 0x07);
|
||||
_prgBanks16K[0] = (byte)(p & 0x3E);
|
||||
_prgBanks16K[1] = (byte)(p | 0x07);
|
||||
}
|
||||
|
||||
prg_banks_16k[0] = (byte)(prg_banks_16k[0]&prg_bank_mask_16k);
|
||||
prg_banks_16k[1] = (byte)(prg_banks_16k[1]&prg_bank_mask_16k);
|
||||
_prgBanks16K[0] = (byte)(_prgBanks16K[0]&_prgBankMask16K);
|
||||
_prgBanks16K[1] = (byte)(_prgBanks16K[1]&_prgBankMask16K);
|
||||
|
||||
if (M_horz) SetMirrorType(EMirrorType.Horizontal);
|
||||
else SetMirrorType(EMirrorType.Vertical);
|
||||
}
|
||||
|
||||
|
||||
public override void WritePpu(int addr, byte value)
|
||||
{
|
||||
if (addr < 0x2000)
|
||||
{
|
||||
if (vram_protected)
|
||||
if (_vramProtected)
|
||||
return;
|
||||
else base.WritePpu(addr, value);
|
||||
}
|
||||
else base.WritePpu(addr, value);
|
||||
}
|
||||
|
||||
public override void SyncState(Serializer ser)
|
||||
{
|
||||
base.SyncState(ser);
|
||||
ser.Sync(nameof(prg), ref prg);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -9,13 +9,12 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES
|
|||
private byte[] preg = new byte[2];
|
||||
private byte[] creg = new byte[8];
|
||||
|
||||
private int prg_bank_mask_8k, chr_bank_mask_1k;
|
||||
private int IRQLatch, IRQClock, IRQCount;
|
||||
private bool IRQa;
|
||||
private int _prgBankMask8K, _chrBankMask1K;
|
||||
private int _irqLatch, _irqClock, _irqCount;
|
||||
private bool _irqA;
|
||||
|
||||
public override bool Configure(NES.EDetectionOrigin origin)
|
||||
{
|
||||
//analyze board type
|
||||
switch (Cart.board_type)
|
||||
{
|
||||
case "MAPPER252":
|
||||
|
@ -23,12 +22,13 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES
|
|||
default:
|
||||
return false;
|
||||
}
|
||||
|
||||
AssertPrg(256);
|
||||
AssertChr(128);
|
||||
AssertVram(2);
|
||||
AssertWram(8);
|
||||
prg_bank_mask_8k = Cart.prg_size / 8 - 1;
|
||||
chr_bank_mask_1k = Cart.chr_size - 1;
|
||||
_prgBankMask8K = Cart.prg_size / 8 - 1;
|
||||
_chrBankMask1K = Cart.chr_size - 1;
|
||||
SetMirrorType(EMirrorType.Vertical);
|
||||
return true;
|
||||
}
|
||||
|
@ -38,27 +38,30 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES
|
|||
base.SyncState(ser);
|
||||
ser.Sync(nameof(preg), ref preg, false);
|
||||
ser.Sync(nameof(creg), ref creg, false);
|
||||
ser.Sync(nameof(_irqLatch), ref _irqLatch);
|
||||
ser.Sync(nameof(_irqClock), ref _irqClock);
|
||||
ser.Sync(nameof(_irqCount), ref _irqCount);
|
||||
ser.Sync(nameof(_irqA), ref _irqA);
|
||||
}
|
||||
|
||||
public override void ClockCpu()
|
||||
{
|
||||
if (IRQa)
|
||||
if (_irqA)
|
||||
{
|
||||
IRQClock += 3;
|
||||
if (IRQClock >= 341)
|
||||
_irqClock += 3;
|
||||
if (_irqClock >= 341)
|
||||
{
|
||||
IRQClock -= 341;
|
||||
IRQCount++;
|
||||
if (IRQCount==0x100)
|
||||
_irqClock -= 341;
|
||||
_irqCount++;
|
||||
if (_irqCount==0x100)
|
||||
{
|
||||
IrqSignal=true;
|
||||
IRQCount = IRQLatch;
|
||||
_irqCount = _irqLatch;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public override void WritePrg(int addr, byte value)
|
||||
{
|
||||
WriteReg((addr + 0x8000), value);
|
||||
|
@ -90,9 +93,9 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES
|
|||
preg[1] = value;
|
||||
break;
|
||||
|
||||
case 0xF000: IrqSignal = false; IRQLatch &= 0xF0; IRQLatch |= value & 0xF; break;
|
||||
case 0xF004: IrqSignal = false; IRQLatch &= 0x0F; IRQLatch |= value << 4; break;
|
||||
case 0xF008: IrqSignal = false; IRQClock = 0; IRQCount = IRQLatch; IRQa = value.Bit(1); break;
|
||||
case 0xF000: IrqSignal = false; _irqLatch &= 0xF0; _irqLatch |= value & 0xF; break;
|
||||
case 0xF004: IrqSignal = false; _irqLatch &= 0x0F; _irqLatch |= value << 4; break;
|
||||
case 0xF008: IrqSignal = false; _irqClock = 0; _irqCount = _irqLatch; _irqA = value.Bit(1); break;
|
||||
|
||||
}
|
||||
}
|
||||
|
@ -104,19 +107,19 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES
|
|||
|
||||
if (addr < 0x2000)
|
||||
{
|
||||
bank = preg[0] & prg_bank_mask_8k;
|
||||
bank = preg[0] & _prgBankMask8K;
|
||||
}
|
||||
else if (addr < 0x4000)
|
||||
{
|
||||
bank = preg[1] & prg_bank_mask_8k;
|
||||
bank = preg[1] & _prgBankMask8K;
|
||||
}
|
||||
else if (addr < 0x6000)
|
||||
{
|
||||
bank = prg_bank_mask_8k - 1;
|
||||
bank = _prgBankMask8K - 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
bank = prg_bank_mask_8k;
|
||||
bank = _prgBankMask8K;
|
||||
}
|
||||
|
||||
|
||||
|
@ -137,7 +140,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES
|
|||
}
|
||||
else
|
||||
{
|
||||
bank = (creg[x] & chr_bank_mask_1k) << 10;
|
||||
bank = (creg[x] & _chrBankMask1K) << 10;
|
||||
return Vrom[bank + (addr & 0x3FF)];
|
||||
}
|
||||
|
||||
|
|
|
@ -5,14 +5,14 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES
|
|||
{
|
||||
public class Mapper253 : NesBoardBase
|
||||
{
|
||||
private byte[] prg = new byte[2];
|
||||
private byte[] _prg = new byte[2];
|
||||
private byte[] chrlo = new byte[8];
|
||||
private byte[] chrhi = new byte[8];
|
||||
private bool vlock;
|
||||
private int IRQLatch, IRQClock, IRQCount;
|
||||
private bool IRQa;
|
||||
private bool _vLock;
|
||||
private int _irqLatch, _irqClock, _irqCount;
|
||||
private bool _irqA;
|
||||
|
||||
private int prg_bank_mask_8k, chr_bank_mask_1k;
|
||||
private int _prgBankMask8K, _chrBankMask1k;
|
||||
|
||||
public override bool Configure(NES.EDetectionOrigin origin)
|
||||
{
|
||||
|
@ -25,8 +25,8 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES
|
|||
return false;
|
||||
}
|
||||
|
||||
prg_bank_mask_8k = Cart.prg_size / 8 - 1;
|
||||
chr_bank_mask_1k = Cart.chr_size - 1;
|
||||
_prgBankMask8K = Cart.prg_size / 8 - 1;
|
||||
_chrBankMask1k = Cart.chr_size - 1;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
@ -34,24 +34,24 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES
|
|||
public override void SyncState(Serializer ser)
|
||||
{
|
||||
base.SyncState(ser);
|
||||
ser.Sync("preg", ref prg, false);
|
||||
ser.Sync("preg", ref _prg, false);
|
||||
ser.Sync(nameof(chrlo), ref chrlo, false);
|
||||
ser.Sync(nameof(chrhi), ref chrhi, false);
|
||||
}
|
||||
|
||||
public override void ClockCpu()
|
||||
{
|
||||
if (IRQa)
|
||||
if (_irqA)
|
||||
{
|
||||
IRQClock += 3;
|
||||
if (IRQClock >= 341)
|
||||
_irqClock += 3;
|
||||
if (_irqClock >= 341)
|
||||
{
|
||||
IRQClock -= 341;
|
||||
IRQCount++;
|
||||
if (IRQCount == 0x100)
|
||||
_irqClock -= 341;
|
||||
_irqCount++;
|
||||
if (_irqCount == 0x100)
|
||||
{
|
||||
IrqSignal = true;
|
||||
IRQCount = IRQLatch;
|
||||
_irqCount = _irqLatch;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -69,9 +69,9 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES
|
|||
if (ind == 0)
|
||||
{
|
||||
if (clo == 0xc8)
|
||||
vlock = false;
|
||||
_vLock = false;
|
||||
else if (clo == 0x88)
|
||||
vlock = true;
|
||||
_vLock = true;
|
||||
}
|
||||
if (sar > 0)
|
||||
chrhi[ind] = (byte)(value >> 4);
|
||||
|
@ -80,13 +80,13 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES
|
|||
{
|
||||
switch (addr)
|
||||
{
|
||||
case 0x8010: prg[0] = value; break;
|
||||
case 0xA010: prg[1] = value; break;
|
||||
case 0x8010: _prg[0] = value; break;
|
||||
case 0xA010: _prg[1] = value; break;
|
||||
case 0x9400: SetMirroring(value); break;
|
||||
|
||||
case 0xF000: IrqSignal = false; IRQLatch &= 0xF0; IRQLatch |= value & 0xF; break;
|
||||
case 0xF004: IrqSignal = false; IRQLatch &= 0x0F; IRQLatch |= value << 4; break;
|
||||
case 0xF008: IrqSignal = false; IRQClock = 0; IRQCount = IRQLatch; IRQa = value.Bit(1); break;
|
||||
case 0xF000: IrqSignal = false; _irqLatch &= 0xF0; _irqLatch |= value & 0xF; break;
|
||||
case 0xF004: IrqSignal = false; _irqLatch &= 0x0F; _irqLatch |= value << 4; break;
|
||||
case 0xF008: IrqSignal = false; _irqClock = 0; _irqCount = _irqLatch; _irqA = value.Bit(1); break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -108,19 +108,19 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES
|
|||
|
||||
if (addr < 0x2000)
|
||||
{
|
||||
bank = prg[0] & prg_bank_mask_8k;
|
||||
bank = _prg[0] & _prgBankMask8K;
|
||||
}
|
||||
else if (addr < 0x4000)
|
||||
{
|
||||
bank = prg[1] & prg_bank_mask_8k;
|
||||
bank = _prg[1] & _prgBankMask8K;
|
||||
}
|
||||
else if (addr < 0x6000)
|
||||
{
|
||||
bank = prg_bank_mask_8k - 1;
|
||||
bank = _prgBankMask8K - 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
bank = prg_bank_mask_8k;
|
||||
bank = _prgBankMask8K;
|
||||
}
|
||||
|
||||
|
||||
|
@ -134,9 +134,9 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES
|
|||
{
|
||||
int x = (addr >> 10) & 7;
|
||||
var chr = chrlo[x] | (chrhi[x] << 8);
|
||||
int bank = (chr & chr_bank_mask_1k) << 10;
|
||||
int bank = (chr & _chrBankMask1k) << 10;
|
||||
|
||||
if ((chrlo[x] == 4 || chrlo[x] == 5) && !vlock)
|
||||
if ((chrlo[x] == 4 || chrlo[x] == 5) && !_vLock)
|
||||
{
|
||||
bank = chr & 1;
|
||||
return Vram[(bank << 10) + (addr & 0x3FF)];
|
||||
|
@ -159,9 +159,9 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES
|
|||
{
|
||||
int x = (addr >> 10) & 7;
|
||||
var chr = chrlo[x] | (chrhi[x] << 8);
|
||||
int bank = (chr & chr_bank_mask_1k) << 10;
|
||||
int bank = (chr & _chrBankMask1k) << 10;
|
||||
|
||||
if ((chrlo[x] == 4 || chrlo[x] == 5) && !vlock)
|
||||
if ((chrlo[x] == 4 || chrlo[x] == 5) && !_vLock)
|
||||
{
|
||||
bank = chr & 1;
|
||||
Vram[(bank << 10) + (addr & 0x3FF)]=value;
|
||||
|
|
|
@ -1,30 +1,23 @@
|
|||
//see http://nesdev.parodius.com/bbs/viewtopic.php?t=5426&sid=e7472c15a758ebf05c588c8330c2187f
|
||||
//and http://nesdev.parodius.com/bbs/viewtopic.php?t=311
|
||||
//for some info on NAMCOT 108
|
||||
//but mostly http://wiki.nesdev.com/w/index.php/INES_Mapper_206
|
||||
using BizHawk.Common;
|
||||
|
||||
// see http://nesdev.parodius.com/bbs/viewtopic.php?t=5426&sid=e7472c15a758ebf05c588c8330c2187f
|
||||
// and http://nesdev.parodius.com/bbs/viewtopic.php?t=311
|
||||
// for some info on NAMCOT 108
|
||||
// but mostly http://wiki.nesdev.com/w/index.php/INES_Mapper_206
|
||||
//TODO - prg is 4 bits, chr is 6 bits
|
||||
|
||||
using BizHawk.Common;
|
||||
|
||||
namespace BizHawk.Emulation.Cores.Nintendo.NES
|
||||
{
|
||||
//also, Namcot109, Namcot118, Namcot119 chips are this exact same thing
|
||||
// also, Namcot109, Namcot118, Namcot119 chips are this exact same thing
|
||||
public class Namcot108Chip
|
||||
{
|
||||
//state
|
||||
int reg_addr;
|
||||
byte[] regs = new byte[8];
|
||||
private int reg_addr;
|
||||
private byte[] regs = new byte[8];
|
||||
|
||||
//volatile state
|
||||
byte[] chr_regs_1k = new byte[8];
|
||||
byte[] prg_regs_8k = new byte[4];
|
||||
private byte[] _chrRegs1K = new byte[8];
|
||||
private byte[] _prgRegs8K = new byte[4];
|
||||
|
||||
NesBoardBase board;
|
||||
public Namcot108Chip(NesBoardBase board)
|
||||
{
|
||||
this.board = board;
|
||||
|
||||
Sync();
|
||||
}
|
||||
|
||||
|
@ -32,6 +25,8 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES
|
|||
{
|
||||
ser.Sync(nameof(reg_addr), ref reg_addr);
|
||||
ser.Sync(nameof(regs), ref regs, false);
|
||||
ser.Sync(nameof(_chrRegs1K), ref _chrRegs1K, false);
|
||||
ser.Sync(nameof(_prgRegs8K), ref _prgRegs8K, false);
|
||||
Sync();
|
||||
}
|
||||
|
||||
|
@ -52,37 +47,37 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES
|
|||
|
||||
void Sync()
|
||||
{
|
||||
prg_regs_8k[0] = regs[6];
|
||||
prg_regs_8k[1] = regs[7];
|
||||
prg_regs_8k[2] = 0xFE;
|
||||
prg_regs_8k[3] = 0xFF;
|
||||
_prgRegs8K[0] = regs[6];
|
||||
_prgRegs8K[1] = regs[7];
|
||||
_prgRegs8K[2] = 0xFE;
|
||||
_prgRegs8K[3] = 0xFF;
|
||||
|
||||
byte r0_0 = (byte)(regs[0] & ~1);
|
||||
byte r0_1 = (byte)(regs[0] | 1);
|
||||
byte r1_0 = (byte)(regs[1] & ~1);
|
||||
byte r1_1 = (byte)(regs[1] | 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] = regs[2];
|
||||
chr_regs_1k[5] = regs[3];
|
||||
chr_regs_1k[6] = regs[4];
|
||||
chr_regs_1k[7] = regs[5];
|
||||
_chrRegs1K[0] = r0_0;
|
||||
_chrRegs1K[1] = r0_1;
|
||||
_chrRegs1K[2] = r1_0;
|
||||
_chrRegs1K[3] = r1_1;
|
||||
_chrRegs1K[4] = regs[2];
|
||||
_chrRegs1K[5] = regs[3];
|
||||
_chrRegs1K[6] = regs[4];
|
||||
_chrRegs1K[7] = regs[5];
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -5,7 +5,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES
|
|||
public sealed class UNIF_BMC_FK23C : MMC3Board_Base
|
||||
{
|
||||
private byte[] exRegs = new byte[8];
|
||||
private int[] chr_regs_1k = new int[8];
|
||||
private int[] _chrRegs1K = new int[8];
|
||||
public int[] prg_regs_8k = new int[4];
|
||||
|
||||
[MapperProp]
|
||||
|
@ -56,14 +56,14 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES
|
|||
byte r1_0 = (byte)(mmc3.regs[1] & ~1);
|
||||
byte r1_1 = (byte)(mmc3.regs[1] | 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] = mmc3.regs[2];
|
||||
chr_regs_1k[5] = mmc3.regs[3];
|
||||
chr_regs_1k[6] = mmc3.regs[4];
|
||||
chr_regs_1k[7] = mmc3.regs[5];
|
||||
_chrRegs1K[0] = r0_0;
|
||||
_chrRegs1K[1] = r0_1;
|
||||
_chrRegs1K[2] = r1_0;
|
||||
_chrRegs1K[3] = r1_1;
|
||||
_chrRegs1K[4] = mmc3.regs[2];
|
||||
_chrRegs1K[5] = mmc3.regs[3];
|
||||
_chrRegs1K[6] = mmc3.regs[4];
|
||||
_chrRegs1K[7] = mmc3.regs[5];
|
||||
|
||||
UpdateChr_2();
|
||||
UpdatePrg_2();
|
||||
|
@ -75,6 +75,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES
|
|||
{
|
||||
base.SyncState(ser);
|
||||
ser.Sync(nameof(exRegs), ref exRegs, false);
|
||||
ser.Sync(nameof(_chrRegs1K), ref _chrRegs1K, false);
|
||||
ser.Sync(nameof(prg_regs_8k), ref prg_regs_8k, false);
|
||||
ser.Sync(nameof(prg_mask), ref prg_mask_8k);
|
||||
ser.Sync(nameof(chr_mask), ref chr_mask_1k);
|
||||
|
@ -88,7 +89,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES
|
|||
{
|
||||
int bank = mmc3.chr_regs_1k[i];
|
||||
if (((exRegs[0] & 0x40) == 0) && (((exRegs[3] & 0x2) == 0) || (i != 1 && i != 3)))
|
||||
chr_regs_1k[i] = ((exRegs[2] & 0x7F) << 3 | bank );
|
||||
_chrRegs1K[i] = ((exRegs[2] & 0x7F) << 3 | bank );
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -97,22 +98,22 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES
|
|||
if ((exRegs[0] & 0x40) > 0)
|
||||
{
|
||||
int bank = (exRegs[2] | unromChr);
|
||||
chr_regs_1k[0] = bank;
|
||||
chr_regs_1k[1] = bank;//(bank + 1);
|
||||
chr_regs_1k[2] = bank;//(bank + 2);
|
||||
chr_regs_1k[3] = bank;//(bank + 3);
|
||||
chr_regs_1k[4] = bank;//(bank + 4);
|
||||
chr_regs_1k[5] = bank;//(bank + 5);
|
||||
chr_regs_1k[6] = bank;//(bank + 6);
|
||||
chr_regs_1k[7] = bank;//(bank + 7);
|
||||
_chrRegs1K[0] = bank;
|
||||
_chrRegs1K[1] = bank;//(bank + 1);
|
||||
_chrRegs1K[2] = bank;//(bank + 2);
|
||||
_chrRegs1K[3] = bank;//(bank + 3);
|
||||
_chrRegs1K[4] = bank;//(bank + 4);
|
||||
_chrRegs1K[5] = bank;//(bank + 5);
|
||||
_chrRegs1K[6] = bank;//(bank + 6);
|
||||
_chrRegs1K[7] = bank;//(bank + 7);
|
||||
}
|
||||
else
|
||||
{
|
||||
if ((exRegs[3] & 0x2) > 0)
|
||||
{
|
||||
int bank = (exRegs[2] & 0x7F) << 3;
|
||||
chr_regs_1k[1] = (bank | exRegs[6]);
|
||||
chr_regs_1k[3] = (bank | exRegs[7]);
|
||||
_chrRegs1K[1] = (bank | exRegs[6]);
|
||||
_chrRegs1K[3] = (bank | exRegs[7]);
|
||||
}
|
||||
UpdateChr();
|
||||
}
|
||||
|
@ -238,7 +239,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES
|
|||
if (addr < 0x2000)
|
||||
{
|
||||
int bank_1k = addr >> 10;
|
||||
bank_1k = chr_regs_1k[bank_1k];
|
||||
bank_1k = _chrRegs1K[bank_1k];
|
||||
|
||||
if ((exRegs[0] & 0x40) > 0)
|
||||
addr = (bank_1k << 13) | (addr & 0x1FFF);
|
||||
|
|
|
@ -410,6 +410,7 @@
|
|||
<s:Boolean x:Key="/Default/UserDictionary/Words/=Mupen/@EntryIndexedValue">True</s:Boolean>
|
||||
<s:Boolean x:Key="/Default/UserDictionary/Words/=mutexing/@EntryIndexedValue">True</s:Boolean>
|
||||
<s:Boolean x:Key="/Default/UserDictionary/Words/=muxed/@EntryIndexedValue">True</s:Boolean>
|
||||
<s:Boolean x:Key="/Default/UserDictionary/Words/=Namcot/@EntryIndexedValue">True</s:Boolean>
|
||||
<s:Boolean x:Key="/Default/UserDictionary/Words/=Nametable/@EntryIndexedValue">True</s:Boolean>
|
||||
<s:Boolean x:Key="/Default/UserDictionary/Words/=Nametables/@EntryIndexedValue">True</s:Boolean>
|
||||
<s:Boolean x:Key="/Default/UserDictionary/Words/=neshawk/@EntryIndexedValue">True</s:Boolean>
|
||||
|
|
Loading…
Reference in New Issue