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); CoreComm.MemoryCallbackSystem.CallExecute(addr);
} }
public void HardReset() public void RebootCore()
{ {
// Regenerate mapper here to make sure its state is entirely clean // Regenerate mapper here to make sure its state is entirely clean
switch (this._game.GetOptionsDict()["m"]) switch (this._game.GetOptionsDict()["m"])
@ -230,6 +230,28 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600
_mapper.GetType()); _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) public void FrameAdvance(bool render, bool rendersound)
{ {
_frame++; _frame++;
@ -251,6 +273,13 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600
_mapper.ClockCpu(); _mapper.ClockCpu();
} }
if (_hardResetSignal)
{
HardReset();
}
_hardResetSignal = Controller["Power"];
if (_islag) if (_islag)
{ {
LagCount++; LagCount++;

View File

@ -60,7 +60,7 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600
} }
Console.WriteLine("Game uses mapper " + game.GetOptionsDict()["m"]); Console.WriteLine("Game uses mapper " + game.GetOptionsDict()["m"]);
HardReset(); RebootCore();
} }
public string SystemId { get { return "A26"; } } 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", "P1 Up", "P1 Down", "P1 Left", "P1 Right", "P1 Button",
"P2 Up", "P2 Down", "P2 Left", "P2 Right", "P2 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 Dispose() { }
public virtual void ClockCpu() { } public virtual void ClockCpu() { }
public virtual void HardReset() { }
} }
} }

View File

@ -25,6 +25,18 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600
{ {
private int _bank4K; 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) private byte ReadMem(ushort addr, bool peek)
{ {
if (!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) private void Address(ushort addr)
{ {
switch (addr & 0x1840) switch (addr & 0x1840)

View File

@ -36,6 +36,15 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600
ser.Sync("hasRam", ref _hasRam); 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() public override void Dispose()
{ {
base.Dispose(); base.Dispose();

View File

@ -23,12 +23,18 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600
internal class m3F : MapperBase internal class m3F : MapperBase
{ {
private int _lowbank_2K; private int _lowbank2K;
public override void SyncState(Serializer ser) public override void SyncState(Serializer ser)
{ {
base.SyncState(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) public override byte ReadMemory(ushort addr)
@ -40,7 +46,7 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600
if (addr < 0x17FF) // Low 2k Bank 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 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) if ((value << 11) < Core.Rom.Length)
{ {
_lowbank_2K = value; _lowbank2K = value;
} }
else 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(); 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) private byte ReadMem(ushort addr, bool peek)
{ {
if (!peek) if (!peek)
@ -46,19 +66,6 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600
return ReadMem(addr, true); 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) private void Address(ushort addr)
{ {
if (addr == 0x1FF8) if (addr == 0x1FF8)

View File

@ -18,7 +18,25 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600
internal class mCV: MapperBase 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) public override byte ReadMemory(ushort addr)
{ {
@ -29,7 +47,7 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600
if (addr < 0x1400) if (addr < 0x1400)
{ {
return _auxRam[(addr & 0x3FF)]; return _ram[(addr & 0x3FF)];
} }
if (addr >= 0x1800 && addr < 0x2000) if (addr >= 0x1800 && addr < 0x2000)
@ -53,14 +71,8 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600
} }
else if (addr >= 0x1400 && addr < 0x1800) 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); ser.Sync("RandomNumber", ref RandomNumber);
} }
public override void HardReset()
{
// TODO
base.HardReset();
}
private void UpdateMusicModeDataFetchers() private void UpdateMusicModeDataFetchers()
{ {
// Calculate the number of cycles since the last update // 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 _toggle2;
private int _toggle3; 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) private byte ReadMem(ushort addr, bool peek)
{ {
if (!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) private void Address(ushort addr)
{ {
switch (addr) switch (addr)

View File

@ -29,12 +29,39 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600
internal class mE7 : MapperBase internal class mE7 : MapperBase
{ {
private int _rombank_1K; private int _rombank1K;
private int _rambank1Toggle; private int _rambank1Toggle;
private ByteBuffer _rambank0 = new ByteBuffer(1024); private ByteBuffer _rambank0 = new ByteBuffer(1024);
private ByteBuffer _rambank1 = new ByteBuffer(1024); private ByteBuffer _rambank1 = new ByteBuffer(1024);
private bool _enableRam0; 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) private byte ReadMem(ushort addr, bool peek)
{ {
if (addr < 0x1000) if (addr < 0x1000)
@ -59,7 +86,7 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600
return _rambank0[addr & 0x3FF]; 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 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) private void Address(ushort addr)
{ {
switch (addr) switch (addr)
{ {
case 0x1FE0: case 0x1FE0:
_rombank_1K = 0; _rombank1K = 0;
break; break;
case 0x1FE1: case 0x1FE1:
_rombank_1K = 1; _rombank1K = 1;
break; break;
case 0x1FE2: case 0x1FE2:
_rombank_1K = 2; _rombank1K = 2;
break; break;
case 0x1FE3: case 0x1FE3:
_rombank_1K = 3; _rombank1K = 3;
break; break;
case 0x1FE4: case 0x1FE4:
_rombank_1K = 4; _rombank1K = 4;
break; break;
case 0x1FE5: case 0x1FE5:
_rombank_1K = 5; _rombank1K = 5;
break; break;
case 0x1FE6: case 0x1FE6:
_rombank_1K = 6; _rombank1K = 6;
break; break;
case 0x1FE7: case 0x1FE7:
_enableRam0 = true; _enableRam0 = true;

View File

@ -16,6 +16,18 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600
{ {
private int _toggle; 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) private byte ReadMem(ushort addr, bool peek)
{ {
if (!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) private void Address(ushort addr)
{ {
if (addr == 0x1FE0) _toggle = 0; if (addr == 0x1FE0) _toggle = 0;

View File

@ -12,6 +12,26 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600
private int _bank4k; private int _bank4k;
private ByteBuffer _ram = new ByteBuffer(128); 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) private byte ReadMem(ushort addr, bool peek)
{ {
if (!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) private void Address(ushort addr)
{ {
if (addr == 0x1FE0) _bank4k = 0; if (addr == 0x1FE0) _bank4k = 0;

View File

@ -22,6 +22,18 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600
{ {
private int _bank; 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) private byte ReadMem(ushort addr, bool peek)
{ {
if (!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() private void Increment()
{ {
_bank++; _bank++;

View File

@ -14,6 +14,18 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600
{ {
private int _toggle; 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) private byte ReadMem(ushort addr, bool peek)
{ {
if (!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) private void Address(ushort addr)
{ {
if (addr == 0x1FF4) _toggle = 0; if (addr == 0x1FF4) _toggle = 0;

View File

@ -11,6 +11,26 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600
private int _bank4k; private int _bank4k;
private ByteBuffer _ram = new ByteBuffer(128); 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) private byte ReadMem(ushort addr, bool peek)
{ {
if (!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) private void Address(ushort addr)
{ {
if (addr == 0x1FF4) _bank4k = 0; if (addr == 0x1FF4) _bank4k = 0;

View File

@ -15,6 +15,18 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600
{ {
private int _toggle; 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) private byte ReadMem(ushort addr, bool peek)
{ {
if (!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) private void Address(ushort addr)
{ {
if (addr == 0x1FF6) _toggle = 0; if (addr == 0x1FF6) _toggle = 0;

View File

@ -11,6 +11,26 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600
private int _bank4k; private int _bank4k;
private ByteBuffer _ram = new ByteBuffer(128); 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) private byte ReadMem(ushort addr, bool peek)
{ {
if (!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) private void Address(ushort addr)
{ {
if (addr == 0x1FF6) _bank4k = 0; if (addr == 0x1FF6) _bank4k = 0;

View File

@ -21,7 +21,19 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600
internal class mF8 : MapperBase 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) private byte ReadMem(ushort addr, bool peek)
{ {
@ -35,7 +47,7 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600
return base.ReadMemory(addr); 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) 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) private void Address(ushort addr)
{ {
if (addr == 0x1FF8) if (addr == 0x1FF8)
{ {
_bank_4K = 0; _bank4K = 0;
} }
else if (addr == 0x1FF9) 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 int _bank_4K;
private ByteBuffer _ram = new ByteBuffer(128); 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) private byte ReadMem(ushort addr, bool peek)
{ {
if (!peek) if (!peek)

View File

@ -17,7 +17,27 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600
internal class mFA : MapperBase internal class mFA : MapperBase
{ {
private int _toggle; 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) private byte ReadMem(ushort addr, bool peek)
{ {
@ -38,7 +58,7 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600
if (addr < 0x1200) if (addr < 0x1200)
{ {
return _auxRam[addr & 0xFF]; return _ram[addr & 0xFF];
} }
return Core.Rom[(_toggle << 12) + (addr & 0xFFF)]; return Core.Rom[(_toggle << 12) + (addr & 0xFFF)];
@ -63,17 +83,10 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600
} }
else if (addr < 0x1100) 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) private void Address(ushort addr)
{ {
if (addr == 0x1FF8) _toggle = 0; if (addr == 0x1FF8) _toggle = 0;

View File

@ -11,7 +11,27 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600
internal class mFA2 : MapperBase internal class mFA2 : MapperBase
{ {
private int _bank4k; 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) private byte ReadMem(ushort addr, bool peek)
{ {
@ -32,7 +52,7 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600
if (addr < 0x1200) if (addr < 0x1200)
{ {
return _auxRam[addr & 0xFF]; return _ram[addr & 0xFF];
} }
return Core.Rom[(_bank4k << 12) + (addr & 0xFFF)]; return Core.Rom[(_bank4k << 12) + (addr & 0xFFF)];
@ -57,23 +77,10 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600
} }
else if (addr < 0x1100) 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) private void Address(ushort addr)
{ {
if (addr == 0x1FF5) _bank4k = 0; if (addr == 0x1FF5) _bank4k = 0;

View File

@ -16,6 +16,18 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600
{ {
private int _toggle; 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) private byte ReadMem(ushort addr, bool peek)
{ {
if (!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) private void Address(ushort addr)
{ {
if (addr == 0x0220) if (addr == 0x0220)

View File

@ -35,7 +35,19 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600
internal class mX07 : MapperBase 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) private byte ReadMem(ushort addr, bool peek)
{ {
@ -49,7 +61,7 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600
return base.ReadMemory(addr); 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) 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) private void Address(ushort addr)
{ {
if ((addr & 0x180F) == 0x080D) if ((addr & 0x180F) == 0x080D)
@ -85,16 +91,16 @@ namespace BizHawk.Emulation.Cores.Atari.Atari2600
} }
else if ((addr & 0x1880) == 0) 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) 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; _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 bool FrameComplete { get; set; }
public int MaxVolume { get; set; } public int MaxVolume { get; set; }