|
|
1.1 ! root 1: ! 2: #include <assert.h> ! 3: #include <stdio.h> ! 4: #include <stdlib.h> ! 5: #include <string.h> ! 6: #include <ctype.h> ! 7: #include <stdarg.h> ! 8: #include "dict.h" ! 9: #include "as68k.h" ! 10: #include "output.h" ! 11: ! 12: //#define DUMP_LOADS_OF_CRAP ! 13: ! 14: static op_t pending; ! 15: static char pending_func_name[LAB_LEN]; ! 16: static enum M68K_OPS next_op_type; ! 17: ! 18: #define GEN_CALL 0 ! 19: #define GEN_BODY 1 ! 20: static int gen_mode; ! 21: static int return_target; ! 22: ! 23: /* which flags an M68K_OP thingy may set */ ! 24: #define fN (1<<0) ! 25: #define fZ (1<<1) ! 26: #define fV (1<<2) ! 27: #define fC (1<<3) ! 28: #define fX (1<<4) ! 29: #define fNZVCX (fN | fZ | fV | fC | fX) ! 30: #define fNZVC (fN | fZ | fV | fC) ! 31: #define _fSafe 0 ! 32: /* _fSafe are ones i haven't got round to doing yet. */ ! 33: ! 34: static int sets_flags[OP_MAX+1] = { ! 35: _fSafe, /* OP_NONE */ ! 36: 0, // OP_JMP ! 37: fZ, // OP_BCHG ! 38: fZ, // OP_BCLR ! 39: fZ, // OP_BSET ! 40: fZ, // OP_BTST ! 41: fNZVC, // OP_MULS ! 42: fNZVC, // OP_MULU, ! 43: fNZVC, // OP_AND ! 44: fNZVC, // OP_OR ! 45: fNZVC, // OP_XOR ! 46: fNZVC, // OP_NOT ! 47: fNZVCX, // OP_NEGX ! 48: fNZVCX, // OP_NEG ! 49: fNZVC, // OP_DIVU ! 50: fNZVC, // OP_DIVS ! 51: fNZVCX, // OP_ASL, ! 52: fNZVCX, // OP_LSL ! 53: fNZVCX, // OP_ROXR ! 54: fNZVCX, // OP_ROXL ! 55: fNZVC, // OP_ROL ! 56: fNZVC, // OP_ROR ! 57: fNZVCX, // OP_ASR ! 58: fNZVCX, // OP_LSR, ! 59: 0, // OP_MOVEM ! 60: fNZVCX, // OP_SUBX ! 61: fNZVCX, // OP_ADDX ! 62: fNZVCX, // OP_ADD ! 63: fNZVC, // OP_CMPA ! 64: fNZVC, // OP_CMP ! 65: fNZVCX, // OP_SUB, ! 66: _fSafe, // OP_ADDA ! 67: _fSafe, // OP_SUBA ! 68: fNZVC, // OP_SWAP ! 69: _fSafe, // OP_JSR ! 70: 0, // OP_BCC ! 71: 0, // OP_DBCC ! 72: fNZVC, // OP_CLR, ! 73: 0, // OP_EXG ! 74: fNZVC, // OP_EXT ! 75: 0, // OP_RTE ! 76: 0, // OP_RTS ! 77: 0, // OP_ILLEGAL ! 78: 0, // OP_HCALL ! 79: 0, // OP_LINK, ! 80: 0, // OP_UNLK ! 81: fNZVC, // OP_MOVE ! 82: _fSafe, // OP_MOVEA ! 83: fNZVC, // OP_TST ! 84: 0, // OP_PEA ! 85: 0, // OP_LEA ! 86: 0, // OP_SCC ! 87: _fSafe, // OP_MAX..... ! 88: }; ! 89: ! 90: /* does the flag need to be set? if the next instruction will ! 91: * set the flag then no. */ ! 92: #define ifZ if(!(sets_flags[next_op_type] & fZ)) ! 93: #define ifN if(!(sets_flags[next_op_type] & fN)) ! 94: #define ifV if(!(sets_flags[next_op_type] & fV)) ! 95: #define ifC if(!(sets_flags[next_op_type] & fC)) ! 96: //#define ifCX if((!(sets_flags[next_op_type] & fC)) && (!(sets_flags[next_op_type] & fX))) ! 97: //#define ifX if(!(sets_flags[next_op_type] & fX)) ! 98: #define ifVoN if((!(sets_flags[next_op_type] & fV)) || (!(sets_flags[next_op_type] & fN))) ! 99: ! 100: FILE *f_temp; ! 101: FILE *c_out; ! 102: FILE *c_out2; /* writing functions here */ ! 103: ! 104: /* useless stats */ ! 105: static int num_funcs; ! 106: ! 107: #define SWAP_COUT { f_temp = c_out; c_out = c_out2; c_out2 = f_temp; } ! 108: ! 109: static void output_op (op_t *op, op_t *next); ! 110: ! 111: static void cout (const char *format, ...) ! 112: { ! 113: va_list argptr; ! 114: ! 115: va_start (argptr, format); ! 116: vfprintf (c_out, format, argptr); ! 117: va_end (argptr); ! 118: } ! 119: static void cln (const char *format, ...) ! 120: { ! 121: va_list argptr; ! 122: ! 123: fputc ('\t', c_out); ! 124: va_start (argptr, format); ! 125: vfprintf (c_out, format, argptr); ! 126: va_end (argptr); ! 127: fputc ('\n', c_out); ! 128: } ! 129: /* C code generation shit */ ! 130: const char *c_usizes[] = { "u8", "u16", "u32" }; ! 131: const char *c_ssizes[] = { "s8", "s16", "s32" }; ! 132: const char *mem_read_funcs[] = { "rdbyte", "rdword", "rdlong" }; ! 133: const char *mem_write_funcs[] = { "wrbyte", "wrword", "wrlong" }; ! 134: ! 135: void c_label (const char *lab) ! 136: { ! 137: cout ("__N%s:\n", lab); ! 138: add_fixup (0, C_ADDR, lab); ! 139: } ! 140: ! 141: void c_addr_label (int labelled) ! 142: { ! 143: if (labelled || return_target || (get_bitpos () == 0x1c)) { ! 144: cout ("\tcase (0x%x):\n", get_bitpos ()); ! 145: } ! 146: cln ("#ifdef M68K_DEBUG"); ! 147: cln (" line_no = %d;", line_no); ! 148: #ifdef DUMP_LOADS_OF_CRAP ! 149: cln (" DumpRegsChanged ();"); ! 150: #endif /* DUMP_LOADS_OF_CRAP */ ! 151: cln ("#endif"); ! 152: } ! 153: ! 154: void c_begin (const char *src_filename, const char *bin_filename) ! 155: { ! 156: char buf[128]; ! 157: snprintf (buf, sizeof (buf), ".%s.c", src_filename); ! 158: if ((c_out = fopen (buf, "w"))==NULL) { ! 159: fprintf (stderr, "Error: Cannot open %s for writing.\n", buf); ! 160: exit (-1); ! 161: } ! 162: snprintf (buf, sizeof (buf), ".%s.fn.c", src_filename); ! 163: if ((c_out2 = fopen (buf, "w"))==NULL) { ! 164: fprintf (stderr, "Error: Cannot open %s for writing.\n", buf); ! 165: exit (-1); ! 166: } ! 167: ! 168: cout ("void Init680x0 () {\n"); ! 169: cln ("STRam = &m68kram[0];"); ! 170: cln ("load_binfile (\"%s\");", bin_filename); ! 171: cout ("}\n"); ! 172: ! 173: cout ("void Start680x0 ()\n{\n"); ! 174: cout ("\ts32 i, jdest = 0x1c;\n"); ! 175: cout ("\tRegs[15]._u32 = MEM_SIZE;\n\n"); ! 176: cout ("jumptable:\n\tswitch (jdest) {\n"); ! 177: } ! 178: ! 179: void c_end (const char *src_filename) ! 180: { ! 181: /* some more crap needs to be added to the top */ ! 182: char c, buf[128]; ! 183: FILE *f; ! 184: struct Fixup *fix; ! 185: struct Label *lab; ! 186: ! 187: /* remember to do last pending instruction */ ! 188: next_op_type = OP_NONE; ! 189: if (pending.optype) { ! 190: gen_mode = GEN_BODY; ! 191: output_op (&pending, NULL); ! 192: gen_mode = GEN_CALL; ! 193: } ! 194: ! 195: fclose (c_out); ! 196: fclose (c_out2); ! 197: ! 198: snprintf (buf, sizeof (buf), "%s.c", src_filename); ! 199: if ((c_out = fopen (buf, "w"))==NULL) { ! 200: fprintf (stderr, "Error: Cannot open %s for writing.\n", buf); ! 201: exit (-1); ! 202: } ! 203: ! 204: /* _host.c contains much necessary boilerplate code. include it */ ! 205: cout ("#include \"_host.c\"\n"); ! 206: ! 207: /* call prototype turds */ ! 208: cout ("#ifdef PART1\n"); ! 209: fix = fix_first; ! 210: for (; fix != NULL; fix = fix->next) { ! 211: if (fix->size == C_FUNC) { ! 212: cout ("extern void %s ();\n", fix->label); ! 213: continue; ! 214: } ! 215: } ! 216: cout ("#endif /* PART1 */\n"); ! 217: /* address 'fixups' */ ! 218: fix = fix_first; ! 219: for (; fix != NULL; fix = fix->next) { ! 220: if (fix->size != C_ADDR) continue; ! 221: ! 222: lab = get_label (fix->label); ! 223: if (!lab) { ! 224: /* ignore. let pass2 throw the error. */ ! 225: continue; ! 226: } ! 227: cout ("#define __D%s (0x%x)\n", lab->name, lab->val+BASE); ! 228: } ! 229: ! 230: /* the code we made */ ! 231: snprintf (buf, sizeof (buf), ".%s.fn.c", src_filename); ! 232: if ((f = fopen (buf, "r"))==NULL) { ! 233: fprintf (stderr, "Error: Cannot open %s for writing.\n", buf); ! 234: exit (-1); ! 235: } ! 236: cout ("#ifdef PART2\n"); ! 237: while ((c = fgetc (f)) != EOF) fputc (c, c_out); ! 238: fclose (f); ! 239: remove (buf); ! 240: cout ("#endif /* PART2 */\n"); ! 241: ! 242: snprintf (buf, sizeof (buf), ".%s.c", src_filename); ! 243: if ((f = fopen (buf, "r"))==NULL) { ! 244: fprintf (stderr, "Error: Cannot open %s for writing.\n", buf); ! 245: exit (-1); ! 246: } ! 247: cout ("#ifdef PART1\n"); ! 248: while ((c = fgetc (f)) != EOF) fputc (c, c_out); ! 249: fclose (f); ! 250: remove (buf); ! 251: ! 252: /* and then computed jump table */ ! 253: cln ("goto end_;"); ! 254: cout ("\t\tdefault: \n"); ! 255: cln ("#ifdef M68K_DEBUG"); ! 256: cln (" printf (\"Bad jump target at line %%d: $%%x (rdest=$%%x).\\n\", line_no, jdest, rdest);"); ! 257: cln ("#else"); ! 258: cln (" printf (\"Bad jump target: $%%x (rdest=$%%x).\\n\", jdest, rdest);"); ! 259: cln ("#endif"); ! 260: cln ("abort ();"); ! 261: cout (" }\n\n"); ! 262: ! 263: cout ("handle_exception:\n"); ! 264: cln ("for (i=0; i<32; i++) {"); ! 265: cln (" if (exceptions_pending & ((1<<i))) {"); ! 266: cln (" jdest = exception_handlers[i];"); ! 267: cln (" if (!--exceptions_pending_nums[i]) {"); ! 268: cln (" exceptions_pending ^= 1<<i;"); ! 269: cln (" }"); ! 270: /* save flags */ ! 271: cln (" bN=N; bnZ=nZ; bV=V; bC=C; bX=X;"); ! 272: cln (" goto jumptable;"); ! 273: cln (" }"); ! 274: cln ("}"); ! 275: cln ("/* shouldn't get here... */"); ! 276: cln ("jdest = rdest;"); ! 277: cln ("goto jumptable;\n"); ! 278: ! 279: cout ("end_:\treturn;\n}\n"); ! 280: cout ("#endif /* PART1 */\n"); ! 281: ! 282: fclose (c_out); ! 283: ! 284: printf ("%d functions generated.\n", num_funcs); ! 285: } ! 286: ! 287: static int is_immediate (ea_t *ea) ! 288: { ! 289: return ((ea->mode == 7) && (ea->reg == 4)); ! 290: } ! 291: ! 292: static void c_postea (ea_t *ea) ! 293: { ! 294: int inc; ! 295: ! 296: inc = 1<<ea->op_size; ! 297: if ((ea->reg == 15) && (inc == 1)) inc = 2; ! 298: ! 299: switch (ea->mode) { ! 300: /* areg postinc */ ! 301: case 3: cln ("Regs[%d]._s32 += %d;", ea->reg, inc); break; ! 302: /* areg predec */ ! 303: case 4: cln ("Regs[%d]._s32 -= %d;", ea->reg, inc); break; ! 304: default: break; ! 305: } ! 306: } ! 307: static void c_ea_get_address (ea_t *ea, char *buf) ! 308: { ! 309: int inc; ! 310: switch (ea->mode) { ! 311: /* dreg, areg */ ! 312: case 0: case 1: assert (0); ! 313: /* areg indirect, postinc */ ! 314: case 2: case 3: ! 315: sprintf (buf, "(Regs[%d]._s32)", ea->reg); break; ! 316: /* areg predec */ ! 317: case 4: ! 318: inc = 1<<ea->op_size; ! 319: /* stack pointer always by 2 */ ! 320: if ((ea->reg == 15) && (inc == 1)) inc = 2; ! 321: ! 322: sprintf (buf, "(Regs[%d]._s32-%d)", ea->reg, inc); ! 323: break; ! 324: /* areg offset */ ! 325: case 5: ! 326: sprintf (buf, "(Regs[%d]._s32%+d)", ea->reg, ea->imm.val); ! 327: break; ! 328: /* areg offset + reg */ ! 329: case 6: ! 330: sprintf (buf, "(Regs[%d]._s32+((%s)Regs[%d]._s32)%+d)", ea->reg, (ea->ext._.size ? "s32" : "s16"), ea->ext._.reg + (ea->ext._.d_or_a ? 8 : 0), ea->ext._.displacement); ! 331: break; ! 332: /* yes */ ! 333: case 7: ! 334: /* $xxx.w */ ! 335: if (ea->reg == 0) { ! 336: sprintf (buf, "(%d)", ea->imm.val); ! 337: } ! 338: /* $xxx.l */ ! 339: else if (ea->reg == 1) { ! 340: if (ea->imm.has_label) { ! 341: sprintf (buf, "(__D%s)", ea->imm.label); ! 342: } else { ! 343: sprintf (buf, "(%d)", ea->imm.val); ! 344: } ! 345: } ! 346: /* immediate */ ! 347: else if (ea->reg == 4) { ! 348: assert (0); ! 349: } ! 350: /* PC + offset */ ! 351: else if (ea->reg == 2) { ! 352: if (ea->imm.has_label) ! 353: sprintf (buf, "__D%s", ea->imm.label); ! 354: else ! 355: error ("Absolute value not allowed."); ! 356: } ! 357: /* PC + INDEX + OFFSET */ ! 358: else if (ea->reg == 3) { ! 359: if (!ea->imm.has_label) error ("Absolute value not allowed."); ! 360: sprintf (buf, "(__D%s + Regs[%d]._%s)", ! 361: ea->imm.label, ! 362: ea->ext._.reg + (ea->ext._.d_or_a ? 8 : 0), ! 363: (ea->ext._.size ? "s32" : "s16")); ! 364: } ! 365: break; ! 366: default: ! 367: assert (0); ! 368: } ! 369: } ! 370: static void c_readea (ea_t *ea, char *buf) ! 371: { ! 372: int inc; ! 373: switch (ea->mode) { ! 374: /* dreg, areg */ ! 375: case 0: ! 376: case 1: ! 377: sprintf (buf, "Regs[%d]._%s", ea->reg, c_ssizes[ea->op_size]); ! 378: break; ! 379: /* areg indirect */ ! 380: case 2: ! 381: sprintf (buf, "%s(Regs[%d]._s32)", mem_read_funcs[ea->op_size], ea->reg); ! 382: break; ! 383: /* areg postinc */ ! 384: case 3: ! 385: sprintf (buf, "%s(Regs[%d]._s32)", mem_read_funcs[ea->op_size], ea->reg); ! 386: break; ! 387: /* areg predec */ ! 388: case 4: ! 389: inc = 1<<ea->op_size; ! 390: /* stack pointer always by 2 */ ! 391: if ((ea->reg == 15) && (inc == 1)) inc = 2; ! 392: ! 393: sprintf (buf, "%s(Regs[%d]._s32-%d)", mem_read_funcs[ea->op_size], ea->reg, inc); ! 394: break; ! 395: /* areg offset */ ! 396: case 5: ! 397: sprintf (buf, "%s(Regs[%d]._s32%+d)", mem_read_funcs[ea->op_size], ea->reg, ea->imm.val); ! 398: break; ! 399: /* areg offset + reg */ ! 400: case 6: ! 401: sprintf (buf, "%s(Regs[%d]._s32+((%s)Regs[%d]._s32)%+d)", mem_read_funcs[ea->op_size], ea->reg, (ea->ext._.size ? "s32" : "s16"), ea->ext._.reg + (ea->ext._.d_or_a ? 8 : 0), ea->ext._.displacement); ! 402: break; ! 403: /* yes */ ! 404: case 7: ! 405: /* $xxx.w */ ! 406: if (ea->reg == 0) { ! 407: sprintf (buf, "%s(%d)", mem_read_funcs[ea->op_size], ea->imm.val); ! 408: } ! 409: /* $xxx.l */ ! 410: else if (ea->reg == 1) { ! 411: if (ea->imm.has_label) { ! 412: sprintf (buf, "%s(__D%s)", mem_read_funcs[ea->op_size], ea->imm.label); ! 413: } else { ! 414: sprintf (buf, "%s(%d)", mem_read_funcs[ea->op_size], ea->imm.val); ! 415: } ! 416: } ! 417: /* immediate */ ! 418: else if (ea->reg == 4) { ! 419: if (ea->imm.has_label) { ! 420: sprintf (buf, "__D%s", ea->imm.label); ! 421: } else { ! 422: sprintf (buf, "%d", ea->imm.val); ! 423: } ! 424: } ! 425: /* PC + offset */ ! 426: else if (ea->reg == 2) { ! 427: if (ea->imm.has_label) ! 428: sprintf (buf, "%s(__D%s)", mem_read_funcs[ea->op_size], ea->imm.label); ! 429: else ! 430: error ("Absolute value not allowed."); ! 431: } ! 432: /* PC + INDEX + OFFSET */ ! 433: else if (ea->reg == 3) { ! 434: if (!ea->imm.has_label) error ("Absolute value not allowed."); ! 435: sprintf (buf, "%s(__D%s + Regs[%d]._%s)", ! 436: mem_read_funcs[ea->op_size], ! 437: ea->imm.label, ! 438: ea->ext._.reg + (ea->ext._.d_or_a ? 8 : 0), ! 439: (ea->ext._.size ? "s32" : "s16")); ! 440: } ! 441: break; ! 442: default: ! 443: error ("nasty error in c_readea()"); ! 444: } ! 445: } ! 446: static void c_writeea (ea_t *ea, int size, const char *val) ! 447: { ! 448: int inc; ! 449: switch (ea->mode) { ! 450: /* dreg, areg */ ! 451: case 0: case 1: ! 452: cln ("Regs[%d]._%s = %s;", ea->reg, (size==BYTE ? "s8" : (size==WORD ? "s16" : "s32")), val); ! 453: break; ! 454: /* areg indirect */ ! 455: case 2: ! 456: cln ("%s(Regs[%d]._s32, %s);", mem_write_funcs[size], ea->reg, val); ! 457: break; ! 458: /* areg postinc */ ! 459: case 3: ! 460: cln ("%s(Regs[%d]._s32, %s);", mem_write_funcs[size], ea->reg, val); ! 461: break; ! 462: /* areg predec */ ! 463: case 4: ! 464: inc = 1<<size; ! 465: /* stack pointer always by 2 */ ! 466: if ((ea->reg == 15) && (inc == 1)) inc = 2; ! 467: ! 468: cln ("%s(Regs[%d]._s32-%d, %s);", mem_write_funcs[size], ea->reg, inc, val); ! 469: break; ! 470: /* areg offset */ ! 471: case 5: ! 472: cln ("%s(Regs[%d]._s32%+d, %s);", mem_write_funcs[size], ea->reg, ea->imm.val, val); ! 473: break; ! 474: /* areg offset + reg */ ! 475: case 6: ! 476: cln ("%s(Regs[%d]._s32+(Regs[%d]._%s)%+d, %s);", mem_write_funcs[size], ea->reg, ea->ext._.reg + (ea->ext._.d_or_a ? 8 : 0), (ea->ext._.size ? "s32" : "s16"), ea->ext._.displacement, val); ! 477: break; ! 478: /* yes */ ! 479: case 7: ! 480: /* $xxx.w */ ! 481: if (ea->reg == 0) { ! 482: cln ("%s(%d, %s);", mem_write_funcs[size], ea->imm.val, val); ! 483: } ! 484: /* $xxx.l */ ! 485: else if (ea->reg == 1) { ! 486: if (ea->imm.has_label) { ! 487: cln ("%s(__D%s, %s);", mem_write_funcs[size], ea->imm.label, val); ! 488: } else { ! 489: cln ("%s(%d, %s);", mem_write_funcs[size], ea->imm.val, val); ! 490: } ! 491: } ! 492: /* immediate */ ! 493: else if (ea->reg == 4) { ! 494: if (ea->imm.has_label) { ! 495: cln ("%s(__D%s, %s);", mem_write_funcs[size], ea->imm.label, val); ! 496: } else { ! 497: cln ("%s(%d, %s);", mem_write_funcs[size], ea->imm.val, val); ! 498: } ! 499: } ! 500: /* PC + offset */ ! 501: else if (ea->reg == 2) { ! 502: if (ea->imm.has_label) ! 503: cln ("%s(__D%s, %s);", mem_write_funcs[size], ea->imm.label, val); ! 504: else ! 505: error ("Absolute value not allowed."); ! 506: } ! 507: /* PC + INDEX + OFFSET */ ! 508: else if (ea->reg == 3) { ! 509: if (!ea->imm.has_label) error ("Absolute value not allowed."); ! 510: cln ("%s(__D%s + Regs[%d]._%s, %s);", mem_write_funcs[size], ea->imm.label, ea->ext._.reg + (ea->ext._.d_or_a ? 8 : 0), (ea->ext._.size ? "s32" : "s16"), val); ! 511: } ! 512: else { ! 513: error ("wtf in c_writeea ()"); ! 514: } ! 515: break; ! 516: default: ! 517: error ("nasty error in c_writeea()"); ! 518: } ! 519: } ! 520: ! 521: static void c_eval_cond (int cond) ! 522: { ! 523: switch (cond) { ! 524: /* ra */ ! 525: case 0: cout ("1"); break; ! 526: /* f */ ! 527: case 1: cout ("0"); break; ! 528: /* hi */ ! 529: case 2: cout ("((!C) && nZ)"); break; ! 530: /* ls */ ! 531: case 3: cout ("(C || (!nZ))"); break; ! 532: /* cc */ ! 533: case 4: cout ("(!C)"); break; ! 534: /* cs */ ! 535: case 5: cout ("C"); break; ! 536: /* ne */ ! 537: case 6: cout ("nZ"); break; ! 538: /* eq */ ! 539: case 7: cout ("(!nZ)"); break; ! 540: /* vc */ ! 541: case 8: cout ("(!V)"); break; ! 542: /* vs */ ! 543: case 9: cout ("V"); break; ! 544: /* pl */ ! 545: case 10: cout ("(!N)"); break; ! 546: /* mi */ ! 547: case 11: cout ("N"); break; ! 548: /* ge */ ! 549: case 12: cout ("(!(N ^ V))"); break; ! 550: /* lt */ ! 551: case 13: cout ("(!(N ^ (!V)))"); break; ! 552: /* gt */ ! 553: case 14: cout ("(nZ && (!(N ^ V)))"); break; ! 554: /* le */ ! 555: case 15: cout ("((!nZ) || (!(N ^ (!V))))"); break; ! 556: } ! 557: } ! 558: ! 559: static void make_funcname (char *buf, int len) ! 560: { ! 561: snprintf (buf, len, "__F%x", get_bitpos ()); ! 562: } ! 563: ! 564: static void c_fnbegin () ! 565: { ! 566: add_fixup (0, C_FUNC, pending_func_name); ! 567: SWAP_COUT; ! 568: num_funcs++; ! 569: cout ("void %s ()\n", pending_func_name); ! 570: cout ("{\n"); ! 571: } ! 572: ! 573: static void c_fnend () ! 574: { ! 575: cout ("}\n"); ! 576: SWAP_COUT; ! 577: } ! 578: ! 579: #define c_fncall() \ ! 580: {if (gen_mode == GEN_CALL) { \ ! 581: make_funcname (pending_func_name, sizeof (pending_func_name)); \ ! 582: cln ("%s ();", pending_func_name); \ ! 583: return; \ ! 584: }} ! 585: ! 586: /* Check for pending exceptions also */ ! 587: void c_jump_e (ea_t *ea) ! 588: { ! 589: char buf[256]; ! 590: if (gen_mode != GEN_CALL) return; ! 591: c_ea_get_address (ea, buf); ! 592: cln ("{"); ! 593: cln ("if ((exceptions_pending) && (rdest == 0)) {"); ! 594: ! 595: if (((ea->mode == 7) && (ea->reg == 1)) || ! 596: ((ea->mode == 7) && (ea->reg == 2))) { ! 597: cln (" rdest = __D%s;", ea->imm.label); ! 598: } else { ! 599: cln (" rdest = %s;", buf); ! 600: } ! 601: c_postea (ea); ! 602: cln (" goto handle_exception;", buf); ! 603: cln ("} else {"); ! 604: ! 605: if (((ea->mode == 7) && (ea->reg == 1)) || ! 606: ((ea->mode == 7) && (ea->reg == 2))) { ! 607: cln (" goto __N%s;", ea->imm.label); ! 608: } else { ! 609: cln (" jdest = %s;", buf); ! 610: c_postea (ea); ! 611: cln (" goto jumptable;"); ! 612: } ! 613: cln ("}}"); ! 614: } ! 615: ! 616: void c_jump (ea_t *ea) ! 617: { ! 618: char buf[256]; ! 619: if (gen_mode != GEN_CALL) return; ! 620: c_ea_get_address (ea, buf); ! 621: ! 622: cln ("{"); ! 623: if (((ea->mode == 7) && (ea->reg == 1)) || ! 624: ((ea->mode == 7) && (ea->reg == 2))) { ! 625: cln (" goto __N%s;", ea->imm.label); ! 626: } else { ! 627: cln (" jdest = %s;", buf); ! 628: c_postea (ea); ! 629: cln (" goto jumptable;"); ! 630: } ! 631: cln ("}"); ! 632: } ! 633: ! 634: void c_func_bchg (ea_t *src, ea_t *dest, int size) ! 635: { ! 636: int len; ! 637: const char *sz; ! 638: char buf[256]; ! 639: c_fncall (); ! 640: ! 641: c_fnbegin (); ! 642: sz = c_usizes[size]; ! 643: if (size == BYTE) len = 8; ! 644: else if (size == WORD) len = 16; ! 645: else len = 32; ! 646: ! 647: c_readea (src, buf); ! 648: cln ("%s src = %s;", sz, buf); ! 649: c_readea (dest, buf); ! 650: cln ("%s dest = %s;", sz, buf); ! 651: cln ("src &= %d;", len-1); ! 652: cln ("dest ^= (1 << src);"); ! 653: ifZ { cln ("nZ = !(((%s)dest & (1 << src)) >> src);", sz); } ! 654: c_writeea (dest, size, "dest"); ! 655: c_postea (src); ! 656: c_postea (dest); ! 657: c_fnend (); ! 658: } ! 659: ! 660: void c_func_bclr (ea_t *src, ea_t *dest, int size) ! 661: { ! 662: int len; ! 663: const char *sz; ! 664: char buf[256]; ! 665: ! 666: c_fncall (); ! 667: ! 668: c_fnbegin (); ! 669: sz = c_usizes[size]; ! 670: if (size == BYTE) len = 8; ! 671: else if (size == WORD) len = 16; ! 672: else len = 32; ! 673: ! 674: c_readea (src, buf); ! 675: cln ("%s src = %s;", sz, buf); ! 676: c_readea (dest, buf); ! 677: cln ("%s dest = %s;", sz, buf); ! 678: cln ("src &= %d;", len-1); ! 679: ifZ { cln ("nZ = !(1 ^ ((dest >> src) & 1));"); } ! 680: cln ("dest &= ~(1 << src);"); ! 681: c_writeea (dest, size, "dest"); ! 682: c_postea (src); ! 683: c_postea (dest); ! 684: c_fnend (); ! 685: } ! 686: ! 687: void c_func_bset (ea_t *src, ea_t *dest, int size) ! 688: { ! 689: int len; ! 690: const char *sz; ! 691: char buf[256]; ! 692: ! 693: c_fncall (); ! 694: ! 695: c_fnbegin (); ! 696: sz = c_usizes[size]; ! 697: if (size == BYTE) len = 8; ! 698: else if (size == WORD) len = 16; ! 699: else len = 32; ! 700: ! 701: c_readea (src, buf); ! 702: cln ("%s src = %s;", sz, buf); ! 703: c_readea (dest, buf); ! 704: cln ("%s dest = %s;", sz, buf); ! 705: cln ("src &= %d;", len-1); ! 706: ifZ { cln ("nZ = !(1 ^ ((dest >> src) & 1));"); } ! 707: cln ("dest |= (1 << src);"); ! 708: c_writeea (dest, size, "dest"); ! 709: c_postea (src); ! 710: c_postea (dest); ! 711: c_fnend (); ! 712: } ! 713: ! 714: void c_func_btst (ea_t *src, ea_t *dest, int size) ! 715: { ! 716: int len; ! 717: const char *sz; ! 718: char buf[256]; ! 719: ! 720: c_fncall (); ! 721: ! 722: c_fnbegin (); ! 723: sz = c_usizes[size]; ! 724: if (size == BYTE) len = 8; ! 725: else if (size == WORD) len = 16; ! 726: else len = 32; ! 727: ! 728: c_readea (src, buf); ! 729: cln ("%s src = %s;", sz, buf); ! 730: c_readea (dest, buf); ! 731: cln ("%s dest = %s;", sz, buf); ! 732: cln ("src &= %d;", len-1); ! 733: ifZ { cln ("nZ = !(1 ^ ((dest >> src) & 1));"); } ! 734: c_postea (src); ! 735: c_postea (dest); ! 736: c_fnend (); ! 737: } ! 738: ! 739: void c_func_muls (ea_t *src, ea_t *dest) ! 740: { ! 741: char buf[256]; ! 742: c_fncall (); ! 743: ! 744: c_fnbegin (); ! 745: c_readea (src, buf); ! 746: cln ("s16 src = %s;", buf); ! 747: c_readea (dest, buf); ! 748: cln ("s32 dest = (s16)%s;", buf); ! 749: cln ("dest *= (s32)src;"); ! 750: ifZ { cln ("nZ = dest;"); } ! 751: ifN { cln ("N = ((s32)dest) < 0;"); } ! 752: ifC { cln ("C = 0;"); } ! 753: ifV { cln ("V = 0;"); } ! 754: c_writeea (dest, LONG, "dest"); ! 755: c_postea (dest); ! 756: c_postea (src); ! 757: c_fnend (); ! 758: } ! 759: void c_func_mulu (ea_t *src, ea_t *dest) ! 760: { ! 761: char buf[256]; ! 762: c_fncall (); ! 763: ! 764: c_fnbegin (); ! 765: c_readea (src, buf); ! 766: cln ("u16 src = %s;", buf); ! 767: c_readea (dest, buf); ! 768: cln ("u32 dest = (u16)%s;", buf); ! 769: cln ("dest *= (u32)src;"); ! 770: ifZ { cln ("nZ = dest;"); } ! 771: ifN { cln ("N = ((s32)dest) < 0;"); } ! 772: ifC { cln ("C = 0;"); } ! 773: ifV { cln ("V = 0;"); } ! 774: c_writeea (dest, LONG, "dest"); ! 775: c_postea (dest); ! 776: c_postea (src); ! 777: c_fnend (); ! 778: } ! 779: ! 780: void c_func_logop (ea_t *src, ea_t *dest, int size, char op) ! 781: { ! 782: const char *sz; ! 783: char buf[256]; ! 784: sz = c_ssizes[size]; ! 785: ! 786: c_fncall (); ! 787: ! 788: c_fnbegin (); ! 789: c_readea (src, buf); ! 790: cln ("%s src = %s;", sz, buf); ! 791: c_readea (dest, buf); ! 792: cln ("%s dest = %s;", sz, buf); ! 793: cln ("dest %c= src;", op); ! 794: ifC { cln ("C = 0;"); } ! 795: ifV { cln ("V = 0;"); } ! 796: ifZ { cln ("nZ = dest;"); } ! 797: ifN { cln ("N = (dest < 0);"); } ! 798: c_writeea (dest, size, "dest"); ! 799: c_postea (src); ! 800: c_postea (dest); ! 801: c_fnend (); ! 802: } ! 803: ! 804: void c_func_not (ea_t *ea, int size) ! 805: { ! 806: char buf[256]; ! 807: c_fncall (); ! 808: ! 809: c_fnbegin (); ! 810: c_readea (ea, buf); ! 811: cln ("%s val = %s;", c_usizes[size], buf); ! 812: cln ("val = ~val;"); ! 813: ifN { cln ("N = ((%s)val) < 0;", c_ssizes[size]); } ! 814: ifZ { cln ("nZ = val;"); } ! 815: ifV { cln ("V = 0;"); } ! 816: ifC { cln ("C = 0;"); } ! 817: c_writeea (ea, size, "val"); ! 818: c_postea (ea); ! 819: c_fnend (); ! 820: } ! 821: ! 822: void c_func_negx (ea_t *ea, int size) ! 823: { ! 824: char buf[256]; ! 825: c_fncall (); ! 826: ! 827: c_fnbegin (); ! 828: c_readea (ea, buf); ! 829: /* XXX is nZ flag correct here? */ ! 830: cln ("%s src = %s;", c_ssizes[size], buf); ! 831: cln ("u32 dest = (0 - src) - (X ? 1 : 0);"); ! 832: cln ("int flgs, flgn;"); ! 833: cln ("flgs = ((%s)src) < 0;", c_ssizes[size]); ! 834: cln ("flgn = ((%s)dest) < 0;", c_ssizes[size]); ! 835: ifZ { cln ("nZ = !((!nZ) & (((%s)(dest)) == 0));", c_ssizes[size]); } ! 836: ifV { cln ("V = (flgs & flgn);"); } ! 837: cln ("X = flgs ^ ((flgs ^ flgn) & (flgn));"); ! 838: ifC { cln ("C = X;"); } ! 839: ifN { cln ("N = ((%s)dest) < 0;", c_ssizes[size]); } ! 840: c_writeea (ea, size, "dest"); ! 841: c_postea (ea); ! 842: c_fnend (); ! 843: } ! 844: void c_func_neg (ea_t *ea, int size) ! 845: { ! 846: char buf[256]; ! 847: c_fncall (); ! 848: ! 849: c_fnbegin (); ! 850: c_readea (ea, buf); ! 851: cln ("%s src = %s;", c_ssizes[size], buf); ! 852: cln ("%s dest = ((%s)0) - ((%s)src);", c_usizes[size], c_ssizes[size], c_ssizes[size]); ! 853: cln ("int flgs, flgn;"); ! 854: cln ("flgs = ((%s)src) < 0;", c_ssizes[size]); ! 855: cln ("flgn = ((%s)dest) < 0;", c_ssizes[size]); ! 856: ifZ { cln ("nZ = dest;"); } ! 857: ifV { cln ("V = (flgs & flgn);"); } ! 858: cln ("X = (dest != 0);"); ! 859: ifC { cln ("C = X;"); } ! 860: ifN { cln ("N = (flgn != 0);"); } ! 861: c_writeea (ea, size, "dest"); ! 862: c_postea (ea); ! 863: c_fnend (); ! 864: } ! 865: ! 866: void c_func_divu (ea_t *ea, int reg) ! 867: { ! 868: char buf[256]; ! 869: c_fncall (); ! 870: ! 871: c_fnbegin (); ! 872: c_readea (ea, buf); ! 873: cln ("s16 src = %s;\n", buf); ! 874: cln ("s32 dest = Regs[%d]._s32;", reg); ! 875: cln ("if (src == 0) {"); ! 876: ifV { cln (" V = 0;"); } ! 877: cln (" assert (src != 0);"); ! 878: cln ("} else {"); ! 879: cln (" u32 newv = (u32)dest / (u32)(u16)src;"); ! 880: cln (" u32 rem = (u32)dest % (u32)(u16)src;"); ! 881: cln (" if (newv > 0xffff) {"); ! 882: ifV { cln (" V = 1;"); } ! 883: ifN { cln (" N = 1;"); } ! 884: ifC { cln (" C = 0;"); } ! 885: cln (" } else {"); ! 886: ifC { cln (" C = 0;"); } ! 887: ifV { cln (" V = 0;"); } ! 888: ifZ { cln (" nZ = newv;"); } ! 889: ifN { cln (" N = (newv < 0);"); } ! 890: cln (" Regs[%d]._u32 = (newv & 0xffff) | ((u32)rem << 16);", reg); ! 891: cln ("}}"); ! 892: c_postea (ea); ! 893: c_fnend (); ! 894: } ! 895: ! 896: void c_func_divs (ea_t *ea, int reg) ! 897: { ! 898: char buf[256]; ! 899: c_fncall (); ! 900: ! 901: c_fnbegin (); ! 902: c_readea (ea, buf); ! 903: cln ("s16 src = %s;\n", buf); ! 904: cln ("s32 dest = Regs[%d]._s32;", reg); ! 905: cln ("if (src == 0) {"); ! 906: ifV { cln (" V = 0;"); } ! 907: cln (" assert (src != 0);"); ! 908: cln ("} else {"); ! 909: cln (" s32 newv = (s32)dest / (s32)(s16)src;"); ! 910: cln (" u16 rem = (s32)dest % (s32)(s16)src;"); ! 911: cln (" if ((newv & 0xffff8000) != 0 && (newv & 0xffff8000) != 0xffff8000) {"); ! 912: ifV { cln (" V = 1;"); } ! 913: ifN { cln (" N = 1;"); } ! 914: ifC { cln (" C = 0;"); } ! 915: cln (" } else {"); ! 916: ifC { cln (" C = 0;"); } ! 917: ifV { cln (" V = 0;"); } ! 918: ifZ { cln (" nZ = newv;"); } ! 919: ifN { cln (" N = (newv < 0);"); } ! 920: cln (" Regs[%d]._u32 = (newv & 0xffff) | ((u32)rem << 16);", reg); ! 921: cln ("}}"); ! 922: c_postea (ea); ! 923: c_fnend (); ! 924: } ! 925: ! 926: /* src is the shift */ ! 927: void c_func_asl (ea_t *src, ea_t *dest, int size) ! 928: { ! 929: char buf[256]; ! 930: unsigned int mask; ! 931: int shift, len; ! 932: ! 933: c_fncall (); ! 934: ! 935: c_fnbegin (); ! 936: if (size == BYTE) { ! 937: mask = 0xff; ! 938: len = 8; ! 939: } else if (size == WORD) { ! 940: mask = 0xffff; ! 941: len = 16; ! 942: } else { ! 943: mask = 0xffffffff; ! 944: len = 32; ! 945: } ! 946: ! 947: c_readea (dest, buf); ! 948: cln ("u32 val = %s;\n", buf); ! 949: ! 950: if (is_immediate (src)) { ! 951: /* mostly for the sake of -O0 compiles... */ ! 952: shift = src->imm.val; ! 953: ! 954: if (shift >= len) { ! 955: ifV cln ("V = (val != 0);"); ! 956: cln ("X = %s;", (shift == len ? "val & 1" : "0")); ! 957: ifC cln ("C = X;"); ! 958: cln ("val = 0;"); ! 959: } else { ! 960: ifV cln ("u32 mask = (0x%x << (%d - %d)) & 0x%x;", mask, len-1, shift, mask); ! 961: ifV cln ("V = (val & mask) != mask && (val & mask) != 0;"); ! 962: cln ("val <<= %d;", shift-1); ! 963: cln ("X = (val & 0x%x);", 1<<(len-1)); ! 964: ifC cln ("C = (val & 0x%x);", 1<<(len-1)); ! 965: cln ("val <<= 1;"); ! 966: } ! 967: } else { ! 968: c_readea (src, buf); ! 969: cln ("s32 src = %s & 63;", buf); ! 970: cln ("if (src >= %d) {", len); ! 971: ifV cln (" V = (val != 0);"); ! 972: cln (" X = (src == %d ? val & 1 : 0);", len); ! 973: ifC cln ("C = X;"); ! 974: cln (" val = 0;"); ! 975: cln ("} else if (src == 0) {"); ! 976: ifC cln (" C = 0;"); ! 977: ifV cln (" V = 0;"); ! 978: cln ("} else {"); ! 979: ifV cln (" u32 mask = (0x%x << (%d - src)) & 0x%x;", mask, len-1, mask); ! 980: ifV cln (" V = (val & mask) != mask && (val & mask) != 0;"); ! 981: cln (" val <<= src-1;"); ! 982: cln (" X = (val & 0x%x);", 1<<(len-1)); ! 983: ifC cln (" C = (val & 0x%x);", 1<<(len-1)); ! 984: cln (" val <<= 1;"); ! 985: //cln (" val &= 0x%x;", mask); ! 986: cln ("}"); ! 987: } ! 988: ifZ cln ("nZ = ((%s)(val)) != 0;", c_ssizes[size]); ! 989: ifN cln ("N = ((%s)(val)) < 0;", c_ssizes[size]); ! 990: ! 991: c_writeea (dest, size, "val"); ! 992: c_postea (dest); ! 993: c_postea (src); ! 994: c_fnend (); ! 995: } ! 996: ! 997: void c_func_lsl (ea_t *src, ea_t *dest, int size) ! 998: { ! 999: char buf[256]; ! 1000: unsigned int mask; ! 1001: int shift, len; ! 1002: ! 1003: c_fncall (); ! 1004: ! 1005: c_fnbegin (); ! 1006: if (size == BYTE) { ! 1007: mask = 0xff; ! 1008: len = 8; ! 1009: } else if (size == WORD) { ! 1010: mask = 0xffff; ! 1011: len = 16; ! 1012: } else { ! 1013: mask = 0xffffffff; ! 1014: len = 32; ! 1015: } ! 1016: ! 1017: c_readea (dest, buf); ! 1018: cln ("u32 val = (%s)%s;\n", c_usizes[size], buf); ! 1019: ! 1020: if (is_immediate (src)) { ! 1021: shift = src->imm.val; ! 1022: ! 1023: if (shift >= len) { ! 1024: cln ("X = %s;", (shift == len ? "val & 1" : "0")); ! 1025: ifC cln ("C = X;"); ! 1026: cln ("val = 0;"); ! 1027: } else { ! 1028: cln ("val <<= %d;", shift-1); ! 1029: cln ("X = (val & 0x%x);", 1<<(len-1)); ! 1030: ifC cln ("C = X;"); ! 1031: cln ("val <<= 1;"); ! 1032: cln ("val &= 0x%x;", mask); ! 1033: } ! 1034: } else { ! 1035: c_readea (src, buf); ! 1036: cln ("s32 shift = %s & 63;", buf); ! 1037: cln ("if (shift >= %d) {", len); ! 1038: cln (" X = (shift == %d ? val & 1 : 0);", len); ! 1039: ifC cln (" C = X;"); ! 1040: cln (" val = 0;"); ! 1041: cln ("} else if (shift == 0) {"); ! 1042: ifC cln (" C = 0;"); ! 1043: cln ("} else {"); ! 1044: cln (" val <<= shift-1;"); ! 1045: cln (" X = (val & 0x%x);", 1<<(len-1)); ! 1046: ifC cln (" C = X;"); ! 1047: cln (" val <<= 1;"); ! 1048: cln (" val &= 0x%x;", mask); ! 1049: cln ("}"); ! 1050: } ! 1051: ! 1052: ifZ cln ("nZ = ((%s)(val)) != 0;", c_ssizes[size]); ! 1053: ifN cln ("N = ((%s)(val)) < 0;", c_ssizes[size]); ! 1054: ifV cln ("V = 0;"); ! 1055: ! 1056: c_writeea (dest, size, "val"); ! 1057: c_postea (dest); ! 1058: c_postea (src); ! 1059: c_fnend (); ! 1060: } ! 1061: ! 1062: void c_func_roxr (ea_t *src, ea_t *dest, int size) ! 1063: { ! 1064: char buf[256]; ! 1065: unsigned int mask; ! 1066: int len; ! 1067: ! 1068: c_fncall (); ! 1069: ! 1070: c_fnbegin (); ! 1071: if (size == BYTE) { ! 1072: mask = 0xff; ! 1073: len = 8; ! 1074: } else if (size == WORD) { ! 1075: mask = 0xffff; ! 1076: len = 16; ! 1077: } else { ! 1078: mask = 0xffffffff; ! 1079: len = 32; ! 1080: } ! 1081: ! 1082: c_readea (dest, buf); ! 1083: cln ("u32 carry;"); ! 1084: cln ("u32 val = (%s)%s;\n", c_usizes[size], buf); ! 1085: ! 1086: c_readea (src, buf); ! 1087: cln ("s32 cnt = (%s & 63) - 1;", buf); ! 1088: ! 1089: cln ("u32 hival = (val << 1) | (X ? 1 : 0);"); ! 1090: cln ("hival <<= (%d - cnt);", len-1); ! 1091: cln ("val >>= cnt;"); ! 1092: cln ("carry = val & 1;"); ! 1093: cln ("val >>= 1;"); ! 1094: cln ("val |= hival;"); ! 1095: cln ("X = carry;"); ! 1096: cln ("val &= 0x%x;", mask); ! 1097: ifC cln ("C = X;"); ! 1098: ifZ cln ("nZ = val;"); ! 1099: ifN cln ("N = ((%s)val) < 0;", c_ssizes[size]); ! 1100: ifV cln ("V = 0;"); ! 1101: ! 1102: c_writeea (dest, size, "val"); ! 1103: c_postea (dest); ! 1104: c_postea (src); ! 1105: c_fnend (); ! 1106: } ! 1107: void c_func_roxl (ea_t *src, ea_t *dest, int size) ! 1108: { ! 1109: char buf[256]; ! 1110: unsigned int mask; ! 1111: int len; ! 1112: ! 1113: c_fncall (); ! 1114: ! 1115: c_fnbegin (); ! 1116: if (size == BYTE) { ! 1117: mask = 0xff; ! 1118: len = 8; ! 1119: } else if (size == WORD) { ! 1120: mask = 0xffff; ! 1121: len = 16; ! 1122: } else { ! 1123: mask = 0xffffffff; ! 1124: len = 32; ! 1125: } ! 1126: ! 1127: c_readea (dest, buf); ! 1128: cln ("u32 val = (%s)%s;\n", c_usizes[size], buf); ! 1129: ! 1130: c_readea (src, buf); ! 1131: cln ("s32 cnt = (%s & 63) - 1;", buf); ! 1132: ! 1133: cln ("u32 loval = val >> (%d - cnt);", len-1); ! 1134: cln ("u32 carry = loval & 1;"); ! 1135: cln ("val = (((val << 1) | (X ? 1 : 0)) << cnt) | (loval >> 1);"); ! 1136: cln ("X = carry;"); ! 1137: cln ("val &= 0x%x;", mask); ! 1138: ifC cln ("C = X;"); ! 1139: ifZ cln ("nZ = val;"); ! 1140: ifN cln ("N = ((%s)val) < 0;", c_ssizes[size]); ! 1141: ifV cln ("V = 0;"); ! 1142: ! 1143: c_writeea (dest, size, "val"); ! 1144: c_postea (dest); ! 1145: c_postea (src); ! 1146: c_fnend (); ! 1147: } ! 1148: void c_func_rol (ea_t *src, ea_t *dest, int size) ! 1149: { ! 1150: char buf[256]; ! 1151: unsigned int mask; ! 1152: int len; ! 1153: ! 1154: c_fncall (); ! 1155: ! 1156: c_fnbegin (); ! 1157: if (size == BYTE) { ! 1158: mask = 0xff; ! 1159: len = 8; ! 1160: } else if (size == WORD) { ! 1161: mask = 0xffff; ! 1162: len = 16; ! 1163: } else { ! 1164: mask = 0xffffffff; ! 1165: len = 32; ! 1166: } ! 1167: ! 1168: c_readea (dest, buf); ! 1169: cln ("u32 val = (%s)%s;\n", c_usizes[size], buf); ! 1170: ! 1171: c_readea (src, buf); ! 1172: cln ("s32 cnt = %s & 63;", buf); ! 1173: ! 1174: cln ("u32 loval;"); ! 1175: cln ("cnt &= %d;", len-1); ! 1176: cln ("loval = val >> (%d - cnt);", len); ! 1177: cln ("val <<= cnt;"); ! 1178: cln ("val |= loval;"); ! 1179: cln ("val &= 0x%x;", mask); ! 1180: ifC cln ("C = val & 1;"); ! 1181: ifZ cln ("nZ = val;"); ! 1182: ifN cln ("N = ((%s)val) < 0;", c_ssizes[size]); ! 1183: ifV cln ("V = 0;"); ! 1184: ! 1185: c_writeea (dest, size, "val"); ! 1186: c_postea (dest); ! 1187: c_postea (src); ! 1188: c_fnend (); ! 1189: } ! 1190: ! 1191: void c_func_ror (ea_t *src, ea_t *dest, int size) ! 1192: { ! 1193: char buf[256]; ! 1194: unsigned int mask; ! 1195: int len; ! 1196: ! 1197: c_fncall (); ! 1198: ! 1199: c_fnbegin (); ! 1200: if (size == BYTE) { ! 1201: mask = 0xff; ! 1202: len = 8; ! 1203: } else if (size == WORD) { ! 1204: mask = 0xffff; ! 1205: len = 16; ! 1206: } else { ! 1207: mask = 0xffffffff; ! 1208: len = 32; ! 1209: } ! 1210: ! 1211: c_readea (dest, buf); ! 1212: cln ("u32 val = (%s)%s;\n", c_usizes[size], buf); ! 1213: ! 1214: c_readea (src, buf); ! 1215: cln ("s32 cnt = %s & 63;", buf); ! 1216: ! 1217: cln ("u32 hival;"); ! 1218: cln ("cnt &= %d;", len-1); ! 1219: cln ("hival = val << (%d - cnt);", len); ! 1220: cln ("val >>= cnt;"); ! 1221: cln ("val |= hival;"); ! 1222: cln ("val &= 0x%x;", mask); ! 1223: ifC cln ("C = (val & 0x%x) >> %d;", 1<<(len-1), len-1); ! 1224: ifZ cln ("nZ = val;"); ! 1225: ifN cln ("N = ((%s)val) < 0;", c_ssizes[size]); ! 1226: ifV cln ("V = 0;"); ! 1227: ! 1228: c_writeea (dest, size, "val"); ! 1229: c_postea (dest); ! 1230: c_postea (src); ! 1231: c_fnend (); ! 1232: } ! 1233: ! 1234: void c_func_asr (ea_t *src, ea_t *dest, int size) ! 1235: { ! 1236: char buf[256]; ! 1237: unsigned int mask; ! 1238: int shift, len; ! 1239: ! 1240: c_fncall (); ! 1241: ! 1242: c_fnbegin (); ! 1243: if (size == BYTE) { ! 1244: mask = 0xff; ! 1245: len = 8; ! 1246: } else if (size == WORD) { ! 1247: mask = 0xffff; ! 1248: len = 16; ! 1249: } else { ! 1250: mask = 0xffffffff; ! 1251: len = 32; ! 1252: } ! 1253: ! 1254: c_readea (dest, buf); ! 1255: cln ("u32 val = (%s)%s;\n", c_usizes[size], buf); ! 1256: cln ("u32 sign = (0x%x & val) >> %d;", 1<<(len-1), len-1); ! 1257: ! 1258: if (is_immediate (src)) { ! 1259: shift = src->imm.val; ! 1260: ! 1261: if (shift >= len) { ! 1262: cln ("val = 0x%x & (u32)-sign;", mask); ! 1263: cln ("X = sign;"); ! 1264: ifC cln ("C = X;"); ! 1265: } else { ! 1266: cln ("val >>= %d;", shift-1); ! 1267: cln ("X = val & 1;"); ! 1268: ifC cln ("C = X;"); ! 1269: cln ("val >>= 1;"); ! 1270: cln ("val |= (0x%x << %d) & (u32)-sign;", mask, len - shift); ! 1271: } ! 1272: } else { ! 1273: c_readea (src, buf); ! 1274: cln ("s32 src = %s & 63;", buf); ! 1275: ! 1276: cln ("if (src >= %d) {", len); ! 1277: cln (" val = 0x%x & (u32)-sign;", mask); ! 1278: cln (" X = sign;"); ! 1279: ifC cln (" C = X;"); ! 1280: cln ("} else if (src == 0) {"); ! 1281: ifC cln (" C = 0;"); ! 1282: cln ("} else {"); ! 1283: cln (" val >>= src - 1;"); ! 1284: cln (" X = val & 1;"); ! 1285: ifC cln (" C = X;"); ! 1286: cln (" val >>= 1;"); ! 1287: cln (" val |= (0x%x << (%d - src)) & (u32)-sign;", mask, len); ! 1288: //cln (" val &= 0x%x;", mask); ! 1289: cln ("}"); ! 1290: } ! 1291: ifZ cln ("nZ = ((%s)(val)) != 0;", c_ssizes[size]); ! 1292: ifN cln ("N = ((%s)(val)) < 0;", c_ssizes[size]); ! 1293: ifV cln ("V = 0;"); ! 1294: ! 1295: c_writeea (dest, size, "val"); ! 1296: c_postea (dest); ! 1297: c_postea (src); ! 1298: c_fnend (); ! 1299: } ! 1300: void c_func_lsr (ea_t *src, ea_t *dest, int size) ! 1301: { ! 1302: char buf[256]; ! 1303: unsigned int mask; ! 1304: int shift, len; ! 1305: ! 1306: c_fncall (); ! 1307: ! 1308: c_fnbegin (); ! 1309: if (size == BYTE) { ! 1310: mask = 0xff; ! 1311: len = 8; ! 1312: } else if (size == WORD) { ! 1313: mask = 0xffff; ! 1314: len = 16; ! 1315: } else { ! 1316: mask = 0xffffffff; ! 1317: len = 32; ! 1318: } ! 1319: ! 1320: c_readea (dest, buf); ! 1321: cln ("u32 val = (%s)%s;\n", c_usizes[size], buf); ! 1322: ! 1323: if (is_immediate (src)) { ! 1324: shift = src->imm.val; ! 1325: ! 1326: if (shift >= len) { ! 1327: cln ("val = 0;"); ! 1328: cln ("X = %d && (val >> %d);", (shift == len), len-1); ! 1329: ifC cln ("C = X;"); ! 1330: } else { ! 1331: cln ("val >>= %d;", shift-1); ! 1332: cln ("X = val & 1;"); ! 1333: ifC cln ("C = X;"); ! 1334: cln ("val >>= 1;"); ! 1335: } ! 1336: } else { ! 1337: c_readea (src, buf); ! 1338: cln ("u32 shift = %s & 63;", buf); ! 1339: ! 1340: cln ("if (shift >= %d) {", len); ! 1341: cln (" val = 0;"); ! 1342: cln (" X = (shift == %d) && (val >> %d);", len, len-1); ! 1343: ifC cln (" C = X;"); ! 1344: cln ("} else if (shift == 0) {"); ! 1345: ifC cln (" C = 0;"); ! 1346: cln ("} else {"); ! 1347: cln (" val >>= shift - 1;"); ! 1348: cln (" X = val & 1;"); ! 1349: ifC cln (" C = X;"); ! 1350: cln (" val >>= 1;"); ! 1351: cln ("}"); ! 1352: } ! 1353: ! 1354: ifZ cln ("nZ = ((%s)(val)) != 0;", c_ssizes[size]); ! 1355: ifN cln ("N = ((%s)(val)) < 0;", c_ssizes[size]); ! 1356: ifV cln ("V = 0;"); ! 1357: ! 1358: c_writeea (dest, size, "val"); ! 1359: c_postea (dest); ! 1360: c_postea (src); ! 1361: c_fnend (); ! 1362: } ! 1363: ! 1364: void c_func_movem (ea_t *ea, int sz, int dr, int reg_mask) ! 1365: { ! 1366: int i, offset; ! 1367: char buf[256]; ! 1368: const char *read_func; ! 1369: const char *write_func; ! 1370: ! 1371: c_fncall (); ! 1372: ! 1373: c_fnbegin (); ! 1374: ! 1375: sz++; ! 1376: read_func = mem_read_funcs[sz]; ! 1377: write_func = mem_write_funcs[sz]; ! 1378: ! 1379: c_ea_get_address (ea, buf); ! 1380: ! 1381: if (dr == 0) { ! 1382: /* reg to memory */ ! 1383: cln ("s32 dest = %s;", buf); ! 1384: ! 1385: if (ea->mode == 4) { ! 1386: /* pre-decrement mode */ ! 1387: offset = 0; ! 1388: for (i=0; i<16; i++) { ! 1389: if (reg_mask & (1<<i)) { ! 1390: cln ("%s (dest, Regs[%d]._%s);", write_func, 15-i, c_usizes[sz]); ! 1391: cln ("dest -= %d;", 1<<sz); ! 1392: offset += 1<<sz; ! 1393: } ! 1394: } ! 1395: cln ("Regs[%d]._s32 -= %d;", ea->reg, offset); ! 1396: } else { ! 1397: for (i=0; i<16; i++) { ! 1398: if (reg_mask & (1<<i)) { ! 1399: cln ("%s (dest, Regs[%d]._%s);", write_func, i, c_usizes[sz]); ! 1400: cln ("dest += %d;", 1<<sz); ! 1401: } ! 1402: } ! 1403: } ! 1404: } else { ! 1405: /* mem to reg */ ! 1406: cln ("s32 src = %s;", buf); ! 1407: ! 1408: offset = 0; ! 1409: for (i=0; i<16; i++) { ! 1410: if (reg_mask & (1<<i)) { ! 1411: cln ("Regs[%d]._s32 = %s (src);", i, read_func); ! 1412: cln ("src += %d;", 1<<sz); ! 1413: offset += 1<<sz; ! 1414: } ! 1415: } ! 1416: /* post-inc mode */ ! 1417: if (ea->mode == 3) ! 1418: cln ("Regs[%d]._s32 += %d;", ea->reg, offset); ! 1419: } ! 1420: c_fnend (); ! 1421: } ! 1422: ! 1423: void c_func_subx (ea_t *src, ea_t *dest, int size) ! 1424: { ! 1425: char buf[256]; ! 1426: const char *sz = c_ssizes[size]; ! 1427: c_fncall (); ! 1428: ! 1429: c_fnbegin (); ! 1430: /* XXX nZ correct? */ ! 1431: c_readea (dest, buf); ! 1432: cln ("int flgs, flgo, flgn;"); ! 1433: cln ("%s dest = %s;", sz, buf); ! 1434: ! 1435: c_readea (src, buf); ! 1436: cln ("%s src = %s;", sz, buf); ! 1437: ! 1438: cln ("s32 newv = dest - src - (X ? 1 : 0);"); ! 1439: ! 1440: cln ("flgs = src < 0;", sz); ! 1441: cln ("flgo = dest < 0;", sz); ! 1442: cln ("flgn = ((%s)newv) < 0;", sz); ! 1443: ifV cln ("V = (flgs ^ flgo) & (flgo ^ flgn);"); ! 1444: cln ("X = (flgs ^ ((flgs ^ flgn) & (flgo ^ flgn)));"); ! 1445: ifC cln ("C = X;"); ! 1446: ifZ cln ("nZ = !((!nZ) & (((%s)(newv)) == 0));", sz); ! 1447: ifN cln ("N = ((%s)newv) < 0;", sz); ! 1448: c_writeea (dest, size, "newv"); ! 1449: c_postea (dest); ! 1450: c_postea (src); ! 1451: c_fnend (); ! 1452: } ! 1453: ! 1454: void c_func_addx (ea_t *src, ea_t *dest, int size) ! 1455: { ! 1456: char buf[256]; ! 1457: const char *sz = c_ssizes[size]; ! 1458: c_fncall (); ! 1459: ! 1460: c_fnbegin (); ! 1461: /* XXX nZ correct? */ ! 1462: c_readea (dest, buf); ! 1463: cln ("int flgs, flgo, flgn;"); ! 1464: cln ("%s dest = %s;", sz, buf); ! 1465: ! 1466: c_readea (src, buf); ! 1467: cln ("%s src = %s;", sz, buf); ! 1468: ! 1469: cln ("s32 newv = dest + src + (X ? 1 : 0);"); ! 1470: ! 1471: cln ("flgs = src < 0;", sz); ! 1472: cln ("flgo = dest < 0;", sz); ! 1473: cln ("flgn = ((%s)newv) < 0;", sz); ! 1474: ifV cln ("V = (flgs ^ flgn) & (flgo ^ flgn);"); ! 1475: cln ("X = (flgs ^ ((flgs ^ flgo) & (flgo ^ flgn)));"); ! 1476: ifC cln ("C = X;"); ! 1477: ifZ cln ("nZ = !((!nZ) & (((%s)(newv)) == 0));", sz); ! 1478: ifN cln ("N = ((%s)newv) < 0;", sz); ! 1479: c_writeea (dest, size, "newv"); ! 1480: c_postea (dest); ! 1481: c_postea (src); ! 1482: c_fnend (); ! 1483: } ! 1484: ! 1485: void c_func_add (ea_t *src, ea_t *dest, int size) ! 1486: { ! 1487: char buf[256]; ! 1488: const char *sz = c_ssizes[size]; ! 1489: const char *usz = c_usizes[size]; ! 1490: ! 1491: c_fncall (); ! 1492: ! 1493: c_fnbegin (); ! 1494: c_readea (dest, buf); ! 1495: cln ("s32 dest = %s;\n", buf); ! 1496: ! 1497: c_readea (src, buf); ! 1498: cln ("s32 src = %s;\n", buf); ! 1499: ! 1500: cln ("s32 val = (%s)dest + (%s)src;", sz, sz); ! 1501: ! 1502: ifV cln ("s32 flgs = ((%s)src) < 0;", sz); ! 1503: ifV cln ("s32 flgo = ((%s)dest) < 0;", sz); ! 1504: ifVoN cln ("s32 flgn = ((%s)val) < 0;", sz); ! 1505: ifZ cln ("nZ = val;"); ! 1506: ifV cln ("V = (flgs ^ flgn) & (flgo ^ flgn);"); ! 1507: cln ("X = ((%s)(~src)) < ((%s)dest);", usz, usz); ! 1508: ifC cln ("C = X;"); ! 1509: ifN cln ("N = (flgn != 0);"); ! 1510: c_writeea (dest, size, "val"); ! 1511: c_postea (dest); ! 1512: c_postea (src); ! 1513: c_fnend (); ! 1514: } ! 1515: ! 1516: void c_func_cmpa (ea_t *src, ea_t *dest, int size) ! 1517: { ! 1518: char buf[256]; ! 1519: const char *sz = c_ssizes[size]; ! 1520: c_fncall (); ! 1521: ! 1522: c_fnbegin (); ! 1523: ! 1524: cln ("s32 dest = Regs[%d]._s32;\n", dest->reg); ! 1525: ! 1526: c_readea (src, buf); ! 1527: cln ("%s src = %s;\n", sz, buf); ! 1528: ! 1529: cln ("s32 val = (s32)dest - (s32)src;"); ! 1530: ifV cln ("s32 flgs = ((s32)src) < 0;"); ! 1531: ifV cln ("s32 flgo = ((s32)dest) < 0;"); ! 1532: ifVoN cln ("s32 flgn = ((s32)val) < 0;"); ! 1533: ifZ cln ("nZ = val;"); ! 1534: ifV cln ("V = ((flgs != flgo) && (flgn != flgo));"); ! 1535: ifC cln ("C = ((u32)src) > ((u32)dest);"); ! 1536: ifN cln ("N = (flgn != 0);"); ! 1537: c_postea (dest); ! 1538: c_postea (src); ! 1539: c_fnend (); ! 1540: } ! 1541: ! 1542: void c_func_cmp (ea_t *src, ea_t *dest, int size) ! 1543: { ! 1544: char buf[256]; ! 1545: const char *sz = c_ssizes[size]; ! 1546: const char *usz = c_usizes[size]; ! 1547: c_fncall (); ! 1548: ! 1549: c_fnbegin (); ! 1550: ! 1551: c_readea (dest, buf); ! 1552: cln ("s32 dest = %s;\n", buf); ! 1553: ! 1554: c_readea (src, buf); ! 1555: cln ("s32 src = %s;\n", buf); ! 1556: ! 1557: cln ("s32 val = (%s)dest - (%s)src;", sz, sz); ! 1558: ! 1559: ifV cln ("s32 flgs = ((%s)src) < 0;", sz); ! 1560: ifV cln ("s32 flgo = ((%s)dest) < 0;", sz); ! 1561: ifVoN cln ("s32 flgn = ((%s)val) < 0;", sz); ! 1562: ifV cln ("V = ((flgs != flgo) && (flgn != flgo));"); ! 1563: ifC cln ("C = ((%s)src) > ((%s)dest);", usz, usz); ! 1564: ifN cln ("N = (flgn != 0);"); ! 1565: ifZ cln ("nZ = val;"); ! 1566: c_postea (dest); ! 1567: c_postea (src); ! 1568: c_fnend (); ! 1569: } ! 1570: ! 1571: void c_func_sub (ea_t *src, ea_t *dest, int size) ! 1572: { ! 1573: char buf[256]; ! 1574: const char *sz = c_ssizes[size]; ! 1575: const char *usz = c_usizes[size]; ! 1576: ! 1577: c_fncall (); ! 1578: ! 1579: c_fnbegin (); ! 1580: c_readea (dest, buf); ! 1581: cln ("s32 dest = %s;\n", buf); ! 1582: ! 1583: c_readea (src, buf); ! 1584: cln ("s32 src = %s;\n", buf); ! 1585: ! 1586: cln ("u32 newv = (%s)dest - (%s)src;", sz, sz); ! 1587: ! 1588: ifV cln ("s32 flgs = ((%s)src) < 0;", sz); ! 1589: ifV cln ("s32 flgo = ((%s)dest) < 0;", sz); ! 1590: ifVoN cln ("s32 flgn = ((%s)newv) < 0;", sz); ! 1591: ifZ cln ("nZ = newv;"); ! 1592: ifV cln ("V = (flgs ^ flgo) & (flgn ^ flgo);"); ! 1593: cln ("X = ((%s)src) > ((%s)dest);", usz, usz); ! 1594: ifC cln ("C = X;"); ! 1595: ifN cln ("N = (flgn != 0);"); ! 1596: c_writeea (dest, size, "newv"); ! 1597: c_postea (dest); ! 1598: c_postea (src); ! 1599: c_fnend (); ! 1600: } ! 1601: ! 1602: void c_func_adda (ea_t *src, int dest_reg, int size) ! 1603: { ! 1604: char buf[256]; ! 1605: if (gen_mode != GEN_CALL) return; ! 1606: c_readea (src, buf); ! 1607: cln ("Regs[%d]._u32 = Regs[%d]._s32 + (%s)%s;", dest_reg, dest_reg, c_ssizes[size], buf); ! 1608: c_postea (src); ! 1609: } ! 1610: ! 1611: void c_func_suba (ea_t *src, int dest_reg, int size) ! 1612: { ! 1613: char buf[256]; ! 1614: if (gen_mode != GEN_CALL) return; ! 1615: c_readea (src, buf); ! 1616: cln ("Regs[%d]._u32 = Regs[%d]._s32 - (%s)%s;", dest_reg, dest_reg, c_ssizes[size], buf); ! 1617: c_postea (src); ! 1618: } ! 1619: ! 1620: void c_func_swap (int reg) ! 1621: { ! 1622: c_fncall (); ! 1623: ! 1624: c_fnbegin (); ! 1625: cln ("s32 temp = Regs[%d].word[0];", reg); ! 1626: cln ("Regs[%d].word[0] = Regs[%d].word[1];", reg, reg); ! 1627: cln ("Regs[%d].word[1] = temp;", reg); ! 1628: ifZ cln ("nZ = Regs[%d]._s32;", reg); ! 1629: ifN cln ("N = (Regs[%d]._s32 < 0);", reg); ! 1630: ifV cln ("V = 0;"); ! 1631: ifC cln ("C = 0;"); ! 1632: c_fnend (); ! 1633: } ! 1634: ! 1635: void c_func_jsr (ea_t *dest) ! 1636: { ! 1637: char buf[256]; ! 1638: if (gen_mode != GEN_CALL) return; ! 1639: snprintf (buf, sizeof (buf), "%x", get_bitpos ()); ! 1640: add_label (buf, C_ADDR, get_bitpos () - BASE); ! 1641: add_fixup (0, C_ADDR, buf); ! 1642: ! 1643: snprintf (buf, sizeof (buf), "__D%x", get_bitpos ()); ! 1644: cln ("Regs[15]._s32 -= 4;"); ! 1645: cln ("wrlong (Regs[15]._s32, %s);", buf); ! 1646: ! 1647: c_jump (dest); ! 1648: } ! 1649: ! 1650: void c_func_bcc (ea_t *dest, int cond) ! 1651: { ! 1652: if (gen_mode != GEN_CALL) return; ! 1653: if (cond == 0) { ! 1654: c_jump (dest); ! 1655: } else { ! 1656: cout ("\tif ("); ! 1657: c_eval_cond (cond); ! 1658: cout (")\n"); ! 1659: c_jump_e (dest); ! 1660: } ! 1661: } ! 1662: ! 1663: /* XXX note: this does not call c_jump and therefore does not ! 1664: * check for pending exceptions. an infinite DBcc loop will not ! 1665: * allow exceptions to occur. ! 1666: * does it matter? */ ! 1667: void c_func_dbcc (const char *label, int cond, int reg) ! 1668: { ! 1669: if (gen_mode != GEN_CALL) return; ! 1670: if (cond == 0) { ! 1671: cln ("if (--Regs[%d]._s16 != -1) goto __N%s;\n", reg, label); ! 1672: } else { ! 1673: cout ("\tif ((!"); ! 1674: c_eval_cond (cond); ! 1675: cout (") && (--Regs[%d]._s16 != -1)) goto __N%s;\n", reg, label); ! 1676: } ! 1677: } ! 1678: ! 1679: void c_func_clr (ea_t *dest) ! 1680: { ! 1681: c_fncall (); ! 1682: ! 1683: c_fnbegin (); ! 1684: c_writeea (dest, dest->op_size, "0"); ! 1685: c_postea (dest); ! 1686: ifN cln ("N = 0;"); ! 1687: ifZ cln ("nZ = 0;"); ! 1688: ifV cln ("V = 0;"); ! 1689: ifC cln ("C = 0;"); ! 1690: c_fnend (); ! 1691: } ! 1692: ! 1693: void c_func_exg (int reg1, int reg2) ! 1694: { ! 1695: c_fncall (); ! 1696: ! 1697: c_fnbegin (); ! 1698: cln ("u32 temp = Regs[%d]._u32;", reg1); ! 1699: cln ("Regs[%d]._u32 = Regs[%d]._u32;", reg1, reg2); ! 1700: cln ("Regs[%d]._u32 = temp;", reg2); ! 1701: c_fnend (); ! 1702: } ! 1703: ! 1704: void c_func_ext (int reg, int size) ! 1705: { ! 1706: c_fncall (); ! 1707: ! 1708: c_fnbegin (); ! 1709: cln ("%s val = Regs[%d]._%s;", c_ssizes[size], reg, c_ssizes[size-1]); ! 1710: cln ("Regs[%d]._%s = val;", reg, c_ssizes[size]); ! 1711: ifZ cln ("nZ = val;"); ! 1712: ifN cln ("N = (val < 0);"); ! 1713: ifV cln ("V = 0;"); ! 1714: ifC cln ("C = 0;"); ! 1715: c_fnend (); ! 1716: } ! 1717: ! 1718: void c_func_rte () ! 1719: { ! 1720: if (gen_mode != GEN_CALL) return; ! 1721: cln ("N=bN; nZ=bnZ; V=bV; C=bC; X=bX;"); ! 1722: cln ("jdest = rdest;"); ! 1723: cln ("rdest = 0;"); ! 1724: cln ("goto jumptable;"); ! 1725: } ! 1726: ! 1727: void c_func_rts () ! 1728: { ! 1729: if (gen_mode != GEN_CALL) return; ! 1730: cln ("jdest = rdlong (Regs[15]._u32);"); ! 1731: cln ("Regs[15]._s32 += 4;"); ! 1732: cln ("goto jumptable;"); ! 1733: } ! 1734: ! 1735: void c_func_illegal () ! 1736: { ! 1737: if (gen_mode != GEN_CALL) return; ! 1738: cln ("printf (\"Illegal instruction at line %d.\\n\");", line_no); ! 1739: cln ("abort ();"); ! 1740: } ! 1741: ! 1742: void c_func_hcall (int val) ! 1743: { ! 1744: if (gen_mode != GEN_CALL) return; ! 1745: cln ("(* hcalls[%d]) ();", val); ! 1746: } ! 1747: ! 1748: void c_func_link (int reg, int val) ! 1749: { ! 1750: c_fncall (); ! 1751: ! 1752: c_fnbegin (); ! 1753: cln ("Regs[15]._u32 -= 4;"); ! 1754: cln ("wrlong (Regs[15]._u32, Regs[%d]._u32);", reg); ! 1755: cln ("Regs[%d]._u32 = Regs[15]._u32;", reg); ! 1756: cln ("Regs[15]._u32 += 0x%x;", val); ! 1757: c_fnend (); ! 1758: } ! 1759: ! 1760: void c_func_unlk (int reg) ! 1761: { ! 1762: c_fncall (); ! 1763: ! 1764: c_fnbegin (); ! 1765: cln ("Regs[15]._u32 = Regs[%d]._u32;", reg); ! 1766: cln ("Regs[%d]._u32 = rdlong (Regs[15]._u32);", reg); ! 1767: cln ("Regs[15]._u32 += 4;"); ! 1768: c_fnend (); ! 1769: } ! 1770: ! 1771: void c_func_move (ea_t *src, ea_t *dest, int size) ! 1772: { ! 1773: char buf[256]; ! 1774: c_fncall (); ! 1775: ! 1776: c_fnbegin (); ! 1777: c_readea (src, buf); ! 1778: cln ("s32 val = %s;", buf); ! 1779: c_writeea (dest, size, "val"); ! 1780: c_postea (src); ! 1781: c_postea (dest); ! 1782: ifZ cln ("nZ = val;"); ! 1783: ifN cln ("N = val < 0;"); ! 1784: ifV cln ("V = 0;"); ! 1785: ifC cln ("C = 0;"); ! 1786: c_fnend (); ! 1787: } ! 1788: ! 1789: void c_func_movea (ea_t *src, int reg_dest) ! 1790: { ! 1791: char buf[256]; ! 1792: if (gen_mode != GEN_CALL) return; ! 1793: assert (reg_dest > 7); ! 1794: c_readea (src, buf); ! 1795: cln ("Regs[%d]._s32 = %s;", reg_dest, buf); ! 1796: c_postea (src); ! 1797: } ! 1798: ! 1799: void c_func_tst (ea_t *ea) ! 1800: { ! 1801: char buf[256]; ! 1802: c_fncall (); ! 1803: ! 1804: c_fnbegin (); ! 1805: c_readea (ea, buf); ! 1806: cln ("nZ = %s;", buf); ! 1807: c_postea (ea); ! 1808: ifN cln ("N = nZ < 0;"); ! 1809: ifV cln ("V = 0;"); ! 1810: ifC cln ("C = 0;"); ! 1811: c_fnend (); ! 1812: } ! 1813: ! 1814: void c_func_pea (ea_t *ea) ! 1815: { ! 1816: char buf[256]; ! 1817: if (gen_mode != GEN_CALL) return; ! 1818: c_ea_get_address (ea, buf); ! 1819: ! 1820: cln ("Regs[15]._u32 -= 4;"); ! 1821: cln ("wrlong (Regs[15]._u32, %s);", buf); ! 1822: } ! 1823: ! 1824: void c_func_lea (ea_t *ea, int reg) ! 1825: { ! 1826: char buf[256]; ! 1827: if (gen_mode != GEN_CALL) return; ! 1828: c_ea_get_address (ea, buf); ! 1829: ! 1830: cln ("Regs[%d]._u32 = %s;", reg, buf); ! 1831: } ! 1832: ! 1833: void c_func_scc (ea_t *dest, int cond) ! 1834: { ! 1835: c_fncall (); ! 1836: ! 1837: c_fnbegin (); ! 1838: cout ("\tif ("); ! 1839: c_eval_cond (cond); ! 1840: cout (") {\n"); ! 1841: c_writeea (dest, BYTE, "0xff"); ! 1842: cln ("} else {"); ! 1843: c_writeea (dest, BYTE, "0"); ! 1844: cln ("}"); ! 1845: c_postea (dest); ! 1846: c_fnend (); ! 1847: } ! 1848: ! 1849: static void output_op (op_t *op, op_t *next) ! 1850: { ! 1851: switch (op->optype) { ! 1852: case OP_MULS: c_func_muls (&op->src, &op->dest); break; ! 1853: case OP_MULU: c_func_mulu (&op->src, &op->dest); break; ! 1854: case OP_ADDA: c_func_adda (&op->src, op->dest.reg, op->size); break; ! 1855: case OP_SUBA: c_func_suba (&op->src, op->dest.reg, op->size); break; ! 1856: case OP_ADD: c_func_add (&op->src, &op->dest, op->size); break; ! 1857: case OP_SUB: c_func_sub (&op->src, &op->dest, op->size); break; ! 1858: case OP_NOT: c_func_not (&op->src, op->size); break; ! 1859: case OP_NEGX: c_func_negx (&op->src, op->size); break; ! 1860: case OP_NEG: c_func_neg (&op->src, op->size); break; ! 1861: case OP_DIVS: c_func_divs (&op->src, op->dest.reg); break; ! 1862: case OP_DIVU: c_func_divu (&op->src, op->dest.reg); break; ! 1863: case OP_ADDX: c_func_addx (&op->src, &op->dest, op->size); break; ! 1864: case OP_SUBX: c_func_subx (&op->src, &op->dest, op->size); break; ! 1865: case OP_BCHG: c_func_bchg (&op->src, &op->dest, op->size); break; ! 1866: case OP_BCLR: c_func_bclr (&op->src, &op->dest, op->size); break; ! 1867: case OP_BSET: c_func_bset (&op->src, &op->dest, op->size); break; ! 1868: case OP_BTST: c_func_btst (&op->src, &op->dest, op->size); break; ! 1869: case OP_ASL: c_func_asl (&op->src, &op->dest, op->size); break; ! 1870: case OP_ASR: c_func_asr (&op->src, &op->dest, op->size); break; ! 1871: case OP_LSL: c_func_lsl (&op->src, &op->dest, op->size); break; ! 1872: case OP_LSR: c_func_lsr (&op->src, &op->dest, op->size); break; ! 1873: case OP_ROL: c_func_rol (&op->src, &op->dest, op->size); break; ! 1874: case OP_ROR: c_func_ror (&op->src, &op->dest, op->size); break; ! 1875: case OP_ROXL: c_func_roxl (&op->src, &op->dest, op->size); break; ! 1876: case OP_ROXR: c_func_roxr (&op->src, &op->dest, op->size); break; ! 1877: case OP_OR: c_func_logop (&op->src, &op->dest, op->size, '|'); break; ! 1878: case OP_AND: c_func_logop (&op->src, &op->dest, op->size, '&'); break; ! 1879: case OP_XOR: c_func_logop (&op->src, &op->dest, op->size, '^'); break; ! 1880: case OP_SWAP: c_func_swap (op->src.reg); break; ! 1881: case OP_JSR: c_func_jsr (&op->src); break; ! 1882: case OP_BCC: c_func_bcc (&op->src, op->opcode.Bcc.cond); break; ! 1883: case OP_DBCC: c_func_dbcc (op->dest.imm.label, op->opcode.Bcc.cond, op->src.reg); break; ! 1884: case OP_CLR: c_func_clr (&op->src); break; ! 1885: case OP_CMP: c_func_cmp (&op->src, &op->dest, op->size); break; ! 1886: case OP_CMPA: c_func_cmpa (&op->src, &op->dest, op->size); break; ! 1887: case OP_EXG: c_func_exg (op->src.reg, op->dest.reg); break; ! 1888: case OP_EXT: c_func_ext (op->src.reg, op->size); break; ! 1889: case OP_MOVEM: c_func_movem (&op->src, op->opcode.movem.sz, op->opcode.movem.dr, op->dest.reg); break; ! 1890: case OP_RTE: c_func_rte (); break; ! 1891: case OP_RTS: c_func_rts (); break; ! 1892: case OP_ILLEGAL: c_func_illegal (); break; ! 1893: case OP_HCALL: c_func_hcall (op->src.imm.val); break; ! 1894: case OP_LINK: c_func_link (op->src.reg, op->dest.imm.val); break; ! 1895: case OP_UNLK: c_func_unlk (op->src.reg); break; ! 1896: case OP_MOVE: c_func_move (&op->src, &op->dest, op->size); break; ! 1897: case OP_MOVEA: c_func_movea (&op->src, op->dest.reg); break; ! 1898: case OP_TST: c_func_tst (&op->src); break; ! 1899: case OP_PEA: c_func_pea (&op->src); break; ! 1900: case OP_LEA: c_func_lea (&op->src, op->dest.reg); break; ! 1901: case OP_JMP: c_jump (&op->src); break; ! 1902: case OP_SCC: c_func_scc (&op->src, op->opcode.DBcc.cond); break; ! 1903: ! 1904: default: ! 1905: printf ("type %d\n", op->optype); ! 1906: assert (0); ! 1907: } ! 1908: } ! 1909: ! 1910: void c_push_op (enum M68K_OPS type, ea_t *src, ea_t *dest, int size) ! 1911: { ! 1912: c_push_op2 (type, src, dest, size, 0); ! 1913: } ! 1914: void c_push_op2 (enum M68K_OPS type, ea_t *src, ea_t *dest, int size, int opcode) ! 1915: { ! 1916: next_op_type = type; ! 1917: ! 1918: if (pending.optype) { ! 1919: gen_mode = GEN_BODY; ! 1920: output_op (&pending, NULL); ! 1921: gen_mode = GEN_CALL; ! 1922: } ! 1923: ! 1924: pending.size = size; ! 1925: pending.opcode.code = opcode; ! 1926: pending.optype = type; ! 1927: ! 1928: if (type == OP_JSR) ! 1929: return_target = 1; ! 1930: else ! 1931: return_target = 0; ! 1932: ! 1933: if (src) { ! 1934: pending.src = *src; ! 1935: } ! 1936: if (dest) { ! 1937: pending.dest = *dest; ! 1938: } ! 1939: output_op (&pending, NULL); ! 1940: } ! 1941: void c_push_op_basic (enum M68K_OPS type) ! 1942: { ! 1943: c_push_op2 (type, NULL, NULL, 0, 0); ! 1944: } ! 1945:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.