Annotation of researchv9/jtools/src/pi/m68kasm.c, revision 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.