Annotation of frontvm/hardware/disasm.c, revision 1.1

1.1     ! root        1: 
        !             2: #include <stdio.h>
        !             3: #include <stdlib.h>
        !             4: #include <string.h>
        !             5: #include <stdarg.h>
        !             6: 
        !             7: #include <SDL_types.h>
        !             8: 
        !             9: #include "main.h"
        !            10: #include "decode.h"
        !            11: #include "dialog.h"
        !            12: #include "file.h"
        !            13: #include "m68000.h"
        !            14: #include "memAlloc.h"
        !            15: #include "stMemory.h"
        !            16: 
        !            17: static int buf_pos = 0;
        !            18: 
        !            19: static void output (const char *format, ...)
        !            20: {
        !            21:        va_list argptr;
        !            22: 
        !            23:        va_start (argptr, format);
        !            24:        vprintf (format, argptr);
        !            25:        va_end (argptr);
        !            26: }
        !            27: 
        !            28: static void output_lab (int addr)
        !            29: {
        !            30:        printf ("$%x", addr);
        !            31: }
        !            32: 
        !            33: unsigned char rd_byte(void)
        !            34: {
        !            35:        int val = STMemory_ReadByte (buf_pos);
        !            36:        buf_pos++;
        !            37:        return val;
        !            38: }
        !            39: 
        !            40: short rd_short(void)
        !            41: {
        !            42:        short val = STMemory_ReadWord (buf_pos);
        !            43:        buf_pos+=2;
        !            44:        return val;
        !            45: }
        !            46: 
        !            47: int rd_int(void)
        !            48: {
        !            49:        int val = STMemory_ReadLong (buf_pos);
        !            50:        buf_pos+=4;
        !            51:        return val;
        !            52: }
        !            53: 
        !            54: const char *size_str[4] = { ".b", ".w", ".l", ".?" };
        !            55: /* to convert weird move sizes to standard sizes */
        !            56: const int move_size[4] = { 3, 0, 2, 1 };
        !            57: const char *Bcc_str[16] = {
        !            58:        NULL,NULL,"hi","ls","cc","cs","ne","eq",
        !            59:        "vc","vs","pl","mi","ge","lt","gt","le"
        !            60: };
        !            61: 
        !            62: const char *DBcc_str[16] = {
        !            63:        "t","ra","hi","ls","cc","cs","ne","eq",
        !            64:        "vc","vs","pl","mi","ge","lt","gt","le"
        !            65: };
        !            66: 
        !            67: typedef union Opcode {
        !            68:        unsigned short code;
        !            69:        struct move {
        !            70:                uint src_reg : 3;
        !            71:                uint src_mode : 3;
        !            72:                uint dest_mode : 3;
        !            73:                uint dest_reg : 3;
        !            74:                uint size : 2;
        !            75:                uint op : 2;
        !            76:        } move;
        !            77:        struct adr_index {
        !            78:                int displacement : 8;
        !            79:                uint zeros : 3;
        !            80:                uint ind_size : 1;
        !            81:                uint reg : 3;
        !            82:                uint reg_type : 1;
        !            83:        } adr_index;
        !            84:        struct addq {
        !            85:                uint dest_reg : 3;
        !            86:                uint dest_mode : 3;
        !            87:                uint size : 2;
        !            88:                uint issub : 1;
        !            89:                uint data : 3;
        !            90:                uint op : 4;
        !            91:        } addq;
        !            92:        struct jmp {
        !            93:                uint dest_reg : 3;
        !            94:                uint dest_mode : 3;
        !            95:                uint op : 10;
        !            96:        } jmp;
        !            97:        struct addi {
        !            98:                uint dest_reg : 3;
        !            99:                uint dest_mode : 3;
        !           100:                uint size : 2;
        !           101:                uint OP6 : 8;
        !           102:        } addi;
        !           103:        /* size and effective address */
        !           104:        struct type1 {
        !           105:                uint ea_reg : 3;
        !           106:                uint ea_mode : 3;
        !           107:                uint size : 2;
        !           108:                uint op : 8;
        !           109:        } type1;
        !           110:        /* reg, opmode, ea */
        !           111:        struct type2 {
        !           112:                uint ea_reg : 3;
        !           113:                uint ea_mode : 3;
        !           114:                uint op_mode : 3;
        !           115:                uint reg : 3;
        !           116:                uint op : 4;
        !           117:        } type2;
        !           118:        struct MemShift {
        !           119:                uint ea_reg : 3;
        !           120:                uint ea_mode : 3;
        !           121:                uint OP3 : 2;
        !           122:                uint dr : 1;
        !           123:                uint type : 2;
        !           124:                uint OP0x1c : 5;
        !           125:        } MemShift;
        !           126:        struct ASx {
        !           127:                uint reg : 3;
        !           128:                uint OP0 : 2;
        !           129:                uint ir : 1;
        !           130:                uint size : 2;
        !           131:                uint dr : 1;
        !           132:                uint count_reg : 3;
        !           133:                uint OP0xe : 4;
        !           134:        } ASx;
        !           135:        struct abcd {
        !           136:                uint src_reg : 3;
        !           137:                uint rm : 1;
        !           138:                uint OP16 : 5;
        !           139:                uint dest_reg : 3;
        !           140:                uint OP12 : 4;
        !           141:        } abcd;
        !           142:        struct addx {
        !           143:                uint src_reg : 3;
        !           144:                uint rm : 1;
        !           145:                uint OP0 : 2;
        !           146:                uint size : 2;
        !           147:                uint OP1 : 1;
        !           148:                uint dest_reg : 3;
        !           149:                uint op : 4;
        !           150:        } addx;
        !           151:        struct cmpm {
        !           152:                uint src_reg : 3;
        !           153:                uint OP1_1 : 3;
        !           154:                uint size : 2;
        !           155:                uint OP2_1 : 1;
        !           156:                uint dest_reg : 3;
        !           157:                uint OP0xb : 4;
        !           158:        } cmpm;
        !           159:        /* branches */
        !           160:        struct DBcc {
        !           161:                uint reg : 3;
        !           162:                uint OP25 : 5;
        !           163:                uint cond : 4;
        !           164:                uint OP5 : 4;
        !           165:        } DBcc;
        !           166:        struct Bcc {
        !           167:                int displacement : 8;
        !           168:                uint cond : 4;
        !           169:                uint op : 4;
        !           170:        } Bcc;
        !           171:        struct bra {
        !           172:                int displacement : 8;
        !           173:                uint op : 8;
        !           174:        } bra;
        !           175:        struct movem {
        !           176:                uint dest_reg : 3;
        !           177:                uint dest_mode : 3;
        !           178:                uint sz : 1;
        !           179:                uint ONE : 3;
        !           180:                uint dr : 1;
        !           181:                uint NINE : 5;
        !           182:        } movem;
        !           183:        struct lea {
        !           184:                uint dest_reg : 3;
        !           185:                uint dest_mode : 3;
        !           186:                uint SEVEN : 3;
        !           187:                uint reg : 3;
        !           188:                uint FOUR : 4;
        !           189:        } lea;
        !           190:        struct moveq {
        !           191:                int data : 8;
        !           192:                uint ZERO : 1;
        !           193:                uint reg : 3;
        !           194:                uint SEVEN : 4;
        !           195:        } moveq;
        !           196:        struct exg {
        !           197:                uint dest_reg : 3;
        !           198:                uint op_mode : 5;
        !           199:                uint OP1 : 1;
        !           200:                uint src_reg : 3;
        !           201:                uint OP0xc : 4;
        !           202:        } exg;
        !           203: } Opcode;
        !           204: 
        !           205: /*
        !           206:  * Skip size is used when there is immediate data, for addressing
        !           207:  * modes $addr(Ax,Dy.s), and the PC flavoured version of that.
        !           208:  * The immediate data comes first and must be skipped
        !           209:  */
        !           210: int is_adrmod (int mode, int reg, int op_size, int skip_size)
        !           211: {
        !           212:        Opcode ext;
        !           213:        switch (skip_size) {
        !           214:                case -1: skip_size = 0; break;
        !           215:                case  0: case 1: skip_size = 2; break;
        !           216:                default: skip_size = 4; break;
        !           217:        }
        !           218:        switch (mode) {
        !           219:                case 0: case 1: case 2: case 3: case 4:
        !           220:                        return 1;
        !           221:                case 5: return 1;
        !           222:                case 6: buf_pos += skip_size;
        !           223:                        ext.code = rd_short ();
        !           224:                        buf_pos -= 2 + skip_size;
        !           225:                        if (ext.adr_index.zeros != 0) return 0;
        !           226:                        else return 1;
        !           227:                case 7: 
        !           228:                        switch (reg) {
        !           229:                                case 0: return 1;
        !           230:                                case 1: return 1;
        !           231:                                case 4:
        !           232:                                        return 1;
        !           233:                                case 2:
        !           234:                                        return 1;
        !           235:                                case 3: buf_pos += skip_size;
        !           236:                                        ext.code = rd_short ();
        !           237:                                        buf_pos -= 2 + skip_size;
        !           238:                                        if (ext.adr_index.zeros != 0) return 0;
        !           239:                                        else return 1;
        !           240:                                default:
        !           241:                                        return 0;
        !           242:                        }
        !           243:                        break;
        !           244:                default:
        !           245:                        return 0;
        !           246:        }
        !           247:                        
        !           248: }
        !           249: 
        !           250: /* returns abs address if possible or 0xdeadbeef if not */
        !           251: uint put_adrmod (int mode, int reg, int op_size)
        !           252: {
        !           253:        uint temp;
        !           254:        Opcode ext;
        !           255:        switch (mode) {
        !           256:                case 0: output ("d%d", reg); break;
        !           257:                case 1: output ("a%d", reg); break;
        !           258:                case 2: output ("(a%d)", reg); break;
        !           259:                case 3: output ("(a%d)+", reg); break;
        !           260:                case 4: output ("-(a%d)", reg); break;
        !           261:                case 5: output ("%hd(a%d)", rd_short(), reg); break;
        !           262:                case 6: ext.code = rd_short ();
        !           263:                        if (ext.adr_index.zeros != 0) output ("???");
        !           264:                        output ("%hd(a%d,", ext.adr_index.displacement, reg);
        !           265:                        if (ext.adr_index.reg_type) {
        !           266:                                output ("a%d", ext.adr_index.reg);
        !           267:                        } else {
        !           268:                                output ("d%d", ext.adr_index.reg);
        !           269:                        }
        !           270:                        if (ext.adr_index.ind_size) {
        !           271:                                output (".l)");
        !           272:                        } else {
        !           273:                                output (".w)");
        !           274:                        }
        !           275:                        break;
        !           276:                case 7: 
        !           277:                        switch (reg) {
        !           278:                                case 0: output ("$%hx.w", rd_short()); break;
        !           279:                                case 1: temp = rd_int ();
        !           280:                                        output ("$%x.l", temp);
        !           281:                                        return temp;
        !           282:                                case 4:
        !           283:                                        if (op_size == 0) {
        !           284:                                                if (rd_byte () != 0) output ("???");
        !           285:                                                output ("#$%x", rd_byte ());
        !           286:                                        } else if (op_size == 2) {
        !           287:                                                output ("#");
        !           288:                                                output ("$%x", rd_int ());
        !           289:                                        } else if (op_size == 1) {
        !           290:                                                output ("#$%hx", rd_short ());
        !           291:                                        } else {
        !           292:                                                output ("#???");
        !           293:                                        }
        !           294:                                        break;
        !           295:                                case 2:
        !           296:                                        temp = buf_pos;
        !           297:                                        temp += rd_short ();
        !           298:                                        output ("$%x(pc)", temp);
        !           299:                                        return temp;
        !           300:                                case 3: temp = buf_pos;
        !           301:                                        ext.code = rd_short ();
        !           302:                                        if (ext.adr_index.zeros != 0) output ("???");
        !           303:                                        output ("$%x", temp + ext.adr_index.displacement);
        !           304:                                        if (ext.adr_index.reg_type) {
        !           305:                                                output ("(pc,a%d", ext.adr_index.reg);
        !           306:                                        } else {
        !           307:                                                output ("(pc,d%d", ext.adr_index.reg);
        !           308:                                        }
        !           309:                                        if (ext.adr_index.ind_size) {
        !           310:                                                output (".l)");
        !           311:                                        } else {
        !           312:                                                output (".w)");
        !           313:                                        }
        !           314:                                        break;
        !           315:                                default:
        !           316:                                        output ("???"); break;
        !           317:                        }
        !           318:                        break;
        !           319:                default:
        !           320:                        output ("???"); break;
        !           321:        }
        !           322:        return 0xdeadbeef;
        !           323: }
        !           324: 
        !           325: void aux_put_movem_regs (int mode, int low, int high)
        !           326: {
        !           327:        if (!mode) {
        !           328:                /* (Ax)+ and control modes */
        !           329:                if (low < 8) {
        !           330:                        if (low == high) {
        !           331:                                output ("d%d", low);
        !           332:                                return;
        !           333:                        }
        !           334:                        if (high >7) {
        !           335:                                if (low == 7) output ("d7/");
        !           336:                                else output ("d%d-7/", low);
        !           337:                        } else {
        !           338:                                output ("d%d-%d", low, high);
        !           339:                                return;
        !           340:                        }
        !           341:                }
        !           342:                if (high > 7) {
        !           343:                        if (low == high) {
        !           344:                                output ("a%d", low-8);
        !           345:                                return;
        !           346:                        }
        !           347:                        if (low > 7) {
        !           348:                                output ("a%d-%d", low-8, high-8);
        !           349:                        } else {
        !           350:                                if (high == 8) output ("a0");
        !           351:                                else output ("a0-%d", high-8);
        !           352:                        }
        !           353:                }
        !           354:        } else {
        !           355:                /* -(Ax) mode */
        !           356:                if (high > 7) {
        !           357:                        if (low == high) {
        !           358:                                output ("d%d", 15-low);
        !           359:                                return;
        !           360:                        }
        !           361:                        if (low > 7) {
        !           362:                                output ("d%d-%d", 15-high, 15-low);
        !           363:                                return;
        !           364:                        } else {
        !           365:                                if (high == 8) output ("d7/");
        !           366:                                else output ("d%d-7/", 15-high);
        !           367:                        }
        !           368:                }
        !           369:                if (low < 8) {
        !           370:                        if (low == high) {
        !           371:                                output ("a%d", 7-low);
        !           372:                                return;
        !           373:                        }
        !           374:                        if (high >7) {
        !           375:                                if (low == 7) output ("a0");
        !           376:                                else output ("a0-%d", 7-low);
        !           377:                        } else {
        !           378:                                output ("a%d-%d", 7-high, 7-low);
        !           379:                        }
        !           380:                }
        !           381:        }
        !           382: }
        !           383: 
        !           384: void put_movem_regs (int mask, int mode)
        !           385: {
        !           386:        int start;
        !           387:        int pos;
        !           388:        int pixie = 0;
        !           389: 
        !           390:        start = -1;
        !           391:        for (pos=0; pos < 16; pos++) {
        !           392:                if ((mask & (1<<pos)) && (start == -1)) start = pos;
        !           393:                else if ((!(mask & (1<<pos))) && (start != -1)) {
        !           394:                        if (pixie) output ("/");
        !           395:                        else pixie = 1;
        !           396:                        aux_put_movem_regs (mode, start, pos-1);
        !           397:                        start = -1;
        !           398:                }
        !           399:        }
        !           400:        if (mask & (1<<15)) {
        !           401:                if (pixie) output ("/");
        !           402:                else pixie = 1;
        !           403:                aux_put_movem_regs (mode, start, pos-1);
        !           404:                start = -1;
        !           405:        }
        !           406: }
        !           407: 
        !           408: void put_imm (int size)
        !           409: {
        !           410:        if (size == 0) {
        !           411:                rd_byte ();
        !           412:                output ("#$%x", (int)rd_byte ());
        !           413:        } else if (size == 1) {
        !           414:                output ("#$%hx", (int)rd_short ());
        !           415:        } else {
        !           416:                output ("#$%x", (int)rd_int ());
        !           417:        }
        !           418: }
        !           419: 
        !           420: /*
        !           421:  * Disassemble _count bytes from _start.
        !           422:  */
        !           423: void dump_code (int _start, int _count)
        !           424: {
        !           425:        Opcode op;
        !           426:        int size;
        !           427:        int temp;
        !           428:        const char *str;
        !           429:        int last_ip;
        !           430:        buf_pos = _start;
        !           431: 
        !           432:        while (buf_pos < _start+_count) {
        !           433:                output ("\r\n$%x\t", buf_pos);
        !           434:                last_ip = buf_pos;
        !           435:                op.code = rd_short ();
        !           436:                output ("($%hx)\t", op.code);
        !           437:                /* ABCD/SBCD */
        !           438:                while (op.abcd.OP16 == 16) {
        !           439:                        if (op.abcd.OP12 == 12) output ("abcd\t");
        !           440:                        else if (op.abcd.OP12 == 8) output ("sbcd\t");
        !           441:                        else break;
        !           442:                        if (op.abcd.rm) {
        !           443:                                output ("-(a%d),-(a%d)", op.abcd.src_reg, op.abcd.dest_reg);
        !           444:                        } else {
        !           445:                                output ("d%d,d%d", op.abcd.src_reg, op.abcd.dest_reg);
        !           446:                        }
        !           447:                        goto done;
        !           448:                }
        !           449:                /* ADD/SUB */
        !           450:                while ((op.type2.op == 0xd) || (op.type2.op == 0x9)) {
        !           451:                        if (op.type2.op == 0xd) str = "add";
        !           452:                        else str = "sub";
        !           453:                        if (op.type2.op_mode == 3) {
        !           454:                                /* ADDA.W */
        !           455:                                if (!is_adrmod (op.type2.ea_mode, op.type2.ea_reg, 1, -1)) break;
        !           456:                                output ("%sa.w\t", str);
        !           457:                                put_adrmod (op.type2.ea_mode, op.type2.ea_reg, 1);
        !           458:                                output (",a%d", op.type2.reg);
        !           459:                        }
        !           460:                        else if (op.type2.op_mode == 7) {
        !           461:                                /* ADDA.L */
        !           462:                                if (!is_adrmod (op.type2.ea_mode, op.type2.ea_reg, 2, -1)) break;
        !           463:                                output ("%sa.l\t", str);
        !           464:                                put_adrmod (op.type2.ea_mode, op.type2.ea_reg, 2);
        !           465:                                output (",a%d", op.type2.reg);
        !           466:                        }
        !           467:                        else if (op.type2.op_mode < 3) {
        !           468:                                /* dest is reg */
        !           469:                                /* no .b size Ax sources */
        !           470:                                if ((op.type2.op_mode == 0) && (op.type2.ea_mode == 0x1)) break;
        !           471:                                if (!is_adrmod (op.type2.ea_mode, op.type2.ea_reg, op.type2.op_mode, -1)) break;
        !           472:                                output ("%s%s\t", str, size_str[op.type2.op_mode]);
        !           473:                                put_adrmod (op.type2.ea_mode, op.type2.ea_reg, op.type2.op_mode);
        !           474:                                output (",d%d", op.type2.reg);
        !           475:                        } else {
        !           476:                                /* dest is ea */
        !           477:                                if (op.type2.ea_mode == 0x0) break;
        !           478:                                if (op.type2.ea_mode == 0x1) break;
        !           479:                                if (op.type2.ea_mode == 0x7) {
        !           480:                                        if ((op.type2.ea_reg == 2) ||
        !           481:                                            (op.type2.ea_reg == 3) ||
        !           482:                                            (op.type2.ea_reg == 4)) break;
        !           483:                                }
        !           484:                                if (!is_adrmod (op.type2.ea_mode, op.type2.ea_reg, op.type2.op_mode-4, -1)) break;
        !           485:                                output ("%s%s\t", str, size_str[op.type2.op_mode-4]);
        !           486:                                output ("d%d,", op.type2.reg);
        !           487:                                put_adrmod (op.type2.ea_mode, op.type2.ea_reg, op.type2.op_mode-4);
        !           488:                        }
        !           489:                        goto done;
        !           490:                }
        !           491:                /* ADDI/SUBI */
        !           492:                while ((op.addi.OP6 == 6) || (op.addi.OP6 == 4)) {
        !           493:                        if (op.addi.size == 3) break;
        !           494:                        if (op.addi.dest_mode == 0x1) break;
        !           495:                        if (op.addi.dest_mode == 0x7) {
        !           496:                                if ((op.addi.dest_reg == 2) ||
        !           497:                                    (op.addi.dest_reg == 3) ||
        !           498:                                    (op.addi.dest_reg == 4)) break;
        !           499:                        }
        !           500:                        if (!is_adrmod (op.addi.dest_mode, op.addi.dest_reg, op.addi.size, op.addi.size)) break;
        !           501:                        if (op.addi.OP6 == 6) output ("addi%s\t", size_str[op.addi.size]);
        !           502:                        else output ("subi%s\t", size_str[op.addi.size]);
        !           503:                        put_imm (op.addi.size);
        !           504:                        output (",");
        !           505:                        put_adrmod (op.addi.dest_mode, op.addi.dest_reg, op.addi.size);
        !           506:                        goto done;
        !           507:                }
        !           508:                /* ADDQ/SUBQ */
        !           509:                while (op.addq.op == 0x5) {
        !           510:                        if (op.addq.size == 3) break;
        !           511:                        /* no immediate or pc relative dest */
        !           512:                        if (op.addq.dest_mode == 0x7) {
        !           513:                                if (op.addq.dest_reg > 0x1) break;
        !           514:                        }
        !           515:                        /* no addq.b to address registers */
        !           516:                        if ((op.addq.size == 0) && (op.addq.dest_mode == 1)) break;
        !           517:                        if (!is_adrmod (op.addq.dest_mode, op.addq.dest_reg, op.addq.size, -1)) break;
        !           518:                        if (op.addq.issub) output ("subq%s\t", size_str[op.addq.size]);
        !           519:                        else output ("addq%s\t", size_str[op.addq.size]);
        !           520:                        output ("#%d,", (op.addq.data == 0 ? 8 : op.addq.data));
        !           521:                        put_adrmod (op.addq.dest_mode, op.addq.dest_reg, op.addq.size);
        !           522:                        goto done;
        !           523:                }
        !           524:                /* ADDX/SUBX */
        !           525:                while (((op.addx.op == 0xd) || (op.addx.op == 0x9)) && (op.addx.OP1 == 1) && (op.addx.OP0 == 0)) {
        !           526:                        if (op.addx.size == 3) break;
        !           527:                        if (op.addx.op == 0xd) output ("addx%s\t", size_str[op.addx.size]);
        !           528:                        else output ("subx%s\t", size_str[op.addx.size]);
        !           529:                        if (op.addx.rm) {
        !           530:                                /* memory to memory */
        !           531:                                output ("-(a%d),-(a%d)", op.addx.src_reg, op.addx.dest_reg);
        !           532:                        } else {
        !           533:                                output ("d%d,d%d", op.addx.src_reg, op.addx.dest_reg);
        !           534:                        }
        !           535: 
        !           536:                        goto done;
        !           537:                }
        !           538:                /* AND/OR */
        !           539:                while ((op.type2.op == 0xc) || (op.type2.op == 0x8)) {
        !           540:                        if (op.type2.op_mode == 3) break;
        !           541:                        if (op.type2.op_mode == 7) break;
        !           542:                        if (op.type2.op == 0xc) str = "and";
        !           543:                        else str = "or";
        !           544:                        if (op.type2.op_mode < 3) {
        !           545:                                /* dest is reg */
        !           546:                                if (op.type2.ea_mode == 0x1) break;
        !           547:                                if (!is_adrmod (op.type2.ea_mode, op.type2.ea_reg, op.type2.op_mode, -1)) break;
        !           548:                                output ("%s%s\t", str, size_str[op.type2.op_mode]);
        !           549:                                put_adrmod (op.type2.ea_mode, op.type2.ea_reg, op.type2.op_mode);
        !           550:                                output (",d%d", op.type2.reg);
        !           551:                        } else {
        !           552:                                /* dest is ea */
        !           553:                                if (op.type2.ea_mode == 0x0) break;
        !           554:                                if (op.type2.ea_mode == 0x1) break;
        !           555:                                if (op.type2.ea_mode == 0x7) {
        !           556:                                        if (op.type2.ea_reg > 1) break;
        !           557:                                }
        !           558:                                if (!is_adrmod (op.type2.ea_mode, op.type2.ea_reg, op.type2.op_mode-4, -1)) break;
        !           559:                                output ("%s%s\t", str, size_str[op.type2.op_mode-4]);
        !           560:                                output ("d%d,", op.type2.reg);
        !           561:                                put_adrmod (op.type2.ea_mode, op.type2.ea_reg, op.type2.op_mode-4);
        !           562:                        }
        !           563:                        goto done;
        !           564:                }
        !           565:                /* ANDI/EORI/ORI */
        !           566:                while ((op.type1.op == 0x02) || (op.type1.op == 0xa) || (op.type1.op == 0x0)) {
        !           567:                        if (op.type1.size == 3) break;
        !           568:                        /* no address reg direct */
        !           569:                        if (op.type1.ea_mode == 0x1) break;
        !           570:                        /* no immediate or pc relative dest */
        !           571:                        if (op.type1.ea_mode == 0x7) {
        !           572:                                if (op.type1.ea_reg > 0x1) break;
        !           573:                        }
        !           574:                        if (!is_adrmod (op.type1.ea_mode, op.type1.ea_reg, op.type1.size, op.type1.size)) break;
        !           575:                        if (op.type1.op == 0x2) output ("andi%s\t", size_str[op.type1.size]);
        !           576:                        else if (op.type1.op == 0xa) output ("eori%s\t", size_str[op.type1.size]);
        !           577:                        else output ("ori%s\t", size_str[op.type1.size]);
        !           578:                        put_imm (op.addi.size);
        !           579:                        output (",");
        !           580:                        put_adrmod (op.type1.ea_mode, op.type1.ea_reg, op.type1.size);
        !           581:                        goto done;
        !           582:                }
        !           583:                /* ANDI to CCR */
        !           584:                while (op.code == 0x023c) {
        !           585:                        rd_byte ();
        !           586:                        output ("andi\t#$%x,ccr", rd_byte ());
        !           587:                        goto done;
        !           588:                }
        !           589:                /* ANDI to SR */
        !           590:                while (op.code == 0x027c) {
        !           591:                        output ("andi\t#$%hx,sr", rd_short ());
        !           592:                        goto done;
        !           593:                }
        !           594:                /* ASx/LSx reg/imm */
        !           595:                while (op.ASx.OP0xe == 0xe) {
        !           596:                        if (op.ASx.size == 3) break;
        !           597:                        switch (op.ASx.OP0) {
        !           598:                                case 0: str = "as"; break;
        !           599:                                case 1: str = "ls"; break;
        !           600:                                case 2: str = "rox"; break;
        !           601:                                default: case 3: str = "ro"; break;
        !           602:                        }
        !           603:                        if (op.ASx.ir) {
        !           604:                                /* data register shift */
        !           605:                                output ("%s%c%s\td%d,d%d", str,
        !           606:                                                (op.ASx.dr ? 'l' : 'r'),
        !           607:                                                size_str[op.ASx.size],
        !           608:                                                op.ASx.count_reg, op.ASx.reg);
        !           609:                        } else {
        !           610:                                /* count shift thingy */
        !           611:                                output ("%s%c%s\t#%d,d%d", str,
        !           612:                                                (op.ASx.dr ? 'l' : 'r'),
        !           613:                                                size_str[op.ASx.size],
        !           614:                                                (op.ASx.count_reg == 0 ? 8 : op.ASx.count_reg),
        !           615:                                                op.ASx.reg);
        !           616:                        }
        !           617:                        goto done;
        !           618:                }
        !           619:                /* ASx/LSx memory shift */
        !           620:                while ((op.MemShift.OP3 == 3) && (op.MemShift.OP0x1c == 0x1c)) {
        !           621:                        if (op.type1.ea_mode < 0x2) break;
        !           622:                        if ((op.type1.ea_mode == 0x7) && (op.type1.ea_reg > 0x1)) break;
        !           623:                        if (!is_adrmod (op.type1.ea_mode, op.type1.ea_reg, 1, -1)) break;
        !           624:                        switch (op.MemShift.type) {
        !           625:                                case 0: str = "as"; break;
        !           626:                                case 1: str = "ls"; break;
        !           627:                                case 2: str = "rox"; break;
        !           628:                                default: case 3: str = "ro"; break;
        !           629:                        }
        !           630:                        output ("%s%c.w\t", str, (op.ASx.dr ? 'l' : 'r'));
        !           631:                        put_adrmod (op.type1.ea_mode, op.type1.ea_reg, 1);
        !           632:                        goto done;
        !           633:                }
        !           634:                /* Bcc */
        !           635:                while (op.Bcc.op == 0x6) {
        !           636:                        if (Bcc_str [op.Bcc.cond] == NULL) break;
        !           637:                        if (op.bra.displacement) {
        !           638:                                temp = buf_pos + op.Bcc.displacement;
        !           639:                                output ("b%s.s\t", Bcc_str[op.Bcc.cond]);
        !           640:                                output_lab (temp);
        !           641:                        } else {
        !           642:                                temp = buf_pos;
        !           643:                                temp += rd_short ();
        !           644:                                output ("b%s.w\t", Bcc_str[op.Bcc.cond]);
        !           645:                                output_lab (temp);
        !           646:                        }
        !           647:                        goto done;
        !           648:                }
        !           649:                /* BRA */
        !           650:                while (op.bra.op == 0x60) {
        !           651:                        if (op.bra.displacement) {
        !           652:                                temp = buf_pos + op.bra.displacement;
        !           653:                                output ("bra.s\t");
        !           654:                                output_lab (temp);
        !           655:                        } else {
        !           656:                                temp = buf_pos;
        !           657:                                temp += rd_short ();
        !           658:                                output ("bra.w\t");
        !           659:                                output_lab (temp);
        !           660:                        }
        !           661:                        goto done;
        !           662:                }
        !           663:                /* BSR */
        !           664:                while ((op.code & 0xff00) == 0x6100) {
        !           665:                        if (op.bra.displacement) {
        !           666:                                temp = buf_pos + op.bra.displacement;
        !           667:                                output ("bsr.s\t");
        !           668:                                output_lab (temp);
        !           669:                        } else {
        !           670:                                temp = buf_pos;
        !           671:                                temp += rd_short ();
        !           672:                                output ("bsr.w\t");
        !           673:                                output_lab (temp);
        !           674:                        }
        !           675:                        goto done;
        !           676:                }
        !           677:                /* BCHG/BCLR/BSET/BTST (Dn,ea) */
        !           678:                while ((op.type2.op == 0) && ((op.type2.op_mode == 0x4) || (op.type2.op_mode == 0x5) || (op.type2.op_mode == 0x6) || (op.type2.op_mode == 0x7))) {
        !           679:                        if (op.type2.ea_mode == 0x1) break;
        !           680:                        if ((op.type2.op_mode != 0x4) && (op.type2.ea_mode == 0x7)) {
        !           681:                                if (op.type2.ea_reg > 1) break;
        !           682:                        }
        !           683:                        if (!is_adrmod (op.type2.ea_mode, op.type2.ea_reg, 2, -1)) break;
        !           684:                        
        !           685:                        if (op.type2.op_mode == 0x4) output ("btst\t");
        !           686:                        else if (op.type2.op_mode == 0x5) output ("bchg\t");
        !           687:                        else if (op.type2.op_mode == 0x6) output ("bclr\t");
        !           688:                        else output ("bset\t");
        !           689:                        output ("d%d,", op.type2.reg);
        !           690:                        put_adrmod (op.type2.ea_mode, op.type2.ea_reg, 2);
        !           691:                        goto done;
        !           692:                }
        !           693:                /* BCHG/BCLR/BSET (#<data>,ea) */
        !           694:                while ((op.type2.op == 0) && (op.type2.reg == 4) &&
        !           695:                                ((op.type2.op_mode == 0) || (op.type2.op_mode == 1) || (op.type2.op_mode == 2) || (op.type2.op_mode == 3))) {
        !           696:                        if (op.type2.ea_mode == 0x1) break;
        !           697:                        if ((op.type2.ea_mode == 0x7) && (op.type2.ea_reg > 1)) break;
        !           698:                        if (!is_adrmod (op.type2.ea_mode, op.type2.ea_reg, 2, 1)) break;
        !           699:                        temp = rd_byte ();
        !           700:                        if (temp != 0) {
        !           701:                                buf_pos--;
        !           702:                                break;
        !           703:                        }
        !           704:                        if (op.type2.op_mode == 0) {
        !           705:                                output ("btst\t");
        !           706:                        } else if (op.type2.op_mode == 1) {
        !           707:                                output ("bchg\t");
        !           708:                        } else if (op.type2.op_mode == 2) {
        !           709:                                output ("bclr\t");
        !           710:                        } else {
        !           711:                                output ("bset\t");
        !           712:                        }
        !           713:                        output ("#$%x,", (int)rd_byte ());
        !           714:                        put_adrmod (op.type2.ea_mode, op.type2.ea_reg, 2);
        !           715:                        goto done;
        !           716:                }
        !           717:                /* BKPT */
        !           718:                /*while ((op.code & 0xfff8) == 0x4848) {
        !           719:                        output ("bkpt\t#%d", op.code & 0x7);
        !           720:                        goto done;
        !           721:                }*/
        !           722:                /* CHK */
        !           723:                while ((op.type2.op == 0x4) && (op.type2.op_mode == 0x6)) {
        !           724:                        /* no address reg direct */
        !           725:                        if (op.type2.ea_mode == 0x1) break;
        !           726:                        if (!is_adrmod (op.type2.ea_mode, op.type2.ea_reg, 1, -1)) break;
        !           727:                        
        !           728:                        output ("chk\t");
        !           729:                        put_adrmod (op.type2.ea_mode, op.type2.ea_reg, 1);
        !           730:                        output (",d%d", op.type2.reg);
        !           731:                        
        !           732:                        goto done;
        !           733:                }
        !           734:                /* CLR */
        !           735:                while (op.type1.op == 0x42) {
        !           736:                        if (op.type1.size == 3) break;
        !           737:                        /* no address reg direct */
        !           738:                        if (op.type1.ea_mode == 0x1) break;
        !           739:                        /* no immediate or pc relative dest */
        !           740:                        if (op.type1.ea_mode == 0x7) {
        !           741:                                if (op.type1.ea_reg > 0x1) break;
        !           742:                        }
        !           743:                        if (!is_adrmod (op.type1.ea_mode, op.type1.ea_reg, op.type1.size, -1)) break;
        !           744:                        output ("clr%s\t", size_str[op.type1.size]);
        !           745:                        put_adrmod (op.type1.ea_mode, op.type1.ea_reg, op.type1.size);
        !           746:                        goto done;
        !           747:                }
        !           748:                /* CMP */
        !           749:                while (op.type2.op == 11) {
        !           750:                        if (op.type2.op_mode > 2) break;
        !           751:                        /* no .b size for adr reg direct */
        !           752:                        if ((op.type2.op_mode == 0) && (op.type2.ea_mode == 0x1)) break;
        !           753:                        if (!is_adrmod (op.type2.ea_mode, op.type2.ea_reg, op.type2.op_mode, -1)) break;
        !           754:                        output ("cmp%s\t", size_str[op.type2.op_mode]);
        !           755:                        put_adrmod (op.type2.ea_mode, op.type2.ea_reg, op.type2.op_mode);
        !           756:                        output (",d%d", op.type2.reg);
        !           757:                        goto done;
        !           758:                }
        !           759:                /* CMPA */
        !           760:                while (op.type2.op == 11) {
        !           761:                        if ((op.type2.op_mode != 0x3) && (op.type2.op_mode != 0x7)) break;
        !           762:                        if (op.type2.op_mode == 0x3) size = 1;
        !           763:                        else size = 2;
        !           764:                        if (!is_adrmod (op.type2.ea_mode, op.type2.ea_reg, size, -1)) break;
        !           765:                        output ("cmpa%s\t", size_str [size]);
        !           766:                        put_adrmod (op.type2.ea_mode, op.type2.ea_reg, size);
        !           767:                        output (",a%d", op.type2.reg);
        !           768:                        goto done;
        !           769:                }
        !           770:                /* CMPI */
        !           771:                while ((op.type1.op == 0x0c) && (op.type1.size != 0x3)) {
        !           772:                        if (op.type1.ea_mode == 0x1) break;
        !           773:                        if ((op.type1.ea_mode == 0x7) && (op.type1.ea_reg > 0x1)) break;
        !           774:                        if (!is_adrmod (op.type1.ea_mode, op.type1.ea_reg, op.type1.size, op.type1.size)) break;
        !           775:                        output ("cmpi%s\t", size_str [op.type1.size]);
        !           776:                        put_imm (op.type1.size);
        !           777:                        output (",");
        !           778:                        put_adrmod (op.type1.ea_mode, op.type1.ea_reg, op.type1.size);
        !           779:                        goto done;
        !           780:                }
        !           781:                /* CMPM */
        !           782:                while ((op.cmpm.OP0xb == 0xb) && (op.cmpm.OP2_1 == 0x1) && (op.cmpm.OP1_1 == 0x1)) {
        !           783:                        if (op.cmpm.size == 3) break;
        !           784:                        output ("cmpm%s\t(a%d)+,(a%d)+", size_str [op.cmpm.size], op.cmpm.src_reg, op.cmpm.dest_reg);
        !           785:                        goto done;
        !           786:                }
        !           787:                /* DBcc */
        !           788:                while ((op.DBcc.OP5 == 5) && (op.DBcc.OP25 == 25)) {
        !           789:                        if (DBcc_str [op.DBcc.cond] == NULL) break;
        !           790:                        temp = buf_pos;
        !           791:                        temp += rd_short ();
        !           792:                        output ("db%s\td%d,", DBcc_str[op.DBcc.cond],
        !           793:                                        op.DBcc.reg);
        !           794:                        output_lab (temp);
        !           795:                        goto done;
        !           796:                }
        !           797:                /* DIVS/DIVU */
        !           798:                while ((op.type2.op == 0x8) && ((op.type2.op_mode == 0x7) || (op.type2.op_mode == 0x3))) {
        !           799:                        if (op.type2.ea_mode == 0x1) break;
        !           800:                        if (!is_adrmod (op.type2.ea_mode, op.type2.ea_reg, 1, -1)) break;
        !           801:                        if (op.type2.op_mode == 0x7) output ("divs\t");
        !           802:                        else output ("divu\t");
        !           803:                        put_adrmod (op.type2.ea_mode, op.type2.ea_reg, 1);
        !           804:                        output (",d%d", op.type2.reg);
        !           805:                        goto done;
        !           806:                }
        !           807:                /* EOR */
        !           808:                while (op.type2.op == 0xb) {
        !           809:                        if ((op.type2.op_mode < 4) || (op.type2.op_mode > 6)) break;
        !           810:                        if (op.type2.ea_mode == 0x1) break;
        !           811:                        if ((op.type2.ea_mode == 0x7) && (op.type2.ea_reg > 0x1)) break;
        !           812:                        size = op.type2.op_mode - 4;
        !           813:                        if (!is_adrmod (op.type2.ea_mode, op.type2.ea_reg, size, -1)) break;
        !           814:                        output ("eor%s\t", size_str [size]);
        !           815:                        output ("d%d,", op.type2.reg);
        !           816:                        put_adrmod (op.type2.ea_mode, op.type2.ea_reg, size);
        !           817:                        goto done;
        !           818:                }
        !           819:                /* EORI to CCR */
        !           820:                while (op.code == 0x0a3c) {
        !           821:                        rd_byte ();
        !           822:                        output ("eori\t#$%x,ccr", rd_byte ());
        !           823:                        goto done;
        !           824:                }
        !           825:                /* EORI to SR */
        !           826:                while (op.code == 0x0a7c) {
        !           827:                        output ("eori\t#$%hx,sr", rd_short ());
        !           828:                        goto done;
        !           829:                }
        !           830:                /* EXG */
        !           831:                while ((op.exg.OP0xc == 0xc) && (op.exg.OP1 == 1)) {
        !           832:                        if (op.exg.op_mode == 0x8) {
        !           833:                                /* data reg swap */
        !           834:                                output ("exg\td%d,d%d", op.exg.src_reg, op.exg.dest_reg);
        !           835:                        } else if (op.exg.op_mode == 0x9) {
        !           836:                                /* address reg swap */
        !           837:                                output ("exg\ta%d,a%d", op.exg.src_reg, op.exg.dest_reg);
        !           838:                        } else if (op.exg.op_mode == 0x11) {
        !           839:                                /* data & adr reg swap */
        !           840:                                output ("exg\td%d,a%d", op.exg.src_reg, op.exg.dest_reg);
        !           841:                        } else {
        !           842:                                break;
        !           843:                        }
        !           844:                        goto done;
        !           845:                }
        !           846:                /* EXT */
        !           847:                while ((op.code & 0xfe38) == 0x4800) {
        !           848:                        if (op.type2.op_mode == 0x2) {
        !           849:                                output ("ext.w\td%d", op.type2.ea_reg);
        !           850:                        } else if (op.type2.op_mode == 0x3) {
        !           851:                                output ("ext.l\td%d", op.type2.ea_reg);
        !           852:                        } else {
        !           853:                                break;
        !           854:                        }
        !           855:                        goto done;
        !           856:                }
        !           857:                /* ILLEGAL */
        !           858:                while (op.code == 0x4afc) {
        !           859:                        output ("illegal");
        !           860:                        goto done;
        !           861:                }
        !           862:                /* JMP */
        !           863:                while ((op.code & 0xffc0) == 0x4ec0) {
        !           864:                        if (op.jmp.dest_mode == 0) break;
        !           865:                        if (op.jmp.dest_mode == 1) break;
        !           866:                        if (op.jmp.dest_mode == 3) break;
        !           867:                        if (op.jmp.dest_mode == 4) break;
        !           868:                        if ((op.jmp.dest_mode == 7) &&
        !           869:                            (op.jmp.dest_reg == 4)) break;
        !           870:                        if (!is_adrmod (op.jmp.dest_mode, op.jmp.dest_reg, 2, -1)) break;
        !           871:                        output ("jmp\t");
        !           872:                        temp = put_adrmod (op.jmp.dest_mode, op.jmp.dest_reg, 2);
        !           873:                        goto done;
        !           874:                }
        !           875:                /* JSR */
        !           876:                while ((op.code & 0xffc0) == 0x4e80) {
        !           877:                        if (op.type1.ea_mode == 0) break;
        !           878:                        if (op.type1.ea_mode == 1) break;
        !           879:                        if (op.type1.ea_mode == 3) break;
        !           880:                        if (op.type1.ea_mode == 4) break;
        !           881:                        /* no immediate dest */
        !           882:                        if ((op.type1.ea_mode == 7) && (op.type1.ea_reg == 4)) break;
        !           883:                        if (!is_adrmod (op.type1.ea_mode, op.type1.ea_reg, 2, -1)) break;
        !           884:                        output ("jsr\t");
        !           885:                        temp = put_adrmod (op.type1.ea_mode, op.type1.ea_reg, 2);
        !           886:                        goto done;
        !           887:                }
        !           888:                /* LEA */
        !           889:                while ((op.lea.SEVEN == 7) && (op.lea.FOUR == 4)) {
        !           890:                        if (op.lea.dest_mode == 0) break;
        !           891:                        if (op.lea.dest_mode == 1) break;
        !           892:                        if (op.lea.dest_mode == 3) break;
        !           893:                        if (op.lea.dest_mode == 4) break;
        !           894:                        /* no immediate dest */
        !           895:                        if ((op.lea.dest_mode == 7) && (op.lea.dest_reg == 4)) break;
        !           896:                        if (!is_adrmod (op.lea.dest_mode, op.lea.dest_reg, 2, -1)) break;
        !           897:                        output ("lea\t");
        !           898:                        put_adrmod (op.lea.dest_mode, op.lea.dest_reg, 2);
        !           899:                        output (",a%d", op.lea.reg);
        !           900:                        goto done;
        !           901:                }
        !           902:                /* LINK */
        !           903:                while ((op.code & 0xfff8) == 0x4e50) {
        !           904:                        output ("link\ta%d,", op.type1.ea_reg);
        !           905:                        put_imm (1);
        !           906:                        goto done;
        !           907:                }
        !           908:                /* MOVE/MOVEA */
        !           909:                while (op.move.op == 0) {
        !           910:                        if (op.move.size == 0) break;
        !           911:                        /* byte size and address reg direct is not allowed */
        !           912:                        if ((op.move.size == 1) && (op.move.src_mode == 0x1)) break;
        !           913:                        if ((op.move.size == 1) && (op.move.dest_mode == 0x1)) break;
        !           914:                        if (op.move.dest_mode == 0x7) {
        !           915:                                if (op.move.dest_reg > 1) break;
        !           916:                        }
        !           917:                        size = move_size [op.move.size];
        !           918:                        if (!is_adrmod (op.move.src_mode, op.move.src_reg, size, -1)) break;
        !           919:                        if ((op.move.src_mode == 0x7) && (op.move.src_reg == 0x4)) {
        !           920:                                /* immediate crap in the source so we must skip it */
        !           921:                                if (!is_adrmod (op.move.dest_mode, op.move.dest_reg, size, size)) break;
        !           922:                        } else if ((op.move.src_mode == 0x7) && (op.move.src_reg > 0x1)) {
        !           923:                                if (!is_adrmod (op.move.dest_mode, op.move.dest_reg, size, 1)) break;
        !           924:                        } else if ((op.move.src_mode == 0x7) && (op.move.src_reg == 0x1)) {
        !           925:                                if (!is_adrmod (op.move.dest_mode, op.move.dest_reg, size, 2)) break;
        !           926:                        } else if ((op.move.src_mode == 0x7) && (op.move.src_reg == 0x0)) {
        !           927:                                if (!is_adrmod (op.move.dest_mode, op.move.dest_reg, size, 1)) break;
        !           928:                        } else if ((op.move.src_mode == 0x6) || (op.move.src_mode == 0x5)) {
        !           929:                                /* PC with disp + Dx, (Ax) with disp + Dx */
        !           930:                                if (!is_adrmod (op.move.dest_mode, op.move.dest_reg, size, 1)) break;
        !           931:                        } else {
        !           932:                                if (!is_adrmod (op.move.dest_mode, op.move.dest_reg, size, -1)) break;
        !           933:                        }
        !           934:                        if (op.move.dest_mode == 0x1) {
        !           935:                                output ("movea%s\t", size_str[size]);
        !           936:                        } else {
        !           937:                                output ("move%s\t", size_str[size]);
        !           938:                        }
        !           939:                        
        !           940:                        put_adrmod (op.move.src_mode, op.move.src_reg, size);
        !           941:                        output (",");
        !           942:                        put_adrmod (op.move.dest_mode, op.move.dest_reg, size);
        !           943:                        goto done;
        !           944:                }
        !           945:                /* MOVE to CCR */
        !           946:                while ((op.code & 0xffc0) == 0x44c0) {
        !           947:                        if (op.type1.ea_mode == 0x1) break;
        !           948:                        if (!is_adrmod (op.type1.ea_mode, op.type1.ea_reg, 1, -1)) break;
        !           949:                        output ("move.w\t");
        !           950:                        put_adrmod (op.type1.ea_mode, op.type1.ea_reg, 1);
        !           951:                        output (",ccr");
        !           952:                        goto done;
        !           953:                }
        !           954:                /* MOVE from SR */
        !           955:                while ((op.code & 0xffc0) == 0x40c0) {
        !           956:                        if (op.type1.ea_mode == 0x1) break;
        !           957:                        if ((op.type1.ea_mode == 0x7) && (op.type1.ea_reg > 0x1)) break;
        !           958:                        if (!is_adrmod (op.type1.ea_mode, op.type1.ea_reg, 1, -1)) break;
        !           959:                        output ("move.w\tsr,");
        !           960:                        put_adrmod (op.type1.ea_mode, op.type1.ea_reg, 1);
        !           961:                        goto done;
        !           962:                }
        !           963:                /* MOVE to SR */
        !           964:                while ((op.code & 0xffc0) == 0x46c0) {
        !           965:                        if (op.type1.ea_mode == 0x1) break;
        !           966:                        if (!is_adrmod (op.type1.ea_mode, op.type1.ea_reg, 1, -1)) break;
        !           967:                        output ("move.w\t");
        !           968:                        put_adrmod (op.type1.ea_mode, op.type1.ea_reg, 1);
        !           969:                        output (",sr");
        !           970:                        goto done;
        !           971:                }
        !           972:                /* MOVE USP */
        !           973:                while ((op.code & 0xfff0) == 0x4e60) {
        !           974:                        if (op.addx.rm) {
        !           975:                                /* USP to Ax */
        !           976:                                output ("move.l\tusp,a%d", op.addx.src_reg);
        !           977:                        } else {
        !           978:                                output ("move.l\ta%d,usp", op.addx.src_reg);
        !           979:                        }
        !           980:                        goto done;
        !           981:                }
        !           982:                /* TODO MOVEC */
        !           983:                /* TODO MOVEP */
        !           984:                /* MOVEM */
        !           985:                while ((op.movem.NINE == 9) && (op.movem.ONE == 1)) {
        !           986:                        if (op.movem.dr) {
        !           987:                                /* memory to register */
        !           988:                                if (op.movem.dest_mode < 2) break;
        !           989:                                if (op.movem.dest_mode == 4) break;
        !           990:                                if ((op.movem.dest_mode == 7) && (op.movem.dest_reg == 4)) break;
        !           991:                                if (!is_adrmod (op.movem.dest_mode, op.movem.dest_reg, op.movem.sz+1, 1)) break;
        !           992:                                temp = rd_short ();
        !           993:                                output ("movem%s\t", size_str [op.movem.sz+1]);
        !           994:                                put_adrmod (op.movem.dest_mode, op.movem.dest_reg, op.movem.sz+1);
        !           995:                                output (",");
        !           996:                                put_movem_regs (temp, 0);
        !           997:                        } else {
        !           998:                                /* register to memory */
        !           999:                                if (op.movem.dest_mode < 2) break;
        !          1000:                                if (op.movem.dest_mode == 3) break;
        !          1001:                                if ((op.movem.dest_mode == 7) && (op.movem.dest_reg > 1)) break;
        !          1002:                                if (!is_adrmod (op.movem.dest_mode, op.movem.dest_reg, op.movem.sz+1, 1)) break;
        !          1003:                                output ("movem%s\t", size_str [op.movem.sz+1]);
        !          1004:                                put_movem_regs (rd_short (), (op.movem.dest_mode == 4));
        !          1005:                                output (",");
        !          1006:                                put_adrmod (op.movem.dest_mode, op.movem.dest_reg, op.movem.sz+1);
        !          1007:                        }
        !          1008:                        goto done;
        !          1009:                }
        !          1010:                /* MOVEQ */
        !          1011:                while ((op.moveq.SEVEN == 7) && (op.moveq.ZERO == 0)) {
        !          1012:                        output ("moveq\t#%d,d%d", op.moveq.data, op.moveq.reg);
        !          1013:                        goto done;
        !          1014:                }
        !          1015:                /* MULS/MULU */
        !          1016:                while ((op.type2.op == 0xc) && ((op.type2.op_mode == 0x7) || (op.type2.op_mode == 0x3))) {
        !          1017:                        if (op.type2.ea_mode == 0x1) break;
        !          1018:                        if (!is_adrmod (op.type2.ea_mode, op.type2.ea_reg, 1, -1)) break;
        !          1019:                        if (op.type2.op_mode == 0x7) output ("muls\t");
        !          1020:                        else output ("mulu\t");
        !          1021:                        put_adrmod (op.type2.ea_mode, op.type2.ea_reg, 1);
        !          1022:                        output (",d%d", op.type2.reg);
        !          1023:                        goto done;
        !          1024:                }
        !          1025:                /* NBCD */
        !          1026:                while ((op.code & 0xffc0) == 0x4800) {
        !          1027:                        if (op.type1.ea_mode == 0x1) break;
        !          1028:                        if ((op.type1.ea_mode == 0x7) && (op.type1.ea_reg > 1)) break;
        !          1029:                        if (!is_adrmod (op.type1.ea_mode, op.type1.ea_reg, 0, -1)) break;
        !          1030:                        output ("nbcd\t");
        !          1031:                        put_adrmod (op.type1.ea_mode, op.type1.ea_reg, 0);
        !          1032:                        goto done;
        !          1033:                }
        !          1034:                /* NEG/NEGX/NOT */
        !          1035:                while ((op.type1.op == 0x44) || (op.type1.op == 0x40) || (op.type1.op == 0x46)) {
        !          1036:                        if (op.type1.size == 3) break;
        !          1037:                        if (op.type1.ea_mode == 0x1) break;
        !          1038:                        if ((op.type1.ea_mode == 0x7) && (op.type1.ea_reg > 1)) break;
        !          1039:                        if (!is_adrmod (op.type1.ea_mode, op.type1.ea_reg, op.type1.size, -1)) break;
        !          1040:                        if (op.type1.op == 0x44) output ("neg%s\t", size_str [op.type1.size]);
        !          1041:                        else if (op.type1.op == 0x40) output ("negx%s\t", size_str [op.type1.size]);
        !          1042:                        else output ("not%s\t", size_str [op.type1.size]);
        !          1043:                        put_adrmod (op.type1.ea_mode, op.type1.ea_reg, op.type1.size);
        !          1044:                        goto done;
        !          1045:                }
        !          1046:                /* NOP */
        !          1047:                while (op.code == 0x4e71) {
        !          1048:                        output ("nop");
        !          1049:                        goto done;
        !          1050:                }
        !          1051:                /* ORI to CCR */
        !          1052:                while (op.code == 0x003c) {
        !          1053:                        rd_byte ();
        !          1054:                        output ("ori\t#$%x,ccr", rd_byte ());
        !          1055:                        goto done;
        !          1056:                }
        !          1057:                /* ORI to SR */
        !          1058:                while (op.code == 0x007c) {
        !          1059:                        output ("ori\t#$%hx,sr", rd_short ());
        !          1060:                        goto done;
        !          1061:                }
        !          1062:                /* PEA */
        !          1063:                while ((op.code & 0xffc0) == 0x4840) {
        !          1064:                        if (op.type1.ea_mode < 2) break;
        !          1065:                        if (op.type1.ea_mode == 3) break;
        !          1066:                        if (op.type1.ea_mode == 4) break;
        !          1067:                        if ((op.type1.ea_mode == 7) && (op.type1.ea_reg == 4)) break;
        !          1068:                        if (!is_adrmod (op.type1.ea_mode, op.type1.ea_reg, op.type1.size, -1)) break;
        !          1069:                        output ("pea\t");
        !          1070:                        put_adrmod (op.type1.ea_mode, op.type1.ea_reg, 2);
        !          1071:                        goto done;
        !          1072:                }
        !          1073:                /* RESET */
        !          1074:                while (op.code == 0x4e70) {
        !          1075:                        output ("reset");
        !          1076:                        goto done;
        !          1077:                }
        !          1078:                /* RTE */
        !          1079:                while (op.code == 0x4e73) {
        !          1080:                        output ("rte");
        !          1081:                        goto done;
        !          1082:                }
        !          1083:                /* RTR */
        !          1084:                while (op.code == 0x4e77) {
        !          1085:                        output ("rtr");
        !          1086:                        goto done;
        !          1087:                }
        !          1088:                /* RTS */
        !          1089:                while (op.code == 0x4e75) {
        !          1090:                        output ("rts");
        !          1091:                        goto done;
        !          1092:                }
        !          1093:                /* Scc */
        !          1094:                while ((op.code & 0xf0c0) == 0x50c0) {
        !          1095:                        if (op.type1.ea_mode == 1) break;
        !          1096:                        if ((op.type1.ea_mode == 7) && (op.type1.ea_reg > 1)) break;
        !          1097:                        if (!is_adrmod (op.type1.ea_mode, op.type1.ea_reg, 0, -1)) break;
        !          1098:                        output ("s%s\t", DBcc_str[op.DBcc.cond]);
        !          1099:                        put_adrmod (op.type1.ea_mode, op.type1.ea_reg, 0);
        !          1100:                        goto done;
        !          1101:                }
        !          1102:                /* STOP */
        !          1103:                while (op.code == 0x4e72) {
        !          1104:                        output ("stop\t");
        !          1105:                        put_imm (1);
        !          1106:                        goto done;
        !          1107:                }
        !          1108:                /* SWAP */
        !          1109:                while ((op.code & 0xfff8) == 0x4840) {
        !          1110:                        output ("swap\td%d", op.code & 0x7);
        !          1111:                        goto done;
        !          1112:                }
        !          1113:                /* TAS */
        !          1114:                while ((op.code & 0xffc0) == 0x4ac0) {
        !          1115:                        if (op.type1.ea_mode == 0x1) break;
        !          1116:                        if ((op.type1.ea_mode == 0x7) && (op.type1.ea_reg > 0x1)) break;
        !          1117:                        if (!is_adrmod (op.type1.ea_mode, op.type1.ea_reg, 0, -1)) break;
        !          1118:                        output ("tas\t");
        !          1119:                        put_adrmod (op.type1.ea_mode, op.type1.ea_reg, 0);
        !          1120:                        goto done;
        !          1121:                }
        !          1122:                /* TRAP */
        !          1123:                while ((op.code & 0xfff0) == 0x4e40) {
        !          1124:                        output ("trap\t#%d", op.code & 0xf);
        !          1125:                        goto done;
        !          1126:                }
        !          1127:                /* TRAPV */
        !          1128:                while (op.code == 0x4e76) {
        !          1129:                        output ("trapv");
        !          1130:                        goto done;
        !          1131:                }
        !          1132:                /* TST */
        !          1133:                while (op.type1.op == 0x4a) {
        !          1134:                        if (op.type1.size == 3) break;
        !          1135:                        /* no address reg direct */
        !          1136:                        if (op.type1.ea_mode == 0x1) break;
        !          1137:                        /* no immediate or pc relative dest */
        !          1138:                        if ((op.type1.ea_mode == 0x7) && (op.type1.ea_reg > 0x1)) break;
        !          1139:                        if (!is_adrmod (op.type1.ea_mode, op.type1.ea_reg, op.type1.size, -1)) break;
        !          1140:                        output ("tst%s\t", size_str[op.type1.size]);
        !          1141:                        put_adrmod (op.type1.ea_mode, op.type1.ea_reg, op.type1.size);
        !          1142:                        goto done;
        !          1143:                }
        !          1144:                /* UNLK */
        !          1145:                while ((op.code & 0xfff8) == 0x4e58) {
        !          1146:                        output ("unlk\ta%d", op.code & 0x7);
        !          1147:                        goto done;
        !          1148:                }
        !          1149:                /* fuck knows */
        !          1150:                output ("dc.w\t$%hx", op.code);
        !          1151: done:
        !          1152:                continue;
        !          1153:        }
        !          1154:        output ("\r\n");
        !          1155: }
        !          1156: 

unix.superglobalmegacorp.com

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