T8SuitePro.Disassembler.disasm C# (CSharp) Method

disasm() private method

private disasm ( string &str, long addr, byte upperbyte, byte lowerbyte, long offset, BinaryReader br, bool &endsub, bool &issub, bool &isjump ) : uint
str string
addr long
upperbyte byte
lowerbyte byte
offset long
br System.IO.BinaryReader
endsub bool
issub bool
isjump bool
return uint
        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);
        }