public bool DisassembleFile(string inputfile, SymbolCollection symbols)
{
// recursive method when jsr was found
mnemonics = new MNemonicCollection();
labels = new MNemonicCollection();
findLabels(inputfile);
_passOne = false;
int 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,
uint addoff = 0;
string inname, outname, offsetval;
//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;
//addr = startaddress;
/********************* 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;
// iterate through all functions
// first get all the pointers to work from
func_count = 0;
FileInfo fi = new FileInfo(inputfile);
CastProgressEvent("Starting disassembly", 0, ProgressType.DisassemblingVectors);
long[] vectors = Trionic8File.GetVectorAddresses(inputfile);
for (int vec = 0; vec < vectors.Length; vec++)
{
int percentage = ((vec + 1) * 100) / vectors.Length;
CastProgressEvent("Disassembling vectors", percentage, ProgressType.DisassemblingVectors);
long vector = Convert.ToInt64(vectors.GetValue(vec));
if (vector != 0 && vector < fi.Length)
{
try
{
DisassembleFunction(vector, symbols, fsbr, br, 0);
}
catch (Exception E)
{
logger.Debug("Failed to handle vector: " + E.Message);
}
}
}
CastProgressEvent("Translating vector labels", 0, ProgressType.TranslatingVectors);
//logger.Debug("Translating vector labels");
int lblcount = 0;
string[] names = Trionic8File.GetVectorNames();
foreach (MNemonicHelper label in labels)
{
//logger.Debug("label: " + label.Address.ToString("X8") + " " + label.Mnemonic);
int percentage = (lblcount++ * 100) / labels.Count;
CastProgressEvent("Translating vector labels", percentage, ProgressType.TranslatingVectors);
for (i = 0; i < vectors.Length; i++)
{
if (label.Address == Convert.ToInt64(vectors.GetValue(i)))
{
label.Mnemonic = names[i].Replace(" ","_").ToUpper() + ":";
}
}
}
/*
logger.Debug("Translating known functions");
CastProgressEvent("Translating known functions", 0, ProgressType.TranslatingLabels);
lblcount = 0;
foreach (MNemonicHelper label in labels)
{
int percentage = (lblcount++ * 100) / labels.Count;
CastProgressEvent("Translating known functions", percentage, ProgressType.TranslatingLabels);
foreach (MNemonicHelper mnemonic in mnemonics)
{
if (mnemonic.Mnemonic.Contains("JSR") && mnemonic.Mnemonic.Contains(label.Address.ToString("X8")))
{
mnemonic.Mnemonic = mnemonic.Mnemonic.Replace(label.Address.ToString("X8"), label.Mnemonic.Replace(":", ""));
// break;
}
else if (mnemonic.Mnemonic.Contains("BEQ") && mnemonic.Mnemonic.Contains(label.Address.ToString("X8")))
{
mnemonic.Mnemonic = mnemonic.Mnemonic.Replace(label.Address.ToString("X8"), label.Mnemonic.Replace(":", ""));
}
else if (mnemonic.Mnemonic.Contains("BRA") && mnemonic.Mnemonic.Contains(label.Address.ToString("X8")))
{
mnemonic.Mnemonic = mnemonic.Mnemonic.Replace(label.Address.ToString("X8"), label.Mnemonic.Replace(":", ""));
}
else if (mnemonic.Mnemonic.Contains("BLS") && mnemonic.Mnemonic.Contains(label.Address.ToString("X8")))
{
mnemonic.Mnemonic = mnemonic.Mnemonic.Replace(label.Address.ToString("X8"), label.Mnemonic.Replace(":", ""));
}
else if (mnemonic.Mnemonic.Contains("BNE") && mnemonic.Mnemonic.Contains(label.Address.ToString("X8")))
{
mnemonic.Mnemonic = mnemonic.Mnemonic.Replace(label.Address.ToString("X8"), label.Mnemonic.Replace(":", ""));
}
else if (mnemonic.Mnemonic.Contains("BHI") && mnemonic.Mnemonic.Contains(label.Address.ToString("X8")))
{
mnemonic.Mnemonic = mnemonic.Mnemonic.Replace(label.Address.ToString("X8"), label.Mnemonic.Replace(":", ""));
}
else if (mnemonic.Mnemonic.Contains("BCS") && mnemonic.Mnemonic.Contains(label.Address.ToString("X8")))
{
mnemonic.Mnemonic = mnemonic.Mnemonic.Replace(label.Address.ToString("X8"), label.Mnemonic.Replace(":", ""));
}
else if (mnemonic.Mnemonic.Contains("BCC") && mnemonic.Mnemonic.Contains(label.Address.ToString("X8")))
{
mnemonic.Mnemonic = mnemonic.Mnemonic.Replace(label.Address.ToString("X8"), label.Mnemonic.Replace(":", ""));
}
else if (mnemonic.Mnemonic.Contains("BGE") && mnemonic.Mnemonic.Contains(label.Address.ToString("X8")))
{
mnemonic.Mnemonic = mnemonic.Mnemonic.Replace(label.Address.ToString("X8"), label.Mnemonic.Replace(":", ""));
}
else if (mnemonic.Mnemonic.Contains("BLT") && mnemonic.Mnemonic.Contains(label.Address.ToString("X8")))
{
mnemonic.Mnemonic = mnemonic.Mnemonic.Replace(label.Address.ToString("X8"), label.Mnemonic.Replace(":", ""));
}
else if (mnemonic.Mnemonic.Contains("BGT") && mnemonic.Mnemonic.Contains(label.Address.ToString("X8")))
{
mnemonic.Mnemonic = mnemonic.Mnemonic.Replace(label.Address.ToString("X8"), label.Mnemonic.Replace(":", ""));
}
else if (mnemonic.Mnemonic.Contains("BLE") && mnemonic.Mnemonic.Contains(label.Address.ToString("X8")))
{
mnemonic.Mnemonic = mnemonic.Mnemonic.Replace(label.Address.ToString("X8"), label.Mnemonic.Replace(":", ""));
}
}
}*/
CastProgressEvent("Adding labels", 0, ProgressType.AddingLabels);
//logger.Debug("Adding labels");
lblcount = 0;
foreach (MNemonicHelper label in labels)
{
int percentage = (lblcount++ * 100) / labels.Count;
CastProgressEvent("Adding labels", percentage, ProgressType.AddingLabels);
label.Address--; // for sequencing
mnemonics.Add(label);
}
//logger.Debug("Sorting data");
CastProgressEvent("Sorting mnemonics", 0, ProgressType.SortingData);
mnemonics.SortColumn = "Address";
mnemonics.SortingOrder = GenericComparer.SortOrder.Ascending;
mnemonics.Sort();
CastProgressEvent("Sorting mnemonics", 100, ProgressType.SortingData);
return true;
}