示例#1
0
            private void ReadKey(string line)
            {
                string[] tokens = line.Split(',');

                int    id      = Convert.ToInt32(tokens[0]);
                UInt64 ticks   = Convert.ToUInt64(tokens[1]);
                byte   keyCode = Convert.ToByte(tokens[2]);
                bool   keyDown = Convert.ToBoolean(tokens[3]);

                CoreAction action = CoreAction.KeyPress(ticks, keyCode, keyDown);

                AddCoreAction(id, action);
            }
示例#2
0
        public CoreAction Clone()
        {
            switch (Type)
            {
            case Types.CoreVersion:
                return(CoreAction.CoreVersion(Ticks, Version));

            case Types.KeyPress:
                return(CoreAction.KeyPress(Ticks, KeyCode, KeyDown));

            case Types.LoadDisc:
                return(CoreAction.LoadDisc(Ticks, Drive, (MediaBuffer != null) ? (new MemoryBlob(MediaBuffer.GetBytes())) : null));

            case Types.LoadTape:
                return(CoreAction.LoadTape(Ticks, (MediaBuffer != null) ? (new MemoryBlob(MediaBuffer.GetBytes())) : null));

            case Types.Reset:
                return(CoreAction.Reset(Ticks));

            case Types.RunUntil:
            {
                List <UInt16> samples = null;
                if (AudioSamples != null)
                {
                    samples = new List <UInt16>(AudioSamples);
                }
                return(CoreAction.RunUntil(Ticks, StopTicks, samples));
            }

            case Types.LoadCore:
                return(CoreAction.LoadCore(Ticks, CoreState));

            case Types.CreateSnapshot:
                return(CoreAction.CreateSnapshot(Ticks, SnapshotId));

            case Types.RevertToSnapshot:
                return(CoreAction.RevertToSnapshot(Ticks, SnapshotId));

            default:
                return(null);
            }
        }
示例#3
0
        static public CoreAction CoreActionFromBytes(MemoryByteStream stream)
        {
            byte type = stream.ReadByte();

            switch (type)
            {
            case _coreActionKeyPress:
            {
                UInt64 ticks   = stream.ReadUInt64();
                byte   keyCode = stream.ReadByte();
                bool   keyDown = stream.ReadBool();

                return(CoreAction.KeyPress(ticks, keyCode, keyDown));
            }

            case _coreActionReset:
            {
                UInt64 ticks = stream.ReadUInt64();

                return(CoreAction.Reset(ticks));
            }

            case _coreActionLoadDisc:
            {
                UInt64 ticks = stream.ReadUInt64();
                byte   drive = stream.ReadByte();
                byte[] media = stream.ReadArray();

                return(CoreAction.LoadDisc(ticks, drive, new MemoryBlob(media)));
            }

            case _coreActionLoadTape:
            {
                UInt64 ticks = stream.ReadUInt64();
                byte[] media = stream.ReadArray();

                return(CoreAction.LoadTape(ticks, new MemoryBlob(media)));
            }

            case _coreActionRunUntil:
            {
                UInt64 ticks     = stream.ReadUInt64();
                UInt64 stopTicks = stream.ReadUInt64();

                return(CoreAction.RunUntil(ticks, stopTicks, null));
            }

            case _coreActionLoadCore:
            {
                UInt64 ticks = stream.ReadUInt64();
                byte[] state = stream.ReadArray();

                return(CoreAction.LoadCore(ticks, new MemoryBlob(state)));
            }

            case _coreActionCoreVersion:
            {
                UInt64 ticks   = stream.ReadUInt64();
                Int32  version = stream.ReadInt32();

                return(CoreAction.CoreVersion(ticks, version));
            }

            case _coreActionCreateSnapshot:
            {
                UInt64 ticks      = stream.ReadUInt64();
                Int32  snapshotId = stream.ReadInt32();

                return(CoreAction.CreateSnapshot(ticks, snapshotId));
            }

            case _coreActionDeleteSnapshot:
            {
                UInt64 ticks      = stream.ReadUInt64();
                Int32  snapshotId = stream.ReadInt32();

                return(CoreAction.DeleteSnapshot(ticks, snapshotId));
            }

            case _coreActionRevertToSnapshot:
            {
                UInt64 ticks      = stream.ReadUInt64();
                Int32  snapshotId = stream.ReadInt32();

                return(CoreAction.RevertToSnapshot(ticks, snapshotId));
            }
            }

            throw new Exception(String.Format("Unknown CoreAction type {0}!", type));
        }
示例#4
0
        private bool ProcessNextRequest()
        {
            bool success = true;

            CoreRequest firstRequest = FirstRequest();
            bool        removeFirst  = true;
            CoreRequest request      = firstRequest;
            CoreAction  action       = null;

            if (request == null)
            {
                removeFirst = false;

                if (IdleRequest != null)
                {
                    request = IdleRequest();
                }

                if (request == null)
                {
                    _requestQueueNonEmpty.WaitOne(20);
                    return(false);
                }
            }

            UInt64 ticks = Ticks;

            switch (request.Type)
            {
            case CoreRequest.Types.KeyPress:
                lock (_lockObject)
                {
                    if (_coreCLR.KeyPress(request.KeyCode, request.KeyDown))
                    {
                        action = CoreAction.KeyPress(ticks, request.KeyCode, request.KeyDown);
                    }
                }
                break;

            case CoreRequest.Types.Reset:
                lock (_lockObject)
                {
                    _coreCLR.Reset();
                }
                action = CoreAction.Reset(ticks);
                break;

            case CoreRequest.Types.LoadDisc:
                lock (_lockObject)
                {
                    _coreCLR.LoadDisc(request.Drive, request.MediaBuffer.GetBytes());
                }
                action = CoreAction.LoadDisc(ticks, request.Drive, request.MediaBuffer);
                break;

            case CoreRequest.Types.LoadTape:
                lock (_lockObject)
                {
                    _coreCLR.LoadTape(request.MediaBuffer.GetBytes());
                }
                action = CoreAction.LoadTape(ticks, request.MediaBuffer);
                break;

            case CoreRequest.Types.RunUntil:
            {
                action = RunForAWhile(request.StopTicks);

                success = (request.StopTicks <= Ticks);
            }
            break;

            case CoreRequest.Types.CoreVersion:
                lock (_lockObject)
                {
                    byte[] state = GetState();

                    ICore newCore = Core.CreateVersionedCore(request.Version);
                    newCore.LoadState(state);
                    newCore.SetScreen(Display.Pitch, Display.Height, Display.Width);

                    _coreCLR.Dispose();
                    _coreCLR = newCore;
                }
                break;

            case CoreRequest.Types.LoadCore:
                lock (_lockObject)
                {
                    _coreCLR.LoadState(request.CoreState.GetBytes());
                }

                action = CoreAction.LoadCore(ticks, request.CoreState);
                break;

            case CoreRequest.Types.CreateSnapshot:
                lock (_lockObject)
                {
                    action = CreateSnapshot(request.SnapshotId);
                }

                break;

            case CoreRequest.Types.DeleteSnapshot:
                lock (_lockObject)
                {
                    action = DeleteSnapshot(request.SnapshotId);
                }

                break;

            case CoreRequest.Types.RevertToSnapshot:
                lock (_lockObject)
                {
                    action = RevertToSnapshot(request.SnapshotId);
                }

                break;

            default:
                Diagnostics.Trace("Unknown core request type {0}. Ignoring request.", request.Type);
                break;
            }

            if (removeFirst && success)
            {
                RemoveFirstRequest();
            }

            Auditors?.Invoke(this, request, action);

            return(false);
        }