NesHawk - properly dispose of bytebuffers

This commit is contained in:
adelikat 2016-11-09 17:24:32 -06:00
parent 109b21239b
commit 45ba9254cb
35 changed files with 582 additions and 382 deletions

View File

@ -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);

View File

@ -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);

View File

@ -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();
} }

View File

@ -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();
} }

View File

@ -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);

View File

@ -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);

View File

@ -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);

View File

@ -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);
} }
} }
} }

View File

@ -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);

View File

@ -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);

View File

@ -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)];
} }
} }
} }

View File

@ -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);

View File

@ -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);

View File

@ -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)
{ {

View File

@ -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;

View File

@ -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)];

View File

@ -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);

View File

@ -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()
{ {

View File

@ -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)

View File

@ -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)];
}
}
}

View File

@ -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);

View File

@ -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;

View File

@ -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..

View File

@ -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);

View File

@ -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);

View File

@ -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);

View File

@ -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)

View File

@ -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);

View File

@ -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)

View File

@ -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)

View File

@ -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];
} }
} }
} }
} }

View File

@ -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);

View File

@ -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);
} }
} }
} }

View File

@ -94,4 +94,4 @@ namespace BizHawk.Emulation.Cores.Nintendo.NES
return base.ReadPPU(addr); return base.ReadPPU(addr);
} }
} }
} }

View File

@ -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);