private void GenerateNextInstruction(int pc) { OpCode oc = system.CPU.PreFetch(); int cmdLength = oc.Length; byte[] command = new byte[cmdLength]; for (int i = 0; i < cmdLength; i++) { //command[i] = FoenixSystem.Current.RAM.ReadByte(pc + i); command[i] = FoenixSystem.Current.MemoryManager.ReadByte(pc + i); } string opcodes = oc.ToString(system.CPU.ReadSignature(oc, pc)); //string status = ""; DebugLine line = new DebugLine(pc, command, opcodes, null); if (!lastLine.InvokeRequired) { lastLine.Text = line.ToString(); } else { try { lastLine.Invoke(new lastLineDelegate(ShowLastLine), new object[] { line.ToString() }); } finally { } } queue.Add(line); }
private void GenerateNextInstruction(int pc) { OpCode oc = kernel.CPU.PreFetch(); int ocLength = oc.Length; byte[] command = new byte[ocLength]; for (int i = 0; i < ocLength; i++) { command[i] = kernel.MemMgr.RAM.ReadByte(pc + i); } string opcodes = oc.ToString(kernel.CPU.ReadSignature(ocLength, pc)); //string status = ""; DebugLine line = new DebugLine(pc); line.SetOpcodes(command); line.SetMnemonic(opcodes); if (!lastLine.InvokeRequired) { lastLine.Text = line.ToString(); } else { try { lastLine.Invoke(new lastLineDelegate(ShowLastLine), new object[] { line.ToString() }); } finally { } } // find the proper place to insert the line, based on the PC int index = 0; bool lineAdded = false; for (index = 0; index < codeList.Count; index++) { DebugLine l = codeList[index]; if (l.PC > pc) { codeList.Insert(index, line); lineAdded = true; break; } } if (!lineAdded) { codeList.Add(line); } }
private void DebugPanel_Paint(object sender, PaintEventArgs e) { bool paint = false; int currentPC = kernel.CPU.PC; //if ((kernel.CPU.DebugPause)) if (true && codeList != null) { int queueLength = codeList.Count; int painted = 0; int index = 0; // Draw the position box if (position.X > 0 && position.Y > 0) { int row = position.Y / ROW_HEIGHT; int col = 12; e.Graphics.FillRectangle(Brushes.LightBlue, col, row * ROW_HEIGHT, 7 * 6, 14); } bool offsetPrinted = false; foreach (DebugLine line in codeList) { if (line != null) { if (line.PC == currentPC) { paint = true; TopLineIndex = index; if (!offsetPrinted) { if (index > 4) { TopLineIndex -= 5; for (int c = 5; c > 0; c--) { DebugLine q0 = codeList[index - c]; // Draw the label as a black box with white text if (q0.label != null) { e.Graphics.FillRectangle(Brushes.Blue, 1, painted * ROW_HEIGHT, LABEL_WIDTH + 2, ROW_HEIGHT + 2); e.Graphics.DrawString(q0.label, HeaderTextbox.Font, Brushes.Yellow, 2, painted * ROW_HEIGHT); } if (q0.PC == IRQPC) { e.Graphics.FillRectangle(Brushes.Orange, 0, painted * ROW_HEIGHT, this.Width, ROW_HEIGHT); } if (knl_breakpoints.ContainsKey(q0.PC)) { e.Graphics.DrawEllipse(Pens.White, LABEL_WIDTH - ROW_HEIGHT - 1, painted * ROW_HEIGHT, ROW_HEIGHT + 1, ROW_HEIGHT + 1); e.Graphics.FillEllipse(Brushes.DarkRed, LABEL_WIDTH - ROW_HEIGHT, painted * ROW_HEIGHT + 1, ROW_HEIGHT, ROW_HEIGHT); } // Check if the memory still matches the opcodes if (!q0.CheckOpcodes(kernel.MemMgr.RAM)) { e.Graphics.FillRectangle(Brushes.Red, LABEL_WIDTH + 3, painted * ROW_HEIGHT, this.Width, ROW_HEIGHT); } e.Graphics.DrawString(q0.ToString(), HeaderTextbox.Font, Brushes.Black, LABEL_WIDTH + 2, painted * ROW_HEIGHT); if (q0.PC == ActiveLine[0]) { e.Graphics.DrawLine(Pens.Black, LABEL_WIDTH + ActiveLine[1], (painted + 1) * ROW_HEIGHT, LABEL_WIDTH + ActiveLine[1] + ActiveLine[2], (painted + 1) * ROW_HEIGHT); } painted++; } } offsetPrinted = true; } e.Graphics.FillRectangle(line.PC == IRQPC ? Brushes.Orange : Brushes.LightBlue, LABEL_WIDTH + 1, painted * ROW_HEIGHT, DebugPanel.Width, ROW_HEIGHT); } if (painted > 27) { paint = false; break; } if (paint) { if (line.label != null) { e.Graphics.FillRectangle(Brushes.Blue, 1, painted * ROW_HEIGHT, LABEL_WIDTH + 2, ROW_HEIGHT + 2); e.Graphics.DrawString(line.label, HeaderTextbox.Font, Brushes.Yellow, 2, painted * ROW_HEIGHT); } if (knl_breakpoints.ContainsKey(line.PC)) { e.Graphics.DrawEllipse(Pens.White, LABEL_WIDTH - ROW_HEIGHT - 1, painted * ROW_HEIGHT, ROW_HEIGHT + 1, ROW_HEIGHT + 1); e.Graphics.FillEllipse(Brushes.DarkRed, LABEL_WIDTH - ROW_HEIGHT, painted * ROW_HEIGHT + 1, ROW_HEIGHT, ROW_HEIGHT); } if (line.PC == IRQPC) { e.Graphics.FillRectangle(Brushes.Orange, 0, painted * ROW_HEIGHT, this.Width, ROW_HEIGHT); } // Check if the memory still matches the opcodes if (!line.CheckOpcodes(kernel.MemMgr.RAM)) { e.Graphics.FillRectangle(Brushes.Red, 0, painted * ROW_HEIGHT, this.Width, ROW_HEIGHT); } e.Graphics.DrawString(line.ToString(), HeaderTextbox.Font, Brushes.Black, 102, painted * ROW_HEIGHT); if (line.PC == ActiveLine[0]) { e.Graphics.DrawLine(Pens.Black, LABEL_WIDTH + ActiveLine[1], (painted + 1) * ROW_HEIGHT, LABEL_WIDTH + ActiveLine[1] + ActiveLine[2], (painted + 1) * ROW_HEIGHT); } painted++; } } index++; } } else { e.Graphics.FillRectangle(Brushes.LightBlue, 0, 0, this.Width, this.Height); e.Graphics.DrawString("Running code real fast ... no time to write!", HeaderTextbox.Font, Brushes.Black, 8, DebugPanel.Height / 2); } }
private void DebugPanel_Paint(object sender, PaintEventArgs e) { bool paint = false; int currentPC = system.CPU.GetLongPC(); //if ((kernel.CPU.DebugPause)) if (true && queue != null) { int queueLength = queue.Count; int painted = 0; int index = 0; // Draw the position box if (position.X > 0 && position.Y > 0) { int row = position.Y / ROW_HEIGHT; int col = 12; e.Graphics.FillRectangle(lightBlueBrush, col, row * ROW_HEIGHT, 7 * 6, 14); } bool offsetPrinted = false; foreach (DebugLine line in queue) { if (line != null) { if (line.PC == currentPC) { paint = true; TopLineIndex = index; if (!offsetPrinted) { if (index > 4) { TopLineIndex -= 5; for (int c = 5; c > 0; c--) { DebugLine q0 = queue[index - c]; if (q0.PC == IRQPC) { e.Graphics.FillRectangle(orangeBrush, 0, painted * ROW_HEIGHT, this.Width, ROW_HEIGHT); } if (breakpoints.ContainsKey(q0.PC)) { e.Graphics.FillRectangle(yellowBrush, 0, painted * ROW_HEIGHT, this.Width, ROW_HEIGHT); } // Check if the memory still matches the opcodes //if (!q0.CheckOpcodes(system.RAM)) if (!q0.CheckOpcodes()) { e.Graphics.FillRectangle(redBrush, 0, painted * ROW_HEIGHT, this.Width, ROW_HEIGHT); } if (!q0.isLabel) { e.Graphics.DrawString(q0.ToString(), HeaderTextbox.Font, debugBrush, 2, painted * ROW_HEIGHT); } else { e.Graphics.FillRectangle(debugBrush, 0, painted * ROW_HEIGHT, this.Width, ROW_HEIGHT); e.Graphics.DrawString(q0.ToString(), HeaderTextbox.Font, labelBrush, 2, painted * ROW_HEIGHT); } painted++; } } offsetPrinted = true; } e.Graphics.FillRectangle(line.PC == IRQPC ? orangeBrush : lightBlueBrush, 0, painted * ROW_HEIGHT, this.Width, ROW_HEIGHT); } if (painted > 26) { paint = false; break; } if (paint) { if (breakpoints.ContainsKey(line.PC)) { e.Graphics.FillRectangle(yellowBrush, 0, painted * ROW_HEIGHT, this.Width, ROW_HEIGHT); } if (line.PC == IRQPC) { e.Graphics.FillRectangle(orangeBrush, 0, painted * ROW_HEIGHT, this.Width, ROW_HEIGHT); } // Check if the memory still matches the opcodes //if (!line.CheckOpcodes(system.RAM)) if (!line.CheckOpcodes()) { e.Graphics.FillRectangle(redBrush, 0, painted * ROW_HEIGHT, this.Width, ROW_HEIGHT); } if (line.PC == currentPC || !line.isLabel) { e.Graphics.DrawString(line.ToString(), HeaderTextbox.Font, debugBrush, 2, painted * ROW_HEIGHT); } else { e.Graphics.FillRectangle(debugBrush, 0, painted * ROW_HEIGHT, this.Width, ROW_HEIGHT); e.Graphics.DrawString(line.ToString(), HeaderTextbox.Font, labelBrush, 2, painted * ROW_HEIGHT); } painted++; } } index++; } } else { e.Graphics.FillRectangle(lightBlueBrush, 0, 0, this.Width, this.Height); e.Graphics.DrawString("Running code real fast ... no time to write!", HeaderTextbox.Font, debugBrush, 8, DebugPanel.Height / 2); } }