12080Smckusick /* Copyright (c) 1979 Regents of the University of California */ 22080Smckusick 3*5723Smckusic static char sccsid[] = "@(#)interp.c 1.20 02/08/82"; 42080Smckusick 52080Smckusick #include <math.h> 62950Smckusic #include "whoami.h" 72950Smckusic #include "objfmt.h" 82080Smckusick #include "vars.h" 92080Smckusick #include "h02opcs.h" 102080Smckusick #include "machdep.h" 112080Smckusick #include "libpc.h" 122080Smckusick 132080Smckusick /* 142080Smckusick * program variables 152080Smckusick */ 162109Smckusic union disply _display; 172080Smckusick struct disp *_dp; 182080Smckusick long _lino = 0; 192080Smckusick int _argc; 202080Smckusick char **_argv; 212080Smckusick long _mode; 222950Smckusic bool _runtst = TRUE; 232950Smckusic bool _nodump = FALSE; 242080Smckusick long _stlim = 500000; 252080Smckusick long _stcnt = 0; 262191Smckusic long _seed = 1; 272950Smckusic #ifdef VAX 282080Smckusick char *_minptr = (char *)0x7fffffff; 292950Smckusic #else 302950Smckusic char *_minptr = (char *)0xffff; 312950Smckusic #endif VAX 322080Smckusick char *_maxptr = (char *)0; 332080Smckusick long *_pcpcount = (long *)0; 342080Smckusick long _cntrs = 0; 352080Smckusick long _rtns = 0; 362080Smckusick 372080Smckusick /* 382080Smckusick * standard files 392080Smckusick */ 402080Smckusick char _inwin, _outwin, _errwin; 412950Smckusic struct iorechd _err = { 422950Smckusic &_errwin, /* fileptr */ 432080Smckusick 0, /* lcount */ 442080Smckusick 0x7fffffff, /* llimit */ 452950Smckusic &_iob[2], /* fbuf */ 462950Smckusic FILNIL, /* fchain */ 472080Smckusick STDLVL, /* flev */ 482950Smckusic "Message file", /* pfname */ 492950Smckusic FTEXT | FWRITE | EOFF, /* funit */ 502950Smckusic 2, /* fblk */ 512080Smckusick 1 /* fsize */ 522080Smckusick }; 532080Smckusick struct iorechd output = { 542080Smckusick &_outwin, /* fileptr */ 552080Smckusick 0, /* lcount */ 562080Smckusick 0x7fffffff, /* llimit */ 572080Smckusick &_iob[1], /* fbuf */ 582080Smckusick ERR, /* fchain */ 592080Smckusick STDLVL, /* flev */ 602080Smckusick "standard output", /* pfname */ 612080Smckusick FTEXT | FWRITE | EOFF, /* funit */ 622080Smckusick 1, /* fblk */ 632080Smckusick 1 /* fsize */ 642080Smckusick }; 652950Smckusic struct iorechd input = { 662950Smckusic &_inwin, /* fileptr */ 672080Smckusick 0, /* lcount */ 682080Smckusick 0x7fffffff, /* llimit */ 692950Smckusic &_iob[0], /* fbuf */ 702950Smckusic OUTPUT, /* fchain */ 712080Smckusick STDLVL, /* flev */ 722950Smckusic "standard input", /* pfname */ 732950Smckusic FTEXT | FREAD | SYNC, /* funit */ 742950Smckusic 0, /* fblk */ 752080Smckusick 1 /* fsize */ 762080Smckusick }; 772080Smckusick 782109Smckusic /* 792950Smckusic * file record variables 802950Smckusic */ 812950Smckusic long _filefre = PREDEF; 822950Smckusic struct iorechd _fchain = { 832950Smckusic 0, 0, 0, 0, /* only use fchain field */ 842950Smckusic INPUT /* fchain */ 852950Smckusic }; 862950Smckusic struct iorec *_actfile[MAXFILES] = { 872950Smckusic INPUT, 882950Smckusic OUTPUT, 892950Smckusic ERR 902950Smckusic }; 912950Smckusic 922950Smckusic /* 935658Slinton * stuff for pdx 945658Slinton */ 955658Slinton 965658Slinton union progcntr *pcaddrp; 975658Slinton asm(".globl _loopaddr"); 985658Slinton 995658Slinton /* 1002109Smckusic * Px profile array 1012109Smckusic */ 1022109Smckusic #ifdef PROFILE 1032109Smckusic long _profcnts[NUMOPS]; 1042109Smckusic #endif PROFILE 1052109Smckusic 1062109Smckusic /* 1072109Smckusic * debugging variables 1082109Smckusic */ 1092109Smckusic #ifdef DEBUG 1102109Smckusic char opc[10]; 1112109Smckusic long opcptr = 9; 1122109Smckusic #endif DEBUG 1132109Smckusic 1142080Smckusick interpreter(base) 1152080Smckusick char *base; 1162080Smckusick { 1172080Smckusick union progcntr pc; /* interpreted program cntr */ 1182080Smckusick register char *vpc; /* register used for "pc" */ 1192080Smckusick struct iorec *curfile; /* active file */ 1202080Smckusick register struct stack *stp; /* active stack frame ptr */ 1212080Smckusick /* 1222080Smckusick * the following variables are used as scratch 1232080Smckusick */ 1242239Smckusic register char *tcp; 1252239Smckusic register long tl, tl1, tl2; 1262080Smckusick double td, td1; 1272239Smckusic struct sze8 t8; 1282080Smckusick long *tlp; 1292950Smckusic register short *tsp, *tsp1, ts; 1302950Smckusic bool tb; 1312080Smckusick char *tcp1; 1322080Smckusick struct stack *tstp; 1332080Smckusick struct formalrtn *tfp; 1342080Smckusick union progcntr tpc; 1352080Smckusick struct iorec **ip; 1362080Smckusick 1375658Slinton pcaddrp = &pc; 1385658Slinton 1392080Smckusick /* 1402239Smckusic * Setup sets up any hardware specific parameters before 1412239Smckusic * starting the interpreter. Typically this is inline replaced 1422239Smckusic * by interp.sed to utilize specific machine instructions. 1432239Smckusic */ 1442239Smckusic setup(); 1452239Smckusic /* 1462080Smckusick * necessary only on systems which do not initialize 1472080Smckusick * memory to zero 1482080Smckusick */ 1492080Smckusick for (ip = &_actfile[3]; ip < &_actfile[MAXFILES]; *ip++ = FILNIL) 1502080Smckusick /* void */; 1512080Smckusick /* 1522080Smckusick * set up global environment, then ``call'' the main program 1532080Smckusick */ 1542950Smckusic _display.frame[0].locvars = pushsp((long)(2 * sizeof(struct iorec *))); 1552950Smckusic _display.frame[0].locvars += 2 * sizeof(struct iorec *); 1562950Smckusic *(struct iorec **)(_display.frame[0].locvars + OUTPUT_OFF) = OUTPUT; 1572950Smckusic *(struct iorec **)(_display.frame[0].locvars + INPUT_OFF) = INPUT; 1582950Smckusic stp = (struct stack *)pushsp((long)(sizeof(struct stack))); 1592109Smckusic _dp = &_display.frame[0]; 1602080Smckusick pc.cp = base; 1615658Slinton 1625658Slinton asm("_loopaddr:"); 1632080Smckusick for(;;) { 1642109Smckusic # ifdef DEBUG 1652080Smckusick if (++opcptr == 10) 1662080Smckusick opcptr = 0; 1672080Smckusick opc[opcptr] = *pc.ucp; 1682109Smckusic # endif DEBUG 1692109Smckusic # ifdef PROFILE 1702109Smckusic _profcnts[*pc.ucp]++; 1712109Smckusic # endif PROFILE 1722080Smckusick switch (*pc.ucp++) { 1735658Slinton case O_BPT: /* breakpoint trap */ 1745658Slinton asm(".byte 0"); 1755658Slinton pc.ucp--; 1765658Slinton continue; 1772080Smckusick case O_NODUMP: 1782191Smckusic _nodump = TRUE; 1792080Smckusick /* and fall through */ 1802080Smckusick case O_BEG: 1812080Smckusick _dp += 1; /* enter local scope */ 1822080Smckusick stp->odisp = *_dp; /* save old display value */ 1832080Smckusick tl = *pc.ucp++; /* tl = name size */ 1842080Smckusick stp->entry = pc.hdrp; /* pointer to entry info */ 1852191Smckusic tl1 = pc.hdrp->framesze;/* tl1 = size of frame */ 1862191Smckusic _lino = pc.hdrp->offset; 1872191Smckusic _runtst = pc.hdrp->tests; 1882191Smckusic disableovrflo(); 1892191Smckusic if (_runtst) 1902191Smckusic enableovrflo(); 1912950Smckusic pc.cp += (int)tl; /* skip over proc hdr info */ 1922080Smckusick stp->file = curfile; /* save active file */ 1932080Smckusick tcp = pushsp(tl1); /* tcp = new top of stack */ 1942950Smckusic if (_runtst) /* zero stack frame */ 1952950Smckusic blkclr(tl1, tcp); 1962950Smckusic tcp += (int)tl1; /* offsets of locals are neg */ 1972109Smckusic _dp->locvars = tcp; /* set new display pointer */ 1982109Smckusic _dp->stp = stp; 1992950Smckusic stp->tos = pushsp((long)0); /* set tos pointer */ 2002080Smckusick continue; 2012080Smckusick case O_END: 2022080Smckusick PCLOSE(_dp->locvars); /* flush & close local files */ 2032080Smckusick stp = _dp->stp; 2042080Smckusick curfile = stp->file; /* restore old active file */ 2052080Smckusick *_dp = stp->odisp; /* restore old display entry */ 2062109Smckusic if (_dp == &_display.frame[1]) 2072080Smckusick return; /* exiting main proc ??? */ 2082080Smckusick _lino = stp->lino; /* restore lino, pc, dp */ 2092080Smckusick pc.cp = stp->pc.cp; 2102080Smckusick _dp = stp->dp; 2112191Smckusic _runtst = stp->entry->tests; 2122191Smckusic disableovrflo(); 2132191Smckusic if (_runtst) 2142191Smckusic enableovrflo(); 2152109Smckusic popsp(stp->entry->framesze + /* pop local vars */ 2162080Smckusick sizeof(struct stack) + /* pop stack frame */ 2172080Smckusick stp->entry->nargs); /* pop parms */ 2182080Smckusick continue; 2192080Smckusick case O_CALL: 2202080Smckusick tl = *pc.cp++; 2212080Smckusick tcp = base + *pc.lp++;/* calc new entry point */ 2222080Smckusick tcp += sizeof(short); 2232080Smckusick tcp = base + *(long *)tcp; 2242950Smckusic stp = (struct stack *) 2252950Smckusic pushsp((long)(sizeof(struct stack))); 2262080Smckusick stp->lino = _lino; /* save lino, pc, dp */ 2272080Smckusick stp->pc.cp = pc.cp; 2282080Smckusick stp->dp = _dp; 2292109Smckusic _dp = &_display.frame[tl]; /* set up new display ptr */ 2302080Smckusick pc.cp = tcp; 2312080Smckusick continue; 2322080Smckusick case O_FCALL: 2333294Smckusic pc.cp++; 2344016Smckusic tcp = popaddr(); /* ptr to display save area */ 2352080Smckusick tfp = (struct formalrtn *)popaddr(); 2362950Smckusic stp = (struct stack *) 2372950Smckusic pushsp((long)(sizeof(struct stack))); 2382080Smckusick stp->lino = _lino; /* save lino, pc, dp */ 2392080Smckusick stp->pc.cp = pc.cp; 2402080Smckusick stp->dp = _dp; 2413436Smckusic pc.cp = tfp->fentryaddr;/* calc new entry point */ 2423436Smckusic _dp = &_display.frame[tfp->fbn];/* new display ptr */ 2433436Smckusic blkcpy(tfp->fbn * sizeof(struct disp), 2444016Smckusic &_display.frame[1], tcp); 2453436Smckusic blkcpy(tfp->fbn * sizeof(struct disp), 2463436Smckusic &tfp->fdisp[0], &_display.frame[1]); 2472080Smckusick continue; 2482080Smckusick case O_FRTN: 2492080Smckusick tl = *pc.cp++; /* tl = size of return obj */ 2502080Smckusick if (tl == 0) 2512080Smckusick tl = *pc.usp++; 2522950Smckusic tcp = pushsp((long)(0)); 2532080Smckusick tfp = *(struct formalrtn **)(tcp + tl); 2544016Smckusic tcp1 = *(char **) 2554016Smckusic (tcp + tl + sizeof(struct formalrtn *)); 2563861Smckusic if (tl != 0) { 2574016Smckusic blkcpy(tl, tcp, tcp + sizeof(struct formalrtn *) 2584016Smckusic + sizeof(char *)); 2593861Smckusic } 2604016Smckusic popsp((long) 2614016Smckusic (sizeof(struct formalrtn *) + sizeof (char *))); 2623436Smckusic blkcpy(tfp->fbn * sizeof(struct disp), 2634016Smckusic tcp1, &_display.frame[1]); 2642080Smckusick continue; 2652080Smckusick case O_FSAV: 2662080Smckusick tfp = (struct formalrtn *)popaddr(); 2673436Smckusic tfp->fbn = *pc.cp++; /* blk number of routine */ 2683861Smckusic tcp = base + *pc.lp++; /* calc new entry point */ 2692080Smckusick tcp += sizeof(short); 2703436Smckusic tfp->fentryaddr = base + *(long *)tcp; 2713436Smckusic blkcpy(tfp->fbn * sizeof(struct disp), 2723436Smckusic &_display.frame[1], &tfp->fdisp[0]); 2732080Smckusick pushaddr(tfp); 2742080Smckusick continue; 2752080Smckusick case O_SDUP2: 2762080Smckusick pc.cp++; 2772080Smckusick tl = pop2(); 2782950Smckusic push2((short)(tl)); 2792950Smckusic push2((short)(tl)); 2802080Smckusick continue; 2812080Smckusick case O_SDUP4: 2822080Smckusick pc.cp++; 2832080Smckusick tl = pop4(); 2842080Smckusick push4(tl); 2852080Smckusick push4(tl); 2862080Smckusick continue; 2872080Smckusick case O_TRA: 2882080Smckusick pc.cp++; 2892080Smckusick pc.cp += *pc.sp; 2902080Smckusick continue; 2912080Smckusick case O_TRA4: 2922080Smckusick pc.cp++; 2932080Smckusick pc.cp = base + *pc.lp; 2942080Smckusick continue; 2952080Smckusick case O_GOTO: 2962109Smckusic tstp = _display.frame[*pc.cp++].stp; /* ptr to 2972109Smckusic exit frame */ 2982080Smckusick pc.cp = base + *pc.lp; 2992080Smckusick stp = _dp->stp; 3002080Smckusick while (tstp != stp) { 3012109Smckusic if (_dp == &_display.frame[1]) 3023872Smckusic ERROR("Active frame not found in non-local goto\n", 0); /* exiting prog ??? */ 3032080Smckusick PCLOSE(_dp->locvars); /* close local files */ 3042080Smckusick curfile = stp->file; /* restore active file */ 3052080Smckusick *_dp = stp->odisp; /* old display entry */ 3062080Smckusick _dp = stp->dp; /* restore dp */ 3072080Smckusick stp = _dp->stp; 3082080Smckusick } 3092080Smckusick /* pop locals, stack frame, parms, and return values */ 3102950Smckusic popsp((long)(stp->tos - pushsp((long)(0)))); 3112080Smckusick continue; 3122080Smckusick case O_LINO: 3132950Smckusic if (_dp->stp->tos != pushsp((long)(0))) 3145682Smckusic ERROR("Panic: stack not empty between statements\n"); 3152080Smckusick _lino = *pc.cp++; /* set line number */ 3162080Smckusick if (_lino == 0) 3172080Smckusick _lino = *pc.sp++; 3182950Smckusic if (_runtst) { 3192950Smckusic LINO(); /* inc statement count */ 3202950Smckusic continue; 3212950Smckusic } 3222950Smckusic _stcnt++; 3232080Smckusick continue; 3242080Smckusick case O_PUSH: 3252080Smckusick tl = *pc.cp++; 3262080Smckusick if (tl == 0) 3272080Smckusick tl = *pc.usp++; 3282080Smckusick tl = (-tl + 1) & ~1; 3292080Smckusick tcp = pushsp(tl); 3302950Smckusic if (_runtst) 3312950Smckusic blkclr(tl, tcp); 3322080Smckusick continue; 3332080Smckusick case O_IF: 3342080Smckusick pc.cp++; 3352191Smckusic if (pop2()) { 3362080Smckusick pc.sp++; 3372191Smckusic continue; 3382191Smckusic } 3392191Smckusic pc.cp += *pc.sp; 3402080Smckusick continue; 3412080Smckusick case O_REL2: 3422080Smckusick tl = pop2(); 3432080Smckusick tl1 = pop2(); 3442080Smckusick goto cmplong; 3452080Smckusick case O_REL24: 3462080Smckusick tl = pop2(); 3472080Smckusick tl1 = pop4(); 3482080Smckusick goto cmplong; 3492080Smckusick case O_REL42: 3502080Smckusick tl = pop4(); 3512080Smckusick tl1 = pop2(); 3522080Smckusick goto cmplong; 3532080Smckusick case O_REL4: 3542080Smckusick tl = pop4(); 3552080Smckusick tl1 = pop4(); 3562080Smckusick cmplong: 3575682Smckusic switch (*pc.cp++) { 3582080Smckusick case releq: 3592080Smckusick push2(tl1 == tl); 3602080Smckusick continue; 3612080Smckusick case relne: 3622080Smckusick push2(tl1 != tl); 3632080Smckusick continue; 3642080Smckusick case rellt: 3652080Smckusick push2(tl1 < tl); 3662080Smckusick continue; 3672080Smckusick case relgt: 3682080Smckusick push2(tl1 > tl); 3692080Smckusick continue; 3702080Smckusick case relle: 3712080Smckusick push2(tl1 <= tl); 3722080Smckusick continue; 3732080Smckusick case relge: 3742080Smckusick push2(tl1 >= tl); 3752080Smckusick continue; 3762080Smckusick default: 3775682Smckusic ERROR("Panic: bad relation %d to REL4*\n", 3785682Smckusic *(pc.cp - 1)); 3792080Smckusick continue; 3802080Smckusick } 3812080Smckusick case O_RELG: 3822080Smckusick tl2 = *pc.cp++; /* tc has jump opcode */ 3832080Smckusick tl = *pc.usp++; /* tl has comparison length */ 3842080Smckusick tl1 = (tl + 1) & ~1; /* tl1 has arg stack length */ 3852950Smckusic tcp = pushsp((long)(0));/* tcp pts to first arg */ 3862080Smckusick switch (tl2) { 3872080Smckusick case releq: 3882950Smckusic tb = RELEQ(tl, tcp + tl1, tcp); 3892080Smckusick break; 3902080Smckusick case relne: 3912950Smckusic tb = RELNE(tl, tcp + tl1, tcp); 3922080Smckusick break; 3932080Smckusick case rellt: 3942950Smckusic tb = RELSLT(tl, tcp + tl1, tcp); 3952080Smckusick break; 3962080Smckusick case relgt: 3972950Smckusic tb = RELSGT(tl, tcp + tl1, tcp); 3982080Smckusick break; 3992080Smckusick case relle: 4002950Smckusic tb = RELSLE(tl, tcp + tl1, tcp); 4012080Smckusick break; 4022080Smckusick case relge: 4032950Smckusic tb = RELSGE(tl, tcp + tl1, tcp); 4042080Smckusick break; 4052080Smckusick default: 4065682Smckusic ERROR("Panic: bad relation %d to RELG*\n", tl2); 4072080Smckusick break; 4082080Smckusick } 4092080Smckusick popsp(tl1 << 1); 4102950Smckusic push2((short)(tb)); 4112080Smckusick continue; 4122080Smckusick case O_RELT: 4132080Smckusick tl2 = *pc.cp++; /* tc has jump opcode */ 4142080Smckusick tl1 = *pc.usp++; /* tl1 has comparison length */ 4152950Smckusic tcp = pushsp((long)(0));/* tcp pts to first arg */ 4162080Smckusick switch (tl2) { 4172080Smckusick case releq: 4182950Smckusic tb = RELEQ(tl1, tcp + tl1, tcp); 4192080Smckusick break; 4202080Smckusick case relne: 4212950Smckusic tb = RELNE(tl1, tcp + tl1, tcp); 4222080Smckusick break; 4232080Smckusick case rellt: 4242950Smckusic tb = RELTLT(tl1, tcp + tl1, tcp); 4252080Smckusick break; 4262080Smckusick case relgt: 4272950Smckusic tb = RELTGT(tl1, tcp + tl1, tcp); 4282080Smckusick break; 4292080Smckusick case relle: 4302950Smckusic tb = RELTLE(tl1, tcp + tl1, tcp); 4312080Smckusick break; 4322080Smckusick case relge: 4332950Smckusic tb = RELTGE(tl1, tcp + tl1, tcp); 4342080Smckusick break; 4352080Smckusick default: 4365682Smckusic ERROR("Panic: bad relation %d to RELT*\n", tl2); 4372080Smckusick break; 4382080Smckusick } 4392080Smckusick popsp(tl1 << 1); 4402950Smckusic push2((short)(tb)); 4412080Smckusick continue; 4422080Smckusick case O_REL28: 4432080Smckusick td = pop2(); 4442080Smckusick td1 = pop8(); 4452080Smckusick goto cmpdbl; 4462080Smckusick case O_REL48: 4472080Smckusick td = pop4(); 4482080Smckusick td1 = pop8(); 4492080Smckusick goto cmpdbl; 4502080Smckusick case O_REL82: 4512080Smckusick td = pop8(); 4522080Smckusick td1 = pop2(); 4532080Smckusick goto cmpdbl; 4542080Smckusick case O_REL84: 4552080Smckusick td = pop8(); 4562080Smckusick td1 = pop4(); 4572080Smckusick goto cmpdbl; 4582080Smckusick case O_REL8: 4592080Smckusick td = pop8(); 4602080Smckusick td1 = pop8(); 4612080Smckusick cmpdbl: 4622080Smckusick switch (*pc.cp++) { 4632080Smckusick case releq: 4642080Smckusick push2(td1 == td); 4652080Smckusick continue; 4662080Smckusick case relne: 4672080Smckusick push2(td1 != td); 4682080Smckusick continue; 4692080Smckusick case rellt: 4702080Smckusick push2(td1 < td); 4712080Smckusick continue; 4722080Smckusick case relgt: 4732080Smckusick push2(td1 > td); 4742080Smckusick continue; 4752080Smckusick case relle: 4762080Smckusick push2(td1 <= td); 4772080Smckusick continue; 4782080Smckusick case relge: 4792080Smckusick push2(td1 >= td); 4802080Smckusick continue; 4812080Smckusick default: 4825682Smckusic ERROR("Panic: bad relation %d to REL8*\n", 4835682Smckusic *(pc.cp - 1)); 4842080Smckusick continue; 4852080Smckusick } 4862080Smckusick case O_AND: 4872080Smckusick pc.cp++; 4882080Smckusick push2(pop2() & pop2()); 4892080Smckusick continue; 4902080Smckusick case O_OR: 4912080Smckusick pc.cp++; 4922080Smckusick push2(pop2() | pop2()); 4932080Smckusick continue; 4942080Smckusick case O_NOT: 4952080Smckusick pc.cp++; 4962080Smckusick push2(pop2() ^ 1); 4972080Smckusick continue; 4982080Smckusick case O_AS2: 4992080Smckusick pc.cp++; 5002080Smckusick tl = pop2(); 5012080Smckusick *(short *)popaddr() = tl; 5022080Smckusick continue; 5032080Smckusick case O_AS4: 5042080Smckusick pc.cp++; 5052080Smckusick tl = pop4(); 5062080Smckusick *(long *)popaddr() = tl; 5072080Smckusick continue; 5082080Smckusick case O_AS24: 5092080Smckusick pc.cp++; 5102080Smckusick tl = pop2(); 5112080Smckusick *(long *)popaddr() = tl; 5122080Smckusick continue; 5132080Smckusick case O_AS42: 5142080Smckusick pc.cp++; 5152080Smckusick tl = pop4(); 5162080Smckusick *(short *)popaddr() = tl; 5172080Smckusick continue; 5182080Smckusick case O_AS21: 5192080Smckusick pc.cp++; 5202080Smckusick tl = pop2(); 5212080Smckusick *popaddr() = tl; 5222080Smckusick continue; 5232080Smckusick case O_AS41: 5242080Smckusick pc.cp++; 5252080Smckusick tl = pop4(); 5262080Smckusick *popaddr() = tl; 5272080Smckusick continue; 5282080Smckusick case O_AS28: 5292080Smckusick pc.cp++; 5302080Smckusick tl = pop2(); 5312080Smckusick *(double *)popaddr() = tl; 5322080Smckusick continue; 5332080Smckusick case O_AS48: 5342080Smckusick pc.cp++; 5352080Smckusick tl = pop4(); 5362080Smckusick *(double *)popaddr() = tl; 5372080Smckusick continue; 5382080Smckusick case O_AS8: 5392080Smckusick pc.cp++; 5402239Smckusic t8 = popsze8(); 5412239Smckusic *(struct sze8 *)popaddr() = t8; 5422080Smckusick continue; 5432080Smckusick case O_AS: 5442080Smckusick tl = *pc.cp++; 5452080Smckusick if (tl == 0) 5462080Smckusick tl = *pc.usp++; 5472080Smckusick tl1 = (tl + 1) & ~1; 5482950Smckusic tcp = pushsp((long)(0)); 5492080Smckusick blkcpy(tl, tcp, *(char **)(tcp + tl1)); 5502080Smckusick popsp(tl1 + sizeof(char *)); 5512080Smckusick continue; 5522080Smckusick case O_INX2P2: 5532080Smckusick tl = *pc.cp++; /* tl has shift amount */ 5542080Smckusick tl1 = (pop2() - *pc.sp++) << tl; 5552080Smckusick pushaddr(popaddr() + tl1); 5562080Smckusick continue; 5572080Smckusick case O_INX4P2: 5582080Smckusick tl = *pc.cp++; /* tl has shift amount */ 5592080Smckusick tl1 = (pop4() - *pc.sp++) << tl; 5602080Smckusick pushaddr(popaddr() + tl1); 5612080Smckusick continue; 5622080Smckusick case O_INX2: 5632080Smckusick tl = *pc.cp++; /* tl has element size */ 5642080Smckusick if (tl == 0) 5652080Smckusick tl = *pc.usp++; 5662080Smckusick tl1 = pop2(); /* index */ 5672080Smckusick tl2 = *pc.sp++; 5682080Smckusick pushaddr(popaddr() + (tl1 - tl2) * tl); 5692191Smckusic tl = *pc.usp++; 5702191Smckusic if (_runtst) 5712191Smckusic SUBSC(tl1, tl2, tl); /* range check */ 5722080Smckusick continue; 5732080Smckusick case O_INX4: 5742080Smckusick tl = *pc.cp++; /* tl has element size */ 5752080Smckusick if (tl == 0) 5762080Smckusick tl = *pc.usp++; 5772080Smckusick tl1 = pop4(); /* index */ 5782080Smckusick tl2 = *pc.sp++; 5792080Smckusick pushaddr(popaddr() + (tl1 - tl2) * tl); 5802191Smckusic tl = *pc.usp++; 5812191Smckusic if (_runtst) 5822191Smckusic SUBSC(tl1, tl2, tl); /* range check */ 5832080Smckusick continue; 5842080Smckusick case O_OFF: 5852080Smckusick tl = *pc.cp++; 5862080Smckusick if (tl == 0) 5872080Smckusick tl = *pc.usp++; 5882950Smckusic pushaddr(popaddr() + tl); 5892080Smckusick continue; 5902080Smckusick case O_NIL: 5912080Smckusick pc.cp++; 5922080Smckusick NIL(); 5932080Smckusick continue; 5942080Smckusick case O_ADD2: 5952080Smckusick pc.cp++; 5962950Smckusic push4((long)(pop2() + pop2())); 5972080Smckusick continue; 5982080Smckusick case O_ADD4: 5992080Smckusick pc.cp++; 6002080Smckusick push4(pop4() + pop4()); 6012080Smckusick continue; 6022080Smckusick case O_ADD24: 6032080Smckusick pc.cp++; 6042080Smckusick tl = pop2(); 6052080Smckusick push4(pop4() + tl); 6062080Smckusick continue; 6072080Smckusick case O_ADD42: 6082080Smckusick pc.cp++; 6092080Smckusick tl = pop4(); 6102080Smckusick push4(pop2() + tl); 6112080Smckusick continue; 6122080Smckusick case O_ADD28: 6132080Smckusick pc.cp++; 6142080Smckusick tl = pop2(); 6152080Smckusick push8(pop8() + tl); 6162080Smckusick continue; 6172080Smckusick case O_ADD48: 6182080Smckusick pc.cp++; 6192080Smckusick tl = pop4(); 6202080Smckusick push8(pop8() + tl); 6212080Smckusick continue; 6222080Smckusick case O_ADD82: 6232080Smckusick pc.cp++; 6242080Smckusick td = pop8(); 6252080Smckusick push8(pop2() + td); 6262080Smckusick continue; 6272080Smckusick case O_ADD84: 6282080Smckusick pc.cp++; 6292080Smckusick td = pop8(); 6302080Smckusick push8(pop4() + td); 6312080Smckusick continue; 6322080Smckusick case O_SUB2: 6332080Smckusick pc.cp++; 6342080Smckusick tl = pop2(); 6352080Smckusick push4(pop2() - tl); 6362080Smckusick continue; 6372080Smckusick case O_SUB4: 6382080Smckusick pc.cp++; 6392080Smckusick tl = pop4(); 6402080Smckusick push4(pop4() - tl); 6412080Smckusick continue; 6422080Smckusick case O_SUB24: 6432080Smckusick pc.cp++; 6442080Smckusick tl = pop2(); 6452080Smckusick push4(pop4() - tl); 6462080Smckusick continue; 6472080Smckusick case O_SUB42: 6482080Smckusick pc.cp++; 6492080Smckusick tl = pop4(); 6502080Smckusick push4(pop2() - tl); 6512080Smckusick continue; 6522080Smckusick case O_SUB28: 6532080Smckusick pc.cp++; 6542080Smckusick tl = pop2(); 6552080Smckusick push8(pop8() - tl); 6562080Smckusick continue; 6572080Smckusick case O_SUB48: 6582080Smckusick pc.cp++; 6592080Smckusick tl = pop4(); 6602080Smckusick push8(pop8() - tl); 6612080Smckusick continue; 6622080Smckusick case O_SUB82: 6632080Smckusick pc.cp++; 6642080Smckusick td = pop8(); 6652080Smckusick push8(pop2() - td); 6662080Smckusick continue; 6672080Smckusick case O_SUB84: 6682080Smckusick pc.cp++; 6692080Smckusick td = pop8(); 6702080Smckusick push8(pop4() - td); 6712080Smckusick continue; 6722080Smckusick case O_MUL2: 6732080Smckusick pc.cp++; 6742950Smckusic push4((long)(pop2() * pop2())); 6752080Smckusick continue; 6762080Smckusick case O_MUL4: 6772080Smckusick pc.cp++; 6782080Smckusick push4(pop4() * pop4()); 6792080Smckusick continue; 6802080Smckusick case O_MUL24: 6812080Smckusick pc.cp++; 6822080Smckusick tl = pop2(); 6832080Smckusick push4(pop4() * tl); 6842080Smckusick continue; 6852080Smckusick case O_MUL42: 6862080Smckusick pc.cp++; 6872080Smckusick tl = pop4(); 6882080Smckusick push4(pop2() * tl); 6892080Smckusick continue; 6902080Smckusick case O_MUL28: 6912080Smckusick pc.cp++; 6922080Smckusick tl = pop2(); 6932080Smckusick push8(pop8() * tl); 6942080Smckusick continue; 6952080Smckusick case O_MUL48: 6962080Smckusick pc.cp++; 6972080Smckusick tl = pop4(); 6982080Smckusick push8(pop8() * tl); 6992080Smckusick continue; 7002080Smckusick case O_MUL82: 7012080Smckusick pc.cp++; 7022080Smckusick td = pop8(); 7032080Smckusick push8(pop2() * td); 7042080Smckusick continue; 7052080Smckusick case O_MUL84: 7062080Smckusick pc.cp++; 7072080Smckusick td = pop8(); 7082080Smckusick push8(pop4() * td); 7092080Smckusick continue; 7102080Smckusick case O_ABS2: 7112080Smckusick case O_ABS4: 7122080Smckusick pc.cp++; 7132080Smckusick tl = pop4(); 7142080Smckusick push4(tl >= 0 ? tl : -tl); 7152080Smckusick continue; 7162080Smckusick case O_ABS8: 7172080Smckusick pc.cp++; 7182080Smckusick td = pop8(); 7192080Smckusick push8(td >= 0.0 ? td : -td); 7202080Smckusick continue; 7212080Smckusick case O_NEG2: 7222080Smckusick pc.cp++; 7232950Smckusic push4((long)(-pop2())); 7242080Smckusick continue; 7252080Smckusick case O_NEG4: 7262080Smckusick pc.cp++; 7272080Smckusick push4(-pop4()); 7282080Smckusick continue; 7292080Smckusick case O_NEG8: 7302080Smckusick pc.cp++; 7312080Smckusick push8(-pop8()); 7322080Smckusick continue; 7332080Smckusick case O_DIV2: 7342080Smckusick pc.cp++; 7352080Smckusick tl = pop2(); 7362080Smckusick push4(pop2() / tl); 7372080Smckusick continue; 7382080Smckusick case O_DIV4: 7392080Smckusick pc.cp++; 7402080Smckusick tl = pop4(); 7412080Smckusick push4(pop4() / tl); 7422080Smckusick continue; 7432080Smckusick case O_DIV24: 7442080Smckusick pc.cp++; 7452080Smckusick tl = pop2(); 7462080Smckusick push4(pop4() / tl); 7472080Smckusick continue; 7482080Smckusick case O_DIV42: 7492080Smckusick pc.cp++; 7502080Smckusick tl = pop4(); 7512080Smckusick push4(pop2() / tl); 7522080Smckusick continue; 7532080Smckusick case O_MOD2: 7542080Smckusick pc.cp++; 7552080Smckusick tl = pop2(); 7562080Smckusick push4(pop2() % tl); 7572080Smckusick continue; 7582080Smckusick case O_MOD4: 7592080Smckusick pc.cp++; 7602080Smckusick tl = pop4(); 7612080Smckusick push4(pop4() % tl); 7622080Smckusick continue; 7632080Smckusick case O_MOD24: 7642080Smckusick pc.cp++; 7652080Smckusick tl = pop2(); 7662080Smckusick push4(pop4() % tl); 7672080Smckusick continue; 7682080Smckusick case O_MOD42: 7692080Smckusick pc.cp++; 7702080Smckusick tl = pop4(); 7712080Smckusick push4(pop2() % tl); 7722080Smckusick continue; 7732080Smckusick case O_ADD8: 7742080Smckusick pc.cp++; 7752080Smckusick push8(pop8() + pop8()); 7762080Smckusick continue; 7772080Smckusick case O_SUB8: 7782080Smckusick pc.cp++; 7792080Smckusick td = pop8(); 7802080Smckusick push8(pop8() - td); 7812080Smckusick continue; 7822080Smckusick case O_MUL8: 7832080Smckusick pc.cp++; 7842080Smckusick push8(pop8() * pop8()); 7852080Smckusick continue; 7862080Smckusick case O_DVD8: 7872080Smckusick pc.cp++; 7882080Smckusick td = pop8(); 7892080Smckusick push8(pop8() / td); 7902080Smckusick continue; 7912080Smckusick case O_STOI: 7922080Smckusick pc.cp++; 7932950Smckusic push4((long)(pop2())); 7942080Smckusick continue; 7952080Smckusick case O_STOD: 7962080Smckusick pc.cp++; 7972080Smckusick td = pop2(); 7982080Smckusick push8(td); 7992080Smckusick continue; 8002080Smckusick case O_ITOD: 8012080Smckusick pc.cp++; 8022080Smckusick td = pop4(); 8032080Smckusick push8(td); 8042080Smckusick continue; 8052080Smckusick case O_ITOS: 8062080Smckusick pc.cp++; 8072950Smckusic push2((short)(pop4())); 8082080Smckusick continue; 8092080Smckusick case O_DVD2: 8102080Smckusick pc.cp++; 8112080Smckusick td = pop2(); 8122080Smckusick push8(pop2() / td); 8132080Smckusick continue; 8142080Smckusick case O_DVD4: 8152080Smckusick pc.cp++; 8162080Smckusick td = pop4(); 8172080Smckusick push8(pop4() / td); 8182080Smckusick continue; 8192080Smckusick case O_DVD24: 8202080Smckusick pc.cp++; 8212080Smckusick td = pop2(); 8222080Smckusick push8(pop4() / td); 8232080Smckusick continue; 8242080Smckusick case O_DVD42: 8252080Smckusick pc.cp++; 8262080Smckusick td = pop4(); 8272080Smckusick push8(pop2() / td); 8282080Smckusick continue; 8292080Smckusick case O_DVD28: 8302080Smckusick pc.cp++; 8312080Smckusick td = pop2(); 8322080Smckusick push8(pop8() / td); 8332080Smckusick continue; 8342080Smckusick case O_DVD48: 8352080Smckusick pc.cp++; 8362080Smckusick td = pop4(); 8372080Smckusick push8(pop8() / td); 8382080Smckusick continue; 8392080Smckusick case O_DVD82: 8402080Smckusick pc.cp++; 8412080Smckusick td = pop8(); 8422080Smckusick push8(pop2() / td); 8432080Smckusick continue; 8442080Smckusick case O_DVD84: 8452080Smckusick pc.cp++; 8462080Smckusick td = pop8(); 8472080Smckusick push8(pop4() / td); 8482080Smckusick continue; 8492080Smckusick case O_RV1: 8502109Smckusic tcp = _display.raw[*pc.ucp++]; 8512950Smckusic push2((short)(*(tcp + *pc.sp++))); 8522080Smckusick continue; 8532080Smckusick case O_RV14: 8542109Smckusic tcp = _display.raw[*pc.ucp++]; 8552950Smckusic push4((long)(*(tcp + *pc.sp++))); 8562080Smckusick continue; 8572080Smckusick case O_RV2: 8582109Smckusic tcp = _display.raw[*pc.ucp++]; 8592080Smckusick push2(*(short *)(tcp + *pc.sp++)); 8602080Smckusick continue; 8612080Smckusick case O_RV24: 8622109Smckusic tcp = _display.raw[*pc.ucp++]; 8632950Smckusic push4((long)(*(short *)(tcp + *pc.sp++))); 8642080Smckusick continue; 8652080Smckusick case O_RV4: 8662109Smckusic tcp = _display.raw[*pc.ucp++]; 8672080Smckusick push4(*(long *)(tcp + *pc.sp++)); 8682080Smckusick continue; 8692080Smckusick case O_RV8: 8702109Smckusic tcp = _display.raw[*pc.ucp++]; 8712239Smckusic pushsze8(*(struct sze8 *)(tcp + *pc.sp++)); 8722080Smckusick continue; 8732080Smckusick case O_RV: 8742109Smckusic tcp = _display.raw[*pc.ucp++]; 8752080Smckusick tcp += *pc.sp++; 8762080Smckusick tl = *pc.usp++; 8772338Smckusic tcp1 = pushsp((tl + 1) & ~1); 8782080Smckusick blkcpy(tl, tcp, tcp1); 8792080Smckusick continue; 8802080Smckusick case O_LV: 8812109Smckusic tcp = _display.raw[*pc.ucp++]; 8822080Smckusick pushaddr(tcp + *pc.sp++); 8832080Smckusick continue; 8842080Smckusick case O_LRV1: 8852109Smckusic tcp = _display.raw[*pc.ucp++]; 8862950Smckusic push2((short)(*(tcp + *pc.lp++))); 8872080Smckusick continue; 8882080Smckusick case O_LRV14: 8892109Smckusic tcp = _display.raw[*pc.ucp++]; 8902950Smckusic push4((long)(*(tcp + *pc.lp++))); 8912080Smckusick continue; 8922080Smckusick case O_LRV2: 8932109Smckusic tcp = _display.raw[*pc.ucp++]; 8942080Smckusick push2(*(short *)(tcp + *pc.lp++)); 8952080Smckusick continue; 8962080Smckusick case O_LRV24: 8972109Smckusic tcp = _display.raw[*pc.ucp++]; 8982950Smckusic push4((long)(*(short *)(tcp + *pc.lp++))); 8992080Smckusick continue; 9002080Smckusick case O_LRV4: 9012109Smckusic tcp = _display.raw[*pc.ucp++]; 9022080Smckusick push4(*(long *)(tcp + *pc.lp++)); 9032080Smckusick continue; 9042080Smckusick case O_LRV8: 9052109Smckusic tcp = _display.raw[*pc.ucp++]; 9062239Smckusic pushsze8(*(struct sze8 *)(tcp + *pc.lp++)); 9072080Smckusick continue; 9082080Smckusick case O_LRV: 9092109Smckusic tcp = _display.raw[*pc.ucp++]; 9102950Smckusic tcp += (int)*pc.lp++; 9112080Smckusick tl = *pc.usp++; 9122950Smckusic tcp1 = pushsp((tl + 1) & ~1); 9132080Smckusick blkcpy(tl, tcp, tcp1); 9142080Smckusick continue; 9152080Smckusick case O_LLV: 9162109Smckusic tcp = _display.raw[*pc.ucp++]; 9172080Smckusick pushaddr(tcp + *pc.lp++); 9182080Smckusick continue; 9192080Smckusick case O_IND1: 9202080Smckusick pc.cp++; 9212950Smckusic push2((short)(*popaddr())); 9222080Smckusick continue; 9232080Smckusick case O_IND14: 9242080Smckusick pc.cp++; 9252950Smckusic push4((long)(*popaddr())); 9262080Smckusick continue; 9272080Smckusick case O_IND2: 9282080Smckusick pc.cp++; 9292080Smckusick push2(*(short *)(popaddr())); 9302080Smckusick continue; 9312080Smckusick case O_IND24: 9322080Smckusick pc.cp++; 9332950Smckusic push4((long)(*(short *)(popaddr()))); 9342080Smckusick continue; 9352080Smckusick case O_IND4: 9362080Smckusick pc.cp++; 9372080Smckusick push4(*(long *)(popaddr())); 9382080Smckusick continue; 9392080Smckusick case O_IND8: 9402080Smckusick pc.cp++; 9412239Smckusic pushsze8(*(struct sze8 *)(popaddr())); 9422080Smckusick continue; 9432080Smckusick case O_IND: 9442080Smckusick tl = *pc.cp++; 9452080Smckusick if (tl == 0) 9462080Smckusick tl = *pc.usp++; 9472080Smckusick tcp = popaddr(); 9482080Smckusick tcp1 = pushsp((tl + 1) & ~1); 9492080Smckusick blkcpy(tl, tcp, tcp1); 9502080Smckusick continue; 9512080Smckusick case O_CON1: 9522950Smckusic push2((short)(*pc.cp++)); 9532080Smckusick continue; 9542080Smckusick case O_CON14: 9552950Smckusic push4((long)(*pc.cp++)); 9562080Smckusick continue; 9572080Smckusick case O_CON2: 9582080Smckusick pc.cp++; 9592080Smckusick push2(*pc.sp++); 9602080Smckusick continue; 9612080Smckusick case O_CON24: 9622080Smckusick pc.cp++; 9632950Smckusic push4((long)(*pc.sp++)); 9642080Smckusick continue; 9652080Smckusick case O_CON4: 9662080Smckusick pc.cp++; 9672080Smckusick push4(*pc.lp++); 9682080Smckusick continue; 9692080Smckusick case O_CON8: 9702080Smckusick pc.cp++; 9712950Smckusic push8(*pc.dbp++); 9722080Smckusick continue; 9732080Smckusick case O_CON: 9742080Smckusick tl = *pc.cp++; 9752080Smckusick if (tl == 0) 9762080Smckusick tl = *pc.usp++; 9772080Smckusick tl = (tl + 1) & ~1; 9782080Smckusick tcp = pushsp(tl); 9792080Smckusick blkcpy(tl, pc.cp, tcp); 9802950Smckusic pc.cp += (int)tl; 9812080Smckusick continue; 9822950Smckusic case O_CONG: 9832950Smckusic tl = *pc.cp++; 9842950Smckusic if (tl == 0) 9852950Smckusic tl = *pc.usp++; 9862950Smckusic tl1 = (tl + 1) & ~1; 9872950Smckusic tcp = pushsp(tl1); 9882950Smckusic blkcpy(tl1, pc.cp, tcp); 9892950Smckusic pc.cp += (int)((tl + 2) & ~1); 9902950Smckusic continue; 9912080Smckusick case O_LVCON: 9922080Smckusick tl = *pc.cp++; 9932080Smckusick if (tl == 0) 9942080Smckusick tl = *pc.usp++; 9952080Smckusick tl = (tl + 1) & ~1; 9962080Smckusick pushaddr(pc.cp); 9972950Smckusic pc.cp += (int)tl; 9982080Smckusick continue; 9992080Smckusick case O_RANG2: 10002080Smckusick tl = *pc.cp++; 10012080Smckusick if (tl == 0) 10022080Smckusick tl = *pc.sp++; 10032080Smckusick tl1 = pop2(); 10044026Smckusic push2((short)(RANG4(tl1, tl, (long)(*pc.sp++)))); 10052080Smckusick continue; 10062080Smckusick case O_RANG42: 10072080Smckusick tl = *pc.cp++; 10082080Smckusick if (tl == 0) 10092080Smckusick tl = *pc.sp++; 10102080Smckusick tl1 = pop4(); 10114026Smckusic push4(RANG4(tl1, tl, (long)(*pc.sp++))); 10122080Smckusick continue; 10132080Smckusick case O_RSNG2: 10142080Smckusick tl = *pc.cp++; 10152080Smckusick if (tl == 0) 10162080Smckusick tl = *pc.sp++; 10172080Smckusick tl1 = pop2(); 10182950Smckusic push2((short)(RSNG4(tl1, tl))); 10192080Smckusick continue; 10202080Smckusick case O_RSNG42: 10212080Smckusick tl = *pc.cp++; 10222080Smckusick if (tl == 0) 10232080Smckusick tl = *pc.sp++; 10242080Smckusick tl1 = pop4(); 10252080Smckusick push4(RSNG4(tl1, tl)); 10262080Smckusick continue; 10272080Smckusick case O_RANG4: 10284026Smckusic tl = *pc.cp++; 10294026Smckusic if (tl == 0) 10304026Smckusic tl = *pc.lp++; 10312080Smckusick tl1 = pop4(); 10322080Smckusick push4(RANG4(tl1, tl, *pc.lp++)); 10332080Smckusick continue; 10342080Smckusick case O_RANG24: 10354026Smckusic tl = *pc.cp++; 10364026Smckusic if (tl == 0) 10374026Smckusic tl = *pc.lp++; 10382080Smckusick tl1 = pop2(); 10392950Smckusic push2((short)(RANG4(tl1, tl, *pc.lp++))); 10402080Smckusick continue; 10412080Smckusick case O_RSNG4: 10424026Smckusic tl = *pc.cp++; 10434026Smckusic if (tl == 0) 10444026Smckusic tl = *pc.lp++; 10454026Smckusic tl1 = pop4(); 10464026Smckusic push4(RSNG4(tl1, tl)); 10472080Smckusick continue; 10482080Smckusick case O_RSNG24: 10494026Smckusic tl = *pc.cp++; 10504026Smckusic if (tl == 0) 10514026Smckusic tl = *pc.lp++; 10524026Smckusic tl1 = pop2(); 10534026Smckusic push2((short)(RSNG4(tl1, tl))); 10542080Smckusick continue; 10552080Smckusick case O_STLIM: 10562080Smckusick pc.cp++; 10572121Smckusic STLIM(); 10582950Smckusic popsp((long)(sizeof(long))); 10592080Smckusick continue; 10602080Smckusick case O_LLIMIT: 10612080Smckusick pc.cp++; 10622080Smckusick LLIMIT(); 10632950Smckusic popsp((long)(sizeof(char *)+sizeof(long))); 10642080Smckusick continue; 10652080Smckusick case O_BUFF: 10662950Smckusic BUFF((long)(*pc.cp++)); 10672080Smckusick continue; 10682080Smckusick case O_HALT: 10692080Smckusick pc.cp++; 10705682Smckusic if (_nodump == TRUE) 10715682Smckusic psexit(0); 10725682Smckusic fputs("\nCall to procedure halt\n", stderr); 10735682Smckusic backtrace("Halted"); 10745682Smckusic psexit(0); 10752080Smckusick continue; 10762080Smckusick case O_PXPBUF: 10772080Smckusick pc.cp++; 10782080Smckusick _cntrs = *pc.lp++; 10792080Smckusick _rtns = *pc.lp++; 10802950Smckusic NEWZ(&_pcpcount, (_cntrs + 1) * sizeof(long)); 10812080Smckusick continue; 10822080Smckusick case O_COUNT: 10832080Smckusick pc.cp++; 10842080Smckusick _pcpcount[*pc.usp++]++; 10852080Smckusick continue; 10862080Smckusick case O_CASE1OP: 10872080Smckusick tl = *pc.cp++; /* tl = number of cases */ 10882080Smckusick if (tl == 0) 10892080Smckusick tl = *pc.usp++; 10902080Smckusick tsp = pc.sp + tl; /* ptr to end of jump table */ 10912080Smckusick tcp = (char *)tsp; /* tcp = ptr to case values */ 10922080Smckusick tl1 = pop2(); /* tl1 = element to find */ 10932080Smckusick for(; tl > 0; tl--) /* look for element */ 10942080Smckusick if (tl1 == *tcp++) 10952080Smckusick break; 10962080Smckusick if (tl == 0) /* default case => error */ 10975666Smckusic CASERNG(tl1); 10982080Smckusick pc.cp += *(tsp - tl); 10992080Smckusick continue; 11002080Smckusick case O_CASE2OP: 11012080Smckusick tl = *pc.cp++; /* tl = number of cases */ 11022080Smckusick if (tl == 0) 11032080Smckusick tl = *pc.usp++; 11042080Smckusick tsp = pc.sp + tl; /* ptr to end of jump table */ 11052080Smckusick tsp1 = tsp; /* tsp1 = ptr to case values */ 11062080Smckusick tl1 = (unsigned short)pop2();/* tl1 = element to find */ 11072080Smckusick for(; tl > 0; tl--) /* look for element */ 11082080Smckusick if (tl1 == *tsp1++) 11092080Smckusick break; 11102080Smckusick if (tl == 0) /* default case => error */ 11115666Smckusic CASERNG(tl1); 11122080Smckusick pc.cp += *(tsp - tl); 11132080Smckusick continue; 11142080Smckusick case O_CASE4OP: 11152080Smckusick tl = *pc.cp++; /* tl = number of cases */ 11162080Smckusick if (tl == 0) 11172080Smckusick tl = *pc.usp++; 11182080Smckusick tsp = pc.sp + tl; /* ptr to end of jump table */ 11192080Smckusick tlp = (long *)tsp; /* tlp = ptr to case values */ 11202080Smckusick tl1 = pop4(); /* tl1 = element to find */ 11212080Smckusick for(; tl > 0; tl--) /* look for element */ 11222080Smckusick if (tl1 == *tlp++) 11232080Smckusick break; 11242080Smckusick if (tl == 0) /* default case => error */ 11255666Smckusic CASERNG(tl1); 11262080Smckusick pc.cp += *(tsp - tl); 11272080Smckusick continue; 11282080Smckusick case O_ADDT: 11292080Smckusick tl = *pc.cp++; /* tl has comparison length */ 11302080Smckusick if (tl == 0) 11312080Smckusick tl = *pc.usp++; 11322950Smckusic tcp = pushsp((long)(0));/* tcp pts to first arg */ 11332080Smckusick ADDT(tcp + tl, tcp + tl, tcp, tl >> 2); 11342080Smckusick popsp(tl); 11352080Smckusick continue; 11362080Smckusick case O_SUBT: 11372080Smckusick tl = *pc.cp++; /* tl has comparison length */ 11382080Smckusick if (tl == 0) 11392080Smckusick tl = *pc.usp++; 11402950Smckusic tcp = pushsp((long)(0));/* tcp pts to first arg */ 11412080Smckusick SUBT(tcp + tl, tcp + tl, tcp, tl >> 2); 11422080Smckusick popsp(tl); 11432080Smckusick continue; 11442080Smckusick case O_MULT: 11452080Smckusick tl = *pc.cp++; /* tl has comparison length */ 11462080Smckusick if (tl == 0) 11472080Smckusick tl = *pc.usp++; 11482950Smckusic tcp = pushsp((long)(0));/* tcp pts to first arg */ 11492080Smckusick MULT(tcp + tl, tcp + tl, tcp, tl >> 2); 11502080Smckusick popsp(tl); 11512080Smckusick continue; 11522080Smckusick case O_INCT: 11532080Smckusick tl = *pc.cp++; /* tl has number of args */ 11542080Smckusick if (tl == 0) 11552080Smckusick tl = *pc.usp++; 11562950Smckusic tb = INCT(); 11572950Smckusic popsp(tl*sizeof(long)); 11582950Smckusic push2((short)(tb)); 11592080Smckusick continue; 11602080Smckusick case O_CTTOT: 11612080Smckusick tl = *pc.cp++; /* tl has number of args */ 11622080Smckusick if (tl == 0) 11632080Smckusick tl = *pc.usp++; 11642080Smckusick tl1 = tl * sizeof(long); 11652950Smckusic tcp = pushsp((long)(0)) + tl1; /* tcp pts to result */ 11662080Smckusick CTTOT(tcp); 11672950Smckusic popsp(tl*sizeof(long)); 11682080Smckusick continue; 11692080Smckusick case O_CARD: 11702080Smckusick tl = *pc.cp++; /* tl has comparison length */ 11712080Smckusick if (tl == 0) 11722080Smckusick tl = *pc.usp++; 11732950Smckusic tcp = pushsp((long)(0));/* tcp pts to set */ 11742080Smckusick tl1 = CARD(tcp, tl); 11752080Smckusick popsp(tl); 11762950Smckusic push2((short)(tl1)); 11772080Smckusick continue; 11782080Smckusick case O_IN: 11792080Smckusick tl = *pc.cp++; /* tl has comparison length */ 11802080Smckusick if (tl == 0) 11812080Smckusick tl = *pc.usp++; 11822080Smckusick tl1 = pop4(); /* tl1 is the element */ 11832950Smckusic tcp = pushsp((long)(0));/* tcp pts to set */ 11844026Smckusic tl2 = *pc.sp++; /* lower bound */ 11852950Smckusic tb = IN(tl1, tl2, (long)(*pc.usp++), tcp); 11862080Smckusick popsp(tl); 11872950Smckusic push2((short)(tb)); 11882080Smckusick continue; 11892080Smckusick case O_ASRT: 11902080Smckusick pc.cp++; 11912950Smckusic ts = pop2(); 11922950Smckusic ASRT(ts, ""); 11932080Smckusick continue; 11942080Smckusick case O_FOR1U: 11954026Smckusic /* 11964026Smckusic * with the shadowing of for loop variables 11974026Smckusic * the variable is always sizeof(long) hence 11984026Smckusic * nullifying the need for shorter length 11994026Smckusic * assignments 12004026Smckusic */ 12012080Smckusick case O_FOR2U: 12024026Smckusic tl1 = *pc.cp++; /* tl1 index lower bound */ 12034026Smckusic if (tl1 == 0) 12044026Smckusic tl1 = *pc.sp++; 12054026Smckusic tlp = (long *)popaddr(); /* tlp = ptr to index var */ 12064026Smckusic if (*tlp < pop4()) { /* still going up */ 12074026Smckusic tl = *tlp + 1; /* inc index var */ 12082191Smckusic tl2 = *pc.sp++; /* index upper bound */ 12092191Smckusic if (_runtst) 12102191Smckusic RANG4(tl, tl1, tl2); 12114026Smckusic *tlp = tl; /* update index var */ 12122080Smckusick pc.cp += *pc.sp;/* return to top of loop */ 12132080Smckusick continue; 12142080Smckusick } 12154026Smckusic pc.sp += 2; /* else fall through */ 12162080Smckusick continue; 12172080Smckusick case O_FOR4U: 12184026Smckusic tl1 = *pc.cp++; /* tl1 index lower bound */ 12194026Smckusic if (tl1 == 0) 12204026Smckusic tl1 = *pc.lp++; 12212950Smckusic tlp = (long *)popaddr(); /* tlp = ptr to index var */ 12222080Smckusick if (*tlp < pop4()) { /* still going up */ 12232191Smckusic tl = *tlp + 1; /* inc index var */ 12242191Smckusic tl2 = *pc.lp++; /* index upper bound */ 12252191Smckusic if (_runtst) 12262191Smckusic RANG4(tl, tl1, tl2); 12272191Smckusic *tlp = tl; /* update index var */ 12282080Smckusick pc.cp += *pc.sp;/* return to top of loop */ 12292080Smckusick continue; 12302080Smckusick } 12314026Smckusic pc.sp += 3; /* else fall through */ 12322080Smckusick continue; 12332080Smckusick case O_FOR1D: 12344026Smckusic /* 12354026Smckusic * with the shadowing of for loop variables 12364026Smckusic * the variable is always sizeof(long) hence 12374026Smckusic * nullifying the need for shorter length 12384026Smckusic * assignments 12394026Smckusic */ 12402080Smckusick case O_FOR2D: 12414026Smckusic tl1 = *pc.cp++; /* tl1 index lower bound */ 12424026Smckusic if (tl1 == 0) 12434026Smckusic tl1 = *pc.sp++; 12444026Smckusic tlp = (long *)popaddr(); /* tlp = ptr to index var */ 12454026Smckusic if (*tlp > pop4()) { /* still going down */ 12464026Smckusic tl = *tlp - 1; /* inc index var */ 12472191Smckusic tl2 = *pc.sp++; /* index upper bound */ 12482191Smckusic if (_runtst) 12492191Smckusic RANG4(tl, tl1, tl2); 12504026Smckusic *tlp = tl; /* update index var */ 12512080Smckusick pc.cp += *pc.sp;/* return to top of loop */ 12522080Smckusick continue; 12532080Smckusick } 12544026Smckusic pc.sp += 2; /* else fall through */ 12552080Smckusick continue; 12562080Smckusick case O_FOR4D: 12574026Smckusic tl1 = *pc.cp++; /* tl1 index lower bound */ 12584026Smckusic if (tl1 == 0) 12594026Smckusic tl1 = *pc.lp++; 12602950Smckusic tlp = (long *)popaddr(); /* tlp = ptr to index var */ 12612080Smckusick if (*tlp > pop4()) { /* still going down */ 12622191Smckusic tl = *tlp - 1; /* inc index var */ 12632191Smckusic tl2 = *pc.lp++; /* index upper bound */ 12642191Smckusic if (_runtst) 12652191Smckusic RANG4(tl, tl1, tl2); 12662191Smckusic *tlp = tl; /* update index var */ 12672080Smckusick pc.cp += *pc.sp;/* return to top of loop */ 12682080Smckusick continue; 12692080Smckusick } 12704026Smckusic pc.sp += 3; /* else fall through */ 12712080Smckusick continue; 12722080Smckusick case O_READE: 12732080Smckusick pc.cp++; 12742950Smckusic push2((short)(READE(curfile, base + *pc.lp++))); 12752080Smckusick continue; 12762080Smckusick case O_READ4: 12772080Smckusick pc.cp++; 12782080Smckusick push4(READ4(curfile)); 12792080Smckusick continue; 12802080Smckusick case O_READC: 12812080Smckusick pc.cp++; 12822950Smckusic push2((short)(READC(curfile))); 12832080Smckusick continue; 12842080Smckusick case O_READ8: 12852080Smckusick pc.cp++; 12862080Smckusick push8(READ8(curfile)); 12872080Smckusick continue; 12882080Smckusick case O_READLN: 12892080Smckusick pc.cp++; 12902080Smckusick READLN(curfile); 12912080Smckusick continue; 12922080Smckusick case O_EOF: 12932080Smckusick pc.cp++; 12942950Smckusic push2((short)(TEOF(popaddr()))); 12952080Smckusick continue; 12962080Smckusick case O_EOLN: 12972080Smckusick pc.cp++; 12982950Smckusic push2((short)(TEOLN(popaddr()))); 12992080Smckusick continue; 13002080Smckusick case O_WRITEC: 13012191Smckusic if (_runtst) { 13022191Smckusic WRITEC(curfile); 13033166Smckusic popsp((long)(*pc.cp++)); 13042191Smckusic continue; 13052191Smckusic } 13062191Smckusic fputc(); 13073166Smckusic popsp((long)(*pc.cp++)); 13082080Smckusick continue; 13092080Smckusick case O_WRITES: 13102191Smckusic if (_runtst) { 13112191Smckusic WRITES(curfile); 13123166Smckusic popsp((long)(*pc.cp++)); 13132191Smckusic continue; 13142191Smckusic } 13152191Smckusic fwrite(); 13163166Smckusic popsp((long)(*pc.cp++)); 13172080Smckusick continue; 13182080Smckusick case O_WRITEF: 13192191Smckusic if (_runtst) { 13202191Smckusic WRITEF(curfile); 13213166Smckusic popsp((long)(*pc.cp++)); 13222191Smckusic continue; 13232191Smckusic } 13242191Smckusic fprintf(); 13253166Smckusic popsp((long)(*pc.cp++)); 13262080Smckusick continue; 13272080Smckusick case O_WRITLN: 13282080Smckusick pc.cp++; 13292191Smckusic if (_runtst) { 13302191Smckusic WRITLN(curfile); 13312191Smckusic continue; 13322191Smckusic } 13332191Smckusic fputc('\n', ACTFILE(curfile)); 13342080Smckusick continue; 13352080Smckusick case O_PAGE: 13362080Smckusick pc.cp++; 13372191Smckusic if (_runtst) { 13382191Smckusic PAGE(curfile); 13392191Smckusic continue; 13402191Smckusic } 13412950Smckusic fputc('', ACTFILE(curfile)); 13422080Smckusick continue; 13432080Smckusick case O_NAM: 13442080Smckusick pc.cp++; 13452080Smckusick tl = pop4(); 13462080Smckusick pushaddr(NAM(tl, base + *pc.lp++)); 13472080Smckusick continue; 13482080Smckusick case O_MAX: 13492080Smckusick tl = *pc.cp++; 13502080Smckusick if (tl == 0) 13512080Smckusick tl = *pc.usp++; 13522080Smckusick tl1 = pop4(); 13532191Smckusic if (_runtst) { 13542950Smckusic push4(MAX(tl1, tl, (long)(*pc.usp++))); 13552191Smckusic continue; 13562191Smckusic } 13572191Smckusic tl1 -= tl; 13582191Smckusic tl = *pc.usp++; 13592191Smckusic push4(tl1 > tl ? tl1 : tl); 13602080Smckusick continue; 13612080Smckusick case O_MIN: 13622080Smckusick tl = *pc.cp++; 13632080Smckusick if (tl == 0) 13642080Smckusick tl = *pc.usp++; 13652080Smckusick tl1 = pop4(); 13662080Smckusick push4(tl1 < tl ? tl1 : tl); 13672080Smckusick continue; 13682080Smckusick case O_UNIT: 13692080Smckusick pc.cp++; 13702080Smckusick curfile = UNIT(popaddr()); 13712080Smckusick continue; 13722080Smckusick case O_UNITINP: 13732080Smckusick pc.cp++; 13742080Smckusick curfile = INPUT; 13752080Smckusick continue; 13762080Smckusick case O_UNITOUT: 13772080Smckusick pc.cp++; 13782080Smckusick curfile = OUTPUT; 13792080Smckusick continue; 13802080Smckusick case O_MESSAGE: 13812080Smckusick pc.cp++; 13822080Smckusick PFLUSH(); 13832080Smckusick curfile = ERR; 13842080Smckusick continue; 13852109Smckusic case O_PUT: 13862109Smckusic pc.cp++; 13872109Smckusic PUT(curfile); 13882109Smckusic continue; 13892080Smckusick case O_GET: 13902080Smckusick pc.cp++; 13912080Smckusick GET(curfile); 13922080Smckusick continue; 13932080Smckusick case O_FNIL: 13942080Smckusick pc.cp++; 13952080Smckusick pushaddr(FNIL(popaddr())); 13962080Smckusick continue; 13972080Smckusick case O_DEFNAME: 13982080Smckusick pc.cp++; 13992080Smckusick DEFNAME(); 14002950Smckusic popsp((long)(2*sizeof(char *)+2*sizeof(long))); 14012080Smckusick continue; 14022080Smckusick case O_RESET: 14032080Smckusick pc.cp++; 14042080Smckusick RESET(); 14052950Smckusic popsp((long)(2*sizeof(char *)+2*sizeof(long))); 14062080Smckusick continue; 14072080Smckusick case O_REWRITE: 14082080Smckusick pc.cp++; 14092080Smckusick REWRITE(); 14102950Smckusic popsp((long)(2*sizeof(char *)+2*sizeof(long))); 14112080Smckusick continue; 14122080Smckusick case O_FILE: 14132080Smckusick pc.cp++; 14142080Smckusick pushaddr(ACTFILE(curfile)); 14152080Smckusick continue; 14162080Smckusick case O_REMOVE: 14172080Smckusick pc.cp++; 14182080Smckusick REMOVE(); 14192950Smckusic popsp((long)(sizeof(char *)+sizeof(long))); 14202080Smckusick continue; 14212080Smckusick case O_FLUSH: 14222080Smckusick pc.cp++; 14232080Smckusick FLUSH(); 14242950Smckusic popsp((long)(sizeof(char *))); 14252080Smckusick continue; 14262080Smckusick case O_PACK: 14272080Smckusick pc.cp++; 14282080Smckusick PACK(); 14292950Smckusic popsp((long)(5*sizeof(long)+2*sizeof(char*))); 14302080Smckusick continue; 14312080Smckusick case O_UNPACK: 14322080Smckusick pc.cp++; 14332080Smckusick UNPACK(); 14342950Smckusic popsp((long)(5*sizeof(long)+2*sizeof(char*))); 14352080Smckusick continue; 14362080Smckusick case O_ARGC: 14372080Smckusick pc.cp++; 14382950Smckusic push4((long)_argc); 14392080Smckusick continue; 14402080Smckusick case O_ARGV: 14412080Smckusick tl = *pc.cp++; /* tl = size of char array */ 14422080Smckusick if (tl == 0) 14432080Smckusick tl = *pc.usp++; 14442080Smckusick tcp = popaddr(); /* tcp = addr of char array */ 14452080Smckusick tl1 = pop4(); /* tl1 = argv subscript */ 14462080Smckusick ARGV(tl1, tcp, tl); 14472080Smckusick continue; 14482080Smckusick case O_CLCK: 14492080Smckusick pc.cp++; 14502080Smckusick push4(CLCK()); 14512080Smckusick continue; 14522080Smckusick case O_WCLCK: 14532080Smckusick pc.cp++; 14542080Smckusick push4(time(0)); 14552080Smckusick continue; 14562080Smckusick case O_SCLCK: 14572080Smckusick pc.cp++; 14582080Smckusick push4(SCLCK()); 14592080Smckusick continue; 14602080Smckusick case O_DISPOSE: 14612080Smckusick tl = *pc.cp++; /* tl = size being disposed */ 14622080Smckusick if (tl == 0) 14632080Smckusick tl = *pc.usp++; 14642080Smckusick tcp = popaddr(); /* ptr to ptr being disposed */ 14652080Smckusick DISPOSE(tcp, tl); 14662080Smckusick *(char **)tcp = (char *)0; 14672080Smckusick continue; 14682080Smckusick case O_NEW: 14692080Smckusick tl = *pc.cp++; /* tl = size being new'ed */ 14702080Smckusick if (tl == 0) 14712080Smckusick tl = *pc.usp++; 14722080Smckusick tcp = popaddr(); /* ptr to ptr being new'ed */ 14732191Smckusic if (_runtst) { 14742191Smckusic NEWZ(tcp, tl); 14752191Smckusic continue; 14762191Smckusic } 14772191Smckusic NEW(tcp, tl); 14782080Smckusick continue; 14792080Smckusick case O_DATE: 14802080Smckusick pc.cp++; 14812080Smckusick DATE(popaddr()); 14822080Smckusick continue; 14832080Smckusick case O_TIME: 14842080Smckusick pc.cp++; 14852080Smckusick TIME(popaddr()); 14862080Smckusick continue; 14872080Smckusick case O_UNDEF: 14882080Smckusick pc.cp++; 14892080Smckusick pop8(); 14902950Smckusic push2((short)(0)); 14912080Smckusick continue; 14922080Smckusick case O_ATAN: 14932080Smckusick pc.cp++; 1494*5723Smckusic if (_runtst) { 1495*5723Smckusic push8(ATAN(pop8())); 1496*5723Smckusic continue; 1497*5723Smckusic } 14982080Smckusick push8(atan(pop8())); 14992080Smckusick continue; 15002080Smckusick case O_COS: 15012080Smckusick pc.cp++; 1502*5723Smckusic if (_runtst) { 1503*5723Smckusic push8(COS(pop8())); 1504*5723Smckusic continue; 1505*5723Smckusic } 15062080Smckusick push8(cos(pop8())); 15072080Smckusick continue; 15082080Smckusick case O_EXP: 15092080Smckusick pc.cp++; 1510*5723Smckusic if (_runtst) { 1511*5723Smckusic push8(EXP(pop8())); 1512*5723Smckusic continue; 1513*5723Smckusic } 15142080Smckusick push8(exp(pop8())); 15152080Smckusick continue; 15162080Smckusick case O_LN: 15172080Smckusick pc.cp++; 15182191Smckusic if (_runtst) { 15192191Smckusic push8(LN(pop8())); 15202191Smckusic continue; 15212191Smckusic } 15222191Smckusic push8(log(pop8())); 15232080Smckusick continue; 15242080Smckusick case O_SIN: 15252080Smckusick pc.cp++; 1526*5723Smckusic if (_runtst) { 1527*5723Smckusic push8(SIN(pop8())); 1528*5723Smckusic continue; 1529*5723Smckusic } 15302080Smckusick push8(sin(pop8())); 15312080Smckusick continue; 15322080Smckusick case O_SQRT: 15332080Smckusick pc.cp++; 15342191Smckusic if (_runtst) { 15352191Smckusic push8(SQRT(pop8())); 15362191Smckusic continue; 15372191Smckusic } 15382191Smckusic push8(sqrt(pop8())); 15392080Smckusick continue; 15402080Smckusick case O_CHR2: 15412080Smckusick case O_CHR4: 15422080Smckusick pc.cp++; 15432191Smckusic if (_runtst) { 15442950Smckusic push2((short)(CHR(pop4()))); 15452191Smckusic continue; 15462191Smckusic } 15472950Smckusic push2((short)(pop4())); 15482080Smckusick continue; 15492080Smckusick case O_ODD2: 15502080Smckusick case O_ODD4: 15512080Smckusick pc.cp++; 15522950Smckusic push2((short)(pop4() & 1)); 15532080Smckusick continue; 15542080Smckusick case O_SUCC2: 15552109Smckusic tl = *pc.cp++; 15562109Smckusic if (tl == 0) 15572109Smckusic tl = *pc.sp++; 15582109Smckusic tl1 = pop4(); 15592191Smckusic if (_runtst) { 15602950Smckusic push2((short)(SUCC(tl1, tl, (long)(*pc.sp++)))); 15612191Smckusic continue; 15622191Smckusic } 15632950Smckusic push2((short)(tl1 + 1)); 15642191Smckusic pc.sp++; 15652080Smckusick continue; 15662080Smckusick case O_SUCC24: 15672109Smckusic tl = *pc.cp++; 15682109Smckusic if (tl == 0) 15692109Smckusic tl = *pc.sp++; 15702109Smckusic tl1 = pop4(); 15712191Smckusic if (_runtst) { 15722950Smckusic push4(SUCC(tl1, tl, (long)(*pc.sp++))); 15732191Smckusic continue; 15742191Smckusic } 15752191Smckusic push4(tl1 + 1); 15762191Smckusic pc.sp++; 15772109Smckusic continue; 15782080Smckusick case O_SUCC4: 15792109Smckusic tl = *pc.cp++; 15802109Smckusic if (tl == 0) 15812109Smckusic tl = *pc.lp++; 15822109Smckusic tl1 = pop4(); 15832191Smckusic if (_runtst) { 15842950Smckusic push4(SUCC(tl1, tl, (long)(*pc.lp++))); 15852191Smckusic continue; 15862191Smckusic } 15872191Smckusic push4(tl1 + 1); 15882191Smckusic pc.lp++; 15892080Smckusick continue; 15902080Smckusick case O_PRED2: 15912109Smckusic tl = *pc.cp++; 15922109Smckusic if (tl == 0) 15932109Smckusic tl = *pc.sp++; 15942109Smckusic tl1 = pop4(); 15952191Smckusic if (_runtst) { 15962950Smckusic push2((short)(PRED(tl1, tl, (long)(*pc.sp++)))); 15972191Smckusic continue; 15982191Smckusic } 15992950Smckusic push2((short)(tl1 - 1)); 16002191Smckusic pc.sp++; 16012080Smckusick continue; 16022080Smckusick case O_PRED24: 16032109Smckusic tl = *pc.cp++; 16042109Smckusic if (tl == 0) 16052109Smckusic tl = *pc.sp++; 16062109Smckusic tl1 = pop4(); 16072191Smckusic if (_runtst) { 16082950Smckusic push4(PRED(tl1, tl, (long)(*pc.sp++))); 16092191Smckusic continue; 16102191Smckusic } 16112191Smckusic push4(tl1 - 1); 16122191Smckusic pc.sp++; 16132109Smckusic continue; 16142080Smckusick case O_PRED4: 16152109Smckusic tl = *pc.cp++; 16162109Smckusic if (tl == 0) 16172109Smckusic tl = *pc.lp++; 16182109Smckusic tl1 = pop4(); 16192191Smckusic if (_runtst) { 16202950Smckusic push4(PRED(tl1, tl, (long)(*pc.lp++))); 16212191Smckusic continue; 16222191Smckusic } 16232191Smckusic push4(tl1 - 1); 16242191Smckusic pc.lp++; 16252080Smckusick continue; 16262080Smckusick case O_SEED: 16272080Smckusick pc.cp++; 16282080Smckusick push4(SEED(pop4())); 16292080Smckusick continue; 16302080Smckusick case O_RANDOM: 16312080Smckusick pc.cp++; 16322080Smckusick push8(RANDOM(pop8())); 16332080Smckusick continue; 16342080Smckusick case O_EXPO: 16352080Smckusick pc.cp++; 16362080Smckusick push4(EXPO(pop8())); 16372080Smckusick continue; 16382080Smckusick case O_SQR2: 16392080Smckusick case O_SQR4: 16402080Smckusick pc.cp++; 16412080Smckusick tl = pop4(); 16422080Smckusick push4(tl * tl); 16432080Smckusick continue; 16442080Smckusick case O_SQR8: 16452080Smckusick pc.cp++; 16462080Smckusick td = pop8(); 16472080Smckusick push8(td * td); 16482080Smckusick continue; 16492080Smckusick case O_ROUND: 16502080Smckusick pc.cp++; 16512080Smckusick push4(ROUND(pop8())); 16522080Smckusick continue; 16532080Smckusick case O_TRUNC: 16542080Smckusick pc.cp++; 16552080Smckusick push4(TRUNC(pop8())); 16562080Smckusick continue; 16572950Smckusic default: 16585682Smckusic ERROR("Panic: bad op code\n"); 16592950Smckusic continue; 16602080Smckusick } 16612080Smckusick } 16622080Smckusick } 1663