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