|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.