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