uint build_source(out string sour, uint size, byte srcmod, byte srcreg, long addr, long offset, BinaryReader br)
{
uint ilen = 0;
byte ch3, ch4, ch5, ch6, ch7, ch8;
long trgdata = 0;
long disp;
string vari = string.Empty;
sour = string.Empty;
switch ((int)srcmod)
{
case 0x00:
sour = "D" + Convert.ToInt16(srcreg).ToString();
break;
case 0x01:
sour = "A" + Convert.ToInt16(srcreg).ToString();
break;
case 0x02:
sour = "(A" + Convert.ToInt16(srcreg).ToString() + ")";
break;
case 0x03:
sour = "(A" + Convert.ToInt16(srcreg).ToString() + ")+";
break;
case 0x04:
sour = "-(A" + Convert.ToInt16(srcreg).ToString() + ")";
break;
case 0x05:
ch3 = br.ReadByte();
ch4 = br.ReadByte();
trgdata = (long)ch3 * 256 + ch4;
sour = "(#" + trgdata.ToString("X4") + ",A" + Convert.ToInt16(srcreg).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");
//sprintf(sour,"(%s+%c%u*%u)\0",vari,((ch3&0x80)==0x80?'A':'D'),,;
int itemp1 = ((ch3 & 0x70) >> 4);
int itemp2 = 1 << ((ch3 & 6) >> 1);
sour = "(" + vari + "+" + ((ch3 & 0x80) == 0x80 ? 'A' : 'D') + itemp1.ToString() + "*" + itemp2.ToString() + ")";
ilen += 2;
souraddr = trgdata;
}
else
{
//sprintf(sour,"(%08lX + ...).L\0",trgdata);
sour = "(" + 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(sour,"(%04lX + ...).W\0",trgdata);
sour = "(" + trgdata.ToString("X4") + " + ...).W";
ilen++;
}
else if ((ch4 & 0x30) == 0x10) // BD size = 01, null
{
//sprintf(sour,"(%04lX + ...).W\0",trgdata);
sour = "(" + trgdata.ToString("X4") + " + ...).W";
}
}
else // single word extension (d8,An,Xn.SIZE*SCALE)
{
//sprintf(sour,"(%02X,A%u,%c%u.%c*%u)\0",ch4,srcreg,((ch3&0x80)==0x80?'A':'D'),((ch3&0x70)>>4),((ch3&0x08)==0x08?'L':'W'),1<<((ch3&6)>>1));
int itemp1 = ((ch3 & 0x70) >> 4);
int itemp2 = 1 << ((ch3 & 6) >> 1);
char byte1 = ((ch3 & 0x80) == 0x80 ? 'A' : 'D');
char byte2 = ((ch3 & 0x08) == 0x08 ? 'L' : 'W');
sour = "(" + ch4.ToString("X2") + ",A" + Convert.ToInt16(srcreg).ToString() + "," + byte1 + itemp1.ToString() + "." + byte2 + "*" + itemp2.ToString();
}
break;
case 0x07:
switch (srcreg)
{
case 0x00: // (xxx).W
ch3 = br.ReadByte();
ch4 = br.ReadByte();
trgdata = (long)ch3 * 256 + ch4;
//sprintf(sour,"(%04lX).W\0",trgdata); ilen++;
sour = "(" + trgdata.ToString("X4") + ").W";
break;
case 0x01: // (xxx).L
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)
{
// DEBUG: printf("\nwithin SRAM!\n");
//sprintf(sour,"(%s)\0",vari);
sour = "(" + vari + ")";
ilen += 2;
souraddr = trgdata;
}
else
{
//sprintf(sour,"(%08lX).L\0",trgdata);
sour = "(" + trgdata.ToString("X8") + ").L";
ilen += 2;
}
break;
case 0x04: // #(data)
switch (size)
{
case 0x01: // BYTE TYPE
ch3 = br.ReadByte();
ch4 = br.ReadByte();
//sprintf(sour,"#%02X\0",ch4);
sour = "#" + ch4.ToString("X2");
ilen++;
break;
case 0x03: // WORD TYPE
ch3 = br.ReadByte();
ch4 = br.ReadByte();
trgdata = (long)ch3 * 256 + ch4;
//sprintf(sour,"#%04lX\0",trgdata);
sour = "#" + trgdata.ToString("X4");
ilen++;
break;
case 0x02: // LONG TYPE
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(sour,"#%s\0",vari);
sour = "#" + vari;
ilen += 2;
souraddr = trgdata;
}
else
{
//sprintf(sour,"#%08lX\0",trgdata);
sour = "#" + trgdata.ToString("X8");
ilen += 2;
}
break;
}
break;
case 0x02: // (d16,PC)
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(sour,"(%08lX)\0",trgdata);
sour = "(" + trgdata.ToString("X8") + ")";
ilen++;
break;
case 0x03: // (bd,PC,Xn)
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 byte1 = ((ch3 & 0x80) == 0x80 ? 'A' : 'D');
char byte2 = ((ch3 & 0x08) == 0x08 ? 'L' : 'W');
//sprintf(sour,"%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));
sour = trgdata.ToString("X8") + "(PC," + byte1 + itemp1.ToString() + "." + byte2 + "*" + itemp2.ToString();
}
break;
}
break;
}
return (ilen);
}