Atari 2600 - implement hard reset, also fix a few missing Dispose calls in some mappers that utilize ram

This commit is contained in:
adelikat 2014-04-06 22:40:10 +00:00
parent bba2e254d3
commit 8a239b53bc
25 changed files with 391 additions and 180 deletions

View File

@ -94,7 +94,7 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600
CoreComm.MemoryCallbackSystem.CallExecute(addr);
}
public void HardReset()
public void RebootCore()
{
// Regenerate mapper here to make sure its state is entirely clean
switch (this._game.GetOptionsDict()["m"])
@ -230,6 +230,28 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600
_mapper.GetType());
}
public void HardReset()
{
Ram = new byte[128];
_mapper.HardReset();
Cpu = new MOS6502X
{
ReadMemory = this.ReadMemory,
WriteMemory = this.WriteMemory,
PeekMemory = this.PeekMemory,
DummyReadMemory = this.ReadMemory,
OnExecFetch = this.ExecFetch
};
_tia.Reset();
M6532 = new M6532(this);
Cpu.PC = (ushort)(ReadMemory(0x1FFC) + (ReadMemory(0x1FFD) << 8)); // set the initial PC
}
private bool _hardResetSignal;
public void FrameAdvance(bool render, bool rendersound)
{
_frame++;
@ -251,6 +273,13 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600
_mapper.ClockCpu();
}
if (_hardResetSignal)
{
HardReset();
}
_hardResetSignal = Controller["Power"];
if (_islag)
{
LagCount++;

View File

@ -60,7 +60,7 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600
}
Console.WriteLine("Game uses mapper " + game.GetOptionsDict()["m"]);
HardReset();
RebootCore();
}
public string SystemId { get { return "A26"; } }
@ -104,7 +104,7 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600
{
"P1 Up", "P1 Down", "P1 Left", "P1 Right", "P1 Button",
"P2 Up", "P2 Down", "P2 Left", "P2 Right", "P2 Button",
"Reset", "Select"
"Reset", "Select", "Power"
}
};

View File

@ -26,5 +26,7 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600
public virtual void Dispose() { }
public virtual void ClockCpu() { }
public virtual void HardReset() { }
}
}

View File

@ -25,6 +25,18 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600
{
private int _bank4K;
public override void SyncState(Serializer ser)
{
base.SyncState(ser);
ser.Sync("bank_4k", ref _bank4K);
}
public override void HardReset()
{
_bank4K = 0;
base.HardReset();
}
private byte ReadMem(ushort addr, bool peek)
{
if (!peek)
@ -59,12 +71,6 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600
}
}
public override void SyncState(Serializer ser)
{
base.SyncState(ser);
ser.Sync("bank_4k", ref _bank4K);
}
private void Address(ushort addr)
{
switch (addr & 0x1840)

View File

@ -36,6 +36,15 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600
ser.Sync("hasRam", ref _hasRam);
}
public override void HardReset()
{
_lowbank_2K = 0;
_rambank_1K = 0;
_hasRam = false;
_ram = new ByteBuffer(256 * 1024);
base.HardReset();
}
public override void Dispose()
{
base.Dispose();

View File

@ -23,12 +23,18 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600
internal class m3F : MapperBase
{
private int _lowbank_2K;
private int _lowbank2K;
public override void SyncState(Serializer ser)
{
base.SyncState(ser);
ser.Sync("lowbank_2k", ref _lowbank_2K);
ser.Sync("lowbank_2k", ref _lowbank2K);
}
public override void HardReset()
{
_lowbank2K = 0;
base.HardReset();
}
public override byte ReadMemory(ushort addr)
@ -40,7 +46,7 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600
if (addr < 0x17FF) // Low 2k Bank
{
return Core.Rom[(_lowbank_2K << 11) + (addr & 0x07FF)];
return Core.Rom[(_lowbank2K << 11) + (addr & 0x07FF)];
}
if (addr < 0x2000) // High bank fixed to last 2k of ROM
@ -62,11 +68,11 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600
{
if ((value << 11) < Core.Rom.Length)
{
_lowbank_2K = value;
_lowbank2K = value;
}
else
{
_lowbank_2K = value & (Core.Rom.Length >> 11);
_lowbank2K = value & (Core.Rom.Length >> 11);
}
}

View File

@ -21,6 +21,26 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600
throw new NotImplementedException();
}
public override void SyncState(Serializer ser)
{
base.SyncState(ser);
ser.Sync("bank4k", ref _bank4k);
ser.Sync("ram", ref _ram);
}
public override void HardReset()
{
_bank4k = 0;
_ram = new ByteBuffer(6144);
base.HardReset();
}
public override void Dispose()
{
base.Dispose();
_ram.Dispose();
}
private byte ReadMem(ushort addr, bool peek)
{
if (!peek)
@ -46,19 +66,6 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600
return ReadMem(addr, true);
}
public override void SyncState(Serializer ser)
{
base.SyncState(ser);
ser.Sync("bank4k", ref _bank4k);
ser.Sync("ram", ref _ram);
}
public override void Dispose()
{
base.Dispose();
_ram.Dispose();
}
private void Address(ushort addr)
{
if (addr == 0x1FF8)

View File

@ -18,8 +18,26 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600
internal class mCV: MapperBase
{
private ByteBuffer _auxRam = new ByteBuffer(1024);
private ByteBuffer _ram = new ByteBuffer(1024);
public override void SyncState(Serializer ser)
{
base.SyncState(ser);
ser.Sync("aux_ram", ref _ram);
}
public override void HardReset()
{
_ram = new ByteBuffer(1024);
base.HardReset();
}
public override void Dispose()
{
base.Dispose();
_ram.Dispose();
}
public override byte ReadMemory(ushort addr)
{
if (addr < 0x1000)
@ -29,7 +47,7 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600
if (addr < 0x1400)
{
return _auxRam[(addr & 0x3FF)];
return _ram[(addr & 0x3FF)];
}
if (addr >= 0x1800 && addr < 0x2000)
@ -53,14 +71,8 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600
}
else if (addr >= 0x1400 && addr < 0x1800)
{
_auxRam[(addr & 0x3FF)] = value;
_ram[(addr & 0x3FF)] = value;
}
}
public override void SyncState(Serializer ser)
{
base.SyncState(ser);
ser.Sync("aux_ram", ref _auxRam);
}
}
}

View File

@ -427,6 +427,12 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600
ser.Sync("RandomNumber", ref RandomNumber);
}
public override void HardReset()
{
// TODO
base.HardReset();
}
private void UpdateMusicModeDataFetchers()
{
// Calculate the number of cycles since the last update

View File

@ -29,6 +29,22 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600
private int _toggle2;
private int _toggle3;
public override void SyncState(Serializer ser)
{
base.SyncState(ser);
ser.Sync("toggle1", ref _toggle1);
ser.Sync("toggle2", ref _toggle2);
ser.Sync("toggle3", ref _toggle3);
}
public override void HardReset()
{
_toggle1 = 0;
_toggle2 = 0;
_toggle3 = 0;
base.HardReset();
}
private byte ReadMem(ushort addr, bool peek)
{
if (!peek)
@ -78,14 +94,6 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600
}
}
public override void SyncState(Serializer ser)
{
base.SyncState(ser);
ser.Sync("toggle1", ref _toggle1);
ser.Sync("toggle2", ref _toggle2);
ser.Sync("toggle3", ref _toggle3);
}
private void Address(ushort addr)
{
switch (addr)

View File

@ -29,12 +29,39 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600
internal class mE7 : MapperBase
{
private int _rombank_1K;
private int _rombank1K;
private int _rambank1Toggle;
private ByteBuffer _rambank0 = new ByteBuffer(1024);
private ByteBuffer _rambank1 = new ByteBuffer(1024);
private bool _enableRam0;
public override void SyncState(Serializer ser)
{
base.SyncState(ser);
ser.Sync("toggle", ref _rombank1K);
ser.Sync("rambank0", ref _rambank0);
ser.Sync("rambank1", ref _rambank1);
ser.Sync("EnableRam0", ref _enableRam0);
ser.Sync("rambank1_toggle", ref _rambank1Toggle);
}
public override void HardReset()
{
_rombank1K = 0;
_rambank1Toggle = 0;
_rambank0 = new ByteBuffer(1024);
_rambank1 = new ByteBuffer(1024);
_enableRam0 = false;
base.HardReset();
}
public override void Dispose()
{
base.Dispose();
_rambank0.Dispose();
_rambank1.Dispose();
}
private byte ReadMem(ushort addr, bool peek)
{
if (addr < 0x1000)
@ -59,7 +86,7 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600
return _rambank0[addr & 0x3FF];
}
return Core.Rom[(_rombank_1K * 0x800) + (addr & 0x7FF)];
return Core.Rom[(_rombank1K * 0x800) + (addr & 0x7FF)];
}
if (addr < 0x1900) // Ram 1 Read port
@ -110,40 +137,30 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600
}
}
public override void SyncState(Serializer ser)
{
base.SyncState(ser);
ser.Sync("toggle", ref _rombank_1K);
ser.Sync("rambank0", ref _rambank0);
ser.Sync("rambank1", ref _rambank1);
ser.Sync("EnableRam0", ref _enableRam0);
ser.Sync("rambank1_toggle", ref _rambank1Toggle);
}
private void Address(ushort addr)
{
switch (addr)
{
case 0x1FE0:
_rombank_1K = 0;
_rombank1K = 0;
break;
case 0x1FE1:
_rombank_1K = 1;
_rombank1K = 1;
break;
case 0x1FE2:
_rombank_1K = 2;
_rombank1K = 2;
break;
case 0x1FE3:
_rombank_1K = 3;
_rombank1K = 3;
break;
case 0x1FE4:
_rombank_1K = 4;
_rombank1K = 4;
break;
case 0x1FE5:
_rombank_1K = 5;
_rombank1K = 5;
break;
case 0x1FE6:
_rombank_1K = 6;
_rombank1K = 6;
break;
case 0x1FE7:
_enableRam0 = true;

View File

@ -16,6 +16,18 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600
{
private int _toggle;
public override void SyncState(Serializer ser)
{
base.SyncState(ser);
ser.Sync("toggle", ref _toggle);
}
public override void HardReset()
{
_toggle = 0;
base.HardReset();
}
private byte ReadMem(ushort addr, bool peek)
{
if (!peek)
@ -50,12 +62,6 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600
}
}
public override void SyncState(Serializer ser)
{
base.SyncState(ser);
ser.Sync("toggle", ref _toggle);
}
private void Address(ushort addr)
{
if (addr == 0x1FE0) _toggle = 0;

View File

@ -12,6 +12,26 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600
private int _bank4k;
private ByteBuffer _ram = new ByteBuffer(128);
public override void SyncState(Serializer ser)
{
base.SyncState(ser);
ser.Sync("bank4k", ref _bank4k);
ser.Sync("auxRam", ref _ram);
}
public override void Dispose()
{
base.Dispose();
_ram.Dispose();
}
public override void HardReset()
{
_bank4k = 0;
_ram = new ByteBuffer(128);
base.HardReset();
}
private byte ReadMem(ushort addr, bool peek)
{
if (!peek)
@ -61,19 +81,6 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600
}
}
public override void SyncState(Serializer ser)
{
base.SyncState(ser);
ser.Sync("bank4k", ref _bank4k);
ser.Sync("auxRam", ref _ram);
}
public override void Dispose()
{
base.Dispose();
_ram.Dispose();
}
private void Address(ushort addr)
{
if (addr == 0x1FE0) _bank4k = 0;

View File

@ -22,6 +22,18 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600
{
private int _bank;
public override void SyncState(Serializer ser)
{
base.SyncState(ser);
ser.Sync("bank", ref _bank);
}
public override void HardReset()
{
_bank = 0;
base.HardReset();
}
private byte ReadMem(ushort addr, bool peek)
{
if (!peek)
@ -62,12 +74,6 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600
}
}
public override void SyncState(Serializer ser)
{
base.SyncState(ser);
ser.Sync("bank", ref _bank);
}
private void Increment()
{
_bank++;

View File

@ -14,6 +14,18 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600
{
private int _toggle;
public override void SyncState(Serializer ser)
{
base.SyncState(ser);
ser.Sync("toggle", ref _toggle);
}
public override void HardReset()
{
_toggle = 0;
base.HardReset();
}
private byte ReadMem(ushort addr, bool peek)
{
if (!peek)
@ -48,12 +60,6 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600
}
}
public override void SyncState(Serializer ser)
{
base.SyncState(ser);
ser.Sync("toggle", ref _toggle);
}
private void Address(ushort addr)
{
if (addr == 0x1FF4) _toggle = 0;

View File

@ -11,6 +11,26 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600
private int _bank4k;
private ByteBuffer _ram = new ByteBuffer(128);
public override void SyncState(Serializer ser)
{
base.SyncState(ser);
ser.Sync("toggle", ref _bank4k);
ser.Sync("auxRam", ref _ram);
}
public override void Dispose()
{
base.Dispose();
_ram.Dispose();
}
public override void HardReset()
{
_bank4k = 0;
_ram = new ByteBuffer(128);
base.HardReset();
}
private byte ReadMem(ushort addr, bool peek)
{
if (!peek)
@ -59,19 +79,6 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600
}
}
public override void SyncState(Serializer ser)
{
base.SyncState(ser);
ser.Sync("toggle", ref _bank4k);
ser.Sync("auxRam", ref _ram);
}
public override void Dispose()
{
base.Dispose();
_ram.Dispose();
}
private void Address(ushort addr)
{
if (addr == 0x1FF4) _bank4k = 0;

View File

@ -15,6 +15,18 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600
{
private int _toggle;
public override void SyncState(Serializer ser)
{
base.SyncState(ser);
ser.Sync("toggle", ref _toggle);
}
public override void HardReset()
{
_toggle = 0;
base.HardReset();
}
private byte ReadMem(ushort addr, bool peek)
{
if (!peek)
@ -49,12 +61,6 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600
}
}
public override void SyncState(Serializer ser)
{
base.SyncState(ser);
ser.Sync("toggle", ref _toggle);
}
private void Address(ushort addr)
{
if (addr == 0x1FF6) _toggle = 0;

View File

@ -11,6 +11,26 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600
private int _bank4k;
private ByteBuffer _ram = new ByteBuffer(128);
public override void SyncState(Serializer ser)
{
base.SyncState(ser);
ser.Sync("bank_4k", ref _bank4k);
ser.Sync("auxRam", ref _ram);
}
public override void Dispose()
{
base.Dispose();
_ram.Dispose();
}
public override void HardReset()
{
_bank4k = 0;
_ram = new ByteBuffer(128);
base.HardReset();
}
private byte ReadMem(ushort addr, bool peek)
{
if (!peek)
@ -60,19 +80,6 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600
}
}
public override void SyncState(Serializer ser)
{
base.SyncState(ser);
ser.Sync("bank_4k", ref _bank4k);
ser.Sync("auxRam", ref _ram);
}
public override void Dispose()
{
base.Dispose();
_ram.Dispose();
}
private void Address(ushort addr)
{
if (addr == 0x1FF6) _bank4k = 0;

View File

@ -21,7 +21,19 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600
internal class mF8 : MapperBase
{
private int _bank_4K;
private int _bank4K;
public override void SyncState(Serializer ser)
{
base.SyncState(ser);
ser.Sync("bank_4k", ref _bank4K);
}
public override void HardReset()
{
_bank4K = 0;
base.HardReset();
}
private byte ReadMem(ushort addr, bool peek)
{
@ -35,7 +47,7 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600
return base.ReadMemory(addr);
}
return Core.Rom[(_bank_4K << 12) + (addr & 0xFFF)];
return Core.Rom[(_bank4K << 12) + (addr & 0xFFF)];
}
public override byte ReadMemory(ushort addr)
@ -57,21 +69,15 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600
}
}
public override void SyncState(Serializer ser)
{
base.SyncState(ser);
ser.Sync("bank_4k", ref _bank_4K);
}
private void Address(ushort addr)
{
if (addr == 0x1FF8)
{
_bank_4K = 0;
_bank4K = 0;
}
else if (addr == 0x1FF9)
{
_bank_4K = 1;
_bank4K = 1;
}
}
}

View File

@ -11,6 +11,13 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600
private int _bank_4K;
private ByteBuffer _ram = new ByteBuffer(128);
public override void HardReset()
{
_bank_4K = 0;
_ram = new ByteBuffer(128);
base.HardReset();
}
private byte ReadMem(ushort addr, bool peek)
{
if (!peek)

View File

@ -17,7 +17,27 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600
internal class mFA : MapperBase
{
private int _toggle;
private ByteBuffer _auxRam = new ByteBuffer(256);
private ByteBuffer _ram = new ByteBuffer(256);
public override void SyncState(Serializer ser)
{
base.SyncState(ser);
ser.Sync("toggle", ref _toggle);
ser.Sync("auxRam", ref _ram);
}
public override void Dispose()
{
_ram.Dispose();
base.Dispose();
}
public override void HardReset()
{
_toggle = 0;
_ram = new ByteBuffer(128);
base.HardReset();
}
private byte ReadMem(ushort addr, bool peek)
{
@ -38,7 +58,7 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600
if (addr < 0x1200)
{
return _auxRam[addr & 0xFF];
return _ram[addr & 0xFF];
}
return Core.Rom[(_toggle << 12) + (addr & 0xFFF)];
@ -63,17 +83,10 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600
}
else if (addr < 0x1100)
{
_auxRam[addr & 0xFF] = value;
_ram[addr & 0xFF] = value;
}
}
public override void SyncState(Serializer ser)
{
base.SyncState(ser);
ser.Sync("toggle", ref _toggle);
ser.Sync("auxRam", ref _auxRam);
}
private void Address(ushort addr)
{
if (addr == 0x1FF8) _toggle = 0;

View File

@ -11,7 +11,27 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600
internal class mFA2 : MapperBase
{
private int _bank4k;
private ByteBuffer _auxRam = new ByteBuffer(256);
private ByteBuffer _ram = new ByteBuffer(256);
public override void SyncState(Serializer ser)
{
base.SyncState(ser);
ser.Sync("bank4k", ref _bank4k);
ser.Sync("auxRam", ref _ram);
}
public override void Dispose()
{
base.Dispose();
_ram.Dispose();
}
public override void HardReset()
{
_bank4k = 0;
_ram = new ByteBuffer(256);
base.HardReset();
}
private byte ReadMem(ushort addr, bool peek)
{
@ -32,7 +52,7 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600
if (addr < 0x1200)
{
return _auxRam[addr & 0xFF];
return _ram[addr & 0xFF];
}
return Core.Rom[(_bank4k << 12) + (addr & 0xFFF)];
@ -57,23 +77,10 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600
}
else if (addr < 0x1100)
{
_auxRam[addr & 0xFF] = value;
_ram[addr & 0xFF] = value;
}
}
public override void SyncState(Serializer ser)
{
base.SyncState(ser);
ser.Sync("bank4k", ref _bank4k);
ser.Sync("auxRam", ref _auxRam);
}
public override void Dispose()
{
base.Dispose();
_auxRam.Dispose();
}
private void Address(ushort addr)
{
if (addr == 0x1FF5) _bank4k = 0;

View File

@ -16,6 +16,18 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600
{
private int _toggle;
public override void SyncState(Serializer ser)
{
base.SyncState(ser);
ser.Sync("toggle", ref _toggle);
}
public override void HardReset()
{
_toggle = 0;
base.HardReset();
}
private byte ReadMem(ushort addr, bool peek)
{
if (!peek)
@ -50,12 +62,6 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600
}
}
public override void SyncState(Serializer ser)
{
base.SyncState(ser);
ser.Sync("toggle", ref _toggle);
}
private void Address(ushort addr)
{
if (addr == 0x0220)

View File

@ -35,7 +35,19 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600
internal class mX07 : MapperBase
{
private int _rombank_2K;
private int _rombank2K;
public override void SyncState(Serializer ser)
{
base.SyncState(ser);
ser.Sync("rombank_2k", ref _rombank2K);
}
public override void HardReset()
{
_rombank2K = 0;
base.HardReset();
}
private byte ReadMem(ushort addr, bool peek)
{
@ -49,7 +61,7 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600
return base.ReadMemory(addr);
}
return Core.Rom[(_rombank_2K << 12) + (addr & 0xFFF)];
return Core.Rom[(_rombank2K << 12) + (addr & 0xFFF)];
}
public override byte ReadMemory(ushort addr)
@ -71,12 +83,6 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600
}
}
public override void SyncState(Serializer ser)
{
base.SyncState(ser);
ser.Sync("rombank_2k", ref _rombank_2K);
}
private void Address(ushort addr)
{
if ((addr & 0x180F) == 0x080D)
@ -85,16 +91,16 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600
}
else if ((addr & 0x1880) == 0)
{
if ((_rombank_2K & 0xE) == 0xE)
if ((_rombank2K & 0xE) == 0xE)
{
Bank(((addr & 0x40) >> 6) | (_rombank_2K & 0xE));
Bank(((addr & 0x40) >> 6) | (_rombank2K & 0xE));
}
}
}
private void Bank(int bank)
{
_rombank_2K = bank & 0x0F;
_rombank2K = bank & 0x0F;
}
}
}

View File

@ -76,6 +76,25 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600
_player1.ScanCnt = 8;
}
public void Reset()
{
_hsyncCnt = 0;
_capChargeStart = 0;
_capCharging = false;
_vblankEnabled = false;
_vsyncEnabled = false;
_scanline = new uint[160];
_player0 = new PlayerData();
_player1 = new PlayerData();
_playField = new PlayfieldData();
_hmove = new HMoveData();
_ball = new BallData();
_player0.ScanCnt = 8;
_player1.ScanCnt = 8;
}
public bool FrameComplete { get; set; }
public int MaxVolume { get; set; }