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

📄 dis_cf.c

📁 完整的Bell实验室的嵌入式文件系统TFS
💻 C
📖 第 1 页 / 共 5 页
字号:
    {        case SIZE_BYTE:            data = (int)((LONG)cpu_read_data((ADDRESS)disasm_pc,16));            inc_disasm_pc(2);            append_value(dstr,data,8);            break;        case SIZE_WORD:            data = (int)((LONG)cpu_read_data((ADDRESS)disasm_pc,16));            inc_disasm_pc(2);            append_value(dstr,data,16);            break;        case SIZE_LONG:            data = (int)((LONG)cpu_read_data((ADDRESS)disasm_pc,32));            inc_disasm_pc(4);            append_value(dstr,data,32);            break;    }    append_string(dstr,",");    append_ea(dstr,opword,5,isa[index].ea_mask);}static voidfunc7 (int index, WORD opword){    /* BTST, BCHG, BSET, BCLR reg */    append_register(dstr,opword,DATA_REGISTER,11);    append_string(dstr,",");    append_ea(dstr,opword,5,isa[index].ea_mask);}static voidfunc8 (int index, WORD opword){    /* MOVE .b,.w,.l */    int opw1, opw2;#ifdef MCF5200    int sea;#endif    /* the destination <ea> is swapped from the form expected by */    /* append_ea().  so make it look right */    opw1 = opword & 0x0FC0;    opword = opword & 0xF03F;       /* punch out dest */    opw2 = (opw1 & 0x01C0) << 3;    /* mode */    opword = opword | opw2;         /* swapped mode */    opw2 = (opw1 & 0x0E00) >> 3;    /* reg */    opword = opword | opw2;         /* swapped reg */    append_size2(dstr,opword,13,TRUE);#ifndef MCF5200    append_ea(dstr,opword,5,EA_ALL);    append_string(dstr,",");    append_ea(dstr,opword,11,isa[index].ea_mask);#endif#ifdef MCF5200    sea = append_ea(dstr,opword,5,isa[index].ea_mask);    append_string(dstr,",");    /* NOTE: On Coldfire, not all dest <ea> are possible! */    /* See MCF5200 Family Programmer's Reference Manual,  */    /* pages 4-53 thru 4-55 for further information.      */    switch (sea)    {        case DRD:        case ARD:        case ARI:        case ARIPO:        case ARIPR:            append_ea(dstr,opword,11,                (DRD | ARD | ARI | ARIPO | ARIPR | ARID | ARII8 \                | AS | AL));            break;        case ARID:        case PCID:            append_ea(dstr,opword,11,                (DRD | ARD | ARI | ARIPO | ARIPR | ARID));            break;        case ARII8:        case PCII8:        case AS:        case AL:        case IM:            append_ea(dstr,opword,11,                (DRD | ARD | ARI | ARIPO | ARIPR));            break;        default:            valid_instruction = FALSE;            break;    }#endif}static voidfunc9 (int index, WORD opword){    /* MOVE from SR */    append_string(dstr,"SR,");    append_ea(dstr,opword,5,isa[index].ea_mask);}static voidfunc10 (int index, WORD opword){    /* MOVE to SR */    disasm_op_size = SIZE_WORD;    append_ea(dstr,opword,5,isa[index].ea_mask);    append_string(dstr,",SR");}static voidfunc11 (int index, WORD opword){    /* MOVE from CCR */    append_string(dstr,"CCR,");    append_ea(dstr,opword,5,isa[index].ea_mask);}static voidfunc12 (int index, WORD opword){    /* MOVE to CCR */    disasm_op_size = SIZE_WORD;    append_ea(dstr,opword,5,isa[index].ea_mask);    append_string(dstr,",CCR");}static voidfunc13 (int index, WORD opword){    /* SWAP EXT EXTB */    (void)index;    append_register(dstr,opword,DATA_REGISTER,2);}static voidfunc14 (int index, WORD opword){    /* ADDX SUBX */    (void)index;    append_size(dstr,opword,7,TRUE);    if (opword & 0x0008)    {        /* ADDX/SUBX -(Ax),-(Ay) */        append_string(dstr,"-(");        append_register(dstr,opword,ADDRESS_REGISTER,2);        append_string(dstr,"),-(");        append_register(dstr,opword,ADDRESS_REGISTER,11);        append_string(dstr,")");    }    else    {        /* ADDX/SUBX Dx,Dy */        append_register(dstr,opword,DATA_REGISTER,2);        append_string(dstr,",");        append_register(dstr,opword,DATA_REGISTER,11);    }}static voidfunc15 (int index, WORD opword){    /* NEGX NEG NOT CLR WDDATA */    append_size(dstr,opword,7,TRUE);    append_ea(dstr,opword,5,isa[index].ea_mask);}static voidfunc16 (int index, WORD opword){    /* LINK word */    int disp;    char buffer[20];    (void)index;    disp = (int)((SWORD)cpu_read_data((ADDRESS)disasm_pc,16));    inc_disasm_pc(2);    append_register(dstr,opword,ADDRESS_REGISTER,2);    append_string(dstr,",#");    sprintf(buffer,"%d",disp);    append_string(dstr,buffer);}static voidfunc17 (int index, WORD opword){    /* RTE HALT RTS NOP */    /* instruction printed by calling routine */    (void)index;    (void)opword;}static voidfunc18 (int index, WORD opword){    /* ASL ASR LSL LSR ROR ROL ROXL ROXR NBCD PEA JSR JMP TAS */    append_ea(dstr,opword,5,isa[index].ea_mask);}#ifndef MCF5200static voidfunc19 (int index, WORD opword){    /* CMP2 and CHK2 */    int opword2;    opword2 = (int)((WORD)cpu_read_data((ADDRESS)disasm_pc,16));    inc_disasm_pc(2);    /* both instruction have same EA mask */    if (opword2 & 0x000800)    {        append_instruction(dstr,"CHK2");    }    else    {        append_instruction(dstr,"CMP2");    }    append_size(dstr,opword,10,TRUE);    append_ea(dstr,opword,5,isa[index].ea_mask);    append_string(dstr,",");    append_register(dstr,opword2,15,14);}#if 0static voidfunc20 (int index, WORD opword){    int data;    (void)index;    append_string(dstr,"#");    data = opword & 0x0007;    append_value(dstr,data,8);}#endif#endif /* MCF5200 */static voidfunc21 (int index, WORD opword){    (void)index;    append_register(dstr,opword,ADDRESS_REGISTER,2);}static voidfunc22 (int index, WORD opword){    /* TRAP */    int data;    (void)index;    append_string(dstr,"#");    data = opword & 0x000F;    append_value(dstr,data,8);}static voidfunc23 (int index, WORD opword){    /* STOP RTD */    int data;    (void)index;    (void)opword;    append_string(dstr,"#");    data = (int)((WORD)cpu_read_data((ADDRESS)disasm_pc,16));    inc_disasm_pc(2);    append_value(dstr,data,16);}static voidfunc24 (int index, WORD opword){    /* MOVEQ */    int data;    (void)index;    append_string(dstr,"#");    data = opword & 0x00FF;    append_value(dstr,data,8);    append_string(dstr,",");    append_register(dstr,opword,DATA_REGISTER,11);}static voidfunc25 (int index, WORD opword){    /* Bcc */    int disp, target;#ifdef SYMBOL_TABLE    char tstr[100];#endif    (void)index;    disp = opword & 0x00FF;    if (disp == 0)    {        /* 16 bit disp */        disp = (int)((SWORD)cpu_read_data((ADDRESS)disasm_pc,16));        target = (int)disasm_pc + disp;        inc_disasm_pc(2);    }    else    {        if (disp == 0x00FF)        {            /* 32 bit disp */            valid_instruction = FALSE;            return;        }        else        {            /* 8 bit disp */            disp = (int)((SBYTE)disp);            target = (int)disasm_pc + disp;        }    }#ifdef SYMBOL_TABLE    if (symtab_convert_address((ADDRESS)target,tstr))    {        append_string(dstr,tstr);    }    else        append_value(dstr,target,32);#else    append_value(dstr,target,32);#endif}static voidfunc26 (int index, WORD opword){    /* MOVEA */    append_size2(dstr,opword,13,TRUE);    append_ea(dstr,opword,5,isa[index].ea_mask);    append_string(dstr,",");    append_register(dstr,opword,ADDRESS_REGISTER,11);}intmore_bits_set (int cm, int cc, int dir, int reg_mask){    /* cm = current mask, cc = current count */    switch (dir)    {        case 1:            cm = cm << 1;            break;        case -1:            cm = cm >> 1;            break;    }    ++cc;    while (cc < 8)    {        if (cm & reg_mask)        {            return TRUE;        }        switch (dir)        {            case 1:                cm = cm << 1;                break;            case -1:                cm = cm >> 1;                break;        }        ++cc;    }    return FALSE;}static voidappend_reg_list (int reg_mask, int opword){    int mask, i, j, first, need_slash, dir, next_set, some_set;    char buffer[9];    char *reg;    char regA[] = "A";    char regD[] = "D";    /* Check for predecrement mode */    if ((opword & 0x0038) == 0x0020)    {        /* predecrement */        dir = -1;    }    else    {        dir = 1;    }    need_slash = FALSE;    for (j = 0; j < 2; j++)    {        if (j == 0)        {            switch (dir)            {                case 1:                    mask = 0x0001;                    break;                case -1:                    mask = 0x8000;                    break;            }            reg = regD;        }        else        {            switch (dir)            {                case 1:                    mask = 0x0100;                    break;                case -1:                    mask = 0x0080;                    break;            }            reg = regA;            if (need_slash)                append_string(dstr,"/");        }        some_set = FALSE;        first = TRUE;        need_slash = FALSE;        for (i = 0; i < 8; i++)        {            if (reg_mask & mask)            {                some_set = TRUE;                if (first)                {                    /* first one in subrange */                    if (need_slash)                    {                        append_string(dstr,"/");                        need_slash = FALSE;                    }                    append_string(dstr,reg);                    sprintf(buffer,"%d",i);                    append_string(dstr,buffer);                    if (!more_bits_set(mask,i,dir,reg_mask))                        need_slash = TRUE;                    first = FALSE;                }                else                {                    /* check to see if next set */                    switch (dir)                    {                        case 1:                            next_set = (((reg_mask & (mask << 1))) &&                                (i != 7));                            break;                        case -1:                            next_set = (((reg_mask & (mask >> 1))) &&                                (i != 7));                            break;                    }                    if (!next_set)                    {                        /* the next isn't set, so display */                        append_string(dstr,"-");                        append_string(dstr,reg);                        sprintf(buffer,"%d",i);                        append_string(dstr,buffer);                            need_slash = TRUE;                        first = TRUE;                    }                }            }            else first = TRUE;            switch (dir)            {                case 1:                    mask = mask << 1;                    break;                case -1:                    mask = mask >> 1;                    break;            }        }        if ((i == 8) && (j == 0) && some_set)        {            switch (dir)            {                case 1:                    need_slash = more_bits_set(0x0080,-1,dir,reg_mask);

⌨️ 快捷键说明

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