private unsafe uint disasm(out string str, long addr, byte upperbyte, byte lowerbyte, long offset, BinaryReader br, out bool endsub, out bool issub, out bool isjump)
{
endsub = false;
issub = false;
isjump = false;
uint i, ilen; /* word, inst length */
byte ch1, ch2; /* Bytes */
byte ch3, ch4; /* Extra bytes */
byte ch5, ch6; /* Extra bytes */
byte ch7, ch8; /* Extra bytes */
byte n1, n2, n3, n4; /* Nibbles */
long trgaddr; /* Target address */
long trgdata; /* Target data */
long disp; /* Displacement */
string sour;
string dest;
trgdata = 0L;
byte itype, dstreg, dstmod, srcmod, srcreg;
string[] movesize = { "", "B", "L", "W" };
string[] opsize = { "B", "W", "L", "" };
string[] ctregs = { "SFC", "DFC", "USP", "VBR" };
string[] ccodes = { "T", "F", "HI", "LS", "CC", "CS", "NE", "EQ", "VC", "VS", "PL", "MI", "GE", "LT", "GT", "LE" };
uint err;
str = string.Empty;
err = 0; ilen = 0;
ch1 = upperbyte;
ch2 = lowerbyte;
i = (uint)(ch1 << 8) + ch2;
n1 = (byte)((ch1 & 0xf0) >> 4);
n2 = (byte)((ch1 & 15));
n3 = (byte)((ch2 & 0xf0) >> 4);
n4 = (byte)((ch2 & 15));
itype = n1;
dstreg = (byte)((n2 >> 1) & 0x07);
dstmod = (byte)((i >> 6) & 0x07);
srcmod = (byte)((ch2 & 0x38) >> 3);
srcreg = (byte)(n4 & 0x07);
switch (itype)
{
/* Instruction type 00 */
case 0x00:
if (i == 0x003c)
{
ilen += build_source(out sour, 1, 7, 4, addr, offset, br);
str = "ORI\t" + sour + ",CCR";
ilen++;
}
else if (i == 0x007c)
{
ilen += build_source(out sour, 3, 7, 4, addr, offset, br);
str = "ORI\t" + sour + ",SR";
ilen++;
}
else if (dstreg == 0 && dstmod <= 2)
{
ilen += build_source(out sour, mapsize((byte)(dstmod & 3)), 7, 4, addr, offset, br);
ilen += build_destination(out dest, 0, srcmod, srcreg, addr, offset, br);
str = "ORI." + (string)opsize.GetValue(dstmod & 3) + "\t" + sour + "," + dest;
ilen++;
}
else if (dstmod == 3 && dstreg <= 2)
{
ch3 = br.ReadByte();
ch4 = br.ReadByte();
ilen++;
ilen += build_destination(out sour, 0, srcmod, srcreg, addr, offset, br);
err = (uint)((ch3 << 8) + ch4);
if ((err & 0x0800) == 0)
{
int i2 = ((ch3 & 0x70) >> 4);
str = "CMP2." + sour + "\t" + (string)opsize.GetValue(dstreg & 3) + ((ch3 & 0x80) == 0x80 ? 'D' : 'A') + i2.ToString();
ilen++;
}
else
{
int i2 = ((ch3 & 0x70) >> 4);
str = "CHK2." + sour + "\t" + (string)opsize.GetValue(dstreg & 3) + ((ch3 & 0x80) == 0x80 ? 'D' : 'A') + i2.ToString();
ilen++;
}
err = 0;
}
else if (dstmod >= 4 && dstmod <= 7 && srcmod == 1)
{
ch3 = br.ReadByte();
ch4 = br.ReadByte();
ilen++;
err = (uint)((ch3 << 8) + ch4);
if ((dstmod & 2) == 2)
{
str = "MOVEP." + (string)opsize.GetValue(dstmod & 3) + "\tD" + Convert.ToInt16(dstreg).ToString() + ",(#," + err.ToString("X4") + ",A" + Convert.ToInt16(srcreg).ToString() + ")";
ilen++;
}
else
{
str = "MOVEP." + (string)opsize.GetValue(dstmod & 3) + "\t(#" + err.ToString("X4") + ",A" + Convert.ToInt16(srcreg).ToString() + "),D" + Convert.ToInt16(dstreg).ToString();
// sprintf(str,"MOVEP.%c\t(#%04X,A%u),D%u\0",opsize[dstmod&3][0],err,srcreg,dstreg);
ilen++;
}
err = 0;
}
else if (dstmod == 4)
{
ilen += build_source(out sour, 1, srcmod, srcreg, addr, offset, br);
//sprintf(str,"BTST\tD%u,%s\0",dstreg,sour);
str = "BTST\tD" + Convert.ToInt16(dstreg).ToString() + "," + sour;
ilen++;
}
else if (dstmod == 5)
{
ilen += build_source(out sour, 1, srcmod, srcreg, addr, offset, br);
//sprintf(str,"BCHG\tD%u,%s\0",dstreg,sour);
str = "BCHG\tD" + Convert.ToInt16(dstreg).ToString() + "," + sour;
ilen++;
}
else if (dstmod == 6)
{
ilen += build_source(out sour, 1, srcmod, srcreg, addr, offset, br);
//sprintf(str,"BCLR\tD%u,%s\0",dstreg,sour);
str = "BCLR\tD" + Convert.ToInt16(dstreg).ToString() + "," + sour;
ilen++;
}
else if (dstmod == 7)
{
ilen += build_source(out sour, 1, srcmod, srcreg, addr, offset, br);
//sprintf(str,"BSET\tD%u,%s\0",dstreg,sour);
str = "BSET\tD" + Convert.ToInt16(dstreg).ToString() + "," + sour;
ilen++;
}
else if (i == 0x023c)
{
ilen += build_source(out sour, 1, 7, 4, addr, offset, br);
//sprintf(str,"ANDI\t%s,CCR\0",sour);
str = "ANDI\t" + sour + ",CCR";
ilen++;
}
else if (i == 0x027c)
{
ilen += build_source(out sour, 3, 7, 4, addr, offset, br);
//sprintf(str,"ANDI\t%s,SR\0",sour);
str = "ANDI\t" + sour + ",SR";
ilen++;
}
else if ((dstreg == 1) && (dstmod <= 2))
{
ilen += build_source(out sour, mapsize((byte)(dstmod & 3)), 7, 4, addr, offset, br);
ilen += build_destination(out dest, 0, srcmod, srcreg, addr, offset, br);
str = "ANDI." + (string)opsize.GetValue(dstmod & 3) + "\t" + sour + "," + dest;
ilen++;
}
else if ((dstreg == 2) && (dstmod <= 2))
{
ilen += build_source(out sour, mapsize((byte)(dstmod & 3)), 7, 4, addr, offset, br);
ilen += build_destination(out dest, 0, srcmod, srcreg, addr, offset, br);
//sprintf(str,"SUBI.%c\t%s,%s\0",opsize[dstmod&3][0],sour,dest);
str = "SUBI." + (string)opsize.GetValue(dstmod & 3) + "\t" + sour + "," + dest;
ilen++;
}
else if ((dstreg == 3) && (dstmod <= 2))
{
ilen += build_source(out sour, mapsize((byte)(dstmod & 3)), 7, 4, addr, offset, br);
ilen += build_destination(out dest, 0, srcmod, srcreg, addr, offset, br);
// sprintf(str, "ADDI.%c\t%s,%s\0", opsize[dstmod & 3][0], sour, dest);
str = "ADDI." + (string)opsize.GetValue(dstmod & 3) + "\t" + sour + "," + dest;
ilen++;
}
else if ((dstreg == 4) && (dstmod == 0))
{
ilen += build_source(out sour, 1, 7, 4, addr, offset, br);
ilen += build_destination(out dest, 0, srcmod, srcreg, addr, offset, br);
//sprintf(str, "BTST\t%s,%s\0", sour, dest);
str = "BTST\t" + sour + "," + dest;
ilen++;
}
else if ((dstreg == 4) && (dstmod == 1))
{
ilen += build_source(out sour, 1, 7, 4, addr, offset, br);
ilen += build_destination(out dest, 0, srcmod, srcreg, addr, offset, br);
//sprintf(str, "BCHG\t%s,%s\0", sour, dest);
str = "BCHG\t" + sour + "," + dest;
ilen++;
}
else if ((dstreg == 4) && (dstmod == 2))
{
ilen += build_source(out sour, 1, 7, 4, addr, offset, br);
ilen += build_destination(out dest, 0, srcmod, srcreg, addr, offset, br);
//sprintf(str, "BCLR\t%s,%s\0", sour, dest);
str = "BCLR\t" + sour + "," + dest;
ilen++;
}
else if ((dstreg == 4) && (dstmod == 3))
{
ilen += build_source(out sour, 1, 7, 4, addr, offset, br);
ilen += build_destination(out dest, 0, srcmod, srcreg, addr, offset, br);
// sprintf(str, "BSET\t%s,%s\0", sour, dest);
str = "BSET\t" + sour + "," + dest;
ilen++;
}
else if (i == 0x0a3c)
{
ilen += build_source(out sour, 1, 7, 4, addr, offset, br);
//sprintf(str, "EORI\t%s,CCR\0", sour);
str = "EORI\t" + sour + ",CCR";
ilen++;
}
else if (i == 0x0a7c)
{
ilen += build_source(out sour, 3, 7, 4, addr, offset, br);
//sprintf(str, "EORI\t%s,SR\0", sour);
str = "EORI\t" + sour + ",SR";
ilen++;
}
else if ((dstreg == 5) && (dstmod <= 2))
{
ilen += build_source(out sour, mapsize((byte)(dstmod & 3)), 7, 4, addr, offset, br);
ilen += build_destination(out dest, 0, srcmod, srcreg, addr, offset, br);
//sprintf(str, "EORI.%c\t%s,%s\0", opsize[dstmod & 3][0], sour, dest);
str = "EORI." + (string)opsize.GetValue(dstmod & 3) + "\t" + sour + "," + dest;
ilen++;
}
else if ((dstreg == 6) && (dstmod <= 2))
{
ilen += build_source(out sour, mapsize((byte)(dstmod & 3)), 7, 4, addr, offset, br);
ilen += build_destination(out dest, 0, srcmod, srcreg, addr, offset, br);
//sprintf(str, "CMPI.%c\t%s,%s\0", opsize[dstmod & 3][0], sour, dest); ilen++;
str = "CMPI." + (string)opsize.GetValue(dstmod & 3) + "\t" + sour + "," + dest;
ilen++;
}
else if ((dstreg == 7) && (dstmod <= 2))
{
ch3 = br.ReadByte(); ch4 = br.ReadByte();
ilen++;
ilen += build_destination(out dest, 0, srcmod, srcreg, addr, offset, br);
err = (uint)((ch3 << 8) + ch4);
if ((err & 0x0800) == 0x0800)
{
//((ch3 & 0x80) == 0x80 ? 'A' : 'D');
char ichar1 = ((ch3 & 0x80) > 0 ? 'D' : 'A');
int itemp1 = ((ch3 & 0x70) >> 4);
//sprintf(str, "MOVES.%c\t%c%u,%s\0", opsize[dstreg & 3][0], (ch3 && 0x80 ? 'D' : 'A'), ((ch3 & 0x70) >> 4), &ctregs[err][0]);
str = "MOVES." + (string)opsize.GetValue(dstmod & 3) + "\t" + ichar1 + itemp1.ToString() + "," + (string)ctregs.GetValue(err);
ilen++;
}
else
{
char ichar1 = ((ch3 & 0x80) > 0 ? 'D' : 'A');
int itemp1 = ((ch3 & 0x70) >> 4);
///sprintf(str, "MOVES.%c\t%s,%c%u\0", opsize[dstreg & 3][0], &ctregs[err][0], (ch3 && 0x80 ? 'D' : 'A'), ((ch3 & 0x70) >> 4));
str = "MOVES." + (string)opsize.GetValue(dstmod & 3) + "\t" + (string)ctregs.GetValue(err) + "," + ichar1 + itemp1.ToString();
ilen++;
}
err = 0;
}
break;
/* Instruction types 01 - 03 */
case 0x01:
case 0x02:
case 0x03:
souraddr = 0L;
ilen += build_source(out sour, itype, srcmod, srcreg, addr, offset, br);
ilen += build_destination(out dest, itype, dstmod, dstreg, addr, offset, br);
switch (dstmod)
{
case 0x01:
//sprintf(str, "MOVEA.%c\t%s,%s\0", movesize[itype][0], sour, dest);
str = "MOVEA." + (string)movesize.GetValue(itype) + "\t" + sour + "," + dest;
ilen++;
if (souraddr != 0) A_reg.SetValue(souraddr, dstreg);
else if (srcmod == 1) A_reg.SetValue((long)A_reg.GetValue(srcreg), dstreg);
break;
default:
///sprintf(str,"MOVE.%c\t%s,%s\0",movesize[itype][0],sour,dest);
str = "MOVE." + (string)movesize.GetValue(itype) + "\t" + sour + "," + dest;
ilen++;
break;
}
break;
// Instruction type 04
case 0x04:
switch (i)
{
case 0x4afa:
//sprintf(str,"BGND\0");
str = "BGND";
ilen++;
break;
case 0x4afc:
//sprintf(str,"ILLEGAL\0");
str = "ILLEGAL";
ilen++;
break;
case 0x4e70:
//sprintf(str,"RESET\0");
str = "RESET";
ilen++;
break;
case 0x4e71:
//sprintf(str,"NOP\0");
str = "NOP";
ilen++;
break;
case 0x4e72:
ilen += build_source(out sour, 3, 7, 4, addr, offset, br);
//sprintf(str,"STOP\t%s",sour);
endsub = true;
str = "STOP\t" + sour;
ilen++;
break;
case 0x4e73:
//sprintf(str,"RTE\n\n\n\0");
endsub = true;
str = "RTE\n\n\n";
ilen++;
break;
case 0x4e74:
ch3 = br.ReadByte(); ch4 = br.ReadByte();
ilen++;
err = (uint)(ch3 << 8) + ch4;
//sprintf(str,"RTD\t#%04X\0",err);
endsub = true;
str = "RTD\t#" + err.ToString("X4");
ilen++;
break;
case 0x4e75:
//sprintf(str,"RTS\n\n\n\0");
endsub = true;
str = "RTS\n\n\n";
ilen++;
break;
case 0x4e76:
//sprintf(str,"TRAPV\0");
str = "TRAPV";
ilen++;
break;
case 0x4e77:
//sprintf(str,"RTR\0");
endsub = true;
str = "RTR";
ilen++;
break;
case 0x4e7a:
case 0x4e7b:
ch3 = br.ReadByte(); ch4 = br.ReadByte();
ilen++;
err = (uint)(ch3 << 8) + ch4;
err = err & 0x8FF;
if ((err & 0x800) == 0x800) err = err | 2;
err = err & 3;
if ((i & 1) == 1)
{
char char1 = ((ch3 & 0x80) > 0 ? 'D' : 'A');
int temp1 = ((ch3 & 0x70) >> 4);
//sprintf(str,"MOVEC\t%c%u,%s\0",(ch3&&0x80?'D':'A'),((ch3 & 0x70) >> 4),&ctregs[err][0]);
str = "MOVEC\t" + char1 + temp1.ToString() + "," + (string)ctregs.GetValue(err);
ilen++;
}
else
{
char char1 = ((ch3 & 0x80) > 0 ? 'D' : 'A');
int temp1 = ((ch3 & 0x70) >> 4);
//sprintf(str,"MOVEC\t%s,%c%u\0",&ctregs[err][0],(ch3&&0x80?'D':'A'),((ch3 & 0x70)>>4));
str = "MOVEC\t" + (string)ctregs.GetValue(err) + "," + char1 + temp1.ToString();
ilen++;
}
err = 0;
break;
}
if (dstreg == 0 && dstmod <= 2)
{
ilen += build_destination(out dest, 0, srcmod, srcreg, addr, offset, br);
//sprintf(str,"NEGX.%c\t%s\0",opsize[dstmod&7][0],dest);
str = "NEGX." + (string)opsize.GetValue(dstmod & 7) + "\t" + dest;
ilen++;
}
else if (dstreg == 0 && dstmod == 3)
{
ilen += build_destination(out dest, 0, srcmod, srcreg, addr, offset, br);
//sprintf(str,"MOVE\tSR,%s\0",dest);
str = "MOVE\tSR," + dest;
ilen++;
}
else if (dstmod == 4 || dstmod == 6)
{
ilen += build_destination(out dest, 0, srcmod, srcreg, addr, offset, br);
char char1 = ((dstmod & 0x20) > 0 ? 'L' : 'W');
//sprintf(str,"CHK.%c\t%s,D%u\0",(dstmod&&0x20?'L':'W'),dest,dstreg);
str = "CHK." + char1 + "\t" + dest + ",D" + dstreg.ToString();
ilen++;
}
else if (dstmod == 7)
{
ilen += build_destination(out dest, 0, srcmod, srcreg, addr, offset, br);
//sprintf(str,"LEA\t%s,A%u\0",dest,dstreg);
str = "LEA\t" + dest + ",A" + dstreg.ToString();
ilen++;
}
else if (dstreg == 1 && dstmod <= 2)
{
ilen += build_destination(out dest, 0, srcmod, srcreg, addr, offset, br);
//sprintf(str,"CLR.%c\t%s\0",opsize[dstmod&7][0],dest);
str = "CLR." + (string)opsize.GetValue(dstmod & 7) + "\t" + dest;
ilen++;
}
else if (dstreg == 3 && dstmod == 3)
{
ilen += build_destination(out dest, 0, srcmod, srcreg, addr, offset, br);
//sprintf(str,"MOVE\t%s,SR\0",dest);
str = "MOVE\t" + dest + ",SR";
ilen++;
}
else if (dstreg == 1 && dstmod == 3)
{
ilen += build_destination(out dest, 0, srcmod, srcreg, addr, offset, br);
//sprintf(str,"MOVE\t CCR,%s\0",dest);
str = "MOVE\t CCR," + dest;
ilen++;
}
else if (dstreg == 2 && dstmod <= 2)
{
ilen += build_destination(out dest, 0, srcmod, srcreg, addr, offset, br);
//sprintf(str,"NEG.%c\t%s\0",opsize[dstmod&7][0],dest);
str = "NEG." + (string)opsize.GetValue(dstmod & 7) + "\t" + dest;
ilen++;
}
else if (dstreg == 2 && dstmod == 3)
{
ilen += build_destination(out dest, 0, srcmod, srcreg, addr, offset, br);
//sprintf(str,"MOVE\t %s,CCR\0",dest);
str = "MOVE\t " + dest + ",CCR";
ilen++;
}
else if (dstreg == 3 && dstmod <= 2)
{
ilen += build_destination(out dest, 0, srcmod, srcreg, addr, offset, br);
//sprintf(str,"NOT.%c\t%s\0",opsize[dstmod&7][0],dest);
str = "NOT." + (string)opsize.GetValue(dstmod & 7) + "\t" + dest;
ilen++;
}
else if (dstreg == 4 && dstmod == 0)
{
ilen += build_destination(out dest, 0, srcmod, srcreg, addr, offset, br);
//sprintf(str,"NBCD\t%s\0",dest);
str = "NBCD\t" + dest;
ilen++;
}
else if (dstreg == 4 && dstmod == 0 && srcmod == 1)
{
ilen += build_source(out sour, 2, 7, 4, addr, offset, br);
//sprintf(str,"LINK.L\tA%u,#%s\0",srcreg,sour);
str = "LINK.L\tA" + srcreg.ToString() + ",#" + sour;
ilen++;
}
else if (dstreg == 4 && dstmod == 1 && srcmod == 0)
{
//sprintf(str, "SWAP\tD%u\0", srcreg);
str = "SWAP\tD" + srcreg.ToString();
ilen++;
}
else if (dstreg == 4 && dstmod == 1 && srcmod == 1)
{
//sprintf(str, "BKPT\t#%X\0", srcreg);
str = "BKPT\t#" + srcreg.ToString("X2");
ilen++;
}
else if (dstreg == 4 && dstmod == 1)
{
ilen += build_destination(out dest, 0, srcmod, srcreg, addr, offset, br);
//sprintf(str, "PEA\t%s\0", dest);
str = "PEA\t" + dest;
ilen++;
}
else if (dstreg == 4 && srcmod == 0)
{
switch (dstmod)
{
case 0x02:
//sprintf(str, "EXT.W\tD%u\0", srcreg);
str = "EXT.W\tD" + srcreg.ToString();
ilen++;
break;
case 0x03:
//sprintf(str, "EXT.L\tD%u\0", srcreg);
str = "EXT.L\tD" + srcreg.ToString();
ilen++;
break;
case 0x07:
//sprintf(str, "EXTB.L\tD%u\0", srcreg);
str = "EXTB.L\tD" + srcreg.ToString();
ilen++;
break;
}
}
else if ((dstreg == 4 || dstreg == 6) && (dstmod == 2 || dstmod == 3))
{
ilen += build_source(out sour, 3, 7, 4, addr, offset, br);
ilen += build_destination(out dest, 0, srcmod, srcreg, addr, offset, br);
if (dstreg == 4)
{
//sprintf(str, "MOVEM.%c\t%s,%s\0", opsize[(dstmod & 1) + 1][0], sour, dest);
str = "MOVEM." + (string)opsize.GetValue((dstmod & 1) + 1) + "\t" + sour + "," + dest;
str += "\t;Move Multiple Registers to memory";
ilen++;
}
else
{
//sprintf(str, "MOVEM.%c\t%s,%s\0", opsize[(dstmod & 1) + 1][0], dest, sour);
str = "MOVEM." + (string)opsize.GetValue((dstmod & 1) + 1) + "\t" + dest + "," + sour;
str += "\t;Move Multiple Registers from memory";
ilen++;
}
}
else if (dstreg == 5 && dstmod <= 2)
{
ilen += build_destination(out dest, 0, srcmod, srcreg, addr, offset, br);
//sprintf(str, "TST.%c\t%s\0", opsize[dstmod & 7][0], dest);
str = "TST." + (string)opsize.GetValue(dstmod & 7) + "\t" + dest;
ilen++;
}
else if (dstreg == 5 && dstmod == 3)
{
ilen += build_destination(out dest, 0, srcmod, srcreg, addr, offset, br);
//sprintf(str, "TAS\t%s\0", dest);
str = "TAS\t" + dest;
ilen++;
}
else if (dstreg == 6 && dstmod == 0)
{
ch3 = br.ReadByte(); ch4 = br.ReadByte();
ilen++;
ilen += build_source(out sour, 2, srcmod, srcreg, addr, offset, br);
if ((ch3 & 4) == 4)
{
char char1 = (((ch3 & 0x8) >> 3) == 0 ? 'U' : 'S');
int temp1 = ch4 & 7;
int temp2 = ((ch3 & 0x70) >> 4);
//sprintf(str, "MUL%c.L\t%s,D%u:D%u\0", (((ch3 & 0x8) >> 3) == 0 ? 'U' : 'S'), sour, ch4 & 7, ((ch3 & 0x70) >> 4));
str = "MUL" + char1 + ".L\t" + sour + ",D" + temp1.ToString() + ":D" + temp2.ToString();
ilen++;
}
else
{
char char1 = (((ch3 & 0x8) >> 3) == 0 ? 'U' : 'S');
int temp2 = ((ch3 & 0x70) >> 4);
//sprintf(str, "MUL%c.L\t%s,D%u\0", (((ch3 & 0x8) >> 3) == 0 ? 'U' : 'S'), sour, ((ch3 & 0x70) >> 4));
str = "MUL" + char1 + ".L\t" + sour + ",D" + temp2.ToString();
ilen++;
}
}
else if (dstreg == 6 && dstmod == 1)
{
ch3 = br.ReadByte(); ch4 = br.ReadByte();
ilen++;
ilen += build_source(out sour, 2, srcmod, srcreg, addr, offset, br);
if ((ch3 & 4) == 4)
{
char char1 = (((ch3 & 0x8) >> 3) == 0 ? 'U' : 'S');
int temp1 = ch4 & 7;
int temp2 = ((ch3 & 0x70) >> 4);
//sprintf(str, "DIV%c.L\t%s,D%u:D%u\0", (((ch3 & 0x8) >> 3) == 0 ? 'U' : 'S'), sour, ch4 & 7, ((ch3 & 0x70) >> 4));
str = "DIV" + char1 + ".L\t" + sour + ",D" + temp1.ToString() + ":D" + temp2.ToString();
ilen++;
}
else
{
char char1 = (((ch3 & 0x8) >> 3) == 0 ? 'U' : 'S');
int temp2 = ((ch3 & 0x70) >> 4);
//sprintf(str, "DIV%c.L\t%s,D%u\0", (((ch3 & 0x8) >> 3) == 0 ? 'U' : 'S'), sour, ((ch3 & 0x70) >> 4));
str = "DIV" + char1 + ".L\t" + sour + ",D" + temp2.ToString();
ilen++;
}
}
else if (dstreg == 7 && dstmod == 1 && (srcmod == 0 || srcmod == 1))
{
//sprintf(str, "TRAP\t#%X\0", srcreg);
str = "TRAP\t#" + srcreg.ToString("X2");
ilen++;
}
else if (dstreg == 7 && dstmod == 1 && srcmod == 2)
{
ilen += build_source(out sour, 3, 7, 4, addr, offset, br);
//sprintf(str, "LINK.W\tA%u,#%s\0", srcreg, sour);
str = "LINK.W\tA" + srcreg.ToString() + ",#" + sour;
ilen++;
}
else if (dstreg == 7 && dstmod == 1 && srcmod == 3)
{
//sprintf(str, "UNLK\tA%u\0", srcreg);
str = "UNLK\tA" + srcreg.ToString();
ilen++;
}
else if (dstreg == 7 && dstmod == 1 && srcmod == 4)
{
//sprintf(str, "MOVE\tA%u,USP\0", srcreg);
str = "MOVE\tA" + srcreg.ToString() + ",USP";
ilen++;
}
else if (dstreg == 7 && dstmod == 1 && srcmod == 5)
{
//sprintf(str, "MOVE\tUSP,A%u\0", srcreg);
str = "MOVE\tUSP,A" + srcreg.ToString();
ilen++;
}
else if (dstreg == 7 && dstmod == 2)
{
ilen += build_destination(out dest, 0, srcmod, srcreg, addr, offset, br);
//sprintf(str, "JSR\t%s\0", dest);
isjump = true;
issub = true;
/*if (trgdata == 0xFFF2)
{
logger.Debug("break!");
}*/
str = "JSR\t" + dest;
//logger.Debug(dest);
ilen++;
}
else if (dstreg == 7 && dstmod == 3)
{
ilen += build_destination(out dest, 0, srcmod, srcreg, addr, offset, br);
//sprintf(str, "JMP\t%s\0", dest);
endsub = true; // jump to somewhere else
AddLabel(destaddr);
isjump = true;
//logger.Debug("JUMP SEEND: " + destaddr.ToString("X8"));
str = "JMP\t" + dest;
ilen++;
}
break;
// Instruction type 05
case 0x05:
if (dstmod <= 2)
{
ilen += build_destination(out dest, 0, srcmod, srcreg, addr, offset, br);
if (dstreg == 0) dstreg = 8;
//sprintf(str, "ADDQ.%c\t#%u,%s\0", opsize[dstmod & 3][0], dstreg, dest);
str = "ADDQ." + (string)opsize.GetValue(dstmod & 3) + "\t#" + dstreg.ToString() + "," + dest;
ilen++;
}
else if (((ch2 & 0xF8) == 0xc8) && ((dstmod & 3) == 3))
{
ilen += build_displacement(&trgaddr, addr, offset, 0, br);
//sprintf(str, "DB%s\tD%u,%08lX\0", &ccodes[n2][0], srcreg, trgaddr);
str = "DB" + (string)ccodes.GetValue(n2) + "\tD" + srcreg.ToString() + "," + trgaddr.ToString("X8");
ilen++;
}
else if (((ch2 & 0xf8) == 0xf8) && ((dstmod & 3) == 3))
{
switch (srcreg)
{
case 0x02:
ilen += build_source(out dest, 3, 7, 4, addr, offset, br);
//sprintf(str, "TRAP%s.%c \t%s\0", &ccodes[n2][0], opsize[srcreg & 3][0], dest);
str = "TRAP." + (string)ccodes.GetValue(n2) + "." + (string)opsize.GetValue(srcreg & 3) + "\t" + dest;
ilen++;
break;
case 0x03:
ilen += build_source(out dest, 2, 7, 4, addr, offset, br);
//sprintf(str, "TRAP%s.%c \t%s\0", &ccodes[n2][0], opsize[srcreg & 3][0], dest);
str = "TRAP" + (string)ccodes.GetValue(n2) + "." + (string)opsize.GetValue(srcreg & 3) + "\t" + dest;
ilen++;
break;
case 0x04:
//sprintf(str, "TRAP%s\0", &ccodes[n2][0]);
str = "TRAP" + (string)ccodes.GetValue(n2);
ilen++;
break;
}
}
else if ((dstmod >= 4) && (dstmod <= 6))
{
ilen += build_destination(out dest, 0, srcmod, srcreg, addr, offset, br);
if (dstreg == 0) dstreg = 8;
//sprintf(str, "SUBQ.%c\t#%u,%s\0", opsize[dstmod & 3][0], dstreg, dest);
str = "SUBQ." + (string)opsize.GetValue(dstmod & 3) + "\t#" + dstreg.ToString() + "," + dest;
ilen++;
}
else if ((dstmod & 3) == 3)
{
ilen += build_destination(out dest, 0, srcmod, srcreg, addr, offset, br);
//sprintf(str, "S%s\t%s\0", &ccodes[n2][0], dest);
str = "S" + (string)ccodes.GetValue(n2) + "\t" + dest;
ilen++;
}
break;
// Instruction type 06
case 0x06:
if (n2 == 0)
{
ilen += build_displacement(&trgaddr, addr, offset, ch2, br);
//sprintf(str,"BRA\t%08lX\0",trgaddr);
// add it to the labellist
AddLabel(trgaddr);
isjump = true;
str = "BRA\t" + trgaddr.ToString("X8");
ilen++;
}
else if (n2 == 1)
{
ilen += build_displacement(&trgaddr, addr, offset, ch2, br);
//sprintf(str,"BSR\t%08lX\0",trgaddr);
AddLabel(trgaddr);
isjump = true;
str = "BSR\t" + trgaddr.ToString("X8");
ilen++;
}
else
{
ilen += build_displacement(&trgaddr, addr, offset, ch2, br);
//sprintf(str,"B%s\t%08lX\0",&ccodes[n2][0],trgaddr);
AddLabel(trgaddr);
isjump = true;
str = "B" + (string)ccodes.GetValue(n2) + "\t" + trgaddr.ToString("X8");
ilen++;
}
break;
// Instruction type 07
case 0x07:
//sprintf(str,"MOVEQ\t#%02X,D%u\0",ch2,dstreg);
str = "MOVEQ\t#" + ch2.ToString("X2") + ",D" + dstreg.ToString();
ilen++;
break;
// Instruction type 08
case 0x08:
if ((dstmod >= 0 && dstmod <= 2) || (dstmod >= 4 && dstmod <= 6))
{
if ((dstmod & 4) == 4)
{
ilen += build_destination(out dest, 0, srcmod, srcreg, addr, offset, br);
//sprintf(str,"OR.%c\tD%u,%s\0",opsize[dstmod&3][0],dstreg,dest);
str = "OR." + (string)opsize.GetValue(dstmod & 3) + "\tD" + dstreg.ToString() + "," + dest;
ilen++;
}
else
{
if (dstmod == 3) err = 3;
if (dstmod == 7) err = 2;
ilen += build_source(out dest, err, srcmod, srcreg, addr, offset, br);
if (dstmod == 3) err = 1;
if (dstmod == 7) err = 2;
//sprintf(str,"OR.%c\t%s,D%u\0",opsize[dstmod&3][0],dest,dstreg);
str = "OR." + (string)opsize.GetValue(dstmod & 3) + "\t" + dest + ",D" + dstreg.ToString();
ilen++;
}
}
else if (dstmod == 3)
{
ilen += build_source(out sour, 3, srcmod, srcreg, addr, offset, br);
//sprintf(str,"DIVU.W\t%s,D%u\0",sour,dstreg);
str = "DIVU.W\t" + sour + ",D" + dstreg.ToString();
ilen++;
}
else if (dstmod == 7)
{
ilen += build_source(out sour, 3, srcmod, srcreg, addr, offset, br);
//sprintf(str,"DIVS.W\t%s,D%u\0",sour,dstreg);
str = "DIVS.W\t" + sour + ",D" + dstreg.ToString();
ilen++;
}
else if ((srcmod == 0 || srcmod == 1) && (dstmod == 4))
{
if (srcmod == 0)
{
//sprintf(str,"SBCD.%c\tD%u,D%u\0",opsize[dstmod&3][0],srcreg,dstreg);
str = "SBCD." + (string)opsize.GetValue(dstmod & 3) + "\tD" + srcreg.ToString() + ",D" + dstreg.ToString();
ilen++;
}
else
{
//sprintf(str,"SBCD.%c\t-(A%u),-(A%u)\0",opsize[dstmod&3][0],srcreg,dstreg);
str = "SBCD." + (string)opsize.GetValue(dstmod & 3) + "\t- (A" + srcreg.ToString() + "),-(A" + dstreg.ToString() + ")";
ilen++;
}
}
break;
// Instruction type 09
case 0x09:
if ((dstmod == 3) || (dstmod == 7))
{
if (dstmod == 3) err = 3;
if (dstmod == 7) err = 2;
ilen += build_source(out dest, err, srcmod, srcreg, addr, offset, br);
if (dstmod == 3) err = 1;
if (dstmod == 7) err = 2;
//sprintf(str, "SUBA.%c\t%s,A%u\0", opsize[err][0], dest, dstreg);
str = "SUBA." + (string)opsize.GetValue(err) + "\t" + dest + ",A" + dstreg.ToString();
ilen++;
}
else if ((srcmod == 0 || srcmod == 1) && (dstmod >= 4 && dstmod <= 6))
{
if (srcmod == 0)
{
//sprintf(str, "SUBX.%c\tD%u,D%u\0", opsize[dstmod & 3][0], srcreg, dstreg);
str = "SUBX." + (string)opsize.GetValue(dstmod & 3) + "\tD" + srcreg.ToString() + ",D" + dstreg.ToString();
ilen++;
}
else
{
//sprintf(str, "SUBX.%c\t-(A%u),-(A%u)\0", opsize[dstmod & 3][0], srcreg, dstreg);
str = "SUBX." + (string)opsize.GetValue(dstmod & 3) + "\t-(A" + srcreg.ToString() + "),-(A" + dstreg.ToString() + ")";
ilen++;
}
}
else if ((dstmod >= 0 && dstmod <= 2) || (dstmod >= 4 && dstmod <= 6))
{
if ((dstmod & 4) == 4)
{
ilen += build_destination(out dest, 0, srcmod, srcreg, addr, offset, br);
//sprintf(str, "SUB.%c\tD%u,%s\0", opsize[dstmod & 3][0], dstreg, dest);
str = "SUB." + (string)opsize.GetValue(dstmod & 3) + "\tD" + dstreg.ToString() + "," + dest;
ilen++;
}
else
{
if (dstmod == 3) err = 3;
if (dstmod == 7) err = 2;
ilen += build_source(out dest, err, srcmod, srcreg, addr, offset, br);
if (dstmod == 3) err = 1;
if (dstmod == 7) err = 2;
//sprintf(str, "SUB.%c\t%s,D%u\0", opsize[dstmod & 3][0], dest, dstreg);
str = "SUB." + (string)opsize.GetValue(dstmod & 3) + "\t" + dest + ",D" + dstreg.ToString();
ilen++;
}
}
break;
// Instruction type 0B
case 0x0b:
if ((dstmod >= 0) && (dstmod <= 2))
{
if (dstmod == 0) err = 1;
if (dstmod == 1) err = 3;
if (dstmod == 2) err = 2;
ilen += build_source(out dest, err, srcmod, srcreg, addr, offset, br);
//sprintf(str, "CMP.%c\t%s,D%u\0", opsize[dstmod][0], dest, dstreg);
str = "CMP." + (string)opsize.GetValue(dstmod) + "\t" + dest + ",D" + dstreg.ToString();
ilen++;
}
else if ((dstmod == 3) || (dstmod == 7))
{
if (dstmod == 3) err = 3;
if (dstmod == 7) err = 2;
ilen += build_source(out dest, err, srcmod, srcreg, addr, offset, br);
if (dstmod == 3) err = 1;
if (dstmod == 7) err = 2;
//sprintf(str, "CMPA.%c\t%s,A%u\0", opsize[err][0], dest, dstreg);
str = "CMPA." + (string)opsize.GetValue(err) + "\t" + dest + ",A" + dstreg.ToString();
ilen++;
}
else if ((dstmod >= 4) && (dstmod <= 6))
{
if (dstmod == 4) err = 1;
if (dstmod == 5) err = 3;
if (dstmod == 6) err = 2;
ilen += build_source(out dest, err, srcmod, srcreg, addr, offset, br);
//sprintf(str, "EOR.%c\t%s,D%u\0", opsize[dstmod][0], dest, dstreg);
str = "EOR." + (string)opsize.GetValue(dstmod) + "\t" + dest + ",D" + dstreg.ToString();
ilen++;
}
else if ((srcmod == 1) && (dstmod >= 4 && dstmod <= 6))
{
//sprintf(str, "CMPM.%c\t(A%u)+,(A%u)+\0", opsize[dstmod & 3][0], srcreg, dstreg);
str = "CMPM." + (string)opsize.GetValue(dstmod & 3) + "\t(A" + srcreg.ToString() + ")+,(A" + dstreg.ToString() + ")+";
ilen++;
}
break;
// Instruction type 0C
case 0x0c:
if ((dstmod >= 0 && dstmod <= 2) || (dstmod >= 4 && dstmod <= 6))
{
if ((dstmod & 4) == 4)
{
ilen += build_destination(out dest, 0, srcmod, srcreg, addr, offset, br);
//sprintf(str, "AND.%c\tD%u,%s\0", opsize[dstmod & 3][0], dstreg, dest);
str = "AND." + (string)opsize.GetValue(dstmod & 3) + "\tD" + dstreg.ToString() + "," + dest;
ilen++;
}
else
{
if (dstmod == 3) err = 3;
if (dstmod == 7) err = 2;
ilen += build_source(out dest, err, srcmod, srcreg, addr, offset, br);
if (dstmod == 3) err = 1;
if (dstmod == 7) err = 2;
//sprintf(str, "AND.%c\t%s,D%u\0", opsize[dstmod & 3][0], dest, dstreg);
str = "AND." + (string)opsize.GetValue(dstmod & 3) + "\t" + dest + ",D" + dstreg.ToString();
ilen++;
}
}
else if (dstmod == 3)
{
ilen += build_source(out sour, 3, srcmod, srcreg, addr, offset, br);
// sprintf(str, "MULU.W\t%s,D%u\0", sour, dstreg);
str = "MULU.W\t" + sour + ",D" + dstreg.ToString();
ilen++;
}
else if (dstmod == 7)
{
ilen += build_source(out sour, 3, srcmod, srcreg, addr, offset, br);
//sprintf(str, "MULS.W\t%s,D%u\0", sour, dstreg);
str = "MULS.W\t" + sour + ",D" + dstreg.ToString();
ilen++;
}
else if ((srcmod == 0 || srcmod == 1) && (dstmod == 4))
{
if (srcmod == 0)
{
//sprintf(str, "ABCD.%c\tD%u,D%u\0", opsize[dstmod & 3][0], srcreg, dstreg);
str = "ABCD." + (string)opsize.GetValue(dstmod & 3) + "\tD" + srcreg.ToString() + ",D" + dstreg.ToString();
ilen++;
}
else
{
//sprintf(str, "ABCD.%c\t-(A%u),-(A%u)\0", opsize[dstmod & 3][0], srcreg, dstreg);
str = "ABCD." + (string)opsize.GetValue(dstmod & 3) + "\t-(A" + srcreg.ToString() + "),-(A" + dstreg.ToString() + ")";
ilen++;
}
}
else if (dstmod == 5 && srcmod == 0)
{
//sprintf(str, "EXG\tD%u,D%u\0", srcreg, dstreg);
str = "EXG\tD" + srcreg.ToString() + ",D" + dstreg.ToString();
ilen++;
}
else if (dstmod == 5 && srcmod == 1)
{
//sprintf(str, "EXG\tA%u,A%u\0", srcreg, dstreg);
str = "EXG\tA" + srcreg.ToString() + ",A" + dstreg.ToString();
ilen++;
}
else if (dstmod == 6 && srcmod == 1)
{
//sprintf(str, "EXG\tA%u,D%u\0", srcreg, dstreg);
str = "EXG\tA" + srcreg.ToString() + ",D" + dstreg.ToString();
ilen++;
}
break;
// Instruction type 0D
case 0x0d:
if ((dstmod == 3) || (dstmod == 7))
{
if (dstmod == 3) err = 3;
if (dstmod == 7) err = 2;
ilen += build_source(out dest, err, srcmod, srcreg, addr, offset, br);
if (dstmod == 3) err = 1;
if (dstmod == 7) err = 2;
//sprintf(str, "ADDA.%c\t%s,A%u\0", opsize[err][0], dest, dstreg);
str = "ADDA." + (string)opsize.GetValue(err) + "\t" + dest + ",A" + dstreg.ToString();
ilen++;
}
else if ((srcmod == 0 || srcmod == 1) && (dstmod >= 4 && dstmod <= 6))
{
if (srcmod == 0)
{
//sprintf(str, "ADDX.%c\tD%u,D%u\0", opsize[dstmod & 3][0], srcreg, dstreg);
str = "ADDX." + (string)opsize.GetValue(dstmod & 3) + "\tD" + srcreg.ToString() + ",D" + dstreg.ToString();
ilen++;
}
else
{
//sprintf(str, "ADDX.%c\t-(A%u),-(A%u)\0", opsize[dstmod & 3][0], srcreg, dstreg);
str = "ADDX." + (string)opsize.GetValue(dstmod & 3) + "\t-(A" + srcreg.ToString() + "),-(A" + dstreg.ToString() + ")";
ilen++;
}
}
else if ((dstmod >= 0 && dstmod <= 2) || (dstmod >= 4 && dstmod <= 6))
{
if ((dstmod & 4) == 4)
{
ilen += build_destination(out dest, 0, srcmod, srcreg, addr, offset, br);
//sprintf(str, "ADD.%c\tD%u,%s\0", opsize[dstmod & 3][0], dstreg, dest);
str = "ADD." + (string)opsize.GetValue(dstmod & 3) + "\tD" + dstreg.ToString() + "," + dest;
ilen++;
}
else
{
if (dstmod == 3) err = 3;
if (dstmod == 7) err = 2;
ilen += build_source(out dest, err, srcmod, srcreg, addr, offset, br);
if (dstmod == 3) err = 1;
if (dstmod == 7) err = 2;
//sprintf(str, "ADD.%c\t%s,D%u\0", opsize[dstmod & 3][0], dest, dstreg);
str = "ADD." + (string)opsize.GetValue(dstmod & 3) + "\t" + dest + ",D" + dstreg.ToString();
ilen++;
}
}
break;
// Instruction type 0E
case 0x0e:
char charx = ((dstmod & 4) > 0 ? 'L' : 'R');
if (srcmod == 0)
{
if (dstreg == 0) dstreg = 8;
// sprintf(str,"AS%c.%c\t#%u,D%u\0",(dstmod&4?'L':'R'),opsize[dstmod&3][0],dstreg,srcreg);
str = "AS" + charx + "." + (string)opsize.GetValue(dstmod & 3) + "\t#" + dstreg.ToString() + ",D" + srcreg.ToString();
ilen++;
}
else if (srcmod == 4)
{
//sprintf(str,"AS%c.%c\tD%u,D%u\0",(dstmod&4?'L':'R'),opsize[dstmod&3][0],dstreg,srcreg);
str = "AS" + charx + "." + (string)opsize.GetValue(dstmod & 3) + "\tD" + dstreg.ToString() + ",D" + srcreg.ToString();
ilen++;
}
else if (srcmod == 1)
{
if (dstreg == 0) dstreg = 8;
//sprintf(str,"LS%c.%c\t#%u,D%u\0",(dstmod&4?'L':'R'),opsize[dstmod&3][0],dstreg,srcreg);
str = "LS" + charx + "." + (string)opsize.GetValue(dstmod & 3) + "\t#" + dstreg.ToString() + ",D" + srcreg.ToString();
ilen++;
}
else if (srcmod == 5)
{
//sprintf(str,"LS%c.%c\tD%u,D%u\0",(dstmod&4?'L':'R'),opsize[dstmod&3][0],dstreg,srcreg);
str = "LS" + charx + "." + (string)opsize.GetValue(dstmod & 3) + "\tD" + dstreg.ToString() + ",D" + srcreg.ToString();
ilen++;
}
else if (srcmod == 2)
{
if (dstreg == 0) dstreg = 8;
//sprintf(str,"ROX%c.%c\t#%u,D%u\0",(dstmod&4?'L':'R'),opsize[dstmod&3][0],dstreg,srcreg);
str = "ROX" + charx + "." + (string)opsize.GetValue(dstmod & 3) + "\t#" + dstreg.ToString() + ",D" + srcreg.ToString();
ilen++;
}
else if (srcmod == 6)
{
//sprintf(str,"ROX%c.%c\tD%u,D%u\0",(dstmod&4?'L':'R'),opsize[dstmod&3][0],dstreg,srcreg);
str = "ROX" + charx + "." + (string)opsize.GetValue(dstmod & 3) + "\tD" + dstreg.ToString() + ",D" + srcreg.ToString();
ilen++;
}
else if (srcmod == 3)
{
if (dstreg == 0) dstreg = 8;
//sprintf(str,"RO%c.%c\t#%u,D%u\0",(dstmod&4?'L':'R'),opsize[dstmod&3][0],dstreg,srcreg);
str = "RO" + charx + "." + (string)opsize.GetValue(dstmod & 3) + "\t#" + dstreg.ToString() + ",D" + srcreg.ToString();
ilen++;
}
else if (srcmod == 7)
{
//sprintf(str,"RO%c.%c\tD%u,D%u\0",(dstmod&4?'L':'R'),opsize[dstmod&3][0],dstreg,srcreg);
str = "RO" + charx + "." + (string)opsize.GetValue(dstmod & 3) + "\tD" + dstreg.ToString() + ",D" + srcreg.ToString();
ilen++;
}
else if (dstreg == 0 && ((dstmod & 3) == 3))
{
//ilen += build_destination(out dest, 0, srcmod, srcreg, addr, offset, br);
//sprintf(str,"AS%c.%c\tD%u,D%u\0",(dstmod&4?'L':'R'),opsize[dstmod&3][0],dest);
//str = "AS" + charx + "." + (string)opsize.GetValue(dstmod & 3) + "\tD"
str = "FAILURE";
ilen++;
}
else if (dstreg == 1 && ((dstmod & 3) == 3))
{
ilen += build_destination(out dest, 0, srcmod, srcreg, addr, offset, br);
// sprintf(str,"LS%c.%c\tD%u,D%u\0",(dstmod&4?'L':'R'),opsize[dstmod&3][0],dest);
str = "FAILURE2";
ilen++;
}
else if (dstreg == 2 && ((dstmod & 3) == 3))
{
ilen += build_destination(out dest, 0, srcmod, srcreg, addr, offset, br);
//sprintf(str,"ROX%c.%c\tD%u,D%u\0",(dstmod&4?'L':'R'),opsize[dstmod&3][0],dest);
str = "FAILURE3";
ilen++;
}
else if (dstreg == 3 && ((dstmod & 3) == 3))
{
ilen += build_destination(out dest, 0, srcmod, srcreg, addr, offset, br);
//sprintf(str,"RO%c.%c\tD%u,D%u\0",(dstmod&4?'L':'R'),opsize[dstmod&3][0],dest);
str = "FAILURE4";
ilen++;
}
break;
// Instruction type 0F
case 0x0f:
ch3 = br.ReadByte(); ch4 = br.ReadByte();
ilen++;
err = (uint)((ch3 << 8) + ch4);
if (ch1 == 0xf8 && ch2 == 00 && err == 0x01c0)
{
ilen += build_source(out dest, 3, 7, 4, addr, offset, br);
//sprintf(str,"LPSTOP\t%s\0",dest);
str = "LPSTOP\t" + dest;
ilen++;
}
else if ((ch3 & 1) == 0)
{
char char1 = ((ch3 & 8) == 8 ? 'U' : 'S');
char char2 = ((ch3 & 4) == 4 ? 'N' : ' ');
int temp1 = (ch4 & 0xc0) >> 6;
int temp2 = ch2 & 7;
int temp3 = ch4 & 7;
int temp4 = ch3 & 7;
//sprintf(str,"TBL%c%c.%c\tD%u:D%u,D%u\0",((ch3&8)==8?'U':'S'),((ch3&4)==4?'N':' '),opsize[(ch4&0xc0)>>6][0],ch2&7,ch4&7,ch3&7);
str = "TBL" + char1 + char2 + "." + (string)opsize.GetValue(temp1) + "\tD" + temp2.ToString() + ":D" + temp3.ToString() + ",D" + temp4.ToString();
ilen++;
}
else if ((ch3 & 1) == 1)
{
if ((ch3 & 0xc0) == 0) err = 1;
if ((ch3 & 0xc0) == 0x80) err = 2;
if ((ch3 & 0xc0) == 0x40) err = 3;
ilen += build_source(out sour, err, srcmod, srcreg, addr, offset, br);
char char1 = ((ch3 & 8) == 8 ? 'U' : 'S');
char char2 = ((ch3 & 4) == 4 ? 'N' : ' ');
int temp1 = (ch4 & 0xc0) >> 6;
int temp2 = ch3 & 7;
//sprintf(str,"TBL%c%c.%c\t%s,D%u\0",((ch3&8)==8?'U':'S'),((ch3&4)==4?'N':' '),opsize[(ch4&0xc0)>>6][0],sour,ch3&7);
str = "TBL" + char1 + char2 + "." + (string)opsize.GetValue(temp1) + "\t" + sour + ",D" + temp2.ToString();
ilen++;
}
break;
} /* END SWITCH STATEMENT */
if (ilen == 0)
{
//sprintf(str, ".word\t%04X\0", i);
str = ".word\t" + i.ToString("X4");
}
return (ilen);
}