Exemple #1
0
        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();
        }
Exemple #2
0
        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);
                }
            }
        }