public void redrawmemtable() { int beg = (int)MemAddrBeg.Value; int i; int inst = 0; for (i = 0; i < 256; ++i) { // Store integer 182 int intValue = memory[i + beg]; // Convert integer 182 as a hex in a string variable string hexValue = intValue.ToString("X"); string addrhex = (beg + i).ToString("X"); while (addrhex.Length < 4) { addrhex = '0' + addrhex; } //addrhex = '0x' + addrhex; dataGridView1.Rows[i].Cells[0].Value = addrhex; dataGridView1.Rows[i].Cells[1].Value = hexValue; if (i >= inst) { dataGridView1.Rows[i].Cells[2].Value = cpu.instruction_str((UInt16)(beg + i)); inst += cpu.ist_length((byte)intValue); } else { dataGridView1.Rows[i].Cells[2].Value = ""; } } }
private void дизасемблироватьToolStripMenuItem_Click(object sender, EventArgs e) { List <prog_block> blocks = new List <prog_block>(); int i = 0; while (i < 65536) { while (true) { if (i > 65535) { break; } if (mem[i] != 0) { break; } else { i++; } } int beg = i; while (true) { if (i > 65535) { break; } if (mem[i] == 0) { break; } else { i++; } } int end = i; if (beg < 65536) { prog_block element; element.beg = beg; element.end = end; blocks.Add(element); } } for (i = 1; i < blocks.Count; i++) { int diff = blocks.ElementAt(i).beg - blocks.ElementAt(i - 1).end; if (diff < 16) { int tmpbeg = blocks.ElementAt(i - 1).beg; prog_block tmp_block = blocks.ElementAt(i); tmp_block.beg = tmpbeg; blocks.RemoveAt(i); blocks.RemoveAt(i - 1); blocks.Insert(i - 1, tmp_block); i--; } } List <prog_LABEL> labels = new List <prog_LABEL>(); int numoflbls = 0; List <string_addr> lines = new List <string_addr>(); for (i = 0; i < blocks.Count; i++) { //textBox1.Text += "$ORG " + blocks.ElementAt(i).beg.ToString("X"+4) + Environment.NewLine; int j = blocks.ElementAt(i).beg; while (j < blocks.ElementAt(i).end) { string tmp_asm = cpu.instruction_str((UInt16)j); if (cpu.ist_length(mem[j]) == 3) { string[] splited = tmp_asm.Split(' '); UInt16 lbladdr = 0; if (splited[0] == "LXI") { splited[0] = splited[0] + " " + splited[1]; lbladdr = (UInt16)(int.Parse(splited[2], System.Globalization.NumberStyles.HexNumber)); } else { lbladdr = (UInt16)(int.Parse(splited[1], System.Globalization.NumberStyles.HexNumber)); } int element = -1; for (int k = 0; k < labels.Count; k++) { if (labels.ElementAt(k).addr == lbladdr) { element = k; break; } } if (element == -1) { int lblnum = ++numoflbls; prog_LABEL _LABEL; _LABEL.addr = lbladdr; _LABEL.number = lblnum; labels.Add(_LABEL); tmp_asm = splited[0] + " _LABEL" + lblnum; } else { tmp_asm = splited[0] + " _LABEL" + labels.ElementAt(element); } } string tmp_lbl = ""; /* * for (int k = 0; k < labels.Count; k++) * { * if (labels.ElementAt(k).addr == j) * { * tmp_lbl = "_LABEL" + labels.ElementAt(k).number + ": ";//j.ToString("X" + 4) + ": "; * break; * } * } */ string_addr string_Addr; string_Addr.STR = tmp_lbl + tmp_asm + Environment.NewLine; string_Addr.addr = (UInt16)j; lines.Add(string_Addr); j += cpu.ist_length(mem[j]); } } textBox1.Text = ""; for (int iter = 0; iter < lines.Count; iter++) { string tmp = ""; for (int k = 0; k < labels.Count; k++) { if (labels.ElementAt(k).addr == lines.ElementAt(iter).addr) { tmp = "_LABEL" + labels.ElementAt(k).number + ": ";//j.ToString("X" + 4) + ": "; labels.RemoveAt(k); break; } } textBox1.Text += tmp + lines.ElementAt(iter).STR; } for (int k = 0; k < labels.Count; k++) { textBox1.Text += ";Ошибочная метка __LABEL" + labels.ElementAt(k).number + " ссылается по адресу 0x" + labels.ElementAt(k).addr.ToString("X4") + " со значением 0x" + mem[labels.ElementAt(k).addr].ToString("X2") + Environment.NewLine; } }