Annotation of generator/src/gen68k.c, revision 1.1

1.1     ! root        1: /*****************************************************************************/
        !             2: /*     Generator - Sega Genesis emulation - (c) James Ponder 1997-1998       */
        !             3: /*****************************************************************************/
        !             4: /*                                                                           */
        !             5: /* gen68k.c                                                                  */
        !             6: /*                                                                           */
        !             7: /*****************************************************************************/
        !             8: 
        !             9: #include <stdio.h>
        !            10: 
        !            11: #include "generator.h"
        !            12: 
        !            13: #include "out/def68k-iibs.h"
        !            14: 
        !            15: /* forward references */
        !            16: 
        !            17: void generate(FILE *output, int topnibble);
        !            18: void generate_ea(FILE *o, t_iib *iib, t_type type, int update);
        !            19: void generate_eaval(FILE *o, t_iib *iib, t_type type);
        !            20: void generate_eastore(FILE *o, t_iib *iib, t_type type);
        !            21: void generate_outdata(FILE *o, t_iib *iib, const char *init);
        !            22: void generate_cc(FILE *o, t_iib *iib);
        !            23: void generate_stdflag_n(FILE *o, t_iib *iib);
        !            24: void generate_stdflag_z(FILE *o, t_iib *iib);
        !            25: void generate_clrflag_v(FILE *o, t_iib *iib);
        !            26: void generate_clrflag_c(FILE *o, t_iib *iib);
        !            27: void generate_clrflag_n(FILE *o, t_iib *iib);
        !            28: void generate_setflag_z(FILE *o, t_iib *iib);
        !            29: void generate_subflag_c(FILE *o, t_iib *iib);
        !            30: void generate_subflag_cx(FILE *o, t_iib *iib);
        !            31: void generate_subxflag_cx(FILE *o, t_iib *iib);
        !            32: void generate_subflag_v(FILE *o, t_iib *iib);
        !            33: void generate_cmpaflag_c(FILE *o, t_iib *iib);
        !            34: void generate_cmpaflag_v(FILE *o, t_iib *iib);
        !            35: void generate_addflag_cx(FILE *o, t_iib *iib);
        !            36: void generate_addflag_v(FILE *o, t_iib *iib);
        !            37: void generate_addxflag_cx(FILE *o, t_iib *iib);
        !            38: void generate_stdxflag_z(FILE *o, t_iib *iib);
        !            39: void generate_negflag_cx(FILE *o, t_iib *iib);
        !            40: void generate_negflag_v(FILE *o, t_iib *iib);
        !            41: void generate_negxflag_cx(FILE *o, t_iib *iib);
        !            42: void generate_negxflag_v(FILE *o, t_iib *iib);
        !            43: void generate_bits(FILE *o, t_iib *iib);
        !            44: 
        !            45: /* defines */
        !            46: 
        !            47: #define HEADER "/*****************************************************************************/\n/*     Generator - Sega Genesis emulation - (c) James Ponder 1997-1998       */\n/*****************************************************************************/\n/*                                                                           */\n/* cpu68k-%x.c                                                                */\n/*                                                                           */\n/*****************************************************************************/\n\n"
        !            48: 
        !            49: #define OUT(x) fputs(x,output);
        !            50: 
        !            51: /* program entry routine */
        !            52: 
        !            53: int main(int argc, char *argv[])
        !            54: {
        !            55:   FILE *output;
        !            56:   int i;
        !            57:   char tmp[256];
        !            58: 
        !            59:   printf("Writing C files... ");
        !            60:   fflush(stdout);
        !            61: 
        !            62:   for (i = 0; i < 16; i++) {
        !            63: 
        !            64:     printf("%d. ", i);
        !            65:     fflush(stdout);
        !            66: 
        !            67:     /* make filename */
        !            68:     sprintf(tmp, FNAME_GEN68K_CPU_OUT, i);
        !            69: 
        !            70:     /* open output file */
        !            71:     if ((output = fopen(tmp, "w")) == NULL) {
        !            72:       perror("fopen output");
        !            73:       exit(1);
        !            74:     }
        !            75: 
        !            76:     /* output header */
        !            77:     fprintf(output, HEADER, i);
        !            78:     fprintf(output, "#include \"generator.h\"\n");
        !            79:     fprintf(output, "#include \"cpu68k.h\"\n");
        !            80:     fprintf(output, "#include \"mem68k.h\"\n");
        !            81:     fprintf(output, "#include \"reg68k.h\"\n\n");
        !            82:     fprintf(output, "#include \"cpu68k-inline.h\"\n\n");
        !            83:     fprintf(output, "#include <stdio.h>\n\n");
        !            84: 
        !            85:     generate(output, i);
        !            86: 
        !            87:     /* close output */
        !            88:     if (fclose(output)) {
        !            89:       perror("fclose output");
        !            90:       exit(1);
        !            91:     }
        !            92: 
        !            93:   }
        !            94: 
        !            95:   printf("done.\n");
        !            96:   fflush(stdout);
        !            97: 
        !            98:   /* normal program termination */
        !            99:   return(0);
        !           100: }
        !           101: 
        !           102: void generate(FILE *output, int topnibble)
        !           103: {
        !           104:   t_iib *iib;
        !           105:   int i, flags, pcinc;
        !           106:   int DEBUG_BRANCH = 0;
        !           107:   int DEBUG_SR = 0;
        !           108:   int DEBUG_RTE = 0;
        !           109: 
        !           110:   for (i = 0; i < iibs_num; i++) {
        !           111:     iib = &iibs[i];
        !           112: 
        !           113:     if ((iib->mask & 0xF000) != 0xF000) {
        !           114:       fprintf(stderr, "error: Strange mask %x\n", iib->mask);
        !           115:       exit(1);
        !           116:     }
        !           117:     if (((iib->bits & 0xF000)>>12) != topnibble) {
        !           118:       continue;
        !           119:     }
        !           120: 
        !           121:     for (flags = 0; flags < 2; flags++) {
        !           122: 
        !           123:       if (flags == 1 && iib->flags.set == 0) {
        !           124:        /* there is no non-flags version, functable will already go
        !           125:           straight to the normal version anyway, so lets just skip it */
        !           126:        continue;
        !           127:       }
        !           128: 
        !           129:       fprintf(output, "void cpu_op_%i%s(t_ipc *ipc) /* %s */ {\n",
        !           130:              i, flags ? "b" : "a", mnemonic_table[iib->mnemonic].name);
        !           131:       fprintf(output, "  /* mask %0.4x, bits %0.4x, mnemonic %d, priv %d, ",
        !           132:              iib->mask, iib->bits, iib->mnemonic, iib->flags.priv);
        !           133:       fprintf(output, "endblk %d, imm_notzero %d, used %d",
        !           134:              iib->flags.endblk, iib->flags.imm_notzero, iib->flags.used);
        !           135:       fprintf(output, "     set %d, size %d, stype %d, dtype %d, sbitpos %d, ",
        !           136:              iib->flags.set, iib->size, iib->stype, iib->dtype, iib->sbitpos);
        !           137:       fprintf(output, "dbitpos %d, immvalue %d */\n", iib->dbitpos,
        !           138:              iib->immvalue);
        !           139: 
        !           140:       pcinc = 1;
        !           141: 
        !           142:       switch(iib->mnemonic) {
        !           143: 
        !           144:       case i_OR:
        !           145:       case i_AND:
        !           146:       case i_EOR:
        !           147:        generate_ea(output, iib, tp_src, 1);
        !           148:        generate_eaval(output, iib, tp_src);
        !           149:        generate_ea(output, iib, tp_dst, 1);
        !           150:        generate_eaval(output, iib, tp_dst);
        !           151:        generate_outdata(output, iib, "dstdata");
        !           152:        OUT("\n");
        !           153:        switch(iib->mnemonic) {
        !           154:        case i_OR:
        !           155:          OUT("  outdata|= srcdata;\n");
        !           156:          break;
        !           157:        case i_AND:
        !           158:          OUT("  outdata&= srcdata;\n");
        !           159:          break;
        !           160:        case i_EOR:
        !           161:          OUT("  outdata^= srcdata;\n");
        !           162:          break;
        !           163:        default:
        !           164:          OUT("ERROR\n");
        !           165:          break;
        !           166:        }
        !           167:        generate_eastore(output, iib, tp_dst);
        !           168:        if (flags)
        !           169:          OUT("\n");
        !           170:        if (flags && iib->flags.set & IIB_FLAG_N)
        !           171:          generate_stdflag_n(output, iib);
        !           172:        if (flags && iib->flags.set & IIB_FLAG_Z)
        !           173:          generate_stdflag_z(output, iib);
        !           174:        if (flags && iib->flags.set & IIB_FLAG_V)
        !           175:          generate_clrflag_v(output, iib);
        !           176:        if (flags && iib->flags.set & IIB_FLAG_C)
        !           177:          generate_clrflag_c(output, iib);
        !           178:        break;
        !           179: 
        !           180:       case i_ORSR:
        !           181:       case i_ANDSR:
        !           182:       case i_EORSR:
        !           183:        generate_ea(output, iib, tp_src, 1);
        !           184:        generate_eaval(output, iib, tp_src);
        !           185:        OUT("  unsigned int sr = reg68k_sr.sr_struct.s;\n");
        !           186:        OUT("\n");
        !           187:        if (DEBUG_SR)
        !           188:          fputs("  printf(\"SR: %08X %04X\\n\", PC, reg68k_sr.sr_int);\n",
        !           189:                output);
        !           190:        if (iib->size == sz_word) {
        !           191:          OUT("  if (!SFLAG)\n");
        !           192:          fprintf(output, "    reg68k_vector(V_PRIVILEGE, PC+%d);\n",
        !           193:                  (iib->wordlen)*2);
        !           194:          OUT("\n");
        !           195:        }
        !           196:        switch(iib->mnemonic) {
        !           197:        case i_ORSR:
        !           198:          OUT("  SR|= srcdata;\n");
        !           199:          break;
        !           200:        case i_ANDSR:
        !           201:          if (iib->size == sz_byte) {
        !           202:            OUT("  SR = (SR & 0xFF00) | (SR & srcdata);\n");
        !           203:          } else {
        !           204:            OUT("  SR&= srcdata;\n");
        !           205:          }
        !           206:          break;
        !           207:        case i_EORSR:
        !           208:          OUT("  SR^= srcdata;\n");
        !           209:          break;
        !           210:        default:
        !           211:          OUT("ERROR\n");
        !           212:          break;
        !           213:        }
        !           214:        OUT("  if (sr != (uint8)reg68k_sr.sr_struct.s) {\n");
        !           215:        OUT("    /* mode change, swap SP and A7 */\n");
        !           216:        OUT("    ADDRREG(7)^= SP; SP^= ADDRREG(7); ADDRREG(7)^= SP;\n");
        !           217:        OUT("  }\n");
        !           218:        if (DEBUG_SR)
        !           219:          fputs("  printf(\"SR: %08X %04X\\n\", PC, reg68k_sr.sr_int);\n",
        !           220:                output);
        !           221:        break;
        !           222: 
        !           223:       case i_SUB:
        !           224:        generate_ea(output, iib, tp_src, 1);
        !           225:        generate_eaval(output, iib, tp_src);
        !           226:        generate_ea(output, iib, tp_dst, 1);
        !           227:        generate_eaval(output, iib, tp_dst);
        !           228:        switch (iib->size) {
        !           229:        case sz_byte:
        !           230:          generate_outdata(output, iib, "(sint8)dstdata - (sint8)srcdata");
        !           231:          break;
        !           232:        case sz_word:
        !           233:          generate_outdata(output, iib, "(sint16)dstdata - (sint16)srcdata");
        !           234:          break;
        !           235:        case sz_long:
        !           236:          generate_outdata(output, iib, "(sint32)dstdata - (sint32)srcdata");
        !           237:          break;
        !           238:        default:
        !           239:          OUT("ERROR size\n");
        !           240:          break;
        !           241:        }
        !           242:         OUT("\n");
        !           243:        generate_eastore(output, iib, tp_dst);
        !           244:        if (flags)
        !           245:          OUT("\n");
        !           246:        if (flags && iib->flags.set & IIB_FLAG_V)
        !           247:          generate_subflag_v(output, iib);
        !           248:        if (flags && ((iib->flags.set & IIB_FLAG_C) ||
        !           249:                      (iib->flags.set & IIB_FLAG_X)))
        !           250:          generate_subflag_cx(output, iib);
        !           251:        if (flags && iib->flags.set & IIB_FLAG_N)
        !           252:          generate_stdflag_n(output, iib);
        !           253:        if (flags && iib->flags.set & IIB_FLAG_Z)
        !           254:          generate_stdflag_z(output, iib);
        !           255:        break;
        !           256: 
        !           257:       case i_SUBA:
        !           258:        if (iib->dtype != dt_Areg)
        !           259:          OUT("Error\n");
        !           260:        generate_ea(output, iib, tp_src, 1);
        !           261:        generate_eaval(output, iib, tp_src);
        !           262:        generate_ea(output, iib, tp_dst, 1);
        !           263:         OUT("  uint32 dstdata = ADDRREG(dstreg);\n");
        !           264:        switch (iib->size) {
        !           265:        case sz_byte:
        !           266:          OUT("  uint32 outdata = (sint32)dstdata - (sint8)srcdata;\n");
        !           267:          break;
        !           268:        case sz_word:
        !           269:          OUT("  uint32 outdata = (sint32)dstdata - (sint16)srcdata;\n");
        !           270:          break;
        !           271:        case sz_long:
        !           272:          OUT("  uint32 outdata = (sint32)dstdata - (sint32)srcdata;\n");
        !           273:          break;
        !           274:        default:
        !           275:          OUT("ERROR size\n");
        !           276:          break;
        !           277:        }
        !           278:         OUT("\n");
        !           279:        OUT("  ADDRREG(dstreg) = outdata;\n");
        !           280:        break;
        !           281: 
        !           282:       case i_SUBX:
        !           283:        generate_ea(output, iib, tp_src, 1);
        !           284:        generate_eaval(output, iib, tp_src);
        !           285:        generate_ea(output, iib, tp_dst, 1);
        !           286:        generate_eaval(output, iib, tp_dst);
        !           287:        switch (iib->size) {
        !           288:        case sz_byte:
        !           289:          generate_outdata(output, iib, "(sint8)dstdata - (sint8)srcdata "
        !           290:                           "- XFLAG");
        !           291:          break;
        !           292:        case sz_word:
        !           293:          generate_outdata(output, iib, "(sint16)dstdata - (sint16)srcdata"
        !           294:                           "- XFLAG");
        !           295:          break;
        !           296:        case sz_long:
        !           297:          generate_outdata(output, iib, "(sint32)dstdata - (sint32)srcdata"
        !           298:                           "- XFLAG");
        !           299:          break;
        !           300:        default:
        !           301:          OUT("ERROR size\n");
        !           302:          break;
        !           303:        }
        !           304:        OUT("\n");
        !           305:        generate_eastore(output, iib, tp_dst);
        !           306:        if (flags)
        !           307:          OUT("\n");
        !           308:        if (flags && iib->flags.set & IIB_FLAG_V)
        !           309:          generate_subflag_v(output, iib);
        !           310:        if (flags && ((iib->flags.set & IIB_FLAG_C) ||
        !           311:                      (iib->flags.set & IIB_FLAG_X)))
        !           312:          generate_subxflag_cx(output, iib);
        !           313:        if (flags && iib->flags.set & IIB_FLAG_N)
        !           314:          generate_stdflag_n(output, iib);
        !           315:        if (flags && iib->flags.set & IIB_FLAG_Z)
        !           316:          generate_stdxflag_z(output, iib);
        !           317:        break;
        !           318:        
        !           319:       case i_ADD:
        !           320:        generate_ea(output, iib, tp_src, 1);
        !           321:        generate_eaval(output, iib, tp_src);
        !           322:        generate_ea(output, iib, tp_dst, 1);
        !           323:        generate_eaval(output, iib, tp_dst);
        !           324:        switch (iib->size) {
        !           325:        case sz_byte:
        !           326:          generate_outdata(output, iib, "(sint8)dstdata + (sint8)srcdata");
        !           327:          break;
        !           328:        case sz_word:
        !           329:          generate_outdata(output, iib, "(sint16)dstdata + (sint16)srcdata");
        !           330:          break;
        !           331:        case sz_long:
        !           332:          generate_outdata(output, iib, "(sint32)dstdata + (sint32)srcdata");
        !           333:          break;
        !           334:        default:
        !           335:          OUT("ERROR size\n");
        !           336:          break;
        !           337:        }
        !           338:        OUT("\n");
        !           339:        generate_eastore(output, iib, tp_dst);
        !           340:        if (flags)
        !           341:          OUT("\n");
        !           342:        if (flags && iib->flags.set & IIB_FLAG_V)
        !           343:          generate_addflag_v(output, iib);
        !           344:        if (flags && ((iib->flags.set & IIB_FLAG_C) ||
        !           345:                      (iib->flags.set & IIB_FLAG_X)))
        !           346:          generate_addflag_cx(output, iib);
        !           347:        if (flags && iib->flags.set & IIB_FLAG_N)
        !           348:          generate_stdflag_n(output, iib);
        !           349:        if (flags && iib->flags.set & IIB_FLAG_Z)
        !           350:          generate_stdflag_z(output, iib);
        !           351:        break;
        !           352: 
        !           353:       case i_ADDA:
        !           354:        if (iib->dtype != dt_Areg)
        !           355:          OUT("Error\n");
        !           356:        generate_ea(output, iib, tp_src, 1);
        !           357:        generate_eaval(output, iib, tp_src);
        !           358:        generate_ea(output, iib, tp_dst, 1);
        !           359:         OUT("  uint32 dstdata = ADDRREG(dstreg);\n");
        !           360:        switch (iib->size) {
        !           361:        case sz_byte:
        !           362:          OUT("  uint32 outdata = (sint32)dstdata + (sint8)srcdata;\n");
        !           363:          break;
        !           364:        case sz_word:
        !           365:          OUT("  uint32 outdata = (sint32)dstdata + (sint16)srcdata;\n");
        !           366:          break;
        !           367:        case sz_long:
        !           368:          OUT("  uint32 outdata = (sint32)dstdata + (sint32)srcdata;\n");
        !           369:          break;
        !           370:        default:
        !           371:          OUT("ERROR size\n");
        !           372:          break;
        !           373:        }
        !           374:        OUT("\n");
        !           375:        OUT("  ADDRREG(dstreg) = outdata;\n");
        !           376:        break;
        !           377: 
        !           378:       case i_ADDX:
        !           379:        generate_ea(output, iib, tp_src, 1);
        !           380:        generate_eaval(output, iib, tp_src);
        !           381:        generate_ea(output, iib, tp_dst, 1);
        !           382:        generate_eaval(output, iib, tp_dst);
        !           383:        switch (iib->size) {
        !           384:        case sz_byte:
        !           385:          generate_outdata(output, iib, "(sint8)dstdata + (sint8)srcdata "
        !           386:                           "+ XFLAG");
        !           387:          break;
        !           388:        case sz_word:
        !           389:          generate_outdata(output, iib, "(sint16)dstdata + (sint16)srcdata"
        !           390:                           "+ XFLAG");
        !           391:          break;
        !           392:        case sz_long:
        !           393:          generate_outdata(output, iib, "(sint32)dstdata + (sint32)srcdata"
        !           394:                           "+ XFLAG");
        !           395:          break;
        !           396:        default:
        !           397:          OUT("ERROR size\n");
        !           398:          break;
        !           399:        }
        !           400:         OUT("\n");
        !           401:        generate_eastore(output, iib, tp_dst);
        !           402:        if (flags)
        !           403:          OUT("\n");
        !           404:        if (flags && iib->flags.set & IIB_FLAG_V)
        !           405:          generate_addflag_v(output, iib);
        !           406:        if (flags && ((iib->flags.set & IIB_FLAG_C) ||
        !           407:                      (iib->flags.set & IIB_FLAG_X)))
        !           408:          generate_addxflag_cx(output, iib);
        !           409:        if (flags && iib->flags.set & IIB_FLAG_N)
        !           410:          generate_stdflag_n(output, iib);
        !           411:        if (flags && iib->flags.set & IIB_FLAG_Z)
        !           412:          generate_stdxflag_z(output, iib);
        !           413:        break;
        !           414: 
        !           415:       case i_MULU:
        !           416:        generate_ea(output, iib, tp_src, 1);
        !           417:        generate_eaval(output, iib, tp_src);
        !           418:        generate_ea(output, iib, tp_dst, 1);
        !           419:        generate_eaval(output, iib, tp_dst);
        !           420:        OUT("\n");
        !           421:        OUT("  uint32 outdata = (uint32)srcdata * (uint32)dstdata;\n");
        !           422:        if (iib->dtype != dt_Dreg)
        !           423:          OUT("ERROR dtype\n");
        !           424:        OUT("  DATAREG(dstreg) = outdata;\n");
        !           425:        if (flags)
        !           426:          OUT("\n");
        !           427:        if (flags && iib->flags.set & IIB_FLAG_N)
        !           428:          OUT("  NFLAG = ((sint32)outdata) < 0;\n");
        !           429:        if (flags && iib->flags.set & IIB_FLAG_Z)
        !           430:          generate_stdflag_z(output, iib);
        !           431:        if (flags && iib->flags.set & IIB_FLAG_V)
        !           432:          generate_clrflag_v(output, iib);
        !           433:        if (flags && iib->flags.set & IIB_FLAG_C)
        !           434:          generate_clrflag_c(output, iib);
        !           435:        break;
        !           436: 
        !           437:       case i_MULS:
        !           438:        generate_ea(output, iib, tp_src, 1);
        !           439:        generate_eaval(output, iib, tp_src);
        !           440:        generate_ea(output, iib, tp_dst, 1);
        !           441:        generate_eaval(output, iib, tp_dst);
        !           442:        OUT("\n");
        !           443:        OUT("  uint32 outdata = (sint32)(sint16)srcdata * "
        !           444:                "(sint32)(sint16)dstdata;\n");
        !           445:        if (iib->dtype != dt_Dreg)
        !           446:          OUT("ERROR dtype\n");
        !           447:        OUT("  DATAREG(dstreg) = outdata;\n");
        !           448:        if (flags)
        !           449:          OUT("\n");
        !           450:        if (flags && iib->flags.set & IIB_FLAG_N)
        !           451:          OUT("  NFLAG = ((sint32)outdata) < 0;\n");
        !           452:        if (flags && iib->flags.set & IIB_FLAG_Z)
        !           453:          generate_stdflag_z(output, iib);
        !           454:        if (flags && iib->flags.set & IIB_FLAG_V)
        !           455:          generate_clrflag_v(output, iib);
        !           456:        if (flags && iib->flags.set & IIB_FLAG_C)
        !           457:          generate_clrflag_c(output, iib);
        !           458:        break;
        !           459: 
        !           460:       case i_CMP:
        !           461:        generate_ea(output, iib, tp_src, 1);
        !           462:        generate_eaval(output, iib, tp_src);
        !           463:        generate_ea(output, iib, tp_dst, 1);
        !           464:        generate_eaval(output, iib, tp_dst);
        !           465:        switch (iib->size) {
        !           466:        case sz_byte:
        !           467:          generate_outdata(output, iib, "(sint8)dstdata - (sint8)srcdata");
        !           468:          break;
        !           469:        case sz_word:
        !           470:          generate_outdata(output, iib, "(sint16)dstdata - (sint16)srcdata");
        !           471:          break;
        !           472:        case sz_long:
        !           473:          generate_outdata(output, iib, "(sint32)dstdata - (sint32)srcdata");
        !           474:          break;
        !           475:        default:
        !           476:          OUT("ERROR size\n");
        !           477:          break;
        !           478:        }
        !           479:        if (flags)
        !           480:          OUT("\n");
        !           481:        if (flags && iib->flags.set & IIB_FLAG_V)
        !           482:          generate_subflag_v(output, iib);
        !           483:        if (flags && iib->flags.set & IIB_FLAG_C)
        !           484:          generate_subflag_c(output, iib);
        !           485:        if (flags && iib->flags.set & IIB_FLAG_N)
        !           486:          generate_stdflag_n(output, iib);
        !           487:        if (flags && iib->flags.set & IIB_FLAG_Z)
        !           488:          generate_stdflag_z(output, iib);
        !           489:        break;
        !           490: 
        !           491:       case i_CMPA:
        !           492:        if (iib->dtype != dt_Areg || iib->size != sz_word)
        !           493:          OUT("Error\n");
        !           494:        generate_ea(output, iib, tp_src, 1);
        !           495:        generate_eaval(output, iib, tp_src);
        !           496:        iib->size = sz_long;
        !           497:        generate_ea(output, iib, tp_dst, 1);
        !           498:        generate_eaval(output, iib, tp_dst);
        !           499:         OUT("  uint32 outdata = (sint32)dstdata - (sint32)(sint16)srcdata;\n");
        !           500:        if (flags)
        !           501:          OUT("\n");
        !           502:        if (flags && iib->flags.set & IIB_FLAG_V)
        !           503:          generate_cmpaflag_v(output, iib);
        !           504:        if (flags && iib->flags.set & IIB_FLAG_C)
        !           505:          generate_cmpaflag_c(output, iib);
        !           506:        if (flags && iib->flags.set & IIB_FLAG_N)
        !           507:          generate_stdflag_n(output, iib);
        !           508:        if (flags && iib->flags.set & IIB_FLAG_Z)
        !           509:          generate_stdflag_z(output, iib);
        !           510:        iib->size = sz_word;
        !           511:        break;
        !           512: 
        !           513:       case i_BTST:
        !           514:       case i_BCHG:
        !           515:       case i_BCLR:
        !           516:       case i_BSET:
        !           517:        generate_ea(output, iib, tp_src, 1);
        !           518:        generate_eaval(output, iib, tp_src);
        !           519:        generate_ea(output, iib, tp_dst, 1);
        !           520:        generate_eaval(output, iib, tp_dst);
        !           521:        switch (iib->size) {
        !           522:        case sz_byte:
        !           523:          OUT("  uint32 bitpos = 1<<(srcdata & 7);");
        !           524:          break;
        !           525:        case sz_long:
        !           526:          OUT("  uint32 bitpos = 1<<(srcdata & 31);");
        !           527:          break;
        !           528:        default:
        !           529:          OUT("ERROR size\n");
        !           530:          break;
        !           531:        }
        !           532:        OUT("\n");
        !           533:        switch(iib->mnemonic) {
        !           534:        case i_BTST:
        !           535:          break;
        !           536:        case i_BCHG:
        !           537:          generate_outdata(output, iib, "dstdata ^ bitpos");
        !           538:          generate_eastore(output, iib, tp_dst);
        !           539:          break;
        !           540:        case i_BCLR:
        !           541:          generate_outdata(output, iib, "dstdata & ~bitpos");
        !           542:          generate_eastore(output, iib, tp_dst);
        !           543:          break;
        !           544:        case i_BSET:
        !           545:          generate_outdata(output, iib, "dstdata | bitpos");
        !           546:          generate_eastore(output, iib, tp_dst);
        !           547:          break;
        !           548:        default:
        !           549:          OUT("ERROR\n");
        !           550:          break;
        !           551:        }
        !           552:        OUT("\n");
        !           553:        OUT("  ZFLAG = !(dstdata & bitpos);\n");
        !           554:        break;
        !           555: 
        !           556:       case i_MOVE:
        !           557:        generate_ea(output, iib, tp_src, 1);
        !           558:        generate_eaval(output, iib, tp_src);
        !           559:        generate_ea(output, iib, tp_dst, 1);
        !           560:        generate_outdata(output, iib, "srcdata");
        !           561:        OUT("\n");
        !           562:        generate_eastore(output, iib, tp_dst);
        !           563:        if (flags)
        !           564:          OUT("\n");
        !           565:        if (flags && iib->flags.set & IIB_FLAG_V)
        !           566:          generate_clrflag_v(output, iib);
        !           567:        if (flags && iib->flags.set & IIB_FLAG_C)
        !           568:          generate_clrflag_c(output, iib);
        !           569:        if (flags && iib->flags.set & IIB_FLAG_N)
        !           570:          generate_stdflag_n(output, iib);
        !           571:        if (flags && iib->flags.set & IIB_FLAG_Z)
        !           572:          generate_stdflag_z(output, iib);
        !           573:        break;
        !           574: 
        !           575:       case i_MOVEA:
        !           576:        generate_ea(output, iib, tp_src, 1);
        !           577:        generate_eaval(output, iib, tp_src);
        !           578:        generate_ea(output, iib, tp_dst, 1);
        !           579:        if (iib->dtype != dt_Areg || iib->size != sz_word)
        !           580:          OUT("Error\n");
        !           581:        OUT("\n");
        !           582:        OUT("  ADDRREG(dstreg) = (sint32)(sint16)srcdata;\n");
        !           583:        break;
        !           584: 
        !           585:       case i_MOVEPMR:
        !           586:        generate_ea(output, iib, tp_src, 1);
        !           587:        generate_ea(output, iib, tp_dst, 1);
        !           588:        generate_eaval(output, iib, tp_dst);
        !           589:        switch(iib->size) {
        !           590:        case sz_word:
        !           591:          generate_outdata(output, iib, "(fetchbyte(srcaddr) << 8) + "
        !           592:                           "fetchbyte(srcaddr+2)");
        !           593:          break;
        !           594:        case sz_long:
        !           595:          generate_outdata(output, iib, "(fetchbyte(srcaddr) << 24) | "
        !           596:                           "(fetchbyte(srcaddr+2) << 16) | "
        !           597:                           "\n    (fetchbyte(srcaddr+4) << 8) | "
        !           598:                           "fetchbyte(srcaddr+6)");
        !           599:          break;
        !           600:        default:
        !           601:          OUT("ERROR size\n");
        !           602:          break;
        !           603:        }
        !           604:        OUT("\n");
        !           605:        generate_eastore(output, iib, tp_dst);
        !           606:        break;
        !           607: 
        !           608:       case i_MOVEPRM:
        !           609:        generate_ea(output, iib, tp_src, 1);
        !           610:        generate_eaval(output, iib, tp_src);
        !           611:        generate_ea(output, iib, tp_dst, 1);
        !           612:         OUT("\n");
        !           613:        switch(iib->size) {
        !           614:        case sz_word:
        !           615:          OUT("  storebyte(dstaddr, (srcdata >> 8) & 0xFF);\n");
        !           616:          OUT("  storebyte(dstaddr+2, srcdata & 0xFF);\n");
        !           617:          break;
        !           618:        case sz_long:
        !           619:          OUT("  storebyte(dstaddr, (srcdata >> 24) & 0xFF);\n");
        !           620:          OUT("  storebyte(dstaddr+2, (srcdata >> 16) & 0xFF);\n");
        !           621:          OUT("  storebyte(dstaddr+4, (srcdata >> 8) & 0xFF);\n");
        !           622:          OUT("  storebyte(dstaddr+6, srcdata & 0xFF);\n");
        !           623:          break;
        !           624:        default:
        !           625:          OUT("ERROR size\n");
        !           626:          break;
        !           627:        }
        !           628:        break;
        !           629: 
        !           630:       case i_MOVEFSR:
        !           631:        generate_ea(output, iib, tp_src, 1);
        !           632:        generate_outdata(output, iib, NULL);
        !           633:        OUT("\n");
        !           634:        OUT("  outdata = SR;\n");
        !           635:        generate_eastore(output, iib, tp_src);
        !           636:        break;
        !           637: 
        !           638:       case i_MOVETSR:
        !           639:        generate_ea(output, iib, tp_src, 1);
        !           640:        generate_eaval(output, iib, tp_src);
        !           641:         OUT("  unsigned int sr = reg68k_sr.sr_struct.s;\n");
        !           642:        OUT("\n");
        !           643:        if (DEBUG_SR)
        !           644:          fputs("  printf(\"SR: %08X %04X\\n\", PC, reg68k_sr.sr_int);\n",
        !           645:                output);
        !           646:        switch (iib->size) {
        !           647:        case sz_byte:
        !           648:          OUT("  SR = (SR & ~0xFF) | srcdata;\n");
        !           649:          break;
        !           650:        case sz_word:
        !           651:          OUT("  if (!SFLAG)\n");
        !           652:          fprintf(output, "    reg68k_vector(V_PRIVILEGE, PC+%d);\n",
        !           653:                  (iib->wordlen)*2);
        !           654:          OUT("\n");
        !           655:          OUT("  SR = srcdata;\n");
        !           656:          break;
        !           657:        default:
        !           658:          OUT("ERROR size\n");
        !           659:          break;
        !           660:        }
        !           661:        OUT("  if (sr != (uint8)reg68k_sr.sr_struct.s) {\n");
        !           662:         OUT("    /* mode change, swap SP and A7 */\n");
        !           663:         OUT("    ADDRREG(7)^= SP; SP^= ADDRREG(7); ADDRREG(7)^= SP;\n");
        !           664:         OUT("  }\n");
        !           665:        if (DEBUG_SR)
        !           666:          fputs("  printf(\"SR: %08X %04X\\n\", PC, reg68k_sr.sr_int);\n",
        !           667:                output);
        !           668:        break;
        !           669: 
        !           670:       case i_MOVEMRM:
        !           671:        generate_ea(output, iib, tp_src, 1);
        !           672:        generate_eaval(output, iib, tp_src);
        !           673:        generate_ea(output, iib, tp_dst, 0);
        !           674:         if (iib->dtype == dt_Adec) {
        !           675:          OUT("  uint8 datamask = (srcdata & 0xFF00) >> 8;\n");
        !           676:          OUT("  uint8 addrmask = srcdata & 0xFF;");
        !           677:          OUT("\n");
        !           678:          switch(iib->size) {
        !           679:          case sz_word:
        !           680:            OUT("  while (addrmask) {\n");
        !           681:            OUT("    dstaddr-= 2;\n");
        !           682:            OUT("    storeword(dstaddr, ADDRREG((7-movem_bit[addrmask])));\n");
        !           683:            OUT("    addrmask&= ~(1<<movem_bit[addrmask]);\n");
        !           684:            OUT("  }\n");
        !           685:            OUT("  while (datamask) {\n");
        !           686:            OUT("    dstaddr-= 2;\n");
        !           687:            OUT("    storeword(dstaddr, DATAREG((7-movem_bit[datamask])));\n");
        !           688:            OUT("    datamask&= ~(1<<movem_bit[datamask]);\n");
        !           689:            OUT("  }\n");
        !           690:            break;
        !           691:          case sz_long:
        !           692:            OUT("  while (addrmask) {\n");
        !           693:            OUT("    dstaddr-= 4;\n");
        !           694:            OUT("    storelong(dstaddr, ADDRREG((7-movem_bit[addrmask])));\n");
        !           695:            OUT("    addrmask&= ~(1<<movem_bit[addrmask]);\n");
        !           696:            OUT("  }\n");
        !           697:            OUT("  while (datamask) {\n");
        !           698:            OUT("    dstaddr-= 4;\n");
        !           699:            OUT("    storelong(dstaddr, ");
        !           700:            OUT("DATAREG((7-movem_bit[datamask])));\n");
        !           701:            OUT("    datamask&= ~(1<<movem_bit[datamask]);\n");
        !           702:            OUT("  }\n");
        !           703:            break;
        !           704:          default:
        !           705:            OUT("ERROR\n");
        !           706:            break;
        !           707:          }
        !           708:          OUT("  ADDRREG(dstreg) = dstaddr;");
        !           709:        } else {
        !           710:          OUT("  uint8 addrmask = (srcdata & 0xFF00) >> 8;\n");
        !           711:          OUT("  uint8 datamask = srcdata & 0xFF;");
        !           712:          OUT("\n");
        !           713:          switch(iib->size) {
        !           714:          case sz_word:
        !           715:            OUT("  while (datamask) {\n");
        !           716:            OUT("    storeword(dstaddr, DATAREG(movem_bit[datamask]));\n");
        !           717:            OUT("    datamask&= ~(1<<movem_bit[datamask]);\n");
        !           718:            OUT("    dstaddr+= 2;\n");
        !           719:            OUT("  }\n");
        !           720:            OUT("  while (addrmask) {\n");
        !           721:            OUT("    storeword(dstaddr, ADDRREG(movem_bit[addrmask]));\n");
        !           722:            OUT("    addrmask&= ~(1<<movem_bit[addrmask]);\n");
        !           723:            OUT("    dstaddr+= 2;\n");
        !           724:            OUT("  }\n");
        !           725:            break;
        !           726:          case sz_long:
        !           727:            OUT("  while (datamask) {\n");
        !           728:            OUT("    storelong(dstaddr, DATAREG(movem_bit[datamask]));\n");
        !           729:            OUT("    datamask&= ~(1<<movem_bit[datamask]);\n");
        !           730:            OUT("    dstaddr+= 4;\n");
        !           731:            OUT("  }\n");
        !           732:            OUT("  while (addrmask) {\n");
        !           733:            OUT("    storelong(dstaddr, ADDRREG(movem_bit[addrmask]));\n");
        !           734:            OUT("    addrmask&= ~(1<<movem_bit[addrmask]);\n");
        !           735:            OUT("    dstaddr+= 4;\n");
        !           736:            OUT("  }\n");
        !           737:            break;
        !           738:          default:
        !           739:            OUT("ERROR\n");
        !           740:            break;
        !           741:          }
        !           742:          if (iib->dtype == dt_Ainc) {
        !           743:            /* not supported */
        !           744:            OUT("ERROR\n");
        !           745:          }
        !           746:        }
        !           747:        break;
        !           748: 
        !           749:       case i_MOVEMMR:
        !           750:        generate_ea(output, iib, tp_src, 1);
        !           751:        generate_eaval(output, iib, tp_src);
        !           752:        generate_ea(output, iib, tp_dst, 0);
        !           753:         OUT("  uint8 addrmask = (srcdata & 0xFF00) >> 8;\n");
        !           754:        OUT("  uint8 datamask = srcdata & 0xFF;");
        !           755:        OUT("\n");
        !           756:        switch(iib->size) {
        !           757:        case sz_word:
        !           758:          OUT("  while (datamask) {\n");
        !           759:          OUT("    DATAREG(movem_bit[datamask]) = ");
        !           760:          OUT("(sint32)(sint16)fetchword(dstaddr);\n");
        !           761:          OUT("    datamask&= ~(1<<movem_bit[datamask]);\n");
        !           762:          OUT("    dstaddr+= 2;\n");
        !           763:          OUT("  }\n");
        !           764:          OUT("  while (addrmask) {\n");
        !           765:          OUT("    ADDRREG(movem_bit[addrmask]) = ");
        !           766:          OUT("(sint32)(sint16)fetchword(dstaddr);\n");
        !           767:          OUT("    addrmask&= ~(1<<movem_bit[addrmask]);\n");
        !           768:          OUT("    dstaddr+= 2;\n");
        !           769:          OUT("  }\n");
        !           770:          break;
        !           771:        case sz_long:
        !           772:          OUT("  while (datamask) {\n");
        !           773:          OUT("    DATAREG(movem_bit[datamask]) = fetchlong(dstaddr);\n");
        !           774:          OUT("    datamask&= ~(1<<movem_bit[datamask]);\n");
        !           775:          OUT("    dstaddr+= 4;\n");
        !           776:          OUT("  }\n");
        !           777:          OUT("  while (addrmask) {\n");
        !           778:          OUT("    ADDRREG(movem_bit[addrmask]) = fetchlong(dstaddr);\n");
        !           779:          OUT("    addrmask&= ~(1<<movem_bit[addrmask]);\n");
        !           780:          OUT("    dstaddr+= 4;\n");
        !           781:          OUT("  }\n");
        !           782:          break;
        !           783:        default:
        !           784:          OUT("ERROR\n");
        !           785:          break;
        !           786:        }
        !           787:        if (iib->dtype == dt_Ainc) {
        !           788:          OUT("  ADDRREG(dstreg) = dstaddr;\n");
        !           789:        } else if (iib->dtype == dt_Adec) {
        !           790:          /* not supported */
        !           791:          OUT("ERROR\n");
        !           792:        }
        !           793:        break;
        !           794: 
        !           795:       case i_MOVETUSP:
        !           796:        generate_ea(output, iib, tp_src, 1);
        !           797:        generate_eaval(output, iib, tp_src);
        !           798:        OUT("\n");
        !           799:         OUT("  if (!SFLAG)\n");
        !           800:        fprintf(output, "    reg68k_vector(V_PRIVILEGE, PC+%d);\n",
        !           801:                (iib->wordlen)*2);
        !           802:        OUT("\n");
        !           803:        OUT("  SP = srcdata;\n");
        !           804:        break;
        !           805: 
        !           806:       case i_MOVEFUSP:
        !           807:        generate_ea(output, iib, tp_src, 1);
        !           808:        OUT("  uint32 outdata;\n");
        !           809:        OUT("\n");
        !           810:        OUT("  if (!SFLAG)\n");
        !           811:        fprintf(output, "    reg68k_vector(V_PRIVILEGE, PC+%d);\n",
        !           812:                (iib->wordlen)*2);
        !           813:        OUT("\n");
        !           814:        OUT("  outdata = SP;\n");
        !           815:        generate_eastore(output, iib, tp_src);
        !           816:        break;
        !           817: 
        !           818:       case i_NEG:
        !           819:        generate_ea(output, iib, tp_src, 1);
        !           820:        generate_eaval(output, iib, tp_src);
        !           821:        switch (iib->size) {
        !           822:        case sz_byte:
        !           823:          generate_outdata(output, iib, "0 - (sint8)srcdata");
        !           824:          break;
        !           825:        case sz_word:
        !           826:          generate_outdata(output, iib, "0 - (sint16)srcdata");
        !           827:          break;
        !           828:        case sz_long:
        !           829:          generate_outdata(output, iib, "0 - (sint32)srcdata");
        !           830:          break;
        !           831:        default:
        !           832:          OUT("ERROR size\n");
        !           833:          break;
        !           834:        }
        !           835:        OUT("\n");
        !           836:        generate_eastore(output, iib, tp_src);
        !           837:        if (flags)
        !           838:          OUT("\n");
        !           839:        if (flags && iib->flags.set & IIB_FLAG_V)
        !           840:          generate_negflag_v(output, iib);
        !           841:        if (flags && ((iib->flags.set & IIB_FLAG_C) ||
        !           842:                      (iib->flags.set & IIB_FLAG_X)))
        !           843:          generate_negflag_cx(output, iib);
        !           844:        if (flags && iib->flags.set & IIB_FLAG_N)
        !           845:          generate_stdflag_n(output, iib);
        !           846:        if (flags && iib->flags.set & IIB_FLAG_Z)
        !           847:          generate_stdflag_z(output, iib);
        !           848:        break;
        !           849: 
        !           850:       case i_NEGX:
        !           851:        generate_ea(output, iib, tp_src, 1);
        !           852:        generate_eaval(output, iib, tp_src);
        !           853:        switch (iib->size) {
        !           854:        case sz_byte:
        !           855:          generate_outdata(output, iib, "0 - (sint8)srcdata - XFLAG");
        !           856:          break;
        !           857:        case sz_word:
        !           858:          generate_outdata(output, iib, "0 - (sint16)srcdata - XFLAG");
        !           859:          break;
        !           860:        case sz_long:
        !           861:          generate_outdata(output, iib, "0 - (sint32)srcdata - XFLAG");
        !           862:          break;
        !           863:        default:
        !           864:          OUT("ERROR size\n");
        !           865:          break;
        !           866:        }
        !           867:        OUT("\n");
        !           868:        generate_eastore(output, iib, tp_src);
        !           869:        if (flags)
        !           870:          OUT("\n");
        !           871:        if (flags && iib->flags.set & IIB_FLAG_V)
        !           872:          generate_negxflag_v(output, iib);
        !           873:        if (flags && ((iib->flags.set & IIB_FLAG_C) ||
        !           874:                      (iib->flags.set & IIB_FLAG_X)))
        !           875:          generate_negxflag_cx(output, iib);
        !           876:        if (flags && iib->flags.set & IIB_FLAG_N)
        !           877:          generate_stdflag_n(output, iib);
        !           878:        if (flags && iib->flags.set & IIB_FLAG_Z)
        !           879:          generate_stdxflag_z(output, iib);
        !           880:        break;
        !           881:        
        !           882:       case i_CLR:
        !           883:        generate_ea(output, iib, tp_src, 1);
        !           884:        generate_eaval(output, iib, tp_src); /* read before write */
        !           885:        generate_outdata(output, iib, "0");
        !           886:        OUT("\n");
        !           887:        generate_eastore(output, iib, tp_src);
        !           888:        if (flags)
        !           889:          OUT("\n");
        !           890:        if (flags && iib->flags.set & IIB_FLAG_V)
        !           891:          generate_clrflag_v(output, iib);
        !           892:        if (flags && iib->flags.set & IIB_FLAG_C)
        !           893:          generate_clrflag_c(output, iib);
        !           894:        if (flags && iib->flags.set & IIB_FLAG_N)
        !           895:          generate_clrflag_n(output, iib);
        !           896:        if (flags && iib->flags.set & IIB_FLAG_Z)
        !           897:          generate_setflag_z(output, iib);
        !           898:        break;
        !           899: 
        !           900:       case i_NOT:
        !           901:        generate_ea(output, iib, tp_src, 1);
        !           902:        generate_eaval(output, iib, tp_src); /* read before write */
        !           903:        generate_outdata(output, iib, "~srcdata");
        !           904:         OUT("\n");
        !           905:        generate_eastore(output, iib, tp_src);
        !           906:        if (flags)
        !           907:          OUT("\n");
        !           908:        if (flags && iib->flags.set & IIB_FLAG_V)
        !           909:          generate_clrflag_v(output, iib);
        !           910:        if (flags && iib->flags.set & IIB_FLAG_C)
        !           911:          generate_clrflag_c(output, iib);
        !           912:        if (flags && iib->flags.set & IIB_FLAG_N)
        !           913:          generate_stdflag_n(output, iib);
        !           914:        if (flags && iib->flags.set & IIB_FLAG_Z)
        !           915:          generate_stdflag_z(output, iib);
        !           916:        break;
        !           917: 
        !           918:       case i_ABCD:
        !           919:        generate_ea(output, iib, tp_src, 1);
        !           920:        generate_eaval(output, iib, tp_src);
        !           921:        generate_ea(output, iib, tp_dst, 1);
        !           922:        generate_eaval(output, iib, tp_dst);
        !           923:        generate_outdata(output, iib, NULL);
        !           924:        OUT("\n");
        !           925:        OUT("  uint8 outdata_low = (dstdata & 0xF) + (srcdata & 0xF) ");
        !           926:        OUT("+ XFLAG;\n");
        !           927:        OUT("  uint8 outdata_high = (dstdata>>4) + (srcdata>>4);\n");
        !           928:        OUT("\n");
        !           929:        OUT("  if (outdata_low > 9) {\n");
        !           930:        OUT("    outdata_low-=10; outdata_high++;\n");
        !           931:        OUT("  }\n");
        !           932:        OUT("  if (outdata_high > 9) {\n");
        !           933:        OUT("    outdata_high-=10;\n");
        !           934:        if (flags && iib->flags.set & IIB_FLAG_C)
        !           935:          OUT("    CFLAG = 1;\n");
        !           936:        if (flags && iib->flags.set & IIB_FLAG_X)
        !           937:          OUT("    XFLAG = 1;\n");
        !           938:        OUT("  } else {\n");
        !           939:        if (flags && iib->flags.set & IIB_FLAG_C)
        !           940:          OUT("    CFLAG = 0;\n");
        !           941:        if (flags && iib->flags.set & IIB_FLAG_X)
        !           942:          OUT("    XFLAG = 0;\n");
        !           943:        OUT("  }\n");
        !           944:        OUT("  outdata = outdata_low | (outdata_high << 4);\n");
        !           945:        if (flags && iib->flags.set & IIB_FLAG_Z)
        !           946:          OUT("  if (outdata) ZFLAG = 0;\n");
        !           947:        generate_eastore(output, iib, tp_dst);
        !           948:        break;
        !           949: 
        !           950:       case i_SBCD:
        !           951:        generate_ea(output, iib, tp_src, 1);
        !           952:        generate_eaval(output, iib, tp_src);
        !           953:        generate_ea(output, iib, tp_dst, 1);
        !           954:        generate_eaval(output, iib, tp_dst);
        !           955:        generate_outdata(output, iib, NULL);
        !           956:        OUT("\n");
        !           957:        OUT("  sint8 outdata_low = (sint8)(dstdata & 0xF) -");
        !           958:        OUT("(sint8)(srcdata & 0xF) - XFLAG;\n");
        !           959:        OUT("  sint8 outdata_high = (sint8)(dstdata>>4) - ");
        !           960:        OUT("(sint8)(srcdata>>4);\n");
        !           961:        OUT("\n");
        !           962:        OUT("  if (outdata_low < 0) {\n");
        !           963:        OUT("    outdata_low+=10; outdata_high--;\n");
        !           964:        OUT("  }\n");
        !           965:        OUT("  if (outdata_high < 0) {\n");
        !           966:        OUT("    outdata_high+=10;\n");
        !           967:        if (flags && iib->flags.set & IIB_FLAG_C)
        !           968:          OUT("    CFLAG = 1;\n");
        !           969:        if (flags && iib->flags.set & IIB_FLAG_X)
        !           970:          OUT("    XFLAG = 1;\n");
        !           971:        OUT("  } else {\n");
        !           972:        if (flags && iib->flags.set & IIB_FLAG_C)
        !           973:          OUT("    CFLAG = 0;\n");
        !           974:        if (flags && iib->flags.set & IIB_FLAG_X)
        !           975:          OUT("    XFLAG = 0;\n");
        !           976:        OUT("  }\n");
        !           977:        OUT("  outdata = (uint8)outdata_low | ");
        !           978:        OUT("((uint8)outdata_high << 4);\n");
        !           979:        if (flags && iib->flags.set & IIB_FLAG_Z)
        !           980:          OUT("  if (outdata) ZFLAG = 0;\n");
        !           981:        generate_eastore(output, iib, tp_dst);
        !           982:        break;
        !           983: 
        !           984:       case i_NBCD:
        !           985:        generate_ea(output, iib, tp_src, 1);
        !           986:        generate_eaval(output, iib, tp_src);
        !           987:        generate_outdata(output, iib, NULL);
        !           988:        OUT("\n");
        !           989:        OUT("  sint8 outdata_low = 0 - (sint8)(srcdata & 0xF) - XFLAG;\n");
        !           990:        OUT("  sint8 outdata_high = 0 - (sint8)(srcdata>>4);\n");
        !           991:        OUT("\n");
        !           992:        OUT("  if ((sint8)outdata_low < 0) {\n");
        !           993:        OUT("    outdata_low+=10; outdata_high--;\n");
        !           994:        OUT("  }\n");
        !           995:        OUT("  if ((sint8)outdata_high < 0) {\n");
        !           996:        OUT("    outdata_high+=10;\n");
        !           997:        if (flags && iib->flags.set & IIB_FLAG_C)
        !           998:          OUT("    CFLAG = 1;\n");
        !           999:        if (flags && iib->flags.set & IIB_FLAG_X)
        !          1000:          OUT("    XFLAG = 1;\n");
        !          1001:        OUT("  } else {\n");
        !          1002:        if (flags && iib->flags.set & IIB_FLAG_C)
        !          1003:          OUT("    CFLAG = 0;\n");
        !          1004:        if (flags && iib->flags.set & IIB_FLAG_X)
        !          1005:          OUT("    XFLAG = 0;\n");
        !          1006:        OUT("  }\n");
        !          1007:        OUT("  outdata = (uint8)outdata_low |");
        !          1008:        OUT("((uint8)outdata_high << 4);\n");
        !          1009:        if (flags && iib->flags.set & IIB_FLAG_Z)
        !          1010:          OUT("  if (outdata) ZFLAG = 0;\n");
        !          1011:        generate_eastore(output, iib, tp_src);
        !          1012:        break;
        !          1013: 
        !          1014:       case i_SWAP:
        !          1015:        generate_ea(output, iib, tp_src, 1);
        !          1016:        generate_eaval(output, iib, tp_src);
        !          1017:        generate_outdata(output, iib, "(srcdata>>16) | (srcdata<<16)");
        !          1018:        OUT("\n");
        !          1019:        generate_eastore(output, iib, tp_src);
        !          1020:        if (flags)
        !          1021:          OUT("\n");
        !          1022:        if (flags && iib->flags.set & IIB_FLAG_V)
        !          1023:          generate_clrflag_v(output, iib);
        !          1024:        if (flags && iib->flags.set & IIB_FLAG_C)
        !          1025:          generate_clrflag_c(output, iib);
        !          1026:        if (flags && iib->flags.set & IIB_FLAG_N)
        !          1027:          generate_stdflag_n(output, iib);
        !          1028:        if (flags && iib->flags.set & IIB_FLAG_Z)
        !          1029:          generate_stdflag_z(output, iib);
        !          1030:        break;
        !          1031: 
        !          1032:       case i_PEA:
        !          1033:        generate_ea(output, iib, tp_src, 1);
        !          1034:        OUT("\n");
        !          1035:        OUT("  ADDRREG(7)-= 4;\n");
        !          1036:        OUT("  storelong(ADDRREG(7), srcaddr);\n");
        !          1037:        break;
        !          1038: 
        !          1039:       case i_LEA:
        !          1040:        generate_ea(output, iib, tp_src, 1);
        !          1041:        generate_ea(output, iib, tp_dst, 1);
        !          1042:        generate_outdata(output, iib, "srcaddr");
        !          1043:        OUT("\n");
        !          1044:        generate_eastore(output, iib, tp_dst);
        !          1045:        break;
        !          1046: 
        !          1047:       case i_EXT:
        !          1048:        generate_ea(output, iib, tp_src, 1);
        !          1049:        generate_eaval(output, iib, tp_src);
        !          1050:        OUT("\n");
        !          1051:        switch(iib->size) {
        !          1052:        case sz_word:
        !          1053:          generate_outdata(output, iib, "(sint16)(sint8)(srcdata)");
        !          1054:          break;
        !          1055:        case sz_long:
        !          1056:          generate_outdata(output, iib, "(sint32)(sint16)(srcdata)");
        !          1057:          break;
        !          1058:        default:
        !          1059:          fprintf(output, "ERROR size\n");
        !          1060:          break;
        !          1061:        }
        !          1062:        generate_eastore(output, iib, tp_src);
        !          1063:        if (flags)
        !          1064:          OUT("\n");
        !          1065:        if (flags && iib->flags.set & IIB_FLAG_V)
        !          1066:          generate_clrflag_v(output, iib);
        !          1067:        if (flags && iib->flags.set & IIB_FLAG_C)
        !          1068:          generate_clrflag_c(output, iib);
        !          1069:        if (flags && iib->flags.set & IIB_FLAG_N)
        !          1070:          generate_stdflag_n(output, iib);
        !          1071:        if (flags && iib->flags.set & IIB_FLAG_Z)
        !          1072:          generate_stdflag_z(output, iib);
        !          1073:        break;
        !          1074: 
        !          1075:       case i_EXG:
        !          1076:        generate_ea(output, iib, tp_src, 1);
        !          1077:        generate_eaval(output, iib, tp_src);
        !          1078:        generate_ea(output, iib, tp_dst, 1);
        !          1079:        generate_eaval(output, iib, tp_dst);
        !          1080:        OUT("\n");
        !          1081:        switch (iib->dtype) {
        !          1082:        case dt_Dreg:
        !          1083:          OUT("  DATAREG(dstreg) = srcdata;\n");
        !          1084:          break;
        !          1085:        case dt_Areg:
        !          1086:          OUT("  ADDRREG(dstreg) = srcdata;\n");
        !          1087:          break;
        !          1088:        default:
        !          1089:          OUT("ERROR size\n");
        !          1090:          break;
        !          1091:        }
        !          1092:        switch (iib->stype) {
        !          1093:        case dt_Dreg:
        !          1094:          OUT("  DATAREG(srcreg) = dstdata;\n");
        !          1095:          break;
        !          1096:        case dt_Areg:
        !          1097:          OUT("  ADDRREG(srcreg) = dstdata;\n");
        !          1098:          break;
        !          1099:        default:
        !          1100:          OUT("ERROR size\n");
        !          1101:          break;
        !          1102:        }
        !          1103:        break;
        !          1104: 
        !          1105:       case i_TST:
        !          1106:        generate_ea(output, iib, tp_src, 1);
        !          1107:        generate_eaval(output, iib, tp_src);
        !          1108:        generate_outdata(output, iib, "srcdata");
        !          1109:        if (flags)
        !          1110:          OUT("\n");
        !          1111:        if (flags && iib->flags.set & IIB_FLAG_V)
        !          1112:          generate_clrflag_v(output, iib);
        !          1113:        if (flags && iib->flags.set & IIB_FLAG_C)
        !          1114:          generate_clrflag_c(output, iib);
        !          1115:        if (flags && iib->flags.set & IIB_FLAG_N)
        !          1116:          generate_stdflag_n(output, iib);
        !          1117:        if (flags && iib->flags.set & IIB_FLAG_Z)
        !          1118:          generate_stdflag_z(output, iib);
        !          1119:        break;
        !          1120: 
        !          1121:       case i_TAS:
        !          1122:        generate_ea(output, iib, tp_src, 1);
        !          1123:        generate_eaval(output, iib, tp_src);
        !          1124:        generate_outdata(output, iib, "srcdata");
        !          1125:        if (flags)
        !          1126:          OUT("\n");
        !          1127:        if (flags && iib->flags.set & IIB_FLAG_V)
        !          1128:          generate_clrflag_v(output, iib);
        !          1129:        if (flags && iib->flags.set & IIB_FLAG_C)
        !          1130:          generate_clrflag_c(output, iib);
        !          1131:        if (flags && iib->flags.set & IIB_FLAG_N)
        !          1132:          generate_stdflag_n(output, iib);
        !          1133:        if (flags && iib->flags.set & IIB_FLAG_Z)
        !          1134:          generate_stdflag_z(output, iib);
        !          1135:        switch(iib->size) {
        !          1136:        case sz_byte:
        !          1137:          OUT("  outdata|= 1<<7;\n");
        !          1138:          break;
        !          1139:        case sz_word:
        !          1140:          OUT("  outdata|= 1<<15;\n");
        !          1141:          break;
        !          1142:        case sz_long:
        !          1143:          OUT("  outdata|= 1<<31;\n");
        !          1144:          break;
        !          1145:        default:
        !          1146:          OUT("ERROR size\n");
        !          1147:          break;
        !          1148:        }
        !          1149:        generate_eastore(output, iib, tp_src);
        !          1150:        break;
        !          1151: 
        !          1152:       case i_CHK:
        !          1153:        generate_ea(output, iib, tp_src, 1);
        !          1154:        generate_eaval(output, iib, tp_src);
        !          1155:        generate_ea(output, iib, tp_dst, 1);
        !          1156:        generate_eaval(output, iib, tp_dst);
        !          1157:        fprintf(output, "\n");
        !          1158:        if (iib->size != sz_word)
        !          1159:          OUT("ERROR size\n");
        !          1160:        fprintf(output, "  if ((sint16)srcdata < 0) {\n");
        !          1161:        if (flags)
        !          1162:          OUT("    NFLAG = 1;\n");
        !          1163:        fprintf(output, "    reg68k_vector(V_CHK, PC+%d);\n",
        !          1164:                (iib->wordlen)*2);
        !          1165:        OUT("  } else if (dstdata > srcdata) {\n");
        !          1166:        if (flags)
        !          1167:          OUT("    NFLAG = 0;\n");
        !          1168:        fprintf(output, "    reg68k_vector(V_CHK, PC+%d);\n",
        !          1169:                (iib->wordlen)*2);
        !          1170:        OUT("  }\n");
        !          1171:        break;
        !          1172: 
        !          1173:       case i_TRAPV:
        !          1174:        OUT("  if (VFLAG) {\n");
        !          1175:        fprintf(output, "    reg68k_vector(V_TRAPV, PC+%d);\n",
        !          1176:                (iib->wordlen)*2);
        !          1177:        OUT("  }\n");
        !          1178:        break;
        !          1179: 
        !          1180:       case i_TRAP:
        !          1181:        generate_ea(output, iib, tp_src, 1);
        !          1182:        generate_eaval(output, iib, tp_src);
        !          1183:        OUT("\n");
        !          1184:        fprintf(output, "  reg68k_vector(V_TRAP+srcdata, PC+%d);\n",
        !          1185:                (iib->wordlen)*2);
        !          1186:        pcinc = 0;
        !          1187:        break;
        !          1188: 
        !          1189:       case i_RESET:
        !          1190:         OUT("  printf(\"RESET @ %x\\n\", PC);\n");
        !          1191:        OUT("  exit(1);\n");
        !          1192:        break;
        !          1193: 
        !          1194:       case i_NOP:
        !          1195:        /* NOP */
        !          1196:        break;
        !          1197: 
        !          1198:       case i_STOP:
        !          1199:        generate_ea(output, iib, tp_src, 1);
        !          1200:        generate_eaval(output, iib, tp_src);
        !          1201:        OUT("\n");
        !          1202:        OUT("  switch(regs.stop) {\n");
        !          1203:        OUT("  case 1:\n");
        !          1204:        OUT("    break;\n");
        !          1205:        OUT("  case 2:\n");
        !          1206:        OUT("    PC+= 2;\n");
        !          1207:        OUT("    break;\n");
        !          1208:        OUT("  default:\n");
        !          1209:        OUT("    if (!(SFLAG && (srcdata & 1<<13)))\n");
        !          1210:        fprintf(output, "      reg68k_vector(V_PRIVILEGE, PC+%d);\n",
        !          1211:                (iib->wordlen)*2);
        !          1212:        OUT("    SR = srcdata;\n");
        !          1213:        OUT("    STOP = 1;\n");
        !          1214:        OUT("    printf(\"STOP @ %%x\\n\", PC);\n");
        !          1215:        OUT("    exit(1);\n");
        !          1216:        OUT("  }\n");
        !          1217:        break;
        !          1218: 
        !          1219:       case i_LINK:
        !          1220:        generate_ea(output, iib, tp_src, 1);
        !          1221:        generate_eaval(output, iib, tp_src);
        !          1222:        generate_ea(output, iib, tp_dst, 1);
        !          1223:        generate_eaval(output, iib, tp_dst);
        !          1224:        if (iib->stype != dt_ImmW)
        !          1225:          OUT("ERROR stype\n");
        !          1226:        OUT("\n");
        !          1227:         OUT("  ADDRREG(7)-= 4;\n");
        !          1228:        OUT("  storelong(ADDRREG(7), dstdata);\n");
        !          1229:        OUT("  ADDRREG(dstreg) = ADDRREG(7);\n");
        !          1230:        OUT("  ADDRREG(7)+= (sint16)srcdata;\n");
        !          1231:        break;
        !          1232: 
        !          1233:       case i_UNLK:
        !          1234:        generate_ea(output, iib, tp_src, 1);
        !          1235:        generate_eaval(output, iib, tp_src);
        !          1236:        OUT("\n");
        !          1237:        OUT("  ADDRREG(srcreg) = fetchlong(srcdata);\n");
        !          1238:         OUT("  ADDRREG(7) = srcdata+4;\n");
        !          1239:        break;
        !          1240: 
        !          1241:       case i_RTE:
        !          1242:        if (DEBUG_RTE)
        !          1243:          fputs("  printf(\"RTE: 0x%X\\n\", PC);\n", output);
        !          1244:        if (DEBUG_SR)
        !          1245:          fputs("  printf(\"SR: %08X %04X\\n\", PC, reg68k_sr.sr_int);\n",
        !          1246:                output);
        !          1247:        OUT("  if (!SFLAG)\n");
        !          1248:        fprintf(output, "    reg68k_vector(V_PRIVILEGE, PC+%d);\n",
        !          1249:                (iib->wordlen)*2);
        !          1250:        OUT("\n");
        !          1251:        OUT("  SR = fetchword(ADDRREG(7));\n");
        !          1252:         OUT("  PC = fetchlong(ADDRREG(7)+2);\n");
        !          1253:        OUT("  ADDRREG(7)+= 6;\n");
        !          1254:         OUT("  if (!reg68k_sr.sr_struct.s) {\n");
        !          1255:         OUT("    /* mode change, swap SP and A7 */\n");
        !          1256:         OUT("    ADDRREG(7)^= SP; SP^= ADDRREG(7); ADDRREG(7)^= SP;\n");
        !          1257:         OUT("  }\n");
        !          1258:        if (DEBUG_RTE)
        !          1259:          fputs("  printf(\"RTE: ->0x%X\\n\", PC);\n", output);
        !          1260:        if (DEBUG_SR)
        !          1261:          fputs("  printf(\"SR: %08X %04X\\n\", PC, reg68k_sr.sr_int);\n",
        !          1262:                output);
        !          1263:        pcinc = 0;
        !          1264:        break;
        !          1265: 
        !          1266:       case i_RTS:
        !          1267:        if (DEBUG_BRANCH)
        !          1268:          fputs("  printf(\"RTS: 0x%X\\n\", PC);", output);
        !          1269:         OUT("  PC = fetchlong(ADDRREG(7));\n");
        !          1270:        OUT("  ADDRREG(7)+= 4;\n");
        !          1271:        if (DEBUG_BRANCH)
        !          1272:          fputs("  printf(\"RTS: ->0x%X\\n\", PC);", output);
        !          1273:        pcinc = 0;
        !          1274:        break;
        !          1275: 
        !          1276:       case i_RTR:
        !          1277:        if (DEBUG_BRANCH)
        !          1278:          fputs("  printf(\"RTR: 0x%X\\n\", PC);\n", output);
        !          1279:        if (DEBUG_SR)
        !          1280:          fputs("  printf(\"SR: %08X %04X\\n\", PC, reg68k_sr.sr_int);\n",
        !          1281:                output);
        !          1282:        OUT("  SR = (SR & ~0xFF) | (fetchword(ADDRREG(7)) & 0xFF);\n");
        !          1283:        OUT("  PC = fetchlong(ADDRREG(7)+2);\n");
        !          1284:        OUT("  ADDRREG(7)+= 6;\n");
        !          1285:        if (DEBUG_BRANCH)
        !          1286:          fputs("  printf(\"RTR: ->0x%X\\n\", PC);\n", output);
        !          1287:        if (DEBUG_SR)
        !          1288:          fputs("  printf(\"SR: %08X %04X\\n\", PC, reg68k_sr.sr_int);\n",
        !          1289:                output);
        !          1290:        pcinc = 0;
        !          1291:        break;
        !          1292: 
        !          1293:       case i_JSR:
        !          1294:        generate_ea(output, iib, tp_src, 1);
        !          1295:        OUT("\n");
        !          1296:        if (DEBUG_BRANCH)
        !          1297:          fputs("  printf(\"JSR: 0x%X\\n\", PC);\n", output);
        !          1298:        OUT("  ADDRREG(7)-= 4;\n");
        !          1299:        fprintf(output, "  storelong(ADDRREG(7), PC+%d);\n", (iib->wordlen)*2);
        !          1300:        OUT("  PC = srcaddr;\n");
        !          1301:        if (DEBUG_BRANCH)
        !          1302:          fputs("  printf(\"JSR: ->0x%X\\n\", PC);", output);
        !          1303:        pcinc = 0;
        !          1304:        break;
        !          1305: 
        !          1306:       case i_JMP:
        !          1307:        generate_ea(output, iib, tp_src, 1);
        !          1308:        OUT("\n");
        !          1309:        if (DEBUG_BRANCH)
        !          1310:          fputs("  printf(\"JMP: 0x%X\\n\", PC);", output);
        !          1311:        OUT("  PC = srcaddr;\n");
        !          1312:        if (DEBUG_BRANCH)
        !          1313:          fputs("  printf(\"JMP: ->0x%X\\n\", PC);\n", output);
        !          1314:        pcinc = 0;
        !          1315:        break;
        !          1316:        
        !          1317:       case i_Scc:
        !          1318:        generate_ea(output, iib, tp_src, 1);
        !          1319:        generate_cc(output, iib);
        !          1320:        generate_outdata(output, iib, "cc ? (uint8)(-1) : 0");
        !          1321:        OUT("\n");
        !          1322:        generate_eastore(output, iib, tp_src);
        !          1323:        break;
        !          1324: 
        !          1325:       case i_SF:
        !          1326:        generate_ea(output, iib, tp_src, 1);
        !          1327:        generate_outdata(output, iib, "0");
        !          1328:        OUT("\n");
        !          1329:        generate_eastore(output, iib, tp_src);
        !          1330:        break;
        !          1331: 
        !          1332:       case i_DBcc:
        !          1333:        /* special case where ipc holds the already PC-relative value */
        !          1334:        fprintf(output, "  uint32 srcdata = ipc->src;\n");
        !          1335:        generate_ea(output, iib, tp_dst, 1);
        !          1336:        generate_eaval(output, iib, tp_dst);
        !          1337:        generate_cc(output, iib);
        !          1338:        fprintf(output, "\n");
        !          1339:        if (iib->size != sz_word) {
        !          1340:          OUT("ERROR size\n");
        !          1341:        }
        !          1342:        OUT("  if (!cc) {\n");
        !          1343:        OUT("    dstdata-= 1;\n");
        !          1344:         OUT("    DATAREG(dstreg) = (DATAREG(dstreg) & ~0xFFFF)\n");
        !          1345:        OUT("| (dstdata & 0xFFFF);\n");
        !          1346:         OUT("    if ((sint16)dstdata != -1)\n");
        !          1347:         OUT("      PC = srcdata;\n");
        !          1348:        OUT("    else\n");
        !          1349:         fprintf(output, "      PC+= %d;\n", (iib->wordlen)*2);
        !          1350:        OUT("  } else\n");
        !          1351:         fprintf(output, "    PC+= %d;\n", (iib->wordlen)*2);
        !          1352:        pcinc = 0;
        !          1353:        break;
        !          1354: 
        !          1355:       case i_DBRA:
        !          1356:        /* special case where ipc holds the already PC-relative value */
        !          1357:        fprintf(output, "  uint32 srcdata = ipc->src;\n");
        !          1358:        generate_ea(output, iib, tp_dst, 1);
        !          1359:        generate_eaval(output, iib, tp_dst);
        !          1360:        OUT("\n");
        !          1361:        if (iib->size != sz_word) {
        !          1362:          OUT("ERROR size\n");
        !          1363:        }
        !          1364:        OUT("  dstdata-= 1;\n");
        !          1365:        OUT("  DATAREG(dstreg) = (DATAREG(dstreg) & ~0xFFFF) | ");
        !          1366:        OUT("(dstdata & 0xFFFF);\n");
        !          1367:        OUT("  if ((sint16)dstdata != -1)\n");
        !          1368:        OUT("    PC = srcdata;\n");
        !          1369:        OUT("  else\n");
        !          1370:         fprintf(output, "    PC+= %d;\n", (iib->wordlen)*2);
        !          1371:        pcinc = 0;
        !          1372:        break;
        !          1373: 
        !          1374:       case i_Bcc:
        !          1375:        /* special case where ipc holds the already PC-relative value */
        !          1376:        OUT("  uint32 srcdata = ipc->src;\n");
        !          1377:        generate_cc(output, iib);
        !          1378:        OUT("\n");
        !          1379:        if (DEBUG_BRANCH)
        !          1380:          fputs("  printf(\"Bcc: 0x%X\\n\", PC);\n", output);
        !          1381:        OUT("  if (cc)\n");
        !          1382:         OUT("    PC = srcdata;\n");
        !          1383:        OUT("  else\n");
        !          1384:         fprintf(output, "    PC+= %d;\n", (iib->wordlen)*2);
        !          1385:        if (DEBUG_BRANCH)
        !          1386:          fputs("  printf(\"Bcc: ->0x%X\\n\", PC);\n", output);
        !          1387:        pcinc = 0;
        !          1388:        break;
        !          1389: 
        !          1390:       case i_BSR:
        !          1391:        /* special case where ipc holds the already PC-relative value */
        !          1392:        OUT("  uint32 srcdata = ipc->src;\n");
        !          1393:        OUT("\n");
        !          1394:        if (DEBUG_BRANCH)
        !          1395:          fputs("  printf(\"BSR: 0x%X\\n\", PC);\n", output);
        !          1396:        OUT("  ADDRREG(7)-= 4;\n");
        !          1397:        fprintf(output, "  storelong(ADDRREG(7), PC+%d);\n", (iib->wordlen)*2);
        !          1398:        OUT("  PC = srcdata;\n");
        !          1399:        if (DEBUG_BRANCH)
        !          1400:          fputs("  printf(\"BSR: ->0x%X\\n\", PC);\n", output);
        !          1401:        pcinc = 0;
        !          1402:        break;
        !          1403: 
        !          1404:       case i_DIVU:
        !          1405:        /* DIVx is the only instruction that has different sizes for the
        !          1406:           source and destination! */
        !          1407:        if (iib->dtype != dt_Dreg)
        !          1408:          OUT("ERROR dtype\n");
        !          1409:        generate_ea(output, iib, tp_src, 1);
        !          1410:        generate_eaval(output, iib, tp_src); /* 16bit EA */
        !          1411:        generate_ea(output, iib, tp_dst, 1); /* 32bit Dn */
        !          1412:         OUT("  uint32 dstdata = DATAREG(dstreg);\n");
        !          1413:         OUT("  uint32 quotient;\n");
        !          1414:        OUT("\n");
        !          1415:        OUT("  if (srcdata == 0) {\n");
        !          1416:        fprintf(output, "    reg68k_vector(V_ZERO, PC+%d);\n",
        !          1417:                (iib->wordlen)*2);
        !          1418:        OUT("    return;\n");
        !          1419:        OUT("  }\n");
        !          1420:        OUT("  quotient = dstdata / srcdata;\n");
        !          1421:         OUT("  if ((quotient & 0xffff0000) == 0) {\n");
        !          1422:        OUT("    DATAREG(dstreg) = quotient | ");
        !          1423:        OUT("(((uint16)(dstdata % srcdata))<<16);\n");
        !          1424:         if (flags && iib->flags.set & IIB_FLAG_V)
        !          1425:           OUT("    VFLAG = 0;\n");
        !          1426:        if (flags && iib->flags.set & IIB_FLAG_N)
        !          1427:          OUT("    NFLAG = ((sint16)quotient) < 0;\n");
        !          1428:        if (flags && iib->flags.set & IIB_FLAG_Z)
        !          1429:          OUT("  ZFLAG = !((uint16)quotient);\n");
        !          1430:        if (flags && (iib->flags.set & IIB_FLAG_V ||
        !          1431:                      iib->flags.set & IIB_FLAG_N)) {
        !          1432:          OUT("  } else {\n");
        !          1433:          if (flags && iib->flags.set & IIB_FLAG_V)
        !          1434:            OUT("    VFLAG = 1;\n");
        !          1435:          if (flags && iib->flags.set & IIB_FLAG_N)
        !          1436:            OUT("    NFLAG = 1;\n");
        !          1437:        }
        !          1438:        OUT("  }\n");
        !          1439:        if (flags && iib->flags.set & IIB_FLAG_C)
        !          1440:           OUT("  CFLAG = 0;\n");
        !          1441:        break;
        !          1442: 
        !          1443:       case i_DIVS:
        !          1444:        /* DIVx is the only instruction that has different sizes for the
        !          1445:           source and destination! */
        !          1446:        if (iib->dtype != dt_Dreg)
        !          1447:          OUT("ERROR dtype\n");
        !          1448:        generate_ea(output, iib, tp_src, 1);
        !          1449:        generate_eaval(output, iib, tp_src); /* 16bit EA */
        !          1450:        generate_ea(output, iib, tp_dst, 1); /* 32bit Dn */
        !          1451:        OUT("  sint32 dstdata = DATAREG(dstreg);\n");
        !          1452:        OUT("  sint32 quotient;\n");
        !          1453:        OUT("  sint16 remainder;\n");
        !          1454:        OUT("\n");
        !          1455:        OUT("  if (srcdata == 0) {\n");
        !          1456:        fprintf(output, "    reg68k_vector(V_ZERO, PC+%d);\n",
        !          1457:                (iib->wordlen)*2);
        !          1458:        OUT("    return;\n");
        !          1459:        OUT("  }\n");
        !          1460:        OUT("  quotient = dstdata / (sint16)srcdata;\n");
        !          1461:        OUT("  remainder = dstdata % (sint16)srcdata;\n");
        !          1462:        OUT("  if (((quotient & 0xffff8000) == 0) ||\n");
        !          1463:        OUT("      ((quotient & 0xffff8000) == 0xffff8000)) {\n");
        !          1464:        OUT("    if ((quotient < 0) != (remainder < 0))\n");
        !          1465:        OUT("      remainder = -remainder;\n");
        !          1466:        OUT("    DATAREG(dstreg) = ((uint16)quotient) | ");
        !          1467:        OUT("(((uint16)(remainder))<<16);\n");
        !          1468:         if (flags && iib->flags.set & IIB_FLAG_V)
        !          1469:           OUT("    VFLAG = 0;\n");
        !          1470:        if (flags && iib->flags.set & IIB_FLAG_N)
        !          1471:          OUT("    NFLAG = ((sint16)quotient) < 0;\n");
        !          1472:        if (flags && iib->flags.set & IIB_FLAG_Z)
        !          1473:          OUT("    ZFLAG = !((uint16)quotient);\n");
        !          1474:        if (flags && (iib->flags.set & IIB_FLAG_V ||
        !          1475:                      iib->flags.set & IIB_FLAG_N)) {
        !          1476:          OUT("  } else {\n");
        !          1477:          if (flags && iib->flags.set & IIB_FLAG_V)
        !          1478:            OUT("    VFLAG = 1;\n");
        !          1479:          if (flags && iib->flags.set & IIB_FLAG_N)
        !          1480:            OUT("    NFLAG = 1;\n");
        !          1481:        }
        !          1482:        OUT("  }\n");
        !          1483:        if (flags && iib->flags.set & IIB_FLAG_C)
        !          1484:           OUT("  CFLAG = 0;\n");
        !          1485:        break;
        !          1486: 
        !          1487:       case i_ASR:
        !          1488:        generate_ea(output, iib, tp_src, 1);
        !          1489:        generate_eaval(output, iib, tp_src);
        !          1490:        generate_ea(output, iib, tp_dst, 1);
        !          1491:        generate_eaval(output, iib, tp_dst);
        !          1492:        generate_bits(output, iib);
        !          1493:        OUT("  uint8 count = srcdata & 63;\n");
        !          1494:        switch (iib->size) {
        !          1495:        case sz_byte:
        !          1496:          generate_outdata(output, iib, "((sint8)dstdata) >> "
        !          1497:                           "(count > 7 ? 7 : count)");
        !          1498:          break;
        !          1499:        case sz_word:
        !          1500:          generate_outdata(output, iib, "((sint16)dstdata) >> "
        !          1501:                           "(count > 15 ? 15 : count)");
        !          1502:          break;
        !          1503:        case sz_long:
        !          1504:          generate_outdata(output, iib, "((sint32)dstdata) >> "
        !          1505:                           "(count > 31 ? 31 : count)");
        !          1506:          break;
        !          1507:        default:
        !          1508:          OUT("ERROR size\n");
        !          1509:          break;
        !          1510:        }
        !          1511:        OUT("\n");
        !          1512:        generate_eastore(output, iib, tp_dst);
        !          1513:        if (flags) {
        !          1514:          OUT("\n");
        !          1515:          OUT("  if (!srcdata)\n");
        !          1516:          if (iib->flags.set & IIB_FLAG_C)
        !          1517:            OUT("    CFLAG = 0;\n");
        !          1518:          OUT("  else if (srcdata >= bits) {\n");
        !          1519:          if (iib->flags.set & IIB_FLAG_C)
        !          1520:            OUT("    CFLAG = dstdata>>(bits-1);\n");
        !          1521:          if (iib->flags.set & IIB_FLAG_X)
        !          1522:            OUT("    XFLAG = dstdata>>(bits-1);\n");
        !          1523:          OUT("  } else {\n");
        !          1524:          if (iib->flags.set & IIB_FLAG_C)
        !          1525:            OUT("    CFLAG = dstdata>>(count-1) & 1;\n");
        !          1526:          if (iib->flags.set & IIB_FLAG_X)
        !          1527:            OUT("    XFLAG = dstdata>>(count-1) & 1;\n");
        !          1528:          OUT("  }\n");
        !          1529:          if (iib->flags.set & IIB_FLAG_V)
        !          1530:            generate_clrflag_v(output, iib);
        !          1531:          if (iib->flags.set & IIB_FLAG_N)
        !          1532:            generate_stdflag_n(output, iib);
        !          1533:          if (iib->flags.set & IIB_FLAG_Z)
        !          1534:            generate_stdflag_z(output, iib);
        !          1535:        }
        !          1536:        break;
        !          1537: 
        !          1538:       case i_LSR:
        !          1539:        generate_ea(output, iib, tp_src, 1);
        !          1540:        generate_eaval(output, iib, tp_src);
        !          1541:        generate_ea(output, iib, tp_dst, 1);
        !          1542:        generate_eaval(output, iib, tp_dst);
        !          1543:        generate_bits(output, iib);
        !          1544:        OUT("  uint8 count = srcdata & 63;\n");
        !          1545:        generate_outdata(output, iib,
        !          1546:                         "dstdata >> (count > (bits-1) ? (bits-1) : count)");
        !          1547:        OUT("\n");
        !          1548:        generate_eastore(output, iib, tp_dst);
        !          1549:        if (flags) {
        !          1550:          OUT("\n");
        !          1551:          OUT("  if (!count)\n");
        !          1552:          if (iib->flags.set & IIB_FLAG_C)
        !          1553:            OUT("    CFLAG = 0;\n");
        !          1554:          OUT("  else if (count >= bits) {\n");
        !          1555:          if (iib->flags.set & IIB_FLAG_C)
        !          1556:            OUT("    CFLAG = (count == bits) ? dstdata>>(bits-1) : 0;\n");
        !          1557:          if (iib->flags.set & IIB_FLAG_X)
        !          1558:            OUT("    XFLAG = (count == bits) ? dstdata>>(bits-1) : 0;\n");
        !          1559:          OUT("  } else {\n");
        !          1560:          if (iib->flags.set & IIB_FLAG_C)
        !          1561:            OUT("    CFLAG = dstdata>>(count-1) & 1;\n");
        !          1562:          if (iib->flags.set & IIB_FLAG_X)
        !          1563:            OUT("    XFLAG = dstdata>>(count-1) & 1;\n");
        !          1564:          OUT("  }\n");
        !          1565:          if (iib->flags.set & IIB_FLAG_V)
        !          1566:            generate_clrflag_v(output, iib);
        !          1567:          if (iib->flags.set & IIB_FLAG_N)
        !          1568:            generate_stdflag_n(output, iib);
        !          1569:          if (iib->flags.set & IIB_FLAG_Z)
        !          1570:            generate_stdflag_z(output, iib);
        !          1571:        }
        !          1572:        break;
        !          1573: 
        !          1574:       case i_ASL:
        !          1575:        generate_ea(output, iib, tp_src, 1);
        !          1576:        generate_eaval(output, iib, tp_src);
        !          1577:        generate_ea(output, iib, tp_dst, 1);
        !          1578:        generate_eaval(output, iib, tp_dst);
        !          1579:        generate_bits(output, iib);
        !          1580:        OUT("  uint8 count = srcdata & 63;\n");
        !          1581:        generate_outdata(output, iib,
        !          1582:                         "count >= bits ? 0 : (dstdata << count)");
        !          1583:        OUT("\n");
        !          1584:        generate_eastore(output, iib, tp_dst);
        !          1585:        if (flags) {
        !          1586:          OUT("\n");
        !          1587:          OUT("  if (!count)\n");
        !          1588:          if (iib->flags.set & IIB_FLAG_C)
        !          1589:            OUT("    CFLAG = 0;\n");
        !          1590:          OUT("  else if (count >= bits) {\n");
        !          1591:          if (iib->flags.set & IIB_FLAG_C)
        !          1592:            OUT("    CFLAG = (count == bits) ? dstdata & 1 : 0;\n");
        !          1593:          if (iib->flags.set & IIB_FLAG_X)
        !          1594:            OUT("    XFLAG = (count == bits) ? dstdata & 1 : 0;\n");
        !          1595:          if (iib->flags.set & IIB_FLAG_V)
        !          1596:            OUT("    VFLAG = !dstdata;\n");
        !          1597:          OUT("  } else {\n");
        !          1598:          if (iib->flags.set & IIB_FLAG_C)
        !          1599:            OUT("    CFLAG = dstdata>>(bits-count) & 1;\n");
        !          1600:          if (iib->flags.set & IIB_FLAG_X)
        !          1601:            OUT("    XFLAG = dstdata>>(bits-count) & 1;\n");
        !          1602:          if (iib->flags.set & IIB_FLAG_V) {
        !          1603:            OUT("    {\n");
        !          1604:            switch (iib->size) {
        !          1605:            case sz_byte:
        !          1606:              OUT("      uint8 mask = 0xff << (7-count);\n")
        !          1607:                break;
        !          1608:            case sz_word:
        !          1609:              OUT("      uint16 mask = 0xffff << (15-count);\n");
        !          1610:              break;
        !          1611:            case sz_long:
        !          1612:              OUT("      uint32 mask = 0xffffffff <<(31-count);\n");
        !          1613:              break;
        !          1614:            default:
        !          1615:              OUT("ERROR size\n");
        !          1616:              break;
        !          1617:            }
        !          1618:            OUT("      VFLAG = ((dstdata & mask) != mask) && ");
        !          1619:            OUT("((dstdata & mask) != 0);\n");
        !          1620:            OUT("    }\n");
        !          1621:            OUT("  }\n");
        !          1622:          }
        !          1623:          if (iib->flags.set & IIB_FLAG_N)
        !          1624:            generate_stdflag_n(output, iib);
        !          1625:          if (iib->flags.set & IIB_FLAG_Z)
        !          1626:            generate_stdflag_z(output, iib);
        !          1627:        }
        !          1628:        break;
        !          1629: 
        !          1630:       case i_LSL:
        !          1631:        generate_ea(output, iib, tp_src, 1);
        !          1632:        generate_eaval(output, iib, tp_src);
        !          1633:        generate_ea(output, iib, tp_dst, 1);
        !          1634:        generate_eaval(output, iib, tp_dst);
        !          1635:        generate_bits(output, iib);
        !          1636:        OUT("  uint8 count = srcdata & 63;\n");
        !          1637:        generate_outdata(output, iib,
        !          1638:                         "count >= bits ? 0 : (dstdata << count)");
        !          1639:        OUT("\n");
        !          1640:        generate_eastore(output, iib, tp_dst);
        !          1641:        if (flags) {
        !          1642:          OUT("\n");
        !          1643:          OUT("  if (!count)\n");
        !          1644:          if (iib->flags.set & IIB_FLAG_C)
        !          1645:            OUT("    CFLAG = 0;\n");
        !          1646:          OUT("  else if (count >= bits) {\n");
        !          1647:          if (iib->flags.set & IIB_FLAG_C)
        !          1648:            OUT("    CFLAG = (count == bits) ? dstdata & 1 : 0;\n");
        !          1649:          if (iib->flags.set & IIB_FLAG_X)
        !          1650:            OUT("    XFLAG = (count == bits) ? dstdata & 1 : 0;\n");
        !          1651:          OUT("  } else {\n");
        !          1652:          if (iib->flags.set & IIB_FLAG_C)
        !          1653:            OUT("    CFLAG = dstdata>>(bits-count) & 1;\n");
        !          1654:          if (iib->flags.set & IIB_FLAG_X)
        !          1655:            OUT("    XFLAG = dstdata>>(bits-count) & 1;\n");
        !          1656:          OUT("  }\n");
        !          1657:          if (iib->flags.set & IIB_FLAG_V)
        !          1658:            generate_clrflag_v(output, iib);
        !          1659:          if (iib->flags.set & IIB_FLAG_N)
        !          1660:            generate_stdflag_n(output, iib);
        !          1661:          if (iib->flags.set & IIB_FLAG_Z)
        !          1662:            generate_stdflag_z(output, iib);
        !          1663:        }
        !          1664:        break;
        !          1665: 
        !          1666:        /* 64 */
        !          1667: 
        !          1668:       case i_ROXR:
        !          1669:       case i_ROXL:
        !          1670:        generate_ea(output, iib, tp_src, 1);
        !          1671:        generate_eaval(output, iib, tp_src);
        !          1672:        generate_ea(output, iib, tp_dst, 1);
        !          1673:        generate_eaval(output, iib, tp_dst);
        !          1674:        generate_bits(output, iib);
        !          1675:        OUT("  uint8 loop = srcdata & 63;\n");
        !          1676:        OUT("  uint8 cflag = CFLAG;\n");
        !          1677:        OUT("  uint8 xflag = XFLAG;\n");
        !          1678:        generate_outdata(output, iib, "dstdata");
        !          1679:        OUT("\n");
        !          1680:        if (iib->mnemonic == i_ROXR) {
        !          1681:          OUT("  while(loop) {\n");
        !          1682:          OUT("    cflag = outdata & 1;\n");
        !          1683:          OUT("    outdata>>= 1;\n");
        !          1684:          OUT("    if (xflag)\n");
        !          1685:          OUT("      outdata |= 1<<(bits-1);\n");
        !          1686:          OUT("    xflag = cflag;\n");
        !          1687:          OUT("    loop--;\n");
        !          1688:          OUT("  }\n");
        !          1689:        } else {
        !          1690:          OUT("  while(loop) {\n");
        !          1691:          OUT("    cflag = outdata & 1<<(bits-1) ? 1 : 0;\n");
        !          1692:          OUT("    outdata<<= 1;\n");
        !          1693:          OUT("    outdata |= xflag;\n");
        !          1694:          OUT("    xflag = cflag;\n");
        !          1695:          OUT("    loop--;\n");
        !          1696:          OUT("  }\n");
        !          1697:        }
        !          1698:        generate_eastore(output, iib, tp_dst);
        !          1699:        if (flags)
        !          1700:          OUT("\n");
        !          1701:        if (flags && iib->flags.set & IIB_FLAG_X)
        !          1702:          OUT("  XFLAG = xflag;\n");
        !          1703:        if (flags && iib->flags.set & IIB_FLAG_C)
        !          1704:          OUT("  CFLAG = xflag;\n");
        !          1705:        if (flags && iib->flags.set & IIB_FLAG_N)
        !          1706:          generate_stdflag_n(output, iib);
        !          1707:        if (flags && iib->flags.set & IIB_FLAG_Z)
        !          1708:          generate_stdflag_z(output, iib);
        !          1709:        if (flags && iib->flags.set & IIB_FLAG_V)
        !          1710:          generate_clrflag_v(output, iib);
        !          1711:        break;
        !          1712: 
        !          1713:       case i_ROR:
        !          1714:       case i_ROL:
        !          1715:        generate_ea(output, iib, tp_src, 1);
        !          1716:        generate_eaval(output, iib, tp_src);
        !          1717:        generate_ea(output, iib, tp_dst, 1);
        !          1718:        generate_eaval(output, iib, tp_dst);
        !          1719:        generate_bits(output, iib);
        !          1720:        OUT("  uint8 loop = srcdata & 63;\n");
        !          1721:        OUT("  uint8 cflag = 0;\n");
        !          1722:        generate_outdata(output, iib, "dstdata");
        !          1723:        OUT("\n");
        !          1724:        if (iib->mnemonic == i_ROR) {
        !          1725:          OUT("  while(loop) {\n");
        !          1726:          OUT("    cflag = outdata & 1;\n");
        !          1727:          OUT("    outdata>>= 1;\n");
        !          1728:          OUT("    if (cflag)\n");
        !          1729:          OUT("      outdata |= 1<<(bits-1);\n");
        !          1730:          OUT("    loop--;\n");
        !          1731:          OUT("  }\n");
        !          1732:        } else {
        !          1733:          OUT("  while(loop) {\n");
        !          1734:          OUT("    cflag = outdata & 1<<(bits-1) ? 1 : 0;\n");
        !          1735:          OUT("    outdata<<= 1;\n");
        !          1736:          OUT("    if (cflag)\n");
        !          1737:          OUT("      outdata |= 1;\n");
        !          1738:          OUT("    loop--;\n");
        !          1739:          OUT("  }\n");
        !          1740:        }
        !          1741:        generate_eastore(output, iib, tp_dst);
        !          1742:        if (flags)
        !          1743:          OUT("\n");
        !          1744:        if (flags && iib->flags.set & IIB_FLAG_C)
        !          1745:          OUT("  CFLAG = cflag;\n");
        !          1746:        if (flags && iib->flags.set & IIB_FLAG_N)
        !          1747:          generate_stdflag_n(output, iib);
        !          1748:        if (flags && iib->flags.set & IIB_FLAG_Z)
        !          1749:          generate_stdflag_z(output, iib);
        !          1750:        if (flags && iib->flags.set & IIB_FLAG_V)
        !          1751:          generate_clrflag_v(output, iib);
        !          1752:        break;
        !          1753: 
        !          1754:       case i_LINE10:
        !          1755:        OUT("\n");
        !          1756:        fprintf(output, "  reg68k_vector(V_LINE10, PC);\n");
        !          1757:        pcinc = 0;
        !          1758:        break;
        !          1759: 
        !          1760:       case i_LINE15:
        !          1761:        OUT("\n");
        !          1762:        fprintf(output, "  reg68k_vector(V_LINE15, PC);\n");
        !          1763:        pcinc = 0;
        !          1764:        break;
        !          1765: 
        !          1766:       case i_ILLG:
        !          1767:         OUT("  printf(\"Illegal instruction @ %x\\n\", PC);\n");
        !          1768:        OUT("  exit(1);\n");
        !          1769:        break;
        !          1770: 
        !          1771:       } /* switch */
        !          1772: 
        !          1773:       if (pcinc) {
        !          1774:        fprintf(output, "  PC+= %d;\n", (iib->wordlen)*2);
        !          1775:       }
        !          1776: 
        !          1777:       OUT("}\n\n");
        !          1778:     }
        !          1779: 
        !          1780:   }
        !          1781: }
        !          1782: 
        !          1783: void generate_ea(FILE *o, t_iib *iib, t_type type, int update)
        !          1784: {
        !          1785:   t_datatype datatype = type ? iib->dtype : iib->stype;
        !          1786: 
        !          1787:   /* generate information about EA to be used in calculations */
        !          1788: 
        !          1789:   switch(datatype) {
        !          1790:   case dt_Dreg:
        !          1791:   case dt_Areg:
        !          1792:   case dt_Aind:
        !          1793:   case dt_Ainc:
        !          1794:   case dt_Adec:
        !          1795:   case dt_Adis:
        !          1796:   case dt_Aidx:
        !          1797:     if (type == tp_src)
        !          1798:       fprintf(o, "  int srcreg = (ipc->opcode >> %d) & 7;\n", iib->sbitpos);
        !          1799:     else
        !          1800:       fprintf(o, "  int dstreg = (ipc->opcode >> %d) & 7;\n", iib->dbitpos);
        !          1801:     break;
        !          1802:   default:
        !          1803:     break;
        !          1804:   }
        !          1805: 
        !          1806:   if (datatype == dt_Ainc && update) {
        !          1807: 
        !          1808:     /* Ainc and update */
        !          1809: 
        !          1810:     switch(iib->size) {
        !          1811:     case sz_byte:
        !          1812:       if (type == tp_src) {
        !          1813:        fprintf(o, "  uint32 srcaddr = ADDRREG(srcreg);\n");
        !          1814:        fprintf(o, "  uint32 srcaddr_tmp = (ADDRREG(srcreg)+= "
        !          1815:                "(srcreg == 7 ? 2 : 1), 0);\n");
        !          1816:       } else {
        !          1817:        fprintf(o, "  uint32 dstaddr = ADDRREG(dstreg);\n");
        !          1818:        fprintf(o, "  uint32 dstaddr_tmp = (ADDRREG(dstreg)+= "
        !          1819:                "(dstreg == 7 ? 2 : 1), 0);\n");
        !          1820:       }
        !          1821:       break;
        !          1822:     case sz_word:
        !          1823:       if (type == tp_src)
        !          1824:        fprintf(o, "  uint32 srcaddr = (ADDRREG(srcreg)+=2, "
        !          1825:                "ADDRREG(srcreg)-2);\n");
        !          1826:       else
        !          1827:        fprintf(o, "  uint32 dstaddr = (ADDRREG(dstreg)+=2, "
        !          1828:                "ADDRREG(dstreg)-2);\n");
        !          1829:       break;
        !          1830:     case sz_long:
        !          1831:       if (type == tp_src)
        !          1832:        fprintf(o, "  uint32 srcaddr = (ADDRREG(srcreg)+=4, "
        !          1833:                "ADDRREG(srcreg)-4);\n");
        !          1834:       else
        !          1835:        fprintf(o, "  uint32 dstaddr = (ADDRREG(dstreg)+=4, "
        !          1836:                "ADDRREG(dstreg)-4);\n");
        !          1837:       break;
        !          1838:     default:
        !          1839:       fprintf(o, "ERROR size\n");
        !          1840:       break;
        !          1841:     }
        !          1842: 
        !          1843:   } else if (datatype == dt_Adec && update) {
        !          1844: 
        !          1845:     /* Adec and update */
        !          1846: 
        !          1847:     switch(iib->size) {
        !          1848:     case sz_byte:
        !          1849:       if (type == tp_src) {
        !          1850:        fprintf(o, "  uint32 srcaddr = (ADDRREG(srcreg)-= "
        !          1851:                "(srcreg == 7 ? 2 : 1));\n");
        !          1852:       } else {
        !          1853:        fprintf(o, "  uint32 dstaddr = (ADDRREG(dstreg)-= "
        !          1854:                "(dstreg == 7 ? 2 : 1));\n");
        !          1855:       }
        !          1856:       break;
        !          1857:     case sz_word:
        !          1858:       if (type == tp_src)
        !          1859:        fprintf(o, "  uint32 srcaddr = ADDRREG(srcreg)-=2;\n");
        !          1860:       else
        !          1861:        fprintf(o, "  uint32 dstaddr = ADDRREG(dstreg)-=2;\n");
        !          1862:       break;
        !          1863:     case sz_long:
        !          1864:       if (type == tp_src)
        !          1865:        fprintf(o, "  uint32 srcaddr = ADDRREG(srcreg)-=4;\n");
        !          1866:       else
        !          1867:        fprintf(o, "  uint32 dstaddr = ADDRREG(dstreg)-=4;\n");
        !          1868:       break;
        !          1869:     default:
        !          1870:       fprintf(o, "ERROR size\n");
        !          1871:       break;
        !          1872:     }
        !          1873: 
        !          1874:   } else {
        !          1875: 
        !          1876:     /* no update required */
        !          1877: 
        !          1878:     switch(datatype) {
        !          1879:     case dt_Dreg:
        !          1880:     case dt_Areg:
        !          1881:       break;
        !          1882:     case dt_Aind:
        !          1883:     case dt_Adec:
        !          1884:     case dt_Ainc:
        !          1885:       if (type == tp_src)
        !          1886:        fprintf(o, "  uint32 srcaddr = ADDRREG(srcreg);\n");
        !          1887:       else
        !          1888:        fprintf(o, "  uint32 dstaddr = ADDRREG(dstreg);\n");
        !          1889:       break;
        !          1890:     case dt_Adis:
        !          1891:       if (type == tp_src)
        !          1892:        fprintf(o, "  uint32 srcaddr = (sint32)ADDRREG(srcreg) + "
        !          1893:                "(sint32)(sint16)ipc->src;\n");
        !          1894:       else
        !          1895:        fprintf(o, "  uint32 dstaddr = (sint32)ADDRREG(dstreg) + "
        !          1896:                "(sint32)(sint16)ipc->dst;\n");
        !          1897:       break;
        !          1898:     case dt_Aidx:
        !          1899:       if (type == tp_src) {
        !          1900:        fprintf(o, "  uint32 srcaddr = (sint32)ADDRREG(srcreg) + "
        !          1901:                "idxval_src(ipc);\n");
        !          1902:       } else {
        !          1903:        fprintf(o, "  uint32 dstaddr = (sint32)ADDRREG(dstreg) + "
        !          1904:                "idxval_dst(ipc);\n");
        !          1905:       }
        !          1906:       break;
        !          1907:     case dt_AbsW:
        !          1908:     case dt_AbsL:
        !          1909:     case dt_Pdis:
        !          1910:       if (type == tp_src)
        !          1911:        fprintf(o, "  uint32 srcaddr = ipc->src;\n");
        !          1912:       else
        !          1913:        fprintf(o, "  uint32 dstaddr = ipc->dst;\n");
        !          1914:       break;
        !          1915:     case dt_Pidx:
        !          1916:       if (type == tp_src) {
        !          1917:        fprintf(o, "  uint32 srcaddr = idxval_src(ipc);\n");
        !          1918:       } else {
        !          1919:        fprintf(o, "  uint32 dstaddr = idxval_dst(ipc);\n");
        !          1920:       }
        !          1921:       break;
        !          1922:     case dt_ImmB:
        !          1923:     case dt_ImmW:
        !          1924:     case dt_ImmL:
        !          1925:     case dt_ImmS:
        !          1926:     case dt_Imm3:
        !          1927:     case dt_Imm4:
        !          1928:     case dt_Imm8:
        !          1929:     case dt_Imm8s:
        !          1930:       /* no address - it is immediate */
        !          1931:       break;
        !          1932:     default:
        !          1933:       fprintf(o, "ERROR\n");
        !          1934:       break;
        !          1935:     }
        !          1936:   }
        !          1937: }
        !          1938: 
        !          1939: void generate_eaval(FILE *o, t_iib *iib, t_type type)
        !          1940: {
        !          1941:   t_datatype datatype = type ? iib->dtype : iib->stype;
        !          1942: 
        !          1943:   /* get value in EA */
        !          1944: 
        !          1945:   switch(datatype) {
        !          1946:   case dt_Dreg:
        !          1947:     switch(iib->size) {
        !          1948:     case sz_byte:
        !          1949:       if (type == tp_src)
        !          1950:        fprintf(o, "  uint8 srcdata = DATAREG(srcreg);\n");
        !          1951:       else
        !          1952:        fprintf(o, "  uint8 dstdata = DATAREG(dstreg);\n");
        !          1953:       break;
        !          1954:     case sz_word:
        !          1955:       if (type == tp_src)
        !          1956:        fprintf(o, "  uint16 srcdata = DATAREG(srcreg);\n");
        !          1957:       else
        !          1958:        fprintf(o, "  uint16 dstdata = DATAREG(dstreg);\n");
        !          1959:       break;
        !          1960:     case sz_long:
        !          1961:       if (type == tp_src)
        !          1962:        fprintf(o, "  uint32 srcdata = DATAREG(srcreg);\n");
        !          1963:       else
        !          1964:        fprintf(o, "  uint32 dstdata = DATAREG(dstreg);\n");
        !          1965:       break;
        !          1966:     default:
        !          1967:       fprintf(o, "ERROR size\n");
        !          1968:       break;
        !          1969:     }
        !          1970:     break;
        !          1971:   case dt_Areg:
        !          1972:     switch(iib->size) {
        !          1973:     case sz_byte:
        !          1974:       if (type == tp_src)
        !          1975:        fprintf(o, "  uint8 srcdata = ADDRREG(srcreg);\n");
        !          1976:       else
        !          1977:        fprintf(o, "  uint8 dstdata = ADDRREG(dstreg);\n");
        !          1978:       break;
        !          1979:     case sz_word:
        !          1980:       if (type == tp_src)
        !          1981:        fprintf(o, "  uint16 srcdata = ADDRREG(srcreg);\n");
        !          1982:       else
        !          1983:        fprintf(o, "  uint16 dstdata = ADDRREG(dstreg);\n");
        !          1984:       break;
        !          1985:     case sz_long:
        !          1986:       if (type == tp_src)
        !          1987:        fprintf(o, "  uint32 srcdata = ADDRREG(srcreg);\n");
        !          1988:       else
        !          1989:        fprintf(o, "  uint32 dstdata = ADDRREG(dstreg);\n");
        !          1990:       break;
        !          1991:     default:
        !          1992:       fprintf(o, "ERROR size\n");
        !          1993:       break;
        !          1994:     }
        !          1995:     break;
        !          1996:   case dt_Aind:
        !          1997:   case dt_Adec:
        !          1998:   case dt_Ainc:
        !          1999:   case dt_Adis:
        !          2000:   case dt_Aidx:
        !          2001:   case dt_AbsW:
        !          2002:   case dt_AbsL:
        !          2003:   case dt_Pdis:
        !          2004:   case dt_Pidx:
        !          2005:     switch(iib->size) {
        !          2006:     case sz_byte:
        !          2007:       if (type == tp_src)
        !          2008:        fprintf(o, "  uint8 srcdata = fetchbyte(srcaddr);\n");
        !          2009:       else
        !          2010:        fprintf(o, "  uint8 dstdata = fetchbyte(dstaddr);\n");
        !          2011:       break;
        !          2012:     case sz_word:
        !          2013:       if (type == tp_src)
        !          2014:        fprintf(o, "  uint16 srcdata = fetchword(srcaddr);\n");
        !          2015:       else
        !          2016:        fprintf(o, "  uint16 dstdata = fetchword(dstaddr);\n");
        !          2017:       break;
        !          2018:     case sz_long:
        !          2019:       if (type == tp_src)
        !          2020:        fprintf(o, "  uint32 srcdata = fetchlong(srcaddr);\n");
        !          2021:       else
        !          2022:        fprintf(o, "  uint32 dstdata = fetchlong(dstaddr);\n");
        !          2023:       break;
        !          2024:     default:
        !          2025:       fprintf(o, "ERROR size\n");
        !          2026:       break;
        !          2027:     }
        !          2028:     break;
        !          2029:   case dt_ImmB:
        !          2030:     if (type == tp_src)
        !          2031:       fprintf(o, "  uint8 srcdata = ipc->src;\n");
        !          2032:     else
        !          2033:       fprintf(o, "  uint8 dstdata = ipc->dst;\n");
        !          2034:     break;
        !          2035:   case dt_ImmW:
        !          2036:     if (type == tp_src)
        !          2037:       fprintf(o, "  uint16 srcdata = ipc->src;\n");
        !          2038:     else
        !          2039:       fprintf(o, "  uint16 dstdata = ipc->dst;\n");
        !          2040:     break;
        !          2041:   case dt_ImmL:
        !          2042:     if (type == tp_src)
        !          2043:       fprintf(o, "  uint32 srcdata = ipc->src;\n");
        !          2044:     else
        !          2045:       fprintf(o, "  uint32 dstdata = ipc->dst;\n");
        !          2046:     break;
        !          2047:   case dt_ImmS:
        !          2048:     if (type == tp_src)
        !          2049:       fprintf(o, "  unsigned int srcdata = %d;\n", iib->immvalue);
        !          2050:     else
        !          2051:       fprintf(o, "  unsigned int dstdata = %d;\n", iib->immvalue);
        !          2052:     break;
        !          2053:   case dt_Imm3:
        !          2054:   case dt_Imm4:
        !          2055:   case dt_Imm8:
        !          2056:     if (type == tp_src)
        !          2057:       fprintf(o, "  unsigned int srcdata = ipc->src;\n");
        !          2058:     else
        !          2059:       fprintf(o, "  unsigned int dstdata = ipc->dst;\n");
        !          2060:     break;
        !          2061:   case dt_Imm8s:
        !          2062:     if (type == tp_src)
        !          2063:       fprintf(o, "  signed int srcdata = ipc->src;\n");
        !          2064:     else
        !          2065:       fprintf(o, "  signed int dstdata = ipc->dst;\n");
        !          2066:     break;
        !          2067:   default:
        !          2068:     fprintf(o, "ERROR\n");
        !          2069:   }
        !          2070: }
        !          2071: 
        !          2072: void generate_eastore(FILE *o, t_iib *iib, t_type type)
        !          2073: {
        !          2074:   /* get value in EA */
        !          2075: 
        !          2076:   switch(type == tp_dst ? iib->dtype : iib->stype) {
        !          2077:   case dt_Dreg:
        !          2078:     switch (iib->size) {
        !          2079:     case sz_byte:
        !          2080:       if (type == tp_src)
        !          2081:         fprintf(o, "  DATAREG(srcreg) = (DATAREG(srcreg) & ~0xff) | "
        !          2082:                "outdata;\n");
        !          2083:       else
        !          2084:        fprintf(o, "  DATAREG(dstreg) = (DATAREG(dstreg) & ~0xff) | "
        !          2085:                "outdata;\n");
        !          2086:       break;
        !          2087:     case sz_word:
        !          2088:       if (type == tp_src)
        !          2089:        fprintf(o, "  DATAREG(srcreg) = (DATAREG(srcreg) & ~0xffff) | "
        !          2090:                "outdata;\n");
        !          2091:       else
        !          2092:        fprintf(o, "  DATAREG(dstreg) = (DATAREG(dstreg) & ~0xffff) | "
        !          2093:                "outdata;\n");
        !          2094:       break;
        !          2095:     case sz_long:
        !          2096:       if (type == tp_src)
        !          2097:        fprintf(o, "  DATAREG(srcreg) = outdata;\n");
        !          2098:       else
        !          2099:        fprintf(o, "  DATAREG(dstreg) = outdata;\n");
        !          2100:       break;
        !          2101:     default:
        !          2102:       fprintf(o, "ERROR size\n");
        !          2103:       break;
        !          2104:     }
        !          2105:     break;
        !          2106:   case dt_Areg:
        !          2107:     switch(iib->size) {
        !          2108:     case sz_byte:
        !          2109:       if (type == tp_src)
        !          2110:        fprintf(o, "  ADDRREG(srcreg) = (ADDRREG(srcreg) & ~0xff) | "
        !          2111:                "outdata;\n");
        !          2112:       else
        !          2113:        fprintf(o, "  ADDRREG(dstreg) = (ADDRREG(dstreg) & ~0xff) | "
        !          2114:                "outdata;\n");
        !          2115:       break;
        !          2116:     case sz_word:
        !          2117:       if (type == tp_src)
        !          2118:        fprintf(o, "  ADDRREG(srcreg) = (ADDRREG(srcreg) & ~0xffff) | "
        !          2119:                "outdata;\n");
        !          2120:       else
        !          2121:        fprintf(o, "  ADDRREG(dstreg) = (ADDRREG(dstreg) & ~0xffff) | "
        !          2122:                "outdata;\n");
        !          2123:       break;
        !          2124:     case sz_long:
        !          2125:       if (type == tp_src)
        !          2126:        fprintf(o, "  ADDRREG(srcreg) = outdata;\n");
        !          2127:       else
        !          2128:        fprintf(o, "  ADDRREG(dstreg) = outdata;\n");
        !          2129:       break;
        !          2130:     default:
        !          2131:       fprintf(o, "ERROR size\n");
        !          2132:       break;
        !          2133:     }
        !          2134:     break;
        !          2135:   case dt_Aind:
        !          2136:   case dt_Ainc:
        !          2137:   case dt_Adec:
        !          2138:   case dt_Adis:
        !          2139:   case dt_Aidx:
        !          2140:   case dt_AbsW:
        !          2141:   case dt_AbsL:
        !          2142:   case dt_Pdis:
        !          2143:   case dt_Pidx:
        !          2144:     switch(iib->size) {
        !          2145:     case sz_byte:
        !          2146:       if (type == tp_src)
        !          2147:        fprintf(o, "  storebyte(srcaddr, outdata);\n");
        !          2148:       else
        !          2149:        fprintf(o, "  storebyte(dstaddr, outdata);\n");
        !          2150:       break;
        !          2151:     case sz_word:
        !          2152:       if (type == tp_src)
        !          2153:        fprintf(o, "  storeword(srcaddr, outdata);\n");
        !          2154:       else
        !          2155:        fprintf(o, "  storeword(dstaddr, outdata);\n");
        !          2156:       break;
        !          2157:     case sz_long:
        !          2158:       if (type == tp_src)
        !          2159:        fprintf(o, "  storelong(srcaddr, outdata);\n");
        !          2160:       else
        !          2161:        fprintf(o, "  storelong(dstaddr, outdata);\n");
        !          2162:       break;
        !          2163:     default:
        !          2164:       fprintf(o, "ERROR size\n");
        !          2165:     }
        !          2166:     break;
        !          2167:   default:
        !          2168:     fprintf(o, "ERROR type\n");
        !          2169:   }
        !          2170: }
        !          2171: 
        !          2172: void generate_outdata(FILE *o, t_iib *iib, const char *init)
        !          2173: {
        !          2174:   switch(iib->size) {
        !          2175:   case sz_byte:
        !          2176:     fprintf(o, "  uint8 ");
        !          2177:     break;
        !          2178:   case sz_word:
        !          2179:     fprintf(o, "  uint16 ");
        !          2180:     break;
        !          2181:   case sz_long:
        !          2182:     fprintf(o, "  uint32 ");
        !          2183:     break;
        !          2184:   default:
        !          2185:     fprintf(o, "ERROR size\n");
        !          2186:     break;
        !          2187:   }
        !          2188:   fprintf(o, "outdata%s%s;\n", (init && init[0]) ? " = " : "",
        !          2189:          init ? init : "");
        !          2190: }
        !          2191: 
        !          2192: void generate_cc(FILE *o, t_iib *iib)
        !          2193: {
        !          2194:   switch(iib->cc) {
        !          2195:   case 0:                                                     /*  T */
        !          2196:     fprintf(o, "  uint8 cc = 1;\n");
        !          2197:     break;
        !          2198:   case 1:                                                     /*  F */
        !          2199:     fprintf(o, "  uint8 cc = 0;\n");
        !          2200:     break;
        !          2201:   case 2:                                                     /* HI */
        !          2202:     fprintf(o, "  uint8 cc = !(CFLAG || ZFLAG);\n");
        !          2203:     break;
        !          2204:   case 3:                                                     /* LS */
        !          2205:     fprintf(o, "  uint8 cc = CFLAG || ZFLAG;\n");
        !          2206:     break;
        !          2207:   case 4:                                                     /* CC */
        !          2208:     fprintf(o, "  uint8 cc = !CFLAG;\n");
        !          2209:     break;
        !          2210:   case 5:                                                     /* CS */
        !          2211:     fprintf(o, "  uint8 cc = CFLAG;\n");
        !          2212:     break;
        !          2213:   case 6:                                                     /* NE */
        !          2214:     fprintf(o, "  uint8 cc = !ZFLAG;\n");
        !          2215:     break;
        !          2216:   case 7:                                                     /* EQ */
        !          2217:     fprintf(o, "  uint8 cc = ZFLAG;\n");
        !          2218:     break;
        !          2219:   case 8:                                                     /* VC */
        !          2220:     fprintf(o, "  uint8 cc = !VFLAG;\n");
        !          2221:     break;
        !          2222:   case 9:                                                     /* VS */
        !          2223:     fprintf(o, "  uint8 cc = VFLAG;\n");
        !          2224:     break;
        !          2225:   case 10:                                                    /* PL */
        !          2226:     fprintf(o, "  uint8 cc = !NFLAG;\n");
        !          2227:     break;
        !          2228:   case 11:                                                    /* MI */
        !          2229:     fprintf(o, "  uint8 cc = NFLAG;\n");
        !          2230:     break;
        !          2231:   case 12:                                                    /* GE */
        !          2232:     fprintf(o, "  uint8 cc = (NFLAG == VFLAG);\n");
        !          2233:     break;
        !          2234:   case 13:                                                    /* LT */
        !          2235:     fprintf(o, "  uint8 cc = (NFLAG != VFLAG);\n");
        !          2236:     break;
        !          2237:   case 14:                                                    /* GT */
        !          2238:     fprintf(o, "  uint8 cc = !ZFLAG && (NFLAG == VFLAG);\n");
        !          2239:     break;
        !          2240:   case 15:                                                    /* LE */
        !          2241:     fprintf(o, "  uint8 cc = ZFLAG || (NFLAG != VFLAG);\n");
        !          2242:     break;
        !          2243:   default:
        !          2244:     fprintf(o, "ERROR cc\n");
        !          2245:     break;
        !          2246:   }
        !          2247: }
        !          2248: 
        !          2249: void generate_stdflag_n(FILE *o, t_iib *iib)
        !          2250: {
        !          2251:   switch(iib->size) {
        !          2252:   case sz_byte:
        !          2253:     fprintf(o, "  NFLAG = ((sint8)outdata) < 0;\n");
        !          2254:     break;
        !          2255:   case sz_word:
        !          2256:     fprintf(o, "  NFLAG = ((sint16)outdata) < 0;\n");
        !          2257:     break;
        !          2258:   case sz_long:
        !          2259:     fprintf(o, "  NFLAG = ((sint32)outdata) < 0;\n");
        !          2260:     break;
        !          2261:   default:
        !          2262:     fprintf(o, "ERROR size\n");
        !          2263:     break;
        !          2264:   }
        !          2265: }
        !          2266: 
        !          2267: void generate_stdflag_z(FILE *o, t_iib *iib)
        !          2268: {
        !          2269:   fprintf(o, "  ZFLAG = !outdata;\n");
        !          2270: }
        !          2271: 
        !          2272: void generate_clrflag_v(FILE *o, t_iib *iib)
        !          2273: {
        !          2274:   fprintf(o, "  VFLAG = 0;\n");
        !          2275: }
        !          2276: 
        !          2277: void generate_clrflag_c(FILE *o, t_iib *iib)
        !          2278: {
        !          2279:   fprintf(o, "  CFLAG = 0;\n");
        !          2280: }
        !          2281: 
        !          2282: void generate_clrflag_n(FILE *o, t_iib *iib)
        !          2283: {
        !          2284:   fprintf(o, "  NFLAG = 0;\n");
        !          2285: }
        !          2286: 
        !          2287: void generate_setflag_z(FILE *o, t_iib *iib)
        !          2288: {
        !          2289:   fprintf(o, "  ZFLAG = 1;\n");
        !          2290: }
        !          2291: 
        !          2292: void generate_subflag_c(FILE *o, t_iib *iib)
        !          2293: {
        !          2294:   /* C = (Sm && !Dm) || (Rm && !Dm) || (Sm && Rm)
        !          2295:      carry is performed as if both source and destination are unsigned,
        !          2296:      so this is simply if the source is greater than the destination - I
        !          2297:      have proven this to be the case using a truth table and the above
        !          2298:      motorola definition */
        !          2299:   fprintf(o, "  CFLAG = srcdata > dstdata;\n");
        !          2300: }
        !          2301: 
        !          2302: void generate_subflag_cx(FILE *o, t_iib *iib)
        !          2303: {
        !          2304:   /* C = (Sm && !Dm) || (Rm && !Dm) || (Sm && Rm)
        !          2305:      carry is performed as if both source and destination are unsigned,
        !          2306:      so this is simply if the source is greater than the destination - I
        !          2307:      have proven this to be the case using a truth table and the above
        !          2308:      motorola definition */
        !          2309:   fprintf(o, "  XFLAG = CFLAG = srcdata > dstdata;\n");
        !          2310: }
        !          2311: 
        !          2312: void generate_subxflag_cx(FILE *o, t_iib *iib)
        !          2313: {
        !          2314:   /* V = (Sm && !Dm) || (Rm && (!Dm || Sm)) */
        !          2315:   fprintf(o, "  {\n");
        !          2316:   switch(iib->size) {
        !          2317:   case sz_byte:
        !          2318:     fprintf(o, "    int Sm = (sint8)srcdata < 0;\n");
        !          2319:     fprintf(o, "    int Dm = (sint8)dstdata < 0;\n");
        !          2320:     fprintf(o, "    int Rm = (sint8)outdata < 0;\n");
        !          2321:     break;
        !          2322:   case sz_word:
        !          2323:     fprintf(o, "    int Sm = (sint16)srcdata < 0;\n");
        !          2324:     fprintf(o, "    int Dm = (sint16)dstdata < 0;\n");
        !          2325:     fprintf(o, "    int Rm = (sint16)outdata < 0;\n");
        !          2326:     break;
        !          2327:   case sz_long:
        !          2328:     fprintf(o, "    int Sm = (sint32)srcdata < 0;\n");
        !          2329:     fprintf(o, "    int Dm = (sint32)dstdata < 0;\n");
        !          2330:     fprintf(o, "    int Rm = (sint32)outdata < 0;\n");
        !          2331:     break;
        !          2332:   default:
        !          2333:     fprintf(o, "ERROR size\n");
        !          2334:     break;
        !          2335:   }
        !          2336:   fprintf(o, "    XFLAG = CFLAG = (Sm && !Dm) || (Rm && (!Dm || Sm));\n");
        !          2337:   fprintf(o, "  }\n");
        !          2338: }
        !          2339: 
        !          2340: void generate_cmpaflag_c(FILE *o, t_iib *iib)
        !          2341: {
        !          2342:   /* see generate_subflag_c - this is just the same but with a sign extend
        !          2343:      on the source */
        !          2344:   fprintf(o, "  CFLAG = (uint32)(sint32)(sint16)srcdata > dstdata;\n");
        !          2345: }
        !          2346: 
        !          2347: void generate_subflag_v(FILE *o, t_iib *iib)
        !          2348: {
        !          2349:   /* V = (!Sm && Dm && !Rm) || (Sm && !Dm && Rm)
        !          2350:      overflow is performed as if both source and destination are signed,
        !          2351:      the only two condtions are if we've added too much to a +ve number
        !          2352:      or we've subtracted too much from a -ve number - I have proven the
        !          2353:      this to be the case using a truth table and the above motorola
        !          2354:      definition */
        !          2355:   /* the technique to implement the above formula is to make sure the sign
        !          2356:      of Sm != the sign of Dm, and the sign of Dm != the sign of Rm. */
        !          2357:   switch(iib->size) {
        !          2358:   case sz_byte:
        !          2359:     fprintf(o, "  VFLAG = (((sint8)srcdata < 0) != ((sint8)dstdata < 0)) ");
        !          2360:     fprintf(o, "&&\n    (((sint8)dstdata < 0) != ((sint8)outdata < 0));\n");
        !          2361:     break;
        !          2362:   case sz_word:
        !          2363:     fprintf(o, "  VFLAG = (((sint16)srcdata < 0) != ((sint16)dstdata < 0)) ");
        !          2364:     fprintf(o, "&&\n    (((sint16)dstdata < 0) != ((sint16)outdata < 0));\n");
        !          2365:     break;
        !          2366:   case sz_long:
        !          2367:     fprintf(o, "  VFLAG = (((sint32)srcdata < 0) != ((sint32)dstdata < 0)) ");
        !          2368:     fprintf(o, "&&\n    (((sint32)dstdata < 0) != ((sint32)outdata < 0));\n");
        !          2369:     break;
        !          2370:   default:
        !          2371:     fprintf(o, "ERROR size\n");
        !          2372:     break;
        !          2373:   }
        !          2374: }
        !          2375: 
        !          2376: void generate_cmpaflag_v(FILE *o, t_iib *iib)
        !          2377: {
        !          2378:   /* see generate_subflag_v - this is just the sz_long version with a sign
        !          2379:      extend on the source */
        !          2380:   fprintf(o, "  VFLAG = (((sint32)(sint16)srcdata < 0) != ");
        !          2381:   fprintf(o, "((sint32)dstdata < 0)) ");
        !          2382:   fprintf(o, "&&\n    (((sint32)dstdata < 0) != ((sint32)outdata < 0));\n");
        !          2383: }
        !          2384: 
        !          2385: void generate_stdxflag_z(FILE *o, t_iib *iib)
        !          2386: {
        !          2387:   fprintf(o, "  if (outdata) ZFLAG = 0;\n");
        !          2388: }
        !          2389: 
        !          2390: void generate_addflag_cx(FILE *o, t_iib *iib)
        !          2391: {
        !          2392:   /* C = (Sm && Dm) || (!Rm && Dm) || (Sm && !Rm)
        !          2393:      carry is performed as if both source and destination are unsigned,
        !          2394:      so this is simply if the source is bigger than how much can be added
        !          2395:      to the destination without wrapping - this is of course just the bit
        !          2396:      inverse of the destination. */
        !          2397:   /* 0xFFFF - dstdata is obviously just ~dstdata, but try and get the
        !          2398:      compiler to do that without producing a warning, go on... */
        !          2399:   switch (iib->size) {
        !          2400:   case sz_byte:
        !          2401:     fprintf(o, "  XFLAG = CFLAG = srcdata > (0xFFu - (uint8)dstdata);\n");
        !          2402:     break;
        !          2403:   case sz_word:
        !          2404:     fprintf(o, "  XFLAG = CFLAG = srcdata > (0xFFFFu - (uint16)dstdata);\n");
        !          2405:     break;
        !          2406:   case sz_long:
        !          2407:     fprintf(o, "  XFLAG = CFLAG = srcdata > (uint32)~(uint32)dstdata;\n");
        !          2408:     break;
        !          2409:   default:
        !          2410:     fprintf(o, "ERROR size\n");
        !          2411:     break;
        !          2412:   }
        !          2413:   /* gcc doesn't like a one's compliment of an unsigned - take out the
        !          2414:      casts in the above and it will warn you incorrectly */
        !          2415: }
        !          2416: 
        !          2417: void generate_addxflag_cx(FILE *o, t_iib *iib)
        !          2418: {
        !          2419:   /* V = (Sm && Dm) || (!Rm && (Dm || Sm)) */
        !          2420:   fprintf(o, "  {\n");
        !          2421:   switch(iib->size) {
        !          2422:   case sz_byte:
        !          2423:     fprintf(o, "    int Sm = (sint8)srcdata < 0;\n");
        !          2424:     fprintf(o, "    int Dm = (sint8)dstdata < 0;\n");
        !          2425:     fprintf(o, "    int Rm = (sint8)outdata < 0;\n");
        !          2426:     break;
        !          2427:   case sz_word:
        !          2428:     fprintf(o, "    int Sm = (sint16)srcdata < 0;\n");
        !          2429:     fprintf(o, "    int Dm = (sint16)dstdata < 0;\n");
        !          2430:     fprintf(o, "    int Rm = (sint16)outdata < 0;\n");
        !          2431:     break;
        !          2432:   case sz_long:
        !          2433:     fprintf(o, "    int Sm = (sint32)srcdata < 0;\n");
        !          2434:     fprintf(o, "    int Dm = (sint32)dstdata < 0;\n");
        !          2435:     fprintf(o, "    int Rm = (sint32)outdata < 0;\n");
        !          2436:     break;
        !          2437:   default:
        !          2438:     fprintf(o, "ERROR size\n");
        !          2439:     break;
        !          2440:   }
        !          2441:   fprintf(o, "    XFLAG = CFLAG = (Sm && Dm) || (!Rm && (Dm || Sm));\n");
        !          2442:   fprintf(o, "  }\n");
        !          2443: }
        !          2444: 
        !          2445: void generate_addflag_v(FILE *o, t_iib *iib)
        !          2446: {
        !          2447:   /* V = (Sm && Dm && !Rm) || (!Sm && !Dm && Rm)
        !          2448:      overflow is performed as if both source and destination are signed,
        !          2449:      the only two condtions are if we've added too much to a +ve number
        !          2450:      or we've subtracted too much from a -ve number */
        !          2451:   /* the technique to implement the above formula is to make sure the sign
        !          2452:      of Sm == the sign of Dm, and the sign of Dm != the sign of Rm. */
        !          2453:   switch(iib->size) {
        !          2454:   case sz_byte:
        !          2455:     fprintf(o, "  VFLAG = (((sint8)srcdata < 0) == ((sint8)dstdata < 0)) ");
        !          2456:     fprintf(o, "&&\n    (((sint8)dstdata < 0) != ((sint8)outdata < 0));\n");
        !          2457:     break;
        !          2458:   case sz_word:
        !          2459:     fprintf(o, "  VFLAG = (((sint16)srcdata < 0) == ((sint16)dstdata < 0)) ");
        !          2460:     fprintf(o, "&&\n    (((sint16)dstdata < 0) != ((sint16)outdata < 0));\n");
        !          2461:     break;
        !          2462:   case sz_long:
        !          2463:     fprintf(o, "  VFLAG = (((sint32)srcdata < 0) == ((sint32)dstdata < 0)) ");
        !          2464:     fprintf(o, "&&\n    (((sint32)dstdata < 0) != ((sint32)outdata < 0));\n");
        !          2465:     break;
        !          2466:   default:
        !          2467:     fprintf(o, "ERROR size\n");
        !          2468:     break;
        !          2469:   }
        !          2470: }
        !          2471: 
        !          2472: void generate_negflag_cx(FILE *o, t_iib *iib)
        !          2473: {
        !          2474:   /* C = (Dm || Rm) */
        !          2475:   fprintf(o, "  XFLAG = CFLAG = srcdata ? 1 : 0;\n");
        !          2476: }
        !          2477: 
        !          2478: void generate_negflag_v(FILE *o, t_iib *iib)
        !          2479: {
        !          2480:   /* V = (Dm && Rm)
        !          2481:      which is the same as V = src == 1<<15 as the only case where both the
        !          2482:      data and the result are both negative is in the case of the extreme
        !          2483:      negative number (1<<15 in the case of 16 bit) since 0 - 1<<15 = 1<<15. */
        !          2484:   switch(iib->size) {
        !          2485:   case sz_byte:
        !          2486:     fprintf(o, "  VFLAG = (srcdata == (1u<<7));\n");
        !          2487:     break;
        !          2488:   case sz_word:
        !          2489:     fprintf(o, "  VFLAG = (srcdata == (1u<<15));\n");
        !          2490:     break;
        !          2491:   case sz_long:
        !          2492:     fprintf(o, "  VFLAG = (srcdata == (1u<<31));\n");
        !          2493:     break;
        !          2494:   default:
        !          2495:     fprintf(o, "ERROR size\n");
        !          2496:     break;
        !          2497:   }
        !          2498: }
        !          2499: 
        !          2500: void generate_negxflag_cx(FILE *o, t_iib *iib)
        !          2501: {
        !          2502:   /* C = (Dm || Rm)
        !          2503:      unlike NEG, NEGX is done properly */
        !          2504:   fprintf(o, "  XFLAG = CFLAG ");
        !          2505:   switch(iib->size) {
        !          2506:   case sz_byte:
        !          2507:     fprintf(o, "= ((sint8)srcdata < 0) || ((sint8)outdata < 0);\n");
        !          2508:     break;
        !          2509:   case sz_word:
        !          2510:     fprintf(o, "= ((sint16)srcdata < 0) || ((sint16)outdata < 0);\n");
        !          2511:     break;
        !          2512:   case sz_long:
        !          2513:     fprintf(o, "= ((sint32)srcdata < 0) || ((sint32)outdata < 0);\n");
        !          2514:     break;
        !          2515:   default:
        !          2516:     fprintf(o, "ERROR size\n");
        !          2517:     break;
        !          2518:   }
        !          2519: }
        !          2520: 
        !          2521: void generate_negxflag_v(FILE *o, t_iib *iib)
        !          2522: {
        !          2523:   /* V = (Dm && Rm)
        !          2524:      unlike NEG, NEGX is done properly */
        !          2525:   switch(iib->size) {
        !          2526:   case sz_byte:
        !          2527:     fprintf(o, "  VFLAG = ((sint8)srcdata < 0) && ((sint8)outdata < 0);\n");
        !          2528:     break;
        !          2529:   case sz_word:
        !          2530:     fprintf(o, "  VFLAG = ((sint16)srcdata < 0) && ((sint16)outdata < 0);\n");
        !          2531:     break;
        !          2532:   case sz_long:
        !          2533:     fprintf(o, "  VFLAG = ((sint32)srcdata < 0) && ((sint32)outdata < 0);\n");
        !          2534:     break;
        !          2535:   default:
        !          2536:     fprintf(o, "ERROR size\n");
        !          2537:     break;
        !          2538:   }
        !          2539: }
        !          2540: 
        !          2541: void generate_bits(FILE *o, t_iib *iib)
        !          2542: {
        !          2543:   switch (iib->size) {
        !          2544:   case sz_byte:
        !          2545:     fprintf(o, "  uint8 bits = 8;\n");
        !          2546:     break;
        !          2547:   case sz_word:
        !          2548:     fprintf(o, "  uint8 bits = 16;\n");
        !          2549:     break;
        !          2550:   case sz_long:
        !          2551:     fprintf(o, "  uint8 bits = 32;\n");
        !          2552:     break;
        !          2553:   default:
        !          2554:     fprintf(o, "ERROR size\n");
        !          2555:     break;
        !          2556:   }
        !          2557: }

unix.superglobalmegacorp.com

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