Exemple #1
0
        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 = "";
                }
            }
        }
Exemple #2
0
        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;
            }
        }