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