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

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

unix.superglobalmegacorp.com

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