BizHawk/BizHawk.Emulation.Cores/Consoles/Magnavox/Odyssey2/O2Hawk.IStatable.cs

98 lines
2.4 KiB
C#

using System.IO;
using BizHawk.Common;
using BizHawk.Emulation.Common;
namespace BizHawk.Emulation.Cores.Consoles.O2Hawk
{
public partial class O2Hawk : IStatable
{
public bool BinarySaveStatesPreferred => true;
public void SaveStateText(TextWriter writer)
{
SyncState(new Serializer(writer));
}
public void LoadStateText(TextReader reader)
{
SyncState(new Serializer(reader));
}
public void SaveStateBinary(BinaryWriter bw)
{
SyncState(new Serializer(bw));
}
public void LoadStateBinary(BinaryReader br)
{
SyncState(new Serializer(br));
}
public byte[] SaveStateBinary()
{
using var ms = new MemoryStream();
using var bw = new BinaryWriter(ms);
SaveStateBinary(bw);
bw.Flush();
return ms.ToArray();
}
private void SyncState(Serializer ser)
{
byte[] core = null;
if (ser.IsWriter)
{
using var ms = new MemoryStream();
ms.Close();
core = ms.ToArray();
}
cpu.SyncState(ser);
mapper.SyncState(ser);
ppu.SyncState(ser);
serialport.SyncState(ser);
ser.BeginSection("Odyssey2");
ser.Sync(nameof(core), ref core, false);
ser.Sync("Lag", ref _lagcount);
ser.Sync("Frame", ref _frame);
ser.Sync("IsLag", ref _islag);
_controllerDeck.SyncState(ser);
ser.Sync(nameof(controller_state_1), ref controller_state_1);
ser.Sync(nameof(controller_state_2), ref controller_state_2);
ser.Sync(nameof(in_vblank), ref in_vblank);
ser.Sync(nameof(in_vblank_old), ref in_vblank_old);
ser.Sync(nameof(vblank_rise), ref vblank_rise);
ser.Sync(nameof(RAM_en), ref RAM_en);
ser.Sync(nameof(ppu_en), ref ppu_en);
ser.Sync(nameof(cart_b0), ref cart_b0);
ser.Sync(nameof(cart_b1), ref cart_b1);
ser.Sync(nameof(lum_en), ref lum_en);
ser.Sync(nameof(copy_en), ref copy_en);
ser.Sync(nameof(kybrd_en), ref kybrd_en);
ser.Sync(nameof(rom_bank), ref rom_bank);
// memory domains
ser.Sync(nameof(RAM), ref RAM, false);
ser.Sync(nameof(_bios), ref _bios, false);
ser.Sync(nameof(addr_latch), ref addr_latch);
ser.Sync(nameof(kb_byte), ref kb_byte);
ser.Sync(nameof(kb_state_row), ref kb_state_row);
ser.Sync(nameof(kb_state_col), ref kb_state_col);
ser.Sync(nameof(frame_buffer), ref frame_buffer, false);
ser.Sync(nameof(_vidbuffer), ref _vidbuffer, false);
// probably a better way to do this
if (cart_RAM != null)
{
ser.Sync(nameof(cart_RAM), ref cart_RAM, false);
}
ser.EndSection();
}
}
}