T8SuitePro.Disassembler.build_source C# (CSharp) Method

build_source() private method

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