NesHawk - properly dispose of bytebuffers
This commit is contained in:
parent
109b21239b
commit
45ba9254cb
|
@ -26,6 +26,12 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public override void Dispose()
|
||||||
|
{
|
||||||
|
regs.Dispose();
|
||||||
|
base.Dispose();
|
||||||
|
}
|
||||||
|
|
||||||
public override void SyncState(Serializer ser)
|
public override void SyncState(Serializer ser)
|
||||||
{
|
{
|
||||||
base.SyncState(ser);
|
base.SyncState(ser);
|
||||||
|
|
|
@ -40,6 +40,14 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public override void Dispose()
|
||||||
|
{
|
||||||
|
prg_regs.Dispose();
|
||||||
|
low.Dispose();
|
||||||
|
chr_regs.Dispose();
|
||||||
|
base.Dispose();
|
||||||
|
}
|
||||||
|
|
||||||
public override void SyncState(Serializer ser)
|
public override void SyncState(Serializer ser)
|
||||||
{
|
{
|
||||||
base.SyncState(ser);
|
base.SyncState(ser);
|
||||||
|
|
|
@ -59,6 +59,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES
|
||||||
public override void Dispose()
|
public override void Dispose()
|
||||||
{
|
{
|
||||||
prg_banks_16k.Dispose();
|
prg_banks_16k.Dispose();
|
||||||
|
chr_banks_8k.Dispose();
|
||||||
base.Dispose();
|
base.Dispose();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -56,6 +56,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES
|
||||||
public override void Dispose()
|
public override void Dispose()
|
||||||
{
|
{
|
||||||
prg_banks_16k.Dispose();
|
prg_banks_16k.Dispose();
|
||||||
|
chr_banks_8k.Dispose();
|
||||||
base.Dispose();
|
base.Dispose();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -23,6 +23,12 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public override void Dispose()
|
||||||
|
{
|
||||||
|
exRegs.Dispose();
|
||||||
|
base.Dispose();
|
||||||
|
}
|
||||||
|
|
||||||
public override void SyncState(Serializer ser)
|
public override void SyncState(Serializer ser)
|
||||||
{
|
{
|
||||||
base.SyncState(ser);
|
base.SyncState(ser);
|
||||||
|
|
|
@ -24,6 +24,12 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public override void Dispose()
|
||||||
|
{
|
||||||
|
EXPREGS.Dispose();
|
||||||
|
base.Dispose();
|
||||||
|
}
|
||||||
|
|
||||||
public override void SyncState(Serializer ser)
|
public override void SyncState(Serializer ser)
|
||||||
{
|
{
|
||||||
base.SyncState(ser);
|
base.SyncState(ser);
|
||||||
|
|
|
@ -23,6 +23,12 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public override void Dispose()
|
||||||
|
{
|
||||||
|
exRegs.Dispose();
|
||||||
|
base.Dispose();
|
||||||
|
}
|
||||||
|
|
||||||
public override void SyncState(Serializer ser)
|
public override void SyncState(Serializer ser)
|
||||||
{
|
{
|
||||||
base.SyncState(ser);
|
base.SyncState(ser);
|
||||||
|
|
|
@ -1,37 +1,43 @@
|
||||||
using BizHawk.Common;
|
using BizHawk.Common;
|
||||||
|
|
||||||
namespace BizHawk.Emulation.Cores.Nintendo.NES
|
namespace BizHawk.Emulation.Cores.Nintendo.NES
|
||||||
{
|
{
|
||||||
public sealed class Mapper199 : MMC3Board_Base
|
public sealed class Mapper199 : MMC3Board_Base
|
||||||
{
|
{
|
||||||
private ByteBuffer exRegs = new ByteBuffer(4);
|
private ByteBuffer exRegs = new ByteBuffer(4);
|
||||||
|
|
||||||
public override bool Configure(NES.EDetectionOrigin origin)
|
public override bool Configure(NES.EDetectionOrigin origin)
|
||||||
{
|
{
|
||||||
switch (Cart.board_type)
|
switch (Cart.board_type)
|
||||||
{
|
{
|
||||||
case "MAPPER199":
|
case "MAPPER199":
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
exRegs[0] = (byte)(Cart.prg_size / 8 - 2);
|
exRegs[0] = (byte)(Cart.prg_size / 8 - 2);
|
||||||
exRegs[1] = (byte)(Cart.prg_size / 8 - 1);
|
exRegs[1] = (byte)(Cart.prg_size / 8 - 1);
|
||||||
exRegs[2] = 1;
|
exRegs[2] = 1;
|
||||||
exRegs[3] = 3;
|
exRegs[3] = 3;
|
||||||
|
|
||||||
BaseSetup();
|
BaseSetup();
|
||||||
mmc3.MirrorMask = 3;
|
mmc3.MirrorMask = 3;
|
||||||
return true;
|
return true;
|
||||||
}
|
|
||||||
|
|
||||||
public override void SyncState(Serializer ser)
|
|
||||||
{
|
|
||||||
base.SyncState(ser);
|
|
||||||
ser.Sync("exRegs", ref exRegs);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public override void Dispose()
|
||||||
|
{
|
||||||
|
exRegs.Dispose();
|
||||||
|
base.Dispose();
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void SyncState(Serializer ser)
|
||||||
|
{
|
||||||
|
base.SyncState(ser);
|
||||||
|
ser.Sync("exRegs", ref exRegs);
|
||||||
|
}
|
||||||
|
|
||||||
public override byte ReadPPU(int addr)
|
public override byte ReadPPU(int addr)
|
||||||
{
|
{
|
||||||
if (addr < 0x2000)
|
if (addr < 0x2000)
|
||||||
|
@ -167,28 +173,28 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES
|
||||||
base.WritePPU(addr, value);
|
base.WritePPU(addr, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override int Get_PRGBank_8K(int addr)
|
protected override int Get_PRGBank_8K(int addr)
|
||||||
{
|
{
|
||||||
if (addr >= 0x4000 && addr < 0x6000)
|
if (addr >= 0x4000 && addr < 0x6000)
|
||||||
{
|
{
|
||||||
return exRegs[0];
|
return exRegs[0];
|
||||||
}
|
}
|
||||||
else if (addr >= 0x6000)
|
else if (addr >= 0x6000)
|
||||||
{
|
{
|
||||||
return exRegs[1];
|
return exRegs[1];
|
||||||
}
|
}
|
||||||
|
|
||||||
return base.Get_PRGBank_8K(addr);
|
return base.Get_PRGBank_8K(addr);
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void WritePRG(int addr, byte value)
|
public override void WritePRG(int addr, byte value)
|
||||||
{
|
{
|
||||||
if ((addr == 1) && ((mmc3.cmd & 0x8) > 0))
|
if ((addr == 1) && ((mmc3.cmd & 0x8) > 0))
|
||||||
{
|
{
|
||||||
exRegs[mmc3.cmd & 3] = value;
|
exRegs[mmc3.cmd & 3] = value;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
base.WritePRG(addr, value);
|
base.WritePRG(addr, value);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -39,6 +39,12 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public override void Dispose()
|
||||||
|
{
|
||||||
|
exRegs.Dispose();
|
||||||
|
base.Dispose();
|
||||||
|
}
|
||||||
|
|
||||||
public override void SyncState(Serializer ser)
|
public override void SyncState(Serializer ser)
|
||||||
{
|
{
|
||||||
base.SyncState(ser);
|
base.SyncState(ser);
|
||||||
|
|
|
@ -74,6 +74,13 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public override void Dispose()
|
||||||
|
{
|
||||||
|
exRegs.Dispose();
|
||||||
|
prg_regs_8k.Dispose();
|
||||||
|
base.Dispose();
|
||||||
|
}
|
||||||
|
|
||||||
public override void SyncState(Serializer ser)
|
public override void SyncState(Serializer ser)
|
||||||
{
|
{
|
||||||
base.SyncState(ser);
|
base.SyncState(ser);
|
||||||
|
|
|
@ -1,34 +1,34 @@
|
||||||
using BizHawk.Common;
|
using BizHawk.Common;
|
||||||
using BizHawk.Common.NumberExtensions;
|
using BizHawk.Common.NumberExtensions;
|
||||||
|
|
||||||
namespace BizHawk.Emulation.Cores.Nintendo.NES
|
namespace BizHawk.Emulation.Cores.Nintendo.NES
|
||||||
{
|
{
|
||||||
public sealed class Mapper217 : MMC3Board_Base
|
public sealed class Mapper217 : MMC3Board_Base
|
||||||
{
|
{
|
||||||
private ByteBuffer exRegs = new ByteBuffer(4);
|
private ByteBuffer exRegs = new ByteBuffer(4);
|
||||||
|
|
||||||
public ByteBuffer prg_regs_8k = new ByteBuffer(4);
|
public ByteBuffer prg_regs_8k = new ByteBuffer(4);
|
||||||
private int prg_mask_8k, chr_mask_1k;
|
private int prg_mask_8k, chr_mask_1k;
|
||||||
private byte[] regs_sec = { 0, 6, 3, 7, 5, 2, 4, 1 };
|
private byte[] regs_sec = { 0, 6, 3, 7, 5, 2, 4, 1 };
|
||||||
|
|
||||||
|
|
||||||
public override bool Configure(NES.EDetectionOrigin origin)
|
public override bool Configure(NES.EDetectionOrigin origin)
|
||||||
{
|
{
|
||||||
switch (Cart.board_type)
|
switch (Cart.board_type)
|
||||||
{
|
{
|
||||||
case "MAPPER217":
|
case "MAPPER217":
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
BaseSetup();
|
BaseSetup();
|
||||||
|
|
||||||
exRegs[0] = 0x00;
|
exRegs[0] = 0x00;
|
||||||
exRegs[1] = 0xFF;
|
exRegs[1] = 0xFF;
|
||||||
exRegs[2] = 0x03;
|
exRegs[2] = 0x03;
|
||||||
exRegs[3] = 0x00;
|
exRegs[3] = 0x00;
|
||||||
|
|
||||||
prg_mask_8k = Cart.prg_size / 8 - 1;
|
prg_mask_8k = Cart.prg_size / 8 - 1;
|
||||||
chr_mask_1k = Cart.chr_size - 1;
|
chr_mask_1k = Cart.chr_size - 1;
|
||||||
|
|
||||||
|
@ -36,19 +36,26 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES
|
||||||
prg_regs_8k[1] = 1;
|
prg_regs_8k[1] = 1;
|
||||||
prg_regs_8k[2] = (byte)(0xFE & prg_mask_8k);
|
prg_regs_8k[2] = (byte)(0xFE & prg_mask_8k);
|
||||||
prg_regs_8k[3] = (byte)(0xFF & prg_mask_8k);
|
prg_regs_8k[3] = (byte)(0xFF & prg_mask_8k);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void SyncState(Serializer ser)
|
public override void Dispose()
|
||||||
{
|
{
|
||||||
base.SyncState(ser);
|
exRegs.Dispose();
|
||||||
ser.Sync("exRegs", ref exRegs);
|
prg_regs_8k.Dispose();
|
||||||
ser.Sync("ptg_regs_8k", ref prg_regs_8k);
|
base.Dispose();
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void SyncState(Serializer ser)
|
||||||
|
{
|
||||||
|
base.SyncState(ser);
|
||||||
|
ser.Sync("exRegs", ref exRegs);
|
||||||
|
ser.Sync("ptg_regs_8k", ref prg_regs_8k);
|
||||||
ser.Sync("prg_mask", ref prg_mask_8k);
|
ser.Sync("prg_mask", ref prg_mask_8k);
|
||||||
ser.Sync("chr_mask", ref chr_mask_1k);
|
ser.Sync("chr_mask", ref chr_mask_1k);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void sync_prg()
|
public void sync_prg()
|
||||||
{
|
{
|
||||||
int temp = 0;
|
int temp = 0;
|
||||||
|
@ -64,13 +71,13 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES
|
||||||
temp |= (exRegs[1] << 5 & 0x60);
|
temp |= (exRegs[1] << 5 & 0x60);
|
||||||
prg_regs_8k[i] = (byte)(temp & prg_mask_8k);
|
prg_regs_8k[i] = (byte)(temp & prg_mask_8k);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void WriteEXP(int addr, byte value)
|
public override void WriteEXP(int addr, byte value)
|
||||||
{
|
{
|
||||||
if (addr == 0x1000)
|
if (addr == 0x1000)
|
||||||
{
|
{
|
||||||
exRegs[0] = value;
|
exRegs[0] = value;
|
||||||
if ((value & 0x80)>0)
|
if ((value & 0x80)>0)
|
||||||
{
|
{
|
||||||
int bank = (byte)((value & 0x0F) | (exRegs[1] << 4 & 0x30));
|
int bank = (byte)((value & 0x0F) | (exRegs[1] << 4 & 0x30));
|
||||||
|
@ -86,23 +93,23 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
sync_prg();
|
sync_prg();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
else if (addr == 0x1001)
|
else if (addr == 0x1001)
|
||||||
{
|
{
|
||||||
exRegs[1] = value;
|
exRegs[1] = value;
|
||||||
sync_prg();
|
sync_prg();
|
||||||
}
|
}
|
||||||
|
|
||||||
else if (addr == 0x1007)
|
else if (addr == 0x1007)
|
||||||
{
|
{
|
||||||
exRegs[2] = value;
|
exRegs[2] = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
base.WriteEXP(addr, value);
|
base.WriteEXP(addr, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void WritePRG(int addr, byte value)
|
public override void WritePRG(int addr, byte value)
|
||||||
{
|
{
|
||||||
switch ((addr + 0x8000) & 0xE001)
|
switch ((addr + 0x8000) & 0xE001)
|
||||||
|
@ -175,8 +182,8 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES
|
||||||
|
|
||||||
if (addr>=0x4000)
|
if (addr>=0x4000)
|
||||||
base.WritePRG(addr, value);
|
base.WritePRG(addr, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
public override byte ReadPPU(int addr)
|
public override byte ReadPPU(int addr)
|
||||||
{
|
{
|
||||||
if (addr < 0x2000)
|
if (addr < 0x2000)
|
||||||
|
@ -192,14 +199,14 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES
|
||||||
return VROM[addr];
|
return VROM[addr];
|
||||||
}
|
}
|
||||||
else return base.ReadPPU(addr);
|
else return base.ReadPPU(addr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public override byte ReadPRG(int addr)
|
public override byte ReadPRG(int addr)
|
||||||
{
|
{
|
||||||
int bank = addr >> 13;
|
int bank = addr >> 13;
|
||||||
bank = prg_regs_8k[bank];
|
bank = prg_regs_8k[bank];
|
||||||
return ROM[(bank << 13) + (addr & 0x1FFF)];
|
return ROM[(bank << 13) + (addr & 0x1FFF)];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -21,6 +21,12 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public override void Dispose()
|
||||||
|
{
|
||||||
|
regs.Dispose();
|
||||||
|
base.Dispose();
|
||||||
|
}
|
||||||
|
|
||||||
public override void SyncState(Serializer ser)
|
public override void SyncState(Serializer ser)
|
||||||
{
|
{
|
||||||
base.SyncState(ser);
|
base.SyncState(ser);
|
||||||
|
|
|
@ -40,6 +40,13 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public override void Dispose()
|
||||||
|
{
|
||||||
|
exRegs.Dispose();
|
||||||
|
prg_regs_8k.Dispose();
|
||||||
|
base.Dispose();
|
||||||
|
}
|
||||||
|
|
||||||
public override void SyncState(Serializer ser)
|
public override void SyncState(Serializer ser)
|
||||||
{
|
{
|
||||||
base.SyncState(ser);
|
base.SyncState(ser);
|
||||||
|
|
|
@ -32,6 +32,11 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public override void Dispose()
|
||||||
|
{
|
||||||
|
prg_banks_8k.Dispose();
|
||||||
|
base.Dispose();
|
||||||
|
}
|
||||||
|
|
||||||
public override byte ReadPRG(int addr)
|
public override byte ReadPRG(int addr)
|
||||||
{
|
{
|
||||||
|
|
|
@ -39,6 +39,12 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public override void Dispose()
|
||||||
|
{
|
||||||
|
reg.Dispose();
|
||||||
|
base.Dispose();
|
||||||
|
}
|
||||||
|
|
||||||
public void sync(byte value)
|
public void sync(byte value)
|
||||||
{
|
{
|
||||||
prg=reg[2]>>2;
|
prg=reg[2]>>2;
|
||||||
|
|
|
@ -28,6 +28,12 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public override void Dispose()
|
||||||
|
{
|
||||||
|
reg.Dispose();
|
||||||
|
base.Dispose();
|
||||||
|
}
|
||||||
|
|
||||||
public override byte ReadWRAM(int addr)
|
public override byte ReadWRAM(int addr)
|
||||||
{
|
{
|
||||||
return ROM[(reg[4] << 13) + (addr & 0x1FFF)];
|
return ROM[(reg[4] << 13) + (addr & 0x1FFF)];
|
||||||
|
|
|
@ -27,6 +27,12 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public override void Dispose()
|
||||||
|
{
|
||||||
|
latch.Dispose();
|
||||||
|
base.Dispose();
|
||||||
|
}
|
||||||
|
|
||||||
public override void SyncState(Serializer ser)
|
public override void SyncState(Serializer ser)
|
||||||
{
|
{
|
||||||
base.SyncState(ser);
|
base.SyncState(ser);
|
||||||
|
|
|
@ -46,6 +46,13 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public override void Dispose()
|
||||||
|
{
|
||||||
|
prg_banks_8k.Dispose();
|
||||||
|
chr_banks_8k.Dispose();
|
||||||
|
base.Dispose();
|
||||||
|
}
|
||||||
|
|
||||||
static readonly EMirrorType[] kMirrorTypes = {EMirrorType.Vertical,EMirrorType.Horizontal,EMirrorType.OneScreenA,EMirrorType.OneScreenB};
|
static readonly EMirrorType[] kMirrorTypes = {EMirrorType.Vertical,EMirrorType.Horizontal,EMirrorType.OneScreenA,EMirrorType.OneScreenB};
|
||||||
void SyncMirror()
|
void SyncMirror()
|
||||||
{
|
{
|
||||||
|
|
|
@ -31,6 +31,12 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public override void Dispose()
|
||||||
|
{
|
||||||
|
prg_banks_32k.Dispose();
|
||||||
|
base.Dispose();
|
||||||
|
}
|
||||||
|
|
||||||
public override void WriteEXP(int addr, byte value)
|
public override void WriteEXP(int addr, byte value)
|
||||||
{
|
{
|
||||||
switch (addr)
|
switch (addr)
|
||||||
|
|
|
@ -1,57 +1,64 @@
|
||||||
using BizHawk.Common;
|
using BizHawk.Common;
|
||||||
using BizHawk.Common.NumberExtensions;
|
using BizHawk.Common.NumberExtensions;
|
||||||
using System;
|
using System;
|
||||||
|
|
||||||
namespace BizHawk.Emulation.Cores.Nintendo.NES
|
namespace BizHawk.Emulation.Cores.Nintendo.NES
|
||||||
{
|
{
|
||||||
// Adpated from FCEUX src
|
// Adpated from FCEUX src
|
||||||
public sealed class Mapper183 : NES.NESBoardBase
|
public sealed class Mapper183 : NES.NESBoardBase
|
||||||
{
|
{
|
||||||
private ByteBuffer prg = new ByteBuffer(4);
|
private ByteBuffer prg = new ByteBuffer(4);
|
||||||
private ByteBuffer chr = new ByteBuffer(8);
|
private ByteBuffer chr = new ByteBuffer(8);
|
||||||
|
|
||||||
private int IRQLatch = 0;
|
private int IRQLatch = 0;
|
||||||
private int IRQCount = 0;
|
private int IRQCount = 0;
|
||||||
private bool IRQMode;
|
private bool IRQMode;
|
||||||
private bool IRQa = false;
|
private bool IRQa = false;
|
||||||
private bool IRQr = false;
|
private bool IRQr = false;
|
||||||
|
|
||||||
private int prg_bank_mask_8k, chr_bank_mask_1k, IRQPre=341;
|
private int prg_bank_mask_8k, chr_bank_mask_1k, IRQPre=341;
|
||||||
|
|
||||||
public override bool Configure(NES.EDetectionOrigin origin)
|
public override bool Configure(NES.EDetectionOrigin origin)
|
||||||
{
|
{
|
||||||
switch (Cart.board_type)
|
switch (Cart.board_type)
|
||||||
{
|
{
|
||||||
case "MAPPER183":
|
case "MAPPER183":
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
prg_bank_mask_8k = Cart.prg_size / 8 - 1;
|
prg_bank_mask_8k = Cart.prg_size / 8 - 1;
|
||||||
chr_bank_mask_1k = Cart.chr_size - 1;
|
chr_bank_mask_1k = Cart.chr_size - 1;
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void SyncState(Serializer ser)
|
public override void Dispose()
|
||||||
{
|
{
|
||||||
base.SyncState(ser);
|
prg.Dispose();
|
||||||
ser.Sync("prg", ref prg);
|
chr.Dispose();
|
||||||
ser.Sync("chr", ref chr);
|
base.Dispose();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void SetMirroring(int mirr)
|
public override void SyncState(Serializer ser)
|
||||||
{
|
{
|
||||||
switch (mirr & 3)
|
base.SyncState(ser);
|
||||||
{
|
ser.Sync("prg", ref prg);
|
||||||
case 0: SetMirrorType(EMirrorType.Vertical); break;
|
ser.Sync("chr", ref chr);
|
||||||
case 1: SetMirrorType(EMirrorType.Horizontal); break;
|
}
|
||||||
case 2: SetMirrorType(EMirrorType.OneScreenA); break;
|
|
||||||
case 3: SetMirrorType(EMirrorType.OneScreenB); break;
|
private void SetMirroring(int mirr)
|
||||||
}
|
{
|
||||||
}
|
switch (mirr & 3)
|
||||||
|
{
|
||||||
|
case 0: SetMirrorType(EMirrorType.Vertical); break;
|
||||||
|
case 1: SetMirrorType(EMirrorType.Horizontal); break;
|
||||||
|
case 2: SetMirrorType(EMirrorType.OneScreenA); break;
|
||||||
|
case 3: SetMirrorType(EMirrorType.OneScreenB); break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public override void ClockCPU()
|
public override void ClockCPU()
|
||||||
{
|
{
|
||||||
if (IRQa)
|
if (IRQa)
|
||||||
|
@ -81,41 +88,41 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public override void WriteWRAM(int addr, byte value)
|
public override void WriteWRAM(int addr, byte value)
|
||||||
{
|
{
|
||||||
WriteReg(addr + 0x6000, value);
|
WriteReg(addr + 0x6000, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void WritePRG(int addr, byte value)
|
public override void WritePRG(int addr, byte value)
|
||||||
{
|
{
|
||||||
WriteReg(addr + 0x8000, value);
|
WriteReg(addr + 0x8000, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void WriteReg(int addr, byte value)
|
private void WriteReg(int addr, byte value)
|
||||||
{
|
{
|
||||||
if ((addr & 0xF800) == 0x6800)
|
if ((addr & 0xF800) == 0x6800)
|
||||||
{
|
{
|
||||||
prg[3] = (byte)(addr & 0x3F);
|
prg[3] = (byte)(addr & 0x3F);
|
||||||
}
|
}
|
||||||
else if (((addr & 0xF80C) >= 0xB000) && ((addr & 0xF80C) <= 0xE00C))
|
else if (((addr & 0xF80C) >= 0xB000) && ((addr & 0xF80C) <= 0xE00C))
|
||||||
{
|
{
|
||||||
int index = (((addr >> 11) - 6) | (addr >> 3)) & 7;
|
int index = (((addr >> 11) - 6) | (addr >> 3)) & 7;
|
||||||
chr[index] = (byte)((chr[index] & (0xF0 >> (addr & 4))) | ((value & 0x0F) << (addr & 4)));
|
chr[index] = (byte)((chr[index] & (0xF0 >> (addr & 4))) | ((value & 0x0F) << (addr & 4)));
|
||||||
}
|
}
|
||||||
else switch (addr & 0xF80C)
|
else switch (addr & 0xF80C)
|
||||||
{
|
{
|
||||||
case 0x8800: prg[0] = value; break;
|
case 0x8800: prg[0] = value; break;
|
||||||
case 0xA800: prg[1] = value; break;
|
case 0xA800: prg[1] = value; break;
|
||||||
case 0xA000: prg[2] = value; break;
|
case 0xA000: prg[2] = value; break;
|
||||||
case 0x9800: SetMirroring(value & 3); break;
|
case 0x9800: SetMirroring(value & 3); break;
|
||||||
|
|
||||||
// TODO: IRQ
|
// TODO: IRQ
|
||||||
case 0xF000: IRQLatch = ((IRQLatch & 0xF0) | (value & 0xF)); break;
|
case 0xF000: IRQLatch = ((IRQLatch & 0xF0) | (value & 0xF)); break;
|
||||||
case 0xF004: IRQLatch = ((IRQLatch & 0x0F) | ((value & 0xF) << 4)); break;
|
case 0xF004: IRQLatch = ((IRQLatch & 0x0F) | ((value & 0xF) << 4)); break;
|
||||||
case 0xF008:
|
case 0xF008:
|
||||||
IRQMode = value.Bit(2);
|
IRQMode = value.Bit(2);
|
||||||
IRQa = value.Bit(1);//value>0 ? true:false;
|
IRQa = value.Bit(1);//value>0 ? true:false;
|
||||||
|
@ -126,54 +133,54 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES
|
||||||
IRQCount = IRQLatch;
|
IRQCount = IRQLatch;
|
||||||
}
|
}
|
||||||
IRQSignal = false;
|
IRQSignal = false;
|
||||||
break;
|
break;
|
||||||
case 0xF00C:
|
case 0xF00C:
|
||||||
IRQSignal = false;
|
IRQSignal = false;
|
||||||
IRQa = IRQr;
|
IRQa = IRQr;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public override byte ReadPPU(int addr)
|
public override byte ReadPPU(int addr)
|
||||||
{
|
|
||||||
if (addr < 0x2000)
|
|
||||||
{
|
|
||||||
int x = (addr >> 10) & 7;
|
|
||||||
int bank = (chr[x] & chr_bank_mask_1k) << 10;
|
|
||||||
return VROM[bank + (addr & 0x3FF)]; // TODO
|
|
||||||
}
|
|
||||||
|
|
||||||
return base.ReadPPU(addr);
|
|
||||||
}
|
|
||||||
|
|
||||||
public override byte ReadWRAM(int addr)
|
|
||||||
{
|
{
|
||||||
return ROM[(((prg[3] & prg_bank_mask_8k)) << 13) + (addr & 0x1FFF)];
|
if (addr < 0x2000)
|
||||||
}
|
{
|
||||||
|
int x = (addr >> 10) & 7;
|
||||||
public override byte ReadPRG(int addr)
|
int bank = (chr[x] & chr_bank_mask_1k) << 10;
|
||||||
{
|
return VROM[bank + (addr & 0x3FF)]; // TODO
|
||||||
int bank_8k;
|
}
|
||||||
if (addr < 0x2000) // 0x8000
|
|
||||||
{
|
return base.ReadPPU(addr);
|
||||||
bank_8k = prg[0] & prg_bank_mask_8k;
|
}
|
||||||
|
|
||||||
}
|
public override byte ReadWRAM(int addr)
|
||||||
else if (addr < 0x4000) // 0xA000
|
{
|
||||||
{
|
return ROM[(((prg[3] & prg_bank_mask_8k)) << 13) + (addr & 0x1FFF)];
|
||||||
bank_8k = prg[1] & prg_bank_mask_8k;
|
}
|
||||||
}
|
|
||||||
else if (addr < 0x6000) // 0xC000
|
public override byte ReadPRG(int addr)
|
||||||
{
|
{
|
||||||
bank_8k = prg[2] & prg_bank_mask_8k;
|
int bank_8k;
|
||||||
}
|
if (addr < 0x2000) // 0x8000
|
||||||
else
|
{
|
||||||
{
|
bank_8k = prg[0] & prg_bank_mask_8k;
|
||||||
bank_8k = prg_bank_mask_8k;
|
|
||||||
}
|
}
|
||||||
|
else if (addr < 0x4000) // 0xA000
|
||||||
return ROM[(bank_8k << 13) + (addr & 0x1FFF)];
|
{
|
||||||
}
|
bank_8k = prg[1] & prg_bank_mask_8k;
|
||||||
}
|
}
|
||||||
}
|
else if (addr < 0x6000) // 0xC000
|
||||||
|
{
|
||||||
|
bank_8k = prg[2] & prg_bank_mask_8k;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
bank_8k = prg_bank_mask_8k;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ROM[(bank_8k << 13) + (addr & 0x1FFF)];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -20,6 +20,13 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public override void Dispose()
|
||||||
|
{
|
||||||
|
_SRAM.Dispose();
|
||||||
|
regs.Dispose();
|
||||||
|
base.Dispose();
|
||||||
|
}
|
||||||
|
|
||||||
public override void SyncState(Serializer ser)
|
public override void SyncState(Serializer ser)
|
||||||
{
|
{
|
||||||
ser.Sync("SRAM", ref _SRAM);
|
ser.Sync("SRAM", ref _SRAM);
|
||||||
|
|
|
@ -36,6 +36,12 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public override void Dispose()
|
||||||
|
{
|
||||||
|
prg_banks_16k.Dispose();
|
||||||
|
base.Dispose();
|
||||||
|
}
|
||||||
|
|
||||||
public override byte ReadPRG(int addr)
|
public override byte ReadPRG(int addr)
|
||||||
{
|
{
|
||||||
int bank_16k = addr >> 14;
|
int bank_16k = addr >> 14;
|
||||||
|
|
|
@ -31,6 +31,12 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public override void Dispose()
|
||||||
|
{
|
||||||
|
prg_banks_32k.Dispose();
|
||||||
|
base.Dispose();
|
||||||
|
}
|
||||||
|
|
||||||
public override byte ReadEXP(int addr)
|
public override byte ReadEXP(int addr)
|
||||||
{
|
{
|
||||||
//some kind of magic number..
|
//some kind of magic number..
|
||||||
|
|
|
@ -28,6 +28,12 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public override void Dispose()
|
||||||
|
{
|
||||||
|
regs.Dispose();
|
||||||
|
base.Dispose();
|
||||||
|
}
|
||||||
|
|
||||||
public override void SyncState(Serializer ser)
|
public override void SyncState(Serializer ser)
|
||||||
{
|
{
|
||||||
ser.Sync("reg_addr", ref reg_addr);
|
ser.Sync("reg_addr", ref reg_addr);
|
||||||
|
|
|
@ -82,7 +82,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SyncMap()
|
private void SyncMap()
|
||||||
{
|
{
|
||||||
ApplyMemoryMapMask(prg_bank_mask_8k, prg_banks_8k);
|
ApplyMemoryMapMask(prg_bank_mask_8k, prg_banks_8k);
|
||||||
ApplyMemoryMapMask(chr_bank_mask_2k, chr_banks_2k);
|
ApplyMemoryMapMask(chr_bank_mask_2k, chr_banks_2k);
|
||||||
|
|
|
@ -34,6 +34,13 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public override void Dispose()
|
||||||
|
{
|
||||||
|
preg.Dispose();
|
||||||
|
creg.Dispose();
|
||||||
|
base.Dispose();
|
||||||
|
}
|
||||||
|
|
||||||
public override void SyncState(Serializer ser)
|
public override void SyncState(Serializer ser)
|
||||||
{
|
{
|
||||||
base.SyncState(ser);
|
base.SyncState(ser);
|
||||||
|
|
|
@ -31,6 +31,14 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public override void Dispose()
|
||||||
|
{
|
||||||
|
prg.Dispose();
|
||||||
|
chrlo.Dispose();
|
||||||
|
chrhi.Dispose();
|
||||||
|
base.Dispose();
|
||||||
|
}
|
||||||
|
|
||||||
public override void SyncState(Serializer ser)
|
public override void SyncState(Serializer ser)
|
||||||
{
|
{
|
||||||
base.SyncState(ser);
|
base.SyncState(ser);
|
||||||
|
@ -148,9 +156,9 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
return base.ReadPPU(addr);
|
return base.ReadPPU(addr);
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void WritePPU(int addr, byte value)
|
public override void WritePPU(int addr, byte value)
|
||||||
{
|
{
|
||||||
if (addr < 0x2000)
|
if (addr < 0x2000)
|
||||||
|
|
|
@ -23,6 +23,12 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public override void Dispose()
|
||||||
|
{
|
||||||
|
regs.Dispose();
|
||||||
|
base.Dispose();
|
||||||
|
}
|
||||||
|
|
||||||
public override void SyncState(Serializer ser)
|
public override void SyncState(Serializer ser)
|
||||||
{
|
{
|
||||||
base.SyncState(ser);
|
base.SyncState(ser);
|
||||||
|
|
|
@ -32,6 +32,13 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES
|
||||||
SyncIRQ();
|
SyncIRQ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public override void Dispose()
|
||||||
|
{
|
||||||
|
prg_banks_16k.Dispose();
|
||||||
|
chr_banks_2k.Dispose();
|
||||||
|
base.Dispose();
|
||||||
|
}
|
||||||
|
|
||||||
public override bool Configure(NES.EDetectionOrigin origin)
|
public override bool Configure(NES.EDetectionOrigin origin)
|
||||||
{
|
{
|
||||||
switch (Cart.board_type)
|
switch (Cart.board_type)
|
||||||
|
|
|
@ -25,6 +25,12 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public override void Dispose()
|
||||||
|
{
|
||||||
|
regs.Dispose();
|
||||||
|
base.Dispose();
|
||||||
|
}
|
||||||
|
|
||||||
public override void WriteEXP(int addr, byte value)
|
public override void WriteEXP(int addr, byte value)
|
||||||
{
|
{
|
||||||
if (addr >= 0x1000 && addr <= 0x1003)
|
if (addr >= 0x1000 && addr <= 0x1003)
|
||||||
|
|
|
@ -1,75 +1,81 @@
|
||||||
using BizHawk.Common;
|
using BizHawk.Common;
|
||||||
using BizHawk.Common.NumberExtensions;
|
using BizHawk.Common.NumberExtensions;
|
||||||
using System;
|
using System;
|
||||||
|
|
||||||
namespace BizHawk.Emulation.Cores.Nintendo.NES
|
namespace BizHawk.Emulation.Cores.Nintendo.NES
|
||||||
{
|
{
|
||||||
// Adapted from FCEUX src
|
// Adapted from FCEUX src
|
||||||
public sealed class UNIF_BMC_Ghostbusters63in1 : NES.NESBoardBase
|
public sealed class UNIF_BMC_Ghostbusters63in1 : NES.NESBoardBase
|
||||||
{
|
{
|
||||||
private ByteBuffer reg = new ByteBuffer(2);
|
private ByteBuffer reg = new ByteBuffer(2);
|
||||||
private readonly int[] banks = new [] { 0, 0, 524288, 1048576};
|
private readonly int[] banks = new [] { 0, 0, 524288, 1048576};
|
||||||
private int bank;
|
private int bank;
|
||||||
|
|
||||||
[MapperProp]
|
[MapperProp]
|
||||||
public bool Ghostbusters63in1_63set=true;
|
public bool Ghostbusters63in1_63set=true;
|
||||||
[MapperProp]
|
[MapperProp]
|
||||||
public int Ghostbusters63in1_chip_22_select;
|
public int Ghostbusters63in1_chip_22_select;
|
||||||
|
|
||||||
public override bool Configure(NES.EDetectionOrigin origin)
|
public override bool Configure(NES.EDetectionOrigin origin)
|
||||||
{
|
{
|
||||||
switch (Cart.board_type)
|
switch (Cart.board_type)
|
||||||
{
|
{
|
||||||
case "UNIF_BMC-Ghostbusters63in1":
|
case "UNIF_BMC-Ghostbusters63in1":
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
AutoMapperProps.Apply(this);
|
AutoMapperProps.Apply(this);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void SyncState(Serializer ser)
|
public override void Dispose()
|
||||||
{
|
{
|
||||||
ser.Sync("reg", ref reg);
|
reg.Dispose();
|
||||||
ser.Sync("bank", ref bank);
|
base.Dispose();
|
||||||
ser.Sync("bank", ref Ghostbusters63in1_63set);
|
}
|
||||||
ser.Sync("bank", ref Ghostbusters63in1_chip_22_select);
|
|
||||||
base.SyncState(ser);
|
public override void SyncState(Serializer ser)
|
||||||
}
|
{
|
||||||
|
ser.Sync("reg", ref reg);
|
||||||
public override void WritePRG(int addr, byte value)
|
ser.Sync("bank", ref bank);
|
||||||
{
|
ser.Sync("bank", ref Ghostbusters63in1_63set);
|
||||||
reg[addr & 1] = value;
|
ser.Sync("bank", ref Ghostbusters63in1_chip_22_select);
|
||||||
|
base.SyncState(ser);
|
||||||
bank = ((reg[0] & 0x80) >> 7) | ((reg[1] & 1) << 1);
|
}
|
||||||
|
|
||||||
SetMirrorType(reg[0].Bit(6) ? EMirrorType.Vertical : EMirrorType.Horizontal);
|
public override void WritePRG(int addr, byte value)
|
||||||
Console.WriteLine(reg[0]);
|
{
|
||||||
Console.WriteLine(reg[1]);
|
reg[addr & 1] = value;
|
||||||
}
|
|
||||||
|
bank = ((reg[0] & 0x80) >> 7) | ((reg[1] & 1) << 1);
|
||||||
public override byte ReadPRG(int addr)
|
|
||||||
{
|
SetMirrorType(reg[0].Bit(6) ? EMirrorType.Vertical : EMirrorType.Horizontal);
|
||||||
//if (bank == 1)
|
Console.WriteLine(reg[0]);
|
||||||
//{
|
Console.WriteLine(reg[1]);
|
||||||
// return NES.DB;
|
}
|
||||||
//}
|
|
||||||
|
public override byte ReadPRG(int addr)
|
||||||
if (reg[0].Bit(5))
|
{
|
||||||
|
//if (bank == 1)
|
||||||
|
//{
|
||||||
|
// return NES.DB;
|
||||||
|
//}
|
||||||
|
|
||||||
|
if (reg[0].Bit(5))
|
||||||
{
|
{
|
||||||
var offset=0;
|
var offset=0;
|
||||||
if (Ghostbusters63in1_63set)
|
if (Ghostbusters63in1_63set)
|
||||||
offset = banks[bank];
|
offset = banks[bank];
|
||||||
else
|
else
|
||||||
offset = banks[Ghostbusters63in1_chip_22_select];
|
offset = banks[Ghostbusters63in1_chip_22_select];
|
||||||
|
|
||||||
int b = (reg[0] & 0x1F);
|
int b = (reg[0] & 0x1F);
|
||||||
return ROM[offset + (b << 14) + (addr & 0x3FFF)];
|
return ROM[offset + (b << 14) + (addr & 0x3FFF)];
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
var offset = 0;
|
var offset = 0;
|
||||||
if (Ghostbusters63in1_63set)
|
if (Ghostbusters63in1_63set)
|
||||||
|
@ -77,9 +83,9 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES
|
||||||
else
|
else
|
||||||
offset = banks[Ghostbusters63in1_chip_22_select];
|
offset = banks[Ghostbusters63in1_chip_22_select];
|
||||||
|
|
||||||
int b = ((reg[0] >> 1) & 0x0F);
|
int b = ((reg[0] >> 1) & 0x0F);
|
||||||
return ROM[offset + (b << 15) + addr];
|
return ROM[offset + (b << 15) + addr];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,7 +15,6 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES
|
||||||
|
|
||||||
private int prg_mask_8k, chr_mask_1k;
|
private int prg_mask_8k, chr_mask_1k;
|
||||||
|
|
||||||
|
|
||||||
public override bool Configure(NES.EDetectionOrigin origin)
|
public override bool Configure(NES.EDetectionOrigin origin)
|
||||||
{
|
{
|
||||||
switch (Cart.board_type)
|
switch (Cart.board_type)
|
||||||
|
@ -69,6 +68,14 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public override void Dispose()
|
||||||
|
{
|
||||||
|
exRegs.Dispose();
|
||||||
|
chr_regs_1k.Dispose();
|
||||||
|
prg_regs_8k.Dispose();
|
||||||
|
base.Dispose();
|
||||||
|
}
|
||||||
|
|
||||||
public override void SyncState(Serializer ser)
|
public override void SyncState(Serializer ser)
|
||||||
{
|
{
|
||||||
base.SyncState(ser);
|
base.SyncState(ser);
|
||||||
|
|
|
@ -1,52 +1,58 @@
|
||||||
using BizHawk.Common;
|
using BizHawk.Common;
|
||||||
using BizHawk.Common.NumberExtensions;
|
using BizHawk.Common.NumberExtensions;
|
||||||
|
|
||||||
namespace BizHawk.Emulation.Cores.Nintendo.NES
|
namespace BizHawk.Emulation.Cores.Nintendo.NES
|
||||||
{
|
{
|
||||||
public sealed class UNIF_BMC_Super24in1SC03 : MMC3Board_Base
|
public sealed class UNIF_BMC_Super24in1SC03 : MMC3Board_Base
|
||||||
{
|
{
|
||||||
private ByteBuffer exRegs = new ByteBuffer(3);
|
private ByteBuffer exRegs = new ByteBuffer(3);
|
||||||
private readonly int[] masko8 = { 63, 31, 15, 1, 3, 0, 0, 0 };
|
private readonly int[] masko8 = { 63, 31, 15, 1, 3, 0, 0, 0 };
|
||||||
public override bool Configure(NES.EDetectionOrigin origin)
|
public override bool Configure(NES.EDetectionOrigin origin)
|
||||||
{
|
{
|
||||||
switch (Cart.board_type)
|
switch (Cart.board_type)
|
||||||
{
|
{
|
||||||
case "UNIF_BMC-Super24in1SC03":
|
case "UNIF_BMC-Super24in1SC03":
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
BaseSetup();
|
BaseSetup();
|
||||||
|
|
||||||
exRegs[0] = 0x24;
|
exRegs[0] = 0x24;
|
||||||
exRegs[1] = 159;
|
exRegs[1] = 159;
|
||||||
exRegs[2] = 0;
|
exRegs[2] = 0;
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void SyncState(Serializer ser)
|
public override void Dispose()
|
||||||
{
|
{
|
||||||
base.SyncState(ser);
|
exRegs.Dispose();
|
||||||
ser.Sync("exRegs", ref exRegs);
|
base.Dispose();
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void WriteEXP(int addr, byte value)
|
public override void SyncState(Serializer ser)
|
||||||
{
|
{
|
||||||
switch (addr)
|
base.SyncState(ser);
|
||||||
{
|
ser.Sync("exRegs", ref exRegs);
|
||||||
case 0x1FF0:
|
}
|
||||||
exRegs[0] = value; break;
|
|
||||||
case 0x1FF1:
|
public override void WriteEXP(int addr, byte value)
|
||||||
exRegs[1] = value; break;
|
{
|
||||||
case 0x1FF2:
|
switch (addr)
|
||||||
exRegs[2] = value; break;
|
{
|
||||||
}
|
case 0x1FF0:
|
||||||
|
exRegs[0] = value; break;
|
||||||
base.WriteEXP(addr, value);
|
case 0x1FF1:
|
||||||
}
|
exRegs[1] = value; break;
|
||||||
|
case 0x1FF2:
|
||||||
|
exRegs[2] = value; break;
|
||||||
|
}
|
||||||
|
|
||||||
|
base.WriteEXP(addr, value);
|
||||||
|
}
|
||||||
|
|
||||||
public override byte ReadPRG(int addr)
|
public override byte ReadPRG(int addr)
|
||||||
{
|
{
|
||||||
int bank_8k = addr >> 13;
|
int bank_8k = addr >> 13;
|
||||||
|
@ -56,8 +62,8 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES
|
||||||
NV |= (exRegs[1] << 1);
|
NV |= (exRegs[1] << 1);
|
||||||
|
|
||||||
return ROM[(NV << 13) + (addr & 0x1FFF)];
|
return ROM[(NV << 13) + (addr & 0x1FFF)];
|
||||||
}
|
}
|
||||||
|
|
||||||
public override byte ReadPPU(int addr)
|
public override byte ReadPPU(int addr)
|
||||||
{
|
{
|
||||||
if (addr < 0x2000)
|
if (addr < 0x2000)
|
||||||
|
@ -76,8 +82,8 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
return base.ReadPPU(addr);
|
return base.ReadPPU(addr);
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void WritePPU(int addr, byte value)
|
public override void WritePPU(int addr, byte value)
|
||||||
{
|
{
|
||||||
if (addr < 0x2000)
|
if (addr < 0x2000)
|
||||||
|
@ -95,6 +101,6 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
base.WritePPU(addr, value);
|
base.WritePPU(addr, value);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -94,4 +94,4 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES
|
||||||
return base.ReadPPU(addr);
|
return base.ReadPPU(addr);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -31,6 +31,12 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public override void Dispose()
|
||||||
|
{
|
||||||
|
chr.Dispose();
|
||||||
|
base.Dispose();
|
||||||
|
}
|
||||||
|
|
||||||
public override void SyncState(Serializer ser)
|
public override void SyncState(Serializer ser)
|
||||||
{
|
{
|
||||||
base.SyncState(ser);
|
base.SyncState(ser);
|
||||||
|
|
Loading…
Reference in New Issue