/// <summary> /// Default constructor /// </summary> public ExecutionManager(Window in_parent_window) { ParentWindow = in_parent_window; TVC = new TVComputer(); ExecutionHistory = new ExecutionHistoryCollection(2); m_stream_thread = null; m_thread_event = new AutoResetEvent(false); m_context = SynchronizationContext.Current; m_thread_running = false; m_sound_event = false; m_execution_state = ExecutionState.Running; m_last_execution_state = ExecutionState.Running; m_execution_state_request = ExecutionStateRequest.NoChange; m_execution_state_changed_event = new AutoResetEvent(false); DebugStepIntoCommand = new ExecutionManagerCommand(DebugStepExecute); DebugPauseCommand = new ExecutionManagerCommand(DebugPauseExecute); DebugRunCommand = new ExecutionManagerCommand(DebugRunExecute); DebugResetCommand = new ExecutionManagerCommand(DebugResetExecute); DebugRunFullSpeedCommand = new ExecutionManagerCommand(DebugRunFullSpeedExecute); BreakpointAddress = -1; }
public void ChangeExecutionState(ExecutionStateRequest in_request) { if (in_request == ExecutionStateRequest.NoChange) { return; } m_execution_state_changed_event.Reset(); m_execution_state_request = in_request; m_thread_event.Set(); m_execution_state_changed_event.WaitOne(); }
private void SimulationThread() { double delay_time; m_disassembler = new Z80Disassembler(); m_disassembler.ReadByte = ReadMemory; m_stopwatch = new Stopwatch(); m_instruction_start_pc = TVC.CPU.Registers.PC; m_instruction_t_cycle = 0; m_debug_event_timestamp = DateTime.Now; delay_time = 0; while (m_thread_running) { // handle execution state change switch (m_execution_state_request) { // change to pause state case ExecutionStateRequest.Pause: m_execution_state_request = ExecutionStateRequest.NoChange; m_last_execution_state = m_execution_state; m_execution_state = ExecutionState.Paused; m_execution_state_changed_event.Set(); break; case ExecutionStateRequest.Restore: m_execution_state_request = ExecutionStateRequest.NoChange; m_execution_state = m_last_execution_state; m_execution_state_changed_event.Set(); break; // change to running case ExecutionStateRequest.Run: m_execution_state_request = ExecutionStateRequest.NoChange; m_execution_state = ExecutionState.Running; m_execution_state_changed_event.Set(); break; // full speed run case ExecutionStateRequest.RunFullSpeed: m_execution_state_request = ExecutionStateRequest.NoChange; m_execution_state = ExecutionState.RunningFullSpeed; m_execution_state_changed_event.Set(); break; // resets computer case ExecutionStateRequest.Reset: m_execution_state_request = ExecutionStateRequest.NoChange; TVC.Reset(); m_execution_state_changed_event.Set(); break; // no change case ExecutionStateRequest.NoChange: // do nothing break; } // execute according the execution state switch (m_execution_state) { case ExecutionState.Running: { uint ellapsed_tick; //m_stopwatch.Restart(); ellapsed_tick = RunOneFrame(); GenerateDebugEvent(false); //m_stopwatch.Stop(); //delay_time += TVC.CPUTickToMillisec(ellapsed_tick) - m_stopwatch.Elapsed.TotalMilliseconds; m_thread_event.WaitOne(1000); /* * if (delay_time > 0) * { * int delay = (int)Math.Truncate(delay_time); * * m_stopwatch.Restart(); * m_thread_event.WaitOne(delay); * m_stopwatch.Stop(); * delay_time -= m_stopwatch.Elapsed.TotalMilliseconds; * } * else * { * // execution is behind the schedule -> no delay * m_thread_event.WaitOne(0); * * delay_time = 0; * } */ } break; case ExecutionState.RunningFullSpeed: RunOneFrame(); GenerateDebugEvent(false); m_thread_event.WaitOne(0); break; case ExecutionState.Paused: m_thread_event.WaitOne(1000); break; } } }