Exemplo n.º 1
0
        private void programCounter_Tick(object sender, EventArgs e)
        {
            if (exec == null)
            {
                End();
                return;
            }
            bool doEnd = false;

            try
            {
                switch (exec.Execute(10))
                {
                case Machine.Emulator.ExecutionState.Ended:
                    doEnd = true;
                    break;

                case Machine.Emulator.ExecutionState.Paused:
                    programCounter.Enabled = false;
                    pauseButton.Text       = "Resume";
                    break;
                }
            }
            catch (Exception ex)
            {
                LogFatal(ex.Message);
                doEnd = true;
            }
            instructionCountLabel.Text = exec.InstructionCounter.ToString();
            var state = exec.State;

            pcLabel.Text    = state.pc.ToString();
            acLabel.Text    = state.ac.ToString();
            spLabel.Text    = state.sp.ToString();
            stackLabel.Text = "Stack: " + state.StackToString(16);
            if (doEnd)
            {
                End();
            }
            ScrollDown();
        }
        static void Main(string[] args)
        {
            if (args.Length == 0)
            {
                Console.Error.WriteLine("Usage: trun filename");
                return;
            }
            Machine.Emulator exec = null;
            try
            {
                exec = new Machine.Emulator(Machine.Language.Parse(File.ReadAllLines(args[0])), x => Console.WriteLine(x));

                bool end = false;

                while (!end)
                {
                    switch (exec.Execute(int.MaxValue))
                    {
                    case Machine.Emulator.ExecutionState.Ended:
                        end = true;
                        break;

                    case Machine.Emulator.ExecutionState.Paused:
                        Console.WriteLine("Program paused");
                        PrintState(exec);
                        Console.WriteLine("  (Press enter to continue)");
                        Console.ReadLine();
                        break;
                    }
                }
            }
            catch (Machine.CommandException ex)
            {
                Console.Error.WriteLine(ex.Message);
                if (ex.InnerException is Machine.CommandNotFoundException)
                {
                    Console.WriteLine("Known commands: ");
                    Console.WriteLine("  [label]:");
                    foreach (var cmd in Machine.Language.Commands)
                    {
                        if (cmd.RequiresParameter)
                        {
                            Console.WriteLine("  " + cmd.Name + " [" + cmd.Parameter + "]");
                        }
                        else
                        {
                            Console.WriteLine("  " + cmd.Name);
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                Console.Error.WriteLine(ex.Message);
            }
            if (exec != null)
            {
                Console.WriteLine("Program exited");
                PrintState(exec);
            }
        }