Annotation of generator/src/def68k.c, revision 1.1.1.1

1.1       root        1: /*****************************************************************************/
                      2: /*     Generator - Sega Genesis emulation - (c) James Ponder 1997-1998       */
                      3: /*****************************************************************************/
                      4: /*                                                                           */
                      5: /* def68k.c                                                                  */
                      6: /*                                                                           */
                      7: /*****************************************************************************/
                      8: 
                      9: #include <errno.h>
                     10: #include <stdio.h>
                     11: #include <string.h>
                     12: #include <ctype.h>
                     13: #include <stdlib.h>
                     14: 
                     15: #include "generator.h"
                     16: 
                     17: #define BUFLEN 1024
                     18: #define FNAME_CPUDEF "def68k.def"
                     19: #define FNAME_OUTIIBS "out/def68k-iibs.h"
                     20: #define FNAME_OUTFUNCS "out/def68k-funcs.h"
                     21: #define FNAME_OUTPROTO "out/def68k-proto.h"
                     22: 
                     23: typedef enum {
                     24:   bit0, bit1, bitz, bite, bitE, bitf, bitF, biti, bitn, bitN, bitc, bitv
                     25: } t_bit;
                     26: 
                     27: /* file-scope global variables */
                     28: 
                     29: static int total = 0;
                     30: 
                     31: /* private functions for forward references */
                     32: 
                     33: void procline(char *line, int lineno, FILE *outiibs, FILE *outfuncs,
                     34:              FILE *outproto);
                     35: int clocks_ea(t_datatype type);
                     36: int clocks_eacalc(t_datatype type, t_size size);
                     37: int clocks_eafetch(t_datatype type, t_size size);
                     38: int clocks_standard(t_datatype stype, t_datatype dtype, t_size size);
                     39: int clocks_single(t_datatype type, t_size size);
                     40: 
                     41: /* program entry routine */
                     42: 
                     43: int main(int argc, char *argv[])
                     44: {
                     45:   FILE *input, *outiibs, *outfuncs, *outproto;
                     46:   char buf[BUFLEN], *p;
                     47:   int lineno = 0;
                     48: 
                     49:   /* open output files and write headers */
                     50: 
                     51:   if ((outiibs = fopen(FNAME_OUTIIBS, "w")) == NULL) {
                     52:     perror("fopen outiibs");
                     53:     exit(1);
                     54:   }
                     55:   fprintf(outiibs, "/* automatically generated by def68k.c */\n\n");
                     56:   fprintf(outiibs, "t_iib iibs[] = {\n");
                     57:   fprintf(outiibs, "  /* mask, bits, mnemonic, { priv, endblk, zero, ");
                     58:   fprintf(outiibs, "used, set },\n");
                     59:   fprintf(outiibs, "     size, stype, dtype, sbitpos, dbitpos, immvalue, ");
                     60:   fprintf(outiibs, "cc, funcnum */\n");
                     61: 
                     62:   if ((outfuncs = fopen(FNAME_OUTFUNCS, "w")) == NULL) {
                     63:     perror("fopen outfuncs");
                     64:     exit(1);
                     65:   }
                     66:   fprintf(outfuncs, "/* automatically generated by def68k.c */\n\n");
                     67:   fprintf(outfuncs, "void (*cpu68k_funcindex[])(t_ipc *ipc) = {\n");
                     68:   fprintf(outfuncs, "  /* function */\n");
                     69: 
                     70:   if ((outproto = fopen(FNAME_OUTPROTO, "w")) == NULL) {
                     71:     perror("fopen outproto");
                     72:     exit(1);
                     73:   }
                     74:   fprintf(outproto, "/* automatically generated by def68k.c */\n\n");
                     75: 
                     76:   /* open input file */
                     77: 
                     78:   if ((input = fopen(FNAME_CPUDEF, "r")) == NULL) {
                     79:     perror("fopen input");
                     80:     exit(1);
                     81:   }
                     82: 
                     83:   /* loop until end of file */
                     84: 
                     85:   printf("Writing CPU definitions... ");
                     86:   fflush(stdout);
                     87: 
                     88:   while (!feof(input)) {
                     89:     /* use unix line numbering from 1 */
                     90:     lineno++;
                     91:     /* read a line */
                     92:     if (ferror(input)) {
                     93:       break;
                     94:     }
                     95:     if (fgets(buf, BUFLEN, input) == NULL) {
                     96:       break;
                     97:       /* huh? why does this cause fgets to say 'Unknown error'?! */
                     98:       perror("fgets");
                     99:       exit(1);
                    100:     }
                    101:     /* remove newline */
                    102:     buf[strlen(buf)-1] = '\0';
                    103:     /* remove comment */
                    104:     if ((p = strchr(buf, ';')) != NULL) {
                    105:       *p = '\0';
                    106:     }
                    107:     /* remove leading spaces */
                    108:     p = buf;
                    109:     while (*p == ' ')
                    110:       p++;
                    111:     /* blank line? */
                    112:     if (!*p)
                    113:       continue;
                    114:     /* process line */
                    115:     procline(buf, lineno, outiibs, outfuncs, outproto);
                    116:   }
                    117: 
                    118:   /* close input */
                    119: 
                    120:   if (fclose(input)) {
                    121:     perror("fclose input");
                    122:     exit(1);
                    123:   }
                    124: 
                    125:   /* output footer */
                    126: 
                    127:   fprintf(outiibs, "  { 0, 0, 0, { 0, 0, 0, 0, 0 }, "
                    128:          "0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }\n");
                    129:   fprintf(outiibs, "};\n");
                    130:   fprintf(outiibs, "int iibs_num = %d;\n", total);
                    131: 
                    132:   fprintf(outfuncs, "};\n");
                    133: 
                    134:   /* close outputs */
                    135: 
                    136:   if (fclose(outiibs)) {
                    137:     perror("fclose outiibs");
                    138:     exit(1);
                    139:   }
                    140:   if (fclose(outfuncs)) {
                    141:     perror("fclose outfuncs");
                    142:     exit(1);
                    143:   }
                    144:   if (fclose(outproto)) {
                    145:     perror("fclose outproto");
                    146:     exit(1);
                    147:   }
                    148: 
                    149:   printf("done.\n");
                    150:   fflush(stdout);
                    151: 
                    152:   return(0);
                    153: }  
                    154: 
                    155: /* process a line */
                    156: 
                    157: void procline(char *line, int lineno, FILE *outiibs, FILE *outfuncs,
                    158:              FILE *outproto) {
                    159:   int i;
                    160:   char *p;
                    161:   t_bit bit = bit0, lastbit = bit0;
                    162:   int start[16] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 };
                    163:   int num[16] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 };
                    164:   char mnemonic[16], *m;
                    165:   int setting;
                    166:   int clocks;
                    167: 
                    168:   /* parameters to fill in about instruction */
                    169:   int mnemonic_num;
                    170:   uint16 mask = 0, bits = 0;        /* see struct t_iib for details on */
                    171:   int priv = 0, endblk = 0;         /* these variables */
                    172:   int imm_notzero = 0;
                    173:   int used = 0, set = 0;
                    174:   t_size isize = sz_none;
                    175:   int expand_s_immsize = 0, expand_s_ea_e = 0;
                    176:   int expand_d_ea_e = 0, expand_d_ea_f = 0;
                    177:   t_datatype dtype = dt_Ill;
                    178:   t_datatype stype = dt_Ill;
                    179:   int e[16] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 };
                    180:   int f[16] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 };
                    181:   int immvalue = 0;
                    182:   int sbitpos = 0, dbitpos = 0;
                    183: 
                    184:   p = line;
                    185: 
                    186:   /* bitpattern */
                    187: 
                    188:   for (i = 15; i >= 0; i--) {
                    189:     while (*p == ' ')
                    190:       p++;
                    191: 
                    192:     switch(*p) {
                    193:     case '0': bit = bit0; mask |= 1<<i; break;
                    194:     case '1': bit = bit1; mask |= 1<<i; bits |= 1<<i; break;
                    195:     case 'z': bit = bitz; break;
                    196:     case 'e': bit = bite; break;
                    197:     case 'E': bit = bitE; break;
                    198:     case 'f': bit = bitf; break;
                    199:     case 'F': bit = bitF; break;
                    200:     case 'n': bit = bitn; break;
                    201:     case 'N': bit = bitN; break;
                    202:     case 'i': bit = biti; break;
                    203:     case 'c': bit = bitc; break;
                    204:     case 'V': bit = bitv; break;
                    205:     default:
                    206:       fprintf(stderr, "%d: unknown char %c in bitpattern\n", lineno, *p);
                    207:       exit(1);
                    208:     }
                    209: 
                    210:     if (*p != '0' && *p != '1') {
                    211:       if (num[bit]) {
                    212:        /* we've seen this bit before, make sure the last bit was the same */
                    213:        if (bit < 15 && bit != lastbit) {
                    214:          fprintf(stderr, "%d: Non contiguous bits of %c\n", lineno, *p);
                    215:          exit(1);
                    216:        }
                    217:       }
                    218:       /* we're looping down, so the last time start[bit] is set is the start */
                    219:       start[bit] = i;
                    220:       /* record how many of these bits there are */
                    221:       num[bit]++;
                    222:     }
                    223:     p++;
                    224:     lastbit = bit;
                    225:   }
                    226:   /* skip spaces and skip tab to get to next field */
                    227:   while (*p == ' ')
                    228:     p++;
                    229:   if (*p++ != '\t') {
                    230:     fprintf(stderr, "%d: Tab not found at end of bitpattern\n", lineno);
                    231:     exit(1);
                    232:   }
                    233: 
                    234:   /* misc flags */
                    235: 
                    236:   if (*p == '0') {
                    237:     priv = 0;
                    238:   } else if (*p == '1') {
                    239:     priv = 1;
                    240:   } else {
                    241:     fprintf(stderr, "%d: Priv flag not 0 or 1\n", lineno);
                    242:     exit(1);
                    243:   }
                    244:   p++;
                    245:   /* skip spaces to next field */
                    246:   while (*p == ' ')
                    247:     p++;
                    248:   if (*p == '0') {
                    249:     endblk = 0;
                    250:   } else if (*p == '1') {
                    251:     endblk = 1;
                    252:   } else {
                    253:     fprintf(stderr, "%d: End-block flag not 0 or 1\n", lineno);
                    254:     exit(1);
                    255:   }
                    256:   p++;
                    257:   /* skip spaces and skip tab to get to next field */
                    258:   while (*p == ' ')
                    259:     p++;
                    260:   if (*p++ != '\t') {
                    261:     fprintf(stderr, "%d: Tab not found at end of flags\n", lineno);
                    262:     exit(1);
                    263:   }
                    264: 
                    265:   /* used flags */
                    266: 
                    267:   for (i = 0; i < 5; i++) {
                    268:     while (*p == ' ')
                    269:       p++;
                    270:     switch(*p++) {
                    271:     case '-': break;
                    272:     case 'x': break;
                    273:     case 'X': used |= 1<<i; break;
                    274:     case 'N': used |= 1<<i; break;
                    275:     case 'Z': used |= 1<<i; break;
                    276:     case 'V': used |= 1<<i; break;
                    277:     case 'C': used |= 1<<i; break;
                    278:     case '0': used |= 1<<i; break;
                    279:     case '1': used |= 1<<i; break;
                    280:     default:
                    281:       fprintf(stderr, "%d: Did not understand used flag %d\n", lineno, i);
                    282:       exit(1);
                    283:     }
                    284:   }
                    285:   /* skip spaces and skip tab to get to next field */
                    286:   while (*p == ' ')
                    287:     p++;
                    288:   if (*p++ != '\t') {
                    289:     fprintf(stderr, "%d: Tab not found at end of used flags\n", lineno);
                    290:     exit(1);
                    291:   }
                    292: 
                    293:   /* set flags */
                    294: 
                    295:   for (i = 0; i < 5; i++) {
                    296:     while (*p == ' ')
                    297:       p++;
                    298:     switch(*p++) {
                    299:     case '-': break;
                    300:     case 'x': break;
                    301:     case 'X': set |= 1<<i; break;
                    302:     case 'N': set |= 1<<i; break;
                    303:     case 'Z': set |= 1<<i; break;
                    304:     case 'V': set |= 1<<i; break;
                    305:     case 'C': set |= 1<<i; break;
                    306:     case '0': set |= 1<<i; break;
                    307:     case '1': set |= 1<<i; break;
                    308:     default:
                    309:       fprintf(stderr, "%d: Did not understand set flag %d\n", lineno, i);
                    310:       exit(1);
                    311:     }
                    312:   }
                    313:   /* skip spaces and skip tab to get to next field */
                    314:   while (*p == ' ')
                    315:     p++;
                    316:   if (*p++ != '\t') {
                    317:     fprintf(stderr, "%d: Tab not found at end of set flags\n", lineno);
                    318:     exit(1);
                    319:   }
                    320:       
                    321:   /* mnemonic */
                    322: 
                    323:   m = mnemonic;
                    324:   while (*p && (*p != '.') && (*p != ' ') && (*p != '\t')) {
                    325:     *m++ = *p++;
                    326:   }
                    327:   if (*p == '\t') {
                    328:     fprintf(stderr, "%d: Incorrect number of fields - extra tab found\n",
                    329:            lineno);
                    330:     exit(1);
                    331:   }
                    332:   *m = '\0';
                    333:   for (mnemonic_num = 0; *mnemonic_table[mnemonic_num].name; mnemonic_num++)
                    334:     if (!strcmp(mnemonic_table[mnemonic_num].name, mnemonic))
                    335:       break;
                    336:   if (!*mnemonic_table[mnemonic_num].name) {
                    337:     fprintf(stderr, "%d: Unknown mnemonic '%s'\n", lineno, mnemonic);
                    338:     exit(1);
                    339:   }
                    340:   /* set defaults for isize */
                    341:   isize = sz_none;
                    342:   if (*p == '.') {
                    343:     switch(*++p) {
                    344:     case 'B': isize = sz_byte; break;
                    345:     case 'W': isize = sz_word; break;
                    346:     case 'L': isize = sz_long; break;
                    347:     case 'z':
                    348:       if (!num[bitz]) {
                    349:        fprintf(stderr, "%d: 'z' given as size but no 'z' in bit pattern\n",
                    350:                lineno);
                    351:        exit(1);
                    352:       }
                    353:       /* size will be set automatically later */
                    354:       break;
                    355:     default:
                    356:       fprintf(stderr, "%d: Unknown size '%c' after mnemonic\n",
                    357:              lineno, *p);
                    358:       exit(1);
                    359:     }
                    360:     p++;
                    361:   } else {
                    362:     /* instruction is not sized */
                    363:     if (num[bitz]) {
                    364:       /* oh, perhaps it is but it's a mistake */
                    365:       fprintf(stderr, "%d: 'z's in bit pattern but no .z after mnemonic\n",
                    366:              lineno);
                    367:       exit(1);
                    368:     }
                    369:   }
                    370:   while (*p == ' ')
                    371:     p++;
                    372:   if (*p == '\0') {
                    373:     /* no source and destination information given */
                    374:     if (num[bite] || num[bitE] || num[bitf] || num[bitF] ||
                    375:        num[biti] || num[bitn] || num[bitN] || num[bitv]) {
                    376:       fprintf(stderr, "%d: No information given after mnemonic\n", lineno);
                    377:       exit(1);
                    378:     }
                    379:   } else {
                    380:     switch(*p++) {
                    381:     case 'n':
                    382:     case 'N':
                    383:       if (*(p-1) == 'n') {
                    384:        sbitpos = start[bitn];
                    385:       } else {
                    386:        sbitpos = start[bitN];
                    387:       }
                    388:       if (*p++ != '(') {
                    389:        fprintf(stderr, "%d: missing qualifier for n()\n", lineno);
                    390:        exit(1);
                    391:       }
                    392:       if (!strncmp(p, "Dreg", 4)) { stype = dt_Dreg; p = p+4;
                    393:       } else if (!strncmp(p, "Areg", 4)) { stype = dt_Areg; p = p+4;
                    394:       } else if (!strncmp(p, "Aind", 4)) { stype = dt_Aind; p = p+4;
                    395:       } else if (!strncmp(p, "Ainc", 4)) { stype = dt_Ainc; p = p+4;
                    396:       } else if (!strncmp(p, "Adec", 4)) { stype = dt_Adec; p = p+4;
                    397:       } else if (!strncmp(p, "Adis", 4)) { stype = dt_Adis; p = p+4;
                    398:       } else if (!strncmp(p, "Aidx", 4)) { stype = dt_Aidx; p = p+4;
                    399:       } else if (!strncmp(p, "AbsW", 4)) { stype = dt_AbsW; p = p+4;
                    400:       } else if (!strncmp(p, "AbsL", 4)) { stype = dt_AbsL; p = p+4;
                    401:       } else if (!strncmp(p, "Pdis", 4)) { stype = dt_Pdis; p = p+4;
                    402:       } else if (!strncmp(p, "Pidx", 4)) { stype = dt_Pidx; p = p+4;
                    403:       } else {
                    404:        fprintf(stderr, "%d: unknown qualifier for n()\n", lineno);
                    405:        exit(1);
                    406:       }
                    407:       if (*p++ != ')') {
                    408:        fprintf(stderr, "%d: unknown qualifier for n()\n", lineno);
                    409:        exit(1);
                    410:       }
                    411:       break;
                    412:     case '#':
                    413:       switch(*p++) {
                    414:       case 'B': stype = dt_ImmB; break;
                    415:       case 'W': stype = dt_ImmW; break;
                    416:       case 'L': stype = dt_ImmL; break;
                    417:       case 'z': expand_s_immsize = 1; break;
                    418:       case 's':
                    419:        if (num[biti] != 8) {
                    420:          fprintf(stderr, "%d: sign extend not from 8 bits\n", lineno);
                    421:          exit(1);
                    422:        }
                    423:        stype = dt_Imm8s;
                    424:        break;
                    425:       case 'i':
                    426:        switch (num[biti]) {
                    427:        case 3: stype = dt_Imm3; break;
                    428:        case 4: stype = dt_Imm4; break;
                    429:        case 8: stype = dt_Imm8; break;
                    430:        default:
                    431:          fprintf(stderr, "%d: unknown immediate data size or bad dimension\n",
                    432:                lineno);
                    433:          exit(1);
                    434:        }
                    435:        sbitpos = start[biti]; 
                    436:        break;
                    437:       case 'I':
                    438:        imm_notzero = 1;
                    439:        switch (num[biti]) {
                    440:        case 3: stype = dt_Imm3; break;
                    441:        case 4: stype = dt_Imm4; break;
                    442:        case 8: stype = dt_Imm8; break;
                    443:        default:
                    444:          fprintf(stderr, "%d: unknown immediate data size or bad dimension\n",
                    445:                lineno);
                    446:          exit(1);
                    447:        }
                    448:        sbitpos = start[biti]; 
                    449:        break;
                    450:       case 'V':
                    451:        stype = dt_ImmV;
                    452:        sbitpos = start[bitv]; 
                    453:        break;
                    454:       default:
                    455:        p--;
                    456:        if (isdigit((int)*p)) {
                    457:          immvalue = strtol(p, &p, 10);
                    458:          stype = dt_ImmS;
                    459:        } else {
                    460:          fprintf(stderr, "%d: unknown source immediate type #%c\n",
                    461:                  lineno, *(p-1));
                    462:          exit(1);
                    463:        }
                    464:       }
                    465:       break;
                    466:     case 'e':
                    467:       expand_s_ea_e = 1;
                    468: 
                    469:       if (*p++ != '(') {
                    470:        fprintf(stderr, "%d: missing qualifier for EA\n", lineno);
                    471:        exit(1);
                    472:       }
                    473:       do {
                    474:        setting = 1;
                    475:        if (*p == '-') {
                    476:          p++;
                    477:          setting = 0;
                    478:        }
                    479:        if (!strncmp(p, "*", 1)) {
                    480:          e[ea_Dreg] = e[ea_Areg] = e[ea_Aind] = e[ea_Ainc] = setting;
                    481:          e[ea_Adec] = e[ea_Adis] = e[ea_Aidx] = e[ea_AbsW] = setting;
                    482:          e[ea_AbsL] = e[ea_Pdis] = e[ea_Pidx] = e[ea_Imm] = setting;
                    483:          p = p+1;
                    484:        } else if (!strncmp(p, "Regs", 4)) {
                    485:          e[ea_Dreg] = e[ea_Areg] = setting;
                    486:          p = p+4;
                    487:        } else if (!strncmp(p, "PC", 2)) {
                    488:          e[ea_Pdis] = e[ea_Pidx] = setting;
                    489:          p = p+2;
                    490:        } else if (!strncmp(p, "Amod", 4)) {
                    491:          e[ea_Ainc] = e[ea_Adec] = setting;
                    492:          p = p+4;
                    493:        } else if (!strncmp(p, "Dreg", 4)) { e[ea_Dreg] = setting; p = p+4;
                    494:        } else if (!strncmp(p, "Areg", 4)) { e[ea_Areg] = setting; p = p+4;
                    495:        } else if (!strncmp(p, "Aind", 4)) { e[ea_Aind] = setting; p = p+4;
                    496:        } else if (!strncmp(p, "Ainc", 4)) { e[ea_Ainc] = setting; p = p+4;
                    497:        } else if (!strncmp(p, "Adec", 4)) { e[ea_Adec] = setting; p = p+4;
                    498:        } else if (!strncmp(p, "Adis", 4)) { e[ea_Adis] = setting; p = p+4;
                    499:        } else if (!strncmp(p, "Aidx", 4)) { e[ea_Aidx] = setting; p = p+4;
                    500:        } else if (!strncmp(p, "AbsW", 4)) { e[ea_AbsW] = setting; p = p+4;
                    501:        } else if (!strncmp(p, "AbsL", 4)) { e[ea_AbsL] = setting; p = p+4;
                    502:        } else if (!strncmp(p, "Pdis", 4)) { e[ea_Pdis] = setting; p = p+4;
                    503:        } else if (!strncmp(p, "Pidx", 4)) { e[ea_Pidx] = setting; p = p+4;
                    504:        } else if (!strncmp(p, "Imm", 3))  { e[ea_Imm]  = setting; p = p+3;
                    505:        } else {
                    506:          fprintf(stderr, "%d: unknown qualifier for EA\n", lineno);
                    507:          exit(1);
                    508:        }
                    509:       } while (*p++ == ',');
                    510:       if (*(p-1) != ')') {
                    511:        fprintf(stderr, "%d: unknown qualifier for EA\n", lineno);
                    512:        exit(1);
                    513:       }
                    514:       break;
                    515:     default:
                    516:       fprintf(stderr, "%d: did not understand source operand\n", lineno);
                    517:       exit(1);
                    518:     }
                    519:     if (*p == ',') {
                    520:       /* there is a destination part */
                    521:       p++;
                    522:       switch(*p++) {
                    523:       case 'n':
                    524:       case 'N':
                    525:        if (*(p-1) == 'n') {
                    526:          dbitpos = start[bitn];
                    527:        } else {
                    528:          dbitpos = start[bitN];
                    529:        }
                    530:        if (*p++ != '(') {
                    531:          fprintf(stderr, "%d: missing qualifier for n()\n", lineno);
                    532:          exit(1);
                    533:        }
                    534:        if (!strncmp(p, "Dreg", 4)) { dtype = dt_Dreg; p = p+4;
                    535:        } else if (!strncmp(p, "Areg", 4)) { dtype = dt_Areg; p = p+4;
                    536:        } else if (!strncmp(p, "Aind", 4)) { dtype = dt_Aind; p = p+4;
                    537:        } else if (!strncmp(p, "Ainc", 4)) { dtype = dt_Ainc; p = p+4;
                    538:        } else if (!strncmp(p, "Adec", 4)) { dtype = dt_Adec; p = p+4;
                    539:        } else if (!strncmp(p, "Adis", 4)) { dtype = dt_Adis; p = p+4;
                    540:        } else if (!strncmp(p, "Aidx", 4)) { dtype = dt_Aidx; p = p+4;
                    541:        } else if (!strncmp(p, "AbsW", 4)) { dtype = dt_AbsW; p = p+4;
                    542:        } else if (!strncmp(p, "AbsL", 4)) { dtype = dt_AbsL; p = p+4;
                    543:        } else if (!strncmp(p, "Pdis", 4)) { dtype = dt_Pdis; p = p+4;
                    544:        } else if (!strncmp(p, "Pidx", 4)) { dtype = dt_Pidx; p = p+4;
                    545:        } else {
                    546:          fprintf(stderr, "%d: unknown qualifier for n()\n", lineno);
                    547:          exit(1);
                    548:        }
                    549:        if (*p++ != ')') {
                    550:          fprintf(stderr, "%d: unknown qualifier for n()\n", lineno);
                    551:          exit(1);
                    552:        }
                    553:        break;
                    554:       case 'e':
                    555:        expand_d_ea_e = 1;
                    556: 
                    557:        if (*p++ != '(') {
                    558:          fprintf(stderr, "%d: missing qualifier for EA\n", lineno);
                    559:          exit(1);
                    560:        }
                    561:        do {
                    562:          setting = 1;
                    563:          if (*p == '-') {
                    564:            p++;
                    565:            setting = 0;
                    566:          }
                    567:          if (!strncmp(p, "*", 1)) {
                    568:            e[ea_Dreg] = e[ea_Areg] = e[ea_Aind] = e[ea_Ainc] = setting;
                    569:            e[ea_Adec] = e[ea_Adis] = e[ea_Aidx] = e[ea_AbsW] = setting;
                    570:            e[ea_AbsL] = e[ea_Pdis] = e[ea_Pidx] = e[ea_Imm] = setting;
                    571:            p = p+1;
                    572:          } else if (!strncmp(p, "Regs", 4)) {
                    573:            e[ea_Dreg] = e[ea_Areg] = setting;
                    574:            p = p+4;
                    575:          } else if (!strncmp(p, "PC", 2)) {
                    576:            e[ea_Pdis] = e[ea_Pidx] = setting;
                    577:            p = p+2;
                    578:          } else if (!strncmp(p, "Amod", 4)) {
                    579:            e[ea_Ainc] = e[ea_Adec] = setting;
                    580:            p = p+4;
                    581:          } else if (!strncmp(p, "Dreg", 4)) { e[ea_Dreg] = setting; p = p+4;
                    582:          } else if (!strncmp(p, "Areg", 4)) { e[ea_Areg] = setting; p = p+4;
                    583:          } else if (!strncmp(p, "Aind", 4)) { e[ea_Aind] = setting; p = p+4;
                    584:          } else if (!strncmp(p, "Ainc", 4)) { e[ea_Ainc] = setting; p = p+4;
                    585:          } else if (!strncmp(p, "Adec", 4)) { e[ea_Adec] = setting; p = p+4;
                    586:          } else if (!strncmp(p, "Adis", 4)) { e[ea_Adis] = setting; p = p+4;
                    587:          } else if (!strncmp(p, "Aidx", 4)) { e[ea_Aidx] = setting; p = p+4;
                    588:          } else if (!strncmp(p, "AbsW", 4)) { e[ea_AbsW] = setting; p = p+4;
                    589:          } else if (!strncmp(p, "AbsL", 4)) { e[ea_AbsL] = setting; p = p+4;
                    590:          } else if (!strncmp(p, "Pdis", 4)) { e[ea_Pdis] = setting; p = p+4;
                    591:          } else if (!strncmp(p, "Pidx", 4)) { e[ea_Pidx] = setting; p = p+4;
                    592:          } else if (!strncmp(p, "Imm", 3))  { e[ea_Imm]  = setting; p = p+3;
                    593:          } else {
                    594:            fprintf(stderr, "%d: unknown qualifier for EA\n", lineno);
                    595:            exit(1);
                    596:          }
                    597:        } while (*p++ == ',');
                    598:        if (*(p-1) != ')') {
                    599:          fprintf(stderr, "%d: unknown qualifier for EA\n", lineno);
                    600:          exit(1);
                    601:        }
                    602:        break;
                    603:       case 'f':
                    604:        expand_d_ea_f = 1;
                    605: 
                    606:        if (*p++ != '(') {
                    607:          fprintf(stderr, "%d: missing qualifier for EA\n", lineno);
                    608:          exit(1);
                    609:        }
                    610:        do {
                    611:          setting = 1;
                    612:          if (*p == '-') {
                    613:            p++;
                    614:            setting = 0;
                    615:          }
                    616:          if (!strncmp(p, "*", 1)) {
                    617:            f[ea_Dreg] = f[ea_Areg] = f[ea_Aind] = f[ea_Ainc] = setting;
                    618:            f[ea_Adec] = f[ea_Adis] = f[ea_Aidx] = f[ea_AbsW] = setting;
                    619:            f[ea_AbsL] = f[ea_Pdis] = f[ea_Pidx] = f[ea_Imm] = setting;
                    620:            p = p+1;
                    621:          } else if (!strncmp(p, "Regs", 4)) {
                    622:            f[ea_Dreg] = f[ea_Areg] = setting;
                    623:            p = p+4;
                    624:          } else if (!strncmp(p, "PC", 2)) {
                    625:            f[ea_Pdis] = f[ea_Pidx] = setting;
                    626:            p = p+2;
                    627:          } else if (!strncmp(p, "Amod", 4)) {
                    628:            f[ea_Ainc] = f[ea_Adec] = setting;
                    629:            p = p+4;
                    630:          } else if (!strncmp(p, "Dreg", 4)) { f[ea_Dreg] = setting; p = p+4;
                    631:          } else if (!strncmp(p, "Areg", 4)) { f[ea_Areg] = setting; p = p+4;
                    632:          } else if (!strncmp(p, "Aind", 4)) { f[ea_Aind] = setting; p = p+4;
                    633:          } else if (!strncmp(p, "Ainc", 4)) { f[ea_Ainc] = setting; p = p+4;
                    634:          } else if (!strncmp(p, "Adec", 4)) { f[ea_Adec] = setting; p = p+4;
                    635:          } else if (!strncmp(p, "Adis", 4)) { f[ea_Adis] = setting; p = p+4;
                    636:          } else if (!strncmp(p, "Aidx", 4)) { f[ea_Aidx] = setting; p = p+4;
                    637:          } else if (!strncmp(p, "AbsW", 4)) { f[ea_AbsW] = setting; p = p+4;
                    638:          } else if (!strncmp(p, "AbsL", 4)) { f[ea_AbsL] = setting; p = p+4;
                    639:          } else if (!strncmp(p, "Pdis", 4)) { f[ea_Pdis] = setting; p = p+4;
                    640:          } else if (!strncmp(p, "Pidx", 4)) { f[ea_Pidx] = setting; p = p+4;
                    641:          } else if (!strncmp(p, "Imm", 3))  { f[ea_Imm]  = setting; p = p+3;
                    642:          } else {
                    643:            fprintf(stderr, "%d: unknown qualifier for EA\n", lineno);
                    644:            exit(1);
                    645:          }
                    646:        } while (*p++ == ',');
                    647:        if (*(p-1) != ')') {
                    648:          fprintf(stderr, "%d: unknown qualifier for EA\n", lineno);
                    649:          exit(1);
                    650:        }
                    651:        break;
                    652:       default:
                    653:        fprintf(stderr, "%d: did not understand dest operand\n", lineno);
                    654:        exit(1);
                    655:       }
                    656:     }
                    657:   }
                    658:   if (*p != '\0') {
                    659:     fprintf(stderr, "%d: no end-of-line found at end of line\n", lineno);
                    660:     exit(1);
                    661:   }
                    662: 
                    663:   /* checks */
                    664: 
                    665:   if (expand_d_ea_e) {
                    666:     if (e[ea_Imm]) {
                    667:       fprintf(stderr, "%d: Immediate data not allowed as dest\n", lineno);
                    668:       exit(1);
                    669:     }
                    670:   } 
                    671: 
                    672:   if (expand_d_ea_f) {
                    673:     if (f[ea_Imm]) {
                    674:       fprintf(stderr, "%d: Immediate data not allowed as dest\n", lineno);
                    675:       exit(1);
                    676:     }
                    677:   } 
                    678: 
                    679:   if ((num[bite] && !num[bitE]) || (num[bitE] && !num[bite])) {
                    680:     fprintf(stderr, "%d: There must be both eee and EEE\n", lineno);
                    681:     exit(1);
                    682:   }
                    683: 
                    684:   if ((num[bitf] && !num[bitF]) || (num[bitF] && !num[bitf])) {
                    685:     fprintf(stderr, "%d: There must be both fff and FFF\n", lineno);
                    686:     exit(1);
                    687:   }
                    688: 
                    689:   if (num[bitf] && !expand_d_ea_f) {
                    690:     fprintf(stderr, "%d: EA 'f' found but not used in description!\n", lineno);
                    691:     exit(1);
                    692:   }
                    693: 
                    694:   if (num[bite] && expand_d_ea_e && expand_s_ea_e) {
                    695:     fprintf(stderr, "%d: EA used as both source and destination!\n", lineno);
                    696:     exit(1);
                    697:   }
                    698: 
                    699:   /* ok, now write to the output a structure for each line we're going to
                    700:      do a CPU emulation routine for - this means we will expand anything
                    701:      that might require control flow statements, e.g. EA and size bit
                    702:      sections but not registers and immediate data that can be done in a
                    703:      single instruction-wide '&' (and) statement. */
                    704: 
                    705:   /* convert size/EA bits to static */
                    706: 
                    707:   {
                    708:     t_size size;
                    709:     t_datatype ea_e;
                    710:     t_datatype ea_f;
                    711:     int skip;
                    712:     int cc;
                    713:     int wordlen, type;
                    714: 
                    715:     /* loop through 3 different sizes or just once if no size to loop on */
                    716: 
                    717:     for (size = isize;
                    718:         (size == isize) || (num[bitz] && (size <= sz_long)); size++) {
                    719: 
                    720:       /* loop through 'e' EA or just once if no EA 'e' to loop on */
                    721: 
                    722:       for (ea_e = ea_Dreg;
                    723:           (ea_e == ea_Dreg) || (num[bite] && (ea_e <= ea_Imm)); ea_e++) {
                    724: 
                    725:        /* loop through 'f' EA or just once if no EA 'e' to loop on */
                    726: 
                    727:        for (ea_f = ea_Dreg;
                    728:             (ea_f == ea_Dreg) || (num[bitf] && (ea_f <= ea_Imm)); ea_f++) {
                    729: 
                    730:          for (cc = 0; (cc == 0) || (num[bitc] && (cc < 16)); cc++) {
                    731: 
                    732:            if (cc == 1)
                    733:              continue;
                    734: 
                    735:            if ((size == sz_none) && num[bitz])
                    736:              continue;
                    737: 
                    738:            /* deal with size */
                    739: 
                    740:            if (num[bitz]) {
                    741:              /* set mask where zz is */
                    742:              mask |= (3<<start[bitz]);
                    743:              /* clear bits where zz is */
                    744:              bits &= ~(3<<start[bitz]);
                    745:              /* set correct value into where zz is */
                    746:              switch (size) {
                    747:              case sz_byte: break;
                    748:              case sz_word: bits |= (1<<start[bitz]); break;
                    749:              case sz_long: bits |= (2<<start[bitz]); break;
                    750:              default:
                    751:                printf("%d: Invalid size\n", lineno);
                    752:                continue;
                    753:              }
                    754:              if (expand_s_immsize) {
                    755:                /* source immediate data depends on size of instruction */
                    756:                switch (size) {
                    757:                case sz_byte: stype = dt_ImmB; break;
                    758:                case sz_word: stype = dt_ImmW; break;
                    759:                case sz_long: stype = dt_ImmL; break;
                    760:                default:
                    761:                  printf("%d: Invalid size\n", lineno);
                    762:                  exit(1);
                    763:                }
                    764:              }
                    765:            }
                    766: 
                    767:            /* deal with cc */
                    768: 
                    769:            if (num[bitc]) {
                    770:              /* set mask where cccc is */
                    771:              mask |= (15<<start[bitc]);
                    772:              /* clear bits where cccc is */
                    773:              bits &= ~(15<<start[bitc]);
                    774:              /* set correct value into where cccc is */
                    775:              bits |= cc<<start[bitc];
                    776:            }
                    777:            
                    778:            /* deal with EA 'e' when used as source */
                    779:            
                    780:            if (num[bite] && expand_s_ea_e) {
                    781:              if (!e[ea_e]) {
                    782:                /* this has been disabled using -Axyz */
                    783:                continue;
                    784:              }
                    785:              /* clear everything */
                    786:              mask |= (7<<start[bite]);  /* set mask for eee */
                    787:              mask &= ~(7<<start[bitE]); /* clear mask for EEE */
                    788:              bits &= ~(7<<start[bite]); /* clear bits in eee */
                    789:              bits &= ~(7<<start[bitE]); /* clear bits in EEE */
                    790:              if (ea_e <= ea_Aidx) {
                    791:                /* ea mode with register in second part */
                    792:                bits |= (ea_e<<start[bite]);
                    793:                switch (ea_e) {
                    794:                case ea_Dreg: stype = dt_Dreg; sbitpos = start[bitE]; break;
                    795:                case ea_Areg: stype = dt_Areg; sbitpos = start[bitE]; break;
                    796:                case ea_Aind: stype = dt_Aind; sbitpos = start[bitE]; break;
                    797:                case ea_Ainc: stype = dt_Ainc; sbitpos = start[bitE]; break;
                    798:                case ea_Adec: stype = dt_Adec; sbitpos = start[bitE]; break;
                    799:                case ea_Adis: stype = dt_Adis; sbitpos = start[bitE]; break;
                    800:                case ea_Aidx: stype = dt_Aidx; sbitpos = start[bitE]; break;
                    801:                default: abort();
                    802:                }
                    803:              } else {
                    804:                bits |= (7<<start[bite]); /* eee should be 111 */
                    805:                mask |= (7<<start[bitE]);
                    806:                switch (ea_e) {
                    807:                case ea_AbsW: stype = dt_AbsW; bits |= (0<<start[bitE]); break;
                    808:                case ea_AbsL: stype = dt_AbsL; bits |= (1<<start[bitE]); break;
                    809:                case ea_Pdis: stype = dt_Pdis; bits |= (2<<start[bitE]); break;
                    810:                case ea_Pidx: stype = dt_Pidx; bits |= (3<<start[bitE]); break;
                    811:                case ea_Imm:
                    812:                  bits |= (4<<start[bitE]);
                    813:                  switch (size) {
                    814:                  case sz_byte: stype = dt_ImmB; break;
                    815:                  case sz_word: stype = dt_ImmW; break;
                    816:                  case sz_long: stype = dt_ImmL; break;
                    817:                  default:
                    818:                    printf("%d: Invalid size\n", lineno);
                    819:                    exit(1);
                    820:                  }
                    821:                  break;
                    822:                default: abort();
                    823:                }
                    824:              }
                    825:            }
                    826:            
                    827:            /* deal with EA 'e' when used as destination */
                    828:            
                    829:            if (num[bite] && expand_d_ea_e) {
                    830:              if (!e[ea_e]) {
                    831:                /* this has been disabled using -Axyz */
                    832:                continue;
                    833:              }
                    834:              /* clear everything */
                    835:              mask |= (7<<start[bite]);  /* set mask for eee */
                    836:              mask &= ~(7<<start[bitE]); /* clear mask for EEE */
                    837:              bits &= ~(7<<start[bite]); /* clear bits in eee */
                    838:              bits &= ~(7<<start[bitE]); /* clear bits in EEE */
                    839:              if (ea_e <= ea_Aidx) {
                    840:                /* ea mode with register in second part */
                    841:                bits |= (ea_e<<start[bite]);
                    842:                switch (ea_e) {
                    843:                case ea_Dreg: dtype = dt_Dreg; dbitpos = start[bitE]; break;
                    844:                case ea_Areg: dtype = dt_Areg; dbitpos = start[bitE]; break;
                    845:                case ea_Aind: dtype = dt_Aind; dbitpos = start[bitE]; break;
                    846:                case ea_Ainc: dtype = dt_Ainc; dbitpos = start[bitE]; break;
                    847:                case ea_Adec: dtype = dt_Adec; dbitpos = start[bitE]; break;
                    848:                case ea_Adis: dtype = dt_Adis; dbitpos = start[bitE]; break;
                    849:                case ea_Aidx: dtype = dt_Aidx; dbitpos = start[bitE]; break;
                    850:                default: abort();
                    851:                }
                    852:              } else {
                    853:                bits |= (7<<start[bite]); /* eee should be 111 */
                    854:                mask |= (7<<start[bitE]);
                    855:                switch (ea_e) {
                    856:                case ea_AbsW: dtype = dt_AbsW; bits |= (0<<start[bitE]); break;
                    857:                case ea_AbsL: dtype = dt_AbsL; bits |= (1<<start[bitE]); break;
                    858:                case ea_Pdis: dtype = dt_Pdis; bits |= (2<<start[bitE]); break;
                    859:                case ea_Pidx: dtype = dt_Pidx; bits |= (3<<start[bitE]); break;
                    860:                case ea_Imm:
                    861:                  bits |= (4<<start[bitE]);
                    862:                  switch (size) {
                    863:                  case sz_byte: dtype = dt_ImmB; break;
                    864:                  case sz_word: dtype = dt_ImmW; break;
                    865:                  case sz_long: dtype = dt_ImmL; break;
                    866:                  default:
                    867:                    printf("%d: Invalid size\n", lineno);
                    868:                    exit(1);
                    869:                  }
                    870:                  break;
                    871:                default: abort();
                    872:                }
                    873:              }
                    874:            }
                    875:            
                    876:            /* deal with EA 'f' when used as destination */
                    877:            
                    878:            if (num[bitf] && expand_d_ea_f) {
                    879:              if (!f[ea_f]) {
                    880:                /* this has been disabled using -Axyz */
                    881:                continue;
                    882:              }
                    883:              /* clear everything */
                    884:              mask |= (7<<start[bitf]);  /* set mask for fff */
                    885:              mask &= ~(7<<start[bitF]); /* clear mask for FFF */
                    886:              bits &= ~(7<<start[bitf]); /* clear bits in fff */
                    887:              bits &= ~(7<<start[bitF]); /* clear bits in FFF */
                    888:              if (ea_f <= ea_Aidx) {
                    889:                /* ea mode with register in second part */
                    890:                bits |= (ea_f<<start[bitf]);
                    891:                switch (ea_f) {
                    892:                case ea_Dreg: dtype = dt_Dreg; dbitpos = start[bitF]; break;
                    893:                case ea_Areg: dtype = dt_Areg; dbitpos = start[bitF]; break;
                    894:                case ea_Aind: dtype = dt_Aind; dbitpos = start[bitF]; break;
                    895:                case ea_Ainc: dtype = dt_Ainc; dbitpos = start[bitF]; break;
                    896:                case ea_Adec: dtype = dt_Adec; dbitpos = start[bitF]; break;
                    897:                case ea_Adis: dtype = dt_Adis; dbitpos = start[bitF]; break;
                    898:                case ea_Aidx: dtype = dt_Aidx; dbitpos = start[bitF]; break;
                    899:                default: abort();
                    900:                }
                    901:              } else {
                    902:                bits |= (7<<start[bitf]); /* eee should be 111 */
                    903:                mask |= (7<<start[bitF]);
                    904:                switch (ea_f) {
                    905:                case ea_AbsW: dtype = dt_AbsW; bits |= (0<<start[bitF]); break;
                    906:                case ea_AbsL: dtype = dt_AbsL; bits |= (1<<start[bitF]); break;
                    907:                case ea_Pdis: dtype = dt_Pdis; bits |= (2<<start[bitF]); break;
                    908:                case ea_Pidx: dtype = dt_Pidx; bits |= (3<<start[bitF]); break;
                    909:                case ea_Imm:
                    910:                  bits |= (4<<start[bitF]);
                    911:                  switch (size) {
                    912:                  case sz_byte: dtype = dt_ImmB; break;
                    913:                  case sz_word: dtype = dt_ImmW; break;
                    914:                  case sz_long: dtype = dt_ImmL; break;
                    915:                  default:
                    916:                    printf("%d: Invalid size\n", lineno);
                    917:                    exit(1);
                    918:                  }
                    919:                  break;
                    920:                default: abort();
                    921:                }
                    922:              }
                    923:            }
                    924: 
                    925:            wordlen = 1;
                    926:            for (type = 0; type < 2; type++) {
                    927:              switch(type ? stype : dtype) {
                    928:              case dt_Ill:
                    929:              case dt_Dreg:
                    930:              case dt_Areg:
                    931:              case dt_Aind:
                    932:              case dt_Ainc:
                    933:              case dt_Adec:
                    934:                break;
                    935:              case dt_Adis:
                    936:              case dt_Aidx:
                    937:              case dt_AbsW:
                    938:              case dt_Pdis:
                    939:              case dt_Pidx:
                    940:              case dt_ImmB:
                    941:              case dt_ImmW:
                    942:                wordlen++;
                    943:                break;
                    944:              case dt_AbsL:
                    945:              case dt_ImmL:
                    946:                wordlen+= 2;
                    947:                break;
                    948:              case dt_ImmS:
                    949:              case dt_Imm3:
                    950:              case dt_Imm4:
                    951:              case dt_Imm8:
                    952:              case dt_Imm8s:
                    953:              case dt_ImmV:
                    954:                break;
                    955:              default:
                    956:                printf("%d: Invalid type\n", lineno);
                    957:                exit(1);
                    958:              }
                    959:            }
                    960: 
                    961:            clocks = -1;
                    962: 
                    963:            switch(mnemonic_num) {
                    964:            case i_OR:
                    965:            case i_AND:
                    966:            case i_EOR:
                    967:              clocks = 4;
                    968:              clocks+= clocks_eacalc(stype, size);
                    969:              clocks+= clocks_eafetch(stype, size);
                    970:              clocks+= clocks_eacalc(dtype, size);
                    971:              clocks+= clocks_eafetch(dtype, size);
                    972:              clocks+= clocks_standard(stype, dtype, size);
                    973:              break;
                    974:            case i_ORSR:
                    975:            case i_ANDSR:
                    976:            case i_EORSR:
                    977:              clocks = 20;
                    978:              break;
                    979:            case i_SUB:
                    980:            case i_SUBA:
                    981:            case i_ADD:
                    982:            case i_ADDA:
                    983:              clocks = 4;
                    984:              clocks+= clocks_eacalc(stype, size);
                    985:              clocks+= clocks_eafetch(stype, size);
                    986:              clocks+= clocks_eacalc(dtype, size);
                    987:              clocks+= clocks_eafetch(dtype, size);
                    988:              clocks+= clocks_standard(stype, dtype, size);
                    989:              break;
                    990:            case i_SUBX:
                    991:            case i_ADDX:
                    992:              if (stype == dt_Dreg) {
                    993:                if (size != sz_long) {
                    994:                  clocks = 4;
                    995:                } else {
                    996:                  clocks = 8;
                    997:                }
                    998:              } else {
                    999:                if (size != sz_long) {
                   1000:                  clocks = 18;
                   1001:                } else {
                   1002:                  clocks = 30;
                   1003:                }
                   1004:              }
                   1005:              break;
                   1006:            case i_MULU:
                   1007:            case i_MULS:
                   1008:              clocks = 54;
                   1009:              clocks+= clocks_eacalc(stype, size);
                   1010:              clocks+= clocks_eafetch(stype, size);
                   1011:              break;
                   1012:            case i_CMP:
                   1013:            case i_CMPA:
                   1014:              if (dtype == dt_Areg) {
                   1015:                clocks = 6;
                   1016:              } else {
                   1017:                if (size != sz_long) {
                   1018:                  clocks = 4;
                   1019:                } else {
                   1020:                  clocks = 6;
                   1021:                }
                   1022:              }
                   1023:              clocks+= clocks_eacalc(stype, size);
                   1024:              clocks+= clocks_eafetch(stype, size);
                   1025:              break;
                   1026:            case i_BTST:
                   1027:              if (stype == dt_Dreg) {
                   1028:                /* dynamic */
                   1029:                if (dtype == dt_Dreg) {
                   1030:                  clocks = 6;
                   1031:                } else {
                   1032:                  clocks = 4;
                   1033:                }
                   1034:              } else {
                   1035:                /* static */
                   1036:                if (dtype == dt_Dreg) {
                   1037:                  clocks = 10;
                   1038:                } else {
                   1039:                  clocks = 8;
                   1040:                }
                   1041:              }
                   1042:              clocks+= clocks_eacalc(dtype, size);
                   1043:              clocks+= clocks_eafetch(dtype, size);
                   1044:              break;
                   1045:            case i_BCHG:
                   1046:            case i_BSET:
                   1047:              if (stype == dt_Dreg) {
                   1048:                /* dynamic */
                   1049:                clocks = 8;
                   1050:              } else {
                   1051:                /* static */
                   1052:                clocks = 12;
                   1053:              }
                   1054:              clocks+= clocks_eacalc(dtype, size);
                   1055:              clocks+= clocks_eafetch(dtype, size);
                   1056:              break;
                   1057:            case i_BCLR:
                   1058:              if (stype == dt_Dreg) {
                   1059:                /* dynamic */
                   1060:                if (dtype == dt_Dreg) {
                   1061:                  clocks = 10;
                   1062:                } else {
                   1063:                  clocks = 8;
                   1064:                }
                   1065:              } else {
                   1066:                /* static */
                   1067:                if (dtype == dt_Dreg) {
                   1068:                  clocks = 14;
                   1069:                } else {
                   1070:                  clocks = 12;
                   1071:                }
                   1072:              }
                   1073:              clocks+= clocks_eacalc(dtype, size);
                   1074:              clocks+= clocks_eafetch(dtype, size);
                   1075:              break;
                   1076:            case i_MOVE:
                   1077:            case i_MOVEA:
                   1078:              clocks = 4;
                   1079:              clocks+= clocks_eacalc(stype, size);
                   1080:              clocks+= clocks_eafetch(stype, size);
                   1081:              clocks+= clocks_eacalc(dtype, size);
                   1082:              clocks+= clocks_eafetch(dtype, size);
                   1083:              break;
                   1084:            case i_MOVEPRM:
                   1085:            case i_MOVEPMR:
                   1086:              if (size == sz_long) {
                   1087:                clocks = 24;
                   1088:              } else {
                   1089:                clocks = 16;
                   1090:              }
                   1091:              break;
                   1092:            case i_MOVEFSR:
                   1093:              if (stype == dt_Dreg) {
                   1094:                clocks = 6;
                   1095:              } else {
                   1096:                clocks = 8;
                   1097:              }
                   1098:              clocks+= clocks_eacalc(stype, size);
                   1099:              clocks+= clocks_eafetch(stype, size);
                   1100:              break;
                   1101:            case i_MOVETSR:
                   1102:              clocks = 12;
                   1103:              clocks+= clocks_eacalc(stype, size);
                   1104:              clocks+= clocks_eafetch(stype, size);
                   1105:              break;
                   1106:            case i_MOVEMMR:
                   1107:              clocks = 20;
                   1108:              break;
                   1109:            case i_MOVEMRM:
                   1110:              clocks = 16;
                   1111:              break;
                   1112:            case i_MOVETUSP:
                   1113:            case i_MOVEFUSP:
                   1114:              clocks = 4;
                   1115:            case i_NEG:
                   1116:            case i_NEGX:
                   1117:            case i_CLR:
                   1118:            case i_NOT:
                   1119:              clocks = clocks_single(stype, size);
                   1120:              clocks+= clocks_eacalc(stype, size);
                   1121:              clocks+= clocks_eafetch(stype, size);
                   1122:              break;
                   1123:            case i_ABCD:
                   1124:            case i_SBCD:
                   1125:              if (stype == dt_Dreg) {
                   1126:                clocks = 6;
                   1127:              } else {
                   1128:                clocks = 18;
                   1129:              }
                   1130:              break;
                   1131:            case i_NBCD:
                   1132:              if (stype == dt_Dreg || stype == dt_Areg) {
                   1133:                clocks = 6;
                   1134:              } else {
                   1135:                clocks = 8;
                   1136:                clocks+= clocks_eacalc(stype, size);
                   1137:                clocks+= clocks_eafetch(stype, size);
                   1138:              }
                   1139:              break;
                   1140:            case i_SWAP:
                   1141:              clocks = 4;
                   1142:              break;
                   1143:            case i_PEA:
                   1144:              clocks = 8;
                   1145:              clocks+= clocks_eacalc(stype, size);
                   1146:              clocks+= clocks_eafetch(stype, size);
                   1147:              break;
                   1148:            case i_LEA:
                   1149:              clocks = 4;
                   1150:              clocks+= clocks_eacalc(stype, size);
                   1151:              break;
                   1152:            case i_EXT:
                   1153:              clocks = 4;
                   1154:              break;
                   1155:            case i_EXG:
                   1156:              clocks = 6;
                   1157:              break;
                   1158:            case i_TST:
                   1159:              clocks = 4;
                   1160:              clocks+= clocks_eacalc(stype, size);
                   1161:              clocks+= clocks_eafetch(stype, size);
                   1162:              break;
                   1163:            case i_TAS:
                   1164:              if (stype == dt_Dreg || stype == dt_Areg) {
                   1165:                clocks = 4;
                   1166:              } else {
                   1167:                clocks = 10;
                   1168:              }
                   1169:              break;
                   1170:            case i_CHK:
                   1171:              clocks = 10;
                   1172:              clocks+= clocks_eacalc(stype, size);
                   1173:              clocks+= clocks_eafetch(stype, size);
                   1174:              break;
                   1175:            case i_TRAPV:
                   1176:              clocks = 4;
                   1177:              break;
                   1178:            case i_TRAP:
                   1179:              clocks = 4; /* exception */
                   1180:              break;
                   1181:            case i_RESET:
                   1182:              clocks = 132;
                   1183:              break;
                   1184:            case i_NOP:
                   1185:              clocks = 4;
                   1186:              break;
                   1187:            case i_STOP:
                   1188:              clocks = 4;
                   1189:              break;
                   1190:            case i_LINK:
                   1191:              clocks = 16;
                   1192:              break;
                   1193:            case i_UNLK:
                   1194:              clocks = 12;
                   1195:              break;
                   1196:            case i_RTE:
                   1197:              clocks = 20;
                   1198:              break;
                   1199:            case i_RTS:
                   1200:              clocks = 16;
                   1201:              break;
                   1202:            case i_RTR:
                   1203:              clocks = 20;
                   1204:              break;
                   1205:            case i_JSR:
                   1206:              clocks = 16;
                   1207:              clocks+= clocks_eacalc(stype, size);
                   1208:              break;
                   1209:            case i_JMP:
                   1210:              clocks = 8;
                   1211:              clocks+= clocks_eacalc(stype, size);
                   1212:              break;
                   1213:            case i_Scc:
                   1214:              if (stype == dt_Dreg || stype == dt_Areg) {
                   1215:                clocks = 4;
                   1216:              } else {
                   1217:                clocks = 8;
                   1218:                clocks+= clocks_eacalc(stype, size);
                   1219:                clocks+= clocks_eafetch(stype, size);
                   1220:              }
                   1221:              break;
                   1222:            case i_SF:
                   1223:              if (stype == dt_Dreg || stype == dt_Areg) {
                   1224:                clocks = 4;
                   1225:              } else {
                   1226:                clocks = 8;
                   1227:                clocks+= clocks_eacalc(stype, size);
                   1228:                clocks+= clocks_eafetch(stype, size);
                   1229:              }
                   1230:              break;
                   1231:            case i_DBcc:
                   1232:            case i_DBRA:
                   1233:              clocks = 10;
                   1234:              break;
                   1235:            case i_Bcc:
                   1236:              if (size == sz_byte) {
                   1237:                clocks = 8;
                   1238:              } else {
                   1239:                clocks = 10;
                   1240:              }
                   1241:              break;
                   1242:            case i_BSR:
                   1243:              clocks = 18;
                   1244:              break;
                   1245:            case i_DIVU:
                   1246:              clocks = 140;
                   1247:              clocks+= clocks_eacalc(stype, size);
                   1248:              clocks+= clocks_eafetch(stype, size);
                   1249:              break;
                   1250:            case i_DIVS:
                   1251:              clocks = 128;
                   1252:              clocks+= clocks_eacalc(stype, size);
                   1253:              clocks+= clocks_eafetch(stype, size);
                   1254:              break;
                   1255:            case i_ASR:
                   1256:            case i_LSR:
                   1257:            case i_ROXR:
                   1258:            case i_ROR:
                   1259:            case i_ASL:
                   1260:            case i_LSL:
                   1261:            case i_ROXL:
                   1262:            case i_ROL:
                   1263:              clocks = 8;
                   1264:              clocks+= clocks_eacalc(dtype, size);
                   1265:              clocks+= clocks_eafetch(dtype, size);
                   1266:              break;
                   1267:            case i_ILLG:
                   1268:              clocks = 0;
                   1269:              break;
                   1270:            case i_LINE10:
                   1271:            case i_LINE15:
                   1272:              clocks = 4; /* exception */
                   1273:              break;
                   1274:            default:
                   1275:              printf("%d: Invalid mnemonic type\n", lineno);
                   1276:              exit(1);
                   1277:            }
                   1278: 
                   1279:            if (clocks == -1) {
                   1280:              printf("%d: Clocks not found\n", lineno);
                   1281:              exit(1);
                   1282:            }
                   1283: 
                   1284:            /* write output lines */
                   1285:            
                   1286:            fprintf(outiibs, "  { 0x%x, 0x%x, %d, { %d, %d, %d, %d, %d }, ",
                   1287:                    mask, bits, mnemonic_num, priv, endblk, imm_notzero, used,
                   1288:                    set);
                   1289:            fprintf(outiibs, "%d, %d, %d, %d, %d, %d, %d, %d, %d, %d},\n",
                   1290:                    size, stype, dtype, sbitpos, dbitpos, immvalue,
                   1291:                    cc, total, wordlen, clocks);
                   1292:            fprintf(outiibs, "%60s/* %s */\n", "", mnemonic);
                   1293:            if (set == 0) {
                   1294:              fprintf(outfuncs, "  cpu_op_%ia, /* %s */\n", total, mnemonic);
                   1295:              fprintf(outfuncs, "  cpu_op_%ia, /* %s */\n", total, mnemonic);
                   1296:              fprintf(outproto, "extern void cpu_op_%ia("
                   1297:                      "t_ipc *ipc); /* %s */\n", total, mnemonic);
                   1298:            } else {
                   1299:              fprintf(outfuncs, "  cpu_op_%ia, /* %s - normal */\n", total,
                   1300:                      mnemonic);
                   1301:              fprintf(outfuncs, "  cpu_op_%ib, /* %s - no flags */\n", total,
                   1302:                      mnemonic);
                   1303:              fprintf(outproto, "extern void cpu_op_%ia("
                   1304:                      "t_ipc *ipc); /* %s */\n", total, mnemonic);
                   1305:              fprintf(outproto, "extern void cpu_op_%ib("
                   1306:                      "t_ipc *ipc); /* %s */\n", total, mnemonic);
                   1307:            }
                   1308:            
                   1309:            total++;
                   1310: 
                   1311:          } /* cc */
                   1312:        } /* ea_f */
                   1313:       } /* ea_e */
                   1314:     } /* size */
                   1315:   } /* block */
                   1316: }
                   1317: 
                   1318: int clocks_eacalc(t_datatype type, t_size size)
                   1319: {
                   1320:   switch(type) {
                   1321:   case dt_Dreg:
                   1322:   case dt_Areg:
                   1323:     break;
                   1324:   case dt_Aind:
                   1325:   case dt_Ainc:
                   1326:     break;
                   1327:   case dt_Adec:
                   1328:     return 2;
                   1329:   case dt_Adis:
                   1330:     return 4;
                   1331:   case dt_Aidx:
                   1332:     return 6;
                   1333:   case dt_AbsW:
                   1334:     return 4;
                   1335:   case dt_AbsL:
                   1336:     return 8;
                   1337:   case dt_Pdis:
                   1338:     return 4;
                   1339:   case dt_Pidx:
                   1340:     return 6;
                   1341:   case dt_ImmB:
                   1342:   case dt_ImmW:
                   1343:   case dt_ImmL:
                   1344:     break;
                   1345:   case dt_ImmS:
                   1346:   case dt_Imm3:
                   1347:   case dt_Imm4:
                   1348:   case dt_Imm8:
                   1349:   case dt_Imm8s:
                   1350:   case dt_Ill:
                   1351:     break;
                   1352:   default:
                   1353:     printf("Invalid type for clocks\n");
                   1354:     exit(1);
                   1355:   }
                   1356:   return 0;
                   1357: }
                   1358: 
                   1359: int clocks_eafetch(t_datatype type, t_size size)
                   1360: {
                   1361:   switch(type) {
                   1362:   case dt_Dreg:
                   1363:   case dt_Areg:
                   1364:     break;
                   1365:   case dt_Aind:
                   1366:   case dt_Ainc:
                   1367:   case dt_Adec:
                   1368:   case dt_Adis:
                   1369:   case dt_Aidx:
                   1370:   case dt_AbsW:
                   1371:   case dt_AbsL:
                   1372:   case dt_Pdis:
                   1373:   case dt_Pidx:
                   1374:   case dt_ImmB:
                   1375:   case dt_ImmW:
                   1376:   case dt_ImmL:
                   1377:     if (size == sz_long)
                   1378:       return 8;
                   1379:     else
                   1380:       return 4;
                   1381:     break;
                   1382:   case dt_ImmS:
                   1383:   case dt_Imm3:
                   1384:   case dt_Imm4:
                   1385:   case dt_Imm8:
                   1386:   case dt_Imm8s:
                   1387:   case dt_Ill:
                   1388:     break;
                   1389:   default:
                   1390:     printf("Invalid type for clocks\n");
                   1391:     exit(1);
                   1392:   }
                   1393:   return 0;
                   1394: }
                   1395: 
                   1396: int clocks_standard(t_datatype stype, t_datatype dtype, t_size size)
                   1397: {
                   1398:   int stype_imm = (stype == dt_ImmB) || (stype == dt_ImmW) ||
                   1399:     (stype == dt_ImmL) || (stype == dt_Imm3) || (stype == dt_Imm4) ||
                   1400:     (stype == dt_Imm8) || (stype == dt_Imm8s) || (stype == dt_ImmS);
                   1401: 
                   1402:   if (stype_imm) {
                   1403:     if (dtype == dt_Areg) {
                   1404:       return 4;
                   1405:     } else if (dtype == dt_Dreg) {
                   1406:       if (size != sz_long) {
                   1407:        return 0;
                   1408:       } else {
                   1409:        return 4;
                   1410:       }
                   1411:     } else {
                   1412:       if (size != sz_long) {
                   1413:        return 4;
                   1414:       } else {
                   1415:        return 8;
                   1416:       }
                   1417:     }
                   1418:   }
                   1419: 
                   1420:   if (dtype == dt_Areg) {
                   1421:     if (size != sz_long) {
                   1422:       return 4;
                   1423:     } else {
                   1424:       if (stype == dt_Dreg || stype_imm) {
                   1425:        return 4;
                   1426:       } else {
                   1427:        return 2;
                   1428:       }
                   1429:     }
                   1430:   } else if (dtype == dt_Dreg) {
                   1431:     if (size != sz_long) {
                   1432:       return 0;
                   1433:     } else {
                   1434:       if (stype == dt_Dreg || stype_imm) {
                   1435:        return 4;
                   1436:       } else {
                   1437:        return 2;
                   1438:       }
                   1439:     }
                   1440:   } else if (stype == dt_Dreg) {
                   1441:     if (size != sz_long) {
                   1442:       return 4;
                   1443:     } else {
                   1444:       return 8;
                   1445:     }
                   1446:   } else {
                   1447:     printf("Error %d %d.\n", stype, dtype);
                   1448:     exit(1);
                   1449:   }
                   1450: }
                   1451: 
                   1452: int clocks_single(t_datatype type, t_size size)
                   1453: {
                   1454:   if (type == dt_Dreg || type == dt_Areg) {
                   1455:     if (size != sz_long) {
                   1456:       return 4;
                   1457:     } else {
                   1458:       return 6;
                   1459:     }
                   1460:   } else {
                   1461:     if (size != sz_long) {
                   1462:       return 8;
                   1463:     } else {
                   1464:       return 12;
                   1465:     }
                   1466:   }
                   1467: }

unix.superglobalmegacorp.com

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