public static void RunCommandInterpreter(VirtualMachine vm, byte mode) { var commandProcessor = vm.Dos.GetCommandProcessor(); if (commandProcessor.HasBatch) { var result = commandProcessor.RunNextBatchStatement(); if (result == CommandResult.Exit) { vm.Processor.Flags.Carry = true; } else if (result == CommandResult.Continue && commandProcessor.HasBatch) { vm.Processor.EIP -= 3; } return; } if (mode == 0) { // mode 0 = process args if any specified var args = vm.CurrentProcess.CommandLineArguments; int index = args.IndexOf("/c", StringComparison.OrdinalIgnoreCase); if (index >= 0) { var actualArgs = args.AsSpan().Slice(2).Trim(); if (StatementParser.IsBatchFile(actualArgs)) { StatementParser.Split(actualArgs, out var batchFileName, out var batchArgs); vm.Processor.Flags.Carry = !commandProcessor.BeginBatch(batchFileName, batchArgs.TrimStart()); } else { ParseCommand(vm, actualArgs); vm.Processor.Flags.Carry = true; } } else { args = args.Trim(); if (!string.IsNullOrEmpty(args)) { ParseCommand(vm, args); vm.Processor.Flags.Carry = true; } else { vm.Processor.Flags.Carry = false; } } } else if (mode == 1) { // mode 1 = write command prompt vm.Console.Write(vm.FileSystem.WorkingDirectory.ToString() + ">"); } else { // mode 2 = process input from mode 1 int stringLength = vm.PhysicalMemory.GetByte(vm.Processor.DS, (ushort)vm.Processor.DX + 1u); var input = vm.PhysicalMemory.GetString(vm.Processor.DS, (ushort)vm.Processor.DX + 2u, stringLength); vm.Console.WriteLine(); vm.Processor.Flags.Carry = ParseCommand(vm, input); } }