uint build_destination(out string dest, byte size, byte dstmod, byte dstreg, long addr, long offset, BinaryReader br)
{
uint ilen = 0;
byte ch3, ch4, ch5, ch6, ch7, ch8;
long disp;
string vari = string.Empty;
dest = string.Empty;
trgdata = 0L;
switch (dstmod)
{
case 0x00:
//sprintf(dest,"D%u\0",dstreg);
dest = "D" + Convert.ToInt16(dstreg).ToString();
break;
case 0x01:
//sprintf(dest,"A%u\0",dstreg);
// sprintf(dest,"A%u\0",dstreg);
dest = "A" + Convert.ToInt16(dstreg).ToString();
break;
case 0x02:
//sprintf(dest,"(A%u)\0",dstreg);
dest = "(A" + Convert.ToInt16(dstreg).ToString() + ")";
break;
case 0x03:
//sprintf(dest,"(A%u)+\0",dstreg);
dest = "(" + Convert.ToInt16(dstreg).ToString() + ")+";
break;
case 0x04:
//sprintf(dest,"-(A%u)\0",dstreg);
dest = "-(A" + Convert.ToInt16(dstreg).ToString() + ")";
break;
case 0x05:
ch3 = br.ReadByte();
ch4 = br.ReadByte();
trgdata = (long)ch3 * 256 + ch4;
if (find_symbol(out vari, trgdata + (long)A_reg.GetValue(dstreg)) == 1)
{
// sprintf(dest,"(%s)\0",vari);
dest = "(" + vari + ")";
ilen++;
}
else
{
//sprintf(dest,"(#%04lX,A%u)\0",trgdata,dstreg); ilen++;
dest = "(#" + trgdata.ToString("X4") + ",A" + Convert.ToInt16(dstreg).ToString() + ")";
ilen++;
}
break;
case 0x06:
ch3 = br.ReadByte(); ch4 = br.ReadByte(); ilen++;
if ((ch3 & 1) == 1) // Base Displacement
{
if ((ch4 & 0x30) == 0x30) // BD size = 11, long word
{
ch5 = br.ReadByte(); ch6 = br.ReadByte(); ch7 = br.ReadByte(); ch8 = br.ReadByte();
trgdata = (long)ch5 * 16777216L + (long)ch6 * 65536L + (long)ch7 * 256 + ch8;
if (find_symbol(out vari, trgdata) == 1)
{
// DEBUG: printf("\nwithin SRAM!\n");
char ichar1 = ((ch3 & 0x80) == 0x80 ? 'A' : 'D');
int itemp1 = ((ch3 & 0x70) >> 4);
int itemp2 = 1 << ((ch3 & 6) >> 1);
//sprintf(dest,"(%s+%c%u*%u)\0",vari,((ch3&0x80)==0x80?'A':'D'),((ch3&0x70)>>4),1<<((ch3&6)>>1));
dest = "(" + vari + "+" + ichar1 + itemp1.ToString() + "*" + itemp2.ToString();
ilen += 2;
destaddr = trgdata;
}
else
{
//sprintf(dest,"(%08lX + ...).L\0",trgdata);
dest = "(" + trgdata.ToString("X8") + " + ...).L";
ilen += 2;
}
}
else if ((ch4 & 0x30) == 0x20) // BD size = 10, word
{
ch5 = br.ReadByte(); ch6 = br.ReadByte();
trgdata = (long)ch5 * 256 + ch6;
//sprintf(dest,"(%04lX + ...).W\0",trgdata); ilen++;
dest = "(" + trgdata.ToString("X4") + " + ...).W";
ilen++;
}
else if ((ch4 & 0x30) == 0x10) // BD size = 01, null
{
//sprintf(dest,"(%04lX + ...).W\0",trgdata);
dest = "(" + trgdata.ToString("X4") + " + ...).W";
}
}
else // single word extension (d8,An,Xn.SIZE*SCALE)
{
char ichar1 = ((ch3 & 0x80) == 0x80 ? 'A' : 'D');
int itemp1 = ((ch3 & 0x70) >> 4);
char ichar2 = ((ch3 & 0x08) == 0x08 ? 'L' : 'W');
int itemp2 = 1 << ((ch3 & 6) >> 1);
//sprintf(dest,"(%02X,A%u,%c%u.%c*%u)\0",ch4,dstreg,((ch3&0x80)==0x80?'A':'D'),((ch3&0x70)>>4),((ch3&0x08)==0x08?'L':'W'),1<<((ch3&6)>>1));
dest = "(" + ch4.ToString("X2") + ",A" + Convert.ToInt16(dstreg).ToString() + "," + ichar1 + itemp1.ToString() + "." + ichar2 + "*" + itemp2.ToString() + ")";
}
break;
case 0x07:
switch (dstreg)
{
case 0x00:
ch3 = br.ReadByte(); ch4 = br.ReadByte();
trgdata = (long)ch3 * 256 + ch4;
//sprintf(dest,"(%04lX).W\0",trgdata);
dest = "(" + trgdata.ToString("X4") + ").W";
ilen++;
break;
case 0x01:
ch3 = br.ReadByte(); ch4 = br.ReadByte(); ch5 = br.ReadByte(); ch6 = br.ReadByte();
trgdata = (long)ch3 * 16777216L + (long)ch4 * 65536L + (long)ch5 * 256 + ch6;
if (find_symbol(out vari, trgdata) == 1)
{
//sprintf(dest,"(%s)\0",vari);
dest = "(" + vari + ")";
ilen += 2;
destaddr = trgdata;
}
else
{
//sprintf(dest,"(%08lX).L\0",trgdata);
dest = "(" + trgdata.ToString("X8") + ").L";
ilen += 2;
}
break;
case 0x02:
ch3 = br.ReadByte(); ch4 = br.ReadByte();
disp = (long)ch4;
disp += (long)(ch3) << 8;
if ((disp & 0x8000) == 0) disp = (0x00007FFF & disp);
else disp = (0xFFFF8000 | disp);
trgdata = addr + disp + 2 + offset;
// sprintf(dest,"(%08lX)\0",trgdata);
dest = "(" + trgdata.ToString("X8") + ")";
ilen++;
break;
case 0x03:
ch3 = br.ReadByte(); ch4 = br.ReadByte(); ilen++;
if ((ch3 & 1) == 1) // Base Displacement
{
if ((ch4 & 0xc0) == 0) // Supress BS & IS
{
}
else if ((ch4 & 0xc0) == 0x70) // Supress Index Operand
{
}
else if ((ch4 & 0xc0) == 0x80) // Suppress Base Register
{
}
else if ((ch4 & 0xc0) == 0xc0) // BS & IS active
{
}
}
else // (d8,PC,Xn.SIZE*SCALE)
{
disp = (long)ch4;
if ((disp & 0x80) == 0) disp = (0x0000007F & disp);
else disp = (0xFFFFFF80 | disp);
trgdata = addr + disp + 2 + offset;
int itemp1 = (ch3 & 70) >> 4;
int itemp2 = 1 << ((ch3 & 6) >> 1);
char ichar1 = ((ch3 & 0x80) == 0x80 ? 'A' : 'D');
char ichar2 = ((ch3 & 0x08) == 0x08 ? 'L' : 'W');
//sprintf(dest,"%08lX(PC,%c%u.%c*%u)\0",trgdata,((ch3&0x80)==0x80?'A':'D'),(ch3&70)>>4,((ch3&0x08)==0x08?'L':'W'),1<<((ch3&6)>>1));
dest = trgdata.ToString("X8") + "(PC," + ichar1 + itemp1.ToString() + "." + ichar2 + "*" + itemp2.ToString() + ")";
}
break;
}
break;
}
return (ilen);
}