T7.Disassembler.build_destination C# (CSharp) Method

build_destination() private method

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