|
|
1.1 ! root 1: /* ! 2: * C version for byte-at-a-time architectures ! 3: * (those with big-endian bit order, little endian byte order). ! 4: * See comments at beginning of gbitblt.c and bbc.h. ! 5: * The converting bitblt changes considerably, so that Ru is ! 6: * no longer needed in the abstract machine. ! 7: */ ! 8: ! 9: #define WBITS 8 ! 10: #define LWBITS 3 ! 11: #define W2L 4 ! 12: #define WMASK 0xFF ! 13: #define BYTEREV ! 14: typedef uchar *WType; ! 15: ! 16: typedef long Type; ! 17: ! 18: enum ! 19: { ! 20: field, /* arg = field mask */ ! 21: lsha_RsRt, ! 22: lshb_RsRt, ! 23: lsh_RsRd, /* arg = shift amount */ ! 24: lsh_RtRt, /* arg = shift amount */ ! 25: lsha_RtRt, ! 26: rsha_RsRt, ! 27: rshb_RsRt, ! 28: orlsha_RsRt, ! 29: orlshb_RsRt, ! 30: orlsh_RsRd, /* arg = shift amount */ ! 31: orrsha_RsRt, ! 32: orrshb_RsRt, ! 33: or_RsRd, ! 34: add_As, /* arg = add amount */ ! 35: add_Ad, /* arg = add amount */ ! 36: initsd, /* arg1 = value for As; arg2 = value for Ad */ ! 37: ilabel, /* arg = inner loop count value for Ri */ ! 38: olabel, /* arg = outer loop count value for Ro */ ! 39: iloop, /* arg = pointer to beginning of inner loop */ ! 40: oloop, /* arg = pointer to beginning of outer loop */ ! 41: rts, ! 42: load_Rs_P, ! 43: load_Rt_P, ! 44: loador_Rt_P, ! 45: load_Rd_D, ! 46: load_Rs_D, ! 47: load_Rt_D, ! 48: load_Rd, ! 49: load_Rs, ! 50: load_Rt, ! 51: fetch_Rd_P, ! 52: fetch_Rd_D, ! 53: fetch_Rd, ! 54: store_Rs_P, ! 55: store_Rs_D, ! 56: store_Rs, ! 57: inittab, /* arg1 = table addr; arg2 = entry size (bytes) */ ! 58: initsh, /* arg1 = shift amount a, arg2 = shift amount b */ ! 59: table_RdRt, /* arg1 = offset, arg2 = nbits */ ! 60: table_RsRt, /* arg1 = offset, arg2 = nbits */ ! 61: assemble, /* arg1 = offset, arg2 = nbits */ ! 62: assemblex, /* arg1 = offset, arg2 = nbits */ ! 63: Ozero, ! 64: ODnorS, ! 65: ODandnotS, ! 66: OnotS, ! 67: OnotDandS, ! 68: OnotD, ! 69: ODxorS, ! 70: ODnandS, ! 71: ODandS, ! 72: ODxnorS, ! 73: OD, ! 74: ODornotS, ! 75: OnotDorS, ! 76: ODorS, ! 77: OF, ! 78: }; ! 79: ! 80: /* ! 81: * Macros for assembling the operations of the abstract machine. ! 82: * Each assumes that Type *p points to the next location where ! 83: * an instruction should be assembled. The macros may also make ! 84: * use of these other variable values: ! 85: * ! 86: * tab value of AT register in abstract machine ! 87: * osiz value of osiz register in abstract machine ! 88: * sha value of sha register in abstract machine ! 89: * shb value of shb register in abstract machine ! 90: * ! 91: * Furthermore, there is a long called tmp which can be used for ! 92: * the duration of any macro. ! 93: * ! 94: * For the most part, the macros required are the same as the ! 95: * operations in the abstract machine (without a leading O, ! 96: * or with a lowercase initial letter). However, instead of ! 97: * macros for the bitblt opcodes Ozero, ..., OF, there is a ! 98: * macro called Emitop, which can use implicit arguments ! 99: * fi and fin (see Emitop, below). ! 100: * ! 101: * Some of the load macros take an argument f, which will be 1 ! 102: * if the result of the load will be used by the next instruction. ! 103: * (Some architectures will require a Noop to be emitted when ! 104: * f is 1.) ! 105: * ! 106: * Finally, two other required macros are Extrainit, which can ! 107: * be used to do any implementation-specific initialization, ! 108: * and Execandfree(start,onstack), which must actually execute ! 109: * the compiled program and free the memory. If onstack is ! 110: * true, the program was compiled into a local array, so no ! 111: * memory need be freed. Otherwise, the space was obtained with ! 112: * bbmalloc, and must be freed by bbfree. ! 113: */ ! 114: ! 115: #define Ofield(c) *p++ = field; *p++ = (c) ! 116: #define Olsha_RsRt *p++ = lsha_RsRt ! 117: #define Olshb_RsRt *p++ = lshb_RsRt ! 118: #define Olsh_RsRd(c) *p++ = lsh_RsRd; *p++ = (c) ! 119: #define Olsh_RtRt(c) *p++ = lsh_RtRt; *p++ = (c) ! 120: #define Olsha_RtRt *p++ = lsha_RtRt ! 121: #define Olsha_RtRu /* Ru not needed */ ! 122: #define Olshb_RtRu /* Ru not needed */ ! 123: #define Orsha_RsRt *p++ = rsha_RsRt ! 124: #define Orshb_RsRt *p++ = rshb_RsRt ! 125: #define Orsha_RtRu /* Ru not needed */ ! 126: #define Orshb_RtRu /* Ru not needed */ ! 127: #define Oorlsha_RsRt *p++ = orlsha_RsRt ! 128: #define Oorlshb_RsRt *p++ = orlshb_RsRt ! 129: #define Oorlsh_RsRd(c) *p++ = orlsh_RsRd; *p++ = (c) ! 130: #define Oorrsha_RsRt *p++ = orrsha_RsRt ! 131: #define Oorrshb_RsRt *p++ = orrshb_RsRt ! 132: #define Oorrsha_RtRu /* Ru not needed */ ! 133: #define Oorrshb_RtRu /* Ru not needed */ ! 134: #define Oor_RsRd *p++ = or_RsRd ! 135: #define Add_As(c) *p++ = add_As; *p++ = (c) ! 136: #define Add_Ad(c) *p++ = add_Ad; *p++ = (c) ! 137: #define Initsd(s,d) *p++ = initsd; *p++ = ((ulong)(s)); *p++ = ((ulong)(d)) ! 138: #define Initsh(a,b) *p++ = initsh; *p++ = (a); *p++ = (b) ! 139: #define Extrainit ! 140: #define Ilabel(c) *p++ = ilabel; *p++ = (c) ! 141: #define Olabel(c) *p++ = olabel; *p++ = (c) ! 142: #define Iloop(lp) *p++ = iloop; *p++ = ((ulong)(lp)) ! 143: #define Oloop(lp) *p++ = oloop; *p++ = ((ulong)(lp)) ! 144: #define Orts *p++ = rts ! 145: #define Load_Rs_P *p++ = load_Rs_P ! 146: #define Load_Rt_P *p++ = load_Rt_P ! 147: #define Loadzx_Rt_P *p++ = load_Rt_P ! 148: #define Loador_Rt_P *p++ = loador_Rt_P ! 149: #define Load_Ru_P /* Ru not needed */ ! 150: #define Load_Rd_D(f) *p++ = load_Rd_D ! 151: #define Load_Rs_D(f) *p++ = load_Rs_D ! 152: #define Load_Rt_D(f) *p++ = load_Rt_D ! 153: #define Loadzx_Rt_D(f) *p++ = load_Rt_D ! 154: #define Load_Rd(f) *p++ = load_Rd ! 155: #define Load_Rs(f) *p++ = load_Rs ! 156: #define Load_Rt(f) *p++ = load_Rt ! 157: #define Loadzx_Rt(f) *p++ = load_Rt ! 158: #define Fetch_Rd_P(f) *p++ = fetch_Rd_P ! 159: #define Fetch_Rd_D(f) *p++ = fetch_Rd_D ! 160: #define Fetch_Rd(f) *p++ = fetch_Rd ! 161: #define Store_Rs_P *p++ = store_Rs_P ! 162: #define Store_Rs_D *p++ = store_Rs_D ! 163: #define Store_Rs *p++ = store_Rs ! 164: #define Nop ! 165: #define Inittab(t,s) *p++ = inittab; *p++ = ((ulong)(t)); *p++ = (s) ! 166: #define Table_RdRt(o,n,l) *p++ = table_RdRt; *p++ = (o); *p++ = (n) ! 167: #define Table_RsRt(o,n,l) *p++ = table_RsRt; *p++ = (o); *p++ = (n) ! 168: #define Assemble(o,n) *p++ = assemble; *p++ = (o); *p++ = (n) ! 169: #define Assemblex(o,n) *p++ = assemble; *p++ = (o); *p++ = (n) ! 170: ! 171: #define Execandfree(memstart,onstack) \ ! 172: interpret(memstart); \ ! 173: if(!onstack) \ ! 174: bbfree(memstart, (p-memstart) * sizeof(Type)); ! 175: ! 176: ! 177: /* ! 178: * Emitop can assume that fi points at &fstr[op].instr, and ! 179: * that fin contains fstr[op].n, where op is the desired ! 180: * bitblt opcode as declared in gnot.h ! 181: */ ! 182: ! 183: #define Emitop if(fin) *p++ = *fi; ! 184: ! 185: typedef struct Fstr ! 186: { ! 187: char fetchs; ! 188: char fetchd; ! 189: short n; ! 190: Type instr[1]; ! 191: } Fstr; ! 192: ! 193: Fstr fstr[16] = ! 194: { ! 195: [0] 0,0,1, /* Zero */ ! 196: {Ozero}, ! 197: ! 198: [1] 1,1,1, /* DnorS */ ! 199: {ODnorS}, ! 200: ! 201: [2] 1,1,1, /* DandnotS */ ! 202: {ODandnotS}, ! 203: ! 204: [3] 1,0,1, /* notS */ ! 205: {OnotS}, ! 206: ! 207: [4] 1,1,1, /* notDandS */ ! 208: {OnotDandS}, ! 209: ! 210: [5] 0,1,1, /* notD */ ! 211: {OnotD}, ! 212: ! 213: [6] 1,1,1, /* DxorS */ ! 214: {ODxorS}, ! 215: ! 216: [7] 1,1,1, /* DnandS */ ! 217: {ODnandS}, ! 218: ! 219: [8] 1,1,1, /* DandS */ ! 220: {ODandS}, ! 221: ! 222: [9] 1,1,1, /* DxnorS */ ! 223: {ODxnorS}, ! 224: ! 225: [10] 0,1,1, /* D */ ! 226: {OD}, ! 227: ! 228: [11] 1,1,1, /* DornotS */ ! 229: {ODornotS}, ! 230: ! 231: [12] 1,0,0, /* S */ ! 232: {0}, ! 233: ! 234: [13] 1,1,1, /* notDorS */ ! 235: {OnotDorS}, ! 236: ! 237: [14] 1,1,1, /* DorS */ ! 238: {ODorS}, ! 239: ! 240: [15] 0,0,1, /* F */ ! 241: {OF}, ! 242: }; ! 243: ! 244: #include "tabs.h" ! 245: ! 246: static uchar *tabs[4][4] = ! 247: { ! 248: { 0, (uchar*)tab01b, 0, (uchar*)tab03b}, ! 249: {(uchar*)tab10b, 0, 0, 0}, ! 250: { 0, 0, 0, 0}, ! 251: {(uchar*)tab30b, 0, 0, 0}, ! 252: }; ! 253: ! 254: static uchar tabosiz[4][4] = /* size in bytes of entries */ ! 255: { ! 256: { 0, 1, 0, 1}, ! 257: { 1, 0, 0, 0}, ! 258: { 0, 0, 0, 0}, ! 259: { 1, 0, 0, 0}, ! 260: }; ! 261: ! 262: enum { ! 263: Progmax = 2000, /* max number of words in a bitblt prog */ ! 264: Progmaxnoconv = 200, /* max number of words when no conversion */ ! 265: }; ! 266: ! 267: static void ! 268: interpret(Type *pc) ! 269: { ! 270: WType As, Ad; ! 271: ulong Rs, Rd, Rt; ! 272: long Ri, Ro; ! 273: uchar *AT; ! 274: int osiz, sha, shb, tmp; ! 275: ! 276: #ifdef TEST ! 277: WType Aslow, Ashigh, Adlow, Adhigh; ! 278: void prprog(void); ! 279: ! 280: Rs = lrand(); ! 281: Rd = lrand(); ! 282: Rt = lrand(); ! 283: Ri = lrand(); ! 284: Ro = lrand(); ! 285: sha = lrand(); ! 286: shb = lrand(); ! 287: As = 0; ! 288: Ad = 0; ! 289: AT = 0; ! 290: Aslow = (WType)gaddr(cursm, curr.min); ! 291: Ashigh = (WType)gaddr(cursm, sub(curr.max, Pt(1,1))); ! 292: Adlow = (WType)gaddr(curdm, curpt); ! 293: Adhigh = (WType)gaddr(curdm, sub(add(curpt, sub(curr.max,curr.min)),Pt(1,1))); ! 294: #endif ! 295: ! 296: loop: ! 297: #ifdef TEST ! 298: switch(*pc) { ! 299: case load_Rs_P: ! 300: case load_Rt_P: ! 301: case load_Rd: ! 302: case load_Rs: ! 303: case load_Rt: ! 304: if(As < Aslow || As > Ashigh+3){ ! 305: print("load from bad As %ux\n", As); ! 306: errplace: ! 307: print("src bitmap base %ux zero %d width %d r %d %d %d %d\n", ! 308: cursm->base, cursm->zero, cursm->width, ! 309: cursm->r.min.x, cursm->r.min.y, ! 310: cursm->r.max.x, cursm->r.max.y); ! 311: print("dst bitmap base %ux zero %d width %d r %d %d %d %d\n", ! 312: curdm->base, curdm->zero, curdm->width, ! 313: curdm->r.min.x, curdm->r.min.y, ! 314: curdm->r.max.x, curdm->r.max.y); ! 315: print("p %d %d r %d %d %d %d f %d\n", ! 316: curpt.x, curpt.y, curr.min.x, curr.min.y, ! 317: curr.max.x, curr.max.y, curf); ! 318: prprog(); ! 319: exits("fail"); ! 320: } ! 321: break; ! 322: case load_Rd_D: ! 323: case load_Rs_D: ! 324: case load_Rt_D: ! 325: if(As-1 < Aslow || As-1 > Ashigh+3){ ! 326: print("load from bad As-1 %ux\n", As-1); ! 327: goto errplace; ! 328: } ! 329: break; ! 330: case fetch_Rd_P: ! 331: case fetch_Rd: ! 332: if(Ad < Adlow || Ad > Adhigh+3){ ! 333: print("fetch from bad Ad %ux\n", Ad); ! 334: goto errplace; ! 335: } ! 336: break; ! 337: case store_Rs_P: ! 338: case store_Rs: ! 339: if(Ad < Adlow || Ad > Adhigh+3){ ! 340: print("store to bad Ad %ux\n", Ad); ! 341: goto errplace; ! 342: } ! 343: break; ! 344: case fetch_Rd_D: ! 345: case store_Rs_D: ! 346: if(Ad-1 < Adlow || Ad-1 > Adhigh+3){ ! 347: print("fetch from bad Ad-1 %ux\n", Ad-1); ! 348: prprog(); ! 349: } ! 350: break; ! 351: } ! 352: #endif ! 353: switch(*pc++) { ! 354: default: ! 355: #ifdef TEST ! 356: print("unknown opcode %d\n", pc[-1]); ! 357: goto errplace; ! 358: #else ! 359: return; ! 360: #endif ! 361: case field: ! 362: /* Rs gets Rd where mask bits are 0s, Rs where mask bits are 1s */ ! 363: Rs = ((Rs ^ Rd) & *pc++) ^ Rd; ! 364: break; ! 365: ! 366: case lsha_RsRt: ! 367: Rs = Rt << sha; ! 368: break; ! 369: ! 370: case lshb_RsRt: ! 371: Rs = Rt << shb; ! 372: break; ! 373: ! 374: case lsh_RsRd: ! 375: Rs = Rd << *pc++; ! 376: break; ! 377: ! 378: case lsh_RtRt: /* arg = shift amount */ ! 379: Rt <<= *pc++; ! 380: break; ! 381: ! 382: case lsha_RtRt: ! 383: Rt <<= sha; ! 384: break; ! 385: ! 386: case rsha_RsRt: ! 387: Rs = Rt >> sha; ! 388: break; ! 389: ! 390: case rshb_RsRt: ! 391: Rs = Rt >> shb; ! 392: break; ! 393: ! 394: case orlsha_RsRt: ! 395: Rs |= Rt << sha; ! 396: break; ! 397: ! 398: case orlshb_RsRt: ! 399: Rs |= Rt << shb; ! 400: break; ! 401: ! 402: case orlsh_RsRd: /* arg = shift amount */ ! 403: Rs |= Rd << *pc++; ! 404: break; ! 405: ! 406: case orrsha_RsRt: ! 407: Rs |= Rt >> sha; ! 408: break; ! 409: ! 410: case orrshb_RsRt: ! 411: Rs |= Rt >> shb; ! 412: break; ! 413: ! 414: case or_RsRd: ! 415: Rs |= Rd; ! 416: break; ! 417: ! 418: case add_As: ! 419: As = (WType)((char*)As + (long)*pc++); ! 420: break; ! 421: ! 422: case add_Ad: ! 423: Ad = (WType)((char*)Ad + (long)*pc++); ! 424: break; ! 425: ! 426: case initsd: ! 427: As = (WType)pc[0]; ! 428: Ad = (WType)pc[1]; ! 429: pc += 2; ! 430: break; ! 431: ! 432: case ilabel: ! 433: /* initialize inner loop count */ ! 434: Ri = *pc++; ! 435: break; ! 436: ! 437: case olabel: ! 438: /* initialize outer loop count */ ! 439: Ro = *pc++; ! 440: break; ! 441: ! 442: case iloop: ! 443: /* decrement inner loop count, loop back if still positive */ ! 444: Ri--; ! 445: if(Ri > 0) { ! 446: pc = (Type*)pc[0]; ! 447: break; ! 448: } ! 449: pc++; ! 450: break; ! 451: ! 452: case oloop: ! 453: /* decrement outer loop count, loop back if still positive */ ! 454: Ro--; ! 455: if(Ro > 0) { ! 456: pc = (Type*)pc[0]; ! 457: break; ! 458: } ! 459: pc++; ! 460: break; ! 461: ! 462: case rts: ! 463: return; ! 464: ! 465: case load_Rs_P: ! 466: Rs = *As++; ! 467: break; ! 468: ! 469: case load_Rt_P: ! 470: Rt = *As++; ! 471: break; ! 472: ! 473: case loador_Rt_P: ! 474: Rt |= *As++; ! 475: break; ! 476: ! 477: case load_Rd_D: ! 478: Rd = *--As; ! 479: break; ! 480: ! 481: case load_Rs_D: ! 482: Rs = *--As; ! 483: break; ! 484: ! 485: case load_Rt_D: ! 486: Rt = *--As; ! 487: break; ! 488: ! 489: case load_Rd: ! 490: Rd = *As; ! 491: break; ! 492: ! 493: case load_Rs: ! 494: Rs = *As; ! 495: break; ! 496: ! 497: case load_Rt: ! 498: Rt = *As; ! 499: break; ! 500: ! 501: case fetch_Rd_P: ! 502: Rd = *Ad++; ! 503: break; ! 504: ! 505: case fetch_Rd_D: ! 506: Rd = *--Ad; ! 507: break; ! 508: ! 509: case fetch_Rd: ! 510: Rd = *Ad; ! 511: break; ! 512: ! 513: case store_Rs_P: ! 514: *Ad++ = Rs; ! 515: break; ! 516: ! 517: case store_Rs_D: ! 518: *--Ad = Rs; ! 519: break; ! 520: ! 521: case store_Rs: ! 522: *Ad = Rs; ! 523: break; ! 524: ! 525: case inittab: ! 526: AT = (uchar*)pc[0]; ! 527: osiz = (long)pc[1]; ! 528: pc += 2; ! 529: break; ! 530: ! 531: case initsh: ! 532: sha = (long)pc[0]; ! 533: shb = (long)pc[1]; ! 534: pc += 2; ! 535: break; ! 536: ! 537: case table_RdRt: ! 538: /* ! 539: * Starting at offset arg1 in Rt, take arg2 bits, ! 540: * and use it to look up in table AT, putting answer in Rd. ! 541: * osiz is always 1 for this bitblt ! 542: */ ! 543: tmp = (long)pc[1]; ! 544: Rd = (Rt >> (32-((long)pc[0]+tmp))) & ((1<<tmp)-1); ! 545: Rd = AT[Rd]; ! 546: pc += 2; ! 547: break; ! 548: ! 549: case table_RsRt: ! 550: /* like table_RdRt, but answer goes in Rs */ ! 551: tmp = (long)pc[1]; ! 552: Rs = (Rt >> (32-((long)pc[0]+tmp))) & ((1<<tmp)-1); ! 553: Rs = AT[Rs]; ! 554: pc += 2; ! 555: break; ! 556: ! 557: case assemble: ! 558: /* ! 559: * Move low arg2 bits of Rd into offset arg1 in Rs. ! 560: * Can assume that high bits of Rd are zero, ! 561: * and target field of Rs is zero if offset != 0 ! 562: */ ! 563: tmp = (long)pc[0]; ! 564: if(tmp == 0) ! 565: Rs = Rd << (8-pc[1]); ! 566: else ! 567: Rs |= Rd << (8-(tmp+pc[1])); ! 568: pc += 2; ! 569: break; ! 570: ! 571: case assemblex: ! 572: /* ! 573: * Like assemble, but fields will be moved into ! 574: * proper position by later Assemblex's ! 575: */ ! 576: tmp = (long)pc[0]; ! 577: if(tmp == 0) ! 578: Rs = Rd; ! 579: else ! 580: Rs = (Rs << pc[1]) | Rd; ! 581: pc += 2; ! 582: break; ! 583: ! 584: case Ozero: ! 585: Rs = 0; ! 586: break; ! 587: ! 588: case ODnorS: ! 589: Rs = ~(Rd|Rs); ! 590: break; ! 591: ! 592: case ODandnotS: ! 593: Rs = Rd & ~Rs; ! 594: break; ! 595: ! 596: case OnotS: ! 597: Rs = ~Rs; ! 598: break; ! 599: ! 600: case OnotDandS: ! 601: Rs = ~Rd & Rs; ! 602: break; ! 603: ! 604: case OnotD: ! 605: Rs = ~Rd; ! 606: break; ! 607: ! 608: case ODxorS: ! 609: Rs ^= Rd; ! 610: break; ! 611: ! 612: case ODnandS: ! 613: Rs = ~(Rd & Rs); ! 614: break; ! 615: ! 616: case ODandS: ! 617: Rs &= Rd; ! 618: break; ! 619: ! 620: case ODxnorS: ! 621: Rs = ~(Rd ^ Rs); ! 622: break; ! 623: ! 624: case OD: ! 625: Rs = Rd; ! 626: break; ! 627: ! 628: case ODornotS: ! 629: Rs = Rd | ~Rs; ! 630: break; ! 631: ! 632: case OnotDorS: ! 633: Rs |= ~Rd; ! 634: break; ! 635: ! 636: case ODorS: ! 637: Rs |= Rd; ! 638: break; ! 639: ! 640: case OF: ! 641: Rs = ~0L; ! 642: break; ! 643: } ! 644: goto loop; ! 645: } ! 646: ! 647: #ifdef TEST ! 648: void ! 649: prprog(void) ! 650: { ! 651: int osiz; ! 652: Type *pc; ! 653: pc = (Type *)mem; ! 654: ! 655: loop: ! 656: switch(*pc++) { ! 657: default: ! 658: print("unknown opcode %d\n", pc[-1]); ! 659: exits("unknown opcode"); ! 660: case field: ! 661: print("Rs = ((Rs ^ Rd) & 0x%lux) ^ Rd\n", *pc++); ! 662: break; ! 663: ! 664: case lsha_RsRt: ! 665: print("Rs = Rt << sha\n"); ! 666: break; ! 667: ! 668: case lshb_RsRt: ! 669: print("Rs = Rt << shb\n"); ! 670: break; ! 671: ! 672: case lsh_RsRd: ! 673: print("Rs = Rd << %d\n", *pc++); ! 674: break; ! 675: ! 676: case lsh_RtRt: ! 677: print("Rt <<= %d\n", *pc++); ! 678: break; ! 679: ! 680: case lsha_RtRt: ! 681: print("Rt <<= sha\n"); ! 682: break; ! 683: ! 684: case rsha_RsRt: ! 685: print("Rs = Rt >> sha\n"); ! 686: break; ! 687: ! 688: case rshb_RsRt: ! 689: print("Rs = Rt >> shb\n"); ! 690: break; ! 691: ! 692: case orlsha_RsRt: ! 693: print("Rs |= Rt << sha\n"); ! 694: break; ! 695: ! 696: case orlshb_RsRt: ! 697: print("Rs |= Rt << shb\n"); ! 698: break; ! 699: ! 700: case orlsh_RsRd: ! 701: print("Rs |= Rd << %d\n", *pc++); ! 702: break; ! 703: ! 704: case orrsha_RsRt: ! 705: print("Rs |= Rt >> sha\n"); ! 706: break; ! 707: ! 708: case orrshb_RsRt: ! 709: print("Rs |= Rt >> shb\n"); ! 710: break; ! 711: ! 712: case or_RsRd: ! 713: print("Rs |= Rd\n"); ! 714: break; ! 715: ! 716: case add_As: ! 717: print("As += %d\n", (long)*pc++); ! 718: break; ! 719: ! 720: case add_Ad: ! 721: print("Ad += %d\n", (long)*pc++); ! 722: break; ! 723: ! 724: case initsd: ! 725: print("As = 0x%lux\n", (ulong*)pc[0]); ! 726: print("Ad = 0x%lux\n", (ulong*)pc[1]); ! 727: pc += 2; ! 728: break; ! 729: ! 730: case ilabel: ! 731: print("Ri = %d\n", *pc++); ! 732: break; ! 733: ! 734: case olabel: ! 735: print("Ro = %d\n", *pc++); ! 736: break; ! 737: ! 738: case iloop: ! 739: print("if(--Ri > 0) goto 0x%lux\n", *pc++); ! 740: break; ! 741: ! 742: case oloop: ! 743: print("if(--Ro > 0) goto 0x%lux\n", *pc++); ! 744: break; ! 745: ! 746: case rts: ! 747: print("return\n"); ! 748: return; ! 749: ! 750: case load_Rs_P: ! 751: print("Rs = *As++\n"); ! 752: break; ! 753: ! 754: case load_Rt_P: ! 755: print("Rt = *As++\n"); ! 756: break; ! 757: ! 758: case loador_Rt_P: ! 759: print("Rt |= *As++\n"); ! 760: break; ! 761: ! 762: case load_Rd_D: ! 763: print("Rd = *--As\n"); ! 764: break; ! 765: ! 766: case load_Rs_D: ! 767: print("Rs = *--As\n"); ! 768: break; ! 769: ! 770: case load_Rt_D: ! 771: print("Rt = *--As\n"); ! 772: break; ! 773: ! 774: case load_Rd: ! 775: print("Rd = *As\n"); ! 776: break; ! 777: ! 778: case load_Rs: ! 779: print("Rs = *As\n"); ! 780: break; ! 781: ! 782: case load_Rt: ! 783: print("Rt = *As\n"); ! 784: break; ! 785: ! 786: case fetch_Rd_P: ! 787: print("Rd = *Ad++\n"); ! 788: break; ! 789: ! 790: case fetch_Rd_D: ! 791: print("Rd = *--Ad\n"); ! 792: break; ! 793: ! 794: case fetch_Rd: ! 795: print("Rd = *Ad\n"); ! 796: break; ! 797: ! 798: case store_Rs_P: ! 799: print("*Ad++ = Rs\n"); ! 800: break; ! 801: ! 802: case store_Rs_D: ! 803: print("*--Ad = Rs\n"); ! 804: break; ! 805: ! 806: case store_Rs: ! 807: print("*Ad = Rs\n"); ! 808: break; ! 809: ! 810: case inittab: ! 811: print("AT = 0x%lux (%d byte entries)\n", pc[0],pc[1]); ! 812: osiz = pc[1]; ! 813: pc += 2; ! 814: break; ! 815: ! 816: case initsh: ! 817: print("sha = %d\n", (long)pc[0]); ! 818: print("shb = %d\n", (long)pc[1]); ! 819: pc += 2; ! 820: break; ! 821: ! 822: case table_RdRt: ! 823: print("Rd = ((char*)AT)[Rt{%d..%d}]\n", pc[0], pc[0]+pc[1]-1); ! 824: pc += 2; ! 825: break; ! 826: ! 827: case table_RsRt: ! 828: print("Rs = ((char*)AT)[Rt{%d..%d}]\n", pc[0], pc[0]+pc[1]-1); ! 829: pc += 2; ! 830: break; ! 831: ! 832: case assemble: ! 833: /* ! 834: * Move low arg2 bits of Rd into offset arg1 in Rs. ! 835: * Can assume that high bits of Rd are zero, ! 836: * and target field of Rs is zero if offset != 0 ! 837: */ ! 838: if(pc[0] == 0) ! 839: print("Rs = Rd << %d\n", (32-(long)pc[1])); ! 840: else ! 841: print("Rs |= Rd << %d\n", (32-((long)pc[0]+(long)pc[1]))); ! 842: pc += 2; ! 843: break; ! 844: ! 845: case assemblex: ! 846: /* ! 847: * Like assemble, but fields will be moved into ! 848: * proper position by later Assemblex's ! 849: */ ! 850: if(pc[0] == 0) ! 851: print("Rs = Rd\n"); ! 852: else ! 853: print("Rs = (Rs << %d) | Rd\n", pc[1]); ! 854: pc += 2; ! 855: break; ! 856: ! 857: case Ozero: ! 858: print("Rs = 0\n"); ! 859: break; ! 860: ! 861: case ODnorS: ! 862: print("Rs = ~(Rd|Rs)\n"); ! 863: break; ! 864: ! 865: case ODandnotS: ! 866: print("Rs = Rd & ~Rs\n"); ! 867: break; ! 868: ! 869: case OnotS: ! 870: print("Rs = ~Rs\n"); ! 871: break; ! 872: ! 873: case OnotDandS: ! 874: print("Rs = ~Rd & Rs\n"); ! 875: break; ! 876: ! 877: case OnotD: ! 878: print("Rs = ~Rd\n"); ! 879: break; ! 880: ! 881: case ODxorS: ! 882: print("Rs ^= Rd\n"); ! 883: break; ! 884: ! 885: case ODnandS: ! 886: print("Rs = ~(Rd & Rs)\n"); ! 887: break; ! 888: ! 889: case ODandS: ! 890: print("Rs &= Rd\n"); ! 891: break; ! 892: ! 893: case ODxnorS: ! 894: print("Rs = ~(Rd ^ Rs)\n"); ! 895: break; ! 896: ! 897: case OD: ! 898: print("Rs = Rd\n"); ! 899: break; ! 900: ! 901: case ODornotS: ! 902: print("Rs = Rd | ~Rs\n"); ! 903: break; ! 904: ! 905: case OnotDorS: ! 906: print("Rs |= ~Rd\n"); ! 907: break; ! 908: ! 909: case ODorS: ! 910: print("Rs |= Rd\n"); ! 911: break; ! 912: ! 913: case OF: ! 914: print("Rs = ~0L\n"); ! 915: break; ! 916: } ! 917: goto loop; ! 918: } ! 919: #endif ! 920:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.