Annotation of researchv9/jtools/src/pi/m68kasm.c, revision 1.1.1.1

1.1       root        1: #include "asm.pri"
                      2: #include "m68kasm.h"
                      3: #include "format.pub"
                      4: #include "core.pub"
                      5: SRCFILE("m68kasm.c")
                      6: 
                      7: M68kInstr::M68kInstr(Asm*a,long l):(a,l&1?l+1:l) { tab = 0; display(); }
                      8: Instr *M68kAsm::newInstr(long a)       { return (Instr*) new M68kInstr(this,a); }
                      9: M68kAsm::M68kAsm(Core *c):(c)          { }
                     10: char *M68kAsm::literaldelimiter()      { return "&"; }
                     11: 
                     12: const short   SZ_MASK = 00300, SZ_SHIFT = 6;   // bits  (7-6)
                     13: const short  DEA_MASK = 00077;                 // bits  (5-0)
                     14: const short  DRG_MASK = 00007;                 // bits  (2-0)
                     15: const short DRGL_MASK = 07000;                 // bits (11-9)
                     16: const short  DBR_MASK = 00377;                 // bits  (7-0)
                     17: const short  DAQ_MASK = 07000;                 // bits (11-9)
                     18: const short DEAM_MASK = 07700;                 // bits (11-6)
                     19: const short  DMQ_MASK = 00377;                 // bits  (7-0)
                     20: 
                     21: short OpMask[] = {
                     22:        0,              // DIG  0       /* ignore this address */
                     23:        DEA_MASK,       // DEA  1       /* E.A. to low order 6 bits */
                     24:        DRG_MASK,       // DRG  2       /* register to low order 3 bits */
                     25:        DRGL_MASK,      // DRGL 3       /* register to bits 11-9 */
                     26:        DBR_MASK,       // DBR  4       /* branch offset (short) */
                     27:        DMQ_MASK,       // DMQ  5       /* move-quick 8-bit value */
                     28:        DAQ_MASK,       // DAQ  6       /* add-quick 3-bit value in 11-9 */
                     29:        0,              // DIM  7       /* Immediate value, according to size */
                     30:        DEAM_MASK,      // DEAM 8       /* E.A. to bits 11-6 as in move */
                     31:        0,              // DBCC 9       /* branch address as in "dbcc" */
                     32:        0,              // DIMH 10      /* Immediate forced to be 1 word */
                     33:        0,              // D2L  11      /* register to bits 0-2 of next word */
                     34:        0,              // D2H  12      /* register to bits 12-14 of next word */
                     35:        0,              // DBL  13      /* qty in bits 0-5 of next word */
                     36:        0,              // DBH  14      /* qty in bits 6-11 of next word */
                     37:        0,              // DCR  15      /* control reg a bit combination in 0-11 */
                     38: };
                     39: 
                     40: char *M68kInstr::dotbwl()
                     41: {
                     42:        // must be +/- 1?
                     43:        if( (tab[1].opname && !strcmp(tab->opname, tab[1].opname))
                     44:         || (tab[-1].opname && !strcmp(tab->opname, tab[-1].opname)) 
                     45:         || tab->size == BWL )
                     46:                switch( size ){
                     47:                case B : return "b";
                     48:                case W : return "w";
                     49:                case L : return "l";
                     50:                }
                     51:        return "";
                     52: }
                     53: 
                     54: int M68kInstr::imm_bytes(short addr, short disp)
                     55: {
                     56:        int bytes = 0;
                     57:        switch( disp ){
                     58:        case DIMH: bytes = 2; break;
                     59:        case DIM:  switch(size){
                     60:                   case B:
                     61:                   case W: bytes = 2; break;    
                     62:                   case L: bytes = 4; break;
                     63:                   }
                     64:                   if( addr&H ) bytes = 2; break;
                     65:        }
                     66:        switch(bytes){
                     67:        case 2: immval = _asm->core->peekcode(next)->sht; break;
                     68:        case 4: immval = _asm->core->peekcode(next)->lng; break;
                     69:        }
                     70:        return bytes;
                     71: }
                     72: 
                     73: short M68kInstr::sizemask()
                     74: {
                     75:        static char bwl[4] = { B, W, L, 0 };
                     76:        size = tab->size;
                     77:        if( size!=BWL ) return 0;
                     78:        size = bwl[(opword0>>SZ_SHIFT)&3];
                     79:        return size ? SZ_MASK : 0;
                     80: }
                     81: 
                     82: char *M68kInstr::ea()
                     83: {
                     84:        if( mode>=1 && mode<=6 ) reg += 8;
                     85:        switch( mode ){
                     86:        case 0: return regarg("%s%s",    fmt&F_SYMBOLIC|F_NONE);
                     87:        case 1: return regarg("%s%s",    fmt&F_SYMBOLIC|F_NONE);
                     88:        case 2: return regarg("%s(%s)",  fmt&F_SYMBOLIC|F_NONE);
                     89:        case 3: return regarg("%s(%s)+", fmt&F_SYMBOLIC|F_NONE);
                     90:        case 4: return regarg("%s-(%s)", fmt&F_SYMBOLIC|F_NONE);
                     91:        case 5: m = m.sht; next += 2;
                     92:                return regarg("%s(%s)", fmt|F_MASKEXT16);
                     93:        case 6: short brief = m.sht; next+= 2;
                     94:                if( brief & 0400 ) return "full";
                     95:                char ireg = (brief>>12)&15;
                     96:                m = (char)brief;
                     97:                int scale = (brief>>9)&3;
                     98:                scale = 1<<scale;
                     99:                char *wl = brief&04000 ? "l" : "w";
                    100:                char *pre = regarg("%s(%s,", fmt&F_SYMBOLIC|F_NONE);
                    101:                return sf("%s%s.%s*%d)", pre, _asm->core->regname(ireg), wl, scale);
                    102:        case 7:
                    103:            switch( reg ){
                    104:            case 0: m = m.sht; next += 2; return symbolic();
                    105:            case 1: m = m.lng; next += 4; return symbolic();
                    106:            case 4: switch( size ){
                    107:                    case B: m = m.sht; next += 2; return literal(F_MASKEXT8|fmt);
                    108:                    case W: m = m.sht; next += 2; return literal(F_MASKEXT16|fmt);
                    109:                    case L: m = m.lng; next += 4; return literal(fmt);
                    110:                    }
                    111:                    return "<imm?>";
                    112:            }
                    113:        }
                    114:        return sf("mode=%d:reg=%d", mode, reg);
                    115: }
                    116: 
                    117: char *M68kInstr::dbr(char x)
                    118: {
                    119:        switch( x ){
                    120:        case  0: m = next + m.sht; next += 2; break;
                    121:        case -1: m = next + m.lng; next += 4; break;
                    122:        default: m = next + x;
                    123:        }
                    124:        return symbolic();
                    125: }
                    126: 
                    127: char *M68kInstr::dbh()
                    128: {
                    129:        if( opword1&0004000 ){
                    130:                reg = (opword1>>6)&7;
                    131:                return regarg("%s%s", fmt&F_SYMBOLIC|F_NONE);
                    132:        }
                    133:        m = (opword1>>6)&31;
                    134:        return literal(fmt);
                    135: }
                    136: 
                    137: char *M68kInstr::dbl()
                    138: {
                    139:        if( opword1&0000040 ){
                    140:                reg = opword1&7;
                    141:                return regarg("%s%s", fmt&F_SYMBOLIC|F_NONE);
                    142:        }
                    143:        m = opword1&31;
                    144:        return literal(fmt);
                    145: }
                    146: 
                    147: char *M68kInstr::dcr()
                    148: {
                    149:        next += 2;
                    150:        switch( opword1&0xFFF ){
                    151:        case 0x000: return "sfc";
                    152:        case 0x001: return "dfc";
                    153:        case 0x002: return "cacr";
                    154:        case 0x800: return "usp";
                    155:        case 0x801: return "vbr";
                    156:        case 0x802: return "caar";
                    157:        case 0x803: return "msp";
                    158:        case 0x804: return "vbr";
                    159:        }
                    160:        return "<dcr>";
                    161: }
                    162: 
                    163: char *M68kInstr::arg(int i)
                    164: {
                    165:        short disp;
                    166:        short addr;
                    167:        switch( i ){                                            // !!
                    168:        case 0: disp = tab->a1disp; addr = tab->addr1; break;
                    169:        case 1: disp = tab->a2disp; addr = tab->addr2; break;
                    170:        case 2: disp = tab->a3disp; addr = tab->addr3; break;
                    171:        case 3: disp = tab->a4disp; addr = tab->addr4; break;
                    172:        }
                    173: 
                    174:        disp &= 15;
                    175:        short mask = OpMask[disp];
                    176:        short x = mask ? (opword0&mask)/(((((~mask)+1)^(~mask))+1)>>1) : 0;
                    177:        m = *_asm->core->peekcode(next);
                    178:        switch( addr ){
                    179:        case AREG+C:  return "ccr";
                    180:        case AREG+SR: return "sr";
                    181:        }
                    182:        switch( disp ){
                    183:        case DEA: mode = x>>3; reg = x&7; return ea();
                    184:        case DRG:                                               // fall thru
                    185:        case DRGL:reg = x;
                    186:                  if( addr&A ) reg += 8;
                    187:                  return regarg("%s%s",fmt&F_SYMBOLIC|F_NONE);
                    188:        case DBR: return dbr(x);
                    189:        case DMQ: m = (long)(char)x; return literal(F_MASKEXT16|fmt);
                    190:        case DAQ: if( !x ) x = 8; m = x; return literal(fmt);
                    191:        case DIMH:                                              // fall thru
                    192:        case DIM: if( (addr&H)
                    193:                   || addr==AIMM ) { m = immval; return literal(F_MASKEXT16|fmt);}
                    194:                  return "DIM";
                    195:        case DEAM:mode = x&7; reg = x>>3; return ea();
                    196:        case DBCC:m = m.sht+next; next += 2; return symbolic();
                    197:        case D2L: return "D2L";
                    198:        case D2H: reg = (opword1>>12)&15;
                    199:                  return regarg("%s%s", fmt&F_SYMBOLIC|F_NONE);
                    200:        case DBH: return dbh();
                    201:        case DBL: return dbl();
                    202:        case DCR: return dcr();
                    203:        }
                    204:        return Instr::arg(i);
                    205: }
                    206: 
                    207: int M68kInstr::nargs()
                    208: {
                    209:        if( !tab->addr1 ) return 0;
                    210:        if( !tab->addr2 ) return 1;
                    211:        if( !tab->addr3 ) return 2;
                    212:        if( !tab->addr4 ) return 3;
                    213:        return 4;
                    214: }
                    215: 
                    216: int M68kInstr::argtype(int)
                    217: {
                    218:        return 0;
                    219: }
                    220: 
                    221: struct m68koptab M68kOpTab[] = {
                    222: 
                    223: {0140400,"abcd",B,     SIG,    AREG+D, DRG,    AREG+D, DRGL,   0},
                    224: {0140410,"abcd",B,     SIG,    ADEC,   DRG,    ADEC,   DRGL,   0},
                    225: 
                    226: {0050000,"add",        BWL,    SD,     AIMM+Q, DAQ,    AGEN+AL,DEA,    0},
                    227: {0003000,"add",        BWL,    SD,     AIMM,   DIM,    AGEN+AL+DA,DEA, 0},
                    228: {0150000,"add",        BWL,    SD,     AGEN,   DEA,    AREG+D, DRGL,   0},
                    229: {0150400,"add",        BWL,    SD,     AREG+D, DRGL,   AGEN+AM,DEA,    0},
                    230: {0150300,"add",        W,      SIG,    AGEN,   DEA,    AREG+A, DRGL,   0},
                    231: {0150700,"add",        L,      SIG,    AGEN,   DEA,    AREG+A, DRGL,   ISL},
                    232: 
                    233: {0150400,"addx",BWL,   SD,     AREG+D, DRG,    AREG+D, DRGL,   0},
                    234: {0150410,"addx",BWL,   SD,     ADEC,   DRG,    ADEC,   DRGL,   0},
                    235: 
                    236: {0001174,"and",        W,      SIG,    AIMM,   DIM,    AREG+SR,DIG,    0},
                    237: {0001074,"and",        B,      SIG,    AIMM,   DIM,    AREG+C, DIG,    0},
                    238: {0001000,"and",        BWL,    SD,     AIMM,   DIM,    AGEN+AL+DA,DEA, 0},
                    239: {0140000,"and",        BWL,    SD,     AGEN+DA,DEA,    AREG+D, DRGL,   0},
                    240: {0140400,"and",        BWL,    SD,     AREG+D, DRGL,   AGEN+AM,DEA,    0},
                    241: 
                    242: {0160700,"asl",        W,      SIG,    AIMM+O, DIG,    AGEN+AM,DEA,    ISH},
                    243: {0160400,"asl",        BWL,    SD,     AIMM+Q, DAQ,    AREG+D, DRG,    ISH},
                    244: {0160440,"asl",        BWL,    SD,     AREG+D, DRGL,   AREG+D, DRG,    ISH},
                    245: 
                    246: {0160300,"asr",        W,      SIG,    AIMM+O, DIG,    AGEN+AM,DEA,    ISH},
                    247: {0160000,"asr",        BWL,    SD,     AIMM+Q, DAQ,    AREG+D, DRG,    ISH},
                    248: {0160040,"asr",        BWL,    SD,     AREG+D, DRGL,   AREG+D, DRG,    ISH},
                    249: 
                    250: {0165300,"bfchg",0,    0,      AGEN+BF,DEA,    ABIT,   DBH,    I2W,    0,      ABIT,   DBL},
                    251: {0166300,"bfclr",0,    0,      AGEN+BF,DEA,    ABIT,   DBH,    I2W,    0,      ABIT,   DBL},
                    252: {0165700,"bfexts",0,   0,      AGEN+BF,DEA,    ABIT,   DBH,    I2W,    0,      ABIT,   DBL,    AREG+D, D2H},
                    253: {0164700,"bfextu",0,   0,      AGEN+BF,DEA,    ABIT,   DBH,    I2W,    0,      ABIT,   DBL,    AREG+D, D2H},
                    254: {0166700,"bfffo",0,    0,      AGEN+BF,DEA,    ABIT,   DBH,    I2W,    0,      ABIT,   DBL,    AREG+D, D2H},
                    255: {0167700,"bfins",0,    0,      AREG+D, D2H,    AGEN+BF,DEA,    I2W,    0,      ABIT,   DBH,    ABIT,   DBL},
                    256: {0167300,"bfset",0,    0,      AGEN+BF,DEA,    ABIT,   DBH,    I2W,    0,      ABIT,   DBL},
                    257: {0164300,"bftst",0,    0,      AGEN+BF,DEA,    ABIT,   DBH,    I2W,    0,      ABIT,   DBL},
                    258: 
                    259: //{0060000,"br",       B,      SIG,    AEXP,   DBR,    0,      0,      0},
                    260: {0060000,"bra",        B,      SIG,    AEXP,   DBR,    0,      0,      0},
                    261: {0061000,"bhi",        B,      SIG,    AEXP,   DBR,    0,      0,      0},
                    262: //{0062000,"bhs",      B,      SIG,    AEXP,   DBR,    0,      0,      0},
                    263: {0062000,"bcc",        B,      SIG,    AEXP,   DBR,    0,      0,      0},
                    264: {0063000,"bne",        B,      SIG,    AEXP,   DBR,    0,      0,      0},
                    265: {0064000,"bvc",        B,      SIG,    AEXP,   DBR,    0,      0,      0},
                    266: {0065000,"bpl",        B,      SIG,    AEXP,   DBR,    0,      0,      0},
                    267: {0066000,"bge",        B,      SIG,    AEXP,   DBR,    0,      0,      0},
                    268: {0067000,"bgt",        B,      SIG,    AEXP,   DBR,    0,      0,      0},
                    269: {0061400,"bls",        B,      SIG,    AEXP,   DBR,    0,      0,      0},
                    270: //{0062400,"blo",      B,      SIG,    AEXP,   DBR,    0,      0,      0},
                    271: {0062400,"bcs",        B,      SIG,    AEXP,   DBR,    0,      0,      0},
                    272: {0063400,"beq",        B,      SIG,    AEXP,   DBR,    0,      0,      0},
                    273: {0064400,"bvs",        B,      SIG,    AEXP,   DBR,    0,      0,      0},
                    274: {0065400,"bmi",        B,      SIG,    AEXP,   DBR,    0,      0,      0},
                    275: {0066400,"blt",        B,      SIG,    AEXP,   DBR,    0,      0,      0},
                    276: {0067400,"ble",        B,      SIG,    AEXP,   DBR,    0,      0,      0},
                    277: 
                    278: {0000500,"bchg",0,     0,      AREG+D, DRGL,   AGEN+AL+DA,DEA, 0},
                    279: {0004100,"bchg",0,     0,      AIMM+H, DIM,    AGEN+AL+DA,DEA, 0},
                    280: 
                    281: {0000600,"bclr",0,     0,      AREG+D, DRGL,   AGEN+AL+DA,DEA, 0},
                    282: {0004200,"bclr",0,     0,      AIMM+H, DIM,    AGEN+AL+DA,DEA, 0},
                    283: 
                    284: {0000700,"bset",0,     0,      AREG+D, DRGL,   AGEN+AL+DA,DEA, 0},
                    285: {0004300,"bset",0,     0,      AIMM+H, DIM,    AGEN+AL+DA,DEA, 0},
                    286: 
                    287: {0060400,"bsr",        B,      SIG,    AEXP,   DBR,    0,      0,      0},
                    288: 
                    289: {0000400,"btst",0,     0,      AREG+D, DRGL,   AGEN+DA,DEA,    0},
                    290: {0004000,"btst",0,     0,      AIMM+H, DIM,    AGEN+DA,DEA,    0},
                    291: 
                    292: {0040600,"chk",        W,      SIG,    AGEN,   DEA,    AREG+D, DRGL,   0},
                    293: 
                    294: {0041000,"clr",        BWL,    SD,     AGEN+AL+DA,DEA, 0,      0,      0},
                    295: 
                    296: {0006000,"cmp",        BWL,    SD,     AGEN+AL+DA,DEA, AIMM,   DIM,    0},
                    297: {0130000,"cmp",        BWL,    SD,     AREG+D, DRGL,   AGEN,   DEA,    0},
                    298: {0130300,"cmp",        W,      SIG,    AREG+A, DRGL,   AGEN,   DEA,    0},
                    299: {0130700,"cmp",        L,      SIG,    AREG+A, DRGL,   AGEN,   DEA,    ISL},
                    300: {0130410,"cmp",        BWL,    SD,     AINC,   DRGL,   AINC,   DRG,    0},
                    301: 
                    302: {0050310,"dbt",        0,      0,      AREG+D, DRG,    AEXP,   DBCC,   0},
                    303: {0051310,"dbhi",0,     0,      AREG+D, DRG,    AEXP,   DBCC,   0},
                    304: {0052310,"dbhs",0,     0,      AREG+D, DRG,    AEXP,   DBCC,   0},
                    305: {0053310,"dbne",0,     0,      AREG+D, DRG,    AEXP,   DBCC,   0},
                    306: {0052310,"dbcc",0,     0,      AREG+D, DRG,    AEXP,   DBCC,   0},
                    307: {0054310,"dbvc",0,     0,      AREG+D, DRG,    AEXP,   DBCC,   0},
                    308: {0055310,"dbpl",0,     0,      AREG+D, DRG,    AEXP,   DBCC,   0},
                    309: {0056310,"dbge",0,     0,      AREG+D, DRG,    AEXP,   DBCC,   0},
                    310: {0057310,"dbgt",0,     0,      AREG+D, DRG,    AEXP,   DBCC,   0},
                    311: {0051710,"dbls",0,     0,      AREG+D, DRG,    AEXP,   DBCC,   0},
                    312: {0050710,"dbr",        0,      0,      AREG+D, DRG,    AEXP,   DBCC,   0},
                    313: {0050710,"dbf",        0,      0,      AREG+D, DRG,    AEXP,   DBCC,   0},
                    314: {0050710,"dbra",0,     0,      AREG+D, DRG,    AEXP,   DBCC,   0},
                    315: {0052710,"dblo",0,     0,      AREG+D, DRG,    AEXP,   DBCC,   0},
                    316: {0053710,"dbeq",0,     0,      AREG+D, DRG,    AEXP,   DBCC,   0},
                    317: {0052710,"dbcs",0,     0,      AREG+D, DRG,    AEXP,   DBCC,   0},
                    318: {0054710,"dbvs",0,     0,      AREG+D, DRG,    AEXP,   DBCC,   0},
                    319: {0055710,"dbmi",0,     0,      AREG+D, DRG,    AEXP,   DBCC,   0},
                    320: {0056710,"dblt",0,     0,      AREG+D, DRG,    AEXP,   DBCC,   0},
                    321: {0057710,"dble",0,     0,      AREG+D, DRG,    AEXP,   DBCC,   0},
                    322: 
                    323: {0100700,"divs",W,     SIG,    AGEN+DA,DEA,    AREG+D, DRGL,   0},
                    324: /*
                    325:  * tricky stuff here.  divs.l is really a 3 operand instruction but it can be
                    326:  * parsed as a two operand one, in which case the second argument is copied
                    327:  * in outins() and the remainder is discarded.  honest, read the 68020 manual.
                    328:  */
                    329: {0046100,"divs",L,     SIG,    AGEN+DA,DEA,    AREG+D, D2L,    I2W,    0004000,        AREG+D, D2H},
                    330: {0046100,"divs3",L,    SIG,    AGEN+DA,DEA,    AREG+D, D2L,    I2W,    0004000,        AREG+D, D2H},
                    331: 
                    332: {0046100,"divsl",L,    SIG,    AGEN+DA,DEA,    AREG+D, D2L,    I2W,    0006000,        AREG+D, D2H},
                    333: 
                    334: {0100300,"divu",W,     SIG,    AGEN+DA,DEA,    AREG+D, DRGL,   0},
                    335: {0046100,"divu",L,     SIG,    AGEN+DA,DEA,    AREG+D, D2L,    I2W,    0000000,        AREG+D, D2H},
                    336: {0046100,"divu3",L,    SIG,    AGEN+DA,DEA,    AREG+D, D2L,    I2W,    0000000,        AREG+D, D2H},
                    337: 
                    338: {0046100,"divul",L,    SIG,    AGEN+DA,DEA,    AREG+D, D2L,    I2W,    0002000,        AREG+D, D2H},
                    339: 
                    340: {0005000,"eor",        BWL,    SD,     AIMM,   DIM,    AGEN+AL+DA,DEA, 0},
                    341: {0005074,"eor",        B,      SIG,    AIMM,   DIM,    AREG+C, DIG,    0},
                    342: {0005174,"eor",        W,      SIG,    AIMM,   DIM,    AREG+SR,DIG,    0},
                    343: {0130400,"eor",        BWL,    SD,     AREG+D, DRGL,   AGEN+AL+DA,DEA, 0},
                    344: 
                    345: {0140500,"exg",        0,      0,      AREG+D, DRG,    AREG+D, DRGL,   0},
                    346: {0140510,"exg",        0,      0,      AREG+A, DRG,    AREG+A, DRGL,   0},
                    347: {0140610,"exg",        0,      0,      AREG+A, DRG,    AREG+D, DRGL,   0},
                    348: {0140610,"exg",        0,      0,      AREG+D, DRGL,   AREG+A, DRG,    0},
                    349: 
                    350: {0044200,"ext",        W,      SIG,    AREG+D, DRG,    0,      0,      0},
                    351: {0044300,"ext",        L,      SIG,    AREG+D, DRG,    0,      0,      0},
                    352: {0044700,"extb",L,     SIG,    AREG+D, DRG,    0,      0,      0},
                    353: 
                    354: {0047300,"jmp",        0,      0,      AGEN+CT,DEA,    0,      0,      0},
                    355: 
                    356: {0047200,"jsr",        0,      0,      AGEN+CT,DEA,    0,      0,      0},
                    357: 
                    358: {0040700,"lea",        L,      SIG,    AGEN+CT,DEA,    AREG+A, DRGL,   0},
                    359: 
                    360: {0047120,"link",0,     0,      AREG+A, DRG,    AIMM+H, DIM,    0},
                    361: 
                    362: {0161700,"lsl",        W,      SIG,    AIMM+O, DIG,    AGEN+AM,DEA,    ISH},
                    363: {0160410,"lsl",        BWL,    SD,     AIMM+Q, DAQ,    AREG+D, DRG,    ISH},
                    364: {0160450,"lsl",        BWL,    SD,     AREG+D, DRGL,   AREG+D, DRG,    ISH},
                    365: 
                    366: {0161300,"lsr",        W,      SIG,    AIMM+O, DIG,    AGEN+AM,DEA,    ISH},
                    367: {0160010,"lsr",        BWL,    SD,     AIMM+Q, DAQ,    AREG+D, DRG,    ISH},
                    368: {0160050,"lsr",        BWL,    SD,     AREG+D, DRGL,   AREG+D, DRG,    ISH},
                    369: 
                    370: {0070000,"mov",        L,      SIG,    AIMM+M, DMQ,    AREG+D, DRGL,   0},
                    371: {0030000,"mov",        W,      SIG,    AGEN,   DEA,    AGEN+AL+DA,DEAM,0},
                    372: {0020000,"mov",        L,      SIG,    AGEN,   DEA,    AGEN+AL+DA,DEAM,0},
                    373: {0010000,"mov",        B,      SIG,    AGEN,   DEA,    AGEN+AL+DA,DEAM,0},
                    374: {0030100,"mov",        W,      SIG,    AGEN,   DEA,    AREG+A, DRGL,   0},
                    375: {0020100,"mov",        L,      SIG,    AGEN,   DEA,    AREG+A, DRGL,   ISL},
                    376: {0040300,"mov",        W,      SIG,    AREG+SR,DIG,    AGEN+AL+DA,DEA, 0},
                    377: {0043300,"mov",        W,      SIG,    AGEN+DA,DEA,    AREG+SR,DIG,    0},
                    378: {0042300,"mov",        W,      SIG,    AGEN+DA,DEA,    AREG+C, DIG,    0},
                    379: {0041300,"mov",        W,      SIG,    AREG+C, DIG,    AGEN+AL+DA,DEA, 0},
                    380: {0047140,"mov",        L,      SIG,    AREG+A, DRG,    AREG+U, DIG,    0},
                    381: {0047150,"mov",        L,      SIG,    AREG+U, DIG,    AREG+A, DRG,    0},
                    382: {0047172,"mov",        L,      SIG,    AREG+CR,DCR,    AREG+D, D2H,    I2W,    0000000},
                    383: {0047172,"mov",        L,      SIG,    AREG+CR,DCR,    AREG+A, D2H,    I2W,    0100000},
                    384: {0047173,"mov",        L,      SIG,    AREG+D, D2H,    AREG+CR,DCR,    I2W,    0000000},
                    385: {0047173,"mov",        L,      SIG,    AREG+A, D2H,    AREG+CR,DCR,    I2W,    0100000},
                    386: 
                    387: {0044200,"movm",W,     SIG,    AIMM+H, DIMH,   AGEN+AM,DEA,    0},
                    388: {0044300,"movm",L,     SIG,    AIMM+H, DIMH,   AGEN+AM,DEA,    0},
                    389: {0046200,"movm",W,     SIG,    AGEN+AM,DEA,    AIMM+H, DIMH,   0},
                    390: {0046300,"movm",L,     SIG,    AGEN+AM,DEA,    AIMM+H, DIMH,   0},
                    391: 
                    392: {0007000,"movs",BWL,   SD,     AGEN+AM,DEA,    AREG+D, D2H,    I2W,    0000000},
                    393: {0007000,"movs",BWL,   SD,     AGEN+AM,DEA,    AREG+A, D2H,    I2W,    0100000},
                    394: {0007000,"movs",BWL,   SD,     AREG+D, D2H,    AGEN+AM,DEA,    I2W,    0004000},
                    395: {0007000,"movs",BWL,   SD,     AREG+A, D2H,    AGEN+AM,DEA,    I2W,    0104000},
                    396: 
                    397: /*
                    398:  * more tricky stuff.  D2L and D2H mean low and high register fields of
                    399:  * second instruction word, NOT low and high components of product.
                    400:  * read the manual.
                    401:  */
                    402: {0140700,"muls",W,     SIG,    AGEN+DA,DEA,    AREG+D, DRGL,   0},
                    403: {0046000,"muls",L,     SIG,    AGEN+DA,DEA,    AREG+D, D2H,    I2W,    0004000},
                    404: {0046000,"mulsl",L,    SIG,    AGEN+DA,DEA,    AREG+D, D2L,    I2W,    0006000,        AREG+D, D2H},
                    405: 
                    406: {0140300,"mulu",W,     SIG,    AGEN+DA,DEA,    AREG+D, DRGL,   0},
                    407: {0046000,"mulu",L,     SIG,    AGEN+DA,DEA,    AREG+D, D2H,    I2W,    0000000},
                    408: {0046000,"mulul",L,    SIG,    AGEN+DA,DEA,    AREG+D, D2L,    I2W,    0002000,        AREG+D, D2H},
                    409: 
                    410: {0044000,"nbcd",B,     SIG,    AGEN+AL+DA,DEA, 0,      0,      0},
                    411: 
                    412: {0042000,"neg",        BWL,    SD,     AGEN+AL+DA,DEA, 0,      0,      0},
                    413: 
                    414: {0040000,"negx",BWL,   SD,     AGEN+AL+DA,DEA, 0,      0,      0},
                    415: 
                    416: {0047161,"nop",        0,      0,      0,      0,      0,      0,      0},
                    417: 
                    418: {0043000,"not",        BWL,    SD,     AGEN+AL+DA,DEA, 0,      0,      0},
                    419: 
                    420: {0000174,"or", W,      SIG,    AIMM,   DIM,    AREG+SR,DIG,    0},
                    421: {0000074,"or", B,      SIG,    AIMM,   DIM,    AREG+C, DIG,    0},
                    422: {0000000,"or", BWL,    SD,     AIMM,   DIM,    AGEN+AL+DA,DEA, 0},
                    423: {0100000,"or", BWL,    SD,     AGEN+DA,DEA,    AREG+D, DRGL,   0},
                    424: {0100400,"or", BWL,    SD,     AREG+D, DRGL,   AGEN+AM,DEA,    0},
                    425: 
                    426: {0100500,"pack",0,     0,      AREG+D, DRG,    AREG+D, DRGL,   0,      0,      AIMM+H, DIMH},
                    427: {0100510,"pack",0,     0,      ADEC,   DRG,    ADEC,   DRGL,   0,      0,      AIMM+H, DIMH},
                    428: {0100600,"unpk",0,     0,      AREG+D, DRG,    AREG+D, DRGL,   0,      0,      AIMM+H, DIMH},
                    429: {0100610,"unpk",0,     0,      ADEC,   DRG,    ADEC,   DRGL,   0,      0,      AIMM+H, DIMH},
                    430: 
                    431: {0044100,"swap",W,     SIG,    AREG+D, DRG,    0,      0,      0},
                    432: {0044100,"pea",        L,      SIG,    AGEN+CT,DEA,    0,      0,      0},
                    433: 
                    434: {0047160,"reset",0,    0,      0,      0,      0,      0,      0},
                    435: 
                    436: {0163700,"rol",        W,      SIG,    AIMM+O, DIG,    AGEN+AM,DEA,    ISH},
                    437: {0160430,"rol",        BWL,    SD,     AIMM+Q, DAQ,    AREG+D, DRG,    ISH},
                    438: {0160470,"rol",        BWL,    SD,     AREG+D, DRGL,   AREG+D, DRG,    ISH},
                    439: 
                    440: {0163300,"ror",        W,      SIG,    AIMM+O, DIG,    AGEN+AM,DEA,    ISH},
                    441: {0160030,"ror",        BWL,    SD,     AIMM+Q, DAQ,    AREG+D, DRG,    ISH},
                    442: {0160070,"ror",        BWL,    SD,     AREG+D, DRGL,   AREG+D, DRG,    ISH},
                    443: 
                    444: {0162700,"roxl",W,     SIG,    AIMM+O, DIG,    AGEN+AM,DEA,    ISH},
                    445: {0160420,"roxl",BWL,   SD,     AIMM+Q, DAQ,    AREG+D, DRG,    ISH},
                    446: {0160460,"roxl",BWL,   SD,     AREG+D, DRGL,   AREG+D, DRG,    ISH},
                    447: 
                    448: {0162300,"roxr",W,     SIG,    AIMM+O, DIG,    AGEN+AM,DEA,    ISH},
                    449: {0160020,"roxr",BWL,   SD,     AIMM+Q, DAQ,    AREG+D, DRG,    ISH},
                    450: {0160060,"roxr",BWL,   SD,     AREG+D, DRGL,   AREG+D, DRG,    ISH},
                    451: 
                    452: {0047163,"rte",        0,      0,      0,      0,      0,      0,      0},
                    453: 
                    454: {0047167,"rtr",        0,      0,      0,      0,      0,      0,      0},
                    455: 
                    456: {0047165,"rts",        0,      0,      0,      0,      0,      0,      0},
                    457: 
                    458: {0100400,"sbcd",B,     SIG,    AREG+D, DRG,    AREG+D, DRGL,   0},
                    459: {0100410,"sbcd",B,     SIG,    ADEC,   DRG,    ADEC,   DRGL,   0},
                    460: 
                    461: {0050300,"st", B,      SIG,    AGEN+AL+DA,DEA, 0,      0,      0},
                    462: {0051300,"shi",        B,      SIG,    AGEN+AL+DA,DEA, 0,      0,      0},
                    463: {0052300,"shs",        B,      SIG,    AGEN+AL+DA,DEA, 0,      0,      0},
                    464: {0053300,"sne",        B,      SIG,    AGEN+AL+DA,DEA, 0,      0,      0},
                    465: {0052300,"scc",        B,      SIG,    AGEN+AL+DA,DEA, 0,      0,      0},
                    466: {0054300,"svc",        B,      SIG,    AGEN+AL+DA,DEA, 0,      0,      0},
                    467: {0055300,"spl",        B,      SIG,    AGEN+AL+DA,DEA, 0,      0,      0},
                    468: {0056300,"sge",        B,      SIG,    AGEN+AL+DA,DEA, 0,      0,      0},
                    469: {0057300,"sgt",        B,      SIG,    AGEN+AL+DA,DEA, 0,      0,      0},
                    470: {0050700,"sf", B,      SIG,    AGEN+AL+DA,DEA, 0,      0,      0},
                    471: {0051700,"sls",        B,      SIG,    AGEN+AL+DA,DEA, 0,      0,      0},
                    472: {0052700,"slo",        B,      SIG,    AGEN+AL+DA,DEA, 0,      0,      0},
                    473: {0053700,"seq",        B,      SIG,    AGEN+AL+DA,DEA, 0,      0,      0},
                    474: {0052700,"scs",        B,      SIG,    AGEN+AL+DA,DEA, 0,      0,      0},
                    475: {0054700,"svs",        B,      SIG,    AGEN+AL+DA,DEA, 0,      0,      0},
                    476: {0055700,"smi",        B,      SIG,    AGEN+AL+DA,DEA, 0,      0,      0},
                    477: {0056700,"slt",        B,      SIG,    AGEN+AL+DA,DEA, 0,      0,      0},
                    478: {0057700,"sle",        B,      SIG,    AGEN+AL+DA,DEA, 0,      0,      0},
                    479: 
                    480: {0047162,"stop",0,     0,      AIMM+H, DIMH,   0,      0,      0},
                    481: 
                    482: {0050400,"sub",        BWL,    SD,     AIMM+Q, DAQ,    AGEN+AL,DEA,    0},
                    483: {0002000,"sub",        BWL,    SD,     AIMM,   DIM,    AGEN+AL+DA,DEA, 0},
                    484: {0110000,"sub",        BWL,    SD,     AGEN,   DEA,    AREG+D, DRGL,   0},
                    485: {0110400,"sub",        BWL,    SD,     AREG+D, DRGL,   AGEN+AM,DEA,    0},
                    486: {0110300,"sub",        W,      SIG,    AGEN,   DEA,    AREG+A, DRGL,   0},
                    487: {0110700,"sub",        L,      SIG,    AGEN,   DEA,    AREG+A, DRGL,   ISL},
                    488: 
                    489: {0110400,"subx",BWL,   SD,     AREG+D, DRG,    AREG+D, DRGL,   0},
                    490: {0110410,"subx",BWL,   SD,     ADEC,   DRG,    ADEC,   DRGL,   0},
                    491: 
                    492: {0045300,"tas",        B,      SIG,    AGEN+AL+DA,DEA, 0,      0,      0},
                    493: 
                    494: {0047100,"trap",0,     0,      AIMM+V, DMQ,    0,      0,      0},
                    495: 
                    496: {0047166,"trapv",0,    0,      0,      0,      0,      0,      0},
                    497: 
                    498: {0045000,"tst",        BWL,    SD,     AGEN+AL+DA,     DEA,    0,      0,      0},
                    499: 
                    500: {0047130,"unlk",0,     0,      AREG+A, DRG,    0,      0,      0},
                    501: {0, 0},
                    502: };
                    503: 
                    504: char *M68kInstr::mnemonic()
                    505: {
                    506:        opword0 = _asm->core->peekcode(addr)->sht;
                    507:        opword1 = _asm->core->peekcode(next = addr+2)->sht;
                    508:        for( tab = M68kOpTab; tab->opname; ++tab ){
                    509:                short m = sizemask();
                    510:                m |= OpMask[tab->a1disp&15] | OpMask[tab->a2disp&15];
                    511:                if( (unsigned short)(opword0 & ~m) == tab->opcode ){
                    512:                        next += imm_bytes(tab->addr1, tab->a1disp)
                    513:                              + imm_bytes(tab->addr2, tab->a2disp);
                    514:                        if( tab->iflag == I2W ) next = addr+4;
                    515:                        return sf("%s%s", tab->opname, dotbwl());
                    516:                }
                    517:        }
                    518:        return sf("0%o", opword0);
                    519: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.