public void Run(Options parameter, Action <Options> next) { var ast = (AssemblySource)parameter.Tags["AST"]; var writer = new VmWriter(); foreach (var line in ast.Lines) { writer.Write(line.Opcode); foreach (var ops in line.Operands) { writer.Write(ops); } } File.WriteAllBytes(parameter.Output, writer.ToArray()); next(parameter); }
public void Run() { ReadLine.HistoryEnabled = true; ReadLine.AutoCompletionHandler = new AutoCompletionHandler(); bool ishexMode = false; while (true) { string prefix = ishexMode ? "hex" : "asm"; var input = ReadLine.Read(prefix + "> "); if (ReplCommand.IsCommand(input)) { var cmd = ReplCommand.Parse(input); switch (cmd.Name) { case "mode": var arg = cmd.Args.First(); if (arg == "asm") { ishexMode = false; } else if (arg == "hex") { ishexMode = true; } else { Console.WriteLine($"mode '{arg}' not recognized"); } break; case "register": Utils.PrintRegisters(vm.Register); break; case "clear": Console.Clear(); break; case "explain": if (cmd.Args.Length == 1) { var errorcodeStr = cmd.Args.First(); Console.WriteLine(ErrorTable.GetExplanation(int.Parse(errorcodeStr))); } else { Console.WriteLine("Please specifiy an errorcode"); } break; default: Console.WriteLine($"Command '{cmd.Name}' not found"); break; } } else { if (ishexMode) { var prog = ParseHex(input); var reader = new VmReader(prog, vm); vm.RunInstructionLine(reader); } else { var src = AssemblySource.Parse(input); var writer = new VmWriter(); foreach (var line in src.Lines) { writer.Write(line.Opcode); foreach (var operand in line.Operands) { writer.Write(operand); } } vm.Run(writer); vm.Register[Registers.IPR] = 0; } } } }