⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dis_cf.c

📁 完整的Bell实验室的嵌入式文件系统TFS
💻 C
📖 第 1 页 / 共 5 页
字号:
    mask = 0x3; /* 2 bits */    for (i = 1; i < disp_offset; i++)        mask = mask << 1;    i = (extension & mask) >> (disp_offset - 1);    switch (i)    {        case 0:        case 1:            break;        case 2:            disp = (int)((SWORD)cpu_read_data((ADDRESS)disasm_pc,16));            inc_disasm_pc(2);            append_value(buf,disp,16);            break;        case 3:            disp = (int)((SLONG)cpu_read_data((ADDRESS)disasm_pc,32));            inc_disasm_pc(4);            append_value(buf,disp,32);            break;    }}static voidappend_size_scale (char *buf, int extension, int size_offset, int scale_offset){    /*     * This function determines the size and scale information     * for addressing modes that require it.     *      * The `offsets' are given by the bit number as listed in the     * M68000 Family Programmer's Reference, Chapter 2. [15 .. 0]     */    int i, mask, size, scale;    mask = 0x1; /* 1 bits */    for (i = 0; i < size_offset; i++)        mask = mask << 1;    size = (extension & mask) >> size_offset;    mask = 0x3; /* 2 bits */    for (i = 1; i < scale_offset; i++)        mask = mask << 1;    scale = (extension & mask) >> (scale_offset - 1);    if (size)        append_string(buf,".L");    else        append_string(buf,".W");    switch (scale)    {        case 0:            append_string(buf,"*1");            break;        case 1:            append_string(buf,"*2");            break;        case 2:            append_string(buf,"*4");            break;        case 3:            /* valid_instruction = FALSE; */            append_string(buf,"*8");            break;    }}static intappend_ea (char *buf, int opword, int offset, int ea_mask){    /*     * This routine creates the addressing mode.  The     * extensions for the addressing mode, if necessary,     * start at disasm_pc     */    int i, mask, mode, reg, ea;    char buffer[9];#ifdef SYMBOL_TABLE    char tstr[100];#endif    ea = EA_NONE;    /* get addressing mode */    mask = 0x7; /* 3 bits */    for (i = 2; i < offset; i++)        mask = mask << 1;    mode = (opword & mask) >> (offset - 2);    /* get register */    mask = 0x7; /* 3 bits */    for (i = 2; i < (offset - 3); i++)        mask = mask << 1;    reg = (opword & mask) >> (offset -3 - 2);    switch (mode)    {        case 0: /* data register direct mode */            append_register(buf,reg,DATA_REGISTER,2);            ea = DRD;            break;        case 1: /* address register direct mode */            append_register(buf,reg,ADDRESS_REGISTER,2);            ea = ARD;            break;        case 2: /* address register indirect mode (ARI) */            append_string(buf,"(");            append_register(buf,reg,ADDRESS_REGISTER,2);            append_string(buf,")");            ea = ARI;            break;        case 3: /* ARI with postincrement mode */            append_string(buf,"(");            append_register(buf,reg,ADDRESS_REGISTER,2);            append_string(buf,")+");            ea = ARIPO;            break;        case 4: /* ARI with predecrement mode */            append_string(buf,"-(");            append_register(buf,reg,ADDRESS_REGISTER,2);            append_string(buf,")");            ea = ARIPR;            break;        case 5: /* ARI with displacement mode */            {                int disp;                disp = (int)((SWORD)cpu_read_data((ADDRESS)disasm_pc,16));                inc_disasm_pc(2);                sprintf(buffer,"%d",disp);                append_string(buf,buffer);                append_string(buf,"(");                append_register(buf,reg,ADDRESS_REGISTER,2);                append_string(buf,")");                ea = ARID;            }            break;        case 6:            {                /* this mode is overloaded.  the encoding in the */                /* extension byte indicate which of the 4 modes  */                /*                                               */                /* [xxxxxxx0xxxx0000] ARI 8bit displacement      */                /* [xxxxxxx1xxxx0000] ARI base displacement      */                /* [xxxxxxx1xxxx00xx] memory indirect pre index  */                /* [xxxxxxx1xxxx01xx] memory indirect post index */                /*                                               */                int extension;                extension = (int)*(WORD *)disasm_pc;                inc_disasm_pc(2);                if (extension & 0x0100)                {                    /* ARI base or memory indirects */                    if (extension & 0x0007)                    {                        /* memory indirects */                        if (extension & 0x0004)                        {                            /* memory indirect post index */                            append_string(buf,"(");                            append_string(buf,"[");                            append_displacement(buf,extension,5);                            append_string(buf,",");                            append_register(buf,reg,ADDRESS_REGISTER,2);                            append_string(buf,"]");                            append_string(buf,",");                            append_register(buf,extension,15,14);                            append_size_scale(buf,extension,11,10);                            append_string(buf,",");                            append_displacement(buf,extension,1);                            ea = MIPO;                        }                        else                        {                            /* memory indirect pre index */                            append_string(buf,"(");                            append_string(buf,"[");                            append_displacement(buf,extension,5);                            append_string(buf,",");                            append_register(buf,reg,ADDRESS_REGISTER,2);                            append_string(buf,",");                            append_register(buf,extension,15,14);                            append_size_scale(buf,extension,11,10);                            append_string(buf,"]");                            append_string(buf,",");                            append_displacement(buf,extension,1);                            ea = MIPR;                        }                    }                    else                    {                        /* ARI with BASE displacement */                        append_string(buf,"(");                        append_displacement(buf,extension,5);                        append_string(buf,",");                        append_register(buf,reg,ADDRESS_REGISTER,2);                        append_string(buf,",");                        append_register(buf,extension,15,14);                        append_size_scale(buf,extension,11,10);                        ea = ARIIB;                    }                }                else                {                    SBYTE disp8;                    disp8 = (SBYTE)(extension & 0x00FF);                    sprintf(buffer,"%d",disp8);                    append_string(buf,buffer);                    append_string(buf,"(");                    append_register(buf,reg,ADDRESS_REGISTER,2);                    append_string(buf,",");                    append_register(buf,extension,15,14);                    append_size_scale(buf,extension,11,10);                    ea = ARII8;                }            append_string(buf,")");            }            break;        case 7:            switch (reg)            {                case 0x0:                    {                        int data;                        data = (int)((SWORD)cpu_read_data((ADDRESS)disasm_pc,16));                        inc_disasm_pc(2);                        append_string(buf,"(");                        append_value(buf,data,16);                        append_string(buf,".W");                        append_string(buf,")");                    }                    ea = AS;                    break;                case 0x1:                    {                        int data;                        data = (int)((SLONG)cpu_read_data((ADDRESS)disasm_pc,32));                        inc_disasm_pc(4);#ifdef SYMBOL_TABLE                        if (symtab_convert_address((ADDRESS)data,tstr))                        {                            append_string(buf,tstr);                        }                        else                        {                            append_string(buf,"(");                            append_value(buf,data,32);                            append_string(buf,".L");                            append_string(buf,")");                        }#else                        append_string(buf,"(");                        append_value(buf,data,32);                        append_string(buf,".L");                        append_string(buf,")");#endif                    }                    ea = AL;                    break;                case 0x2:                    {                        int disp;                        disp = (int)((SWORD)cpu_read_data((ADDRESS)disasm_pc,16));                        inc_disasm_pc(2);                        sprintf(buffer,"%d",disp);                        append_string(buf,buffer);                        append_string(buf,"(PC)");                    }                    ea = PCID;                    break;                case 0x3:                    {                        int extension, disp;                        extension = (int)*(WORD *)disasm_pc;                        inc_disasm_pc(2);                        /* this mode is overloaded.  the encoding in the */                        /* extension byte indicate which of the 4 modes  */                        /*                                               */                        /* [xxxxxxx0xxxx0000] PC  8bit displacement      */                        /* [xxxxxxx1xxxx0000] PC  base displacement      */                        /* [xxxxxxx1xxxx00xx] PC mem indirect pre index  */                        /* [xxxxxxx1xxxx01xx] PC mem indirect post index */                        /*                                               */                        if (extension & 0x0100)                        {                            /* PC base or PC memory indirects */                            if (extension & 0x0007)                            {                                /* PC memory indirects */                                if (extension & 0x0004)                                {                                    /* memory indirect post index */                                    append_string(buf,"(");                                    append_string(buf,"[");                                    append_displacement(buf,extension,5);                                    append_string(buf,",PC],");                                    append_register(buf,extension,15,14);                                    append_size_scale(buf,extension,11,10);                                    append_string(buf,",");                                    append_displacement(buf,extension,1);                                    ea = PCMIPO;                                }                                else                                {                                    /* memory indirect pre index */                                    append_string(buf,"(");                                    append_string(buf,"[");                                    append_displacement(buf,extension,5);                                    append_string(buf,",PC,");                                    append_register(buf,extension,15,14);                                    append_size_scale(buf,extension,11,10);                                    append_string(buf,"]");                                    append_string(buf,",");                                    append_displacement(buf,extension,1);                                    ea = PCMIPR;                                }                            }                            else                            {                                /* base disp */                                append_string(buf,"(");                                append_displacement(buf,extension,5);                                append_string(buf,",PC,");                                append_register(buf,extension,15,14);                                append_size_scale(buf,extension,11,10);                                ea = PCIIB;                            }                        }                        else                        {                            disp = (int)((SBYTE)(extension & 0x00FF));                            sprintf(buffer,"%d",disp);                            append_string(buf,buffer);                            append_string(buf,"(PC,");                            append_register(buf,extension,15,14);                            append_size_scale(buf,extension,11,10);                            append_string(buf,")");                            ea = PCII8;                        }                    }                    break;                case 0x4:                    {                        int data;                        switch (disasm_op_size)                        {                            case SIZE_BYTE:                                data = (int)((WORD)cpu_read_data((ADDRESS)disasm_pc,16));                                inc_disasm_pc(2);                                data = (int)(data & 0x00FF);                                append_string(buf,"#");                                append_value(buf,data,8);                                break;                            case SIZE_WORD:                                data = (int)((WORD)cpu_read_data((ADDRESS)disasm_pc,16));                                inc_disasm_pc(2);                                append_string(buf,"#");                                append_value(buf,data,16);                                break;                            case SIZE_LONG:                                data = (int)((LONG)cpu_read_data((ADDRESS)disasm_pc,32));                                inc_disasm_pc(4);                                append_string(buf,"#");#ifdef SYMBOL_TABLE                                if (symtab_convert_address((ADDRESS)data,tstr))                                {                                    append_string(buf,tstr);                                }                                else                                    append_value(buf,data,32);#else                                append_value(buf,data,32);#endif                                break;                            default:                                break;                        }                    }                    ea = IM;                    break;            }        default:            break;    }    if (!(ea_mask & ea))    {        /* EA was not one of ones in mask */        valid_instruction = FALSE;    }    return ea;  /* needed by MOVE */}/********************************************************/#if 0static voidfunc (int index, WORD opword){    sprintf(dstr,"%s -- ??????",isa[index].instruction);}#endifstatic voidfunc1 (int index, WORD opword){    /* BTST, BCLR, BCHG, BSET statics */    int data;    data = (int)((WORD)cpu_read_data((ADDRESS)disasm_pc,16));    inc_disasm_pc(2);    if (0xFF00 & data)    {        valid_instruction = FALSE;        return;    }    append_string(dstr,"#");    append_value(dstr,data,8);    append_string(dstr,",");    append_ea(dstr,opword,5,isa[index].ea_mask);}#ifndef MCF5200static voidfunc2 (int index, WORD opword){    /* ORI ANDI EORI to CCR */    int data;    (void)index;    (void)opword;    data = (int)((LONG)cpu_read_data((ADDRESS)disasm_pc,16));    inc_disasm_pc(2);    append_string(dstr,"#");    append_value(dstr,data,8);    append_string(dstr,",CCR");}static voidfunc3 (int index, WORD opword){    /* ORI ANDI EORI to SR */    int data;    (void)index;    (void)opword;    data = (int)((LONG)cpu_read_data((ADDRESS)disasm_pc,16));    inc_disasm_pc(2);    append_string(dstr,"#");    append_value(dstr,data,16);    append_string(dstr,",SR");}static voidfunc4 (int index, WORD opword){    /* RTM */    (void)index;    (void)opword;    append_register(dstr,opword,3,2);}static voidfunc5 (int index, WORD opword){    /* CALLM */    int data;    data = (int)((LONG)cpu_read_data((ADDRESS)disasm_pc,16));    inc_disasm_pc(2);    append_string(dstr,"#");    append_value(dstr,data,8);    append_string(dstr,",");    append_ea(dstr,opword,5,isa[index].ea_mask);}#endif /* MCF5200 */static voidfunc6 (int index, WORD opword){    /* ORI EORI ANDI SUBI ADDI  */    int data;    append_size(dstr,opword,7,TRUE);    append_string(dstr,"#");    switch (disasm_op_size)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -