예제 #1
0
        /// <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;
        }
예제 #2
0
        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();
        }
예제 #3
0
        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;
                }
            }
        }