private void LoadLabels(long addr, FileStream fs, BinaryReader br, long offset)
{
//logger.Debug("Load labels from addr: " + addr.ToString("X8"));
MNemonicHelper label = new MNemonicHelper();
MNemonicCollection functionList = new MNemonicCollection();
label.Mnemonic = "Function_" + addr.ToString("X8") + ":";
label.Address = addr;
if (AddressInLabelList(addr))
{
return;
}
_labels.Add(label);
//logger.Debug("Added label: " + label.Mnemonic + " " + label.Address.ToString("X8"));
long offaddr = 0;
if (addr == 0) return;
if (addr > offset)
{
fs.Position = addr - offset;
}
else
{
fs.Position = addr;
}
bool endsub = false;
bool issub = false;
bool isjump = false;
string str;
while (!endsub)
{
byte ch1 = br.ReadByte();
byte ch2 = br.ReadByte();
uint i = (uint)((ch1 << 8) + ch2);
uint seg = (uint)(((addr + offaddr) & 0xffff0000) >> 16);
uint adr = (uint)(((addr + offaddr) & 0xffff));
uint t = disasm(out str, addr, ch1, ch2, offaddr, br, out endsub, out issub, out isjump);
if (str != "")
{
MNemonicHelper mnhelper = new MNemonicHelper();
mnhelper.Mnemonic = str;
mnhelper.Address = addr;
//realAddr = fs.Position + offset;
//mnhelper.Address = realAddr;
functionList.Add(mnhelper);
}
if (t > 5) t = 5;
//addr += t;
switch (t)
{
case 0:
case 1:
addr += 2L;
break;
case 2:
addr += 4L;
break;
case 3:
addr += 6L;
break;
case 4:
addr += 8L;
break;
case 5:
addr += 10L;
break;
}
if (issub)
{
if (trgdata != 0)
{
if (!AddressInLabelList(trgdata))
{
if (trgdata < 0x00100000) // 0x00F00000 == T7
{
long position = fs.Position;
LoadLabels(trgdata, fs, br, 0); //offset
fs.Position = position; // reset to previous position
}
}
}
}
if (endsub)
{
}
}
}