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