private void RewindOne() { if (!Global.Emulator.HasSavestates()) { return; } var ms = _rewindBuffer.PopMemoryStream(); byte[] buf = ms.GetBuffer(); var reader = new BinaryReader(ms); var fullstate = reader.ReadBoolean(); if (fullstate) { if (_rewindDeltaEnable) { UpdateLastState(buf, 1, buf.Length - 1); } Global.Emulator.AsStatable().LoadStateBinary(reader); } else { var output = new MemoryStream(_lastState); int index = 1; int offset = 0; while (index < buf.Length) { int offsetDelta = (int)VLInteger.ReadUnsigned(buf, ref index); int length = (int)VLInteger.ReadUnsigned(buf, ref index); offset += offsetDelta; output.Position = offset; output.Write(buf, index, length); index += length; } output.Position = 0; Global.Emulator.AsStatable().LoadStateBinary(new BinaryReader(output)); output.Close(); } reader.Close(); }
private void LoadPreviousState() { using (var reader = new BinaryReader(GetPreviousStateMemoryStream())) { byte[] buf = ((MemoryStream)reader.BaseStream).GetBuffer(); bool fullState = reader.ReadByte() == 1; if (_rewindDeltaEnable) { if (fullState) { UpdateLastState(buf, 1, buf.Length - 1); } else { int index = 1; int offset = 0; while (index < buf.Length) { int offsetDelta = (int)VLInteger.ReadUnsigned(buf, ref index); int length = (int)VLInteger.ReadUnsigned(buf, ref index); offset += offsetDelta; Buffer.BlockCopy(buf, index, _lastState, offset, length); index += length; } } using (var lastStateReader = new BinaryReader(new MemoryStream(_lastState))) { Global.Emulator.AsStatable().LoadStateBinary(lastStateReader); } } else { if (!fullState) { throw new InvalidOperationException(); } Global.Emulator.AsStatable().LoadStateBinary(reader); } } }