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); }
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); } }
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)); }
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); }