예제 #1
0
    private void DumpState()
    {
        // Parse current instruction.
        string rawInstr = MainModule.GetCurrentInstruction(VMCpu).Trim();
        var    instr    = new MicroCodeInstruction(rawInstr);

        var builder = new StringBuilder();

        // Add an extra new line if we are switching to an unusual PC (indicator of a basic block header).
        int pc = Convert.ToInt32(MainModule.GetProgramCounter(VMCpu), 2);

        if (lastPc + 1 != pc)
        {
            Console.WriteLine();
        }

        // Print current and next PC.
        builder.Append(pc.ToString("X8"));
        builder.Append(" -> ");
        builder.Append(instr.AddReg3ToNextOffset
                        ? "r3      "
                        : instr.NextOffset.ToString("X8"));
        builder.Append(":    ");

        // Print destination registers.
        if (instr.Destinations != 0)
        {
            builder.Append(instr.Destinations.ToString().ToLowerInvariant().PadLeft(8));
            builder.Append(" :=   ");
        }
        else
        {
            builder.Append("              ");
        }

        // Print mnemonics.
        builder.Append(instr.GetAluMnemonic().PadRight(20));
        builder.Append(instr.GetMemoryMnemonic().PadRight(35));

        // Print if it checks zero or parity flags.
        builder.Append(instr.Parity ? 'P' : ' ');
        builder.Append(instr.Zero ? 'Z' : ' ');
        builder.Append("   ");

        // Print current state of flags.
        var flags = MainModule.GetFlags(VMState);

        builder.Append("P:");
        builder.Append(flags[0]);
        builder.Append(" Z:");
        builder.Append(flags[1]);
        builder.Append("   ");

        // Print current register values.
        for (int i = 0; i < 10; i++)
        {
            int raw = Convert.ToInt32(MainModule.GetValue(VMState.InternalState1.Registers[i]), 2);
            builder.Append("r");
            builder.Append(i.ToString());
            builder.Append(": ");
            builder.Append(raw.ToString("X8"));
            if (i < 9)
            {
                builder.Append(", ");
            }
        }

        Console.WriteLine(builder.ToString());
        lastPc = pc;
    }