|
|
1.1 ! root 1: /* Copyright (c) 1979 Regents of the University of California */ ! 2: ! 3: static char sccsid[] = "@(#)interp.c 1.30 2/9/83"; ! 4: ! 5: #include <math.h> ! 6: #include <signal.h> ! 7: #include "whoami.h" ! 8: #include "vars.h" ! 9: #include "objfmt.h" ! 10: #include "h02opcs.h" ! 11: #include "machdep.h" ! 12: #include "libpc.h" ! 13: ! 14: /* ! 15: * program variables ! 16: */ ! 17: union display _display; ! 18: struct dispsave *_dp; ! 19: long _lino = 0; ! 20: int _argc; ! 21: char **_argv; ! 22: long _mode; ! 23: long _runtst = (long)TRUE; ! 24: bool _nodump = FALSE; ! 25: long _stlim = 500000; ! 26: long _stcnt = 0; ! 27: long _seed = 1; ! 28: #ifdef ADDR32 ! 29: char *_minptr = (char *)0x7fffffff; ! 30: #endif ADDR32 ! 31: #ifdef ADDR16 ! 32: char *_minptr = (char *)0xffff; ! 33: #endif ADDR16 ! 34: char *_maxptr = (char *)0; ! 35: long *_pcpcount = (long *)0; ! 36: long _cntrs = 0; ! 37: long _rtns = 0; ! 38: ! 39: /* ! 40: * standard files ! 41: */ ! 42: char _inwin, _outwin, _errwin; ! 43: struct iorechd _err = { ! 44: &_errwin, /* fileptr */ ! 45: 0, /* lcount */ ! 46: 0x7fffffff, /* llimit */ ! 47: &_iob[2], /* fbuf */ ! 48: FILNIL, /* fchain */ ! 49: STDLVL, /* flev */ ! 50: "Message file", /* pfname */ ! 51: FTEXT | FWRITE | EOFF, /* funit */ ! 52: 2, /* fblk */ ! 53: 1 /* fsize */ ! 54: }; ! 55: struct iorechd output = { ! 56: &_outwin, /* fileptr */ ! 57: 0, /* lcount */ ! 58: 0x7fffffff, /* llimit */ ! 59: &_iob[1], /* fbuf */ ! 60: ERR, /* fchain */ ! 61: STDLVL, /* flev */ ! 62: "standard output", /* pfname */ ! 63: FTEXT | FWRITE | EOFF, /* funit */ ! 64: 1, /* fblk */ ! 65: 1 /* fsize */ ! 66: }; ! 67: struct iorechd input = { ! 68: &_inwin, /* fileptr */ ! 69: 0, /* lcount */ ! 70: 0x7fffffff, /* llimit */ ! 71: &_iob[0], /* fbuf */ ! 72: OUTPUT, /* fchain */ ! 73: STDLVL, /* flev */ ! 74: "standard input", /* pfname */ ! 75: FTEXT|FREAD|SYNC|EOLN, /* funit */ ! 76: 0, /* fblk */ ! 77: 1 /* fsize */ ! 78: }; ! 79: ! 80: /* ! 81: * file record variables ! 82: */ ! 83: long _filefre = PREDEF; ! 84: struct iorechd _fchain = { ! 85: 0, 0, 0, 0, /* only use fchain field */ ! 86: INPUT /* fchain */ ! 87: }; ! 88: struct iorec *_actfile[MAXFILES] = { ! 89: INPUT, ! 90: OUTPUT, ! 91: ERR ! 92: }; ! 93: ! 94: /* ! 95: * stuff for pdx ! 96: */ ! 97: ! 98: union progcntr *pcaddrp; ! 99: asm(".globl _loopaddr"); ! 100: ! 101: /* ! 102: * Px profile array ! 103: */ ! 104: #ifdef PROFILE ! 105: long _profcnts[NUMOPS]; ! 106: #endif PROFILE ! 107: ! 108: /* ! 109: * debugging variables ! 110: */ ! 111: #ifdef DEBUG ! 112: char opc[10]; ! 113: long opcptr = 9; ! 114: #endif DEBUG ! 115: ! 116: interpreter(base) ! 117: char *base; ! 118: { ! 119: union progcntr pc; /* interpreted program cntr */ ! 120: register char *vpc; /* register used for "pc" */ ! 121: struct iorec *curfile; /* active file */ ! 122: register struct blockmark *stp; /* active stack frame ptr */ ! 123: /* ! 124: * the following variables are used as scratch ! 125: */ ! 126: register char *tcp; ! 127: register short *tsp; ! 128: register long tl, tl1, tl2; ! 129: double td, td1; ! 130: struct sze8 t8; ! 131: register short *tsp1; ! 132: long *tlp; ! 133: char *tcp1; ! 134: bool tb; ! 135: struct blockmark *tstp; ! 136: register struct formalrtn *tfp; ! 137: union progcntr tpc; ! 138: struct iorec **ip; ! 139: int mypid; ! 140: ! 141: pcaddrp = &pc; ! 142: mypid = getpid(); ! 143: ! 144: /* ! 145: * Setup sets up any hardware specific parameters before ! 146: * starting the interpreter. Typically this is inline replaced ! 147: * by interp.sed to utilize specific machine instructions. ! 148: */ ! 149: setup(); ! 150: /* ! 151: * necessary only on systems which do not initialize ! 152: * memory to zero ! 153: */ ! 154: for (ip = &_actfile[3]; ip < &_actfile[MAXFILES]; *ip++ = FILNIL) ! 155: /* void */; ! 156: /* ! 157: * set up global environment, then ``call'' the main program ! 158: */ ! 159: _display.frame[0].locvars = pushsp((long)(2 * sizeof(struct iorec *))); ! 160: _display.frame[0].locvars += 2 * sizeof(struct iorec *); ! 161: *(struct iorec **)(_display.frame[0].locvars + OUTPUT_OFF) = OUTPUT; ! 162: *(struct iorec **)(_display.frame[0].locvars + INPUT_OFF) = INPUT; ! 163: stp = (struct blockmark *)pushsp((long)(sizeof(struct blockmark))); ! 164: _dp = &_display.frame[0]; ! 165: pc.cp = base; ! 166: ! 167: asm("_loopaddr:"); ! 168: for(;;) { ! 169: # ifdef DEBUG ! 170: if (++opcptr == 10) ! 171: opcptr = 0; ! 172: opc[opcptr] = *pc.ucp; ! 173: # endif DEBUG ! 174: # ifdef PROFILE ! 175: _profcnts[*pc.ucp]++; ! 176: # endif PROFILE ! 177: switch (*pc.ucp++) { ! 178: case O_BPT: /* breakpoint trap */ ! 179: PFLUSH(); ! 180: kill(mypid, SIGILL); ! 181: pc.ucp--; ! 182: continue; ! 183: case O_NODUMP: ! 184: _nodump = TRUE; ! 185: /* and fall through */ ! 186: case O_BEG: ! 187: _dp += 1; /* enter local scope */ ! 188: stp->odisp = *_dp; /* save old display value */ ! 189: tl = *pc.ucp++; /* tl = name size */ ! 190: stp->entry = pc.hdrp; /* pointer to entry info */ ! 191: tl1 = pc.hdrp->framesze;/* tl1 = size of frame */ ! 192: _lino = pc.hdrp->offset; ! 193: _runtst = pc.hdrp->tests; ! 194: disableovrflo(); ! 195: if (_runtst) ! 196: enableovrflo(); ! 197: pc.cp += (int)tl; /* skip over proc hdr info */ ! 198: stp->file = curfile; /* save active file */ ! 199: tcp = pushsp(tl1); /* tcp = new top of stack */ ! 200: if (_runtst) /* zero stack frame */ ! 201: blkclr(tcp, tl1); ! 202: tcp += (int)tl1; /* offsets of locals are neg */ ! 203: _dp->locvars = tcp; /* set new display pointer */ ! 204: _dp->stp = stp; ! 205: stp->tos = pushsp((long)0); /* set tos pointer */ ! 206: continue; ! 207: case O_END: ! 208: PCLOSE(_dp->locvars); /* flush & close local files */ ! 209: stp = _dp->stp; ! 210: curfile = stp->file; /* restore old active file */ ! 211: *_dp = stp->odisp; /* restore old display entry */ ! 212: if (_dp == &_display.frame[1]) ! 213: return; /* exiting main proc ??? */ ! 214: _lino = stp->lino; /* restore lino, pc, dp */ ! 215: pc.cp = stp->pc; ! 216: _dp = stp->dp; ! 217: _runtst = stp->entry->tests; ! 218: disableovrflo(); ! 219: if (_runtst) ! 220: enableovrflo(); ! 221: popsp(stp->entry->framesze + /* pop local vars */ ! 222: sizeof(struct blockmark) + /* pop stack frame */ ! 223: stp->entry->nargs); /* pop parms */ ! 224: continue; ! 225: case O_CALL: ! 226: tl = *pc.cp++; ! 227: tcp = base + *pc.lp++;/* calc new entry point */ ! 228: tcp += sizeof(short); ! 229: tcp = base + *(long *)tcp; ! 230: stp = (struct blockmark *) ! 231: pushsp((long)(sizeof(struct blockmark))); ! 232: stp->lino = _lino; /* save lino, pc, dp */ ! 233: stp->pc = pc.cp; ! 234: stp->dp = _dp; ! 235: _dp = &_display.frame[tl]; /* set up new display ptr */ ! 236: pc.cp = tcp; ! 237: continue; ! 238: case O_FCALL: ! 239: pc.cp++; ! 240: tcp = popaddr(); /* ptr to display save area */ ! 241: tfp = (struct formalrtn *)popaddr(); ! 242: stp = (struct blockmark *) ! 243: pushsp((long)(sizeof(struct blockmark))); ! 244: stp->lino = _lino; /* save lino, pc, dp */ ! 245: stp->pc = pc.cp; ! 246: stp->dp = _dp; ! 247: pc.cp = (char *)(tfp->fentryaddr);/* new entry point */ ! 248: _dp = &_display.frame[tfp->fbn];/* new display ptr */ ! 249: blkcpy(&_display.frame[1], tcp, ! 250: tfp->fbn * sizeof(struct dispsave)); ! 251: blkcpy(&tfp->fdisp[0], &_display.frame[1], ! 252: tfp->fbn * sizeof(struct dispsave)); ! 253: continue; ! 254: case O_FRTN: ! 255: tl = *pc.cp++; /* tl = size of return obj */ ! 256: if (tl == 0) ! 257: tl = *pc.usp++; ! 258: tcp = pushsp((long)(0)); ! 259: tfp = *(struct formalrtn **)(tcp + tl); ! 260: tcp1 = *(char **) ! 261: (tcp + tl + sizeof(struct formalrtn *)); ! 262: if (tl != 0) { ! 263: blkcpy(tcp, tcp + sizeof(struct formalrtn *) ! 264: + sizeof(char *), tl); ! 265: } ! 266: popsp((long) ! 267: (sizeof(struct formalrtn *) + sizeof (char *))); ! 268: blkcpy(tcp1, &_display.frame[1], ! 269: tfp->fbn * sizeof(struct dispsave)); ! 270: continue; ! 271: case O_FSAV: ! 272: tfp = (struct formalrtn *)popaddr(); ! 273: tfp->fbn = *pc.cp++; /* blk number of routine */ ! 274: tcp = base + *pc.lp++; /* calc new entry point */ ! 275: tcp += sizeof(short); ! 276: tfp->fentryaddr = (long (*)())(base + *(long *)tcp); ! 277: blkcpy(&_display.frame[1], &tfp->fdisp[0], ! 278: tfp->fbn * sizeof(struct dispsave)); ! 279: pushaddr(tfp); ! 280: continue; ! 281: case O_SDUP2: ! 282: pc.cp++; ! 283: tl = pop2(); ! 284: push2((short)(tl)); ! 285: push2((short)(tl)); ! 286: continue; ! 287: case O_SDUP4: ! 288: pc.cp++; ! 289: tl = pop4(); ! 290: push4(tl); ! 291: push4(tl); ! 292: continue; ! 293: case O_TRA: ! 294: pc.cp++; ! 295: pc.cp += *pc.sp; ! 296: continue; ! 297: case O_TRA4: ! 298: pc.cp++; ! 299: pc.cp = base + *pc.lp; ! 300: continue; ! 301: case O_GOTO: ! 302: tstp = _display.frame[*pc.cp++].stp; /* ptr to ! 303: exit frame */ ! 304: pc.cp = base + *pc.lp; ! 305: stp = _dp->stp; ! 306: while (tstp != stp) { ! 307: if (_dp == &_display.frame[1]) ! 308: ERROR("Active frame not found in non-local goto\n", 0); /* exiting prog ??? */ ! 309: PCLOSE(_dp->locvars); /* close local files */ ! 310: curfile = stp->file; /* restore active file */ ! 311: *_dp = stp->odisp; /* old display entry */ ! 312: _dp = stp->dp; /* restore dp */ ! 313: stp = _dp->stp; ! 314: } ! 315: /* pop locals, stack frame, parms, and return values */ ! 316: popsp((long)(stp->tos - pushsp((long)(0)))); ! 317: continue; ! 318: case O_LINO: ! 319: if (_dp->stp->tos != pushsp((long)(0))) ! 320: ERROR("Panic: stack not empty between statements\n"); ! 321: _lino = *pc.cp++; /* set line number */ ! 322: if (_lino == 0) ! 323: _lino = *pc.sp++; ! 324: if (_runtst) { ! 325: LINO(); /* inc statement count */ ! 326: continue; ! 327: } ! 328: _stcnt++; ! 329: continue; ! 330: case O_PUSH: ! 331: tl = *pc.cp++; ! 332: if (tl == 0) ! 333: tl = *pc.lp++; ! 334: tl = (-tl + 1) & ~1; ! 335: tcp = pushsp(tl); ! 336: if (_runtst) ! 337: blkclr(tcp, tl); ! 338: continue; ! 339: case O_IF: ! 340: pc.cp++; ! 341: if (pop2()) { ! 342: pc.sp++; ! 343: continue; ! 344: } ! 345: pc.cp += *pc.sp; ! 346: continue; ! 347: case O_REL2: ! 348: tl = pop2(); ! 349: tl1 = pop2(); ! 350: goto cmplong; ! 351: case O_REL24: ! 352: tl = pop2(); ! 353: tl1 = pop4(); ! 354: goto cmplong; ! 355: case O_REL42: ! 356: tl = pop4(); ! 357: tl1 = pop2(); ! 358: goto cmplong; ! 359: case O_REL4: ! 360: tl = pop4(); ! 361: tl1 = pop4(); ! 362: cmplong: ! 363: switch (*pc.cp++) { ! 364: case releq: ! 365: push2(tl1 == tl); ! 366: continue; ! 367: case relne: ! 368: push2(tl1 != tl); ! 369: continue; ! 370: case rellt: ! 371: push2(tl1 < tl); ! 372: continue; ! 373: case relgt: ! 374: push2(tl1 > tl); ! 375: continue; ! 376: case relle: ! 377: push2(tl1 <= tl); ! 378: continue; ! 379: case relge: ! 380: push2(tl1 >= tl); ! 381: continue; ! 382: default: ! 383: ERROR("Panic: bad relation %d to REL4*\n", ! 384: *(pc.cp - 1)); ! 385: continue; ! 386: } ! 387: case O_RELG: ! 388: tl2 = *pc.cp++; /* tc has jump opcode */ ! 389: tl = *pc.usp++; /* tl has comparison length */ ! 390: tl1 = (tl + 1) & ~1; /* tl1 has arg stack length */ ! 391: tcp = pushsp((long)(0));/* tcp pts to first arg */ ! 392: switch (tl2) { ! 393: case releq: ! 394: tb = RELEQ(tl, tcp + tl1, tcp); ! 395: break; ! 396: case relne: ! 397: tb = RELNE(tl, tcp + tl1, tcp); ! 398: break; ! 399: case rellt: ! 400: tb = RELSLT(tl, tcp + tl1, tcp); ! 401: break; ! 402: case relgt: ! 403: tb = RELSGT(tl, tcp + tl1, tcp); ! 404: break; ! 405: case relle: ! 406: tb = RELSLE(tl, tcp + tl1, tcp); ! 407: break; ! 408: case relge: ! 409: tb = RELSGE(tl, tcp + tl1, tcp); ! 410: break; ! 411: default: ! 412: ERROR("Panic: bad relation %d to RELG*\n", tl2); ! 413: break; ! 414: } ! 415: popsp(tl1 << 1); ! 416: push2((short)(tb)); ! 417: continue; ! 418: case O_RELT: ! 419: tl2 = *pc.cp++; /* tc has jump opcode */ ! 420: tl1 = *pc.usp++; /* tl1 has comparison length */ ! 421: tcp = pushsp((long)(0));/* tcp pts to first arg */ ! 422: switch (tl2) { ! 423: case releq: ! 424: tb = RELEQ(tl1, tcp + tl1, tcp); ! 425: break; ! 426: case relne: ! 427: tb = RELNE(tl1, tcp + tl1, tcp); ! 428: break; ! 429: case rellt: ! 430: tb = RELTLT(tl1, tcp + tl1, tcp); ! 431: break; ! 432: case relgt: ! 433: tb = RELTGT(tl1, tcp + tl1, tcp); ! 434: break; ! 435: case relle: ! 436: tb = RELTLE(tl1, tcp + tl1, tcp); ! 437: break; ! 438: case relge: ! 439: tb = RELTGE(tl1, tcp + tl1, tcp); ! 440: break; ! 441: default: ! 442: ERROR("Panic: bad relation %d to RELT*\n", tl2); ! 443: break; ! 444: } ! 445: popsp(tl1 << 1); ! 446: push2((short)(tb)); ! 447: continue; ! 448: case O_REL28: ! 449: td = pop2(); ! 450: td1 = pop8(); ! 451: goto cmpdbl; ! 452: case O_REL48: ! 453: td = pop4(); ! 454: td1 = pop8(); ! 455: goto cmpdbl; ! 456: case O_REL82: ! 457: td = pop8(); ! 458: td1 = pop2(); ! 459: goto cmpdbl; ! 460: case O_REL84: ! 461: td = pop8(); ! 462: td1 = pop4(); ! 463: goto cmpdbl; ! 464: case O_REL8: ! 465: td = pop8(); ! 466: td1 = pop8(); ! 467: cmpdbl: ! 468: switch (*pc.cp++) { ! 469: case releq: ! 470: push2(td1 == td); ! 471: continue; ! 472: case relne: ! 473: push2(td1 != td); ! 474: continue; ! 475: case rellt: ! 476: push2(td1 < td); ! 477: continue; ! 478: case relgt: ! 479: push2(td1 > td); ! 480: continue; ! 481: case relle: ! 482: push2(td1 <= td); ! 483: continue; ! 484: case relge: ! 485: push2(td1 >= td); ! 486: continue; ! 487: default: ! 488: ERROR("Panic: bad relation %d to REL8*\n", ! 489: *(pc.cp - 1)); ! 490: continue; ! 491: } ! 492: case O_AND: ! 493: pc.cp++; ! 494: tl = pop2(); ! 495: tl1 = pop2(); ! 496: push2(tl1 & tl); ! 497: continue; ! 498: case O_OR: ! 499: pc.cp++; ! 500: tl = pop2(); ! 501: tl1 = pop2(); ! 502: push2(tl1 | tl); ! 503: continue; ! 504: case O_NOT: ! 505: pc.cp++; ! 506: tl = pop2(); ! 507: push2(tl ^ 1); ! 508: continue; ! 509: case O_AS2: ! 510: pc.cp++; ! 511: tl = pop2(); ! 512: *(short *)popaddr() = tl; ! 513: continue; ! 514: case O_AS4: ! 515: pc.cp++; ! 516: tl = pop4(); ! 517: *(long *)popaddr() = tl; ! 518: continue; ! 519: case O_AS24: ! 520: pc.cp++; ! 521: tl = pop2(); ! 522: *(long *)popaddr() = tl; ! 523: continue; ! 524: case O_AS42: ! 525: pc.cp++; ! 526: tl = pop4(); ! 527: *(short *)popaddr() = tl; ! 528: continue; ! 529: case O_AS21: ! 530: pc.cp++; ! 531: tl = pop2(); ! 532: *popaddr() = tl; ! 533: continue; ! 534: case O_AS41: ! 535: pc.cp++; ! 536: tl = pop4(); ! 537: *popaddr() = tl; ! 538: continue; ! 539: case O_AS28: ! 540: pc.cp++; ! 541: tl = pop2(); ! 542: *(double *)popaddr() = tl; ! 543: continue; ! 544: case O_AS48: ! 545: pc.cp++; ! 546: tl = pop4(); ! 547: *(double *)popaddr() = tl; ! 548: continue; ! 549: case O_AS8: ! 550: pc.cp++; ! 551: t8 = popsze8(); ! 552: *(struct sze8 *)popaddr() = t8; ! 553: continue; ! 554: case O_AS: ! 555: tl = *pc.cp++; ! 556: if (tl == 0) ! 557: tl = *pc.usp++; ! 558: tl1 = (tl + 1) & ~1; ! 559: tcp = pushsp((long)(0)); ! 560: blkcpy(tcp, *(char **)(tcp + tl1), tl); ! 561: popsp(tl1 + sizeof(char *)); ! 562: continue; ! 563: case O_INX2P2: ! 564: tl = *pc.cp++; /* tl has shift amount */ ! 565: tl1 = pop2(); ! 566: tl1 = (tl1 - *pc.sp++) << tl; ! 567: tcp = popaddr(); ! 568: pushaddr(tcp + tl1); ! 569: continue; ! 570: case O_INX4P2: ! 571: tl = *pc.cp++; /* tl has shift amount */ ! 572: tl1 = pop4(); ! 573: tl1 = (tl1 - *pc.sp++) << tl; ! 574: tcp = popaddr(); ! 575: pushaddr(tcp + tl1); ! 576: continue; ! 577: case O_INX2: ! 578: tl = *pc.cp++; /* tl has element size */ ! 579: if (tl == 0) ! 580: tl = *pc.usp++; ! 581: tl1 = pop2(); /* index */ ! 582: tl2 = *pc.sp++; ! 583: tcp = popaddr(); ! 584: pushaddr(tcp + (tl1 - tl2) * tl); ! 585: tl = *pc.usp++; ! 586: if (_runtst) ! 587: SUBSC(tl1, tl2, tl); /* range check */ ! 588: continue; ! 589: case O_INX4: ! 590: tl = *pc.cp++; /* tl has element size */ ! 591: if (tl == 0) ! 592: tl = *pc.usp++; ! 593: tl1 = pop4(); /* index */ ! 594: tl2 = *pc.sp++; ! 595: tcp = popaddr(); ! 596: pushaddr(tcp + (tl1 - tl2) * tl); ! 597: tl = *pc.usp++; ! 598: if (_runtst) ! 599: SUBSC(tl1, tl2, tl); /* range check */ ! 600: continue; ! 601: case O_OFF: ! 602: tl = *pc.cp++; ! 603: if (tl == 0) ! 604: tl = *pc.usp++; ! 605: tcp = popaddr(); ! 606: pushaddr(tcp + tl); ! 607: continue; ! 608: case O_NIL: ! 609: pc.cp++; ! 610: NIL(); ! 611: continue; ! 612: case O_ADD2: ! 613: pc.cp++; ! 614: tl = pop2(); ! 615: tl1 = pop2(); ! 616: push4(tl1 + tl); ! 617: continue; ! 618: case O_ADD4: ! 619: pc.cp++; ! 620: tl = pop4(); ! 621: tl1 = pop4(); ! 622: push4(tl1 + tl); ! 623: continue; ! 624: case O_ADD24: ! 625: pc.cp++; ! 626: tl = pop2(); ! 627: tl1 = pop4(); ! 628: push4(tl1 + tl); ! 629: continue; ! 630: case O_ADD42: ! 631: pc.cp++; ! 632: tl = pop4(); ! 633: tl1 = pop2(); ! 634: push4(tl1 + tl); ! 635: continue; ! 636: case O_ADD28: ! 637: pc.cp++; ! 638: tl = pop2(); ! 639: td = pop8(); ! 640: push8(td + tl); ! 641: continue; ! 642: case O_ADD48: ! 643: pc.cp++; ! 644: tl = pop4(); ! 645: td = pop8(); ! 646: push8(td + tl); ! 647: continue; ! 648: case O_ADD82: ! 649: pc.cp++; ! 650: td = pop8(); ! 651: td1 = pop2(); ! 652: push8(td1 + td); ! 653: continue; ! 654: case O_ADD84: ! 655: pc.cp++; ! 656: td = pop8(); ! 657: td1 = pop4(); ! 658: push8(td1 + td); ! 659: continue; ! 660: case O_SUB2: ! 661: pc.cp++; ! 662: tl = pop2(); ! 663: tl1 = pop2(); ! 664: push4(tl1 - tl); ! 665: continue; ! 666: case O_SUB4: ! 667: pc.cp++; ! 668: tl = pop4(); ! 669: tl1 = pop4(); ! 670: push4(tl1 - tl); ! 671: continue; ! 672: case O_SUB24: ! 673: pc.cp++; ! 674: tl = pop2(); ! 675: tl1 = pop4(); ! 676: push4(tl1 - tl); ! 677: continue; ! 678: case O_SUB42: ! 679: pc.cp++; ! 680: tl = pop4(); ! 681: tl1 = pop2(); ! 682: push4(tl1 - tl); ! 683: continue; ! 684: case O_SUB28: ! 685: pc.cp++; ! 686: tl = pop2(); ! 687: td = pop8(); ! 688: push8(td - tl); ! 689: continue; ! 690: case O_SUB48: ! 691: pc.cp++; ! 692: tl = pop4(); ! 693: td = pop8(); ! 694: push8(td - tl); ! 695: continue; ! 696: case O_SUB82: ! 697: pc.cp++; ! 698: td = pop8(); ! 699: td1 = pop2(); ! 700: push8(td1 - td); ! 701: continue; ! 702: case O_SUB84: ! 703: pc.cp++; ! 704: td = pop8(); ! 705: td1 = pop4(); ! 706: push8(td1 - td); ! 707: continue; ! 708: case O_MUL2: ! 709: pc.cp++; ! 710: tl = pop2(); ! 711: tl1 = pop2(); ! 712: push4(tl1 * tl); ! 713: continue; ! 714: case O_MUL4: ! 715: pc.cp++; ! 716: tl = pop4(); ! 717: tl1 = pop4(); ! 718: push4(tl1 * tl); ! 719: continue; ! 720: case O_MUL24: ! 721: pc.cp++; ! 722: tl = pop2(); ! 723: tl1 = pop4(); ! 724: push4(tl1 * tl); ! 725: continue; ! 726: case O_MUL42: ! 727: pc.cp++; ! 728: tl = pop4(); ! 729: tl1 = pop2(); ! 730: push4(tl1 * tl); ! 731: continue; ! 732: case O_MUL28: ! 733: pc.cp++; ! 734: tl = pop2(); ! 735: td = pop8(); ! 736: push8(td * tl); ! 737: continue; ! 738: case O_MUL48: ! 739: pc.cp++; ! 740: tl = pop4(); ! 741: td = pop8(); ! 742: push8(td * tl); ! 743: continue; ! 744: case O_MUL82: ! 745: pc.cp++; ! 746: td = pop8(); ! 747: td1 = pop2(); ! 748: push8(td1 * td); ! 749: continue; ! 750: case O_MUL84: ! 751: pc.cp++; ! 752: td = pop8(); ! 753: td1 = pop4(); ! 754: push8(td1 * td); ! 755: continue; ! 756: case O_ABS2: ! 757: case O_ABS4: ! 758: pc.cp++; ! 759: tl = pop4(); ! 760: push4(tl >= 0 ? tl : -tl); ! 761: continue; ! 762: case O_ABS8: ! 763: pc.cp++; ! 764: td = pop8(); ! 765: push8(td >= 0.0 ? td : -td); ! 766: continue; ! 767: case O_NEG2: ! 768: pc.cp++; ! 769: push4((long)(-pop2())); ! 770: continue; ! 771: case O_NEG4: ! 772: pc.cp++; ! 773: push4(-pop4()); ! 774: continue; ! 775: case O_NEG8: ! 776: pc.cp++; ! 777: push8(-pop8()); ! 778: continue; ! 779: case O_DIV2: ! 780: pc.cp++; ! 781: tl = pop2(); ! 782: tl1 = pop2(); ! 783: push4(tl1 / tl); ! 784: continue; ! 785: case O_DIV4: ! 786: pc.cp++; ! 787: tl = pop4(); ! 788: tl1 = pop4(); ! 789: push4(tl1 / tl); ! 790: continue; ! 791: case O_DIV24: ! 792: pc.cp++; ! 793: tl = pop2(); ! 794: tl1 = pop4(); ! 795: push4(tl1 / tl); ! 796: continue; ! 797: case O_DIV42: ! 798: pc.cp++; ! 799: tl = pop4(); ! 800: tl1 = pop2(); ! 801: push4(tl1 / tl); ! 802: continue; ! 803: case O_MOD2: ! 804: pc.cp++; ! 805: tl = pop2(); ! 806: tl1 = pop2(); ! 807: push4(tl1 % tl); ! 808: continue; ! 809: case O_MOD4: ! 810: pc.cp++; ! 811: tl = pop4(); ! 812: tl1 = pop4(); ! 813: push4(tl1 % tl); ! 814: continue; ! 815: case O_MOD24: ! 816: pc.cp++; ! 817: tl = pop2(); ! 818: tl1 = pop4(); ! 819: push4(tl1 % tl); ! 820: continue; ! 821: case O_MOD42: ! 822: pc.cp++; ! 823: tl = pop4(); ! 824: tl1 = pop2(); ! 825: push4(tl1 % tl); ! 826: continue; ! 827: case O_ADD8: ! 828: pc.cp++; ! 829: td = pop8(); ! 830: td1 = pop8(); ! 831: push8(td1 + td); ! 832: continue; ! 833: case O_SUB8: ! 834: pc.cp++; ! 835: td = pop8(); ! 836: td1 = pop8(); ! 837: push8(td1 - td); ! 838: continue; ! 839: case O_MUL8: ! 840: pc.cp++; ! 841: td = pop8(); ! 842: td1 = pop8(); ! 843: push8(td1 * td); ! 844: continue; ! 845: case O_DVD8: ! 846: pc.cp++; ! 847: td = pop8(); ! 848: td1 = pop8(); ! 849: push8(td1 / td); ! 850: continue; ! 851: case O_STOI: ! 852: pc.cp++; ! 853: push4((long)(pop2())); ! 854: continue; ! 855: case O_STOD: ! 856: pc.cp++; ! 857: td = pop2(); ! 858: push8(td); ! 859: continue; ! 860: case O_ITOD: ! 861: pc.cp++; ! 862: td = pop4(); ! 863: push8(td); ! 864: continue; ! 865: case O_ITOS: ! 866: pc.cp++; ! 867: push2((short)(pop4())); ! 868: continue; ! 869: case O_DVD2: ! 870: pc.cp++; ! 871: td = pop2(); ! 872: td1 = pop2(); ! 873: push8(td1 / td); ! 874: continue; ! 875: case O_DVD4: ! 876: pc.cp++; ! 877: td = pop4(); ! 878: td1 = pop4(); ! 879: push8(td1 / td); ! 880: continue; ! 881: case O_DVD24: ! 882: pc.cp++; ! 883: td = pop2(); ! 884: td1 = pop4(); ! 885: push8(td1 / td); ! 886: continue; ! 887: case O_DVD42: ! 888: pc.cp++; ! 889: td = pop4(); ! 890: td1 = pop2(); ! 891: push8(td1 / td); ! 892: continue; ! 893: case O_DVD28: ! 894: pc.cp++; ! 895: td = pop2(); ! 896: td1 = pop8(); ! 897: push8(td1 / td); ! 898: continue; ! 899: case O_DVD48: ! 900: pc.cp++; ! 901: td = pop4(); ! 902: td1 = pop8(); ! 903: push8(td1 / td); ! 904: continue; ! 905: case O_DVD82: ! 906: pc.cp++; ! 907: td = pop8(); ! 908: td1 = pop2(); ! 909: push8(td1 / td); ! 910: continue; ! 911: case O_DVD84: ! 912: pc.cp++; ! 913: td = pop8(); ! 914: td1 = pop4(); ! 915: push8(td1 / td); ! 916: continue; ! 917: case O_RV1: ! 918: tcp = _display.raw[*pc.ucp++]; ! 919: push2((short)(*(tcp + *pc.sp++))); ! 920: continue; ! 921: case O_RV14: ! 922: tcp = _display.raw[*pc.ucp++]; ! 923: push4((long)(*(tcp + *pc.sp++))); ! 924: continue; ! 925: case O_RV2: ! 926: tcp = _display.raw[*pc.ucp++]; ! 927: push2(*(short *)(tcp + *pc.sp++)); ! 928: continue; ! 929: case O_RV24: ! 930: tcp = _display.raw[*pc.ucp++]; ! 931: push4((long)(*(short *)(tcp + *pc.sp++))); ! 932: continue; ! 933: case O_RV4: ! 934: tcp = _display.raw[*pc.ucp++]; ! 935: push4(*(long *)(tcp + *pc.sp++)); ! 936: continue; ! 937: case O_RV8: ! 938: tcp = _display.raw[*pc.ucp++]; ! 939: pushsze8(*(struct sze8 *)(tcp + *pc.sp++)); ! 940: continue; ! 941: case O_RV: ! 942: tcp = _display.raw[*pc.ucp++]; ! 943: tcp += *pc.sp++; ! 944: tl = *pc.usp++; ! 945: tcp1 = pushsp((tl + 1) & ~1); ! 946: blkcpy(tcp, tcp1, tl); ! 947: continue; ! 948: case O_LV: ! 949: tcp = _display.raw[*pc.ucp++]; ! 950: pushaddr(tcp + *pc.sp++); ! 951: continue; ! 952: case O_LRV1: ! 953: tcp = _display.raw[*pc.ucp++]; ! 954: push2((short)(*(tcp + *pc.lp++))); ! 955: continue; ! 956: case O_LRV14: ! 957: tcp = _display.raw[*pc.ucp++]; ! 958: push4((long)(*(tcp + *pc.lp++))); ! 959: continue; ! 960: case O_LRV2: ! 961: tcp = _display.raw[*pc.ucp++]; ! 962: push2(*(short *)(tcp + *pc.lp++)); ! 963: continue; ! 964: case O_LRV24: ! 965: tcp = _display.raw[*pc.ucp++]; ! 966: push4((long)(*(short *)(tcp + *pc.lp++))); ! 967: continue; ! 968: case O_LRV4: ! 969: tcp = _display.raw[*pc.ucp++]; ! 970: push4(*(long *)(tcp + *pc.lp++)); ! 971: continue; ! 972: case O_LRV8: ! 973: tcp = _display.raw[*pc.ucp++]; ! 974: pushsze8(*(struct sze8 *)(tcp + *pc.lp++)); ! 975: continue; ! 976: case O_LRV: ! 977: tcp = _display.raw[*pc.ucp++]; ! 978: tcp += (int)*pc.lp++; ! 979: tl = *pc.usp++; ! 980: tcp1 = pushsp((tl + 1) & ~1); ! 981: blkcpy(tcp, tcp1, tl); ! 982: continue; ! 983: case O_LLV: ! 984: tcp = _display.raw[*pc.ucp++]; ! 985: pushaddr(tcp + *pc.lp++); ! 986: continue; ! 987: case O_IND1: ! 988: pc.cp++; ! 989: push2((short)(*popaddr())); ! 990: continue; ! 991: case O_IND14: ! 992: pc.cp++; ! 993: push4((long)(*popaddr())); ! 994: continue; ! 995: case O_IND2: ! 996: pc.cp++; ! 997: push2(*(short *)(popaddr())); ! 998: continue; ! 999: case O_IND24: ! 1000: pc.cp++; ! 1001: push4((long)(*(short *)(popaddr()))); ! 1002: continue; ! 1003: case O_IND4: ! 1004: pc.cp++; ! 1005: push4(*(long *)(popaddr())); ! 1006: continue; ! 1007: case O_IND8: ! 1008: pc.cp++; ! 1009: pushsze8(*(struct sze8 *)(popaddr())); ! 1010: continue; ! 1011: case O_IND: ! 1012: tl = *pc.cp++; ! 1013: if (tl == 0) ! 1014: tl = *pc.usp++; ! 1015: tcp = popaddr(); ! 1016: tcp1 = pushsp((tl + 1) & ~1); ! 1017: blkcpy(tcp, tcp1, tl); ! 1018: continue; ! 1019: case O_CON1: ! 1020: push2((short)(*pc.cp++)); ! 1021: continue; ! 1022: case O_CON14: ! 1023: push4((long)(*pc.cp++)); ! 1024: continue; ! 1025: case O_CON2: ! 1026: pc.cp++; ! 1027: push2(*pc.sp++); ! 1028: continue; ! 1029: case O_CON24: ! 1030: pc.cp++; ! 1031: push4((long)(*pc.sp++)); ! 1032: continue; ! 1033: case O_CON4: ! 1034: pc.cp++; ! 1035: push4(*pc.lp++); ! 1036: continue; ! 1037: case O_CON8: ! 1038: pc.cp++; ! 1039: push8(*pc.dbp++); ! 1040: continue; ! 1041: case O_CON: ! 1042: tl = *pc.cp++; ! 1043: if (tl == 0) ! 1044: tl = *pc.usp++; ! 1045: tl = (tl + 1) & ~1; ! 1046: tcp = pushsp(tl); ! 1047: blkcpy(pc.cp, tcp, tl); ! 1048: pc.cp += (int)tl; ! 1049: continue; ! 1050: case O_CONG: ! 1051: tl = *pc.cp++; ! 1052: if (tl == 0) ! 1053: tl = *pc.usp++; ! 1054: tl1 = (tl + 1) & ~1; ! 1055: tcp = pushsp(tl1); ! 1056: blkcpy(pc.cp, tcp, tl1); ! 1057: pc.cp += (int)((tl + 2) & ~1); ! 1058: continue; ! 1059: case O_LVCON: ! 1060: tl = *pc.cp++; ! 1061: if (tl == 0) ! 1062: tl = *pc.usp++; ! 1063: tl = (tl + 1) & ~1; ! 1064: pushaddr(pc.cp); ! 1065: pc.cp += (int)tl; ! 1066: continue; ! 1067: case O_RANG2: ! 1068: tl = *pc.cp++; ! 1069: if (tl == 0) ! 1070: tl = *pc.sp++; ! 1071: tl1 = pop2(); ! 1072: push2((short)(RANG4(tl1, tl, (long)(*pc.sp++)))); ! 1073: continue; ! 1074: case O_RANG42: ! 1075: tl = *pc.cp++; ! 1076: if (tl == 0) ! 1077: tl = *pc.sp++; ! 1078: tl1 = pop4(); ! 1079: push4(RANG4(tl1, tl, (long)(*pc.sp++))); ! 1080: continue; ! 1081: case O_RSNG2: ! 1082: tl = *pc.cp++; ! 1083: if (tl == 0) ! 1084: tl = *pc.sp++; ! 1085: tl1 = pop2(); ! 1086: push2((short)(RSNG4(tl1, tl))); ! 1087: continue; ! 1088: case O_RSNG42: ! 1089: tl = *pc.cp++; ! 1090: if (tl == 0) ! 1091: tl = *pc.sp++; ! 1092: tl1 = pop4(); ! 1093: push4(RSNG4(tl1, tl)); ! 1094: continue; ! 1095: case O_RANG4: ! 1096: tl = *pc.cp++; ! 1097: if (tl == 0) ! 1098: tl = *pc.lp++; ! 1099: tl1 = pop4(); ! 1100: push4(RANG4(tl1, tl, *pc.lp++)); ! 1101: continue; ! 1102: case O_RANG24: ! 1103: tl = *pc.cp++; ! 1104: if (tl == 0) ! 1105: tl = *pc.lp++; ! 1106: tl1 = pop2(); ! 1107: push2((short)(RANG4(tl1, tl, *pc.lp++))); ! 1108: continue; ! 1109: case O_RSNG4: ! 1110: tl = *pc.cp++; ! 1111: if (tl == 0) ! 1112: tl = *pc.lp++; ! 1113: tl1 = pop4(); ! 1114: push4(RSNG4(tl1, tl)); ! 1115: continue; ! 1116: case O_RSNG24: ! 1117: tl = *pc.cp++; ! 1118: if (tl == 0) ! 1119: tl = *pc.lp++; ! 1120: tl1 = pop2(); ! 1121: push2((short)(RSNG4(tl1, tl))); ! 1122: continue; ! 1123: case O_STLIM: ! 1124: pc.cp++; ! 1125: STLIM(); ! 1126: popsp((long)(sizeof(long))); ! 1127: continue; ! 1128: case O_LLIMIT: ! 1129: pc.cp++; ! 1130: LLIMIT(); ! 1131: popsp((long)(sizeof(char *)+sizeof(long))); ! 1132: continue; ! 1133: case O_BUFF: ! 1134: BUFF((long)(*pc.cp++)); ! 1135: continue; ! 1136: case O_HALT: ! 1137: pc.cp++; ! 1138: if (_nodump == TRUE) ! 1139: psexit(0); ! 1140: fputs("\nCall to procedure halt\n", stderr); ! 1141: backtrace("Halted"); ! 1142: psexit(0); ! 1143: continue; ! 1144: case O_PXPBUF: ! 1145: pc.cp++; ! 1146: _cntrs = *pc.lp++; ! 1147: _rtns = *pc.lp++; ! 1148: NEW(&_pcpcount, (_cntrs + 1) * sizeof(long)); ! 1149: blkclr(_pcpcount, (_cntrs + 1) * sizeof(long)); ! 1150: continue; ! 1151: case O_COUNT: ! 1152: pc.cp++; ! 1153: _pcpcount[*pc.usp++]++; ! 1154: continue; ! 1155: case O_CASE1OP: ! 1156: tl = *pc.cp++; /* tl = number of cases */ ! 1157: if (tl == 0) ! 1158: tl = *pc.usp++; ! 1159: tsp = pc.sp + tl; /* ptr to end of jump table */ ! 1160: tcp = (char *)tsp; /* tcp = ptr to case values */ ! 1161: tl1 = pop2(); /* tl1 = element to find */ ! 1162: for(; tl > 0; tl--) /* look for element */ ! 1163: if (tl1 == *tcp++) ! 1164: break; ! 1165: if (tl == 0) /* default case => error */ ! 1166: CASERNG(tl1); ! 1167: pc.cp += *(tsp - tl); ! 1168: continue; ! 1169: case O_CASE2OP: ! 1170: tl = *pc.cp++; /* tl = number of cases */ ! 1171: if (tl == 0) ! 1172: tl = *pc.usp++; ! 1173: tsp = pc.sp + tl; /* ptr to end of jump table */ ! 1174: tsp1 = tsp; /* tsp1 = ptr to case values */ ! 1175: tl1 = (unsigned short)pop2();/* tl1 = element to find */ ! 1176: for(; tl > 0; tl--) /* look for element */ ! 1177: if (tl1 == *tsp1++) ! 1178: break; ! 1179: if (tl == 0) /* default case => error */ ! 1180: CASERNG(tl1); ! 1181: pc.cp += *(tsp - tl); ! 1182: continue; ! 1183: case O_CASE4OP: ! 1184: tl = *pc.cp++; /* tl = number of cases */ ! 1185: if (tl == 0) ! 1186: tl = *pc.usp++; ! 1187: tsp = pc.sp + tl; /* ptr to end of jump table */ ! 1188: tlp = (long *)tsp; /* tlp = ptr to case values */ ! 1189: tl1 = pop4(); /* tl1 = element to find */ ! 1190: for(; tl > 0; tl--) /* look for element */ ! 1191: if (tl1 == *tlp++) ! 1192: break; ! 1193: if (tl == 0) /* default case => error */ ! 1194: CASERNG(tl1); ! 1195: pc.cp += *(tsp - tl); ! 1196: continue; ! 1197: case O_ADDT: ! 1198: tl = *pc.cp++; /* tl has comparison length */ ! 1199: if (tl == 0) ! 1200: tl = *pc.usp++; ! 1201: tcp = pushsp((long)(0));/* tcp pts to first arg */ ! 1202: ADDT(tcp + tl, tcp + tl, tcp, tl >> 2); ! 1203: popsp(tl); ! 1204: continue; ! 1205: case O_SUBT: ! 1206: tl = *pc.cp++; /* tl has comparison length */ ! 1207: if (tl == 0) ! 1208: tl = *pc.usp++; ! 1209: tcp = pushsp((long)(0));/* tcp pts to first arg */ ! 1210: SUBT(tcp + tl, tcp + tl, tcp, tl >> 2); ! 1211: popsp(tl); ! 1212: continue; ! 1213: case O_MULT: ! 1214: tl = *pc.cp++; /* tl has comparison length */ ! 1215: if (tl == 0) ! 1216: tl = *pc.usp++; ! 1217: tcp = pushsp((long)(0));/* tcp pts to first arg */ ! 1218: MULT(tcp + tl, tcp + tl, tcp, tl >> 2); ! 1219: popsp(tl); ! 1220: continue; ! 1221: case O_INCT: ! 1222: tl = *pc.cp++; /* tl has number of args */ ! 1223: if (tl == 0) ! 1224: tl = *pc.usp++; ! 1225: tb = INCT(); ! 1226: popsp(tl*sizeof(long)); ! 1227: push2((short)(tb)); ! 1228: continue; ! 1229: case O_CTTOT: ! 1230: tl = *pc.cp++; /* tl has number of args */ ! 1231: if (tl == 0) ! 1232: tl = *pc.usp++; ! 1233: tl1 = tl * sizeof(long); ! 1234: tcp = pushsp((long)(0)) + tl1; /* tcp pts to result */ ! 1235: CTTOT(tcp); ! 1236: popsp(tl*sizeof(long)); ! 1237: continue; ! 1238: case O_CARD: ! 1239: tl = *pc.cp++; /* tl has comparison length */ ! 1240: if (tl == 0) ! 1241: tl = *pc.usp++; ! 1242: tcp = pushsp((long)(0));/* tcp pts to set */ ! 1243: tl1 = CARD(tcp, tl); ! 1244: popsp(tl); ! 1245: push2((short)(tl1)); ! 1246: continue; ! 1247: case O_IN: ! 1248: tl = *pc.cp++; /* tl has comparison length */ ! 1249: if (tl == 0) ! 1250: tl = *pc.usp++; ! 1251: tl1 = pop4(); /* tl1 is the element */ ! 1252: tcp = pushsp((long)(0));/* tcp pts to set */ ! 1253: tl2 = *pc.sp++; /* lower bound */ ! 1254: tb = IN(tl1, tl2, (long)(*pc.usp++), tcp); ! 1255: popsp(tl); ! 1256: push2((short)(tb)); ! 1257: continue; ! 1258: case O_ASRT: ! 1259: pc.cp++; ! 1260: ASRTS(); ! 1261: popsp((long)(sizeof(long)+sizeof(char *))); ! 1262: continue; ! 1263: case O_FOR1U: ! 1264: tl1 = *pc.cp++; /* tl1 loop branch */ ! 1265: if (tl1 == 0) ! 1266: tl1 = *pc.sp++; ! 1267: tcp = popaddr(); /* tcp = ptr to index var */ ! 1268: tl = pop4(); /* tl upper bound */ ! 1269: if (*tcp == tl) /* loop is done, fall through */ ! 1270: continue; ! 1271: *tcp += 1; /* inc index var */ ! 1272: pc.cp += tl1; /* return to top of loop */ ! 1273: continue; ! 1274: case O_FOR2U: ! 1275: tl1 = *pc.cp++; /* tl1 loop branch */ ! 1276: if (tl1 == 0) ! 1277: tl1 = *pc.sp++; ! 1278: tsp = (short *)popaddr(); /* tsp = ptr to index var */ ! 1279: tl = pop4(); /* tl upper bound */ ! 1280: if (*tsp == tl) /* loop is done, fall through */ ! 1281: continue; ! 1282: *tsp += 1; /* inc index var */ ! 1283: pc.cp += tl1; /* return to top of loop */ ! 1284: continue; ! 1285: case O_FOR4U: ! 1286: tl1 = *pc.cp++; /* tl1 loop branch */ ! 1287: if (tl1 == 0) ! 1288: tl1 = *pc.sp++; ! 1289: tlp = (long *)popaddr(); /* tlp = ptr to index var */ ! 1290: tl = pop4(); /* tl upper bound */ ! 1291: if (*tlp == tl) /* loop is done, fall through */ ! 1292: continue; ! 1293: *tlp += 1; /* inc index var */ ! 1294: pc.cp += tl1; /* return to top of loop */ ! 1295: continue; ! 1296: case O_FOR1D: ! 1297: tl1 = *pc.cp++; /* tl1 loop branch */ ! 1298: if (tl1 == 0) ! 1299: tl1 = *pc.sp++; ! 1300: tcp = popaddr(); /* tcp = ptr to index var */ ! 1301: tl = pop4(); /* tl upper bound */ ! 1302: if (*tcp == tl) /* loop is done, fall through */ ! 1303: continue; ! 1304: *tcp -= 1; /* dec index var */ ! 1305: pc.cp += tl1; /* return to top of loop */ ! 1306: continue; ! 1307: case O_FOR2D: ! 1308: tl1 = *pc.cp++; /* tl1 loop branch */ ! 1309: if (tl1 == 0) ! 1310: tl1 = *pc.sp++; ! 1311: tsp = (short *)popaddr(); /* tsp = ptr to index var */ ! 1312: tl = pop4(); /* tl upper bound */ ! 1313: if (*tsp == tl) /* loop is done, fall through */ ! 1314: continue; ! 1315: *tsp -= 1; /* dec index var */ ! 1316: pc.cp += tl1; /* return to top of loop */ ! 1317: continue; ! 1318: case O_FOR4D: ! 1319: tl1 = *pc.cp++; /* tl1 loop branch */ ! 1320: if (tl1 == 0) ! 1321: tl1 = *pc.sp++; ! 1322: tlp = (long *)popaddr(); /* tlp = ptr to index var */ ! 1323: tl = pop4(); /* tl upper bound */ ! 1324: if (*tlp == tl) /* loop is done, fall through */ ! 1325: continue; ! 1326: *tlp -= 1; /* dec index var */ ! 1327: pc.cp += tl1; /* return to top of loop */ ! 1328: continue; ! 1329: case O_READE: ! 1330: pc.cp++; ! 1331: push2((short)(READE(curfile, base + *pc.lp++))); ! 1332: continue; ! 1333: case O_READ4: ! 1334: pc.cp++; ! 1335: push4(READ4(curfile)); ! 1336: continue; ! 1337: case O_READC: ! 1338: pc.cp++; ! 1339: push2((short)(READC(curfile))); ! 1340: continue; ! 1341: case O_READ8: ! 1342: pc.cp++; ! 1343: push8(READ8(curfile)); ! 1344: continue; ! 1345: case O_READLN: ! 1346: pc.cp++; ! 1347: READLN(curfile); ! 1348: continue; ! 1349: case O_EOF: ! 1350: pc.cp++; ! 1351: push2((short)(TEOF(popaddr()))); ! 1352: continue; ! 1353: case O_EOLN: ! 1354: pc.cp++; ! 1355: push2((short)(TEOLN(popaddr()))); ! 1356: continue; ! 1357: case O_WRITEC: ! 1358: if (_runtst) { ! 1359: WRITEC(curfile); ! 1360: popsp((long)(*pc.cp++)); ! 1361: continue; ! 1362: } ! 1363: fputc(); ! 1364: popsp((long)(*pc.cp++)); ! 1365: continue; ! 1366: case O_WRITES: ! 1367: if (_runtst) { ! 1368: WRITES(curfile); ! 1369: popsp((long)(*pc.cp++)); ! 1370: continue; ! 1371: } ! 1372: fwrite(); ! 1373: popsp((long)(*pc.cp++)); ! 1374: continue; ! 1375: case O_WRITEF: ! 1376: if (_runtst) { ! 1377: WRITEF(curfile); ! 1378: popsp((long)(*pc.cp++)); ! 1379: continue; ! 1380: } ! 1381: fprintf(); ! 1382: popsp((long)(*pc.cp++)); ! 1383: continue; ! 1384: case O_WRITLN: ! 1385: pc.cp++; ! 1386: if (_runtst) { ! 1387: WRITLN(curfile); ! 1388: continue; ! 1389: } ! 1390: fputc('\n', ACTFILE(curfile)); ! 1391: continue; ! 1392: case O_PAGE: ! 1393: pc.cp++; ! 1394: if (_runtst) { ! 1395: PAGE(curfile); ! 1396: continue; ! 1397: } ! 1398: fputc('', ACTFILE(curfile)); ! 1399: continue; ! 1400: case O_NAM: ! 1401: pc.cp++; ! 1402: tl = pop4(); ! 1403: pushaddr(NAM(tl, base + *pc.lp++)); ! 1404: continue; ! 1405: case O_MAX: ! 1406: tl = *pc.cp++; ! 1407: if (tl == 0) ! 1408: tl = *pc.usp++; ! 1409: tl1 = pop4(); ! 1410: if (_runtst) { ! 1411: push4(MAX(tl1, tl, (long)(*pc.usp++))); ! 1412: continue; ! 1413: } ! 1414: tl1 -= tl; ! 1415: tl = *pc.usp++; ! 1416: push4(tl1 > tl ? tl1 : tl); ! 1417: continue; ! 1418: case O_MIN: ! 1419: tl = *pc.cp++; ! 1420: if (tl == 0) ! 1421: tl = *pc.usp++; ! 1422: tl1 = pop4(); ! 1423: push4(tl1 < tl ? tl1 : tl); ! 1424: continue; ! 1425: case O_UNIT: ! 1426: pc.cp++; ! 1427: curfile = UNIT(popaddr()); ! 1428: continue; ! 1429: case O_UNITINP: ! 1430: pc.cp++; ! 1431: curfile = INPUT; ! 1432: continue; ! 1433: case O_UNITOUT: ! 1434: pc.cp++; ! 1435: curfile = OUTPUT; ! 1436: continue; ! 1437: case O_MESSAGE: ! 1438: pc.cp++; ! 1439: PFLUSH(); ! 1440: curfile = ERR; ! 1441: continue; ! 1442: case O_PUT: ! 1443: pc.cp++; ! 1444: PUT(curfile); ! 1445: continue; ! 1446: case O_GET: ! 1447: pc.cp++; ! 1448: GET(curfile); ! 1449: continue; ! 1450: case O_FNIL: ! 1451: pc.cp++; ! 1452: pushaddr(FNIL(popaddr())); ! 1453: continue; ! 1454: case O_DEFNAME: ! 1455: pc.cp++; ! 1456: DEFNAME(); ! 1457: popsp((long)(2*sizeof(char *)+2*sizeof(long))); ! 1458: continue; ! 1459: case O_RESET: ! 1460: pc.cp++; ! 1461: RESET(); ! 1462: popsp((long)(2*sizeof(char *)+2*sizeof(long))); ! 1463: continue; ! 1464: case O_REWRITE: ! 1465: pc.cp++; ! 1466: REWRITE(); ! 1467: popsp((long)(2*sizeof(char *)+2*sizeof(long))); ! 1468: continue; ! 1469: case O_FILE: ! 1470: pc.cp++; ! 1471: pushaddr(ACTFILE(curfile)); ! 1472: continue; ! 1473: case O_REMOVE: ! 1474: pc.cp++; ! 1475: REMOVE(); ! 1476: popsp((long)(sizeof(char *)+sizeof(long))); ! 1477: continue; ! 1478: case O_FLUSH: ! 1479: pc.cp++; ! 1480: FLUSH(); ! 1481: popsp((long)(sizeof(char *))); ! 1482: continue; ! 1483: case O_PACK: ! 1484: pc.cp++; ! 1485: PACK(); ! 1486: popsp((long)(5*sizeof(long)+2*sizeof(char*))); ! 1487: continue; ! 1488: case O_UNPACK: ! 1489: pc.cp++; ! 1490: UNPACK(); ! 1491: popsp((long)(5*sizeof(long)+2*sizeof(char*))); ! 1492: continue; ! 1493: case O_ARGC: ! 1494: pc.cp++; ! 1495: push4((long)_argc); ! 1496: continue; ! 1497: case O_ARGV: ! 1498: tl = *pc.cp++; /* tl = size of char array */ ! 1499: if (tl == 0) ! 1500: tl = *pc.usp++; ! 1501: tcp = popaddr(); /* tcp = addr of char array */ ! 1502: tl1 = pop4(); /* tl1 = argv subscript */ ! 1503: ARGV(tl1, tcp, tl); ! 1504: continue; ! 1505: case O_CLCK: ! 1506: pc.cp++; ! 1507: push4(CLCK()); ! 1508: continue; ! 1509: case O_WCLCK: ! 1510: pc.cp++; ! 1511: push4(time(0)); ! 1512: continue; ! 1513: case O_SCLCK: ! 1514: pc.cp++; ! 1515: push4(SCLCK()); ! 1516: continue; ! 1517: case O_NEW: ! 1518: tl = *pc.cp++; /* tl = size being new'ed */ ! 1519: if (tl == 0) ! 1520: tl = *pc.usp++; ! 1521: tcp = popaddr(); /* ptr to ptr being new'ed */ ! 1522: NEW(tcp, tl); ! 1523: if (_runtst) { ! 1524: blkclr(*((char **)(tcp)), tl); ! 1525: } ! 1526: continue; ! 1527: case O_DISPOSE: ! 1528: tl = *pc.cp++; /* tl = size being disposed */ ! 1529: if (tl == 0) ! 1530: tl = *pc.usp++; ! 1531: tcp = popaddr(); /* ptr to ptr being disposed */ ! 1532: DISPOSE(tcp, tl); ! 1533: *(char **)tcp = (char *)0; ! 1534: continue; ! 1535: case O_DFDISP: ! 1536: tl = *pc.cp++; /* tl = size being disposed */ ! 1537: if (tl == 0) ! 1538: tl = *pc.usp++; ! 1539: tcp = popaddr(); /* ptr to ptr being disposed */ ! 1540: DFDISPOSE(tcp, tl); ! 1541: *(char **)tcp = (char *)0; ! 1542: continue; ! 1543: case O_DATE: ! 1544: pc.cp++; ! 1545: DATE(popaddr()); ! 1546: continue; ! 1547: case O_TIME: ! 1548: pc.cp++; ! 1549: TIME(popaddr()); ! 1550: continue; ! 1551: case O_UNDEF: ! 1552: pc.cp++; ! 1553: pop8(); ! 1554: push2((short)(0)); ! 1555: continue; ! 1556: case O_ATAN: ! 1557: pc.cp++; ! 1558: if (_runtst) { ! 1559: push8(ATAN(pop8())); ! 1560: continue; ! 1561: } ! 1562: push8(atan(pop8())); ! 1563: continue; ! 1564: case O_COS: ! 1565: pc.cp++; ! 1566: if (_runtst) { ! 1567: push8(COS(pop8())); ! 1568: continue; ! 1569: } ! 1570: push8(cos(pop8())); ! 1571: continue; ! 1572: case O_EXP: ! 1573: pc.cp++; ! 1574: if (_runtst) { ! 1575: push8(EXP(pop8())); ! 1576: continue; ! 1577: } ! 1578: push8(exp(pop8())); ! 1579: continue; ! 1580: case O_LN: ! 1581: pc.cp++; ! 1582: if (_runtst) { ! 1583: push8(LN(pop8())); ! 1584: continue; ! 1585: } ! 1586: push8(log(pop8())); ! 1587: continue; ! 1588: case O_SIN: ! 1589: pc.cp++; ! 1590: if (_runtst) { ! 1591: push8(SIN(pop8())); ! 1592: continue; ! 1593: } ! 1594: push8(sin(pop8())); ! 1595: continue; ! 1596: case O_SQRT: ! 1597: pc.cp++; ! 1598: if (_runtst) { ! 1599: push8(SQRT(pop8())); ! 1600: continue; ! 1601: } ! 1602: push8(sqrt(pop8())); ! 1603: continue; ! 1604: case O_CHR2: ! 1605: case O_CHR4: ! 1606: pc.cp++; ! 1607: if (_runtst) { ! 1608: push2((short)(CHR(pop4()))); ! 1609: continue; ! 1610: } ! 1611: push2((short)(pop4())); ! 1612: continue; ! 1613: case O_ODD2: ! 1614: case O_ODD4: ! 1615: pc.cp++; ! 1616: tl = pop4(); ! 1617: push2((short)(tl & 1)); ! 1618: continue; ! 1619: case O_SUCC2: ! 1620: tl = *pc.cp++; ! 1621: if (tl == 0) ! 1622: tl = *pc.sp++; ! 1623: tl1 = pop4(); ! 1624: if (_runtst) { ! 1625: push2((short)(SUCC(tl1, tl, (long)(*pc.sp++)))); ! 1626: continue; ! 1627: } ! 1628: push2((short)(tl1 + 1)); ! 1629: pc.sp++; ! 1630: continue; ! 1631: case O_SUCC24: ! 1632: tl = *pc.cp++; ! 1633: if (tl == 0) ! 1634: tl = *pc.sp++; ! 1635: tl1 = pop4(); ! 1636: if (_runtst) { ! 1637: push4(SUCC(tl1, tl, (long)(*pc.sp++))); ! 1638: continue; ! 1639: } ! 1640: push4(tl1 + 1); ! 1641: pc.sp++; ! 1642: continue; ! 1643: case O_SUCC4: ! 1644: tl = *pc.cp++; ! 1645: if (tl == 0) ! 1646: tl = *pc.lp++; ! 1647: tl1 = pop4(); ! 1648: if (_runtst) { ! 1649: push4(SUCC(tl1, tl, (long)(*pc.lp++))); ! 1650: continue; ! 1651: } ! 1652: push4(tl1 + 1); ! 1653: pc.lp++; ! 1654: continue; ! 1655: case O_PRED2: ! 1656: tl = *pc.cp++; ! 1657: if (tl == 0) ! 1658: tl = *pc.sp++; ! 1659: tl1 = pop4(); ! 1660: if (_runtst) { ! 1661: push2((short)(PRED(tl1, tl, (long)(*pc.sp++)))); ! 1662: continue; ! 1663: } ! 1664: push2((short)(tl1 - 1)); ! 1665: pc.sp++; ! 1666: continue; ! 1667: case O_PRED24: ! 1668: tl = *pc.cp++; ! 1669: if (tl == 0) ! 1670: tl = *pc.sp++; ! 1671: tl1 = pop4(); ! 1672: if (_runtst) { ! 1673: push4(PRED(tl1, tl, (long)(*pc.sp++))); ! 1674: continue; ! 1675: } ! 1676: push4(tl1 - 1); ! 1677: pc.sp++; ! 1678: continue; ! 1679: case O_PRED4: ! 1680: tl = *pc.cp++; ! 1681: if (tl == 0) ! 1682: tl = *pc.lp++; ! 1683: tl1 = pop4(); ! 1684: if (_runtst) { ! 1685: push4(PRED(tl1, tl, (long)(*pc.lp++))); ! 1686: continue; ! 1687: } ! 1688: push4(tl1 - 1); ! 1689: pc.lp++; ! 1690: continue; ! 1691: case O_SEED: ! 1692: pc.cp++; ! 1693: push4(SEED(pop4())); ! 1694: continue; ! 1695: case O_RANDOM: ! 1696: pc.cp++; ! 1697: push8(RANDOM(pop8())); ! 1698: continue; ! 1699: case O_EXPO: ! 1700: pc.cp++; ! 1701: push4(EXPO(pop8())); ! 1702: continue; ! 1703: case O_SQR2: ! 1704: case O_SQR4: ! 1705: pc.cp++; ! 1706: tl = pop4(); ! 1707: push4(tl * tl); ! 1708: continue; ! 1709: case O_SQR8: ! 1710: pc.cp++; ! 1711: td = pop8(); ! 1712: push8(td * td); ! 1713: continue; ! 1714: case O_ROUND: ! 1715: pc.cp++; ! 1716: push4(ROUND(pop8())); ! 1717: continue; ! 1718: case O_TRUNC: ! 1719: pc.cp++; ! 1720: push4(TRUNC(pop8())); ! 1721: continue; ! 1722: default: ! 1723: ERROR("Panic: bad op code\n"); ! 1724: continue; ! 1725: } ! 1726: } ! 1727: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.