Annotation of uae/src/gencpu.c, revision 1.1.1.4

1.1.1.3   root        1: /*
1.1       root        2:  * UAE - The Un*x Amiga Emulator
                      3:  *
                      4:  * MC68000 emulation generator
                      5:  *
1.1.1.3   root        6:  * This is a fairly stupid program that generates a lot of case labels that
1.1       root        7:  * can be #included in a switch statement.
                      8:  * As an alternative, it can generate functions that handle specific
                      9:  * MC68000 instructions, plus a prototype header file and a function pointer
                     10:  * array to look up the function for an opcode.
                     11:  * Error checking is bad, an illegal table68k file will cause the program to
                     12:  * call abort().
1.1.1.3   root       13:  * The generated code is sometimes sub-optimal, an optimizing compiler should
1.1       root       14:  * take care of this.
1.1.1.3   root       15:  *
1.1       root       16:  * Copyright 1995, 1996 Bernd Schmidt
                     17:  */
                     18: 
                     19: #include "sysconfig.h"
                     20: #include "sysdeps.h"
                     21: #include <ctype.h>
                     22: 
                     23: #include "config.h"
                     24: #include "options.h"
                     25: #include "readcpu.h"
                     26: 
                     27: #define BOOL_TYPE "int"
                     28: 
1.1.1.3   root       29: static FILE *headerfile;
                     30: static FILE *stblfile;
                     31: 
                     32: static int using_prefetch;
                     33: static int using_exception_3;
                     34: static int cpu_level;
                     35: 
                     36: /* For the current opcode, the next lower level that will have different code.
                     37:  * Initialized to -1 for each opcode. If it remains unchanged, indicates we
                     38:  * are done with that opcode.  */
                     39: static int next_cpu_level;
1.1       root       40: 
1.1.1.3   root       41: char warning_buffer[256];
                     42: 
                     43: void write_log (const char *s)
1.1       root       44: {
1.1.1.3   root       45:     fprintf (stderr, "%s", s);
1.1       root       46: }
                     47: 
1.1.1.3   root       48: static int *opcode_map;
                     49: static int *opcode_next_clev;
                     50: static int *opcode_last_postfix;
                     51: static unsigned long *counts;
                     52: 
1.1       root       53: static void read_counts(void)
                     54: {
                     55:     FILE *file;
                     56:     unsigned long opcode,count, total;
                     57:     char name[20];
1.1.1.3   root       58:     int nr = 0, nr2 = 0, r = 0;
                     59:     memset (counts, 0, 65536 * sizeof *counts);
1.1       root       60: 
1.1.1.3   root       61:     file = fopen ("frequent.68k", "r");
                     62:     if (file) {
                     63:        fscanf (file, "Total: %lu\n", &total);
                     64:        while (fscanf (file,"%lx: %lu %s\n", &opcode, &count, name) == 3) {
                     65:            opcode_next_clev[nr] = 3;
                     66:            opcode_last_postfix[nr] = -1;
                     67:            opcode_map[nr++] = opcode;
                     68:            counts[opcode] = count;
                     69:        }
                     70:        fclose (file);
                     71:     }
                     72:     if (nr == nr_cpuop_funcs)
                     73:        return;
                     74:     for (opcode = 0; opcode < 0x10000; opcode++) {
                     75:        if (table68k[opcode].handler == -1 && table68k[opcode].mnemo != i_ILLG
                     76:            && counts[opcode] == 0)
1.1       root       77:        {
1.1.1.3   root       78:            opcode_next_clev[nr] = 3;
                     79:            opcode_last_postfix[nr] = -1;
                     80:            opcode_map[nr++] = opcode;
                     81:            counts[opcode] = count;
1.1       root       82:        }
                     83:     }
1.1.1.3   root       84:     if (nr != nr_cpuop_funcs)
                     85:        abort ();
1.1       root       86: }
                     87: 
1.1.1.3   root       88: static char endlabelstr[80];
                     89: static int endlabelno = 0;
1.1       root       90: 
                     91: static int n_braces = 0;
1.1.1.3   root       92: static int m68k_pc_offset = 0;
1.1       root       93: 
                     94: static void start_brace(void)
                     95: {
                     96:     n_braces++;
1.1.1.3   root       97:     printf ("{");
1.1       root       98: }
                     99: 
                    100: static void close_brace(void)
                    101: {
                    102:     assert (n_braces > 0);
                    103:     n_braces--;
1.1.1.3   root      104:     printf ("}");
1.1       root      105: }
                    106: 
                    107: static void finish_braces(void)
                    108: {
                    109:     while (n_braces > 0)
                    110:        close_brace();
                    111: }
                    112: 
                    113: static void pop_braces(int to)
                    114: {
                    115:     while (n_braces > to)
                    116:        close_brace();
                    117: }
                    118: 
                    119: static int bit_size(int size)
                    120: {
                    121:     switch(size) {
                    122:      case sz_byte:     return 8;
                    123:      case sz_word:     return 16;
                    124:      case sz_long:     return 32;
                    125:      default:
                    126:        abort();
                    127:     }
                    128:     return 0;
                    129: }
                    130: 
                    131: static const char *bit_mask(int size)
                    132: {
                    133:     switch(size) {
1.1.1.3   root      134:      case sz_byte: return "0xff";
                    135:      case sz_word: return "0xffff";
                    136:      case sz_long: return "0xffffffff";
1.1       root      137:      default:
                    138:        abort();
                    139:     }
                    140:     return 0;
                    141: }
                    142: 
1.1.1.3   root      143: static const char *gen_nextilong (void)
                    144: {
                    145:     static char buffer[80];
                    146:     int r = m68k_pc_offset;
                    147:     m68k_pc_offset += 4;
                    148:     sprintf (buffer, "get_ilong%s(%d)", using_prefetch ? "_prefetch" : "", r);
                    149:     return buffer;
                    150: }
                    151: 
                    152: static const char *gen_nextiword (void)
                    153: {
                    154:     static char buffer[80];
                    155:     int r = m68k_pc_offset;
                    156:     m68k_pc_offset += 2;
                    157:     sprintf (buffer, "get_iword%s(%d)", using_prefetch ? "_prefetch" : "", r);
                    158:     return buffer;
                    159: }
                    160: 
                    161: static const char *gen_nextibyte (void)
                    162: {
                    163:     static char buffer[80];
                    164:     int r = m68k_pc_offset;
                    165:     m68k_pc_offset += 2;
                    166:     sprintf (buffer, "get_ibyte%s(%d)", using_prefetch ? "_prefetch" : "", r);
                    167:     return buffer;
                    168: }
                    169: 
                    170: static void fill_prefetch_0 (void)
                    171: {
                    172:     if (using_prefetch)
                    173:        printf ("fill_prefetch_0 ();\n");
                    174: }
                    175: 
                    176: static void fill_prefetch_2 (void)
                    177: {
                    178:     if (using_prefetch)
                    179:        printf ("fill_prefetch_2 ();\n");
                    180: }
                    181: 
                    182: static void sync_m68k_pc (void)
                    183: {
                    184:     if (m68k_pc_offset == 0)
                    185:        return;
                    186:     printf ("m68k_incpc(%d);\n", m68k_pc_offset);
                    187:     switch (m68k_pc_offset) {
                    188:      case 0:
                    189:        /*fprintf (stderr, "refilling prefetch at 0\n");*/
                    190:        break;
                    191:      case 2:
                    192:        fill_prefetch_2();
                    193:        break;
                    194:      default:
                    195:        fill_prefetch_0();
                    196:        break;
                    197:     }
                    198:     m68k_pc_offset = 0;
                    199: }
                    200: 
                    201: /* getv == 1: fetch data; getv != 0: check for odd address. If movem != 0,
                    202:  * the calling routine handles Apdi and Aipi moeds. */
                    203: static void genamode (amodes mode, char *reg, wordsizes size, char *name, int getv, int movem)
1.1       root      204: {
                    205:     start_brace ();
                    206:     switch(mode) {
                    207:      case Dreg:
                    208:        if (movem)
                    209:            abort();
1.1.1.3   root      210:        if (getv == 1)
                    211:            switch(size) {
1.1       root      212:             case sz_byte:
1.1.1.2   root      213: #ifdef AMIGA
                    214:                /* sam: I don't know why gcc.2.7.2.1 produces a code worse */
                    215:                /* if it is not done like that: */
1.1.1.3   root      216:                printf ("\tuae_s8 %s = ((uae_u8*)&m68k_dreg(regs, %s))[3];\n", name, reg);
1.1.1.2   root      217: #else
1.1.1.3   root      218:                printf ("\tuae_s8 %s = m68k_dreg(regs, %s);\n", name, reg);
1.1.1.2   root      219: #endif
1.1       root      220:                break;
                    221:             case sz_word:
1.1.1.2   root      222: #ifdef AMIGA
1.1.1.3   root      223:                printf ("\tuae_s16 %s = ((uae_s16*)&m68k_dreg(regs, %s))[1];\n", name, reg);
1.1.1.2   root      224: #else
1.1.1.3   root      225:                printf ("\tuae_s16 %s = m68k_dreg(regs, %s);\n", name, reg);
1.1.1.2   root      226: #endif
1.1       root      227:                break;
                    228:             case sz_long:
1.1.1.3   root      229:                printf ("\tuae_s32 %s = m68k_dreg(regs, %s);\n", name, reg);
1.1       root      230:                break;
                    231:             default: abort();
                    232:            }
1.1.1.3   root      233:        return;
1.1       root      234:      case Areg:
                    235:        if (movem)
                    236:            abort();
1.1.1.3   root      237:        if (getv == 1)
                    238:            switch(size) {
1.1       root      239:             case sz_word:
1.1.1.3   root      240:                printf ("\tuae_s16 %s = m68k_areg(regs, %s);\n", name, reg);
1.1       root      241:                break;
                    242:             case sz_long:
1.1.1.3   root      243:                printf ("\tuae_s32 %s = m68k_areg(regs, %s);\n", name, reg);
1.1       root      244:                break;
                    245:             default: abort();
                    246:            }
1.1.1.3   root      247:        return;
1.1       root      248:      case Aind:
1.1.1.3   root      249:        printf ("\tuaecptr %sa = m68k_areg(regs, %s);\n", name, reg);
1.1       root      250:        break;
                    251:      case Aipi:
1.1.1.3   root      252:        printf ("\tuaecptr %sa = m68k_areg(regs, %s);\n", name, reg);
1.1       root      253:        break;
                    254:      case Apdi:
1.1.1.3   root      255:        switch(size) {
1.1       root      256:         case sz_byte:
1.1.1.3   root      257:            if (movem)
                    258:                printf ("\tuaecptr %sa = m68k_areg(regs, %s);\n", name, reg);
                    259:            else
                    260:                printf ("\tuaecptr %sa = m68k_areg(regs, %s) - areg_byteinc[%s];\n", name, reg, reg);
1.1       root      261:            break;
                    262:         case sz_word:
1.1.1.3   root      263:            printf ("\tuaecptr %sa = m68k_areg(regs, %s) - %d;\n", name, reg, movem ? 0 : 2);
1.1       root      264:            break;
                    265:         case sz_long:
1.1.1.3   root      266:            printf ("\tuaecptr %sa = m68k_areg(regs, %s) - %d;\n", name, reg, movem ? 0 : 4);
1.1       root      267:            break;
                    268:         default: abort();
                    269:        }
                    270:        break;
                    271:      case Ad16:
1.1.1.3   root      272:        printf ("\tuaecptr %sa = m68k_areg(regs, %s) + (uae_s32)(uae_s16)%s;\n", name, reg, gen_nextiword());
1.1       root      273:        break;
                    274:      case Ad8r:
1.1.1.3   root      275:        if (cpu_level > 1) {
                    276:            if (next_cpu_level < 1)
                    277:                next_cpu_level = 1;
                    278:            sync_m68k_pc();
1.1       root      279:            start_brace();
1.1.1.3   root      280:            printf ("\tuaecptr %sa = get_disp_ea_020(m68k_areg(regs, %s), next_iword());\n", name, reg);
                    281:        } else
                    282:            printf ("\tuaecptr %sa = get_disp_ea_000(m68k_areg(regs, %s), %s);\n", name, reg, gen_nextiword());
1.1       root      283:        break;
                    284:      case PC16:
1.1.1.3   root      285:        printf ("\tuaecptr %sa = m68k_getpc() + %d;\n", name, m68k_pc_offset);
                    286:        printf ("\t%sa += (uae_s32)(uae_s16)%s;\n", name, gen_nextiword());
1.1       root      287:        break;
                    288:      case PC8r:
1.1.1.3   root      289:        if (cpu_level > 1) {
                    290:            if (next_cpu_level < 1)
                    291:                next_cpu_level = 1;
                    292:            sync_m68k_pc();
1.1       root      293:            start_brace();
1.1.1.3   root      294:            printf ("\tuaecptr tmppc = m68k_getpc();\n");
                    295:            printf ("\tuaecptr %sa = get_disp_ea_020(tmppc, next_iword());\n", name);
                    296:        } else {
                    297:            printf ("\tuaecptr tmppc = m68k_getpc() + %d;\n", m68k_pc_offset);
                    298:            printf ("\tuaecptr %sa = get_disp_ea_000(tmppc, %s);\n", name, gen_nextiword());
1.1       root      299:        }
1.1.1.3   root      300: 
1.1       root      301:        break;
                    302:      case absw:
1.1.1.3   root      303:        printf ("\tuaecptr %sa = (uae_s32)(uae_s16)%s;\n", name, gen_nextiword());
1.1       root      304:        break;
                    305:      case absl:
1.1.1.3   root      306:        printf ("\tuaecptr %sa = %s;\n", name, gen_nextilong());
1.1       root      307:        break;
                    308:      case imm:
1.1.1.3   root      309:        if (getv != 1)
                    310:            abort ();
                    311:        switch(size) {
                    312:         case sz_byte:
                    313:            printf ("\tuae_s8 %s = %s;\n", name, gen_nextibyte());
                    314:            break;
                    315:         case sz_word:
                    316:            printf ("\tuae_s16 %s = %s;\n", name, gen_nextiword());
                    317:            break;
                    318:         case sz_long:
                    319:            printf ("\tuae_s32 %s = %s;\n", name, gen_nextilong());
                    320:            break;
                    321:         default: abort();
                    322:        }
                    323:        return;
                    324:      case imm0:
                    325:        if (getv != 1) abort();
                    326:        printf ("\tuae_s8 %s = %s;\n", name, gen_nextibyte());
                    327:        return;
                    328:      case imm1:
                    329:        if (getv != 1) abort();
                    330:        printf ("\tuae_s16 %s = %s;\n", name, gen_nextiword());
                    331:        return;
                    332:      case imm2:
                    333:        if (getv != 1) abort();
                    334:        printf ("\tuae_s32 %s = %s;\n", name, gen_nextilong());
                    335:        return;
                    336:      case immi:
                    337:        if (getv != 1) abort();
                    338:        printf ("\tuae_u32 %s = %s;\n", name, reg);
                    339:        return;
                    340:      default:
                    341:        abort();
                    342:     }
                    343: 
                    344:     /* We get here for all non-reg non-immediate addressing modes to
                    345:      * actually fetch the value. */
                    346: 
                    347:     if (using_exception_3 && getv != 0 && size != sz_byte) {
                    348:        printf ("\tif ((%sa & 1) != 0) {\n", name);
                    349:        printf ("\t\tlast_fault_for_exception_3 = %sa;\n", name);
                    350:        printf ("\t\tlast_op_for_exception_3 = opcode;\n", name);
                    351:        printf ("\t\tlast_addr_for_exception_3 = m68k_getpc() + %d;\n", m68k_pc_offset);
                    352:        printf ("\t\tException(3, 0);\n");
                    353:        printf ("\t\tgoto %s;\n", endlabelstr);
                    354:        printf ("\t}\n");
                    355:        start_brace();
                    356:     }
                    357: 
                    358:     if (getv == 1) {
                    359:        start_brace ();
                    360:        switch(size) {
                    361:         case sz_byte:
                    362:            printf ("\tuae_s8 %s = get_byte(%sa);\n", name, name);
                    363:            break;
                    364:         case sz_word:
                    365:            printf ("\tuae_s16 %s = get_word(%sa);\n", name, name);
                    366:            break;
                    367:         case sz_long:
                    368:            printf ("\tuae_s32 %s = get_long(%sa);\n", name, name);
                    369:            break;
                    370:         default: abort();
                    371:        }
                    372:     }
                    373:     /* We now might have to fix up the register for pre-dec or post-inc
                    374:      * addressing modes. */
                    375:     if (!movem)
                    376:        switch (mode) {
                    377:         case Aipi:
1.1       root      378:            switch(size) {
                    379:             case sz_byte:
1.1.1.3   root      380:                printf ("\tm68k_areg(regs, %s) += areg_byteinc[%s];\n", reg, reg);
1.1       root      381:                break;
                    382:             case sz_word:
1.1.1.3   root      383:                printf ("\tm68k_areg(regs, %s) += 2;\n", reg);
1.1       root      384:                break;
                    385:             case sz_long:
1.1.1.3   root      386:                printf ("\tm68k_areg(regs, %s) += 4;\n", reg);
1.1       root      387:                break;
                    388:             default: abort();
                    389:            }
1.1.1.3   root      390:            break;
                    391:         case Apdi:
                    392:            printf ("\tm68k_areg (regs, %s) = %sa;\n", reg, name);
                    393:            break;
                    394:         default:
                    395:            break;
                    396:        }
1.1       root      397: }
                    398: 
1.1.1.3   root      399: static void genastore (char *from, amodes mode, char *reg, wordsizes size, char *to)
1.1       root      400: {
                    401:     switch(mode) {
                    402:      case Dreg:
1.1.1.3   root      403:        switch(size) {
1.1       root      404:         case sz_byte:
1.1.1.3   root      405:            printf ("\tm68k_dreg(regs, %s) = (m68k_dreg(regs, %s) & ~0xff) | ((%s) & 0xff);\n", reg, reg, from);
1.1       root      406:            break;
                    407:         case sz_word:
1.1.1.3   root      408:            printf ("\tm68k_dreg(regs, %s) = (m68k_dreg(regs, %s) & ~0xffff) | ((%s) & 0xffff);\n", reg, reg, from);
1.1       root      409:            break;
                    410:         case sz_long:
1.1.1.3   root      411:            printf ("\tm68k_dreg(regs, %s) = (%s);\n", reg, from);
1.1       root      412:            break;
                    413:         default: abort();
                    414:        }
                    415:        break;
                    416:      case Areg:
1.1.1.3   root      417:        switch(size) {
1.1       root      418:         case sz_word:
1.1.1.3   root      419:            fprintf (stderr, "Foo\n");
                    420:            printf ("\tm68k_areg(regs, %s) = (uae_s32)(uae_s16)(%s);\n", reg, from);
1.1       root      421:            break;
                    422:         case sz_long:
1.1.1.3   root      423:            printf ("\tm68k_areg(regs, %s) = (%s);\n", reg, from);
1.1       root      424:            break;
                    425:         default: abort();
                    426:        }
                    427:        break;
                    428:      case Aind:
                    429:      case Aipi:
                    430:      case Apdi:
                    431:      case Ad16:
                    432:      case Ad8r:
                    433:      case absw:
                    434:      case absl:
1.1.1.3   root      435:        if (using_prefetch)
                    436:            sync_m68k_pc();
1.1       root      437:        switch(size) {
                    438:         case sz_byte:
1.1.1.3   root      439:            printf ("\tput_byte(%sa,%s);\n", to, from);
1.1       root      440:            break;
                    441:         case sz_word:
1.1.1.3   root      442:            printf ("\tput_word(%sa,%s);\n", to, from);
1.1       root      443:            break;
                    444:         case sz_long:
1.1.1.3   root      445:            printf ("\tput_long(%sa,%s);\n", to, from);
1.1       root      446:            break;
                    447:         default: abort();
                    448:        }
                    449:        break;
                    450:      case PC16:
                    451:      case PC8r:
1.1.1.3   root      452:        if (using_prefetch)
                    453:            sync_m68k_pc();
1.1       root      454:        switch(size) {
                    455:         case sz_byte:
1.1.1.3   root      456:            printf ("\tput_byte(%sa,%s);\n", to, from);
1.1       root      457:            break;
                    458:         case sz_word:
1.1.1.3   root      459:            if (cpu_level < 2)
1.1       root      460:                abort();
1.1.1.3   root      461:            printf ("\tput_word(%sa,%s);\n", to, from);
1.1       root      462:            break;
                    463:         case sz_long:
1.1.1.3   root      464:            if (cpu_level < 2)
1.1       root      465:                abort();
1.1.1.3   root      466:            printf ("\tput_long(%sa,%s);\n", to, from);
1.1       root      467:            break;
                    468:         default: abort();
                    469:        }
                    470:        break;
                    471:      case imm:
                    472:      case imm0:
                    473:      case imm1:
                    474:      case imm2:
                    475:      case immi:
                    476:        abort();
                    477:        break;
1.1.1.3   root      478:      default:
1.1       root      479:        abort();
                    480:     }
                    481: }
                    482: 
1.1.1.3   root      483: static void genmovemel(uae_u16 opcode)
1.1       root      484: {
                    485:     char getcode[100];
                    486:     int size = table68k[opcode].size == sz_long ? 4 : 2;
1.1.1.3   root      487: 
                    488:     if (table68k[opcode].size == sz_long) {
                    489:        strcpy(getcode, "get_long(srca)");
                    490:     } else {
                    491:        strcpy(getcode, "(uae_s32)(uae_s16)get_word(srca)");
1.1       root      492:     }
1.1.1.3   root      493: 
                    494:     printf ("\tuae_u16 mask = %s;\n", gen_nextiword());
                    495:     printf ("\tunsigned int dmask = mask & 0xff, amask = (mask >> 8) & 0xff;\n");
                    496:     genamode (table68k[opcode].dmode, "dstreg", table68k[opcode].size, "src", 2, 1);
1.1       root      497:     start_brace();
1.1.1.3   root      498:     printf ("\twhile (dmask) { m68k_dreg(regs, movem_index1[dmask]) = %s; srca += %d; dmask = movem_next[dmask]; }\n",
1.1       root      499:                getcode, size);
1.1.1.3   root      500:     printf ("\twhile (amask) { m68k_areg(regs, movem_index1[amask]) = %s; srca += %d; amask = movem_next[amask]; }\n",
1.1       root      501:                getcode, size);
                    502: 
                    503:     if (table68k[opcode].dmode == Aipi)
1.1.1.3   root      504:        printf ("\tm68k_areg(regs, dstreg) = srca;\n");
1.1       root      505: }
                    506: 
1.1.1.3   root      507: static void genmovemle(uae_u16 opcode)
1.1       root      508: {
                    509:     char putcode[100];
                    510:     int size = table68k[opcode].size == sz_long ? 4 : 2;
                    511:     if (table68k[opcode].size == sz_long) {
1.1.1.3   root      512:        strcpy(putcode, "put_long(srca,");
                    513:     } else {
                    514:        strcpy(putcode, "put_word(srca,");
1.1       root      515:     }
1.1.1.3   root      516: 
                    517:     printf ("\tuae_u16 mask = %s;\n", gen_nextiword());
                    518:     genamode (table68k[opcode].dmode, "dstreg", table68k[opcode].size, "src", 2, 1);
                    519:     if (using_prefetch)
                    520:        sync_m68k_pc();
                    521: 
1.1       root      522:     start_brace();
                    523:     if (table68k[opcode].dmode == Apdi) {
1.1.1.3   root      524:        printf ("\tuae_u16 amask = mask & 0xff, dmask = (mask >> 8) & 0xff;\n");
                    525:        printf ("\twhile (amask) { srca -= %d; %s m68k_areg(regs, movem_index2[amask])); amask = movem_next[amask]; }\n",
                    526:           size, putcode);
                    527:        printf ("\twhile (dmask) { srca -= %d; %s m68k_dreg(regs, movem_index2[dmask])); dmask = movem_next[dmask]; }\n",
                    528:           size, putcode);
                    529:        printf ("\tm68k_areg(regs, dstreg) = srca;\n");
1.1.1.2   root      530:     } else {
1.1.1.3   root      531:        printf ("\tuae_u16 dmask = mask & 0xff, amask = (mask >> 8) & 0xff;\n");
                    532:        printf ("\twhile (dmask) { %s m68k_dreg(regs, movem_index1[dmask])); srca += %d; dmask = movem_next[dmask]; }\n",
                    533:           putcode, size);
                    534:        printf ("\twhile (amask) { %s m68k_areg(regs, movem_index1[amask])); srca += %d; amask = movem_next[amask]; }\n",
                    535:           putcode, size);
1.1       root      536:     }
                    537: }
                    538: 
                    539: typedef enum {
                    540:     flag_logical, flag_add, flag_sub, flag_cmp, flag_addx, flag_subx, flag_zn,
                    541:     flag_av, flag_sv
                    542: } flagtypes;
                    543: 
                    544: static void genflags_normal(flagtypes type, wordsizes size, char *value, char *src, char *dst)
                    545: {
                    546:     char vstr[100],sstr[100],dstr[100];
                    547:     char usstr[100],udstr[100];
                    548:     char unsstr[100],undstr[100];
                    549: 
1.1.1.3   root      550:     switch(size) {
1.1       root      551:      case sz_byte:
1.1.1.3   root      552:        strcpy(vstr, "((uae_s8)(");
                    553:        strcpy(usstr, "((uae_u8)(");
1.1       root      554:        break;
                    555:      case sz_word:
1.1.1.3   root      556:        strcpy(vstr, "((uae_s16)(");
                    557:        strcpy(usstr, "((uae_u16)(");
1.1       root      558:        break;
                    559:      case sz_long:
1.1.1.3   root      560:        strcpy(vstr, "((uae_s32)(");
                    561:        strcpy(usstr, "((uae_u32)(");
1.1       root      562:        break;
                    563:      default:
                    564:        abort();
                    565:     }
1.1.1.3   root      566:     strcpy(unsstr, usstr);
1.1       root      567: 
                    568:     strcpy(sstr, vstr);
                    569:     strcpy(dstr, vstr);
                    570:     strcat(vstr, value); strcat(vstr,"))");
                    571:     strcat(dstr, dst); strcat(dstr,"))");
                    572:     strcat(sstr, src); strcat(sstr,"))");
1.1.1.3   root      573: 
1.1       root      574:     strcpy(udstr, usstr);
                    575:     strcat(udstr, dst); strcat(udstr,"))");
                    576:     strcat(usstr, src); strcat(usstr,"))");
1.1.1.3   root      577: 
1.1       root      578:     strcpy(undstr, unsstr);
                    579:     strcat(unsstr, "-");
                    580:     strcat(undstr, "~");
                    581:     strcat(undstr, dst); strcat(undstr,"))");
                    582:     strcat(unsstr, src); strcat(unsstr,"))");
                    583: 
                    584:     switch (type) {
                    585:      case flag_logical:
                    586:      case flag_zn:
                    587:      case flag_av:
                    588:      case flag_sv:
                    589:      case flag_addx:
                    590:      case flag_subx:
                    591:        break;
1.1.1.3   root      592: 
1.1       root      593:      case flag_add:
                    594:        start_brace();
1.1.1.3   root      595:        printf ("uae_u32 %s = %s + %s;\n", value, dstr, sstr);
1.1       root      596:        break;
                    597:      case flag_sub:
                    598:      case flag_cmp:
                    599:        start_brace();
1.1.1.3   root      600:        printf ("uae_u32 %s = %s - %s;\n", value, dstr, sstr);
1.1       root      601:        break;
                    602:     }
                    603: 
                    604: 
                    605:     switch (type) {
                    606:      case flag_logical:
                    607:      case flag_zn:
                    608:        break;
1.1.1.3   root      609: 
1.1       root      610:      case flag_add:
                    611:      case flag_sub:
                    612:      case flag_addx:
                    613:      case flag_subx:
                    614:      case flag_cmp:
                    615:      case flag_av:
                    616:      case flag_sv:
                    617:        start_brace();
1.1.1.3   root      618:        printf ("\t"BOOL_TYPE" flgs = %s < 0;\n", sstr);
                    619:        printf ("\t"BOOL_TYPE" flgo = %s < 0;\n", dstr);
                    620:        printf ("\t"BOOL_TYPE" flgn = %s < 0;\n", vstr);
1.1       root      621:        break;
                    622:     }
1.1.1.3   root      623: 
1.1       root      624:     switch(type) {
                    625:      case flag_logical:
1.1.1.3   root      626:        printf ("\tVFLG = CFLG = 0;\n");
                    627:        printf ("\tZFLG = %s == 0;\n", vstr);
                    628:        printf ("\tNFLG = %s < 0;\n", vstr);
1.1       root      629:        break;
                    630:      case flag_av:
1.1.1.3   root      631:        printf ("\tVFLG = (flgs == flgo) && (flgn != flgo);\n");
1.1       root      632:        break;
                    633:      case flag_sv:
1.1.1.3   root      634:        printf ("\tVFLG = (flgs != flgo) && (flgn != flgo);\n");
1.1       root      635:        break;
                    636:      case flag_zn:
1.1.1.3   root      637:        printf ("\tif (%s != 0) ZFLG = 0;\n", vstr);
                    638:        printf ("\tNFLG = %s < 0;\n", vstr);
1.1       root      639:        break;
                    640:      case flag_add:
1.1.1.3   root      641:        printf ("\tZFLG = %s == 0;\n", vstr);
                    642:        printf ("\tVFLG = (flgs == flgo) && (flgn != flgo);\n");
                    643:        printf ("\tCFLG = XFLG = %s < %s;\n", undstr, usstr);
                    644:        printf ("\tNFLG = flgn != 0;\n");
1.1       root      645:        break;
                    646:      case flag_sub:
1.1.1.3   root      647:        printf ("\tZFLG = %s == 0;\n", vstr);
                    648:        printf ("\tVFLG = (flgs != flgo) && (flgn != flgo);\n");
                    649:        printf ("\tCFLG = XFLG = %s > %s;\n", usstr, udstr);
                    650:        printf ("\tNFLG = flgn != 0;\n");
1.1       root      651:        break;
                    652:      case flag_addx:
1.1.1.3   root      653:        printf ("\tVFLG = (flgs && flgo && !flgn) || (!flgs && !flgo && flgn);\n");
                    654:        printf ("\tXFLG = CFLG = (flgs && flgo) || (!flgn && (flgo || flgs));\n");
1.1       root      655:        break;
                    656:      case flag_subx:
1.1.1.3   root      657:        printf ("\tVFLG = (!flgs && flgo && !flgn) || (flgs && !flgo && flgn);\n");
                    658:        printf ("\tXFLG = CFLG = (flgs && !flgo) || (flgn && (!flgo || flgs));\n");
1.1       root      659:        break;
                    660:      case flag_cmp:
1.1.1.3   root      661:        printf ("\tZFLG = %s == 0;\n", vstr);
                    662:        printf ("\tVFLG = (flgs != flgo) && (flgn != flgo);\n");
                    663:        printf ("\tCFLG = %s > %s;\n", usstr, udstr);
                    664:        printf ("\tNFLG = flgn != 0;\n");
1.1       root      665:        break;
                    666:     }
                    667: }
                    668: 
                    669: static void genflags(flagtypes type, wordsizes size, char *value, char *src, char *dst)
                    670: {
1.1.1.3   root      671: #ifdef X86_ASSEMBLY
1.1       root      672:     start_brace();
1.1.1.3   root      673:     printf ("\tuae_u32 scratch;\n");
1.1       root      674:     switch (type) {
1.1.1.3   root      675:      case flag_add: case flag_sub:
                    676:        start_brace();
                    677:        printf ("\tuae_u32 %s;\n", value);
1.1       root      678:        break;
                    679: 
1.1.1.3   root      680:      default:
1.1       root      681:        break;
                    682:     }
                    683: 
1.1.1.3   root      684:     /* At least some of those casts are fairly important! */
1.1       root      685:     switch(type) {
                    686:      case flag_logical:
                    687:        if (strcmp(value, "0") == 0) {
1.1.1.3   root      688:            printf ("\t*(uae_u32 *)&regflags = 64;\n");
1.1       root      689:        } else {
                    690:            switch(size) {
1.1.1.3   root      691:             case sz_byte: printf ("\tx86_flag_testb ((uae_s8)(%s));\n", value); break;
                    692:             case sz_word: printf ("\tx86_flag_testw ((uae_s16)(%s));\n", value); break;
                    693:             case sz_long: printf ("\tx86_flag_testl ((uae_s32)(%s));\n", value); break;
1.1       root      694:            }
                    695:        }
                    696:        return;
                    697: 
                    698:      case flag_add:
1.1.1.3   root      699:        switch(size) {
                    700:         case sz_byte: printf ("\tx86_flag_addb (%s, (uae_s8)(%s), (uae_s8)(%s));\n", value, src, dst); break;
                    701:         case sz_word: printf ("\tx86_flag_addw (%s, (uae_s16)(%s), (uae_s16)(%s));\n", value, src, dst); break;
                    702:         case sz_long: printf ("\tx86_flag_addl (%s, (uae_s32)(%s), (uae_s32)(%s));\n", value, src, dst); break;
1.1       root      703:        }
                    704:        return;
                    705: 
                    706:      case flag_sub:
1.1.1.3   root      707:        switch(size) {
                    708:         case sz_byte: printf ("\tx86_flag_subb (%s, (uae_s8)(%s), (uae_s8)(%s));\n", value, src, dst); break;
                    709:         case sz_word: printf ("\tx86_flag_subw (%s, (uae_s16)(%s), (uae_s16)(%s));\n", value, src, dst); break;
                    710:         case sz_long: printf ("\tx86_flag_subl (%s, (uae_s32)(%s), (uae_s32)(%s));\n", value, src, dst); break;
1.1       root      711:        }
                    712:        return;
                    713: 
                    714:      case flag_cmp:
1.1.1.3   root      715:        switch(size) {
                    716:         case sz_byte: printf ("\tx86_flag_cmpb ((uae_s8)(%s), (uae_s8)(%s));\n", src, dst); break;
                    717:         case sz_word: printf ("\tx86_flag_cmpw ((uae_s16)(%s), (uae_s16)(%s));\n", src, dst); break;
                    718:         case sz_long: printf ("\tx86_flag_cmpl ((uae_s32)(%s), (uae_s32)(%s));\n", src, dst); break;
1.1       root      719:        }
                    720:        return;
1.1.1.3   root      721: 
                    722:      default:
                    723:        break;
1.1       root      724:     }
1.1.1.2   root      725: #elif defined(M68K_FLAG_OPT)
1.1.1.3   root      726:     /* sam: here I'm cloning what X86_ASSEMBLY does */
                    727: #define EXT(size)  (size==sz_byte?"b":(size==sz_word?"w":"l"))
                    728: #define CAST(size) (size==sz_byte?"uae_s8":(size==sz_word?"uae_s16":"uae_s32"))
1.1.1.2   root      729:     switch (type) {
1.1.1.3   root      730:      case flag_add: case flag_sub:
                    731:        start_brace();
                    732:        printf ("\tuae_u32 %s;\n", value);
1.1.1.2   root      733:        break;
                    734: 
1.1.1.3   root      735:      default:
1.1.1.2   root      736:        break;
                    737:     }
                    738: 
                    739:     switch(type) {
                    740:      case flag_logical:
                    741:        if (strcmp(value, "0") == 0) {
1.1.1.3   root      742:            printf ("\t*(uae_u16 *)&regflags = 4;\n"); /* Z = 1 */
1.1.1.2   root      743:        } else {
1.1.1.3   root      744:            printf ("\tm68k_flag_tst (%s, (%s)(%s));\n", 
                    745:                   EXT(size), CAST(size), value);
1.1.1.2   root      746:        }
                    747:        return;
                    748: 
                    749:      case flag_add:
1.1.1.3   root      750:        printf ("\t{uae_u16 ccr;\n");
                    751:        printf ("\tm68k_flag_add (%s, (%s)%s, (%s)(%s), (%s)(%s));\n", 
                    752:               EXT(size), CAST(size), value, CAST(size), src, CAST(size), dst);
                    753:        printf ("\t((uae_u16*)&regflags)[1]=((uae_u16*)&regflags)[0]=ccr;}\n");
1.1.1.2   root      754:        return;
                    755: 
                    756:      case flag_sub:
1.1.1.3   root      757:        printf ("\t{uae_u16 ccr;\n");
                    758:        printf ("\tm68k_flag_sub (%s, (%s)%s, (%s)(%s), (%s)(%s));\n", 
                    759:               EXT(size), CAST(size), value, CAST(size), src, CAST(size), dst);
                    760:        printf ("\t((uae_u16*)&regflags)[1]=((uae_u16*)&regflags)[0]=ccr;}\n");
1.1.1.2   root      761:        return;
                    762: 
                    763:      case flag_cmp:
1.1.1.3   root      764:        printf ("\tm68k_flag_cmp (%s, (%s)(%s), (%s)(%s));\n", 
                    765:               EXT(size), CAST(size), src, CAST(size), dst);
1.1.1.2   root      766:        return;
1.1.1.3   root      767: 
                    768:      default:
                    769:        break;
1.1.1.2   root      770:     }
1.1.1.3   root      771: #elif defined(ACORN_FLAG_OPT) && defined(__GNUC_MINOR__)
                    772: /*
                    773:  * This is new. Might be quite buggy.
                    774:  */
                    775:   switch (type)
                    776:   {
                    777:     case flag_av:
                    778:     case flag_sv:
                    779:     case flag_zn:
                    780:     case flag_addx:
                    781:     case flag_subx:
                    782:       break;
                    783: 
                    784:     case flag_logical:
                    785:       if (strcmp(value, "0") == 0) {
                    786:        /* v=c=n=0 z=1 */
                    787:         printf ("\t*(ULONG*)&regflags = 0x40000000;\n");
                    788:         return;
                    789:       }
                    790:       else
                    791:       {
                    792:        start_brace();
                    793:        switch(size)
                    794:        {
                    795:          case sz_byte:
                    796:            printf ("\tUBYTE ccr;\n");
                    797:            printf ("\tULONG shift;\n");
                    798:            printf ("\t__asm__(\"mov %%2,%%1,lsl#24\n\ttst %%2,%%2\n\tmov %%0,r15,lsr#24\n\tbic %%0,%%0,#0x30\"\n"
                    799:                   "\t: \"=r\" (ccr) : \"r\" (%s), \"r\" (shift) : \"cc\" );\n", value);
                    800:            printf ("\t*((UBYTE*)&regflags+3) = ccr;\n");
                    801:            return;
                    802:          case sz_word:
                    803:            printf ("\tUBYTE ccr;\n");
                    804:            printf ("\tULONG shift;\n");
                    805:            printf ("\t__asm__(\"mov %%2,%%1,lsl#16\n\ttst %%2,%%2\n\tmov %%0,r15,lsr#24\n\tbic %%0,%%0,#0x30\"\n"
                    806:                   "\t: \"=r\" (ccr) : \"r\" ((WORD)%s), \"r\" (shift) : \"cc\" );\n", value);
                    807:            printf ("\t*((UBYTE*)&regflags+3) = ccr;\n");
                    808:            return;
                    809:          case sz_long:
                    810:            printf ("\tUBYTE ccr;\n");
                    811:            printf ("\t__asm__(\"tst %%1,%%1\n\tmov %%0,r15,lsr#24\n\tbic %%0,%%0,#0x30\"\n"
                    812:                   "\t: \"=r\" (ccr) : \"r\" ((LONG)%s) : \"cc\" );\n", value);
                    813:            printf ("\t*((UBYTE*)&regflags+3) = ccr;\n");
                    814:            return;
                    815:        }
                    816:       }
                    817:       break;
                    818:     case flag_add:
                    819:       if(strcmp(dst,"0")==0)
                    820:       {
                    821:        printf ("/* Error! Hier muss Peter noch was machen !!! (ADD-Flags) */");
                    822:       }
                    823:       else
                    824:       {
                    825:        start_brace();
                    826:        switch (size)
                    827:        {
                    828:          case sz_byte:
                    829:            printf ("\tULONG ccr, shift, %s;\n", value);
                    830:            printf ("\t__asm__(\"mov %%4,%%3,lsl#24\n\tadds %%0,%%4,%%2,lsl#24\n\tmov %%0,%%0,asr#24\n\tmov %%1,r15\n\torr %%1,%%1,%%1,lsr#29\"\n"
                    831:                   "\t: \"=r\" (%s), \"=r\" (ccr) : \"r\" (%s), \"r\" (%s), \"r\" (shift) : \"cc\" );\n", value, src, dst);
                    832:            printf ("\t*(ULONG*)&regflags = ccr;\n");
                    833:            return;
                    834:          case sz_word:
                    835:            printf ("\tULONG ccr, shift, %s;\n", value);
                    836:            printf ("\t__asm__(\"mov %%4,%%3,lsl#16\n\tadds %%0,%%4,%%2,lsl#16\n\tmov %%0,%%0,asr#16\n\tmov %%1,r15\n\torr %%1,%%1,%%1,lsr#29\"\n"
                    837:                   "\t: \"=r\" (%s), \"=r\" (ccr) : \"r\" ((WORD)%s), \"r\" ((WORD)%s), \"r\" (shift) : \"cc\" );\n", value, src, dst);
                    838:            printf ("\t*(ULONG*)&regflags = ccr;\n");
                    839:            return;
                    840:          case sz_long:
                    841:            printf ("\tULONG ccr, %s;\n", value);
                    842:            printf ("\t__asm__(\"adds %%0,%%3,%%2\n\tmov %%1,r15\n\torr %%1,%%1,%%1,lsr#29\"\n"
                    843:                   "\t: \"=r\" (%s), \"=r\" (ccr) : \"r\" ((LONG)%s), \"r\" ((LONG)%s) : \"cc\" );\n", value, src, dst);
                    844:            printf ("\t*(ULONG*)&regflags = ccr;\n");
                    845:            return;
                    846:        }
                    847:       }
                    848:       break;
                    849:     case flag_sub:
                    850:       if(strcmp(dst,"0")==0)
                    851:       {
                    852:        printf ("/* Error! Hier muss Peter noch was machen !!! (SUB-Flags) */");
                    853:       }
                    854:       else
                    855:       {
                    856:        start_brace();
                    857:        switch (size)
                    858:        {
                    859:          case sz_byte:
                    860:            printf ("\tULONG ccr, shift, %s;\n", value);
                    861:            printf ("\t__asm__(\"mov %%4,%%3,lsl#24\n\tsubs %%0,%%4,%%2,lsl#24\n\tmov %%0,%%0,asr#24\n\tmov %%1,r15\n\teor %%1,%%1,#0x20000000\n\torr %%1,%%1,%%1,lsr#29\"\n"
                    862:                   "\t: \"=r\" (%s), \"=r\" (ccr) : \"r\" (%s), \"r\" (%s), \"r\" (shift) : \"cc\" );\n", value, src, dst);
                    863:            printf ("\t*(ULONG*)&regflags = ccr;\n");
                    864:            return;
                    865:          case sz_word:
                    866:            printf ("\tULONG ccr, shift, %s;\n", value);
                    867:            printf ("\t__asm__(\"mov %%4,%%3,lsl#16\n\tsubs %%0,%%4,%%2,lsl#16\n\tmov %%0,%%0,asr#16\n\tmov %%1,r15\n\teor %%1,%%1,#0x20000000\n\torr %%1,%%1,%%1,lsr#29\"\n"
                    868:                   "\t: \"=r\" (%s), \"=r\" (ccr) : \"r\" ((WORD)%s), \"r\" ((WORD)%s), \"r\" (shift) : \"cc\" );\n", value, src, dst);
                    869:            printf ("\t*(ULONG*)&regflags = ccr;\n");
                    870:            return;
                    871:          case sz_long:
                    872:            printf ("\tULONG ccr, %s;\n", value);
                    873:            printf ("\t__asm__(\"subs %%0,%%3,%%2\n\tmov %%1,r15\n\teor %%1,%%1,#0x20000000\n\torr %%1,%%1,%%1,lsr#29\"\n"
                    874:                   "\t: \"=r\" (%s), \"=r\" (ccr) : \"r\" ((LONG)%s), \"r\" ((LONG)%s) : \"cc\" );\n", value, src, dst);
                    875:            printf ("\t*(ULONG*)&regflags = ccr;\n");
                    876:            return;
                    877:        }
                    878:       }
                    879:       break;
                    880:     case flag_cmp:
                    881:       if(strcmp(dst,"0")==0)
                    882:       {
                    883:        printf ("/*Error! Hier muss Peter noch was machen !!! (CMP-Flags)*/");
                    884:       }
                    885:       else
                    886:       {
                    887:        start_brace();
                    888:        switch (size)
                    889:        {
                    890:        case sz_byte:
                    891:          printf ("\tULONG shift, ccr;\n");
                    892:          printf ("\t__asm__(\"mov %%3,%%2,lsl#24\n\tcmp %%3,%%1,lsl#24\n\tmov %%0,r15,lsr#24\n\teor %%0,%%0,#0x20\"\n"
                    893:                 "\t: \"=r\" (ccr) : \"r\" (%s), \"r\" (%s), \"r\" (shift) : \"cc\" );\n", src, dst);
                    894:          printf ("\t*((UBYTE*)&regflags+3) = ccr;\n");
                    895:          return;
                    896:        case sz_word:
                    897:          printf ("\tULONG shift, ccr;\n");
                    898:          printf ("\t__asm__(\"mov %%3,%%2,lsl#16\n\tcmp %%3,%%1,lsl#16\n\tmov %%0,r15,lsr#24\n\teor %%0,%%0,#0x20\"\n"
                    899:                 "\t: \"=r\" (ccr) : \"r\" ((WORD)%s), \"r\" ((WORD)%s), \"r\" (shift) : \"cc\" );\n", src, dst);
                    900:          printf ("\t*((UBYTE*)&regflags+3) = ccr;\n");
                    901:          return;
                    902:        case sz_long:
                    903:          printf ("\tULONG ccr;\n");
                    904:          printf ("\t__asm__(\"cmp %%2,%%1\n\tmov %%0,r15,lsr#24\n\teor %%0,%%0,#0x20\"\n"
                    905:                 "\t: \"=r\" (ccr) : \"r\" ((LONG)%s), \"r\" ((LONG)%s) : \"cc\" );\n", src, dst);
                    906:          printf ("\t*((UBYTE*)&regflags+3) = ccr;\n");
                    907:          /*printf ("\tprintf (\"%%08x %%08x %%08x\\n\", %s, %s, *((ULONG*)&regflags));\n", src, dst);*/
                    908:          return;
                    909:        }
                    910:       }
                    911:       break;
                    912:   }
1.1       root      913: #endif
                    914:     genflags_normal(type, size, value, src, dst);
                    915: }
1.1.1.3   root      916: 
                    917: static void gen_opcode(unsigned long int opcode)
1.1       root      918: {
                    919:     start_brace ();
1.1.1.3   root      920: #if 0
                    921:     printf ("uae_u8 *m68k_pc = regs.pc_p;\n");
                    922: #endif
                    923:     m68k_pc_offset = 2;
1.1       root      924:     switch (table68k[opcode].plev) {
1.1.1.3   root      925:      case 0: /* not privileged */
1.1       root      926:        break;
1.1.1.3   root      927:      case 1: /* unprivileged only on 68000 */
                    928:        if (cpu_level == 0)
1.1       root      929:            break;
1.1.1.3   root      930:        if (next_cpu_level < 0)
                    931:            next_cpu_level = 0;
                    932: 
1.1       root      933:        /* FALLTHROUGH */
                    934:      case 2: /* priviledged */
1.1.1.3   root      935:        printf ("if (!regs.s) { Exception(8,0); goto %s; }\n", endlabelstr);
1.1       root      936:        start_brace();
                    937:        break;
1.1.1.3   root      938:      case 3: /* privileged if size == word */
1.1       root      939:        if (table68k[opcode].size == sz_byte)
                    940:            break;
1.1.1.3   root      941:        printf ("if (!regs.s) { Exception(8,0); goto %s; }\n", endlabelstr);
1.1       root      942:        start_brace();
                    943:        break;
                    944:     }
                    945:     switch(table68k[opcode].mnemo) {
                    946:      case i_OR:
1.1.1.3   root      947:        genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0);
                    948:        genamode (table68k[opcode].dmode, "dstreg", table68k[opcode].size, "dst", 1, 0);
                    949:        printf ("\tsrc |= dst;\n");
1.1       root      950:        genflags(flag_logical, table68k[opcode].size, "src", "", "");
1.1.1.3   root      951:        genastore ("src", table68k[opcode].dmode, "dstreg", table68k[opcode].size, "dst");
1.1       root      952:        break;
                    953:      case i_AND:
1.1.1.3   root      954:        genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0);
                    955:        genamode (table68k[opcode].dmode, "dstreg", table68k[opcode].size, "dst", 1, 0);
                    956:        printf ("\tsrc &= dst;\n");
1.1       root      957:        genflags(flag_logical, table68k[opcode].size, "src", "", "");
1.1.1.3   root      958:        genastore ("src", table68k[opcode].dmode, "dstreg", table68k[opcode].size, "dst");
1.1       root      959:        break;
                    960:      case i_EOR:
1.1.1.3   root      961:        genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0);
                    962:        genamode (table68k[opcode].dmode, "dstreg", table68k[opcode].size, "dst", 1, 0);
                    963:        printf ("\tsrc ^= dst;\n");
1.1       root      964:        genflags(flag_logical, table68k[opcode].size, "src", "", "");
1.1.1.3   root      965:        genastore ("src", table68k[opcode].dmode, "dstreg", table68k[opcode].size, "dst");
1.1       root      966:        break;
                    967:      case i_ORSR:
1.1.1.3   root      968:        printf ("\tMakeSR();\n");
                    969:        genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0);
1.1       root      970:        if (table68k[opcode].size == sz_byte) {
1.1.1.3   root      971:            printf ("\tsrc &= 0xFF;\n");
1.1       root      972:        }
1.1.1.3   root      973:        printf ("\tregs.sr |= src;\n");
                    974:        printf ("\tMakeFromSR();\n");
1.1       root      975:        break;
1.1.1.3   root      976:      case i_ANDSR:
                    977:        printf ("\tMakeSR();\n");
                    978:        genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0);
1.1       root      979:        if (table68k[opcode].size == sz_byte) {
1.1.1.3   root      980:            printf ("\tsrc |= 0xFF00;\n");
1.1       root      981:        }
1.1.1.3   root      982:        printf ("\tregs.sr &= src;\n");
                    983:        printf ("\tMakeFromSR();\n");
1.1       root      984:        break;
                    985:      case i_EORSR:
1.1.1.3   root      986:        printf ("\tMakeSR();\n");
                    987:        genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0);
1.1       root      988:        if (table68k[opcode].size == sz_byte) {
1.1.1.3   root      989:            printf ("\tsrc &= 0xFF;\n");
1.1       root      990:        }
1.1.1.3   root      991:        printf ("\tregs.sr ^= src;\n");
                    992:        printf ("\tMakeFromSR();\n");
1.1       root      993:        break;
1.1.1.3   root      994:      case i_SUB:
                    995:        genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0);
                    996:        genamode (table68k[opcode].dmode, "dstreg", table68k[opcode].size, "dst", 1, 0);
1.1       root      997:        start_brace ();
                    998:        genflags(flag_sub, table68k[opcode].size, "newv", "src", "dst");
1.1.1.3   root      999:        genastore ("newv", table68k[opcode].dmode, "dstreg", table68k[opcode].size, "dst");
1.1       root     1000:        break;
                   1001:      case i_SUBA:
1.1.1.3   root     1002:        genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0);
                   1003:        genamode (table68k[opcode].dmode, "dstreg", sz_long, "dst", 1, 0);
1.1       root     1004:        start_brace ();
1.1.1.3   root     1005:        printf ("\tuae_u32 newv = dst - src;\n");
                   1006:        genastore ("newv", table68k[opcode].dmode, "dstreg", sz_long, "dst");
1.1       root     1007:        break;
                   1008:      case i_SUBX:
1.1.1.3   root     1009:        genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0);
                   1010:        genamode (table68k[opcode].dmode, "dstreg", table68k[opcode].size, "dst", 1, 0);
1.1       root     1011:        start_brace ();
1.1.1.3   root     1012:        printf ("\tuae_u32 newv = dst - src - (XFLG ? 1 : 0);\n");
1.1       root     1013:        genflags(flag_subx, table68k[opcode].size, "newv", "src", "dst");
                   1014:        genflags(flag_zn, table68k[opcode].size, "newv", "", "");
1.1.1.3   root     1015:        genastore ("newv", table68k[opcode].dmode, "dstreg", table68k[opcode].size, "dst");
1.1       root     1016:        break;
                   1017:      case i_SBCD:
                   1018:        /* Let's hope this works... */
1.1.1.3   root     1019:        genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0);
                   1020:        genamode (table68k[opcode].dmode, "dstreg", table68k[opcode].size, "dst", 1, 0);
1.1       root     1021:        start_brace ();
1.1.1.3   root     1022:        printf ("\tuae_u16 newv_lo = (dst & 0xF) - (src & 0xF) - (XFLG ? 1 : 0);\n");
                   1023:        printf ("\tuae_u16 newv_hi = (dst & 0xF0) - (src & 0xF0);\n");
                   1024:        printf ("\tuae_u16 newv;\n");
                   1025:        printf ("\tif (newv_lo > 9) { newv_lo-=6; newv_hi-=0x10; }\n");
                   1026:        printf ("\tnewv = newv_hi + (newv_lo & 0xF);");
                   1027:        printf ("\tCFLG = XFLG = (newv_hi & 0x1F0) > 0x90;\n");
                   1028:        printf ("\tif (CFLG) newv -= 0x60;\n");
                   1029:        genflags(flag_zn, table68k[opcode].size, "newv", "", "");
                   1030:        genflags(flag_sv, table68k[opcode].size, "newv", "src", "dst");
                   1031:        genastore ("newv", table68k[opcode].dmode, "dstreg", table68k[opcode].size, "dst");
1.1       root     1032:        break;
                   1033:      case i_ADD:
1.1.1.3   root     1034:        genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0);
                   1035:        genamode (table68k[opcode].dmode, "dstreg", table68k[opcode].size, "dst", 1, 0);
1.1       root     1036:        start_brace ();
                   1037:        genflags(flag_add, table68k[opcode].size, "newv", "src", "dst");
1.1.1.3   root     1038:        genastore ("newv", table68k[opcode].dmode, "dstreg", table68k[opcode].size, "dst");
1.1       root     1039:        break;
1.1.1.3   root     1040:      case i_ADDA:
                   1041:        genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0);
                   1042:        genamode (table68k[opcode].dmode, "dstreg", sz_long, "dst", 1, 0);
1.1       root     1043:        start_brace ();
1.1.1.3   root     1044:        printf ("\tuae_u32 newv = dst + src;\n");
                   1045:        genastore ("newv", table68k[opcode].dmode, "dstreg", sz_long, "dst");
1.1       root     1046:        break;
                   1047:      case i_ADDX:
1.1.1.3   root     1048:        genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0);
                   1049:        genamode (table68k[opcode].dmode, "dstreg", table68k[opcode].size, "dst", 1, 0);
1.1       root     1050:        start_brace ();
1.1.1.3   root     1051:        printf ("\tuae_u32 newv = dst + src + (XFLG ? 1 : 0);\n");
1.1       root     1052:        genflags(flag_addx, table68k[opcode].size, "newv", "src", "dst");
                   1053:        genflags(flag_zn, table68k[opcode].size, "newv", "", "");
1.1.1.3   root     1054:        genastore ("newv", table68k[opcode].dmode, "dstreg", table68k[opcode].size, "dst");
1.1       root     1055:        break;
                   1056:      case i_ABCD:
1.1.1.3   root     1057:        genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0);
                   1058:        genamode (table68k[opcode].dmode, "dstreg", table68k[opcode].size, "dst", 1, 0);
1.1       root     1059:        start_brace ();
1.1.1.3   root     1060:        printf ("\tuae_u16 newv_lo = (src & 0xF) + (dst & 0xF) + (XFLG ? 1 : 0);\n");
                   1061:        printf ("\tuae_u16 newv_hi = (src & 0xF0) + (dst & 0xF0);\n");
                   1062:        printf ("\tuae_u16 newv;\n");
                   1063:        printf ("\tif (newv_lo > 9) { newv_lo +=6; }\n");
                   1064:        printf ("\tnewv = newv_hi + newv_lo;");
                   1065:        printf ("\tCFLG = XFLG = (newv & 0x1F0) > 0x90;\n");
                   1066:        printf ("\tif (CFLG) newv += 0x60;\n");
1.1       root     1067:        genflags(flag_zn, table68k[opcode].size, "newv", "", "");
1.1.1.3   root     1068:        genflags(flag_sv, table68k[opcode].size, "newv", "src", "dst");
                   1069:        genastore ("newv", table68k[opcode].dmode, "dstreg", table68k[opcode].size, "dst");
1.1       root     1070:        break;
                   1071:      case i_NEG:
1.1.1.3   root     1072:        genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0);
1.1       root     1073:        start_brace ();
                   1074:        genflags(flag_sub, table68k[opcode].size, "dst", "src", "0");
1.1.1.3   root     1075:        genastore ("dst",table68k[opcode].smode, "srcreg", table68k[opcode].size, "src");
1.1       root     1076:        break;
                   1077:      case i_NEGX:
1.1.1.3   root     1078:        genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0);
1.1       root     1079:        start_brace ();
1.1.1.3   root     1080:        printf ("\tuae_u32 newv = 0 - src - (XFLG ? 1 : 0);\n");
1.1       root     1081:        genflags(flag_subx, table68k[opcode].size, "newv", "src", "0");
                   1082:        genflags(flag_zn, table68k[opcode].size, "newv", "", "");
1.1.1.3   root     1083:        genastore ("newv", table68k[opcode].smode, "srcreg", table68k[opcode].size, "src");
1.1       root     1084:        break;
1.1.1.3   root     1085:      case i_NBCD:
                   1086:        genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0);
1.1       root     1087:        start_brace ();
1.1.1.3   root     1088:        printf ("\tuae_u16 newv_lo = - (src & 0xF) - (XFLG ? 1 : 0);\n");
                   1089:        printf ("\tuae_u16 newv_hi = - (src & 0xF0);\n");
                   1090:        printf ("\tuae_u16 newv;\n");
                   1091:        printf ("\tif (newv_lo > 9) { newv_lo-=6; newv_hi-=0x10; }\n");
                   1092:        printf ("\tnewv = newv_hi + (newv_lo & 0xF);");
                   1093:        printf ("\tCFLG = XFLG = (newv_hi & 0x1F0) > 0x90;\n");
                   1094:        printf ("\tif (CFLG) newv -= 0x60;\n");
1.1       root     1095:        genflags(flag_zn, table68k[opcode].size, "newv", "", "");
1.1.1.3   root     1096:        genastore ("newv", table68k[opcode].smode, "srcreg", table68k[opcode].size, "src");
1.1       root     1097:        break;
1.1.1.3   root     1098:      case i_CLR:
                   1099:        genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 2, 0);
1.1       root     1100:        genflags(flag_logical, table68k[opcode].size, "0", "", "");
1.1.1.3   root     1101:        genastore ("0",table68k[opcode].smode, "srcreg", table68k[opcode].size, "src");
1.1       root     1102:        break;
1.1.1.3   root     1103:      case i_NOT:
                   1104:        genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0);
1.1       root     1105:        start_brace ();
1.1.1.3   root     1106:        printf ("\tuae_u32 dst = ~src;\n");
1.1       root     1107:        genflags(flag_logical, table68k[opcode].size, "dst", "", "");
1.1.1.3   root     1108:        genastore ("dst",table68k[opcode].smode, "srcreg", table68k[opcode].size, "src");
1.1       root     1109:        break;
                   1110:      case i_TST:
1.1.1.3   root     1111:        genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0);
1.1       root     1112:        genflags(flag_logical, table68k[opcode].size, "src", "", "");
                   1113:        break;
                   1114:      case i_BTST:
1.1.1.3   root     1115:        genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0);
                   1116:        genamode (table68k[opcode].dmode, "dstreg", table68k[opcode].size, "dst", 1, 0);
1.1       root     1117:        if (table68k[opcode].size == sz_byte)
1.1.1.3   root     1118:            printf ("\tsrc &= 7;\n");
1.1       root     1119:        else
1.1.1.3   root     1120:            printf ("\tsrc &= 31;\n");
                   1121:        printf ("\tZFLG = !(dst & (1 << src));\n");
1.1       root     1122:        break;
                   1123:      case i_BCHG:
1.1.1.3   root     1124:        genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0);
                   1125:        genamode (table68k[opcode].dmode, "dstreg", table68k[opcode].size, "dst", 1, 0);
1.1       root     1126:        if (table68k[opcode].size == sz_byte)
1.1.1.3   root     1127:            printf ("\tsrc &= 7;\n");
1.1       root     1128:        else
1.1.1.3   root     1129:            printf ("\tsrc &= 31;\n");
                   1130:        printf ("\tZFLG = !(dst & (1 << src));\n");
                   1131:        printf ("\tdst ^= (1 << src);\n");
                   1132:        genastore ("dst", table68k[opcode].dmode, "dstreg", table68k[opcode].size, "dst");
1.1       root     1133:        break;
                   1134:      case i_BCLR:
1.1.1.3   root     1135:        genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0);
                   1136:        genamode (table68k[opcode].dmode, "dstreg", table68k[opcode].size, "dst", 1, 0);
1.1       root     1137:        if (table68k[opcode].size == sz_byte)
1.1.1.3   root     1138:            printf ("\tsrc &= 7;\n");
1.1       root     1139:        else
1.1.1.3   root     1140:            printf ("\tsrc &= 31;\n");
                   1141:        printf ("\tZFLG = !(dst & (1 << src));\n");
                   1142:        printf ("\tdst &= ~(1 << src);\n");
                   1143:        genastore ("dst", table68k[opcode].dmode, "dstreg", table68k[opcode].size, "dst");
1.1       root     1144:        break;
                   1145:      case i_BSET:
1.1.1.3   root     1146:        genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0);
                   1147:        genamode (table68k[opcode].dmode, "dstreg", table68k[opcode].size, "dst", 1, 0);
1.1       root     1148:        if (table68k[opcode].size == sz_byte)
1.1.1.3   root     1149:            printf ("\tsrc &= 7;\n");
1.1       root     1150:        else
1.1.1.3   root     1151:            printf ("\tsrc &= 31;\n");
                   1152:        printf ("\tZFLG = !(dst & (1 << src));\n");
                   1153:        printf ("\tdst |= (1 << src);\n");
                   1154:        genastore ("dst", table68k[opcode].dmode, "dstreg", table68k[opcode].size, "dst");
1.1       root     1155:        break;
                   1156:      case i_CMPM:
                   1157:      case i_CMP:
1.1.1.3   root     1158:        genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0);
                   1159:        genamode (table68k[opcode].dmode, "dstreg", table68k[opcode].size, "dst", 1, 0);
1.1       root     1160:        start_brace ();
                   1161:        genflags(flag_cmp, table68k[opcode].size, "newv", "src", "dst");
                   1162:        break;
1.1.1.3   root     1163:      case i_CMPA:
                   1164:        genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0);
                   1165:        genamode (table68k[opcode].dmode, "dstreg", sz_long, "dst", 1, 0);
1.1       root     1166:        start_brace ();
                   1167:        genflags(flag_cmp, sz_long, "newv", "src", "dst");
                   1168:        break;
                   1169:        /* The next two are coded a little unconventional, but they are doing
                   1170:         * weird things... */
                   1171:      case i_MVPRM:
1.1.1.3   root     1172:        genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0);
1.1.1.4 ! root     1173:        printf ("\tuaecptr memp = m68k_areg(regs, dstreg) + (uae_s32)(uae_s16)%s;\n", gen_nextiword());
1.1       root     1174:        if (table68k[opcode].size == sz_word) {
1.1.1.3   root     1175:            printf ("\tput_byte(memp, src >> 8); put_byte(memp + 2, src);\n");
1.1       root     1176:        } else {
1.1.1.3   root     1177:            printf ("\tput_byte(memp, src >> 24); put_byte(memp + 2, src >> 16);\n");
                   1178:            printf ("\tput_byte(memp + 4, src >> 8); put_byte(memp + 6, src);\n");
1.1       root     1179:        }
                   1180:        break;
1.1.1.3   root     1181:      case i_MVPMR:
1.1.1.4 ! root     1182:        printf ("\tuaecptr memp = m68k_areg(regs, srcreg) + (uae_s32)(uae_s16)%s;\n", gen_nextiword());
1.1.1.3   root     1183:        genamode (table68k[opcode].dmode, "dstreg", table68k[opcode].size, "dst", 2, 0);
1.1       root     1184:        if (table68k[opcode].size == sz_word) {
1.1.1.3   root     1185:            printf ("\tuae_u16 val = (get_byte(memp) << 8) + get_byte(memp + 2);\n");
1.1       root     1186:        } else {
1.1.1.3   root     1187:            printf ("\tuae_u32 val = (get_byte(memp) << 24) + (get_byte(memp + 2) << 16)\n");
                   1188:            printf ("              + (get_byte(memp + 4) << 8) + get_byte(memp + 6);\n");
1.1       root     1189:        }
1.1.1.3   root     1190:        genastore ("val", table68k[opcode].dmode, "dstreg", table68k[opcode].size, "dst");
1.1       root     1191:        break;
                   1192:      case i_MOVE:
1.1.1.3   root     1193:        genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0);
                   1194:        genamode (table68k[opcode].dmode, "dstreg", table68k[opcode].size, "dst", 2, 0);
1.1       root     1195:        genflags(flag_logical, table68k[opcode].size, "src", "", "");
1.1.1.3   root     1196:        genastore ("src", table68k[opcode].dmode, "dstreg", table68k[opcode].size, "dst");
1.1       root     1197:        break;
                   1198:      case i_MOVEA:
1.1.1.3   root     1199:        genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0);
                   1200:        genamode (table68k[opcode].dmode, "dstreg", table68k[opcode].size, "dst", 2, 0);
1.1       root     1201:        if (table68k[opcode].size == sz_word) {
1.1.1.3   root     1202:            printf ("\tuae_u32 val = (uae_s32)(uae_s16)src;\n");
1.1       root     1203:        } else {
1.1.1.3   root     1204:            printf ("\tuae_u32 val = src;\n");
1.1       root     1205:        }
1.1.1.3   root     1206:        genastore ("val", table68k[opcode].dmode, "dstreg", sz_long, "dst");
1.1       root     1207:        break;
1.1.1.3   root     1208:      case i_MVSR2:
                   1209:        genamode (table68k[opcode].smode, "srcreg", sz_word, "src", 2, 0);
                   1210:        printf ("\tMakeSR();\n");
1.1       root     1211:        if (table68k[opcode].size == sz_byte)
1.1.1.3   root     1212:            genastore ("regs.sr & 0xff", table68k[opcode].smode, "srcreg", sz_word, "src");
1.1       root     1213:        else
1.1.1.3   root     1214:            genastore ("regs.sr", table68k[opcode].smode, "srcreg", sz_word, "src");
1.1       root     1215:        break;
                   1216:      case i_MV2SR:
1.1.1.3   root     1217:        genamode (table68k[opcode].smode, "srcreg", sz_word, "src", 1, 0);
1.1       root     1218:        if (table68k[opcode].size == sz_byte)
1.1.1.3   root     1219:            printf ("\tMakeSR();\n\tregs.sr &= 0xFF00;\n\tregs.sr |= src & 0xFF;\n");
                   1220:        else {
                   1221:            printf ("\tregs.sr = src;\n");
1.1       root     1222:        }
1.1.1.3   root     1223:        printf ("\tMakeFromSR();\n");
1.1       root     1224:        break;
1.1.1.3   root     1225:      case i_SWAP:
                   1226:        genamode (table68k[opcode].smode, "srcreg", sz_long, "src", 1, 0);
1.1       root     1227:        start_brace ();
1.1.1.3   root     1228:        printf ("\tuae_u32 dst = ((src >> 16)&0xFFFF) | ((src&0xFFFF)<<16);\n");
1.1       root     1229:        genflags(flag_logical, sz_long, "dst", "", "");
1.1.1.3   root     1230:        genastore ("dst",table68k[opcode].smode, "srcreg", sz_long, "src");
1.1       root     1231:        break;
                   1232:      case i_EXG:
1.1.1.3   root     1233:        genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0);
                   1234:        genamode (table68k[opcode].dmode, "dstreg", table68k[opcode].size, "dst", 1, 0);
                   1235:        genastore ("dst",table68k[opcode].smode, "srcreg", table68k[opcode].size, "src");
                   1236:        genastore ("src",table68k[opcode].dmode, "dstreg", table68k[opcode].size, "dst");
1.1       root     1237:        break;
                   1238:      case i_EXT:
1.1.1.3   root     1239:        genamode (table68k[opcode].smode, "srcreg", sz_long, "src", 1, 0);
1.1       root     1240:        start_brace ();
                   1241:        switch(table68k[opcode].size) {
1.1.1.3   root     1242:         case sz_byte: printf ("\tuae_u32 dst = (uae_s32)(uae_s8)src;\n"); break;
                   1243:         case sz_word: printf ("\tuae_u16 dst = (uae_s16)(uae_s8)src;\n"); break;
                   1244:         case sz_long: printf ("\tuae_u32 dst = (uae_s32)(uae_s16)src;\n"); break;
1.1       root     1245:         default: abort();
                   1246:        }
                   1247:        genflags(flag_logical,
1.1.1.3   root     1248:                 table68k[opcode].size == sz_word ? sz_word : sz_long, "dst", "", "");
                   1249:        genastore ("dst",table68k[opcode].smode, "srcreg",
                   1250:                  table68k[opcode].size == sz_word ? sz_word : sz_long, "src");
1.1       root     1251:        break;
                   1252:      case i_MVMEL:
                   1253:        genmovemel(opcode);
                   1254:        break;
                   1255:      case i_MVMLE:
                   1256:        genmovemle(opcode);
                   1257:        break;
                   1258:      case i_TRAP:
1.1.1.3   root     1259:        genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0);
                   1260:        sync_m68k_pc();
                   1261:        printf ("\tException(src+32,0);\n");
                   1262:        m68k_pc_offset = 0;
1.1       root     1263:        break;
                   1264:      case i_MVR2USP:
1.1.1.3   root     1265:        genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0);
                   1266:        printf ("\tregs.usp = src;\n");
1.1       root     1267:        break;
1.1.1.3   root     1268:      case i_MVUSP2R:
                   1269:        genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 2, 0);
                   1270:        genastore ("regs.usp", table68k[opcode].smode, "srcreg", table68k[opcode].size, "src");
1.1       root     1271:        break;
                   1272:      case i_RESET:
1.1.1.3   root     1273:        printf ("\tcustomreset();\n");
1.1       root     1274:        break;
                   1275:      case i_NOP:
                   1276:        break;
                   1277:      case i_STOP:
1.1.1.3   root     1278:        genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0);
                   1279:        printf ("\tregs.sr = src;\n");
                   1280:        printf ("\tMakeFromSR();\n");
                   1281:        printf ("\tm68k_setstopped(1);\n");
1.1       root     1282:        break;
                   1283:      case i_RTE:
1.1.1.3   root     1284:        if (cpu_level == 0) {
                   1285:            genamode (Aipi, "7", sz_word, "sr", 1, 0);
                   1286:            genamode (Aipi, "7", sz_long, "pc", 1, 0);
                   1287:            printf ("\tregs.sr = sr; m68k_setpc_rte(pc);\n");
                   1288:            fill_prefetch_0 ();
                   1289:            printf ("\tMakeFromSR();\n");
                   1290:        } else {
1.1       root     1291:            int old_brace_level = n_braces;
1.1.1.3   root     1292:            if (next_cpu_level < 0)
                   1293:                next_cpu_level = 0;
                   1294:            printf ("\tuae_u16 newsr; uae_u32 newpc; for (;;) {\n");
                   1295:            genamode (Aipi, "7", sz_word, "sr", 1, 0);
                   1296:            genamode (Aipi, "7", sz_long, "pc", 1, 0);
                   1297:            genamode (Aipi, "7", sz_word, "format", 1, 0);
                   1298:            printf ("\tnewsr = sr; newpc = pc;\n");
                   1299:            printf ("\tif ((format & 0xF000) == 0x0000) { break; }\n");
                   1300:            printf ("\telse if ((format & 0xF000) == 0x1000) { ; }\n");
                   1301:            printf ("\telse if ((format & 0xF000) == 0x2000) { m68k_areg(regs, 7) += 4; break; }\n");
                   1302:            printf ("\telse if ((format & 0xF000) == 0x8000) { m68k_areg(regs, 7) += 50; break; }\n");
                   1303:            printf ("\telse if ((format & 0xF000) == 0x9000) { m68k_areg(regs, 7) += 12; break; }\n");
                   1304:            printf ("\telse if ((format & 0xF000) == 0xa000) { m68k_areg(regs, 7) += 24; break; }\n");
                   1305:            printf ("\telse if ((format & 0xF000) == 0xb000) { m68k_areg(regs, 7) += 84; break; }\n");
                   1306:            printf ("\telse { Exception(14,0); goto %s; }\n", endlabelstr);
                   1307:            printf ("\tregs.sr = newsr; MakeFromSR();\n}\n");
1.1       root     1308:            pop_braces (old_brace_level);
1.1.1.3   root     1309:            printf ("\tregs.sr = newsr; MakeFromSR();\n");
                   1310:            printf ("\tm68k_setpc_rte(newpc);\n");
                   1311:            fill_prefetch_0 ();
1.1       root     1312:        }
1.1.1.3   root     1313:        /* PC is set and prefetch filled. */
                   1314:        m68k_pc_offset = 0;
1.1       root     1315:        break;
                   1316:      case i_RTD:
1.1.1.3   root     1317:        printf ("\tcompiler_flush_jsr_stack();\n");
                   1318:        genamode (Aipi, "7", sz_long, "pc", 1, 0);
                   1319:        genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "offs", 1, 0);
                   1320:        printf ("\tm68k_areg(regs, 7) += offs;\n");
                   1321:        printf ("\tm68k_setpc_rte(pc);\n");
                   1322:        fill_prefetch_0 ();
                   1323:        /* PC is set and prefetch filled. */
                   1324:        m68k_pc_offset = 0;
1.1       root     1325:        break;
                   1326:      case i_LINK:
1.1.1.3   root     1327:        genamode (Apdi, "7", sz_long, "old", 2, 0);
                   1328:        genamode (table68k[opcode].smode, "srcreg", sz_long, "src", 1, 0);
                   1329:        genastore ("src", Apdi, "7", sz_long, "old");
                   1330:        genastore ("m68k_areg(regs, 7)", table68k[opcode].smode, "srcreg", sz_long, "src");
                   1331:        genamode (table68k[opcode].dmode, "dstreg", table68k[opcode].size, "offs", 1, 0);
                   1332:        printf ("\tm68k_areg(regs, 7) += offs;\n");
1.1       root     1333:        break;
                   1334:      case i_UNLK:
1.1.1.3   root     1335:        genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0);
                   1336:        printf ("\tm68k_areg(regs, 7) = src;\n");
                   1337:        genamode (Aipi, "7", sz_long, "old", 1, 0);
                   1338:        genastore ("old", table68k[opcode].smode, "srcreg", table68k[opcode].size, "src");
1.1       root     1339:        break;
                   1340:      case i_RTS:
1.1.1.3   root     1341:        printf ("\tm68k_do_rts();\n");
                   1342:        fill_prefetch_0 ();
                   1343:        m68k_pc_offset = 0;
1.1       root     1344:        break;
                   1345:      case i_TRAPV:
1.1.1.3   root     1346:        sync_m68k_pc ();
                   1347:        printf ("\tif(VFLG) { Exception(7,m68k_getpc()); goto %s; }\n", endlabelstr);
1.1       root     1348:        break;
1.1.1.2   root     1349:      case i_RTR:
1.1.1.3   root     1350:        printf ("\tcompiler_flush_jsr_stack();\n");
                   1351:        printf ("\tMakeSR();\n");
                   1352:        genamode (Aipi, "7", sz_word, "sr", 1, 0);
                   1353:        genamode (Aipi, "7", sz_long, "pc", 1, 0);
                   1354:        printf ("\tregs.sr &= 0xFF00; sr &= 0xFF;\n");
                   1355:        printf ("\tregs.sr |= sr; m68k_setpc(pc);\n");
                   1356:        fill_prefetch_0 ();
                   1357:        printf ("\tMakeFromSR();\n");
                   1358:        m68k_pc_offset = 0;
1.1       root     1359:        break;
                   1360:      case i_JSR:
1.1.1.3   root     1361:        genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 0, 0);
                   1362:        printf ("\tm68k_do_jsr(m68k_getpc() + %d, srca);\n", m68k_pc_offset);
                   1363:        fill_prefetch_0 ();
                   1364:        m68k_pc_offset = 0;
                   1365:        break;
                   1366:      case i_JMP:
                   1367:        genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 0, 0);
                   1368:        printf ("\tm68k_setpc(srca);\n");
                   1369:        fill_prefetch_0 ();
                   1370:        m68k_pc_offset = 0;
1.1       root     1371:        break;
                   1372:      case i_BSR:
1.1.1.3   root     1373:        genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0);
                   1374:        printf ("\tuae_s32 s = (uae_s32)src + 2;\n");
                   1375:        if (using_exception_3) {
                   1376:            printf ("\tif (src & 1) {\n");
                   1377:            printf ("\tlast_addr_for_exception_3 = m68k_getpc() + 2;\n");
                   1378:            printf ("\t\tlast_fault_for_exception_3 = m68k_getpc() + s;\n");
                   1379:            printf ("\t\tlast_op_for_exception_3 = opcode; Exception(3,0); goto %s;\n", endlabelstr);
                   1380:            printf ("\t}\n");
                   1381:        }
                   1382: 
                   1383:        printf ("\tm68k_do_bsr(m68k_getpc() + %d, s);\n", m68k_pc_offset);
                   1384:        fill_prefetch_0 ();
                   1385:        m68k_pc_offset = 0;
1.1       root     1386:        break;
                   1387:      case i_Bcc:
1.1.1.3   root     1388:        if (table68k[opcode].size == sz_long) {
                   1389:            if (cpu_level < 2) {
                   1390:                printf ("\tm68k_incpc(2);\n");
                   1391:                printf ("\tif (!cctrue(%d)) goto %s;\n", table68k[opcode].cc, endlabelstr);
                   1392:                printf ("\t\tlast_addr_for_exception_3 = m68k_getpc() + 2;\n");
                   1393:                printf ("\t\tlast_fault_for_exception_3 = m68k_getpc() + 1;\n");
                   1394:                printf ("\t\tlast_op_for_exception_3 = opcode; Exception(3,0); goto %s;\n", endlabelstr);
                   1395:            } else {
                   1396:                if (next_cpu_level < 1)
                   1397:                    next_cpu_level = 1;
                   1398:            }
                   1399:        }
                   1400: 
                   1401:        genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0);
                   1402:        printf ("\tif (!cctrue(%d)) goto didnt_jump;\n", table68k[opcode].cc);
                   1403:        if (using_exception_3) {
                   1404:            printf ("\tif (src & 1) {\n");
                   1405:            printf ("\t\tlast_addr_for_exception_3 = m68k_getpc() + 2;\n");
                   1406:            printf ("\t\tlast_fault_for_exception_3 = m68k_getpc() + 2 + (uae_s32)src;\n");
                   1407:            printf ("\t\tlast_op_for_exception_3 = opcode; Exception(3,0); goto %s;\n", endlabelstr);
                   1408:            printf ("\t}\n");
                   1409:        }
1.1       root     1410: #ifdef USE_COMPILER
1.1.1.3   root     1411:        printf ("\tm68k_setpc_bcc(m68k_getpc() + 2 + (uae_s32)src);\n");
1.1       root     1412: #else
1.1.1.3   root     1413:        printf ("\tm68k_incpc ((uae_s32)src + 2);\n");
1.1       root     1414: #endif
1.1.1.3   root     1415:        fill_prefetch_0 ();
                   1416:        printf ("\tgoto %s;\n", endlabelstr);
                   1417:        printf ("didnt_jump:;\n");
1.1       root     1418:        break;
                   1419:      case i_LEA:
1.1.1.3   root     1420:        genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 0, 0);
                   1421:        genamode (table68k[opcode].dmode, "dstreg", table68k[opcode].size, "dst", 2, 0);
                   1422:        genastore ("srca", table68k[opcode].dmode, "dstreg", table68k[opcode].size, "dst");
1.1       root     1423:        break;
                   1424:      case i_PEA:
1.1.1.3   root     1425:        genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 0, 0);
                   1426:        genamode (Apdi, "7", sz_long, "dst", 2, 0);
                   1427:        genastore ("srca", Apdi, "7", sz_long, "dst");
1.1       root     1428:        break;
                   1429:      case i_DBcc:
1.1.1.3   root     1430:        genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0);
                   1431:        genamode (table68k[opcode].dmode, "dstreg", table68k[opcode].size, "offs", 1, 0);
                   1432: 
                   1433:        printf ("\tif (!cctrue(%d)) {\n", table68k[opcode].cc);
                   1434:        genastore ("(src-1)", table68k[opcode].smode, "srcreg", table68k[opcode].size, "src");
                   1435: 
                   1436:        printf ("\t\tif (src) {\n");
                   1437:        if (using_exception_3) {
                   1438:            printf ("\t\t\tif (offs & 1) {\n");
                   1439:            printf ("\t\t\tlast_addr_for_exception_3 = m68k_getpc() + 2;\n");
                   1440:            printf ("\t\t\tlast_fault_for_exception_3 = m68k_getpc() + 2 + (uae_s32)offs + 2;\n");
                   1441:            printf ("\t\t\tlast_op_for_exception_3 = opcode; Exception(3,0); goto %s;\n", endlabelstr);
                   1442:            printf ("\t\t}\n");
                   1443:        }
                   1444: 
1.1       root     1445: #ifdef USE_COMPILER
1.1.1.3   root     1446:        printf ("\t\t\tm68k_setpc_bcc(m68k_getpc() + (uae_s32)offs + 2);\n");
1.1       root     1447: #else
1.1.1.3   root     1448:        printf ("\t\t\tm68k_incpc((uae_s32)offs + 2);\n");
1.1       root     1449: #endif
1.1.1.3   root     1450:        fill_prefetch_0 ();
                   1451:        printf ("\t\tgoto %s;\n", endlabelstr);
                   1452:        printf ("\t\t}\n");
                   1453:        printf ("\t}\n");
1.1       root     1454:        break;
1.1.1.3   root     1455:      case i_Scc:
                   1456:        genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 2, 0);
1.1       root     1457:        start_brace ();
1.1.1.3   root     1458:        printf ("\tint val = cctrue(%d) ? 0xff : 0;\n", table68k[opcode].cc);
                   1459:        genastore ("val",table68k[opcode].smode, "srcreg", table68k[opcode].size, "src");
1.1       root     1460:        break;
                   1461:      case i_DIVU:
1.1.1.3   root     1462:        printf ("\tuaecptr oldpc = m68k_getpc();\n");
                   1463:        genamode (table68k[opcode].smode, "srcreg", sz_word, "src", 1, 0);
                   1464:        genamode (table68k[opcode].dmode, "dstreg", sz_long, "dst", 1, 0);
                   1465:        printf ("\tif(src == 0) { Exception(5,oldpc); goto %s; } else {\n", endlabelstr);
                   1466:        printf ("\tuae_u32 newv = (uae_u32)dst / (uae_u32)(uae_u16)src;\n");
                   1467:        printf ("\tuae_u32 rem = (uae_u32)dst %% (uae_u32)(uae_u16)src;\n");
1.1       root     1468:        /* The N flag appears to be set each time there is an overflow.
                   1469:         * Weird. */
1.1.1.3   root     1470:        printf ("\tif (newv > 0xffff) { VFLG = NFLG = 1; CFLG = 0; } else\n\t{\n");
1.1       root     1471:        genflags(flag_logical, sz_word, "newv", "", "");
1.1.1.3   root     1472:        printf ("\tnewv = (newv & 0xffff) | ((uae_u32)rem << 16);\n");
                   1473:        genastore ("newv",table68k[opcode].dmode, "dstreg", sz_long, "dst");
                   1474:        printf ("\t}\n");
                   1475:        printf ("\t}\n");
                   1476:        break;
                   1477:      case i_DIVS:
                   1478:        printf ("\tuaecptr oldpc = m68k_getpc();\n");
                   1479:        genamode (table68k[opcode].smode, "srcreg", sz_word, "src", 1, 0);
                   1480:        genamode (table68k[opcode].dmode, "dstreg", sz_long, "dst", 1, 0);
                   1481:        printf ("\tif(src == 0) { Exception(5,oldpc); goto %s; } else {\n", endlabelstr);
                   1482:        printf ("\tuae_s32 newv = (uae_s32)dst / (uae_s32)(uae_s16)src;\n");
                   1483:        printf ("\tuae_u16 rem = (uae_s32)dst %% (uae_s32)(uae_s16)src;\n");
                   1484:        printf ("\tif ((newv & 0xffff8000) != 0 && (newv & 0xffff8000) != 0xffff8000) { VFLG = NFLG = 1; CFLG = 0; } else\n\t{\n");
                   1485:        printf ("\tif (((uae_s16)rem < 0) != ((uae_s32)dst < 0)) rem = -rem;\n");
1.1       root     1486:        genflags(flag_logical, sz_word, "newv", "", "");
1.1.1.3   root     1487:        printf ("\tnewv = (newv & 0xffff) | ((uae_u32)rem << 16);\n");
                   1488:        genastore ("newv",table68k[opcode].dmode, "dstreg", sz_long, "dst");
                   1489:        printf ("\t}\n");
                   1490:        printf ("\t}\n");
                   1491:        break;
                   1492:      case i_MULU:
                   1493:        genamode (table68k[opcode].smode, "srcreg", sz_word, "src", 1, 0);
                   1494:        genamode (table68k[opcode].dmode, "dstreg", sz_word, "dst", 1, 0);
1.1       root     1495:        start_brace ();
1.1.1.3   root     1496:        printf ("\tuae_u32 newv = (uae_u32)(uae_u16)dst * (uae_u32)(uae_u16)src;\n");
1.1       root     1497:        genflags(flag_logical, sz_long, "newv", "", "");
1.1.1.3   root     1498:        genastore ("newv",table68k[opcode].dmode, "dstreg", sz_long, "dst");
1.1       root     1499: #ifdef WANT_SLOW_MULTIPLY
1.1.1.3   root     1500:        printf ("\tregs.spcflags |= SPCFLAG_EXTRA_CYCLES;\n");
1.1       root     1501: #endif
                   1502:        break;
                   1503:      case i_MULS:
1.1.1.3   root     1504:        genamode (table68k[opcode].smode, "srcreg", sz_word, "src", 1, 0);
                   1505:        genamode (table68k[opcode].dmode, "dstreg", sz_word, "dst", 1, 0);
1.1       root     1506:        start_brace ();
1.1.1.3   root     1507:        printf ("\tuae_u32 newv = (uae_s32)(uae_s16)dst * (uae_s32)(uae_s16)src;\n");
1.1       root     1508:        genflags(flag_logical, sz_long, "newv", "", "");
1.1.1.3   root     1509:        genastore ("newv",table68k[opcode].dmode, "dstreg", sz_long, "dst");
1.1       root     1510: #ifdef WANT_SLOW_MULTIPLY
1.1.1.3   root     1511:        printf ("\tregs.spcflags |= SPCFLAG_EXTRA_CYCLES;\n");
1.1       root     1512: #endif
                   1513:        break;
                   1514:      case i_CHK:
1.1.1.3   root     1515:        printf ("\tuaecptr oldpc = m68k_getpc();\n");
                   1516:        genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0);
                   1517:        genamode (table68k[opcode].dmode, "dstreg", table68k[opcode].size, "dst", 1, 0);
                   1518:        printf ("\tif ((uae_s32)dst < 0) { NFLG=1; Exception(6,oldpc); goto %s; }\n", endlabelstr);
                   1519:        printf ("\telse if (dst > src) { NFLG=0; Exception(6,oldpc); goto %s; }\n", endlabelstr);
1.1       root     1520:        break;
1.1.1.3   root     1521: 
1.1       root     1522:      case i_CHK2:
1.1.1.3   root     1523:        printf ("\tuaecptr oldpc = m68k_getpc();\n");
1.1       root     1524:        genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "extra", 1, 0);
1.1.1.3   root     1525:        genamode (table68k[opcode].dmode, "dstreg", table68k[opcode].size, "dst", 2, 0);
                   1526:        printf ("\t{uae_s32 upper,lower,reg = regs.regs[(extra >> 12) & 15];\n");
1.1       root     1527:        switch (table68k[opcode].size) {
1.1.1.3   root     1528:         case sz_byte:
                   1529:            printf ("\tlower=(uae_s32)(uae_s8)get_byte(dsta); upper = (uae_s32)(uae_s8)get_byte(dsta+1);\n");
                   1530:            printf ("\tif ((extra & 0x8000) == 0) reg = (uae_s32)(uae_s8)reg;\n");
                   1531:            break;
                   1532:         case sz_word:
                   1533:            printf ("\tlower=(uae_s32)(uae_s16)get_word(dsta); upper = (uae_s32)(uae_s16)get_word(dsta+2);\n");
                   1534:            printf ("\tif ((extra & 0x8000) == 0) reg = (uae_s32)(uae_s16)reg;\n");
                   1535:            break;
                   1536:         case sz_long:
                   1537:            printf ("\tlower=get_long(dsta); upper = get_long(dsta+4);\n");
                   1538:            break;
                   1539:         default:
                   1540:            abort();
                   1541:        }
                   1542:        printf ("\tZFLG=upper == reg || lower == reg;\n");
                   1543:        printf ("\tCFLG=lower <= upper ? reg < lower || reg > upper : reg > upper || reg < lower;\n");
                   1544:        printf ("\tif ((extra & 0x800) && CFLG) { Exception(6,oldpc); goto %s; }\n}\n", endlabelstr);
                   1545:        break;
                   1546: 
                   1547:      case i_ASR:
                   1548:        genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "cnt", 1, 0);
                   1549:        genamode (table68k[opcode].dmode, "dstreg", table68k[opcode].size, "data", 1, 0);
                   1550:        start_brace ();
                   1551:        switch(table68k[opcode].size) {
                   1552:         case sz_byte: printf ("\tuae_u8 val = data;\n"); break;
                   1553:         case sz_word: printf ("\tuae_u16 val = data;\n"); break;
                   1554:         case sz_long: printf ("\tuae_u32 val = data;\n"); break;
1.1       root     1555:         default: abort();
                   1556:        }
                   1557:        switch(table68k[opcode].size) {
1.1.1.3   root     1558:         case sz_byte: printf ("\tuae_u32 cmask = 0x80;\n"); break;
                   1559:         case sz_word: printf ("\tuae_u32 cmask = 0x8000;\n"); break;
                   1560:         case sz_long: printf ("\tuae_u32 cmask = 0x80000000;\n"); break;
                   1561:         default: abort();
                   1562:        }
                   1563:        printf ("\tuae_u32 sign = cmask & val;\n");
                   1564:        printf ("\tcnt &= 63;\n");
                   1565:        printf ("\tVFLG = 0;\n");
                   1566:        printf ("\tif (!cnt) { CFLG = 0; } else {\n");
                   1567:        printf ("\tif (cnt >= %d) {\n",bit_size(table68k[opcode].size));
                   1568:        printf ("\t\tval = sign ? %s : 0;\n",bit_mask(table68k[opcode].size));
                   1569:        printf ("\t\tCFLG=XFLG= sign ? 1 : 0;\n");
                   1570:        printf ("\t} else {\n");
                   1571:        printf ("\t\tCFLG=XFLG=(val >> (cnt-1)) & 1;\n");
                   1572:        printf ("\t\tval >>= cnt;\n");
                   1573:        printf ("\t\tif (sign) val |= %s << (%d - cnt);\n",
                   1574:               bit_mask(table68k[opcode].size),
                   1575:               bit_size(table68k[opcode].size));
                   1576:        printf ("\t}}\n");
                   1577:        printf ("\tNFLG = sign != 0;\n");
                   1578:        printf ("\tZFLG = val == 0;\n");
                   1579:        genastore ("val", table68k[opcode].dmode, "dstreg", table68k[opcode].size, "data");
1.1       root     1580:        break;
                   1581:      case i_ASL:
1.1.1.3   root     1582:        genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "cnt", 1, 0);
                   1583:        genamode (table68k[opcode].dmode, "dstreg", table68k[opcode].size, "data", 1, 0);
1.1       root     1584:        start_brace ();
                   1585:        switch(table68k[opcode].size) {
1.1.1.3   root     1586:         case sz_byte: printf ("\tuae_u8 val = data;\n"); break;
                   1587:         case sz_word: printf ("\tuae_u16 val = data;\n"); break;
                   1588:         case sz_long: printf ("\tuae_u32 val = data;\n"); break;
1.1       root     1589:         default: abort();
                   1590:        }
                   1591:        switch(table68k[opcode].size) {
1.1.1.3   root     1592:         case sz_byte: printf ("\tuae_u32 cmask = 0x80;\n"); break;
                   1593:         case sz_word: printf ("\tuae_u32 cmask = 0x8000;\n"); break;
                   1594:         case sz_long: printf ("\tuae_u32 cmask = 0x80000000;\n"); break;
1.1       root     1595:         default: abort();
                   1596:        }
1.1.1.3   root     1597:        printf ("\tcnt &= 63;\n");
                   1598:        printf ("\tVFLG = 0;\n");
                   1599:        printf ("\tif (!cnt) { CFLG = 0; } else {\n");
                   1600:        printf ("\tif (cnt >= %d) {\n",bit_size(table68k[opcode].size));
                   1601:        printf ("\t\tVFLG = val != 0;\n");
                   1602:        printf ("\t\tCFLG=XFLG = cnt == %d ? val & 1 : 0;\n",
1.1       root     1603:                                        bit_size(table68k[opcode].size));
1.1.1.3   root     1604:        printf ("\t\tval = 0;\n");
                   1605:        printf ("\t} else {\n");
                   1606:        printf ("\t\tuae_u32 mask = (%s << (%d - cnt)) & %s;\n",
                   1607:               bit_mask(table68k[opcode].size),
                   1608:               bit_size(table68k[opcode].size)-1,
                   1609:               bit_mask(table68k[opcode].size));
                   1610:        printf ("\t\tCFLG=XFLG=(val << (cnt-1)) & cmask ? 1 : 0;\n");
                   1611:        printf ("\t\tVFLG = (val & mask) != mask && (val & mask) != 0;\n");
                   1612:        printf ("\t\tval <<= cnt;\n");
                   1613:        printf ("\t}}\n");
                   1614:        printf ("\tNFLG = (val&cmask) != 0;\n");
                   1615:        printf ("\tZFLG = val == 0;\n");
                   1616:        genastore ("val", table68k[opcode].dmode, "dstreg", table68k[opcode].size, "data");
1.1       root     1617:        break;
                   1618:      case i_LSR:
1.1.1.3   root     1619:        genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "cnt", 1, 0);
                   1620:        genamode (table68k[opcode].dmode, "dstreg", table68k[opcode].size, "data", 1, 0);
1.1       root     1621:        start_brace ();
                   1622:        switch(table68k[opcode].size) {
1.1.1.3   root     1623:         case sz_byte: printf ("\tuae_u8 val = data;\n"); break;
                   1624:         case sz_word: printf ("\tuae_u16 val = data;\n"); break;
                   1625:         case sz_long: printf ("\tuae_u32 val = data;\n"); break;
1.1       root     1626:         default: abort();
                   1627:        }
                   1628:        switch(table68k[opcode].size) {
1.1.1.3   root     1629:         case sz_byte: printf ("\tuae_u32 cmask = 0x80;\n"); break;
                   1630:         case sz_word: printf ("\tuae_u32 cmask = 0x8000;\n"); break;
                   1631:         case sz_long: printf ("\tuae_u32 cmask = 0x80000000;\n"); break;
1.1       root     1632:         default: abort();
                   1633:        }
1.1.1.3   root     1634:        printf ("\tcnt &= 63;\n");
                   1635:        printf ("\tif (!cnt) { CFLG = 0; } else {\n");
                   1636:        printf ("\tif (cnt >= %d) {\n",bit_size(table68k[opcode].size));
                   1637:        printf ("\t\tCFLG=XFLG = cnt == %d ? (val & cmask ? 1 : 0) : 0;\n",
                   1638:               bit_size(table68k[opcode].size));
                   1639:        printf ("\t\tval = 0;\n");
                   1640:        printf ("\t} else {\n");
                   1641:        printf ("\t\tCFLG=XFLG=(val >> (cnt-1)) & 1;\n");
                   1642:        printf ("\t\tval >>= cnt;\n");
                   1643:        printf ("\t}}\n");
                   1644:        printf ("\tNFLG = (val & cmask) != 0; ZFLG = val == 0; VFLG = 0;\n");
                   1645:        genastore ("val", table68k[opcode].dmode, "dstreg", table68k[opcode].size, "data");
1.1       root     1646:        break;
                   1647:      case i_LSL:
1.1.1.3   root     1648:        genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "cnt", 1, 0);
                   1649:        genamode (table68k[opcode].dmode, "dstreg", table68k[opcode].size, "data", 1, 0);
1.1       root     1650:        start_brace ();
                   1651:        switch(table68k[opcode].size) {
1.1.1.3   root     1652:         case sz_byte: printf ("\tuae_u8 val = data;\n"); break;
                   1653:         case sz_word: printf ("\tuae_u16 val = data;\n"); break;
                   1654:         case sz_long: printf ("\tuae_u32 val = data;\n"); break;
1.1       root     1655:         default: abort();
                   1656:        }
                   1657:        switch(table68k[opcode].size) {
1.1.1.3   root     1658:         case sz_byte: printf ("\tuae_u32 cmask = 0x80;\n"); break;
                   1659:         case sz_word: printf ("\tuae_u32 cmask = 0x8000;\n"); break;
                   1660:         case sz_long: printf ("\tuae_u32 cmask = 0x80000000;\n"); break;
1.1       root     1661:         default: abort();
                   1662:        }
1.1.1.3   root     1663:        printf ("\tcnt &= 63;\n");
                   1664:        printf ("\tif (!cnt) { CFLG = 0; } else {\n");
                   1665:        printf ("\tif (cnt >= %d) {\n",bit_size(table68k[opcode].size));
                   1666:        printf ("\t\tCFLG=XFLG = cnt == %d ? val & 1 : 0;\n",
                   1667:               bit_size(table68k[opcode].size));
                   1668:        printf ("\t\tval = 0;\n");
                   1669:        printf ("\t} else {\n");
                   1670:        printf ("\t\tCFLG=XFLG=(val << (cnt-1)) & cmask ? 1 : 0;\n");
                   1671:        printf ("\t\tval <<= cnt;\n");
                   1672:        printf ("\t}}\n");
                   1673:        printf ("\tNFLG = (val & cmask) != 0; ZFLG = val == 0; VFLG = 0;\n");
                   1674:        genastore ("val", table68k[opcode].dmode, "dstreg", table68k[opcode].size, "data");
1.1       root     1675:        break;
                   1676:      case i_ROL:
1.1.1.3   root     1677:        genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "cnt", 1, 0);
                   1678:        genamode (table68k[opcode].dmode, "dstreg", table68k[opcode].size, "data", 1, 0);
1.1       root     1679:        start_brace ();
                   1680:        switch(table68k[opcode].size) {
1.1.1.3   root     1681:         case sz_byte: printf ("\tuae_u8 val = data;\n"); break;
                   1682:         case sz_word: printf ("\tuae_u16 val = data;\n"); break;
                   1683:         case sz_long: printf ("\tuae_u32 val = data;\n"); break;
1.1       root     1684:         default: abort();
                   1685:        }
                   1686:        switch(table68k[opcode].size) {
1.1.1.3   root     1687:         case sz_byte: printf ("\tuae_u32 cmask = 0x80;\n"); break;
                   1688:         case sz_word: printf ("\tuae_u32 cmask = 0x8000;\n"); break;
                   1689:         case sz_long: printf ("\tuae_u32 cmask = 0x80000000;\n"); break;
1.1       root     1690:         default: abort();
                   1691:        }
1.1.1.3   root     1692:        printf ("\tcnt &= 63;\n");
                   1693:        printf ("\tif (!cnt) { CFLG = 0; } else {\n");
                   1694:        printf ("\tuae_u32 carry;\n");
                   1695:        printf ("\tfor(;cnt;--cnt){\n");
                   1696:        printf ("\tcarry=val&cmask; val <<= 1;\n");
                   1697:        printf ("\tif(carry) val |= 1;\n");
                   1698:        printf ("\t}\n");
                   1699:        printf ("\tCFLG = carry!=0;\n}\n");
                   1700:        printf ("\tNFLG = (val & cmask) != 0; ZFLG = val == 0; VFLG = 0;\n");
                   1701:        genastore ("val", table68k[opcode].dmode, "dstreg", table68k[opcode].size, "data");
1.1       root     1702:        break;
                   1703:      case i_ROR:
1.1.1.3   root     1704:        genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "cnt", 1, 0);
                   1705:        genamode (table68k[opcode].dmode, "dstreg", table68k[opcode].size, "data", 1, 0);
1.1       root     1706:        start_brace ();
                   1707:        switch(table68k[opcode].size) {
1.1.1.3   root     1708:         case sz_byte: printf ("\tuae_u8 val = data;\n"); break;
                   1709:         case sz_word: printf ("\tuae_u16 val = data;\n"); break;
                   1710:         case sz_long: printf ("\tuae_u32 val = data;\n"); break;
1.1       root     1711:         default: abort();
                   1712:        }
                   1713:        switch(table68k[opcode].size) {
1.1.1.3   root     1714:         case sz_byte: printf ("\tuae_u32 cmask = 0x80;\n"); break;
                   1715:         case sz_word: printf ("\tuae_u32 cmask = 0x8000;\n"); break;
                   1716:         case sz_long: printf ("\tuae_u32 cmask = 0x80000000;\n"); break;
1.1       root     1717:         default: abort();
                   1718:        }
1.1.1.3   root     1719:        printf ("\tcnt &= 63;\n");
                   1720:        printf ("\tif (!cnt) { CFLG = 0; } else {");
                   1721:        printf ("\tuae_u32 carry;\n");
                   1722:        printf ("\tfor(;cnt;--cnt){\n");
                   1723:        printf ("\tcarry=val&1; val = val >> 1;\n");
                   1724:        printf ("\tif(carry) val |= cmask;\n");
                   1725:        printf ("\t}\n");
                   1726:        printf ("\tCFLG = carry;\n}\n");
                   1727:        printf ("\tNFLG = (val & cmask) != 0; ZFLG = val == 0; VFLG = 0;\n");
                   1728:        genastore ("val", table68k[opcode].dmode, "dstreg", table68k[opcode].size, "data");
1.1       root     1729:        break;
1.1.1.3   root     1730:      case i_ROXL:
                   1731:        genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "cnt", 1, 0);
                   1732:        genamode (table68k[opcode].dmode, "dstreg", table68k[opcode].size, "data", 1, 0);
1.1       root     1733:        start_brace ();
                   1734:        switch(table68k[opcode].size) {
1.1.1.3   root     1735:         case sz_byte: printf ("\tuae_u8 val = data;\n"); break;
                   1736:         case sz_word: printf ("\tuae_u16 val = data;\n"); break;
                   1737:         case sz_long: printf ("\tuae_u32 val = data;\n"); break;
1.1       root     1738:         default: abort();
                   1739:        }
                   1740:        switch(table68k[opcode].size) {
1.1.1.3   root     1741:         case sz_byte: printf ("\tuae_u32 cmask = 0x80;\n"); break;
                   1742:         case sz_word: printf ("\tuae_u32 cmask = 0x8000;\n"); break;
                   1743:         case sz_long: printf ("\tuae_u32 cmask = 0x80000000;\n"); break;
1.1       root     1744:         default: abort();
                   1745:        }
1.1.1.3   root     1746:        printf ("\tuae_u32 carry;\n");
                   1747:        printf ("\tcnt &= 63;\n");
                   1748:        printf ("\tfor(;cnt;--cnt){\n");
                   1749:        printf ("\tcarry=val&cmask; val <<= 1;\n");
                   1750:        printf ("\tif(XFLG) val |= 1;\n");
                   1751:        printf ("\tXFLG = carry != 0;\n");
                   1752:        printf ("\t}\n");
                   1753:        printf ("\tCFLG = XFLG;\n");
                   1754:        printf ("\tNFLG = (val & cmask) != 0; ZFLG = val == 0; VFLG = 0;\n");
                   1755:        genastore ("val", table68k[opcode].dmode, "dstreg", table68k[opcode].size, "data");
1.1       root     1756:        break;
                   1757:      case i_ROXR:
1.1.1.3   root     1758:        genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "cnt", 1, 0);
                   1759:        genamode (table68k[opcode].dmode, "dstreg", table68k[opcode].size, "data", 1, 0);
1.1       root     1760:        start_brace ();
                   1761:        switch(table68k[opcode].size) {
1.1.1.3   root     1762:         case sz_byte: printf ("\tuae_u8 val = data;\n"); break;
                   1763:         case sz_word: printf ("\tuae_u16 val = data;\n"); break;
                   1764:         case sz_long: printf ("\tuae_u32 val = data;\n"); break;
1.1       root     1765:         default: abort();
                   1766:        }
                   1767:        switch(table68k[opcode].size) {
1.1.1.3   root     1768:         case sz_byte: printf ("\tuae_u32 cmask = 0x80;\n"); break;
                   1769:         case sz_word: printf ("\tuae_u32 cmask = 0x8000;\n"); break;
                   1770:         case sz_long: printf ("\tuae_u32 cmask = 0x80000000;\n"); break;
1.1       root     1771:         default: abort();
                   1772:        }
1.1.1.3   root     1773:        printf ("\tuae_u32 carry;\n");
                   1774:        printf ("\tcnt &= 63;\n");
                   1775:        printf ("\tfor(;cnt;--cnt){\n");
                   1776:        printf ("\tcarry=val&1; val >>= 1;\n");
                   1777:        printf ("\tif(XFLG) val |= cmask;\n");
                   1778:        printf ("\tXFLG = carry;\n");
                   1779:        printf ("\t}\n");
                   1780:        printf ("\tCFLG = XFLG;\n");
                   1781:        printf ("\tNFLG = (val & cmask) != 0; ZFLG = val == 0; VFLG = 0;\n");
                   1782:        genastore ("val", table68k[opcode].dmode, "dstreg", table68k[opcode].size, "data");
1.1       root     1783:        break;
                   1784:      case i_ASRW:
1.1.1.3   root     1785:        genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "data", 1, 0);
                   1786:        printf ("\tVFLG = 0;\n");
1.1       root     1787:        start_brace ();
                   1788:        switch(table68k[opcode].size) {
1.1.1.3   root     1789:         case sz_byte: printf ("\tuae_u8 val = data;\n"); break;
                   1790:         case sz_word: printf ("\tuae_u16 val = data;\n"); break;
                   1791:         case sz_long: printf ("\tuae_u32 val = data;\n"); break;
1.1       root     1792:         default: abort();
                   1793:        }
                   1794:        switch(table68k[opcode].size) {
1.1.1.3   root     1795:         case sz_byte: printf ("\tuae_u32 cmask = 0x80;\n"); break;
                   1796:         case sz_word: printf ("\tuae_u32 cmask = 0x8000;\n"); break;
                   1797:         case sz_long: printf ("\tuae_u32 cmask = 0x80000000;\n"); break;
1.1       root     1798:         default: abort();
                   1799:        }
1.1.1.3   root     1800:        printf ("\tuae_u32 sign = cmask & val;\n");
                   1801:        printf ("\tCFLG=XFLG=val&1; val = (val >> 1) | sign;\n");
                   1802:        printf ("\tNFLG = sign != 0;\n");
                   1803:        printf ("\tZFLG = val == 0;\n");
                   1804:        genastore ("val", table68k[opcode].smode, "srcreg", table68k[opcode].size, "data");
1.1       root     1805:        break;
                   1806:      case i_ASLW:
1.1.1.3   root     1807:        genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "data", 1, 0);
                   1808:        printf ("\tVFLG = 0;\n");
1.1       root     1809:        start_brace ();
                   1810:        switch(table68k[opcode].size) {
1.1.1.3   root     1811:         case sz_byte: printf ("\tuae_u8 val = data;\n"); break;
                   1812:         case sz_word: printf ("\tuae_u16 val = data;\n"); break;
                   1813:         case sz_long: printf ("\tuae_u32 val = data;\n"); break;
1.1       root     1814:         default: abort();
                   1815:        }
                   1816:        switch(table68k[opcode].size) {
1.1.1.3   root     1817:         case sz_byte: printf ("\tuae_u32 cmask = 0x80;\n"); break;
                   1818:         case sz_word: printf ("\tuae_u32 cmask = 0x8000;\n"); break;
                   1819:         case sz_long: printf ("\tuae_u32 cmask = 0x80000000;\n"); break;
1.1       root     1820:         default: abort();
                   1821:        }
1.1.1.3   root     1822:        printf ("\tuae_u32 sign = cmask & val;\n");
                   1823:        printf ("\tCFLG=XFLG=(val&cmask)!=0; val <<= 1;\n");
                   1824:        printf ("\tif ((val&cmask)!=sign) VFLG=1;\n");
                   1825:        printf ("\tNFLG = (val&cmask) != 0;\n");
                   1826:        printf ("\tZFLG = val == 0;\n");
                   1827:        genastore ("val", table68k[opcode].smode, "srcreg", table68k[opcode].size, "data");
1.1       root     1828:        break;
                   1829:      case i_LSRW:
1.1.1.3   root     1830:        genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "data", 1, 0);
1.1       root     1831:        start_brace ();
                   1832:        switch(table68k[opcode].size) {
1.1.1.3   root     1833:         case sz_byte: printf ("\tuae_u8 val = data;\n"); break;
                   1834:         case sz_word: printf ("\tuae_u16 val = data;\n"); break;
                   1835:         case sz_long: printf ("\tuae_u32 val = data;\n"); break;
1.1       root     1836:         default: abort();
                   1837:        }
1.1.1.3   root     1838:        printf ("\tuae_u32 carry = val&1;\n");
                   1839:        printf ("\tval >>= 1;\n");
1.1       root     1840:        genflags(flag_logical, table68k[opcode].size, "val", "", "");
1.1.1.3   root     1841:        printf ("CFLG = XFLG = carry!=0;\n");
                   1842:        genastore ("val", table68k[opcode].smode, "srcreg", table68k[opcode].size, "data");
1.1       root     1843:        break;
                   1844:      case i_LSLW:
1.1.1.3   root     1845:        genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "data", 1, 0);
1.1       root     1846:        start_brace ();
                   1847:        switch(table68k[opcode].size) {
1.1.1.3   root     1848:         case sz_byte: printf ("\tuae_u8 val = data;\n"); break;
                   1849:         case sz_word: printf ("\tuae_u16 val = data;\n"); break;
                   1850:         case sz_long: printf ("\tuae_u32 val = data;\n"); break;
1.1       root     1851:         default: abort();
                   1852:        }
                   1853:        switch(table68k[opcode].size) {
1.1.1.3   root     1854:         case sz_byte: printf ("\tuae_u32 cmask = 0x80;\n"); break;
                   1855:         case sz_word: printf ("\tuae_u32 cmask = 0x8000;\n"); break;
                   1856:         case sz_long: printf ("\tuae_u32 cmask = 0x80000000;\n"); break;
1.1       root     1857:         default: abort();
                   1858:        }
1.1.1.3   root     1859:        printf ("\tuae_u32 carry = val&cmask;\n");
                   1860:        printf ("\tval <<= 1;\n");
1.1       root     1861:        genflags(flag_logical, table68k[opcode].size, "val", "", "");
1.1.1.3   root     1862:        printf ("CFLG = XFLG = carry!=0;\n");
                   1863:        genastore ("val", table68k[opcode].smode, "srcreg", table68k[opcode].size, "data");
1.1       root     1864:        break;
                   1865:      case i_ROLW:
1.1.1.3   root     1866:        genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "data", 1, 0);
1.1       root     1867:        start_brace ();
                   1868:        switch(table68k[opcode].size) {
1.1.1.3   root     1869:         case sz_byte: printf ("\tuae_u8 val = data;\n"); break;
                   1870:         case sz_word: printf ("\tuae_u16 val = data;\n"); break;
                   1871:         case sz_long: printf ("\tuae_u32 val = data;\n"); break;
1.1       root     1872:         default: abort();
                   1873:        }
                   1874:        switch(table68k[opcode].size) {
1.1.1.3   root     1875:         case sz_byte: printf ("\tuae_u32 cmask = 0x80;\n"); break;
                   1876:         case sz_word: printf ("\tuae_u32 cmask = 0x8000;\n"); break;
                   1877:         case sz_long: printf ("\tuae_u32 cmask = 0x80000000;\n"); break;
1.1       root     1878:         default: abort();
                   1879:        }
1.1.1.3   root     1880:        printf ("\tuae_u32 carry = val&cmask;\n");
                   1881:        printf ("\tval <<= 1;\n");
                   1882:        printf ("\tif(carry)  val |= 1;\n");
1.1       root     1883:        genflags(flag_logical, table68k[opcode].size, "val", "", "");
1.1.1.3   root     1884:        printf ("CFLG = carry!=0;\n");
                   1885:        genastore ("val", table68k[opcode].smode, "srcreg", table68k[opcode].size, "data");
1.1       root     1886:        break;
                   1887:      case i_RORW:
1.1.1.3   root     1888:        genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "data", 1, 0);
1.1       root     1889:        start_brace ();
                   1890:        switch(table68k[opcode].size) {
1.1.1.3   root     1891:         case sz_byte: printf ("\tuae_u8 val = data;\n"); break;
                   1892:         case sz_word: printf ("\tuae_u16 val = data;\n"); break;
                   1893:         case sz_long: printf ("\tuae_u32 val = data;\n"); break;
1.1       root     1894:         default: abort();
                   1895:        }
1.1.1.3   root     1896:        printf ("\tuae_u32 carry = val&1;\n");
1.1       root     1897:        switch(table68k[opcode].size) {
1.1.1.3   root     1898:         case sz_byte: printf ("\tuae_u32 cmask = 0x80;\n"); break;
                   1899:         case sz_word: printf ("\tuae_u32 cmask = 0x8000;\n"); break;
                   1900:         case sz_long: printf ("\tuae_u32 cmask = 0x80000000;\n"); break;
1.1       root     1901:         default: abort();
                   1902:        }
1.1.1.3   root     1903:        printf ("\tval >>= 1;\n");
                   1904:        printf ("\tif(carry) val |= cmask;\n");
1.1       root     1905:        genflags(flag_logical, table68k[opcode].size, "val", "", "");
1.1.1.3   root     1906:        printf ("CFLG = carry!=0;\n");
                   1907:        genastore ("val", table68k[opcode].smode, "srcreg", table68k[opcode].size, "data");
1.1       root     1908:        break;
                   1909:      case i_ROXLW:
1.1.1.3   root     1910:        genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "data", 1, 0);
1.1       root     1911:        start_brace ();
                   1912:        switch(table68k[opcode].size) {
1.1.1.3   root     1913:         case sz_byte: printf ("\tuae_u8 val = data;\n"); break;
                   1914:         case sz_word: printf ("\tuae_u16 val = data;\n"); break;
                   1915:         case sz_long: printf ("\tuae_u32 val = data;\n"); break;
1.1       root     1916:         default: abort();
                   1917:        }
                   1918:        switch(table68k[opcode].size) {
1.1.1.3   root     1919:         case sz_byte: printf ("\tuae_u32 cmask = 0x80;\n"); break;
                   1920:         case sz_word: printf ("\tuae_u32 cmask = 0x8000;\n"); break;
                   1921:         case sz_long: printf ("\tuae_u32 cmask = 0x80000000;\n"); break;
1.1       root     1922:         default: abort();
                   1923:        }
1.1.1.3   root     1924:        printf ("\tuae_u32 carry = val&cmask;\n");
                   1925:        printf ("\tval <<= 1;\n");
                   1926:        printf ("\tif(XFLG) val |= 1;\n");
                   1927:        printf ("\tXFLG = carry != 0;\n");
1.1       root     1928:        genflags(flag_logical, table68k[opcode].size, "val", "", "");
1.1.1.3   root     1929:        printf ("XFLG = CFLG = carry!=0;\n");
                   1930:        genastore ("val", table68k[opcode].smode, "srcreg", table68k[opcode].size, "data");
1.1       root     1931:        break;
                   1932:      case i_ROXRW:
1.1.1.3   root     1933:        genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "data", 1, 0);
1.1       root     1934:        start_brace ();
                   1935:        switch(table68k[opcode].size) {
1.1.1.3   root     1936:         case sz_byte: printf ("\tuae_u8 val = data;\n"); break;
                   1937:         case sz_word: printf ("\tuae_u16 val = data;\n"); break;
                   1938:         case sz_long: printf ("\tuae_u32 val = data;\n"); break;
1.1       root     1939:         default: abort();
                   1940:        }
1.1.1.3   root     1941:        printf ("\tuae_u32 carry = val&1;\n");
1.1       root     1942:        switch(table68k[opcode].size) {
1.1.1.3   root     1943:         case sz_byte: printf ("\tuae_u32 cmask = 0x80;\n"); break;
                   1944:         case sz_word: printf ("\tuae_u32 cmask = 0x8000;\n"); break;
                   1945:         case sz_long: printf ("\tuae_u32 cmask = 0x80000000;\n"); break;
1.1       root     1946:         default: abort();
                   1947:        }
1.1.1.3   root     1948:        printf ("\tval >>= 1;\n");
                   1949:        printf ("\tif(XFLG) val |= cmask;\n");
                   1950:        printf ("\tXFLG = carry != 0;\n");
1.1       root     1951:        genflags(flag_logical, table68k[opcode].size, "val", "", "");
1.1.1.3   root     1952:        printf ("XFLG = CFLG = carry!=0;\n");
                   1953:        genastore ("val", table68k[opcode].smode, "srcreg", table68k[opcode].size, "data");
1.1       root     1954:        break;
                   1955:      case i_MOVEC2:
                   1956:        genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0);
                   1957:        start_brace();
1.1.1.3   root     1958:        printf ("\tint regno = (src >> 12) & 15;\n");
                   1959:        printf ("\tuae_u32 *regp = regs.regs + regno;\n");
                   1960:        printf ("\tm68k_movec2(src & 0xFFF, regp);\n");
1.1       root     1961:        break;
                   1962:      case i_MOVE2C:
                   1963:        genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0);
                   1964:        start_brace();
1.1.1.3   root     1965:        printf ("\tint regno = (src >> 12) & 15;\n");
                   1966:        printf ("\tuae_u32 *regp = regs.regs + regno;\n");
                   1967:        printf ("\tm68k_move2c(src & 0xFFF, regp);\n");
1.1       root     1968:        break;
                   1969:      case i_CAS:
                   1970:        {
                   1971:            int old_brace_level;
                   1972:            genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0);
                   1973:            genamode (table68k[opcode].dmode, "dstreg", table68k[opcode].size, "dst", 1, 0);
                   1974:            start_brace();
1.1.1.3   root     1975:            printf ("\tint ru = (src >> 6) & 7;\n");
                   1976:            printf ("\tint rc = src & 7;\n");
1.1.1.2   root     1977:            genflags(flag_cmp, table68k[opcode].size, "newv", "m68k_dreg(regs, rc)", "dst");
1.1.1.3   root     1978:            printf ("\tif (ZFLG)");
1.1       root     1979:            old_brace_level = n_braces;
                   1980:            start_brace ();
1.1.1.3   root     1981:            genastore ("(m68k_dreg(regs, ru))",table68k[opcode].dmode, "dstreg", table68k[opcode].size, "dst");
1.1       root     1982:            pop_braces (old_brace_level);
1.1.1.3   root     1983:            printf ("else");
1.1       root     1984:            start_brace ();
1.1.1.3   root     1985:            printf ("m68k_dreg(regs, rc) = dst;\n");
1.1       root     1986:            pop_braces (old_brace_level);
                   1987:        }
                   1988:        break;
                   1989:      case i_CAS2:
                   1990:        genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "extra", 1, 0);
1.1.1.3   root     1991:        printf ("\tuae_u32 rn1 = regs.regs[(extra >> 28) & 7];\n");
                   1992:        printf ("\tuae_u32 rn2 = regs.regs[(extra >> 12) & 7];\n");
1.1       root     1993:        if (table68k[opcode].size == sz_word) {
                   1994:             int old_brace_level = n_braces;
1.1.1.3   root     1995:             printf ("\tuae_u16 dst1 = get_word(rn1), dst2 = get_word(rn2);\n");
1.1.1.2   root     1996:             genflags(flag_cmp, table68k[opcode].size, "newv", "m68k_dreg(regs, (extra >> 16) & 7)", "dst1");
1.1.1.3   root     1997:             printf ("\tif (ZFLG) {\n");
1.1.1.2   root     1998:             genflags(flag_cmp, table68k[opcode].size, "newv", "m68k_dreg(regs, extra & 7)", "dst2");
1.1.1.3   root     1999:             printf ("\tif (ZFLG) {\n");
                   2000:             printf ("\tput_word(rn1, m68k_dreg(regs, (extra >> 22) & 7));\n");
                   2001:             printf ("\tput_word(rn1, m68k_dreg(regs, (extra >> 6) & 7));\n");
                   2002:             printf ("\t}}\n");
1.1       root     2003:             pop_braces (old_brace_level);
1.1.1.3   root     2004:             printf ("\tif (!ZFLG) {\n");
                   2005:             printf ("\tm68k_dreg(regs, (extra >> 22) & 7) = (m68k_dreg(regs, (extra >> 22) & 7) & ~0xffff) | (dst1 & 0xffff);\n");
                   2006:             printf ("\tm68k_dreg(regs, (extra >> 6) & 7) = (m68k_dreg(regs, (extra >> 6) & 7) & ~0xffff) | (dst2 & 0xffff);\n");
                   2007:             printf ("\t}\n");
1.1       root     2008:        } else {
                   2009:             int old_brace_level = n_braces;
1.1.1.3   root     2010:             printf ("\tuae_u32 dst1 = get_long(rn1), dst2 = get_long(rn2);\n");
1.1.1.2   root     2011:             genflags(flag_cmp, table68k[opcode].size, "newv", "m68k_dreg(regs, (extra >> 16) & 7)", "dst1");
1.1.1.3   root     2012:             printf ("\tif (ZFLG) {\n");
1.1.1.2   root     2013:             genflags(flag_cmp, table68k[opcode].size, "newv", "m68k_dreg(regs, extra & 7)", "dst2");
1.1.1.3   root     2014:             printf ("\tif (ZFLG) {\n");
                   2015:             printf ("\tput_long(rn1, m68k_dreg(regs, (extra >> 22) & 7));\n");
                   2016:             printf ("\tput_long(rn1, m68k_dreg(regs, (extra >> 6) & 7));\n");
                   2017:             printf ("\t}}\n");
1.1       root     2018:             pop_braces (old_brace_level);
1.1.1.3   root     2019:             printf ("\tif (!ZFLG) {\n");
                   2020:             printf ("\tm68k_dreg(regs, (extra >> 22) & 7) = dst1;\n");
                   2021:             printf ("\tm68k_dreg(regs, (extra >> 6) & 7) = dst2;\n");
                   2022:             printf ("\t}\n");
1.1       root     2023:        }
                   2024:        break;
                   2025:      case i_MOVES:     /* ignore DFC and SFC because we have no MMU */
                   2026:        {
                   2027:            int old_brace_level;
                   2028:            genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "extra", 1, 0);
1.1.1.3   root     2029:            printf ("\tif (extra & 0x800)\n");
1.1       root     2030:            old_brace_level = n_braces;
                   2031:            start_brace ();
1.1.1.3   root     2032:            printf ("\tuae_u32 src = regs.regs[(extra >> 12) & 15];\n");
                   2033:            genamode (table68k[opcode].dmode, "dstreg", table68k[opcode].size, "dst", 2, 0);
                   2034:            genastore ("src", table68k[opcode].dmode, "dstreg", table68k[opcode].size, "dst");
1.1       root     2035:            pop_braces (old_brace_level);
1.1.1.3   root     2036:            printf ("else");
1.1       root     2037:            start_brace ();
1.1.1.3   root     2038:            genamode (table68k[opcode].dmode, "dstreg", table68k[opcode].size, "src", 1, 0);
                   2039:            printf ("\tif (extra & 0x8000) {\n");
1.1       root     2040:            switch(table68k[opcode].size) {
1.1.1.3   root     2041:             case sz_byte: printf ("\tm68k_areg(regs, (extra >> 12) & 7) = (uae_s32)(uae_s8)src;\n"); break;
                   2042:             case sz_word: printf ("\tm68k_areg(regs, (extra >> 12) & 7) = (uae_s32)(uae_s16)src;\n"); break;
                   2043:             case sz_long: printf ("\tm68k_areg(regs, (extra >> 12) & 7) = src;\n"); break;
1.1       root     2044:             default: abort();
                   2045:            }
1.1.1.3   root     2046:            printf ("\t} else {\n");
                   2047:            genastore ("src", Dreg, "(extra >> 12) & 7", table68k[opcode].size, "");
                   2048:            printf ("\t}\n");
1.1       root     2049:            pop_braces (old_brace_level);
                   2050:        }
                   2051:        break;
                   2052:      case i_BKPT:      /* only needed for hardware emulators */
1.1.1.3   root     2053:        sync_m68k_pc();
                   2054:        printf ("\top_illg(opcode);\n");
1.1       root     2055:        break;
                   2056:      case i_CALLM:     /* not present in 68030 */
1.1.1.3   root     2057:        sync_m68k_pc();
                   2058:        printf ("\top_illg(opcode);\n");
1.1       root     2059:        break;
                   2060:      case i_RTM:       /* not present in 68030 */
1.1.1.3   root     2061:        sync_m68k_pc();
                   2062:        printf ("\top_illg(opcode);\n");
1.1       root     2063:        break;
                   2064:      case i_TRAPcc:
                   2065:        if (table68k[opcode].smode != am_unknown && table68k[opcode].smode != am_illg)
                   2066:            genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "dummy", 1, 0);
1.1.1.3   root     2067:        printf ("\tif (cctrue(%d)) { Exception(7,m68k_getpc()); goto %s; }\n", table68k[opcode].cc, endlabelstr);
1.1       root     2068:        break;
                   2069:      case i_DIVL:
1.1.1.3   root     2070:        sync_m68k_pc ();
                   2071:        start_brace ();
                   2072:        printf ("\tuaecptr oldpc = m68k_getpc();\n");
1.1       root     2073:        genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "extra", 1, 0);
                   2074:        genamode (table68k[opcode].dmode, "dstreg", table68k[opcode].size, "dst", 1, 0);
1.1.1.3   root     2075:        sync_m68k_pc();
                   2076:        printf ("\tm68k_divl(opcode, dst, extra, oldpc);\n");
1.1       root     2077:        break;
                   2078:      case i_MULL:
                   2079:        genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "extra", 1, 0);
                   2080:        genamode (table68k[opcode].dmode, "dstreg", table68k[opcode].size, "dst", 1, 0);
1.1.1.3   root     2081:        sync_m68k_pc();
                   2082:        printf ("\tm68k_mull(opcode, dst, extra);\n");
1.1       root     2083:        break;
                   2084:      case i_BFTST:
                   2085:      case i_BFEXTU:
                   2086:      case i_BFCHG:
                   2087:      case i_BFEXTS:
                   2088:      case i_BFCLR:
                   2089:      case i_BFFFO:
                   2090:      case i_BFSET:
                   2091:      case i_BFINS:
                   2092:        genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "extra", 1, 0);
1.1.1.3   root     2093:        genamode (table68k[opcode].dmode, "dstreg", sz_long, "dst", 2, 0);
1.1       root     2094:        start_brace();
1.1.1.3   root     2095:        printf ("\tuae_s32 offset = extra & 0x800 ? m68k_dreg(regs, (extra >> 6) & 7) : (extra >> 6) & 0x1f;\n");
                   2096:        printf ("\tint width = (((extra & 0x20 ? m68k_dreg(regs, extra & 7) : extra) -1) & 0x1f) +1;\n");
1.1       root     2097:        if (table68k[opcode].dmode == Dreg) {
1.1.1.3   root     2098:            printf ("\tuae_u32 tmp = m68k_dreg(regs, dstreg) << (offset & 0x1f);\n");
                   2099:        } else {
                   2100:            printf ("\tuae_u32 tmp,bf0,bf1;\n");
                   2101:            printf ("\tdsta += (offset >> 3) | (offset & 0x80000000 ? ~0x1fffffff : 0);\n");
                   2102:            printf ("\tbf0 = get_long(dsta);bf1 = get_byte(dsta+4) & 0xff;\n");
                   2103:            printf ("\ttmp = (bf0 << (offset & 7)) | (bf1 >> (8 - (offset & 7)));\n");
                   2104:        }
                   2105:        printf ("\ttmp >>= (32 - width);\n");
                   2106:        printf ("\tNFLG = tmp & (1 << (width-1)) ? 1 : 0;ZFLG = tmp == 0;VFLG = 0;CFLG = 0;\n");
                   2107:        switch(table68k[opcode].mnemo) {
                   2108:         case i_BFTST:
                   2109:            break;
                   2110:         case i_BFEXTU:
                   2111:            printf ("\tm68k_dreg(regs, (extra >> 12) & 7) = tmp;\n");
                   2112:            break;
                   2113:         case i_BFCHG:
                   2114:            printf ("\ttmp = ~tmp;\n");
                   2115:            break;
                   2116:         case i_BFEXTS:
                   2117:            printf ("\tif (NFLG) tmp |= width == 32 ? 0 : (-1 << width);\n");
                   2118:            printf ("\tm68k_dreg(regs, (extra >> 12) & 7) = tmp;\n");
                   2119:            break;
                   2120:         case i_BFCLR:
                   2121:            printf ("\ttmp = 0;\n");
                   2122:            break;
                   2123:         case i_BFFFO:
                   2124:            printf ("\t{ uae_u32 mask = 1 << (width-1);\n");
                   2125:            printf ("\twhile (mask) { if (tmp & mask) break; mask >>= 1; offset++; }}\n");
                   2126:            printf ("\tm68k_dreg(regs, (extra >> 12) & 7) = offset;\n");
                   2127:            break;
                   2128:         case i_BFSET:
                   2129:            printf ("\ttmp = 0xffffffff;\n");
                   2130:            break;
                   2131:         case i_BFINS:
                   2132:            printf ("\ttmp = m68k_dreg(regs, (extra >> 12) & 7);\n");
                   2133:            break;
                   2134:         default:
                   2135:            break;
1.1       root     2136:        }
                   2137:        if (table68k[opcode].mnemo == i_BFCHG ||
                   2138:            table68k[opcode].mnemo == i_BFCLR ||
                   2139:            table68k[opcode].mnemo == i_BFSET ||
                   2140:            table68k[opcode].mnemo == i_BFINS) {
1.1.1.3   root     2141:                printf ("\ttmp <<= (32 - width);\n");
1.1       root     2142:                if (table68k[opcode].dmode == Dreg) {
1.1.1.3   root     2143:                    printf ("\tm68k_dreg(regs, dstreg) = (m68k_dreg(regs, dstreg) & ((offset & 0x1f) == 0 ? 0 :\n");
                   2144:                    printf ("\t\t(0xffffffff << (32 - (offset & 0x1f))))) |\n");
                   2145:                    printf ("\t\t(tmp >> (offset & 0x1f)) |\n");
                   2146:                    printf ("\t\t(((offset & 0x1f) + width) >= 32 ? 0 :\n");
                   2147:                    printf (" (m68k_dreg(regs, dstreg) & ((uae_u32)0xffffffff >> ((offset & 0x1f) + width))));\n");
                   2148:                } else {
                   2149:                    printf ("\tbf0 = (bf0 & (0xff000000 << (8 - (offset & 7)))) |\n");
                   2150:                    printf ("\t\t(tmp >> (offset & 7)) |\n");
                   2151:                    printf ("\t\t(((offset & 7) + width) >= 32 ? 0 :\n");
                   2152:                    printf ("\t\t (bf0 & ((uae_u32)0xffffffff >> ((offset & 7) + width))));\n");
                   2153:                    printf ("\tput_long(dsta,bf0 );\n");
                   2154:                    printf ("\tif (((offset & 7) + width) > 32) {\n");
                   2155:                    printf ("\t\tbf1 = (bf1 & (0xff >> (width - 32 + (offset & 7)))) |\n");
                   2156:                    printf ("\t\t\t(tmp << (8 - (offset & 7)));\n");
                   2157:                    printf ("\t\tput_byte(dsta+4,bf1);\n");
                   2158:                    printf ("\t}\n");
1.1       root     2159:                }
                   2160:        }
                   2161:        break;
                   2162:      case i_PACK:
                   2163:        if (table68k[opcode].smode == Dreg) {
1.1.1.3   root     2164:            printf ("\tuae_u16 val = m68k_dreg(regs, srcreg) + %s;\n", gen_nextiword());
                   2165:            printf ("\tm68k_dreg(regs, dstreg) = (m68k_dreg(regs, dstreg) & 0xffffff00) | ((val >> 4) & 0xf0) | (val & 0xf);\n");
                   2166:        } else {
                   2167:            printf ("\tuae_u16 val;\n");
                   2168:            printf ("\tm68k_areg(regs, srcreg) -= areg_byteinc[srcreg];\n");
                   2169:            printf ("\tval = (uae_u16)get_byte(m68k_areg(regs, srcreg));\n");
                   2170:            printf ("\tm68k_areg(regs, srcreg) -= areg_byteinc[srcreg];\n");
                   2171:            printf ("\tval = (val | ((uae_u16)get_byte(m68k_areg(regs, srcreg)) << 8)) + %s;\n", gen_nextiword());
                   2172:            printf ("\tm68k_areg(regs, dstreg) -= areg_byteinc[dstreg];\n");
                   2173:            printf ("\tput_byte(m68k_areg(regs, dstreg),((val >> 4) & 0xf0) | (val & 0xf));\n");
1.1       root     2174:        }
                   2175:        break;
                   2176:      case i_UNPK:
                   2177:        if (table68k[opcode].smode == Dreg) {
1.1.1.3   root     2178:            printf ("\tuae_u16 val = m68k_dreg(regs, srcreg);\n");
                   2179:            printf ("\tval = (((val << 4) & 0xf00) | (val & 0xf)) + %s;\n", gen_nextiword());
                   2180:            printf ("\tm68k_dreg(regs, dstreg) = (m68k_dreg(regs, dstreg) & 0xffff0000) | (val & 0xffff);\n");
                   2181:        } else {
                   2182:            printf ("\tuae_u16 val;\n");
                   2183:            printf ("\tm68k_areg(regs, srcreg) -= areg_byteinc[srcreg];\n");
                   2184:            printf ("\tval = (uae_u16)get_byte(m68k_areg(regs, srcreg));\n");
                   2185:            printf ("\tval = (((val << 4) & 0xf00) | (val & 0xf)) + %s;\n", gen_nextiword());
                   2186:            printf ("\tm68k_areg(regs, dstreg) -= areg_byteinc[dstreg];\n");
                   2187:            printf ("\tput_byte(m68k_areg(regs, dstreg),val);\n");
                   2188:            printf ("\tm68k_areg(regs, dstreg) -= areg_byteinc[dstreg];\n");
                   2189:            printf ("\tput_byte(m68k_areg(regs, dstreg),val >> 8);\n");
1.1       root     2190:        }
                   2191:        break;
                   2192:      case i_TAS:
1.1.1.3   root     2193:        genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "src", 1, 0);
1.1       root     2194:        genflags(flag_logical, table68k[opcode].size, "src", "", "");
1.1.1.3   root     2195:        printf ("\tsrc |= 0x80;\n");
                   2196:        genastore ("src", table68k[opcode].smode, "srcreg", table68k[opcode].size, "src");
1.1       root     2197:        break;
                   2198:      case i_FPP:
                   2199:        genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "extra", 1, 0);
1.1.1.3   root     2200:        sync_m68k_pc();
                   2201:        printf ("\tfpp_opp(opcode,extra);\n");
1.1       root     2202:        break;
                   2203:      case i_FDBcc:
                   2204:        genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "extra", 1, 0);
1.1.1.3   root     2205:        sync_m68k_pc();
                   2206:        printf ("\tfdbcc_opp(opcode,extra);\n");
1.1       root     2207:        break;
                   2208:      case i_FScc:
                   2209:        genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "extra", 1, 0);
1.1.1.3   root     2210:        sync_m68k_pc();
                   2211:        printf ("\tfscc_opp(opcode,extra);\n");
1.1       root     2212:        break;
                   2213:      case i_FTRAPcc:
1.1.1.3   root     2214:        sync_m68k_pc();
                   2215:        start_brace();
                   2216:        printf ("\tuaecptr oldpc = m68k_getpc();\n");
1.1       root     2217:        if (table68k[opcode].smode != am_unknown && table68k[opcode].smode != am_illg)
                   2218:            genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "dummy", 1, 0);
1.1.1.3   root     2219:        sync_m68k_pc();
                   2220:        printf ("\tftrapcc_opp(opcode,oldpc);\n");
1.1       root     2221:        break;
                   2222:      case i_FBcc:
1.1.1.3   root     2223:        sync_m68k_pc();
                   2224:        start_brace();
                   2225:        printf ("\tuaecptr pc = m68k_getpc();\n");
1.1       root     2226:        genamode (table68k[opcode].dmode, "srcreg", table68k[opcode].size, "extra", 1, 0);
1.1.1.3   root     2227:        sync_m68k_pc();
                   2228:        printf ("\tfbcc_opp(opcode,pc,extra);\n");
1.1       root     2229:        break;
                   2230:      case i_FSAVE:
1.1.1.3   root     2231:        sync_m68k_pc();
                   2232:        printf ("\tfsave_opp(opcode);\n");
1.1       root     2233:        break;
                   2234:      case i_FRESTORE:
1.1.1.3   root     2235:        sync_m68k_pc();
                   2236:        printf ("\tfrestore_opp(opcode);\n");
1.1       root     2237:        break;
                   2238:      case i_MMUOP:
                   2239:        genamode (table68k[opcode].smode, "srcreg", table68k[opcode].size, "extra", 1, 0);
1.1.1.3   root     2240:        sync_m68k_pc();
                   2241:        printf ("\tmmu_op(opcode,extra);\n");
1.1       root     2242:        break;
                   2243:      default:
                   2244:        abort();
                   2245:        break;
                   2246:     };
                   2247:     finish_braces ();
1.1.1.3   root     2248:     sync_m68k_pc ();
                   2249:     printf ("%s: (void)0;\n", endlabelstr);
1.1       root     2250: }
                   2251: 
1.1.1.3   root     2252: static void generate_includes (FILE *f)
                   2253: {
                   2254:     fprintf (f, "#include \"sysconfig.h\"\n");
                   2255:     fprintf (f, "#include \"sysdeps.h\"\n");
                   2256:     fprintf (f, "#include \"config.h\"\n");
                   2257:     fprintf (f, "#include \"options.h\"\n");
                   2258:     fprintf (f, "#include \"machdep/m68k.h\"\n");
                   2259:     fprintf (f, "#include \"memory.h\"\n");
                   2260:     fprintf (f, "#include \"custom.h\"\n");
                   2261:     fprintf (f, "#include \"readcpu.h\"\n");
                   2262:     fprintf (f, "#include \"newcpu.h\"\n");
                   2263:     fprintf (f, "#include \"compiler.h\"\n");
                   2264:     fprintf (f, "#include \"cputbl.h\"\n");
                   2265: }
                   2266: 
                   2267: static int postfix;
                   2268: 
                   2269: static void generate_one_opcode (int rp)
1.1       root     2270: {
                   2271:     int i;
1.1.1.3   root     2272:     uae_u16 smsk, dmsk;
                   2273:     long int opcode = opcode_map[rp];
1.1       root     2274: 
1.1.1.3   root     2275:     if (table68k[opcode].mnemo == i_ILLG
                   2276:        || table68k[opcode].clev > cpu_level)
                   2277:        return;
1.1       root     2278: 
1.1.1.3   root     2279:     for (i = 0; lookuptab[i].name[0] ; i++) {
                   2280:        if (table68k[opcode].mnemo == lookuptab[i].mnemo)
                   2281:            break;
                   2282:     }
1.1       root     2283: 
1.1.1.3   root     2284:     if (table68k[opcode].handler != -1)
                   2285:        return;
1.1       root     2286: 
1.1.1.3   root     2287:     if (opcode_next_clev[rp] != cpu_level) {
                   2288:        fprintf (stblfile, "{ op_%lx_%d, 0, %ld }, /* %s */\n", opcode, opcode_last_postfix[rp],
                   2289:                 opcode, lookuptab[i].name);
                   2290:        return;
                   2291:     }
                   2292:     fprintf (stblfile, "{ op_%lx_%d, 0, %ld }, /* %s */\n", opcode, postfix, opcode, lookuptab[i].name);
                   2293:     fprintf (headerfile, "extern cpuop_func op_%lx_%d;\n", opcode, postfix);
                   2294:     printf ("void REGPARAM2 op_%lx_%d(uae_u32 opcode) /* %s */\n{\n", opcode, postfix, lookuptab[i].name);
                   2295: 
                   2296:     switch (table68k[opcode].stype) {
                   2297:      case 0: smsk = 7; break;
                   2298:      case 1: smsk = 255; break;
                   2299:      case 2: smsk = 15; break;
                   2300:      case 3: smsk = 7; break;
                   2301:      case 4: smsk = 7; break;
                   2302:      case 5: smsk = 63; break;
                   2303:      default: abort();
                   2304:     }
                   2305:     dmsk = 7;
                   2306: 
                   2307:     next_cpu_level = -1;
                   2308:     if (table68k[opcode].suse
                   2309:        && table68k[opcode].smode != imm  && table68k[opcode].smode != imm0
                   2310:        && table68k[opcode].smode != imm1 && table68k[opcode].smode != imm2
                   2311:        && table68k[opcode].smode != absw && table68k[opcode].smode != absl
                   2312:        && table68k[opcode].smode != PC8r && table68k[opcode].smode != PC16)
                   2313:     {
                   2314:        if (table68k[opcode].spos == -1) {
                   2315:            if (((int)table68k[opcode].sreg) >= 128)
                   2316:                printf ("\tuae_u32 srcreg = (uae_s32)(uae_s8)%d;\n", (int)table68k[opcode].sreg);
                   2317:            else
                   2318:                printf ("\tuae_u32 srcreg = %d;\n", (int)table68k[opcode].sreg);
                   2319:        } else {
                   2320:            char source[100];
                   2321:            
                   2322:            if (table68k[opcode].spos)
                   2323:                sprintf (source,"((opcode >> %d) & %d)",(int)table68k[opcode].spos,smsk);
                   2324:            else
                   2325:                sprintf (source,"(opcode & %d)",smsk);
                   2326:            
                   2327:            if (table68k[opcode].stype == 3)
                   2328:                printf ("\tuae_u32 srcreg = imm8_table[%s];\n", source);
                   2329:            else if (table68k[opcode].stype == 1)
                   2330:                printf ("\tuae_u32 srcreg = (uae_s32)(uae_s8)%s;\n", source);
                   2331:            else
                   2332:                printf ("\tuae_u32 srcreg = %s;\n", source);
1.1       root     2333:        }
1.1.1.3   root     2334:     }
                   2335:     if (table68k[opcode].duse
                   2336:        /* Yes, the dmode can be imm, in case of LINK or DBcc */
                   2337:        && table68k[opcode].dmode != imm  && table68k[opcode].dmode != imm0
                   2338:        && table68k[opcode].dmode != imm1 && table68k[opcode].dmode != imm2
                   2339:        && table68k[opcode].dmode != absw && table68k[opcode].dmode != absl) {
                   2340:        if (table68k[opcode].dpos == -1) {
                   2341:            if (((int)table68k[opcode].dreg) >= 128)
                   2342:                printf ("\tuae_u32 dstreg = (uae_s32)(uae_s8)%d;\n", (int)table68k[opcode].dreg);
                   2343:            else
                   2344:                printf ("\tuae_u32 dstreg = %d;\n", (int)table68k[opcode].dreg);
                   2345:        } else {
                   2346:            if (table68k[opcode].dpos)
                   2347:                printf ("\tuae_u32 dstreg = (opcode >> %d) & %d;\n",
                   2348:                        (int)table68k[opcode].dpos,dmsk);
                   2349:            else
                   2350:                printf ("\tuae_u32 dstreg = opcode & %d;\n", dmsk);
1.1       root     2351:        }
                   2352:     }
1.1.1.3   root     2353:     endlabelno++;
                   2354:     sprintf (endlabelstr, "endlabel%d", endlabelno);
                   2355:     gen_opcode (opcode);
                   2356:     printf ("}\n");
                   2357:     opcode_next_clev[rp] = next_cpu_level;
                   2358:     opcode_last_postfix[rp] = postfix;
1.1       root     2359: }
                   2360: 
1.1.1.3   root     2361: static void generate_func (void)
1.1       root     2362: {
1.1.1.3   root     2363:     int i, rp;
1.1       root     2364: 
1.1.1.3   root     2365:     using_prefetch = 0;
                   2366:     using_exception_3 = 0;
                   2367:     for (i = 0; i < 5; i++) {
                   2368:        cpu_level = 3 - i;
                   2369:        if (i == 4) {
                   2370:            cpu_level = 0;
                   2371:            using_prefetch = 1;
                   2372:            using_exception_3 = 1;
                   2373:            for (rp = 0; rp < nr_cpuop_funcs; rp++)
                   2374:                opcode_next_clev[rp] = 0;
                   2375:        }
                   2376:        postfix = i;
                   2377:        fprintf (stblfile, "struct cputbl op_smalltbl_%d[] = {\n", postfix);
                   2378: 
                   2379:        for (rp = 0; rp < nr_cpuop_funcs; rp++)
                   2380:            generate_one_opcode (rp);
                   2381:        fprintf (stblfile, "{ 0, 0, 0 }};\n");
1.1       root     2382:     }
                   2383: 
                   2384: }
                   2385: 
1.1.1.3   root     2386: int main (int argc, char **argv)
                   2387: {  
1.1       root     2388:     read_table68k ();
                   2389:     do_merges ();
1.1.1.3   root     2390: 
                   2391:     opcode_map = (int *)xmalloc (sizeof (int) * nr_cpuop_funcs);
                   2392:     opcode_last_postfix = (int *)xmalloc (sizeof (int) * nr_cpuop_funcs);
                   2393:     opcode_next_clev = (int *)xmalloc (sizeof (int) * nr_cpuop_funcs);
                   2394:     counts = (unsigned long *)xmalloc (65536 * sizeof (unsigned long));
                   2395:     read_counts();
                   2396: 
                   2397:     /* It would be a lot nicer to put all in one file (we'd also get rid of
                   2398:      * cputbl.h that way), but cpuopti can't cope.  That could be fixed, but
                   2399:      * I don't dare to touch the 68k version.  */
1.1       root     2400:     
1.1.1.3   root     2401:     headerfile = fopen ("cputbl.h", "wb");
                   2402:     stblfile = fopen ("cpustbl.c", "wb");
                   2403:     freopen ("cpuemu.c", "wb", stdout);
                   2404: 
                   2405:     generate_includes (stdout);
                   2406:     generate_includes (stblfile);
                   2407: 
                   2408:     generate_func ();
                   2409: 
                   2410:     free (table68k);
1.1       root     2411:     return 0;
                   2412: }

unix.superglobalmegacorp.com

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