unsafe uint build_displacement(long* trgaddr, long addr, long offset, byte ch2, BinaryReader br)
{
uint ilen = 0;
byte ch3, ch4, ch5, ch6;
long trgdata = 0;
long disp = 0;
if ((ch2 > 0) && (ch2 < 0xff))
{
disp = (long)ch2;
if ((disp & 0x80) == 0) disp = (0x0000007F & disp);
else disp = (0xFFFFFF80 | disp);
}
else if (ch2 == 0)
{
ch3 = br.ReadByte(); ch4 = br.ReadByte();
disp = (long)ch4;
disp += (long)(ch3) << 8;
if ((disp & 0x8000) == 0) disp = (0x00007FFF & disp);
else disp = (0xFFFF8000 | disp);
ilen++;
}
else if (ch2 == 0xff)
{
ch3 = br.ReadByte(); ch4 = br.ReadByte(); ch5 = br.ReadByte(); ch6 = br.ReadByte();
disp = (long)ch6;
disp += (long)(ch5) << 8;
disp += (long)(ch4) << 16;
disp += (long)(ch3) << 24;
if ((disp & 0x8000000) == 0) disp = (0x7FFFFFFF & disp);
else disp = (0x80000000 | disp);
ilen += 2;
}
*trgaddr = addr + disp + 2 + offset;
return (ilen);
}