7800: savestates

This commit is contained in:
goyuken 2012-12-12 15:36:17 +00:00
parent 7bb1baf2ab
commit 0636bda89d
1 changed files with 42 additions and 24 deletions

View File

@ -40,10 +40,10 @@ namespace BizHawk
public bool StartAsyncSound() { return false; } public bool StartAsyncSound() { return false; }
public void EndAsyncSound() { } public void EndAsyncSound() { }
public bool DeterministicEmulation { get; set; } public bool DeterministicEmulation { get; set; }
public void SaveStateText(TextWriter writer) { } public void SaveStateText(TextWriter writer) { SyncState(new Serializer(writer)); }
public void LoadStateText(TextReader reader) { } public void LoadStateText(TextReader reader) { SyncState(new Serializer(reader)); }
public void SaveStateBinary(BinaryWriter bw) { } public void SaveStateBinary(BinaryWriter bw) { SyncState(new Serializer(bw)); }
public void LoadStateBinary(BinaryReader br) { } public void LoadStateBinary(BinaryReader br) { SyncState(new Serializer(br)); }
private IList<MemoryDomain> memoryDomains; private IList<MemoryDomain> memoryDomains;
public IList<MemoryDomain> MemoryDomains { get { return null; } } public IList<MemoryDomain> MemoryDomains { get { return null; } }
public MemoryDomain MainMemory { get { return null; } } public MemoryDomain MainMemory { get { return null; } }
@ -205,7 +205,7 @@ namespace BizHawk
theMachine.Reset(); theMachine.Reset();
if (avProvider != null) if (avProvider != null)
avProvider.Dispose(); avProvider.Dispose();
avProvider = new MyAVProvider(theMachine); avProvider.ConnectToMachine(theMachine);
// to sync exactly with audio as this emulator creates and times it, the frame rate should be exactly 60:1 or 50:1 // to sync exactly with audio as this emulator creates and times it, the frame rate should be exactly 60:1 or 50:1
CoreComm.VsyncNum = theMachine.FrameHZ; CoreComm.VsyncNum = theMachine.FrameHZ;
CoreComm.VsyncDen = 1; CoreComm.VsyncDen = 1;
@ -213,9 +213,25 @@ namespace BizHawk
void SyncState(Serializer ser) //TODO void SyncState(Serializer ser) //TODO
{ {
byte[] core = null;
if (ser.IsWriter)
{
var ms = new MemoryStream();
theMachine.Serialize(new BinaryWriter(ms));
ms.Close();
core = ms.ToArray();
}
ser.BeginSection("Atari7800");
ser.Sync("core", ref core, false);
ser.Sync("Lag", ref _lagcount); ser.Sync("Lag", ref _lagcount);
ser.Sync("Frame", ref _frame); ser.Sync("Frame", ref _frame);
ser.Sync("IsLag", ref _islag); ser.Sync("IsLag", ref _islag);
ser.EndSection();
if (ser.IsReader)
{
theMachine = MachineBase.Deserialize(new BinaryReader(new MemoryStream(core, false)));
avProvider.ConnectToMachine(theMachine);
}
} }
private void SoftReset() //TOOD: hook this up private void SoftReset() //TOOD: hook this up
@ -223,12 +239,12 @@ namespace BizHawk
theMachine.Reset(); theMachine.Reset();
} }
MyAVProvider avProvider; MyAVProvider avProvider = new MyAVProvider();
class MyAVProvider : IVideoProvider, ISyncSoundProvider, IDisposable class MyAVProvider : IVideoProvider, ISyncSoundProvider, IDisposable
{ {
public FrameBuffer framebuffer { get; private set; } public FrameBuffer framebuffer { get; private set; }
public MyAVProvider(MachineBase m) public void ConnectToMachine(MachineBase m)
{ {
framebuffer = m.CreateFrameBuffer(); framebuffer = m.CreateFrameBuffer();
BufferWidth = framebuffer.VisiblePitch; BufferWidth = framebuffer.VisiblePitch;
@ -236,6 +252,8 @@ namespace BizHawk
vidbuffer = new int[BufferWidth * BufferHeight]; vidbuffer = new int[BufferWidth * BufferHeight];
uint samplerate = (uint)m.SoundSampleFrequency; uint samplerate = (uint)m.SoundSampleFrequency;
if (resampler != null)
resampler.Dispose();
resampler = new Emulation.Sound.Utilities.SpeexResampler(3, samplerate, 44100, samplerate, 44100, null, null); resampler = new Emulation.Sound.Utilities.SpeexResampler(3, samplerate, 44100, samplerate, 44100, null, null);
dcfilter = Emulation.Sound.Utilities.DCFilter.DetatchedMode(256); dcfilter = Emulation.Sound.Utilities.DCFilter.DetatchedMode(256);
} }
@ -248,7 +266,7 @@ namespace BizHawk
{ {
unsafe unsafe
{ {
fixed (BufferElement *src_ = framebuffer.VideoBuffer) fixed (BufferElement* src_ = framebuffer.VideoBuffer)
{ {
fixed (int* dst_ = vidbuffer) fixed (int* dst_ = vidbuffer)
{ {