|
|
1.1 ! root 1: /* ! 2: * Dsp56K disassembler ! 3: * ! 4: * ARAnyM (C) 2003 Patrice Mandin ! 5: * Adaption to Hatari (C) 2006 by Thomas Huth ! 6: * ! 7: * This program is free software; you can redistribute it and/or modify ! 8: * it under the terms of the GNU General Public License as published by ! 9: * the Free Software Foundation; either version 2 of the License, or ! 10: * (at your option) any later version. ! 11: * ! 12: * This program is distributed in the hope that it will be useful, ! 13: * but WITHOUT ANY WARRANTY; without even the implied warranty of ! 14: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ! 15: * GNU General Public License for more details. ! 16: * ! 17: * You should have received a copy of the GNU General Public License ! 18: * along with this program; if not, write to the Free Software ! 19: * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ! 20: */ ! 21: ! 22: #include "main.h" ! 23: #include "sysdeps.h" ! 24: #include "ioMem.h" ! 25: #include "dsp.h" ! 26: #include "dsp_cpu.h" ! 27: #include "dsp_disasm.h" ! 28: ! 29: #if DEBUG ! 30: #define D(x) x ! 31: #else ! 32: #define D(x) ! 33: #endif ! 34: ! 35: /* More disasm infos, if wanted */ ! 36: #define DSP_DISASM_REG_PC 0 ! 37: ! 38: /********************************** ! 39: * Defines ! 40: **********************************/ ! 41: ! 42: #define BITMASK(x) ((1<<(x))-1) ! 43: ! 44: /********************************** ! 45: * Variables ! 46: **********************************/ ! 47: ! 48: /* Current instruction */ ! 49: static uint32 cur_inst; ! 50: ! 51: /********************************** ! 52: * Register change ! 53: **********************************/ ! 54: ! 55: static uint32 registers_save[64]; ! 56: static uint32 registers_changed[64]; ! 57: #if DSP_DISASM_REG_PC ! 58: static uint32 pc_save; ! 59: #endif ! 60: ! 61: static const char *registers_name[64]={ ! 62: "","","","", ! 63: "x0","x1","y0","y1", ! 64: "a0","b0","a2","b2", ! 65: "a1","b1","a","b", ! 66: ! 67: "r0","r1","r2","r3", ! 68: "r4","r5","r6","r7", ! 69: "n0","n1","n2","n3", ! 70: "n4","n5","n6","n7", ! 71: ! 72: "m0","m1","m2","m3", ! 73: "m4","m5","m6","m7", ! 74: "","","","", ! 75: "","","","", ! 76: ! 77: "","","","", ! 78: "","","","", ! 79: "","sr","omr","sp", ! 80: "ssh","ssl","la","lc" ! 81: }; ! 82: ! 83: void dsp56k_disasm_reg_read(void) ! 84: { ! 85: memcpy(registers_save, dsp_registers , sizeof(registers_save)); ! 86: memset(registers_changed, 0, sizeof(registers_changed)); ! 87: #if DSP_DISASM_REG_PC ! 88: pc_save = dsp_pc; ! 89: #endif ! 90: } ! 91: ! 92: void dsp56k_disasm_reg_compare(void) ! 93: { ! 94: int i; ! 95: ! 96: for (i=0;i<64;i++) { ! 97: if (!registers_changed[i]) { ! 98: continue; ! 99: } ! 100: ! 101: switch(i) { ! 102: case DSP_REG_X0: ! 103: case DSP_REG_X1: ! 104: case DSP_REG_Y0: ! 105: case DSP_REG_Y1: ! 106: case DSP_REG_A0: ! 107: case DSP_REG_A1: ! 108: case DSP_REG_B0: ! 109: case DSP_REG_B1: ! 110: fprintf(stderr,"Dsp: Reg: %s: 0x%06x -> 0x%06x\n", registers_name[i], registers_save[i] & BITMASK(24), dsp_registers[i] & BITMASK(24)); ! 111: break; ! 112: case DSP_REG_R0: ! 113: case DSP_REG_R1: ! 114: case DSP_REG_R2: ! 115: case DSP_REG_R3: ! 116: case DSP_REG_R4: ! 117: case DSP_REG_R5: ! 118: case DSP_REG_R6: ! 119: case DSP_REG_R7: ! 120: case DSP_REG_M0: ! 121: case DSP_REG_M1: ! 122: case DSP_REG_M2: ! 123: case DSP_REG_M3: ! 124: case DSP_REG_M4: ! 125: case DSP_REG_M5: ! 126: case DSP_REG_M6: ! 127: case DSP_REG_M7: ! 128: case DSP_REG_N0: ! 129: case DSP_REG_N1: ! 130: case DSP_REG_N2: ! 131: case DSP_REG_N3: ! 132: case DSP_REG_N4: ! 133: case DSP_REG_N5: ! 134: case DSP_REG_N6: ! 135: case DSP_REG_N7: ! 136: case DSP_REG_SR: ! 137: case DSP_REG_LA: ! 138: case DSP_REG_LC: ! 139: fprintf(stderr,"Dsp: Reg: %s: 0x%04x -> 0x%04x\n", registers_name[i], registers_save[i] & BITMASK(16), dsp_registers[i] & BITMASK(16)); ! 140: break; ! 141: case DSP_REG_A2: ! 142: case DSP_REG_B2: ! 143: case DSP_REG_OMR: ! 144: case DSP_REG_SP: ! 145: case DSP_REG_SSH: ! 146: case DSP_REG_SSL: ! 147: fprintf(stderr,"Dsp: Reg: %s: 0x%02x -> 0x%02x\n", registers_name[i], registers_save[i] & BITMASK(8), dsp_registers[i] & BITMASK(8)); ! 148: break; ! 149: case DSP_REG_A: ! 150: case DSP_REG_B: ! 151: { ! 152: fprintf(stderr,"Dsp: Reg: %s: 0x%02x:%06x:%06x -> 0x%02x:%06x:%06x\n", ! 153: registers_name[i], ! 154: registers_save[DSP_REG_A2+(i & 1)] & BITMASK(8), ! 155: registers_save[DSP_REG_A1+(i & 1)] & BITMASK(24), ! 156: registers_save[DSP_REG_A0+(i & 1)] & BITMASK(24), ! 157: dsp_registers[DSP_REG_A2+(i & 1)] & BITMASK(8), ! 158: dsp_registers[DSP_REG_A1+(i & 1)] & BITMASK(24), ! 159: dsp_registers[DSP_REG_A0+(i & 1)] & BITMASK(24) ! 160: ); ! 161: } ! 162: break; ! 163: } ! 164: } ! 165: #if DSP_DISASM_REG_PC ! 166: if (pc_save != dsp_pc) { ! 167: fprintf(stderr,"Dsp: Reg: pc: 0x%04x -> 0x%04x\n", pc_save, dsp_pc); ! 168: } ! 169: #endif ! 170: } ! 171: ! 172: /********************************** ! 173: * Opcode disassembler ! 174: **********************************/ ! 175: ! 176: typedef void (*dsp_emul_t)(void); ! 177: ! 178: static void opcode8h_0(void); ! 179: static void opcode8h_1(void); ! 180: static void opcode8h_4(void); ! 181: static void opcode8h_6(void); ! 182: static void opcode8h_8(void); ! 183: static void opcode8h_a(void); ! 184: static void opcode8h_b(void); ! 185: ! 186: static int dsp_calc_ea(uint32 ea_mode, char *dest); ! 187: static void dsp_calc_cc(uint32 cc_mode, char *dest); ! 188: static void dsp_undefined(void); ! 189: ! 190: /* Instructions without parallel moves */ ! 191: static void dsp_andi(void); ! 192: static void dsp_bchg(void); ! 193: static void dsp_bclr(void); ! 194: static void dsp_bset(void); ! 195: static void dsp_btst(void); ! 196: static void dsp_div(void); ! 197: static void dsp_do(void); ! 198: static void dsp_enddo(void); ! 199: static void dsp_illegal(void); ! 200: static void dsp_jcc(void); ! 201: static void dsp_jclr(void); ! 202: static void dsp_jmp(void); ! 203: static void dsp_jscc(void); ! 204: static void dsp_jsclr(void); ! 205: static void dsp_jset(void); ! 206: static void dsp_jsr(void); ! 207: static void dsp_jsset(void); ! 208: static void dsp_lua(void); ! 209: static void dsp_movec(void); ! 210: static void dsp_movem(void); ! 211: static void dsp_movep(void); ! 212: static void dsp_nop(void); ! 213: static void dsp_norm(void); ! 214: static void dsp_ori(void); ! 215: static void dsp_rep(void); ! 216: static void dsp_reset(void); ! 217: static void dsp_rti(void); ! 218: static void dsp_rts(void); ! 219: static void dsp_stop(void); ! 220: static void dsp_swi(void); ! 221: static void dsp_tcc(void); ! 222: static void dsp_wait(void); ! 223: ! 224: static void dsp_do_0(void); ! 225: static void dsp_do_2(void); ! 226: static void dsp_do_4(void); ! 227: static void dsp_do_c(void); ! 228: static void dsp_movec_7(void); ! 229: static void dsp_movec_9(void); ! 230: static void dsp_movec_b(void); ! 231: static void dsp_movec_d(void); ! 232: static void dsp_movep_0(void); ! 233: static void dsp_movep_1(void); ! 234: static void dsp_movep_2(void); ! 235: static void dsp_rep_1(void); ! 236: static void dsp_rep_3(void); ! 237: static void dsp_rep_5(void); ! 238: static void dsp_rep_d(void); ! 239: ! 240: /* Parallel moves */ ! 241: static void dsp_pm(void); ! 242: static void dsp_pm_0(void); ! 243: static void dsp_pm_1(void); ! 244: static void dsp_pm_2(void); ! 245: static void dsp_pm_4(void); ! 246: static void dsp_pm_8(void); ! 247: ! 248: /* Instructions with parallel moves */ ! 249: static void dsp_abs(void); ! 250: static void dsp_adc(void); ! 251: static void dsp_add(void); ! 252: static void dsp_addl(void); ! 253: static void dsp_addr(void); ! 254: static void dsp_and(void); ! 255: static void dsp_asl(void); ! 256: static void dsp_asr(void); ! 257: static void dsp_clr(void); ! 258: static void dsp_cmp(void); ! 259: static void dsp_cmpm(void); ! 260: static void dsp_eor(void); ! 261: static void dsp_lsl(void); ! 262: static void dsp_lsr(void); ! 263: static void dsp_mac(void); ! 264: static void dsp_macr(void); ! 265: static void dsp_move(void); ! 266: static void dsp_move_nopm(void); ! 267: static void dsp_mpy(void); ! 268: static void dsp_mpyr(void); ! 269: static void dsp_neg(void); ! 270: static void dsp_not(void); ! 271: static void dsp_or(void); ! 272: static void dsp_rnd(void); ! 273: static void dsp_rol(void); ! 274: static void dsp_ror(void); ! 275: static void dsp_sbc(void); ! 276: static void dsp_sub(void); ! 277: static void dsp_subl(void); ! 278: static void dsp_subr(void); ! 279: static void dsp_tfr(void); ! 280: static void dsp_tst(void); ! 281: ! 282: static dsp_emul_t opcodes8h[16]={ ! 283: opcode8h_0, ! 284: opcode8h_1, ! 285: dsp_tcc, ! 286: dsp_tcc, ! 287: opcode8h_4, ! 288: dsp_movec, ! 289: opcode8h_6, ! 290: dsp_movem, ! 291: opcode8h_8, ! 292: opcode8h_8, ! 293: opcode8h_a, ! 294: opcode8h_b, ! 295: dsp_jmp, ! 296: dsp_jsr, ! 297: dsp_jcc, ! 298: dsp_jscc ! 299: }; ! 300: ! 301: static dsp_emul_t opcodes_0809[16]={ ! 302: dsp_move_nopm, ! 303: dsp_move_nopm, ! 304: dsp_move_nopm, ! 305: dsp_move_nopm, ! 306: ! 307: dsp_movep, ! 308: dsp_movep, ! 309: dsp_movep, ! 310: dsp_movep, ! 311: ! 312: dsp_move_nopm, ! 313: dsp_move_nopm, ! 314: dsp_move_nopm, ! 315: dsp_move_nopm, ! 316: ! 317: dsp_movep, ! 318: dsp_movep, ! 319: dsp_movep, ! 320: dsp_movep ! 321: }; ! 322: ! 323: static dsp_emul_t opcodes_0a[32]={ ! 324: dsp_bclr, ! 325: dsp_bset, ! 326: dsp_bclr, ! 327: dsp_bset, ! 328: dsp_jclr, ! 329: dsp_jset, ! 330: dsp_jclr, ! 331: dsp_jset, ! 332: ! 333: dsp_bclr, ! 334: dsp_bset, ! 335: dsp_bclr, ! 336: dsp_bset, ! 337: dsp_jclr, ! 338: dsp_jset, ! 339: dsp_jclr, ! 340: dsp_jset, ! 341: ! 342: dsp_bclr, ! 343: dsp_bset, ! 344: dsp_bclr, ! 345: dsp_bset, ! 346: dsp_jclr, ! 347: dsp_jset, ! 348: dsp_jclr, ! 349: dsp_jset, ! 350: ! 351: dsp_jclr, ! 352: dsp_jset, ! 353: dsp_bclr, ! 354: dsp_bset, ! 355: dsp_jmp, ! 356: dsp_jcc, ! 357: dsp_undefined, ! 358: dsp_undefined ! 359: }; ! 360: ! 361: static dsp_emul_t opcodes_0b[32]={ ! 362: dsp_bchg, ! 363: dsp_btst, ! 364: dsp_bchg, ! 365: dsp_btst, ! 366: dsp_jsclr, ! 367: dsp_jsset, ! 368: dsp_jsclr, ! 369: dsp_jsset, ! 370: ! 371: dsp_bchg, ! 372: dsp_btst, ! 373: dsp_bchg, ! 374: dsp_btst, ! 375: dsp_jsclr, ! 376: dsp_jsset, ! 377: dsp_jsclr, ! 378: dsp_jsset, ! 379: ! 380: dsp_bchg, ! 381: dsp_btst, ! 382: dsp_bchg, ! 383: dsp_btst, ! 384: dsp_jsclr, ! 385: dsp_jsset, ! 386: dsp_jsclr, ! 387: dsp_jsset, ! 388: ! 389: dsp_jsclr, ! 390: dsp_jsclr, ! 391: dsp_bchg, ! 392: dsp_btst, ! 393: dsp_jsr, ! 394: dsp_jscc, ! 395: dsp_undefined, ! 396: dsp_undefined ! 397: }; ! 398: ! 399: static dsp_emul_t opcodes_alu003f[64]={ ! 400: /* 0x00 - 0x0f */ ! 401: dsp_move, ! 402: dsp_tfr, ! 403: dsp_addr, ! 404: dsp_tst, ! 405: dsp_undefined, ! 406: dsp_cmp, ! 407: dsp_subr, ! 408: dsp_cmpm, ! 409: dsp_undefined, ! 410: dsp_tfr, ! 411: dsp_addr, ! 412: dsp_tst, ! 413: dsp_undefined, ! 414: dsp_cmp, ! 415: dsp_subr, ! 416: dsp_cmpm, ! 417: ! 418: /* 0x10 - 0x1f */ ! 419: dsp_add, ! 420: dsp_rnd, ! 421: dsp_addl, ! 422: dsp_clr, ! 423: dsp_sub, ! 424: dsp_undefined, ! 425: dsp_subl, ! 426: dsp_not, ! 427: dsp_add, ! 428: dsp_rnd, ! 429: dsp_addl, ! 430: dsp_clr, ! 431: dsp_sub, ! 432: dsp_undefined, ! 433: dsp_subl, ! 434: dsp_not, ! 435: ! 436: /* 0x20 - 0x2f */ ! 437: dsp_add, ! 438: dsp_adc, ! 439: dsp_asr, ! 440: dsp_lsr, ! 441: dsp_sub, ! 442: dsp_sbc, ! 443: dsp_abs, ! 444: dsp_ror, ! 445: dsp_add, ! 446: dsp_adc, ! 447: dsp_asr, ! 448: dsp_lsr, ! 449: dsp_sub, ! 450: dsp_sbc, ! 451: dsp_abs, ! 452: dsp_ror, ! 453: ! 454: /* 0x30 - 0x3f */ ! 455: dsp_add, ! 456: dsp_adc, ! 457: dsp_asl, ! 458: dsp_lsl, ! 459: dsp_sub, ! 460: dsp_sbc, ! 461: dsp_neg, ! 462: dsp_rol, ! 463: dsp_add, ! 464: dsp_adc, ! 465: dsp_asl, ! 466: dsp_lsl, ! 467: dsp_sub, ! 468: dsp_sbc, ! 469: dsp_neg, ! 470: dsp_rol ! 471: }; ! 472: ! 473: static dsp_emul_t opcodes_alu407f[16]={ ! 474: dsp_add, ! 475: dsp_tfr, ! 476: dsp_or, ! 477: dsp_eor, ! 478: dsp_sub, ! 479: dsp_cmp, ! 480: dsp_and, ! 481: dsp_cmpm, ! 482: dsp_add, ! 483: dsp_tfr, ! 484: dsp_or, ! 485: dsp_eor, ! 486: dsp_sub, ! 487: dsp_cmp, ! 488: dsp_and, ! 489: dsp_cmpm ! 490: }; ! 491: ! 492: static dsp_emul_t opcodes_alu80ff[4]={ ! 493: dsp_mpy, ! 494: dsp_mpyr, ! 495: dsp_mac, ! 496: dsp_macr ! 497: }; ! 498: ! 499: static dsp_emul_t opcodes_do[16]={ ! 500: dsp_do_0, ! 501: dsp_undefined, ! 502: dsp_do_2, ! 503: dsp_undefined, ! 504: ! 505: dsp_do_4, ! 506: dsp_undefined, ! 507: dsp_do_2, ! 508: dsp_undefined, ! 509: ! 510: dsp_undefined, ! 511: dsp_undefined, ! 512: dsp_do_2, ! 513: dsp_undefined, ! 514: ! 515: dsp_do_c, ! 516: dsp_undefined, ! 517: dsp_do_2, ! 518: dsp_undefined ! 519: }; ! 520: ! 521: static dsp_emul_t opcodes_movec[16]={ ! 522: dsp_undefined, ! 523: dsp_undefined, ! 524: dsp_undefined, ! 525: dsp_undefined, ! 526: ! 527: dsp_undefined, ! 528: dsp_undefined, ! 529: dsp_undefined, ! 530: dsp_movec_7, ! 531: ! 532: dsp_undefined, ! 533: dsp_movec_9, ! 534: dsp_undefined, ! 535: dsp_movec_b, ! 536: ! 537: dsp_undefined, ! 538: dsp_movec_d, ! 539: dsp_undefined, ! 540: dsp_movec_b ! 541: }; ! 542: ! 543: static dsp_emul_t opcodes_movep[4]={ ! 544: dsp_movep_0, ! 545: dsp_movep_1, ! 546: dsp_movep_2, ! 547: dsp_movep_2 ! 548: }; ! 549: ! 550: static dsp_emul_t opcodes_rep[16]={ ! 551: dsp_undefined, ! 552: dsp_rep_1, ! 553: dsp_undefined, ! 554: dsp_rep_3, ! 555: ! 556: dsp_undefined, ! 557: dsp_rep_5, ! 558: dsp_undefined, ! 559: dsp_rep_3, ! 560: ! 561: dsp_undefined, ! 562: dsp_undefined, ! 563: dsp_undefined, ! 564: dsp_rep_3, ! 565: ! 566: dsp_undefined, ! 567: dsp_rep_d, ! 568: dsp_undefined, ! 569: dsp_rep_3 ! 570: }; ! 571: ! 572: static dsp_emul_t opcodes_parmove[16]={ ! 573: dsp_pm_0, ! 574: dsp_pm_1, ! 575: dsp_pm_2, ! 576: dsp_pm_2, ! 577: dsp_pm_4, ! 578: dsp_pm_4, ! 579: dsp_pm_4, ! 580: dsp_pm_4, ! 581: ! 582: dsp_pm_8, ! 583: dsp_pm_8, ! 584: dsp_pm_8, ! 585: dsp_pm_8, ! 586: dsp_pm_8, ! 587: dsp_pm_8, ! 588: dsp_pm_8, ! 589: dsp_pm_8 ! 590: }; ! 591: ! 592: static int registers_tcc[16][2]={ ! 593: {DSP_REG_B,DSP_REG_A}, ! 594: {DSP_REG_A,DSP_REG_B}, ! 595: {DSP_REG_NULL,DSP_REG_NULL}, ! 596: {DSP_REG_NULL,DSP_REG_NULL}, ! 597: ! 598: {DSP_REG_NULL,DSP_REG_NULL}, ! 599: {DSP_REG_NULL,DSP_REG_NULL}, ! 600: {DSP_REG_NULL,DSP_REG_NULL}, ! 601: {DSP_REG_NULL,DSP_REG_NULL}, ! 602: ! 603: {DSP_REG_X0,DSP_REG_A}, ! 604: {DSP_REG_X0,DSP_REG_B}, ! 605: {DSP_REG_X1,DSP_REG_A}, ! 606: {DSP_REG_X1,DSP_REG_B}, ! 607: ! 608: {DSP_REG_Y0,DSP_REG_A}, ! 609: {DSP_REG_Y0,DSP_REG_B}, ! 610: {DSP_REG_Y1,DSP_REG_A}, ! 611: {DSP_REG_Y1,DSP_REG_B} ! 612: }; ! 613: ! 614: static const char *registers_lmove[8]={ ! 615: "a10", ! 616: "b10", ! 617: "x", ! 618: "y", ! 619: "a", ! 620: "b", ! 621: "ab", ! 622: "ba" ! 623: }; ! 624: ! 625: static const char *ea_names[9]={ ! 626: "(r%d)-n%d", /* 000xxx */ ! 627: "(r%d)+n%d", /* 001xxx */ ! 628: "(r%d)-", /* 010xxx */ ! 629: "(r%d)+", /* 011xxx */ ! 630: "(r%d)", /* 100xxx */ ! 631: "(r%d+n%d)", /* 101xxx */ ! 632: "0x%04x", /* 110000 */ ! 633: "-(r%d)", /* 111xxx */ ! 634: "0x%06x" /* 110100 */ ! 635: }; ! 636: ! 637: static const char *cc_name[16]={ ! 638: "cc", ! 639: "ge", ! 640: "ne", ! 641: "pl", ! 642: "nn", ! 643: "ec", ! 644: "lc", ! 645: "gt", ! 646: ! 647: "cs", ! 648: "lt", ! 649: "eq", ! 650: "mi", ! 651: "nr", ! 652: "es", ! 653: "ls", ! 654: "le" ! 655: }; ! 656: ! 657: static char parallelmove_name[64]; ! 658: ! 659: void dsp56k_disasm(void) ! 660: { ! 661: uint32 value; ! 662: ! 663: cur_inst = dsp_ram[DSP_SPACE_P][dsp_pc]; ! 664: ! 665: #if 0 ! 666: if (dsp_pc == 0x728) { ! 667: D(bug("Dsp: Disasm: instruction = 0x%06x",cur_inst)); ! 668: } ! 669: #endif ! 670: ! 671: strcpy(parallelmove_name, ""); ! 672: ! 673: value = (cur_inst >> 16) & BITMASK(8); ! 674: if (value< 0x10) { ! 675: opcodes8h[value](); ! 676: } else { ! 677: dsp_pm(); ! 678: value = cur_inst & BITMASK(8); ! 679: if (value < 0x40) { ! 680: opcodes_alu003f[value](); ! 681: } else if (value < 0x80) { ! 682: value &= BITMASK(4); ! 683: opcodes_alu407f[value](); ! 684: } else { ! 685: value &= BITMASK(2); ! 686: opcodes_alu80ff[value](); ! 687: } ! 688: } ! 689: } ! 690: ! 691: /********************************** ! 692: * Conditions code calculation ! 693: **********************************/ ! 694: ! 695: static void dsp_calc_cc(uint32 cc_mode, char *dest) ! 696: { ! 697: strcpy(dest, cc_name[cc_mode & BITMASK(4)]); ! 698: } ! 699: ! 700: /********************************** ! 701: * Effective address calculation ! 702: **********************************/ ! 703: ! 704: static int dsp_calc_ea(uint32 ea_mode, char *dest) ! 705: { ! 706: int value, retour, numreg; ! 707: ! 708: value = (ea_mode >> 3) & BITMASK(3); ! 709: numreg = ea_mode & BITMASK(3); ! 710: retour = 0; ! 711: switch (value) { ! 712: case 0: ! 713: /* (Rx)-Nx */ ! 714: sprintf(dest, ea_names[value], numreg, numreg); ! 715: registers_changed[DSP_REG_R0+numreg]=1; ! 716: break; ! 717: case 1: ! 718: /* (Rx)+Nx */ ! 719: sprintf(dest, ea_names[value], numreg, numreg); ! 720: registers_changed[DSP_REG_R0+numreg]=1; ! 721: break; ! 722: case 5: ! 723: /* (Rx+Nx) */ ! 724: sprintf(dest, ea_names[value], numreg, numreg); ! 725: break; ! 726: case 2: ! 727: /* (Rx)- */ ! 728: sprintf(dest, ea_names[value], numreg); ! 729: registers_changed[DSP_REG_R0+numreg]=1; ! 730: break; ! 731: case 3: ! 732: /* (Rx)+ */ ! 733: sprintf(dest, ea_names[value], numreg); ! 734: registers_changed[DSP_REG_R0+numreg]=1; ! 735: break; ! 736: case 4: ! 737: /* (Rx) */ ! 738: sprintf(dest, ea_names[value], numreg); ! 739: break; ! 740: case 7: ! 741: /* -(Rx) */ ! 742: sprintf(dest, ea_names[value], numreg); ! 743: registers_changed[DSP_REG_R0+numreg]=1; ! 744: break; ! 745: case 6: ! 746: switch ((ea_mode >> 2) & 1) { ! 747: case 0: ! 748: /* Absolute address */ ! 749: sprintf(dest, ea_names[value], dsp_ram[DSP_SPACE_P][dsp_pc+1]); ! 750: break; ! 751: case 1: ! 752: /* Immediate value */ ! 753: sprintf(dest, ea_names[8], dsp_ram[DSP_SPACE_P][dsp_pc+1]); ! 754: retour = 1; ! 755: break; ! 756: } ! 757: break; ! 758: } ! 759: return retour; ! 760: } ! 761: ! 762: static void opcode8h_0(void) ! 763: { ! 764: uint32 value; ! 765: ! 766: if (cur_inst <= 0x00008c) { ! 767: switch(cur_inst) { ! 768: case 0x000000: ! 769: dsp_nop(); ! 770: break; ! 771: case 0x000004: ! 772: dsp_rti(); ! 773: break; ! 774: case 0x000005: ! 775: dsp_illegal(); ! 776: break; ! 777: case 0x000006: ! 778: dsp_swi(); ! 779: break; ! 780: case 0x00000c: ! 781: dsp_rts(); ! 782: break; ! 783: case 0x000084: ! 784: dsp_reset(); ! 785: break; ! 786: case 0x000086: ! 787: dsp_wait(); ! 788: break; ! 789: case 0x000087: ! 790: dsp_stop(); ! 791: break; ! 792: case 0x00008c: ! 793: dsp_enddo(); ! 794: break; ! 795: } ! 796: } else { ! 797: value = cur_inst & 0xf8; ! 798: switch (value) { ! 799: case 0x0000b8: ! 800: dsp_andi(); ! 801: break; ! 802: case 0x0000f8: ! 803: dsp_ori(); ! 804: break; ! 805: } ! 806: } ! 807: } ! 808: ! 809: static void opcode8h_1(void) ! 810: { ! 811: switch(cur_inst & 0xfff8c7) { ! 812: case 0x018040: ! 813: dsp_div(); ! 814: break; ! 815: case 0x01c805: ! 816: dsp_norm(); ! 817: break; ! 818: } ! 819: } ! 820: ! 821: static void opcode8h_4(void) ! 822: { ! 823: switch((cur_inst>>5) & BITMASK(3)) { ! 824: case 0: ! 825: dsp_lua(); ! 826: break; ! 827: case 5: ! 828: dsp_movec(); ! 829: break; ! 830: } ! 831: } ! 832: ! 833: static void opcode8h_6(void) ! 834: { ! 835: if (cur_inst & (1<<5)) { ! 836: dsp_rep(); ! 837: } else { ! 838: dsp_do(); ! 839: } ! 840: } ! 841: ! 842: static void opcode8h_8(void) ! 843: { ! 844: uint32 value; ! 845: ! 846: value = (cur_inst >> 12) & BITMASK(4); ! 847: opcodes_0809[value](); ! 848: } ! 849: ! 850: static void opcode8h_a(void) ! 851: { ! 852: uint32 value; ! 853: ! 854: value = (cur_inst >> 11) & (BITMASK(2)<<3); ! 855: value |= (cur_inst >> 5) & BITMASK(3); ! 856: ! 857: opcodes_0a[value](); ! 858: } ! 859: ! 860: static void opcode8h_b(void) ! 861: { ! 862: uint32 value; ! 863: ! 864: value = (cur_inst >> 11) & (BITMASK(2)<<3); ! 865: value |= (cur_inst >> 5) & BITMASK(3); ! 866: ! 867: opcodes_0b[value](); ! 868: } ! 869: ! 870: /********************************** ! 871: * Non-parallel moves instructions ! 872: **********************************/ ! 873: ! 874: static void dsp_undefined(void) ! 875: { ! 876: fprintf(stderr,"Dsp: 0x%04x: 0x%06x unknown instruction\n",dsp_pc, cur_inst); ! 877: } ! 878: ! 879: static void dsp_andi(void) ! 880: { ! 881: const char *regname; ! 882: ! 883: switch(cur_inst & BITMASK(2)) { ! 884: case 0: ! 885: regname="mr"; ! 886: registers_changed[DSP_REG_SR]=1; ! 887: break; ! 888: case 1: ! 889: regname="ccr"; ! 890: registers_changed[DSP_REG_SR]=1; ! 891: break; ! 892: case 2: ! 893: regname="omr"; ! 894: registers_changed[DSP_REG_OMR]=1; ! 895: break; ! 896: default: ! 897: regname=""; ! 898: break; ! 899: } ! 900: ! 901: fprintf(stderr,"Dsp: 0x%04x: andi #0x%02x,%s\n", ! 902: dsp_pc, ! 903: (cur_inst>>8) & BITMASK(8), ! 904: regname ! 905: ); ! 906: } ! 907: ! 908: static void dsp_bchg(void) ! 909: { ! 910: char name[16], addr_name[16]; ! 911: uint32 memspace, value, numbit; ! 912: ! 913: memspace = (cur_inst>>6) & 1; ! 914: value = (cur_inst>>8) & BITMASK(6); ! 915: numbit = cur_inst & BITMASK(5); ! 916: ! 917: switch((cur_inst>>14) & BITMASK(2)) { ! 918: case 0: ! 919: /* bchg #n,x:aa */ ! 920: /* bchg #n,y:aa */ ! 921: if (memspace) { ! 922: sprintf(name,"y:0x%04x",value); ! 923: } else { ! 924: sprintf(name,"x:0x%04x",value); ! 925: } ! 926: break; ! 927: case 1: ! 928: /* bchg #n,x:ea */ ! 929: /* bchg #n,y:ea */ ! 930: dsp_calc_ea(value, addr_name); ! 931: if (memspace) { ! 932: sprintf(name,"y:%s",addr_name); ! 933: } else { ! 934: sprintf(name,"x:%s",addr_name); ! 935: } ! 936: break; ! 937: case 2: ! 938: /* bchg #n,x:pp */ ! 939: /* bchg #n,y:pp */ ! 940: if (memspace) { ! 941: sprintf(name,"y:0x%04x",value+0xffc0); ! 942: } else { ! 943: sprintf(name,"x:0x%04x",value+0xffc0); ! 944: } ! 945: break; ! 946: case 3: ! 947: /* bchg #n,R */ ! 948: sprintf(name,"%s",registers_name[value]); ! 949: registers_changed[value]=1; ! 950: break; ! 951: } ! 952: ! 953: fprintf(stderr,"Dsp: 0x%04x: bchg #%d,%s\n",dsp_pc, numbit, name); ! 954: } ! 955: ! 956: static void dsp_bclr(void) ! 957: { ! 958: char name[16], addr_name[16]; ! 959: uint32 memspace, value, numbit; ! 960: ! 961: memspace = (cur_inst>>6) & 1; ! 962: value = (cur_inst>>8) & BITMASK(6); ! 963: numbit = cur_inst & BITMASK(5); ! 964: ! 965: switch((cur_inst>>14) & BITMASK(2)) { ! 966: case 0: ! 967: /* bclr #n,x:aa */ ! 968: /* bclr #n,y:aa */ ! 969: if (memspace) { ! 970: sprintf(name,"y:0x%04x",value); ! 971: } else { ! 972: sprintf(name,"x:0x%04x",value); ! 973: } ! 974: break; ! 975: case 1: ! 976: /* bclr #n,x:ea */ ! 977: /* bclr #n,y:ea */ ! 978: dsp_calc_ea(value, addr_name); ! 979: if (memspace) { ! 980: sprintf(name,"y:%s",addr_name); ! 981: } else { ! 982: sprintf(name,"x:%s",addr_name); ! 983: } ! 984: break; ! 985: case 2: ! 986: /* bclr #n,x:pp */ ! 987: /* bclr #n,y:pp */ ! 988: if (memspace) { ! 989: sprintf(name,"y:0x%04x",value+0xffc0); ! 990: } else { ! 991: sprintf(name,"x:0x%04x",value+0xffc0); ! 992: } ! 993: break; ! 994: case 3: ! 995: /* bclr #n,R */ ! 996: sprintf(name,"%s",registers_name[value]); ! 997: registers_changed[value]=1; ! 998: break; ! 999: } ! 1000: ! 1001: fprintf(stderr,"Dsp: 0x%04x: bclr #%d,%s\n",dsp_pc, numbit, name); ! 1002: } ! 1003: ! 1004: static void dsp_bset(void) ! 1005: { ! 1006: char name[16], addr_name[16]; ! 1007: uint32 memspace, value, numbit; ! 1008: ! 1009: memspace = (cur_inst>>6) & 1; ! 1010: value = (cur_inst>>8) & BITMASK(6); ! 1011: numbit = cur_inst & BITMASK(5); ! 1012: ! 1013: switch((cur_inst>>14) & BITMASK(2)) { ! 1014: case 0: ! 1015: /* bset #n,x:aa */ ! 1016: /* bset #n,y:aa */ ! 1017: if (memspace) { ! 1018: sprintf(name,"y:0x%04x",value); ! 1019: } else { ! 1020: sprintf(name,"x:0x%04x",value); ! 1021: } ! 1022: break; ! 1023: case 1: ! 1024: /* bset #n,x:ea */ ! 1025: /* bset #n,y:ea */ ! 1026: dsp_calc_ea(value, addr_name); ! 1027: if (memspace) { ! 1028: sprintf(name,"y:%s",addr_name); ! 1029: } else { ! 1030: sprintf(name,"x:%s",addr_name); ! 1031: } ! 1032: break; ! 1033: case 2: ! 1034: /* bset #n,x:pp */ ! 1035: /* bset #n,y:pp */ ! 1036: if (memspace) { ! 1037: sprintf(name,"y:0x%04x",value+0xffc0); ! 1038: } else { ! 1039: sprintf(name,"x:0x%04x",value+0xffc0); ! 1040: } ! 1041: break; ! 1042: case 3: ! 1043: /* bset #n,R */ ! 1044: sprintf(name,"%s",registers_name[value]); ! 1045: registers_changed[value]=1; ! 1046: break; ! 1047: } ! 1048: ! 1049: fprintf(stderr,"Dsp: 0x%04x: bset #%d,%s\n",dsp_pc, numbit, name); ! 1050: } ! 1051: ! 1052: static void dsp_btst(void) ! 1053: { ! 1054: char name[16], addr_name[16]; ! 1055: uint32 memspace, value, numbit; ! 1056: ! 1057: memspace = (cur_inst>>6) & 1; ! 1058: value = (cur_inst>>8) & BITMASK(6); ! 1059: numbit = cur_inst & BITMASK(5); ! 1060: ! 1061: switch((cur_inst>>14) & BITMASK(2)) { ! 1062: case 0: ! 1063: /* btst #n,x:aa */ ! 1064: /* btst #n,y:aa */ ! 1065: if (memspace) { ! 1066: sprintf(name,"y:0x%04x",value); ! 1067: } else { ! 1068: sprintf(name,"x:0x%04x",value); ! 1069: } ! 1070: break; ! 1071: case 1: ! 1072: /* btst #n,x:ea */ ! 1073: /* btst #n,y:ea */ ! 1074: dsp_calc_ea(value, addr_name); ! 1075: if (memspace) { ! 1076: sprintf(name,"y:%s",addr_name); ! 1077: } else { ! 1078: sprintf(name,"x:%s",addr_name); ! 1079: } ! 1080: break; ! 1081: case 2: ! 1082: /* btst #n,x:pp */ ! 1083: /* btst #n,y:pp */ ! 1084: if (memspace) { ! 1085: sprintf(name,"y:0x%04x",value+0xffc0); ! 1086: } else { ! 1087: sprintf(name,"x:0x%04x",value+0xffc0); ! 1088: } ! 1089: break; ! 1090: case 3: ! 1091: /* btst #n,R */ ! 1092: sprintf(name,"%s",registers_name[value]); ! 1093: registers_changed[value]=1; ! 1094: break; ! 1095: } ! 1096: ! 1097: fprintf(stderr,"Dsp: 0x%04x: btst #%d,%s\n",dsp_pc, numbit, name); ! 1098: } ! 1099: ! 1100: static void dsp_div(void) ! 1101: { ! 1102: uint32 srcreg=DSP_REG_NULL, destreg; ! 1103: ! 1104: switch((cur_inst>>4) & BITMASK(2)) { ! 1105: case 0: ! 1106: srcreg = DSP_REG_X0; ! 1107: break; ! 1108: case 1: ! 1109: srcreg = DSP_REG_Y0; ! 1110: break; ! 1111: case 2: ! 1112: srcreg = DSP_REG_X1; ! 1113: break; ! 1114: case 3: ! 1115: srcreg = DSP_REG_Y1; ! 1116: break; ! 1117: } ! 1118: destreg = DSP_REG_A+((cur_inst>>3) & 1); ! 1119: registers_changed[destreg]=1; ! 1120: ! 1121: fprintf(stderr,"Dsp: 0x%04x: div %s,%s\n",dsp_pc, registers_name[srcreg],registers_name[destreg]); ! 1122: } ! 1123: ! 1124: static void dsp_do(void) ! 1125: { ! 1126: uint32 value; ! 1127: ! 1128: value = (cur_inst>>12) & (BITMASK(2)<<2); ! 1129: value |= (cur_inst>>6) & 1<<1; ! 1130: value |= (cur_inst>>5) & 1; ! 1131: ! 1132: opcodes_do[value](); ! 1133: ! 1134: registers_changed[DSP_REG_LA]=1; ! 1135: registers_changed[DSP_REG_LC]=1; ! 1136: } ! 1137: ! 1138: static void dsp_do_0(void) ! 1139: { ! 1140: char name[16]; ! 1141: ! 1142: if (cur_inst & (1<<6)) { ! 1143: sprintf(name, "y:0x%04x", (cur_inst>>8) & BITMASK(6)); ! 1144: } else { ! 1145: sprintf(name, "x:0x%04x", (cur_inst>>8) & BITMASK(6)); ! 1146: } ! 1147: ! 1148: fprintf(stderr,"Dsp: 0x%04x: do %s,p:0x%04x\n", ! 1149: dsp_pc, ! 1150: name, ! 1151: dsp_ram[DSP_SPACE_P][dsp_pc+1] & BITMASK(16) ! 1152: ); ! 1153: } ! 1154: ! 1155: static void dsp_do_2(void) ! 1156: { ! 1157: fprintf(stderr,"Dsp: 0x%04x: do #0x%04x,p:0x%04x\n", ! 1158: dsp_pc, ! 1159: ((cur_inst>>8) & BITMASK(8))|((cur_inst & BITMASK(4))<<8), ! 1160: dsp_ram[DSP_SPACE_P][dsp_pc+1] & BITMASK(16) ! 1161: ); ! 1162: } ! 1163: ! 1164: static void dsp_do_4(void) ! 1165: { ! 1166: char addr_name[16], name[16]; ! 1167: uint32 ea_mode; ! 1168: ! 1169: ea_mode = (cur_inst>>8) & BITMASK(6); ! 1170: dsp_calc_ea(ea_mode, addr_name); ! 1171: ! 1172: if (cur_inst & (1<<6)) { ! 1173: sprintf(name, "y:%s", addr_name); ! 1174: } else { ! 1175: sprintf(name, "x:%s", addr_name); ! 1176: } ! 1177: ! 1178: fprintf(stderr,"Dsp: 0x%04x: do %s,p:0x%04x\n", ! 1179: dsp_pc, ! 1180: name, ! 1181: dsp_ram[DSP_SPACE_P][dsp_pc+1] & BITMASK(16) ! 1182: ); ! 1183: } ! 1184: ! 1185: static void dsp_do_c(void) ! 1186: { ! 1187: fprintf(stderr,"Dsp: 0x%04x: do %s,p:0x%04x\n", ! 1188: dsp_pc, ! 1189: registers_name[(cur_inst>>8) & BITMASK(6)], ! 1190: dsp_ram[DSP_SPACE_P][dsp_pc+1] & BITMASK(16) ! 1191: ); ! 1192: } ! 1193: ! 1194: static void dsp_enddo(void) ! 1195: { ! 1196: fprintf(stderr,"Dsp: 0x%04x: enddo\n",dsp_pc); ! 1197: } ! 1198: ! 1199: static void dsp_illegal(void) ! 1200: { ! 1201: fprintf(stderr,"Dsp: 0x%04x: illegal\n",dsp_pc); ! 1202: } ! 1203: ! 1204: static void dsp_jcc(void) ! 1205: { ! 1206: char cond_name[16], addr_name[16]; ! 1207: uint32 cc_code=0; ! 1208: ! 1209: switch((cur_inst >> 16) & BITMASK(8)) { ! 1210: case 0x0a: ! 1211: dsp_calc_ea((cur_inst >>8) & BITMASK(6), addr_name); ! 1212: cc_code=cur_inst & BITMASK(4); ! 1213: break; ! 1214: case 0x0e: ! 1215: sprintf(addr_name, "0x%04x", cur_inst & BITMASK(12)); ! 1216: cc_code=(cur_inst>>12) & BITMASK(4); ! 1217: break; ! 1218: } ! 1219: dsp_calc_cc(cc_code, cond_name); ! 1220: ! 1221: fprintf(stderr,"Dsp: 0x%04x: j%s p:%s\n",dsp_pc, cond_name, addr_name); ! 1222: } ! 1223: ! 1224: static void dsp_jclr(void) ! 1225: { ! 1226: char srcname[16], addr_name[16]; ! 1227: uint32 memspace, value, numbit; ! 1228: ! 1229: memspace = (cur_inst>>6) & 1; ! 1230: value = (cur_inst>>8) & BITMASK(6); ! 1231: numbit = cur_inst & BITMASK(5); ! 1232: ! 1233: switch((cur_inst>>14) & BITMASK(2)) { ! 1234: case 0: ! 1235: /* jclr #n,x:aa,p:xx */ ! 1236: /* jclr #n,y:aa,p:xx */ ! 1237: if (memspace) { ! 1238: sprintf(srcname, "y:0x%04x", value); ! 1239: } else { ! 1240: sprintf(srcname, "x:0x%04x", value); ! 1241: } ! 1242: break; ! 1243: case 1: ! 1244: /* jclr #n,x:ea,p:xx */ ! 1245: /* jclr #n,y:ea,p:xx */ ! 1246: dsp_calc_ea(value, addr_name); ! 1247: if (memspace) { ! 1248: sprintf(srcname, "y:%s", addr_name); ! 1249: } else { ! 1250: sprintf(srcname, "x:%s", addr_name); ! 1251: } ! 1252: break; ! 1253: case 2: ! 1254: /* jclr #n,x:pp,p:xx */ ! 1255: /* jclr #n,y:pp,p:xx */ ! 1256: value += 0xffc0; ! 1257: if (memspace) { ! 1258: sprintf(srcname, "y:0x%04x", value); ! 1259: } else { ! 1260: sprintf(srcname, "x:0x%04x", value); ! 1261: } ! 1262: break; ! 1263: case 3: ! 1264: /* jclr #n,R,p:xx */ ! 1265: sprintf(srcname, registers_name[value]); ! 1266: break; ! 1267: } ! 1268: ! 1269: fprintf(stderr,"Dsp: 0x%04x: jclr #%d,%s,p:0x%04x\n", ! 1270: dsp_pc, ! 1271: numbit, ! 1272: srcname, ! 1273: dsp_ram[DSP_SPACE_P][dsp_pc+1] ! 1274: ); ! 1275: } ! 1276: ! 1277: static void dsp_jmp(void) ! 1278: { ! 1279: char dstname[16]; ! 1280: ! 1281: switch((cur_inst >> 16) & BITMASK(8)) { ! 1282: case 0x0a: ! 1283: dsp_calc_ea((cur_inst >>8) & BITMASK(6), dstname); ! 1284: break; ! 1285: case 0x0c: ! 1286: sprintf(dstname, "0x%04x", cur_inst & BITMASK(12)); ! 1287: break; ! 1288: } ! 1289: ! 1290: fprintf(stderr,"Dsp: 0x%04x: jmp p:%s\n",dsp_pc, dstname); ! 1291: } ! 1292: ! 1293: static void dsp_jscc(void) ! 1294: { ! 1295: char cond_name[16], addr_name[16]; ! 1296: uint32 cc_code=0; ! 1297: ! 1298: switch((cur_inst >> 16) & BITMASK(8)) { ! 1299: case 0x0b: ! 1300: dsp_calc_ea((cur_inst >>8) & BITMASK(6), addr_name); ! 1301: cc_code=cur_inst & BITMASK(4); ! 1302: break; ! 1303: case 0x0f: ! 1304: sprintf(addr_name, "0x%04x", cur_inst & BITMASK(12)); ! 1305: cc_code=(cur_inst>>12) & BITMASK(4); ! 1306: break; ! 1307: } ! 1308: dsp_calc_cc(cc_code, cond_name); ! 1309: ! 1310: fprintf(stderr,"Dsp: 0x%04x: js%s p:%s\n",dsp_pc, cond_name, addr_name); ! 1311: } ! 1312: ! 1313: static void dsp_jsclr(void) ! 1314: { ! 1315: char srcname[16], addr_name[16]; ! 1316: uint32 memspace, value, numbit; ! 1317: ! 1318: memspace = (cur_inst>>6) & 1; ! 1319: value = (cur_inst>>8) & BITMASK(6); ! 1320: numbit = cur_inst & BITMASK(5); ! 1321: ! 1322: switch((cur_inst>>14) & BITMASK(2)) { ! 1323: case 0: ! 1324: /* jsclr #n,x:aa,p:xx */ ! 1325: /* jsclr #n,y:aa,p:xx */ ! 1326: if (memspace) { ! 1327: sprintf(srcname, "y:0x%04x", value); ! 1328: } else { ! 1329: sprintf(srcname, "x:0x%04x", value); ! 1330: } ! 1331: break; ! 1332: case 1: ! 1333: /* jsclr #n,x:ea,p:xx */ ! 1334: /* jsclr #n,y:ea,p:xx */ ! 1335: dsp_calc_ea(value, addr_name); ! 1336: if (memspace) { ! 1337: sprintf(srcname, "y:%s", addr_name); ! 1338: } else { ! 1339: sprintf(srcname, "x:%s", addr_name); ! 1340: } ! 1341: break; ! 1342: case 2: ! 1343: /* jsclr #n,x:pp,p:xx */ ! 1344: /* jsclr #n,y:pp,p:xx */ ! 1345: value += 0xffc0; ! 1346: if (memspace) { ! 1347: sprintf(srcname, "y:0x%04x", value); ! 1348: } else { ! 1349: sprintf(srcname, "x:0x%04x", value); ! 1350: } ! 1351: break; ! 1352: case 3: ! 1353: /* jsclr #n,R,p:xx */ ! 1354: sprintf(srcname, registers_name[value]); ! 1355: break; ! 1356: } ! 1357: ! 1358: fprintf(stderr,"Dsp: 0x%04x: jsclr #%d,%s,p:0x%04x\n", ! 1359: dsp_pc, ! 1360: numbit, ! 1361: srcname, ! 1362: dsp_ram[DSP_SPACE_P][dsp_pc+1] ! 1363: ); ! 1364: } ! 1365: ! 1366: static void dsp_jset(void) ! 1367: { ! 1368: char srcname[16], addr_name[16]; ! 1369: uint32 memspace, value, numbit; ! 1370: ! 1371: memspace = (cur_inst>>6) & 1; ! 1372: value = (cur_inst>>8) & BITMASK(6); ! 1373: numbit = cur_inst & BITMASK(5); ! 1374: ! 1375: switch((cur_inst>>14) & BITMASK(2)) { ! 1376: case 0: ! 1377: /* jset #n,x:aa,p:xx */ ! 1378: /* jset #n,y:aa,p:xx */ ! 1379: if (memspace) { ! 1380: sprintf(srcname, "y:0x%04x", value); ! 1381: } else { ! 1382: sprintf(srcname, "x:0x%04x", value); ! 1383: } ! 1384: break; ! 1385: case 1: ! 1386: /* jset #n,x:ea,p:xx */ ! 1387: /* jset #n,y:ea,p:xx */ ! 1388: dsp_calc_ea(value, addr_name); ! 1389: if (memspace) { ! 1390: sprintf(srcname, "y:%s", addr_name); ! 1391: } else { ! 1392: sprintf(srcname, "x:%s", addr_name); ! 1393: } ! 1394: break; ! 1395: case 2: ! 1396: /* jset #n,x:pp,p:xx */ ! 1397: /* jset #n,y:pp,p:xx */ ! 1398: value += 0xffc0; ! 1399: if (memspace) { ! 1400: sprintf(srcname, "y:0x%04x", value); ! 1401: } else { ! 1402: sprintf(srcname, "x:0x%04x", value); ! 1403: } ! 1404: break; ! 1405: case 3: ! 1406: /* jset #n,R,p:xx */ ! 1407: sprintf(srcname, registers_name[value]); ! 1408: break; ! 1409: } ! 1410: ! 1411: fprintf(stderr,"Dsp: 0x%04x: jset #%d,%s,p:0x%04x\n", ! 1412: dsp_pc, ! 1413: numbit, ! 1414: srcname, ! 1415: dsp_ram[DSP_SPACE_P][dsp_pc+1] ! 1416: ); ! 1417: } ! 1418: ! 1419: static void dsp_jsr(void) ! 1420: { ! 1421: char dstname[16]; ! 1422: ! 1423: if (((cur_inst>>12) & BITMASK(4))==0) { ! 1424: sprintf(dstname, "0x%04x", cur_inst & BITMASK(12)); ! 1425: } else { ! 1426: dsp_calc_ea((cur_inst>>8) & BITMASK(6),dstname); ! 1427: } ! 1428: ! 1429: fprintf(stderr,"Dsp: 0x%04x: jsr p:%s\n",dsp_pc, dstname); ! 1430: } ! 1431: ! 1432: static void dsp_jsset(void) ! 1433: { ! 1434: char srcname[16], addr_name[16]; ! 1435: uint32 memspace, value, numbit; ! 1436: ! 1437: memspace = (cur_inst>>6) & 1; ! 1438: value = (cur_inst>>8) & BITMASK(6); ! 1439: numbit = cur_inst & BITMASK(5); ! 1440: ! 1441: switch((cur_inst>>14) & BITMASK(2)) { ! 1442: case 0: ! 1443: /* jsset #n,x:aa,p:xx */ ! 1444: /* jsset #n,y:aa,p:xx */ ! 1445: if (memspace) { ! 1446: sprintf(srcname, "y:0x%04x", value); ! 1447: } else { ! 1448: sprintf(srcname, "x:0x%04x", value); ! 1449: } ! 1450: break; ! 1451: case 1: ! 1452: /* jsset #n,x:ea,p:xx */ ! 1453: /* jsset #n,y:ea,p:xx */ ! 1454: dsp_calc_ea(value, addr_name); ! 1455: if (memspace) { ! 1456: sprintf(srcname, "y:%s", addr_name); ! 1457: } else { ! 1458: sprintf(srcname, "x:%s", addr_name); ! 1459: } ! 1460: break; ! 1461: case 2: ! 1462: /* jsset #n,x:pp,p:xx */ ! 1463: /* jsset #n,y:pp,p:xx */ ! 1464: value += 0xffc0; ! 1465: if (memspace) { ! 1466: sprintf(srcname, "y:0x%04x", value); ! 1467: } else { ! 1468: sprintf(srcname, "x:0x%04x", value); ! 1469: } ! 1470: break; ! 1471: case 3: ! 1472: /* jsset #n,R,p:xx */ ! 1473: sprintf(srcname, registers_name[value]); ! 1474: break; ! 1475: } ! 1476: ! 1477: fprintf(stderr,"Dsp: 0x%04x: jsset #%d,%s,p:0x%04x\n", ! 1478: dsp_pc, ! 1479: numbit, ! 1480: srcname, ! 1481: dsp_ram[DSP_SPACE_P][dsp_pc+1] ! 1482: ); ! 1483: } ! 1484: ! 1485: static void dsp_lua(void) ! 1486: { ! 1487: char addr_name[16], numreg; ! 1488: ! 1489: dsp_calc_ea((cur_inst>>8) & BITMASK(5), addr_name); ! 1490: numreg = cur_inst & BITMASK(3); ! 1491: registers_changed[DSP_REG_R0+numreg]=1; ! 1492: ! 1493: fprintf(stderr,"Dsp: 0x%04x: lua %s,r%d\n",dsp_pc, addr_name, numreg); ! 1494: } ! 1495: ! 1496: static void dsp_movec(void) ! 1497: { ! 1498: uint32 value; ! 1499: ! 1500: value = (cur_inst>>13) & (1<<3); ! 1501: value |= (cur_inst>>12) & (1<<2); ! 1502: value |= (cur_inst>>6) & (1<<1); ! 1503: value |= (cur_inst>>5) & 1; ! 1504: ! 1505: opcodes_movec[value](); ! 1506: } ! 1507: ! 1508: static void dsp_movec_7(void) ! 1509: { ! 1510: uint32 numreg1, numreg2; ! 1511: ! 1512: /* S1,D2 */ ! 1513: /* S2,D1 */ ! 1514: ! 1515: numreg2 = (cur_inst>>8) & BITMASK(6); ! 1516: numreg1 = (cur_inst & BITMASK(5))|0x20; ! 1517: ! 1518: if (cur_inst & (1<<15)) { ! 1519: /* Write D1 */ ! 1520: fprintf(stderr,"Dsp: 0x%04x: movec %s,%s\n",dsp_pc, registers_name[numreg2], registers_name[numreg1]); ! 1521: registers_changed[numreg1]=1; ! 1522: } else { ! 1523: /* Read S1 */ ! 1524: fprintf(stderr,"Dsp: 0x%04x: movec %s,%s\n",dsp_pc, registers_name[numreg1], registers_name[numreg2]); ! 1525: registers_changed[numreg2]=1; ! 1526: } ! 1527: } ! 1528: ! 1529: static void dsp_movec_9(void) ! 1530: { ! 1531: const char *spacename; ! 1532: char srcname[16],dstname[16]; ! 1533: uint32 numreg, addr; ! 1534: ! 1535: /* x:aa,D1 */ ! 1536: /* S1,x:aa */ ! 1537: /* y:aa,D1 */ ! 1538: /* S1,y:aa */ ! 1539: ! 1540: numreg = (cur_inst & BITMASK(5))|0x20; ! 1541: addr = (cur_inst>>8) & BITMASK(6); ! 1542: ! 1543: if (cur_inst & (1<<6)) { ! 1544: spacename="y"; ! 1545: } else { ! 1546: spacename="x"; ! 1547: } ! 1548: ! 1549: if (cur_inst & (1<<15)) { ! 1550: /* Write D1 */ ! 1551: sprintf(srcname, "%s:0x%04x", spacename, addr); ! 1552: strcpy(dstname, registers_name[numreg]); ! 1553: } else { ! 1554: /* Read S1 */ ! 1555: strcpy(srcname, registers_name[numreg]); ! 1556: sprintf(dstname, "%s:0x%04x", spacename, addr); ! 1557: } ! 1558: ! 1559: fprintf(stderr,"Dsp: 0x%04x: movec %s,%s\n",dsp_pc, srcname, dstname); ! 1560: } ! 1561: ! 1562: static void dsp_movec_b(void) ! 1563: { ! 1564: uint32 numreg; ! 1565: ! 1566: /* #xx,D1 */ ! 1567: ! 1568: numreg = (cur_inst & BITMASK(5))|0x20; ! 1569: ! 1570: registers_changed[numreg]=1; ! 1571: fprintf(stderr,"Dsp: 0x%04x: movec #0x%02x,%s\n",dsp_pc, (cur_inst>>8) & BITMASK(8), registers_name[numreg]); ! 1572: } ! 1573: ! 1574: static void dsp_movec_d(void) ! 1575: { ! 1576: const char *spacename; ! 1577: char srcname[16], dstname[16], addr_name[16]; ! 1578: uint32 numreg, ea_mode; ! 1579: int retour; ! 1580: ! 1581: /* x:ea,D1 */ ! 1582: /* S1,x:ea */ ! 1583: /* y:ea,D1 */ ! 1584: /* S1,y:ea */ ! 1585: /* #xxxx,D1 */ ! 1586: ! 1587: numreg = (cur_inst & BITMASK(5))|0x20; ! 1588: ea_mode = (cur_inst>>8) & BITMASK(6); ! 1589: retour = dsp_calc_ea(ea_mode, addr_name); ! 1590: ! 1591: if (cur_inst & (1<<6)) { ! 1592: spacename="y"; ! 1593: } else { ! 1594: spacename="x"; ! 1595: } ! 1596: ! 1597: if (cur_inst & (1<<15)) { ! 1598: /* Write D1 */ ! 1599: if (retour) { ! 1600: sprintf(srcname, "#%s", addr_name); ! 1601: } else { ! 1602: sprintf(srcname, "%s:%s", spacename, addr_name); ! 1603: } ! 1604: registers_changed[numreg]=1; ! 1605: strcpy(dstname, registers_name[numreg]); ! 1606: } else { ! 1607: /* Read S1 */ ! 1608: strcpy(srcname, registers_name[numreg]); ! 1609: sprintf(dstname, "%s:%s", spacename, addr_name); ! 1610: } ! 1611: ! 1612: fprintf(stderr,"Dsp: 0x%04x: movec %s,%s\n",dsp_pc, srcname, dstname); ! 1613: } ! 1614: ! 1615: static void dsp_movem(void) ! 1616: { ! 1617: char addr_name[16], srcname[16], dstname[16]; ! 1618: uint32 ea_mode, numreg; ! 1619: ! 1620: if (cur_inst & (1<<14)) { ! 1621: /* S,p:ea */ ! 1622: /* p:ea,D */ ! 1623: ! 1624: ea_mode = (cur_inst>>8) & BITMASK(6); ! 1625: dsp_calc_ea(ea_mode, addr_name); ! 1626: } else { ! 1627: /* S,p:aa */ ! 1628: /* p:aa,D */ ! 1629: ! 1630: sprintf(addr_name, "0x%04x",(cur_inst>>8) & BITMASK(6)); ! 1631: } ! 1632: ! 1633: numreg = cur_inst & BITMASK(6); ! 1634: if (cur_inst & (1<<15)) { ! 1635: /* Write D */ ! 1636: registers_changed[numreg]=1; ! 1637: sprintf(srcname, "p:%s", addr_name); ! 1638: strcpy(dstname, registers_name[numreg]); ! 1639: } else { ! 1640: /* Read S */ ! 1641: strcpy(srcname, registers_name[numreg]); ! 1642: sprintf(dstname, "p:%s", addr_name); ! 1643: } ! 1644: ! 1645: fprintf(stderr,"Dsp: 0x%04x: movem %s,%s\n",dsp_pc, srcname, dstname); ! 1646: } ! 1647: ! 1648: static void dsp_movep(void) ! 1649: { ! 1650: uint32 value; ! 1651: ! 1652: value = (cur_inst>>6) & BITMASK(2); ! 1653: ! 1654: opcodes_movep[value](); ! 1655: } ! 1656: ! 1657: static void dsp_movep_0(void) ! 1658: { ! 1659: char srcname[16]="",dstname[16]=""; ! 1660: uint32 addr, memspace, numreg; ! 1661: ! 1662: /* S,x:pp */ ! 1663: /* x:pp,D */ ! 1664: /* S,y:pp */ ! 1665: /* y:pp,D */ ! 1666: ! 1667: addr = 0xffc0 + (cur_inst & BITMASK(6)); ! 1668: memspace = (cur_inst>>16) & 1; ! 1669: numreg = (cur_inst>>8) & BITMASK(6); ! 1670: ! 1671: if (cur_inst & (1<<15)) { ! 1672: /* Write pp */ ! 1673: ! 1674: strcpy(srcname, registers_name[numreg]); ! 1675: ! 1676: if (memspace) { ! 1677: sprintf(dstname, "y:0x%04x", addr); ! 1678: } else { ! 1679: sprintf(dstname, "x:0x%04x", addr); ! 1680: } ! 1681: } else { ! 1682: /* Read pp */ ! 1683: ! 1684: if (memspace) { ! 1685: sprintf(srcname, "y:0x%04x", addr); ! 1686: } else { ! 1687: sprintf(srcname, "x:0x%04x", addr); ! 1688: } ! 1689: ! 1690: registers_changed[numreg]=1; ! 1691: strcpy(dstname, registers_name[numreg]); ! 1692: } ! 1693: ! 1694: fprintf(stderr,"Dsp: 0x%04x: movep %s,%s\n",dsp_pc, srcname, dstname); ! 1695: } ! 1696: ! 1697: static void dsp_movep_1(void) ! 1698: { ! 1699: char srcname[16]="",dstname[16]="",name[16]=""; ! 1700: uint32 addr, memspace; ! 1701: ! 1702: /* p:ea,x:pp */ ! 1703: /* x:pp,p:ea */ ! 1704: /* p:ea,y:pp */ ! 1705: /* y:pp,p:ea */ ! 1706: ! 1707: addr = 0xffc0 + (cur_inst & BITMASK(6)); ! 1708: dsp_calc_ea((cur_inst>>8) & BITMASK(6), name); ! 1709: memspace = (cur_inst>>16) & 1; ! 1710: ! 1711: if (cur_inst & (1<<15)) { ! 1712: /* Write pp */ ! 1713: ! 1714: sprintf(srcname, "p:%s", name); ! 1715: ! 1716: if (memspace) { ! 1717: sprintf(dstname, "y:0x%04x", addr); ! 1718: } else { ! 1719: sprintf(dstname, "x:0x%04x", addr); ! 1720: } ! 1721: } else { ! 1722: /* Read pp */ ! 1723: ! 1724: if (memspace) { ! 1725: sprintf(srcname, "y:0x%04x", addr); ! 1726: } else { ! 1727: sprintf(srcname, "x:0x%04x", addr); ! 1728: } ! 1729: ! 1730: sprintf(dstname, "p:%s", name); ! 1731: } ! 1732: ! 1733: fprintf(stderr,"Dsp: 0x%04x: movep %s,%s\n",dsp_pc, srcname, dstname); ! 1734: } ! 1735: ! 1736: static void dsp_movep_2(void) ! 1737: { ! 1738: char srcname[16]="",dstname[16]="",name[16]=""; ! 1739: uint32 addr, memspace, easpace, retour; ! 1740: ! 1741: /* x:ea,x:pp */ ! 1742: /* y:ea,x:pp */ ! 1743: /* #xxxxxx,x:pp */ ! 1744: /* x:pp,x:ea */ ! 1745: /* x:pp,y:ea */ ! 1746: ! 1747: /* x:ea,y:pp */ ! 1748: /* y:ea,y:pp */ ! 1749: /* #xxxxxx,y:pp */ ! 1750: /* y:pp,y:ea */ ! 1751: /* y:pp,x:ea */ ! 1752: ! 1753: addr = 0xffc0 + (cur_inst & BITMASK(6)); ! 1754: retour = dsp_calc_ea((cur_inst>>8) & BITMASK(6), name); ! 1755: memspace = (cur_inst>>16) & 1; ! 1756: easpace = (cur_inst>>6) & 1; ! 1757: ! 1758: if (cur_inst & (1<<15)) { ! 1759: /* Write pp */ ! 1760: ! 1761: if (retour) { ! 1762: sprintf(srcname, "#%s", name); ! 1763: } else { ! 1764: if (easpace) { ! 1765: sprintf(srcname, "y:%s", name); ! 1766: } else { ! 1767: sprintf(srcname, "x:%s", name); ! 1768: } ! 1769: } ! 1770: ! 1771: if (memspace) { ! 1772: sprintf(dstname, "y:0x%04x", addr); ! 1773: } else { ! 1774: sprintf(dstname, "x:0x%04x", addr); ! 1775: } ! 1776: } else { ! 1777: /* Read pp */ ! 1778: ! 1779: if (memspace) { ! 1780: sprintf(srcname, "y:0x%04x", addr); ! 1781: } else { ! 1782: sprintf(srcname, "x:0x%04x", addr); ! 1783: } ! 1784: ! 1785: if (easpace) { ! 1786: sprintf(dstname, "y:%s", name); ! 1787: } else { ! 1788: sprintf(dstname, "x:%s", name); ! 1789: } ! 1790: } ! 1791: ! 1792: fprintf(stderr,"Dsp: 0x%04x: movep %s,%s\n",dsp_pc, srcname, dstname); ! 1793: } ! 1794: ! 1795: static void dsp_nop(void) ! 1796: { ! 1797: fprintf(stderr,"Dsp: 0x%04x: nop\n",dsp_pc); ! 1798: } ! 1799: ! 1800: static void dsp_norm(void) ! 1801: { ! 1802: uint32 srcreg, destreg; ! 1803: ! 1804: srcreg = DSP_REG_R0+((cur_inst>>8) & BITMASK(3)); ! 1805: destreg = DSP_REG_A+((cur_inst>>3) & 1); ! 1806: ! 1807: registers_changed[srcreg]=1; ! 1808: registers_changed[destreg]=1; ! 1809: ! 1810: fprintf(stderr,"Dsp: 0x%04x: norm %s,%s\n",dsp_pc, registers_name[srcreg], registers_name[destreg]); ! 1811: } ! 1812: ! 1813: static void dsp_ori(void) ! 1814: { ! 1815: const char *regname; ! 1816: ! 1817: switch(cur_inst & BITMASK(2)) { ! 1818: case 0: ! 1819: regname="mr"; ! 1820: registers_changed[DSP_REG_SR]=1; ! 1821: break; ! 1822: case 1: ! 1823: regname="ccr"; ! 1824: registers_changed[DSP_REG_SR]=1; ! 1825: break; ! 1826: case 2: ! 1827: regname="omr"; ! 1828: registers_changed[DSP_REG_OMR]=1; ! 1829: break; ! 1830: default: ! 1831: regname=""; ! 1832: break; ! 1833: } ! 1834: ! 1835: fprintf(stderr,"Dsp: 0x%04x: ori #0x%02x,%s\n", ! 1836: dsp_pc, ! 1837: (cur_inst>>8) & BITMASK(8), ! 1838: regname ! 1839: ); ! 1840: } ! 1841: ! 1842: static void dsp_rep(void) ! 1843: { ! 1844: uint32 value; ! 1845: ! 1846: value = (cur_inst>>12) & (BITMASK(2)<<2); ! 1847: value |= (cur_inst>>6) & (1<<1); ! 1848: value |= (cur_inst>>5) & 1; ! 1849: ! 1850: opcodes_rep[value](); ! 1851: ! 1852: registers_changed[DSP_REG_LA]=1; ! 1853: registers_changed[DSP_REG_LC]=1; ! 1854: } ! 1855: ! 1856: static void dsp_rep_1(void) ! 1857: { ! 1858: char name[16]; ! 1859: ! 1860: /* x:aa */ ! 1861: /* y:aa */ ! 1862: ! 1863: if (cur_inst & (1<<6)) { ! 1864: sprintf(name, "y:0x%04x",(cur_inst>>8) & BITMASK(6)); ! 1865: } else { ! 1866: sprintf(name, "x:0x%04x",(cur_inst>>8) & BITMASK(6)); ! 1867: } ! 1868: ! 1869: fprintf(stderr,"Dsp: 0x%04x: rep %s\n",dsp_pc, name); ! 1870: } ! 1871: ! 1872: static void dsp_rep_3(void) ! 1873: { ! 1874: /* #xxx */ ! 1875: fprintf(stderr,"Dsp: 0x%04x: rep #0x%02x\n",dsp_pc, (cur_inst>>8) & BITMASK(8)); ! 1876: } ! 1877: ! 1878: static void dsp_rep_5(void) ! 1879: { ! 1880: char name[16],addr_name[16]; ! 1881: ! 1882: /* x:ea */ ! 1883: /* y:ea */ ! 1884: ! 1885: dsp_calc_ea((cur_inst>>8) & BITMASK(6), addr_name); ! 1886: if (cur_inst & (1<<6)) { ! 1887: sprintf(name, "y:%s",addr_name); ! 1888: } else { ! 1889: sprintf(name, "x:%s",addr_name); ! 1890: } ! 1891: ! 1892: fprintf(stderr,"Dsp: 0x%04x: rep %s\n",dsp_pc, name); ! 1893: } ! 1894: ! 1895: static void dsp_rep_d(void) ! 1896: { ! 1897: /* R */ ! 1898: ! 1899: fprintf(stderr,"Dsp: 0x%04x: rep %s\n",dsp_pc, registers_name[(cur_inst>>8) & BITMASK(6)]); ! 1900: } ! 1901: ! 1902: static void dsp_reset(void) ! 1903: { ! 1904: fprintf(stderr,"Dsp: 0x%04x: reset\n",dsp_pc); ! 1905: } ! 1906: ! 1907: static void dsp_rti(void) ! 1908: { ! 1909: fprintf(stderr,"Dsp: 0x%04x: rti\n",dsp_pc); ! 1910: } ! 1911: ! 1912: static void dsp_rts(void) ! 1913: { ! 1914: fprintf(stderr,"Dsp: 0x%04x: rts\n",dsp_pc); ! 1915: } ! 1916: ! 1917: static void dsp_stop(void) ! 1918: { ! 1919: fprintf(stderr,"Dsp: 0x%04x: stop\n",dsp_pc); ! 1920: } ! 1921: ! 1922: static void dsp_swi(void) ! 1923: { ! 1924: fprintf(stderr,"Dsp: 0x%04x: swi\n",dsp_pc); ! 1925: } ! 1926: ! 1927: static void dsp_tcc(void) ! 1928: { ! 1929: char ccname[16]; ! 1930: uint32 src1reg, dst1reg, src2reg, dst2reg; ! 1931: ! 1932: dsp_calc_cc((cur_inst>>12) & BITMASK(4), ccname); ! 1933: src1reg = registers_tcc[(cur_inst>>3) & BITMASK(4)][0]; ! 1934: dst1reg = registers_tcc[(cur_inst>>3) & BITMASK(4)][0]; ! 1935: ! 1936: registers_changed[dst1reg]=1; ! 1937: if (cur_inst & (1<<16)) { ! 1938: src2reg = DSP_REG_R0+(cur_inst & BITMASK(3)); ! 1939: dst2reg = DSP_REG_R0+((cur_inst>>8) & BITMASK(3)); ! 1940: ! 1941: registers_changed[dst2reg]=1; ! 1942: fprintf(stderr,"Dsp: 0x%04x: t%s %s,%s %s,%s\n", ! 1943: dsp_pc, ! 1944: ccname, ! 1945: registers_name[src1reg], ! 1946: registers_name[dst1reg], ! 1947: registers_name[src2reg], ! 1948: registers_name[dst2reg] ! 1949: ); ! 1950: } else { ! 1951: fprintf(stderr,"Dsp: 0x%04x: t%s %s,%s\n", ! 1952: dsp_pc, ! 1953: ccname, ! 1954: registers_name[src1reg], ! 1955: registers_name[dst1reg] ! 1956: ); ! 1957: } ! 1958: } ! 1959: ! 1960: static void dsp_wait(void) ! 1961: { ! 1962: fprintf(stderr,"Dsp: 0x%04x: wait\n",dsp_pc); ! 1963: } ! 1964: ! 1965: /********************************** ! 1966: * Parallel moves ! 1967: **********************************/ ! 1968: ! 1969: static void dsp_pm(void) ! 1970: { ! 1971: uint32 value; ! 1972: ! 1973: value = (cur_inst >> 20) & BITMASK(4); ! 1974: ! 1975: opcodes_parmove[value](); ! 1976: } ! 1977: ! 1978: static void dsp_pm_0(void) ! 1979: { ! 1980: char space_name[16], addr_name[16]; ! 1981: uint32 memspace, numreg1, numreg2; ! 1982: /* ! 1983: 0000 100d 00mm mrrr S,x:ea x0,D ! 1984: 0000 100d 10mm mrrr S,y:ea y0,D ! 1985: */ ! 1986: memspace = (cur_inst>>15) & 1; ! 1987: numreg1 = DSP_REG_A+((cur_inst>>16) & 1); ! 1988: dsp_calc_ea((cur_inst>>8) & BITMASK(6), addr_name); ! 1989: ! 1990: if (memspace) { ! 1991: strcpy(space_name,"y"); ! 1992: numreg2 = DSP_REG_Y0; ! 1993: } else { ! 1994: strcpy(space_name,"x"); ! 1995: numreg2 = DSP_REG_X0; ! 1996: } ! 1997: ! 1998: registers_changed[numreg1]=1; ! 1999: ! 2000: sprintf(parallelmove_name, ! 2001: "%s,%s:%s %s,%s", ! 2002: registers_name[numreg1], ! 2003: space_name, ! 2004: addr_name, ! 2005: registers_name[numreg2], ! 2006: registers_name[numreg1] ! 2007: ); ! 2008: } ! 2009: ! 2010: static void dsp_pm_1(void) ! 2011: { ! 2012: /* ! 2013: 0001 ffdf w0mm mrrr x:ea,D1 S2,D2 ! 2014: S1,x:ea S2,D2 ! 2015: #xxxxxx,D1 S2,D2 ! 2016: 0001 deff w1mm mrrr S1,D1 y:ea,D2 ! 2017: S1,D1 S2,y:ea ! 2018: S1,D1 #xxxxxx,D2 ! 2019: */ ! 2020: ! 2021: char addr_name[16]; ! 2022: uint32 memspace, write_flag, retour, s1reg, s2reg, d1reg, d2reg; ! 2023: ! 2024: memspace = (cur_inst>>14) & 1; ! 2025: write_flag = (cur_inst>>15) & 1; ! 2026: retour = dsp_calc_ea((cur_inst>>8) & BITMASK(6), addr_name); ! 2027: ! 2028: if (memspace==DSP_SPACE_Y) { ! 2029: s2reg = d2reg = DSP_REG_Y0; ! 2030: switch((cur_inst>>16) & BITMASK(2)) { ! 2031: case 0: s2reg = d2reg = DSP_REG_Y0; break; ! 2032: case 1: s2reg = d2reg = DSP_REG_Y1; break; ! 2033: case 2: s2reg = d2reg = DSP_REG_A; break; ! 2034: case 3: s2reg = d2reg = DSP_REG_B; break; ! 2035: } ! 2036: ! 2037: s1reg = DSP_REG_A+((cur_inst>>19) & 1); ! 2038: d1reg = DSP_REG_X0+((cur_inst>>18) & 1); ! 2039: ! 2040: registers_changed[d1reg]=1; ! 2041: ! 2042: if (write_flag) { ! 2043: /* Write D2 */ ! 2044: ! 2045: registers_changed[d2reg]=1; ! 2046: ! 2047: if (retour) { ! 2048: sprintf(parallelmove_name,"%s,%s #%s,%s", ! 2049: registers_name[s1reg], ! 2050: registers_name[d1reg], ! 2051: addr_name, ! 2052: registers_name[d2reg] ! 2053: ); ! 2054: } else { ! 2055: sprintf(parallelmove_name,"%s,%s y:%s,%s", ! 2056: registers_name[s1reg], ! 2057: registers_name[d1reg], ! 2058: addr_name, ! 2059: registers_name[d2reg] ! 2060: ); ! 2061: } ! 2062: } else { ! 2063: /* Read S2 */ ! 2064: sprintf(parallelmove_name,"%s,%s %s,y:%s", ! 2065: registers_name[s1reg], ! 2066: registers_name[d1reg], ! 2067: registers_name[s2reg], ! 2068: addr_name ! 2069: ); ! 2070: } ! 2071: ! 2072: } else { ! 2073: s1reg = d1reg = DSP_REG_X0; ! 2074: switch((cur_inst>>18) & BITMASK(2)) { ! 2075: case 0: s1reg = d1reg = DSP_REG_X0; break; ! 2076: case 1: s1reg = d1reg = DSP_REG_X1; break; ! 2077: case 2: s1reg = d1reg = DSP_REG_A; break; ! 2078: case 3: s1reg = d1reg = DSP_REG_B; break; ! 2079: } ! 2080: ! 2081: s2reg = DSP_REG_A+((cur_inst>>17) & 1); ! 2082: d2reg = DSP_REG_Y0+((cur_inst>>16) & 1); ! 2083: ! 2084: registers_changed[d2reg]=1; ! 2085: ! 2086: if (write_flag) { ! 2087: /* Write D1 */ ! 2088: ! 2089: registers_changed[d1reg]=1; ! 2090: ! 2091: if (retour) { ! 2092: sprintf(parallelmove_name,"#%s,%s %s,%s", ! 2093: addr_name, ! 2094: registers_name[d1reg], ! 2095: registers_name[s2reg], ! 2096: registers_name[d2reg] ! 2097: ); ! 2098: } else { ! 2099: sprintf(parallelmove_name,"x:%s,%s %s,%s", ! 2100: addr_name, ! 2101: registers_name[d1reg], ! 2102: registers_name[s2reg], ! 2103: registers_name[d2reg] ! 2104: ); ! 2105: } ! 2106: } else { ! 2107: /* Read S1 */ ! 2108: sprintf(parallelmove_name,"%s,x:%s %s,%s", ! 2109: registers_name[s1reg], ! 2110: addr_name, ! 2111: registers_name[s2reg], ! 2112: registers_name[d2reg] ! 2113: ); ! 2114: } ! 2115: ! 2116: } ! 2117: } ! 2118: ! 2119: static void dsp_pm_2(void) ! 2120: { ! 2121: char addr_name[16]; ! 2122: uint32 numreg1, numreg2; ! 2123: /* ! 2124: 0010 0000 0000 0000 nop ! 2125: 0010 0000 010m mrrr R update ! 2126: 0010 00ee eeed dddd S,D ! 2127: 001d dddd iiii iiii #xx,D ! 2128: */ ! 2129: if (((cur_inst >> 8) & 0xffff) == 0x2000) { ! 2130: return; ! 2131: } ! 2132: ! 2133: if (((cur_inst >> 8) & 0xffe0) == 0x2040) { ! 2134: dsp_calc_ea((cur_inst>>8) & BITMASK(5), addr_name); ! 2135: registers_changed[DSP_REG_R0+((cur_inst>>8) & BITMASK(3))]=1; ! 2136: sprintf(parallelmove_name, "%s,r%d",addr_name, (cur_inst>>8) & BITMASK(3)); ! 2137: return; ! 2138: } ! 2139: ! 2140: if (((cur_inst >> 8) & 0xfc00) == 0x2000) { ! 2141: numreg1 = (cur_inst>>13) & BITMASK(5); ! 2142: numreg2 = (cur_inst>>8) & BITMASK(5); ! 2143: registers_changed[numreg2]=1; ! 2144: sprintf(parallelmove_name, "%s,%s", registers_name[numreg1], registers_name[numreg2]); ! 2145: return; ! 2146: } ! 2147: ! 2148: numreg1 = (cur_inst>>16) & BITMASK(5); ! 2149: registers_changed[numreg1]=1; ! 2150: sprintf(parallelmove_name, "#0x%02x,%s", (cur_inst >> 8) & BITMASK(8), registers_name[numreg1]); ! 2151: } ! 2152: ! 2153: static void dsp_pm_4(void) ! 2154: { ! 2155: char addr_name[16]; ! 2156: uint32 value, retour, ea_mode, memspace; ! 2157: /* ! 2158: 0100 l0ll w0aa aaaa l:aa,D ! 2159: S,l:aa ! 2160: 0100 l0ll w1mm mrrr l:ea,D ! 2161: S,l:ea ! 2162: 01dd 0ddd w0aa aaaa x:aa,D ! 2163: S,x:aa ! 2164: 01dd 0ddd w1mm mrrr x:ea,D ! 2165: S,x:ea ! 2166: #xxxxxx,D ! 2167: 01dd 1ddd w0aa aaaa y:aa,D ! 2168: S,y:aa ! 2169: 01dd 1ddd w1mm mrrr y:ea,D ! 2170: S,y:ea ! 2171: #xxxxxx,D ! 2172: */ ! 2173: value = (cur_inst>>16) & BITMASK(3); ! 2174: value |= (cur_inst>>17) & (BITMASK(2)<<3); ! 2175: ! 2176: ea_mode = (cur_inst>>8) & BITMASK(6); ! 2177: ! 2178: if ((value>>2)==0) { ! 2179: /* L: memory move */ ! 2180: if (cur_inst & (1<<14)) { ! 2181: retour = dsp_calc_ea(ea_mode, addr_name); ! 2182: } else { ! 2183: sprintf(addr_name,"0x%04x", value); ! 2184: retour = 0; ! 2185: } ! 2186: ! 2187: value = (cur_inst>>16) & BITMASK(2); ! 2188: value |= (cur_inst>>17) & (1<<2); ! 2189: ! 2190: if (cur_inst & (1<<15)) { ! 2191: /* Write D */ ! 2192: ! 2193: registers_changed[value]=1; ! 2194: if (retour) { ! 2195: sprintf(parallelmove_name, "#%s,%s", addr_name, registers_lmove[value]); ! 2196: } else { ! 2197: sprintf(parallelmove_name, "l:%s,%s", addr_name, registers_lmove[value]); ! 2198: } ! 2199: } else { ! 2200: /* Read S */ ! 2201: sprintf(parallelmove_name, "%s,l:%s", registers_lmove[value], addr_name); ! 2202: } ! 2203: ! 2204: return; ! 2205: } ! 2206: ! 2207: memspace = (cur_inst>>19) & 1; ! 2208: if (cur_inst & (1<<14)) { ! 2209: retour = dsp_calc_ea(ea_mode, addr_name); ! 2210: } else { ! 2211: sprintf(addr_name,"0x%04x", ea_mode); ! 2212: retour = 0; ! 2213: } ! 2214: ! 2215: if (memspace) { ! 2216: /* Y: */ ! 2217: ! 2218: if (cur_inst & (1<<15)) { ! 2219: /* Write D */ ! 2220: ! 2221: registers_changed[value]=1; ! 2222: if (retour) { ! 2223: sprintf(parallelmove_name, "#%s,%s", addr_name, registers_name[value]); ! 2224: } else { ! 2225: sprintf(parallelmove_name, "y:%s,%s", addr_name, registers_name[value]); ! 2226: } ! 2227: ! 2228: } else { ! 2229: /* Read S */ ! 2230: sprintf(parallelmove_name, "%s,y:%s", registers_name[value], addr_name); ! 2231: } ! 2232: } else { ! 2233: /* X: */ ! 2234: ! 2235: if (cur_inst & (1<<15)) { ! 2236: /* Write D */ ! 2237: ! 2238: registers_changed[value]=1; ! 2239: ! 2240: if (retour) { ! 2241: sprintf(parallelmove_name, "#%s,%s", addr_name, registers_name[value]); ! 2242: } else { ! 2243: sprintf(parallelmove_name, "x:%s,%s", addr_name, registers_name[value]); ! 2244: } ! 2245: } else { ! 2246: /* Read S */ ! 2247: sprintf(parallelmove_name, "%s,x:%s", registers_name[value], addr_name); ! 2248: } ! 2249: } ! 2250: } ! 2251: ! 2252: static void dsp_pm_8(void) ! 2253: { ! 2254: char addr1_name[16], addr2_name[16]; ! 2255: uint32 ea_mode1, ea_mode2, numreg1, numreg2; ! 2256: /* ! 2257: 1wmm eeff WrrM MRRR x:ea,D1 y:ea,D2 ! 2258: x:ea,D1 S2,y:ea ! 2259: S1,x:ea y:ea,D2 ! 2260: S1,x:ea S2,y:ea ! 2261: */ ! 2262: numreg1 = DSP_REG_X0; ! 2263: switch((cur_inst>>18) & BITMASK(2)) { ! 2264: case 0: numreg1 = DSP_REG_X0; break; ! 2265: case 1: numreg1 = DSP_REG_X1; break; ! 2266: case 2: numreg1 = DSP_REG_A; break; ! 2267: case 3: numreg1 = DSP_REG_B; break; ! 2268: } ! 2269: ! 2270: numreg2 = DSP_REG_Y0; ! 2271: switch((cur_inst>>16) & BITMASK(2)) { ! 2272: case 0: numreg2 = DSP_REG_Y0; break; ! 2273: case 1: numreg2 = DSP_REG_Y1; break; ! 2274: case 2: numreg2 = DSP_REG_A; break; ! 2275: case 3: numreg2 = DSP_REG_B; break; ! 2276: } ! 2277: ! 2278: ea_mode1 = (cur_inst>>8) & BITMASK(5); ! 2279: if ((ea_mode1>>3) == 0) { ! 2280: ea_mode1 |= (1<<5); ! 2281: } ! 2282: ea_mode2 = (cur_inst>>13) & BITMASK(2); ! 2283: ea_mode2 |= ((cur_inst>>20) & BITMASK(2))<<3; ! 2284: if ((ea_mode1 & (1<<2))==0) { ! 2285: ea_mode2 |= 1<<2; ! 2286: } ! 2287: if ((ea_mode2>>3) == 0) { ! 2288: ea_mode2 |= (1<<5); ! 2289: } ! 2290: ! 2291: dsp_calc_ea(ea_mode1, addr1_name); ! 2292: dsp_calc_ea(ea_mode2, addr2_name); ! 2293: ! 2294: if (cur_inst & (1<<15)) { ! 2295: registers_changed[numreg1]=1; ! 2296: if (cur_inst & (1<<22)) { ! 2297: registers_changed[numreg2]=1; ! 2298: sprintf(parallelmove_name, "x:%s,%s y:%s,%s", ! 2299: addr1_name, ! 2300: registers_name[numreg1], ! 2301: addr2_name, ! 2302: registers_name[numreg2] ! 2303: ); ! 2304: } else { ! 2305: sprintf(parallelmove_name, "x:%s,%s %s,y:%s", ! 2306: addr1_name, ! 2307: registers_name[numreg1], ! 2308: registers_name[numreg2], ! 2309: addr2_name ! 2310: ); ! 2311: } ! 2312: } else { ! 2313: if (cur_inst & (1<<22)) { ! 2314: registers_changed[numreg2]=1; ! 2315: sprintf(parallelmove_name, "%s,x:%s y:%s,%s", ! 2316: registers_name[numreg1], ! 2317: addr1_name, ! 2318: addr2_name, ! 2319: registers_name[numreg2] ! 2320: ); ! 2321: } else { ! 2322: sprintf(parallelmove_name, "%s,x:%s %s,y:%s", ! 2323: registers_name[numreg1], ! 2324: addr1_name, ! 2325: registers_name[numreg2], ! 2326: addr2_name ! 2327: ); ! 2328: } ! 2329: } ! 2330: } ! 2331: ! 2332: ! 2333: /********************************** ! 2334: * Parallel moves ALU instructions ! 2335: **********************************/ ! 2336: ! 2337: static void dsp_abs(void) ! 2338: { ! 2339: uint32 numreg; ! 2340: ! 2341: numreg = DSP_REG_A+((cur_inst>>3) & 1); ! 2342: ! 2343: registers_changed[numreg]=1; ! 2344: fprintf(stderr,"Dsp: 0x%04x: abs %s %s\n", ! 2345: dsp_pc, ! 2346: registers_name[numreg], ! 2347: parallelmove_name ! 2348: ); ! 2349: } ! 2350: ! 2351: static void dsp_adc(void) ! 2352: { ! 2353: const char *srcname; ! 2354: uint32 numreg; ! 2355: ! 2356: if (cur_inst & (1<<4)) { ! 2357: srcname="y"; ! 2358: } else { ! 2359: srcname="x"; ! 2360: } ! 2361: ! 2362: numreg=DSP_REG_A+((cur_inst>>3) & 1); ! 2363: registers_changed[numreg]=1; ! 2364: ! 2365: fprintf(stderr,"Dsp: 0x%04x: adc %s,%s %s\n", ! 2366: dsp_pc, ! 2367: srcname, ! 2368: registers_name[numreg], ! 2369: parallelmove_name ! 2370: ); ! 2371: } ! 2372: ! 2373: static void dsp_add(void) ! 2374: { ! 2375: const char *srcname; ! 2376: uint32 srcreg, dstreg; ! 2377: ! 2378: srcreg = (cur_inst>>4) & BITMASK(3); ! 2379: dstreg = (cur_inst>>3) & 1; ! 2380: ! 2381: switch(srcreg) { ! 2382: case 1: ! 2383: srcreg = dstreg ^ 1; ! 2384: srcname = registers_name[DSP_REG_A+srcreg]; ! 2385: break; ! 2386: case 2: ! 2387: srcname="x"; ! 2388: break; ! 2389: case 3: ! 2390: srcname="y"; ! 2391: break; ! 2392: case DSP_REG_X0: ! 2393: case DSP_REG_X1: ! 2394: case DSP_REG_Y0: ! 2395: case DSP_REG_Y1: ! 2396: srcname=registers_name[srcreg]; ! 2397: break; ! 2398: default: ! 2399: srcname=""; ! 2400: break; ! 2401: } ! 2402: ! 2403: registers_changed[DSP_REG_A+dstreg]=1; ! 2404: fprintf(stderr,"Dsp: 0x%04x: add %s,%s %s\n", ! 2405: dsp_pc, ! 2406: srcname, ! 2407: registers_name[DSP_REG_A+dstreg], ! 2408: parallelmove_name ! 2409: ); ! 2410: } ! 2411: ! 2412: static void dsp_addl(void) ! 2413: { ! 2414: uint32 numreg; ! 2415: ! 2416: numreg = (cur_inst>>3) & 1; ! 2417: ! 2418: registers_changed[DSP_REG_A+numreg]=1; ! 2419: fprintf(stderr,"Dsp: 0x%04x: addl %s,%s %s\n", ! 2420: dsp_pc, ! 2421: registers_name[DSP_REG_A+(numreg ^ 1)], ! 2422: registers_name[DSP_REG_A+numreg], ! 2423: parallelmove_name ! 2424: ); ! 2425: } ! 2426: ! 2427: static void dsp_addr(void) ! 2428: { ! 2429: uint32 numreg; ! 2430: ! 2431: numreg = (cur_inst>>3) & 1; ! 2432: ! 2433: registers_changed[DSP_REG_A+numreg]=1; ! 2434: fprintf(stderr,"Dsp: 0x%04x: addr %s,%s %s\n", ! 2435: dsp_pc, ! 2436: registers_name[DSP_REG_A+(numreg ^ 1)], ! 2437: registers_name[DSP_REG_A+numreg], ! 2438: parallelmove_name ! 2439: ); ! 2440: } ! 2441: ! 2442: static void dsp_and(void) ! 2443: { ! 2444: uint32 numreg; ! 2445: ! 2446: numreg = DSP_REG_A+((cur_inst>>3) & 1); ! 2447: ! 2448: registers_changed[numreg]=1; ! 2449: ! 2450: fprintf(stderr,"Dsp: 0x%04x: and %s,%s %s\n", ! 2451: dsp_pc, ! 2452: registers_name[DSP_REG_X0+((cur_inst>>4) & BITMASK(2))], ! 2453: registers_name[numreg], ! 2454: parallelmove_name ! 2455: ); ! 2456: } ! 2457: ! 2458: static void dsp_asl(void) ! 2459: { ! 2460: uint32 numreg; ! 2461: ! 2462: numreg = DSP_REG_A+((cur_inst>>3) & 1); ! 2463: ! 2464: registers_changed[numreg]=1; ! 2465: ! 2466: fprintf(stderr,"Dsp: 0x%04x: asl %s %s\n", ! 2467: dsp_pc, ! 2468: registers_name[numreg], ! 2469: parallelmove_name ! 2470: ); ! 2471: } ! 2472: ! 2473: static void dsp_asr(void) ! 2474: { ! 2475: uint32 numreg; ! 2476: ! 2477: numreg = DSP_REG_A+((cur_inst>>3) & 1); ! 2478: ! 2479: registers_changed[numreg]=1; ! 2480: ! 2481: fprintf(stderr,"Dsp: 0x%04x: asr %s %s\n", ! 2482: dsp_pc, ! 2483: registers_name[numreg], ! 2484: parallelmove_name ! 2485: ); ! 2486: } ! 2487: ! 2488: static void dsp_clr(void) ! 2489: { ! 2490: uint32 numreg; ! 2491: ! 2492: numreg = DSP_REG_A+((cur_inst>>3) & 1); ! 2493: ! 2494: registers_changed[numreg]=1; ! 2495: ! 2496: fprintf(stderr,"Dsp: 0x%04x: clr %s %s\n", ! 2497: dsp_pc, ! 2498: registers_name[numreg], ! 2499: parallelmove_name ! 2500: ); ! 2501: } ! 2502: ! 2503: static void dsp_cmp(void) ! 2504: { ! 2505: uint32 srcreg, dstreg; ! 2506: ! 2507: srcreg = (cur_inst>>4) & BITMASK(3); ! 2508: dstreg = (cur_inst>>3) & 1; ! 2509: ! 2510: switch(srcreg) { ! 2511: case 0: ! 2512: srcreg = DSP_REG_A+(dstreg ^ 1); ! 2513: break; ! 2514: case 4: ! 2515: srcreg = DSP_REG_X0; ! 2516: break; ! 2517: case 5: ! 2518: srcreg = DSP_REG_Y0; ! 2519: break; ! 2520: case 6: ! 2521: srcreg = DSP_REG_X1; ! 2522: break; ! 2523: case 7: ! 2524: srcreg = DSP_REG_Y1; ! 2525: break; ! 2526: } ! 2527: ! 2528: fprintf(stderr,"Dsp: 0x%04x: cmp %s,%s %s\n", ! 2529: dsp_pc, ! 2530: registers_name[srcreg], ! 2531: registers_name[DSP_REG_A+dstreg], ! 2532: parallelmove_name ! 2533: ); ! 2534: } ! 2535: ! 2536: static void dsp_cmpm(void) ! 2537: { ! 2538: uint32 srcreg, dstreg; ! 2539: ! 2540: srcreg = (cur_inst>>4) & BITMASK(3); ! 2541: dstreg = (cur_inst>>3) & 1; ! 2542: ! 2543: switch(srcreg) { ! 2544: case 0: ! 2545: srcreg = DSP_REG_A+(dstreg ^ 1); ! 2546: break; ! 2547: case 4: ! 2548: srcreg = DSP_REG_X0; ! 2549: break; ! 2550: case 5: ! 2551: srcreg = DSP_REG_Y0; ! 2552: break; ! 2553: case 6: ! 2554: srcreg = DSP_REG_X1; ! 2555: break; ! 2556: case 7: ! 2557: srcreg = DSP_REG_Y1; ! 2558: break; ! 2559: } ! 2560: ! 2561: fprintf(stderr,"Dsp: 0x%04x: cmpm %s,%s %s\n", ! 2562: dsp_pc, ! 2563: registers_name[srcreg], ! 2564: registers_name[DSP_REG_A+dstreg], ! 2565: parallelmove_name ! 2566: ); ! 2567: } ! 2568: ! 2569: static void dsp_eor(void) ! 2570: { ! 2571: uint32 numreg; ! 2572: ! 2573: numreg = DSP_REG_A+((cur_inst>>3) & 1); ! 2574: ! 2575: registers_changed[numreg]=1; ! 2576: ! 2577: fprintf(stderr,"Dsp: 0x%04x: eor %s,%s %s\n", ! 2578: dsp_pc, ! 2579: registers_name[DSP_REG_X0+((cur_inst>>4) & BITMASK(2))], ! 2580: registers_name[numreg], ! 2581: parallelmove_name ! 2582: ); ! 2583: } ! 2584: ! 2585: static void dsp_lsl(void) ! 2586: { ! 2587: uint32 numreg; ! 2588: ! 2589: numreg = DSP_REG_A+((cur_inst>>3) & 1); ! 2590: ! 2591: registers_changed[numreg]=1; ! 2592: ! 2593: fprintf(stderr,"Dsp: 0x%04x: lsl %s %s\n", ! 2594: dsp_pc, ! 2595: registers_name[numreg], ! 2596: parallelmove_name ! 2597: ); ! 2598: } ! 2599: ! 2600: static void dsp_lsr(void) ! 2601: { ! 2602: uint32 numreg; ! 2603: ! 2604: numreg = DSP_REG_A+((cur_inst>>3) & 1); ! 2605: ! 2606: registers_changed[numreg]=1; ! 2607: ! 2608: fprintf(stderr,"Dsp: 0x%04x: lsr %s %s\n", ! 2609: dsp_pc, ! 2610: registers_name[numreg], ! 2611: parallelmove_name ! 2612: ); ! 2613: } ! 2614: ! 2615: static void dsp_mac(void) ! 2616: { ! 2617: const char *sign_name; ! 2618: uint32 src1reg=DSP_REG_NULL, src2reg=DSP_REG_NULL, dstreg; ! 2619: ! 2620: if (cur_inst & (1<<2)) { ! 2621: sign_name="-"; ! 2622: } else { ! 2623: sign_name=""; ! 2624: } ! 2625: ! 2626: switch((cur_inst>>4) & BITMASK(3)) { ! 2627: case 0: ! 2628: src1reg = DSP_REG_X0; ! 2629: src2reg = DSP_REG_X0; ! 2630: break; ! 2631: case 1: ! 2632: src1reg = DSP_REG_Y0; ! 2633: src2reg = DSP_REG_Y0; ! 2634: break; ! 2635: case 2: ! 2636: src1reg = DSP_REG_X1; ! 2637: src2reg = DSP_REG_X0; ! 2638: break; ! 2639: case 3: ! 2640: src1reg = DSP_REG_Y1; ! 2641: src2reg = DSP_REG_Y0; ! 2642: break; ! 2643: case 4: ! 2644: src1reg = DSP_REG_X0; ! 2645: src2reg = DSP_REG_Y1; ! 2646: break; ! 2647: case 5: ! 2648: src1reg = DSP_REG_Y0; ! 2649: src2reg = DSP_REG_X0; ! 2650: break; ! 2651: case 6: ! 2652: src1reg = DSP_REG_X1; ! 2653: src2reg = DSP_REG_Y0; ! 2654: break; ! 2655: case 7: ! 2656: src1reg = DSP_REG_Y1; ! 2657: src2reg = DSP_REG_X1; ! 2658: break; ! 2659: } ! 2660: dstreg = (cur_inst>>3) & 1; ! 2661: ! 2662: registers_changed[DSP_REG_A+dstreg]=1; ! 2663: fprintf(stderr,"Dsp: 0x%04x: mac %s%s,%s,%s %s\n", ! 2664: dsp_pc, ! 2665: sign_name, ! 2666: registers_name[src1reg], ! 2667: registers_name[src2reg], ! 2668: registers_name[DSP_REG_A+dstreg], ! 2669: parallelmove_name ! 2670: ); ! 2671: } ! 2672: ! 2673: static void dsp_macr(void) ! 2674: { ! 2675: const char *sign_name; ! 2676: uint32 src1reg=DSP_REG_NULL, src2reg=DSP_REG_NULL, dstreg; ! 2677: ! 2678: if (cur_inst & (1<<2)) { ! 2679: sign_name="-"; ! 2680: } else { ! 2681: sign_name=""; ! 2682: } ! 2683: ! 2684: switch((cur_inst>>4) & BITMASK(3)) { ! 2685: case 0: ! 2686: src1reg = DSP_REG_X0; ! 2687: src2reg = DSP_REG_X0; ! 2688: break; ! 2689: case 1: ! 2690: src1reg = DSP_REG_Y0; ! 2691: src2reg = DSP_REG_Y0; ! 2692: break; ! 2693: case 2: ! 2694: src1reg = DSP_REG_X1; ! 2695: src2reg = DSP_REG_X0; ! 2696: break; ! 2697: case 3: ! 2698: src1reg = DSP_REG_Y1; ! 2699: src2reg = DSP_REG_Y0; ! 2700: break; ! 2701: case 4: ! 2702: src1reg = DSP_REG_X0; ! 2703: src2reg = DSP_REG_Y1; ! 2704: break; ! 2705: case 5: ! 2706: src1reg = DSP_REG_Y0; ! 2707: src2reg = DSP_REG_X0; ! 2708: break; ! 2709: case 6: ! 2710: src1reg = DSP_REG_X1; ! 2711: src2reg = DSP_REG_Y0; ! 2712: break; ! 2713: case 7: ! 2714: src1reg = DSP_REG_Y1; ! 2715: src2reg = DSP_REG_X1; ! 2716: break; ! 2717: } ! 2718: dstreg = (cur_inst>>3) & 1; ! 2719: ! 2720: registers_changed[DSP_REG_A+dstreg]=1; ! 2721: fprintf(stderr,"Dsp: 0x%04x: macr %s%s,%s,%s %s\n", ! 2722: dsp_pc, ! 2723: sign_name, ! 2724: registers_name[src1reg], ! 2725: registers_name[src2reg], ! 2726: registers_name[DSP_REG_A+dstreg], ! 2727: parallelmove_name ! 2728: ); ! 2729: } ! 2730: ! 2731: static void dsp_move(void) ! 2732: { ! 2733: fprintf(stderr,"Dsp: 0x%04x: move %s\n",dsp_pc, parallelmove_name); ! 2734: } ! 2735: ! 2736: static void dsp_move_nopm(void) ! 2737: { ! 2738: dsp_pm(); ! 2739: fprintf(stderr,"Dsp: 0x%04x: move %s\n",dsp_pc, parallelmove_name); ! 2740: } ! 2741: ! 2742: static void dsp_mpy(void) ! 2743: { ! 2744: const char *sign_name; ! 2745: uint32 src1reg=DSP_REG_NULL, src2reg=DSP_REG_NULL, dstreg; ! 2746: ! 2747: if (cur_inst & (1<<2)) { ! 2748: sign_name="-"; ! 2749: } else { ! 2750: sign_name=""; ! 2751: } ! 2752: ! 2753: switch((cur_inst>>4) & BITMASK(3)) { ! 2754: case 0: ! 2755: src1reg = DSP_REG_X0; ! 2756: src2reg = DSP_REG_X0; ! 2757: break; ! 2758: case 1: ! 2759: src1reg = DSP_REG_Y0; ! 2760: src2reg = DSP_REG_Y0; ! 2761: break; ! 2762: case 2: ! 2763: src1reg = DSP_REG_X1; ! 2764: src2reg = DSP_REG_X0; ! 2765: break; ! 2766: case 3: ! 2767: src1reg = DSP_REG_Y1; ! 2768: src2reg = DSP_REG_Y0; ! 2769: break; ! 2770: case 4: ! 2771: src1reg = DSP_REG_X0; ! 2772: src2reg = DSP_REG_Y1; ! 2773: break; ! 2774: case 5: ! 2775: src1reg = DSP_REG_Y0; ! 2776: src2reg = DSP_REG_X0; ! 2777: break; ! 2778: case 6: ! 2779: src1reg = DSP_REG_X1; ! 2780: src2reg = DSP_REG_Y0; ! 2781: break; ! 2782: case 7: ! 2783: src1reg = DSP_REG_Y1; ! 2784: src2reg = DSP_REG_X1; ! 2785: break; ! 2786: } ! 2787: dstreg = (cur_inst>>3) & 1; ! 2788: ! 2789: registers_changed[DSP_REG_A+dstreg]=1; ! 2790: fprintf(stderr,"Dsp: 0x%04x: mpy %s%s,%s,%s %s\n", ! 2791: dsp_pc, ! 2792: sign_name, ! 2793: registers_name[src1reg], ! 2794: registers_name[src2reg], ! 2795: registers_name[DSP_REG_A+dstreg], ! 2796: parallelmove_name ! 2797: ); ! 2798: } ! 2799: ! 2800: static void dsp_mpyr(void) ! 2801: { ! 2802: const char *sign_name; ! 2803: uint32 src1reg=DSP_REG_NULL, src2reg=DSP_REG_NULL, dstreg; ! 2804: ! 2805: if (cur_inst & (1<<2)) { ! 2806: sign_name="-"; ! 2807: } else { ! 2808: sign_name=""; ! 2809: } ! 2810: ! 2811: switch((cur_inst>>4) & BITMASK(3)) { ! 2812: case 0: ! 2813: src1reg = DSP_REG_X0; ! 2814: src2reg = DSP_REG_X0; ! 2815: break; ! 2816: case 1: ! 2817: src1reg = DSP_REG_Y0; ! 2818: src2reg = DSP_REG_Y0; ! 2819: break; ! 2820: case 2: ! 2821: src1reg = DSP_REG_X1; ! 2822: src2reg = DSP_REG_X0; ! 2823: break; ! 2824: case 3: ! 2825: src1reg = DSP_REG_Y1; ! 2826: src2reg = DSP_REG_Y0; ! 2827: break; ! 2828: case 4: ! 2829: src1reg = DSP_REG_X0; ! 2830: src2reg = DSP_REG_Y1; ! 2831: break; ! 2832: case 5: ! 2833: src1reg = DSP_REG_Y0; ! 2834: src2reg = DSP_REG_X0; ! 2835: break; ! 2836: case 6: ! 2837: src1reg = DSP_REG_X1; ! 2838: src2reg = DSP_REG_Y0; ! 2839: break; ! 2840: case 7: ! 2841: src1reg = DSP_REG_Y1; ! 2842: src2reg = DSP_REG_X1; ! 2843: break; ! 2844: } ! 2845: dstreg = (cur_inst>>3) & 1; ! 2846: ! 2847: registers_changed[DSP_REG_A+dstreg]=1; ! 2848: fprintf(stderr,"Dsp: 0x%04x: mpyr %s%s,%s,%s %s\n", ! 2849: dsp_pc, ! 2850: sign_name, ! 2851: registers_name[src1reg], ! 2852: registers_name[src2reg], ! 2853: registers_name[DSP_REG_A+dstreg], ! 2854: parallelmove_name ! 2855: ); ! 2856: } ! 2857: ! 2858: static void dsp_neg(void) ! 2859: { ! 2860: uint32 numreg; ! 2861: ! 2862: numreg = DSP_REG_A+((cur_inst>>3) & 1); ! 2863: ! 2864: registers_changed[numreg]=1; ! 2865: ! 2866: fprintf(stderr,"Dsp: 0x%04x: neg %s %s\n", ! 2867: dsp_pc, ! 2868: registers_name[numreg], ! 2869: parallelmove_name ! 2870: ); ! 2871: } ! 2872: ! 2873: static void dsp_not(void) ! 2874: { ! 2875: uint32 numreg; ! 2876: ! 2877: numreg = DSP_REG_A+((cur_inst>>3) & 1); ! 2878: ! 2879: registers_changed[numreg]=1; ! 2880: ! 2881: fprintf(stderr,"Dsp: 0x%04x: not %s %s\n", ! 2882: dsp_pc, ! 2883: registers_name[numreg], ! 2884: parallelmove_name ! 2885: ); ! 2886: } ! 2887: ! 2888: static void dsp_or(void) ! 2889: { ! 2890: uint32 numreg; ! 2891: ! 2892: numreg = DSP_REG_A+((cur_inst>>3) & 1); ! 2893: ! 2894: registers_changed[numreg]=1; ! 2895: ! 2896: fprintf(stderr,"Dsp: 0x%04x: or %s,%s %s\n", ! 2897: dsp_pc, ! 2898: registers_name[DSP_REG_X0+((cur_inst>>4) & BITMASK(2))], ! 2899: registers_name[numreg], ! 2900: parallelmove_name ! 2901: ); ! 2902: } ! 2903: ! 2904: static void dsp_rnd(void) ! 2905: { ! 2906: uint32 numreg; ! 2907: ! 2908: numreg = DSP_REG_A+((cur_inst>>3) & 1); ! 2909: ! 2910: registers_changed[numreg]=1; ! 2911: ! 2912: fprintf(stderr,"Dsp: 0x%04x: rnd %s %s\n", ! 2913: dsp_pc, ! 2914: registers_name[numreg], ! 2915: parallelmove_name ! 2916: ); ! 2917: } ! 2918: ! 2919: static void dsp_rol(void) ! 2920: { ! 2921: uint32 numreg; ! 2922: ! 2923: numreg = DSP_REG_A+((cur_inst>>3) & 1); ! 2924: ! 2925: registers_changed[numreg]=1; ! 2926: ! 2927: fprintf(stderr,"Dsp: 0x%04x: rol %s %s\n", ! 2928: dsp_pc, ! 2929: registers_name[numreg], ! 2930: parallelmove_name ! 2931: ); ! 2932: } ! 2933: ! 2934: static void dsp_ror(void) ! 2935: { ! 2936: uint32 numreg; ! 2937: ! 2938: numreg = DSP_REG_A+((cur_inst>>3) & 1); ! 2939: ! 2940: registers_changed[numreg]=1; ! 2941: ! 2942: fprintf(stderr,"Dsp: 0x%04x: ror %s %s\n", ! 2943: dsp_pc, ! 2944: registers_name[numreg], ! 2945: parallelmove_name ! 2946: ); ! 2947: } ! 2948: ! 2949: static void dsp_sbc(void) ! 2950: { ! 2951: const char *srcname; ! 2952: uint32 numreg; ! 2953: ! 2954: if (cur_inst & (1<<4)) { ! 2955: srcname="y"; ! 2956: } else { ! 2957: srcname="x"; ! 2958: } ! 2959: ! 2960: numreg = DSP_REG_A+((cur_inst>>3) & 1); ! 2961: ! 2962: registers_changed[numreg]=1; ! 2963: ! 2964: fprintf(stderr,"Dsp: 0x%04x: sbc %s,%s %s\n", ! 2965: dsp_pc, ! 2966: srcname, ! 2967: registers_name[numreg], ! 2968: parallelmove_name ! 2969: ); ! 2970: } ! 2971: ! 2972: static void dsp_sub(void) ! 2973: { ! 2974: const char *srcname; ! 2975: uint32 srcreg, dstreg; ! 2976: ! 2977: srcreg = (cur_inst>>4) & BITMASK(3); ! 2978: dstreg = (cur_inst>>3) & 1; ! 2979: ! 2980: switch(srcreg) { ! 2981: case 1: ! 2982: srcreg = dstreg ^ 1; ! 2983: srcname = registers_name[DSP_REG_A+srcreg]; ! 2984: break; ! 2985: case 2: ! 2986: srcname="x"; ! 2987: break; ! 2988: case 3: ! 2989: srcname="y"; ! 2990: break; ! 2991: case DSP_REG_X0: ! 2992: case DSP_REG_X1: ! 2993: case DSP_REG_Y0: ! 2994: case DSP_REG_Y1: ! 2995: srcname=registers_name[srcreg]; ! 2996: break; ! 2997: default: ! 2998: srcname=""; ! 2999: break; ! 3000: } ! 3001: ! 3002: registers_changed[DSP_REG_A+dstreg]=1; ! 3003: fprintf(stderr,"Dsp: 0x%04x: sub %s,%s %s\n", ! 3004: dsp_pc, ! 3005: srcname, ! 3006: registers_name[DSP_REG_A+dstreg], ! 3007: parallelmove_name ! 3008: ); ! 3009: } ! 3010: ! 3011: static void dsp_subl(void) ! 3012: { ! 3013: uint32 numreg; ! 3014: ! 3015: numreg = (cur_inst>>3) & 1; ! 3016: ! 3017: registers_changed[DSP_REG_A+numreg]=1; ! 3018: fprintf(stderr,"Dsp: 0x%04x: subl %s,%s %s\n", ! 3019: dsp_pc, ! 3020: registers_name[DSP_REG_A+(numreg ^ 1)], ! 3021: registers_name[DSP_REG_A+numreg], ! 3022: parallelmove_name ! 3023: ); ! 3024: } ! 3025: ! 3026: static void dsp_subr(void) ! 3027: { ! 3028: uint32 numreg; ! 3029: ! 3030: numreg = (cur_inst>>3) & 1; ! 3031: ! 3032: registers_changed[DSP_REG_A+numreg]=1; ! 3033: fprintf(stderr,"Dsp: 0x%04x: subr %s,%s %s\n", ! 3034: dsp_pc, ! 3035: registers_name[DSP_REG_A+(numreg ^ 1)], ! 3036: registers_name[DSP_REG_A+numreg], ! 3037: parallelmove_name ! 3038: ); ! 3039: } ! 3040: ! 3041: static void dsp_tfr(void) ! 3042: { ! 3043: uint32 srcreg, dstreg; ! 3044: ! 3045: srcreg = (cur_inst>>4) & BITMASK(3); ! 3046: dstreg = (cur_inst>>3) & 1; ! 3047: ! 3048: if (srcreg==0) { ! 3049: srcreg = DSP_REG_A+(dstreg ^ 1); ! 3050: } ! 3051: ! 3052: registers_changed[DSP_REG_A+dstreg]=1; ! 3053: fprintf(stderr,"Dsp: 0x%04x: tfr %s,%s %s\n", ! 3054: dsp_pc, ! 3055: registers_name[srcreg], ! 3056: registers_name[DSP_REG_A+dstreg], ! 3057: parallelmove_name ! 3058: ); ! 3059: } ! 3060: ! 3061: static void dsp_tst(void) ! 3062: { ! 3063: fprintf(stderr,"Dsp: 0x%04x: tst %s %s\n", ! 3064: dsp_pc, ! 3065: registers_name[DSP_REG_A+((cur_inst>>3) & 1)], ! 3066: parallelmove_name ! 3067: ); ! 3068: } ! 3069: ! 3070: /* ! 3071: 2002-07-31:PM ! 3072: BUG:pm_2 (register update) wrong calc of eamode ! 3073: 2002-07-30:PM ! 3074: FIX:output registers that have been written to ! 3075: 2002-07-26:PM ! 3076: BUG:added missing '\n' to disasm output ! 3077: 2002-07-22:PM ! 3078: FIX:disasm output changed from D(bug()) to fprintf() ! 3079: 2002-07-19:PM ! 3080: BUG:movec_b and movec_d operations permuted ! 3081: BUG:pm_5: bad calc of address in [x|y]:aa addressing ! 3082: */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.