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

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

unix.superglobalmegacorp.com

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