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