Exemple #1
0
        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);
            }
        }