Annotation of frontvm/hardware/disasm.c, revision 1.1.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.