feat(core): add emulator save state snapshotting

This commit is contained in:
dualfroz committed 2026-08-26 23:10:24 +02:00
1 parent c4d22c44f1
commit d663232c9d
1 file changed
+73
+73
View File
@@ -0,0 +1,73 @@
using System;
using System.IO;
using GameBoy.Audio;
namespace GameBoy
{
public sealed partial class Emulator
{
private const uint SnapshotMagic = 0x31545347;
public Apu Apu => apu;
public bool HasBattery => Cartridge.HasBattery;
public bool HasRtc => Cartridge.HasRtc;
public byte ReadMemory(ushort address) => mmu.Read(address);
public void WriteMemory(ushort address, byte value) => mmu.Write(address, value);
public void AdvanceRtcSeconds(long seconds) => Cartridge.AdvanceRtc(seconds);
public byte[] SaveRam() => (byte[])Cartridge.Ram.Clone();
public void LoadRam(byte[] contents)
{
Array.Copy(contents, 0, Cartridge.Ram, 0, Math.Min(contents.Length, Cartridge.Ram.Length));
}
public byte[] SaveState()
{
using var stream = new MemoryStream();
using var writer = new BinaryWriter(stream);
writer.Write(SnapshotMagic);
writer.Write(TotalCycles);
cpu.SaveState(writer);
interrupts.SaveState(writer);
ppu.SaveState(writer);
timer.SaveState(writer);
joypad.SaveState(writer);
serial.SaveState(writer);
apu.SaveState(writer);
mmu.SaveState(writer);
dma.SaveState(writer);
Cartridge.SaveState(writer);
writer.Flush();
return stream.ToArray();
}
public void LoadState(byte[] snapshot)
{
using var stream = new MemoryStream(snapshot);
using var reader = new BinaryReader(stream);
uint magic = reader.ReadUInt32();
if (magic != SnapshotMagic)
throw new InvalidDataException("unrecognized save state header");
TotalCycles = reader.ReadInt64();
cpu.LoadState(reader);
interrupts.LoadState(reader);
ppu.LoadState(reader);
timer.LoadState(reader);
joypad.LoadState(reader);
serial.LoadState(reader);
apu.LoadState(reader);
mmu.LoadState(reader);
dma.LoadState(reader);
Cartridge.LoadState(reader);
}
}
}