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