T8SuitePro.Disassembler.DisassembleFileRtf C# (CSharp) Méthode

DisassembleFileRtf() public méthode

public DisassembleFileRtf ( string inputfile, string outputfile, long endaddress, CommonSuite.SymbolCollection symbols ) : bool
inputfile string
outputfile string
endaddress long
symbols CommonSuite.SymbolCollection
Résultat bool
        public bool DisassembleFileRtf(string inputfile, string outputfile, long endaddress, SymbolCollection symbols)
        {
            uint i, t, seg, adr;
            long addr, endaddr, adrcntr, trgaddr, trgaddr1, trgaddr2, trgaddr3, offaddr;

            byte ch1, ch2, ch3, ch4, ch5, ch6, ch7, ch8, ch9, ch10;
            //byte n1, n2, n3, n4;
            //uint infile = 0, outfile = 0,
            string inname, outname;
            //byte inname[80], outname[80], offsetval[40];
            //byte str[80],cmd[80];
            string str, cmd;
            str = string.Empty;
            for (int temp = 0; temp < 8; temp++)
            {
                A_reg.SetValue(0, temp);
                D_reg.SetValue(0, temp);
            }
            m_symbols = symbols;
            swap = 0;
            addr = offaddr = 0;

            inname = inputfile;
            //infile = 1;
            outname = outputfile;
            //outfile = 1;

            endaddr = endaddress;
            addr = 0;
            /********************* DISASSEMBLY STARTS HERE *********************/
            /* Read all the preceding words first */
            adrcntr = 0L;
            StreamWriter sw = new StreamWriter(outname, false);
            FileStream fsbr = new FileStream(inname, FileMode.Open, FileAccess.Read);
            if (fsbr == null) return false;
            BinaryReader br = new BinaryReader(fsbr);
            if (br == null)
            {
                fsbr.Close();
                sw.Close();
                return false;
            }
            fsbr.Position = addr;
            adrcntr = addr;

            // start rtf file.
            sw.Write(@"{\rtf1\ansi\ansicpg1252\deff0\deflang1043{\fonttbl{\f0\fswiss\fcharset0 Courier new;}}{\colortbl ;\red255\green0\blue0;\red0\green128\blue0;\red0\green0\blue255;}{\*\generator Msftedit 5.41.15.1507;}\viewkind4\uc1\pard\lang1033\f0\fs20 ");

            /* Parse starting from address addr */
            bool issub = false;
            bool isjump = false;
            bool endsub = false;
            while (addr <= endaddr)
            {
                try
                {
                    ch1 = br.ReadByte();
                    ch2 = br.ReadByte();
                    i = (uint)((ch1 << 8) + ch2);
                    seg = (uint)(((addr + offaddr) & 0xffff0000) >> 16);
                    adr = (uint)(((addr + offaddr) & 0xffff));
                    t = disasm(out str, addr, ch1, ch2, offaddr, br, out endsub, out issub, out isjump);
                    if (t > 5) t = 5;
                    string myline = string.Empty;
                    switch (t)
                    {
                        case 0:
                        case 1:
                            //sw.WriteLine(seg.ToString("X4")  + adr.ToString("X4") + ": " + i.ToString("X4") + "\t\t\t\t" + str);
                            myline = seg.ToString("X4") + adr.ToString("X4") + ": " + i.ToString("X4") + "\t\t\t\t" + str;
                            addr += 2L;
                            break;
                        case 2:
                            fsbr.Position = addr + 2L;
                            ch3 = br.ReadByte();
                            ch4 = br.ReadByte();
                            trgaddr = (long)ch3 * 256 + ch4;
                            //sw.WriteLine(seg.ToString("X4") + adr.ToString("X4") + ": " + i.ToString("X4") + " " + trgaddr.ToString("X4") + "\t\t\t" + str);
                            myline = seg.ToString("X4") + adr.ToString("X4") + ": " + i.ToString("X4") + " " + trgaddr.ToString("X4") + "\t\t\t" + str;
                            addr += 4L;
                            break;
                        case 3:
                            fsbr.Position = addr + 2L;
                            ch3 = br.ReadByte();
                            ch4 = br.ReadByte();
                            ch5 = br.ReadByte();
                            ch6 = br.ReadByte();
                            trgaddr = (long)ch3 * 256 + ch4;
                            trgaddr1 = (long)ch5 * 256 + ch6;
                            //sw.WriteLine(seg.ToString("X4")  + adr.ToString("X4") + ": " + i.ToString("X4") + " " + trgaddr.ToString("X4") + " " + trgaddr1.ToString("X4") + "\t\t" + str);
                            myline = seg.ToString("X4") + adr.ToString("X4") + ": " + i.ToString("X4") + " " + trgaddr.ToString("X4") + " " + trgaddr1.ToString("X4") + "\t\t" + str;
                            addr += 6L;
                            break;
                        case 4:
                            fsbr.Position = addr + 2L;
                            ch3 = br.ReadByte();
                            ch4 = br.ReadByte();
                            ch5 = br.ReadByte();
                            ch6 = br.ReadByte();
                            ch7 = br.ReadByte();
                            ch8 = br.ReadByte();
                            trgaddr = (long)ch3 * 256 + ch4;
                            trgaddr1 = (long)ch5 * 256 + ch6;
                            trgaddr2 = (long)ch7 * 256 + ch8;
                            //sw.WriteLine(seg.ToString("X4")  + adr.ToString("X4") + ": " + i.ToString("X4") + " " + trgaddr.ToString("X4") + " " + trgaddr1.ToString("X4") + " " + trgaddr2.ToString("X4") + "\t\t" + str);
                            myline = seg.ToString("X4") + adr.ToString("X4") + ": " + i.ToString("X4") + " " + trgaddr.ToString("X4") + " " + trgaddr1.ToString("X4") + " " + trgaddr2.ToString("X4") + "\t\t" + str;
                            addr += 8L;
                            break;
                        case 5:
                            fsbr.Position = addr + 2L;
                            ch3 = br.ReadByte();
                            ch4 = br.ReadByte();
                            ch5 = br.ReadByte();
                            ch6 = br.ReadByte();
                            ch7 = br.ReadByte();
                            ch8 = br.ReadByte();
                            ch9 = br.ReadByte();
                            ch10 = br.ReadByte();
                            trgaddr = (long)ch3 * 256 + ch4;
                            trgaddr1 = (long)ch5 * 256 + ch6;
                            trgaddr2 = (long)ch7 * 256 + ch8;
                            trgaddr3 = (long)ch9 * 256 + ch10;
                            //sw.WriteLine(seg.ToString("X4")  + adr.ToString("X4") + ": " + i.ToString("X4") + " " + trgaddr.ToString("X4") + " " + trgaddr1.ToString("X4") + " " + trgaddr2.ToString("X4") + " " + trgaddr3.ToString("X4") + "\t\t" + str);
                            myline = seg.ToString("X4") + adr.ToString("X4") + ": " + i.ToString("X4") + " " + trgaddr.ToString("X4") + " " + trgaddr1.ToString("X4") + " " + trgaddr2.ToString("X4") + " " + trgaddr3.ToString("X4") + "\t" + str;
                            addr += 10L;
                            break;
                        default:
                            br.Close();
                            fsbr.Close();
                            sw.Close();
                            return false;
                    }
                    sw.WriteLine(myline + @"\par");
                }
                catch (Exception E)
                {
                    logger.Debug(E.Message);
                    addr++;
                }
            }
            sw.Write(@"\lang1043\par}");

            br.Close();
            fsbr.Close();
            sw.Close();
            return true;
        }

Usage Example

Exemple #1
0
 private void showFullDisassemblyToolStripMenuItem_Click(object sender, EventArgs e)
 {
     string outputfile = Path.GetDirectoryName(m_currentfile);
     outputfile = Path.Combine(outputfile, Path.GetFileNameWithoutExtension(m_currentfile) + "_full.asm");
     if (!AssemblerViewerActive(true, outputfile))
     {
         frmProgress progress = new frmProgress();
         progress.Show();
         progress.SetProgress("Start disassembler");
         if (!File.Exists(outputfile))
         {
             progress.SetProgress("Disassembler running...");
             Disassembler dis = new Disassembler();
             dis.DisassembleFileRtf(m_currentfile, outputfile, m_currentfile_size, m_symbols);
             progress.SetProgress("Disassembler done...");
         }
         progress.SetProgress("Loading assembler file");
         StartAssemblerViewer(outputfile, progress);
         progress.Close();
     }
 }