12080Smckusick /* Copyright (c) 1979 Regents of the University of California */ 22080Smckusick 3*9231Smckusick static char sccsid[] = "@(#)interp.c 1.25 11/14/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 */ 737569Smckusick FTEXT|FREAD|SYNC|EOLN, /* 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 */ 1745873Slinton PFLUSH(); 1755658Slinton asm(".byte 0"); 1765658Slinton pc.ucp--; 1775658Slinton continue; 1782080Smckusick case O_NODUMP: 1792191Smckusic _nodump = TRUE; 1802080Smckusick /* and fall through */ 1812080Smckusick case O_BEG: 1822080Smckusick _dp += 1; /* enter local scope */ 1832080Smckusick stp->odisp = *_dp; /* save old display value */ 1842080Smckusick tl = *pc.ucp++; /* tl = name size */ 1852080Smckusick stp->entry = pc.hdrp; /* pointer to entry info */ 1862191Smckusic tl1 = pc.hdrp->framesze;/* tl1 = size of frame */ 1872191Smckusic _lino = pc.hdrp->offset; 1882191Smckusic _runtst = pc.hdrp->tests; 1892191Smckusic disableovrflo(); 1902191Smckusic if (_runtst) 1912191Smckusic enableovrflo(); 1922950Smckusic pc.cp += (int)tl; /* skip over proc hdr info */ 1932080Smckusick stp->file = curfile; /* save active file */ 1942080Smckusick tcp = pushsp(tl1); /* tcp = new top of stack */ 1952950Smckusic if (_runtst) /* zero stack frame */ 196*9231Smckusick blkclr(tcp, tl1); 1972950Smckusic tcp += (int)tl1; /* offsets of locals are neg */ 1982109Smckusic _dp->locvars = tcp; /* set new display pointer */ 1992109Smckusic _dp->stp = stp; 2002950Smckusic stp->tos = pushsp((long)0); /* set tos pointer */ 2012080Smckusick continue; 2022080Smckusick case O_END: 2032080Smckusick PCLOSE(_dp->locvars); /* flush & close local files */ 2042080Smckusick stp = _dp->stp; 2052080Smckusick curfile = stp->file; /* restore old active file */ 2062080Smckusick *_dp = stp->odisp; /* restore old display entry */ 2072109Smckusic if (_dp == &_display.frame[1]) 2082080Smckusick return; /* exiting main proc ??? */ 2092080Smckusick _lino = stp->lino; /* restore lino, pc, dp */ 2102080Smckusick pc.cp = stp->pc.cp; 2112080Smckusick _dp = stp->dp; 2122191Smckusic _runtst = stp->entry->tests; 2132191Smckusic disableovrflo(); 2142191Smckusic if (_runtst) 2152191Smckusic enableovrflo(); 2162109Smckusic popsp(stp->entry->framesze + /* pop local vars */ 2172080Smckusick sizeof(struct stack) + /* pop stack frame */ 2182080Smckusick stp->entry->nargs); /* pop parms */ 2192080Smckusick continue; 2202080Smckusick case O_CALL: 2212080Smckusick tl = *pc.cp++; 2222080Smckusick tcp = base + *pc.lp++;/* calc new entry point */ 2232080Smckusick tcp += sizeof(short); 2242080Smckusick tcp = base + *(long *)tcp; 2252950Smckusic stp = (struct stack *) 2262950Smckusic pushsp((long)(sizeof(struct stack))); 2272080Smckusick stp->lino = _lino; /* save lino, pc, dp */ 2282080Smckusick stp->pc.cp = pc.cp; 2292080Smckusick stp->dp = _dp; 2302109Smckusic _dp = &_display.frame[tl]; /* set up new display ptr */ 2312080Smckusick pc.cp = tcp; 2322080Smckusick continue; 2332080Smckusick case O_FCALL: 2343294Smckusic pc.cp++; 2354016Smckusic tcp = popaddr(); /* ptr to display save area */ 2362080Smckusick tfp = (struct formalrtn *)popaddr(); 2372950Smckusic stp = (struct stack *) 2382950Smckusic pushsp((long)(sizeof(struct stack))); 2392080Smckusick stp->lino = _lino; /* save lino, pc, dp */ 2402080Smckusick stp->pc.cp = pc.cp; 2412080Smckusick stp->dp = _dp; 2423436Smckusic pc.cp = tfp->fentryaddr;/* calc new entry point */ 2433436Smckusic _dp = &_display.frame[tfp->fbn];/* new display ptr */ 244*9231Smckusick blkcpy(&_display.frame[1], tcp, 245*9231Smckusick tfp->fbn * sizeof(struct disp)); 246*9231Smckusick blkcpy(&tfp->fdisp[0], &_display.frame[1], 247*9231Smckusick tfp->fbn * sizeof(struct disp)); 2482080Smckusick continue; 2492080Smckusick case O_FRTN: 2502080Smckusick tl = *pc.cp++; /* tl = size of return obj */ 2512080Smckusick if (tl == 0) 2522080Smckusick tl = *pc.usp++; 2532950Smckusic tcp = pushsp((long)(0)); 2542080Smckusick tfp = *(struct formalrtn **)(tcp + tl); 2554016Smckusic tcp1 = *(char **) 2564016Smckusic (tcp + tl + sizeof(struct formalrtn *)); 2573861Smckusic if (tl != 0) { 258*9231Smckusick blkcpy(tcp, tcp + sizeof(struct formalrtn *) 259*9231Smckusick + sizeof(char *), tl); 2603861Smckusic } 2614016Smckusic popsp((long) 2624016Smckusic (sizeof(struct formalrtn *) + sizeof (char *))); 263*9231Smckusick blkcpy(tcp1, &_display.frame[1], 264*9231Smckusick tfp->fbn * sizeof(struct disp)); 2652080Smckusick continue; 2662080Smckusick case O_FSAV: 2672080Smckusick tfp = (struct formalrtn *)popaddr(); 2683436Smckusic tfp->fbn = *pc.cp++; /* blk number of routine */ 2693861Smckusic tcp = base + *pc.lp++; /* calc new entry point */ 2702080Smckusick tcp += sizeof(short); 2713436Smckusic tfp->fentryaddr = base + *(long *)tcp; 272*9231Smckusick blkcpy(&_display.frame[1], &tfp->fdisp[0], 273*9231Smckusick tfp->fbn * sizeof(struct disp)); 2742080Smckusick pushaddr(tfp); 2752080Smckusick continue; 2762080Smckusick case O_SDUP2: 2772080Smckusick pc.cp++; 2782080Smckusick tl = pop2(); 2792950Smckusic push2((short)(tl)); 2802950Smckusic push2((short)(tl)); 2812080Smckusick continue; 2822080Smckusick case O_SDUP4: 2832080Smckusick pc.cp++; 2842080Smckusick tl = pop4(); 2852080Smckusick push4(tl); 2862080Smckusick push4(tl); 2872080Smckusick continue; 2882080Smckusick case O_TRA: 2892080Smckusick pc.cp++; 2902080Smckusick pc.cp += *pc.sp; 2912080Smckusick continue; 2922080Smckusick case O_TRA4: 2932080Smckusick pc.cp++; 2942080Smckusick pc.cp = base + *pc.lp; 2952080Smckusick continue; 2962080Smckusick case O_GOTO: 2972109Smckusic tstp = _display.frame[*pc.cp++].stp; /* ptr to 2982109Smckusic exit frame */ 2992080Smckusick pc.cp = base + *pc.lp; 3002080Smckusick stp = _dp->stp; 3012080Smckusick while (tstp != stp) { 3022109Smckusic if (_dp == &_display.frame[1]) 3033872Smckusic ERROR("Active frame not found in non-local goto\n", 0); /* exiting prog ??? */ 3042080Smckusick PCLOSE(_dp->locvars); /* close local files */ 3052080Smckusick curfile = stp->file; /* restore active file */ 3062080Smckusick *_dp = stp->odisp; /* old display entry */ 3072080Smckusick _dp = stp->dp; /* restore dp */ 3082080Smckusick stp = _dp->stp; 3092080Smckusick } 3102080Smckusick /* pop locals, stack frame, parms, and return values */ 3112950Smckusic popsp((long)(stp->tos - pushsp((long)(0)))); 3122080Smckusick continue; 3132080Smckusick case O_LINO: 3142950Smckusic if (_dp->stp->tos != pushsp((long)(0))) 3155682Smckusic ERROR("Panic: stack not empty between statements\n"); 3162080Smckusick _lino = *pc.cp++; /* set line number */ 3172080Smckusick if (_lino == 0) 3182080Smckusick _lino = *pc.sp++; 3192950Smckusic if (_runtst) { 3202950Smckusic LINO(); /* inc statement count */ 3212950Smckusic continue; 3222950Smckusic } 3232950Smckusic _stcnt++; 3242080Smckusick continue; 3252080Smckusick case O_PUSH: 3262080Smckusick tl = *pc.cp++; 3272080Smckusick if (tl == 0) 3282080Smckusick tl = *pc.usp++; 3292080Smckusick tl = (-tl + 1) & ~1; 3302080Smckusick tcp = pushsp(tl); 3312950Smckusic if (_runtst) 332*9231Smckusick blkclr(tcp, tl); 3332080Smckusick continue; 3342080Smckusick case O_IF: 3352080Smckusick pc.cp++; 3362191Smckusic if (pop2()) { 3372080Smckusick pc.sp++; 3382191Smckusic continue; 3392191Smckusic } 3402191Smckusic pc.cp += *pc.sp; 3412080Smckusick continue; 3422080Smckusick case O_REL2: 3432080Smckusick tl = pop2(); 3442080Smckusick tl1 = pop2(); 3452080Smckusick goto cmplong; 3462080Smckusick case O_REL24: 3472080Smckusick tl = pop2(); 3482080Smckusick tl1 = pop4(); 3492080Smckusick goto cmplong; 3502080Smckusick case O_REL42: 3512080Smckusick tl = pop4(); 3522080Smckusick tl1 = pop2(); 3532080Smckusick goto cmplong; 3542080Smckusick case O_REL4: 3552080Smckusick tl = pop4(); 3562080Smckusick tl1 = pop4(); 3572080Smckusick cmplong: 3585682Smckusic switch (*pc.cp++) { 3592080Smckusick case releq: 3602080Smckusick push2(tl1 == tl); 3612080Smckusick continue; 3622080Smckusick case relne: 3632080Smckusick push2(tl1 != tl); 3642080Smckusick continue; 3652080Smckusick case rellt: 3662080Smckusick push2(tl1 < tl); 3672080Smckusick continue; 3682080Smckusick case relgt: 3692080Smckusick push2(tl1 > tl); 3702080Smckusick continue; 3712080Smckusick case relle: 3722080Smckusick push2(tl1 <= tl); 3732080Smckusick continue; 3742080Smckusick case relge: 3752080Smckusick push2(tl1 >= tl); 3762080Smckusick continue; 3772080Smckusick default: 3785682Smckusic ERROR("Panic: bad relation %d to REL4*\n", 3795682Smckusic *(pc.cp - 1)); 3802080Smckusick continue; 3812080Smckusick } 3822080Smckusick case O_RELG: 3832080Smckusick tl2 = *pc.cp++; /* tc has jump opcode */ 3842080Smckusick tl = *pc.usp++; /* tl has comparison length */ 3852080Smckusick tl1 = (tl + 1) & ~1; /* tl1 has arg stack length */ 3862950Smckusic tcp = pushsp((long)(0));/* tcp pts to first arg */ 3872080Smckusick switch (tl2) { 3882080Smckusick case releq: 3892950Smckusic tb = RELEQ(tl, tcp + tl1, tcp); 3902080Smckusick break; 3912080Smckusick case relne: 3922950Smckusic tb = RELNE(tl, tcp + tl1, tcp); 3932080Smckusick break; 3942080Smckusick case rellt: 3952950Smckusic tb = RELSLT(tl, tcp + tl1, tcp); 3962080Smckusick break; 3972080Smckusick case relgt: 3982950Smckusic tb = RELSGT(tl, tcp + tl1, tcp); 3992080Smckusick break; 4002080Smckusick case relle: 4012950Smckusic tb = RELSLE(tl, tcp + tl1, tcp); 4022080Smckusick break; 4032080Smckusick case relge: 4042950Smckusic tb = RELSGE(tl, tcp + tl1, tcp); 4052080Smckusick break; 4062080Smckusick default: 4075682Smckusic ERROR("Panic: bad relation %d to RELG*\n", tl2); 4082080Smckusick break; 4092080Smckusick } 4102080Smckusick popsp(tl1 << 1); 4112950Smckusic push2((short)(tb)); 4122080Smckusick continue; 4132080Smckusick case O_RELT: 4142080Smckusick tl2 = *pc.cp++; /* tc has jump opcode */ 4152080Smckusick tl1 = *pc.usp++; /* tl1 has comparison length */ 4162950Smckusic tcp = pushsp((long)(0));/* tcp pts to first arg */ 4172080Smckusick switch (tl2) { 4182080Smckusick case releq: 4192950Smckusic tb = RELEQ(tl1, tcp + tl1, tcp); 4202080Smckusick break; 4212080Smckusick case relne: 4222950Smckusic tb = RELNE(tl1, tcp + tl1, tcp); 4232080Smckusick break; 4242080Smckusick case rellt: 4252950Smckusic tb = RELTLT(tl1, tcp + tl1, tcp); 4262080Smckusick break; 4272080Smckusick case relgt: 4282950Smckusic tb = RELTGT(tl1, tcp + tl1, tcp); 4292080Smckusick break; 4302080Smckusick case relle: 4312950Smckusic tb = RELTLE(tl1, tcp + tl1, tcp); 4322080Smckusick break; 4332080Smckusick case relge: 4342950Smckusic tb = RELTGE(tl1, tcp + tl1, tcp); 4352080Smckusick break; 4362080Smckusick default: 4375682Smckusic ERROR("Panic: bad relation %d to RELT*\n", tl2); 4382080Smckusick break; 4392080Smckusick } 4402080Smckusick popsp(tl1 << 1); 4412950Smckusic push2((short)(tb)); 4422080Smckusick continue; 4432080Smckusick case O_REL28: 4442080Smckusick td = pop2(); 4452080Smckusick td1 = pop8(); 4462080Smckusick goto cmpdbl; 4472080Smckusick case O_REL48: 4482080Smckusick td = pop4(); 4492080Smckusick td1 = pop8(); 4502080Smckusick goto cmpdbl; 4512080Smckusick case O_REL82: 4522080Smckusick td = pop8(); 4532080Smckusick td1 = pop2(); 4542080Smckusick goto cmpdbl; 4552080Smckusick case O_REL84: 4562080Smckusick td = pop8(); 4572080Smckusick td1 = pop4(); 4582080Smckusick goto cmpdbl; 4592080Smckusick case O_REL8: 4602080Smckusick td = pop8(); 4612080Smckusick td1 = pop8(); 4622080Smckusick cmpdbl: 4632080Smckusick switch (*pc.cp++) { 4642080Smckusick case releq: 4652080Smckusick push2(td1 == td); 4662080Smckusick continue; 4672080Smckusick case relne: 4682080Smckusick push2(td1 != td); 4692080Smckusick continue; 4702080Smckusick case rellt: 4712080Smckusick push2(td1 < td); 4722080Smckusick continue; 4732080Smckusick case relgt: 4742080Smckusick push2(td1 > td); 4752080Smckusick continue; 4762080Smckusick case relle: 4772080Smckusick push2(td1 <= td); 4782080Smckusick continue; 4792080Smckusick case relge: 4802080Smckusick push2(td1 >= td); 4812080Smckusick continue; 4822080Smckusick default: 4835682Smckusic ERROR("Panic: bad relation %d to REL8*\n", 4845682Smckusic *(pc.cp - 1)); 4852080Smckusick continue; 4862080Smckusick } 4872080Smckusick case O_AND: 4882080Smckusick pc.cp++; 4892080Smckusick push2(pop2() & pop2()); 4902080Smckusick continue; 4912080Smckusick case O_OR: 4922080Smckusick pc.cp++; 4932080Smckusick push2(pop2() | pop2()); 4942080Smckusick continue; 4952080Smckusick case O_NOT: 4962080Smckusick pc.cp++; 4972080Smckusick push2(pop2() ^ 1); 4982080Smckusick continue; 4992080Smckusick case O_AS2: 5002080Smckusick pc.cp++; 5012080Smckusick tl = pop2(); 5022080Smckusick *(short *)popaddr() = tl; 5032080Smckusick continue; 5042080Smckusick case O_AS4: 5052080Smckusick pc.cp++; 5062080Smckusick tl = pop4(); 5072080Smckusick *(long *)popaddr() = tl; 5082080Smckusick continue; 5092080Smckusick case O_AS24: 5102080Smckusick pc.cp++; 5112080Smckusick tl = pop2(); 5122080Smckusick *(long *)popaddr() = tl; 5132080Smckusick continue; 5142080Smckusick case O_AS42: 5152080Smckusick pc.cp++; 5162080Smckusick tl = pop4(); 5172080Smckusick *(short *)popaddr() = tl; 5182080Smckusick continue; 5192080Smckusick case O_AS21: 5202080Smckusick pc.cp++; 5212080Smckusick tl = pop2(); 5222080Smckusick *popaddr() = tl; 5232080Smckusick continue; 5242080Smckusick case O_AS41: 5252080Smckusick pc.cp++; 5262080Smckusick tl = pop4(); 5272080Smckusick *popaddr() = tl; 5282080Smckusick continue; 5292080Smckusick case O_AS28: 5302080Smckusick pc.cp++; 5312080Smckusick tl = pop2(); 5322080Smckusick *(double *)popaddr() = tl; 5332080Smckusick continue; 5342080Smckusick case O_AS48: 5352080Smckusick pc.cp++; 5362080Smckusick tl = pop4(); 5372080Smckusick *(double *)popaddr() = tl; 5382080Smckusick continue; 5392080Smckusick case O_AS8: 5402080Smckusick pc.cp++; 5412239Smckusic t8 = popsze8(); 5422239Smckusic *(struct sze8 *)popaddr() = t8; 5432080Smckusick continue; 5442080Smckusick case O_AS: 5452080Smckusick tl = *pc.cp++; 5462080Smckusick if (tl == 0) 5472080Smckusick tl = *pc.usp++; 5482080Smckusick tl1 = (tl + 1) & ~1; 5492950Smckusic tcp = pushsp((long)(0)); 550*9231Smckusick blkcpy(tcp, *(char **)(tcp + tl1), tl); 5512080Smckusick popsp(tl1 + sizeof(char *)); 5522080Smckusick continue; 5532080Smckusick case O_INX2P2: 5542080Smckusick tl = *pc.cp++; /* tl has shift amount */ 5552080Smckusick tl1 = (pop2() - *pc.sp++) << tl; 5562080Smckusick pushaddr(popaddr() + tl1); 5572080Smckusick continue; 5582080Smckusick case O_INX4P2: 5592080Smckusick tl = *pc.cp++; /* tl has shift amount */ 5602080Smckusick tl1 = (pop4() - *pc.sp++) << tl; 5612080Smckusick pushaddr(popaddr() + tl1); 5622080Smckusick continue; 5632080Smckusick case O_INX2: 5642080Smckusick tl = *pc.cp++; /* tl has element size */ 5652080Smckusick if (tl == 0) 5662080Smckusick tl = *pc.usp++; 5672080Smckusick tl1 = pop2(); /* index */ 5682080Smckusick tl2 = *pc.sp++; 5692080Smckusick pushaddr(popaddr() + (tl1 - tl2) * tl); 5702191Smckusic tl = *pc.usp++; 5712191Smckusic if (_runtst) 5722191Smckusic SUBSC(tl1, tl2, tl); /* range check */ 5732080Smckusick continue; 5742080Smckusick case O_INX4: 5752080Smckusick tl = *pc.cp++; /* tl has element size */ 5762080Smckusick if (tl == 0) 5772080Smckusick tl = *pc.usp++; 5782080Smckusick tl1 = pop4(); /* index */ 5792080Smckusick tl2 = *pc.sp++; 5802080Smckusick pushaddr(popaddr() + (tl1 - tl2) * tl); 5812191Smckusic tl = *pc.usp++; 5822191Smckusic if (_runtst) 5832191Smckusic SUBSC(tl1, tl2, tl); /* range check */ 5842080Smckusick continue; 5852080Smckusick case O_OFF: 5862080Smckusick tl = *pc.cp++; 5872080Smckusick if (tl == 0) 5882080Smckusick tl = *pc.usp++; 5892950Smckusic pushaddr(popaddr() + tl); 5902080Smckusick continue; 5912080Smckusick case O_NIL: 5922080Smckusick pc.cp++; 5932080Smckusick NIL(); 5942080Smckusick continue; 5952080Smckusick case O_ADD2: 5962080Smckusick pc.cp++; 5972950Smckusic push4((long)(pop2() + pop2())); 5982080Smckusick continue; 5992080Smckusick case O_ADD4: 6002080Smckusick pc.cp++; 6012080Smckusick push4(pop4() + pop4()); 6022080Smckusick continue; 6032080Smckusick case O_ADD24: 6042080Smckusick pc.cp++; 6052080Smckusick tl = pop2(); 6062080Smckusick push4(pop4() + tl); 6072080Smckusick continue; 6082080Smckusick case O_ADD42: 6092080Smckusick pc.cp++; 6102080Smckusick tl = pop4(); 6112080Smckusick push4(pop2() + tl); 6122080Smckusick continue; 6132080Smckusick case O_ADD28: 6142080Smckusick pc.cp++; 6152080Smckusick tl = pop2(); 6162080Smckusick push8(pop8() + tl); 6172080Smckusick continue; 6182080Smckusick case O_ADD48: 6192080Smckusick pc.cp++; 6202080Smckusick tl = pop4(); 6212080Smckusick push8(pop8() + tl); 6222080Smckusick continue; 6232080Smckusick case O_ADD82: 6242080Smckusick pc.cp++; 6252080Smckusick td = pop8(); 6262080Smckusick push8(pop2() + td); 6272080Smckusick continue; 6282080Smckusick case O_ADD84: 6292080Smckusick pc.cp++; 6302080Smckusick td = pop8(); 6312080Smckusick push8(pop4() + td); 6322080Smckusick continue; 6332080Smckusick case O_SUB2: 6342080Smckusick pc.cp++; 6352080Smckusick tl = pop2(); 6362080Smckusick push4(pop2() - tl); 6372080Smckusick continue; 6382080Smckusick case O_SUB4: 6392080Smckusick pc.cp++; 6402080Smckusick tl = pop4(); 6412080Smckusick push4(pop4() - tl); 6422080Smckusick continue; 6432080Smckusick case O_SUB24: 6442080Smckusick pc.cp++; 6452080Smckusick tl = pop2(); 6462080Smckusick push4(pop4() - tl); 6472080Smckusick continue; 6482080Smckusick case O_SUB42: 6492080Smckusick pc.cp++; 6502080Smckusick tl = pop4(); 6512080Smckusick push4(pop2() - tl); 6522080Smckusick continue; 6532080Smckusick case O_SUB28: 6542080Smckusick pc.cp++; 6552080Smckusick tl = pop2(); 6562080Smckusick push8(pop8() - tl); 6572080Smckusick continue; 6582080Smckusick case O_SUB48: 6592080Smckusick pc.cp++; 6602080Smckusick tl = pop4(); 6612080Smckusick push8(pop8() - tl); 6622080Smckusick continue; 6632080Smckusick case O_SUB82: 6642080Smckusick pc.cp++; 6652080Smckusick td = pop8(); 6662080Smckusick push8(pop2() - td); 6672080Smckusick continue; 6682080Smckusick case O_SUB84: 6692080Smckusick pc.cp++; 6702080Smckusick td = pop8(); 6712080Smckusick push8(pop4() - td); 6722080Smckusick continue; 6732080Smckusick case O_MUL2: 6742080Smckusick pc.cp++; 6752950Smckusic push4((long)(pop2() * pop2())); 6762080Smckusick continue; 6772080Smckusick case O_MUL4: 6782080Smckusick pc.cp++; 6792080Smckusick push4(pop4() * pop4()); 6802080Smckusick continue; 6812080Smckusick case O_MUL24: 6822080Smckusick pc.cp++; 6832080Smckusick tl = pop2(); 6842080Smckusick push4(pop4() * tl); 6852080Smckusick continue; 6862080Smckusick case O_MUL42: 6872080Smckusick pc.cp++; 6882080Smckusick tl = pop4(); 6892080Smckusick push4(pop2() * tl); 6902080Smckusick continue; 6912080Smckusick case O_MUL28: 6922080Smckusick pc.cp++; 6932080Smckusick tl = pop2(); 6942080Smckusick push8(pop8() * tl); 6952080Smckusick continue; 6962080Smckusick case O_MUL48: 6972080Smckusick pc.cp++; 6982080Smckusick tl = pop4(); 6992080Smckusick push8(pop8() * tl); 7002080Smckusick continue; 7012080Smckusick case O_MUL82: 7022080Smckusick pc.cp++; 7032080Smckusick td = pop8(); 7042080Smckusick push8(pop2() * td); 7052080Smckusick continue; 7062080Smckusick case O_MUL84: 7072080Smckusick pc.cp++; 7082080Smckusick td = pop8(); 7092080Smckusick push8(pop4() * td); 7102080Smckusick continue; 7112080Smckusick case O_ABS2: 7122080Smckusick case O_ABS4: 7132080Smckusick pc.cp++; 7142080Smckusick tl = pop4(); 7152080Smckusick push4(tl >= 0 ? tl : -tl); 7162080Smckusick continue; 7172080Smckusick case O_ABS8: 7182080Smckusick pc.cp++; 7192080Smckusick td = pop8(); 7202080Smckusick push8(td >= 0.0 ? td : -td); 7212080Smckusick continue; 7222080Smckusick case O_NEG2: 7232080Smckusick pc.cp++; 7242950Smckusic push4((long)(-pop2())); 7252080Smckusick continue; 7262080Smckusick case O_NEG4: 7272080Smckusick pc.cp++; 7282080Smckusick push4(-pop4()); 7292080Smckusick continue; 7302080Smckusick case O_NEG8: 7312080Smckusick pc.cp++; 7322080Smckusick push8(-pop8()); 7332080Smckusick continue; 7342080Smckusick case O_DIV2: 7352080Smckusick pc.cp++; 7362080Smckusick tl = pop2(); 7372080Smckusick push4(pop2() / tl); 7382080Smckusick continue; 7392080Smckusick case O_DIV4: 7402080Smckusick pc.cp++; 7412080Smckusick tl = pop4(); 7422080Smckusick push4(pop4() / tl); 7432080Smckusick continue; 7442080Smckusick case O_DIV24: 7452080Smckusick pc.cp++; 7462080Smckusick tl = pop2(); 7472080Smckusick push4(pop4() / tl); 7482080Smckusick continue; 7492080Smckusick case O_DIV42: 7502080Smckusick pc.cp++; 7512080Smckusick tl = pop4(); 7522080Smckusick push4(pop2() / tl); 7532080Smckusick continue; 7542080Smckusick case O_MOD2: 7552080Smckusick pc.cp++; 7562080Smckusick tl = pop2(); 7572080Smckusick push4(pop2() % tl); 7582080Smckusick continue; 7592080Smckusick case O_MOD4: 7602080Smckusick pc.cp++; 7612080Smckusick tl = pop4(); 7622080Smckusick push4(pop4() % tl); 7632080Smckusick continue; 7642080Smckusick case O_MOD24: 7652080Smckusick pc.cp++; 7662080Smckusick tl = pop2(); 7672080Smckusick push4(pop4() % tl); 7682080Smckusick continue; 7692080Smckusick case O_MOD42: 7702080Smckusick pc.cp++; 7712080Smckusick tl = pop4(); 7722080Smckusick push4(pop2() % tl); 7732080Smckusick continue; 7742080Smckusick case O_ADD8: 7752080Smckusick pc.cp++; 7762080Smckusick push8(pop8() + pop8()); 7772080Smckusick continue; 7782080Smckusick case O_SUB8: 7792080Smckusick pc.cp++; 7802080Smckusick td = pop8(); 7812080Smckusick push8(pop8() - td); 7822080Smckusick continue; 7832080Smckusick case O_MUL8: 7842080Smckusick pc.cp++; 7852080Smckusick push8(pop8() * pop8()); 7862080Smckusick continue; 7872080Smckusick case O_DVD8: 7882080Smckusick pc.cp++; 7892080Smckusick td = pop8(); 7902080Smckusick push8(pop8() / td); 7912080Smckusick continue; 7922080Smckusick case O_STOI: 7932080Smckusick pc.cp++; 7942950Smckusic push4((long)(pop2())); 7952080Smckusick continue; 7962080Smckusick case O_STOD: 7972080Smckusick pc.cp++; 7982080Smckusick td = pop2(); 7992080Smckusick push8(td); 8002080Smckusick continue; 8012080Smckusick case O_ITOD: 8022080Smckusick pc.cp++; 8032080Smckusick td = pop4(); 8042080Smckusick push8(td); 8052080Smckusick continue; 8062080Smckusick case O_ITOS: 8072080Smckusick pc.cp++; 8082950Smckusic push2((short)(pop4())); 8092080Smckusick continue; 8102080Smckusick case O_DVD2: 8112080Smckusick pc.cp++; 8122080Smckusick td = pop2(); 8132080Smckusick push8(pop2() / td); 8142080Smckusick continue; 8152080Smckusick case O_DVD4: 8162080Smckusick pc.cp++; 8172080Smckusick td = pop4(); 8182080Smckusick push8(pop4() / td); 8192080Smckusick continue; 8202080Smckusick case O_DVD24: 8212080Smckusick pc.cp++; 8222080Smckusick td = pop2(); 8232080Smckusick push8(pop4() / td); 8242080Smckusick continue; 8252080Smckusick case O_DVD42: 8262080Smckusick pc.cp++; 8272080Smckusick td = pop4(); 8282080Smckusick push8(pop2() / td); 8292080Smckusick continue; 8302080Smckusick case O_DVD28: 8312080Smckusick pc.cp++; 8322080Smckusick td = pop2(); 8332080Smckusick push8(pop8() / td); 8342080Smckusick continue; 8352080Smckusick case O_DVD48: 8362080Smckusick pc.cp++; 8372080Smckusick td = pop4(); 8382080Smckusick push8(pop8() / td); 8392080Smckusick continue; 8402080Smckusick case O_DVD82: 8412080Smckusick pc.cp++; 8422080Smckusick td = pop8(); 8432080Smckusick push8(pop2() / td); 8442080Smckusick continue; 8452080Smckusick case O_DVD84: 8462080Smckusick pc.cp++; 8472080Smckusick td = pop8(); 8482080Smckusick push8(pop4() / td); 8492080Smckusick continue; 8502080Smckusick case O_RV1: 8512109Smckusic tcp = _display.raw[*pc.ucp++]; 8522950Smckusic push2((short)(*(tcp + *pc.sp++))); 8532080Smckusick continue; 8542080Smckusick case O_RV14: 8552109Smckusic tcp = _display.raw[*pc.ucp++]; 8562950Smckusic push4((long)(*(tcp + *pc.sp++))); 8572080Smckusick continue; 8582080Smckusick case O_RV2: 8592109Smckusic tcp = _display.raw[*pc.ucp++]; 8602080Smckusick push2(*(short *)(tcp + *pc.sp++)); 8612080Smckusick continue; 8622080Smckusick case O_RV24: 8632109Smckusic tcp = _display.raw[*pc.ucp++]; 8642950Smckusic push4((long)(*(short *)(tcp + *pc.sp++))); 8652080Smckusick continue; 8662080Smckusick case O_RV4: 8672109Smckusic tcp = _display.raw[*pc.ucp++]; 8682080Smckusick push4(*(long *)(tcp + *pc.sp++)); 8692080Smckusick continue; 8702080Smckusick case O_RV8: 8712109Smckusic tcp = _display.raw[*pc.ucp++]; 8722239Smckusic pushsze8(*(struct sze8 *)(tcp + *pc.sp++)); 8732080Smckusick continue; 8742080Smckusick case O_RV: 8752109Smckusic tcp = _display.raw[*pc.ucp++]; 8762080Smckusick tcp += *pc.sp++; 8772080Smckusick tl = *pc.usp++; 8782338Smckusic tcp1 = pushsp((tl + 1) & ~1); 879*9231Smckusick blkcpy(tcp, tcp1, tl); 8802080Smckusick continue; 8812080Smckusick case O_LV: 8822109Smckusic tcp = _display.raw[*pc.ucp++]; 8832080Smckusick pushaddr(tcp + *pc.sp++); 8842080Smckusick continue; 8852080Smckusick case O_LRV1: 8862109Smckusic tcp = _display.raw[*pc.ucp++]; 8872950Smckusic push2((short)(*(tcp + *pc.lp++))); 8882080Smckusick continue; 8892080Smckusick case O_LRV14: 8902109Smckusic tcp = _display.raw[*pc.ucp++]; 8912950Smckusic push4((long)(*(tcp + *pc.lp++))); 8922080Smckusick continue; 8932080Smckusick case O_LRV2: 8942109Smckusic tcp = _display.raw[*pc.ucp++]; 8952080Smckusick push2(*(short *)(tcp + *pc.lp++)); 8962080Smckusick continue; 8972080Smckusick case O_LRV24: 8982109Smckusic tcp = _display.raw[*pc.ucp++]; 8992950Smckusic push4((long)(*(short *)(tcp + *pc.lp++))); 9002080Smckusick continue; 9012080Smckusick case O_LRV4: 9022109Smckusic tcp = _display.raw[*pc.ucp++]; 9032080Smckusick push4(*(long *)(tcp + *pc.lp++)); 9042080Smckusick continue; 9052080Smckusick case O_LRV8: 9062109Smckusic tcp = _display.raw[*pc.ucp++]; 9072239Smckusic pushsze8(*(struct sze8 *)(tcp + *pc.lp++)); 9082080Smckusick continue; 9092080Smckusick case O_LRV: 9102109Smckusic tcp = _display.raw[*pc.ucp++]; 9112950Smckusic tcp += (int)*pc.lp++; 9122080Smckusick tl = *pc.usp++; 9132950Smckusic tcp1 = pushsp((tl + 1) & ~1); 914*9231Smckusick blkcpy(tcp, tcp1, tl); 9152080Smckusick continue; 9162080Smckusick case O_LLV: 9172109Smckusic tcp = _display.raw[*pc.ucp++]; 9182080Smckusick pushaddr(tcp + *pc.lp++); 9192080Smckusick continue; 9202080Smckusick case O_IND1: 9212080Smckusick pc.cp++; 9222950Smckusic push2((short)(*popaddr())); 9232080Smckusick continue; 9242080Smckusick case O_IND14: 9252080Smckusick pc.cp++; 9262950Smckusic push4((long)(*popaddr())); 9272080Smckusick continue; 9282080Smckusick case O_IND2: 9292080Smckusick pc.cp++; 9302080Smckusick push2(*(short *)(popaddr())); 9312080Smckusick continue; 9322080Smckusick case O_IND24: 9332080Smckusick pc.cp++; 9342950Smckusic push4((long)(*(short *)(popaddr()))); 9352080Smckusick continue; 9362080Smckusick case O_IND4: 9372080Smckusick pc.cp++; 9382080Smckusick push4(*(long *)(popaddr())); 9392080Smckusick continue; 9402080Smckusick case O_IND8: 9412080Smckusick pc.cp++; 9422239Smckusic pushsze8(*(struct sze8 *)(popaddr())); 9432080Smckusick continue; 9442080Smckusick case O_IND: 9452080Smckusick tl = *pc.cp++; 9462080Smckusick if (tl == 0) 9472080Smckusick tl = *pc.usp++; 9482080Smckusick tcp = popaddr(); 9492080Smckusick tcp1 = pushsp((tl + 1) & ~1); 950*9231Smckusick blkcpy(tcp, tcp1, tl); 9512080Smckusick continue; 9522080Smckusick case O_CON1: 9532950Smckusic push2((short)(*pc.cp++)); 9542080Smckusick continue; 9552080Smckusick case O_CON14: 9562950Smckusic push4((long)(*pc.cp++)); 9572080Smckusick continue; 9582080Smckusick case O_CON2: 9592080Smckusick pc.cp++; 9602080Smckusick push2(*pc.sp++); 9612080Smckusick continue; 9622080Smckusick case O_CON24: 9632080Smckusick pc.cp++; 9642950Smckusic push4((long)(*pc.sp++)); 9652080Smckusick continue; 9662080Smckusick case O_CON4: 9672080Smckusick pc.cp++; 9682080Smckusick push4(*pc.lp++); 9692080Smckusick continue; 9702080Smckusick case O_CON8: 9712080Smckusick pc.cp++; 9722950Smckusic push8(*pc.dbp++); 9732080Smckusick continue; 9742080Smckusick case O_CON: 9752080Smckusick tl = *pc.cp++; 9762080Smckusick if (tl == 0) 9772080Smckusick tl = *pc.usp++; 9782080Smckusick tl = (tl + 1) & ~1; 9792080Smckusick tcp = pushsp(tl); 980*9231Smckusick blkcpy(pc.cp, tcp, tl); 9812950Smckusic pc.cp += (int)tl; 9822080Smckusick continue; 9832950Smckusic case O_CONG: 9842950Smckusic tl = *pc.cp++; 9852950Smckusic if (tl == 0) 9862950Smckusic tl = *pc.usp++; 9872950Smckusic tl1 = (tl + 1) & ~1; 9882950Smckusic tcp = pushsp(tl1); 989*9231Smckusick blkcpy(pc.cp, tcp, tl1); 9902950Smckusic pc.cp += (int)((tl + 2) & ~1); 9912950Smckusic continue; 9922080Smckusick case O_LVCON: 9932080Smckusick tl = *pc.cp++; 9942080Smckusick if (tl == 0) 9952080Smckusick tl = *pc.usp++; 9962080Smckusick tl = (tl + 1) & ~1; 9972080Smckusick pushaddr(pc.cp); 9982950Smckusic pc.cp += (int)tl; 9992080Smckusick continue; 10002080Smckusick case O_RANG2: 10012080Smckusick tl = *pc.cp++; 10022080Smckusick if (tl == 0) 10032080Smckusick tl = *pc.sp++; 10042080Smckusick tl1 = pop2(); 10054026Smckusic push2((short)(RANG4(tl1, tl, (long)(*pc.sp++)))); 10062080Smckusick continue; 10072080Smckusick case O_RANG42: 10082080Smckusick tl = *pc.cp++; 10092080Smckusick if (tl == 0) 10102080Smckusick tl = *pc.sp++; 10112080Smckusick tl1 = pop4(); 10124026Smckusic push4(RANG4(tl1, tl, (long)(*pc.sp++))); 10132080Smckusick continue; 10142080Smckusick case O_RSNG2: 10152080Smckusick tl = *pc.cp++; 10162080Smckusick if (tl == 0) 10172080Smckusick tl = *pc.sp++; 10182080Smckusick tl1 = pop2(); 10192950Smckusic push2((short)(RSNG4(tl1, tl))); 10202080Smckusick continue; 10212080Smckusick case O_RSNG42: 10222080Smckusick tl = *pc.cp++; 10232080Smckusick if (tl == 0) 10242080Smckusick tl = *pc.sp++; 10252080Smckusick tl1 = pop4(); 10262080Smckusick push4(RSNG4(tl1, tl)); 10272080Smckusick continue; 10282080Smckusick case O_RANG4: 10294026Smckusic tl = *pc.cp++; 10304026Smckusic if (tl == 0) 10314026Smckusic tl = *pc.lp++; 10322080Smckusick tl1 = pop4(); 10332080Smckusick push4(RANG4(tl1, tl, *pc.lp++)); 10342080Smckusick continue; 10352080Smckusick case O_RANG24: 10364026Smckusic tl = *pc.cp++; 10374026Smckusic if (tl == 0) 10384026Smckusic tl = *pc.lp++; 10392080Smckusick tl1 = pop2(); 10402950Smckusic push2((short)(RANG4(tl1, tl, *pc.lp++))); 10412080Smckusick continue; 10422080Smckusick case O_RSNG4: 10434026Smckusic tl = *pc.cp++; 10444026Smckusic if (tl == 0) 10454026Smckusic tl = *pc.lp++; 10464026Smckusic tl1 = pop4(); 10474026Smckusic push4(RSNG4(tl1, tl)); 10482080Smckusick continue; 10492080Smckusick case O_RSNG24: 10504026Smckusic tl = *pc.cp++; 10514026Smckusic if (tl == 0) 10524026Smckusic tl = *pc.lp++; 10534026Smckusic tl1 = pop2(); 10544026Smckusic push2((short)(RSNG4(tl1, tl))); 10552080Smckusick continue; 10562080Smckusick case O_STLIM: 10572080Smckusick pc.cp++; 10582121Smckusic STLIM(); 10592950Smckusic popsp((long)(sizeof(long))); 10602080Smckusick continue; 10612080Smckusick case O_LLIMIT: 10622080Smckusick pc.cp++; 10632080Smckusick LLIMIT(); 10642950Smckusic popsp((long)(sizeof(char *)+sizeof(long))); 10652080Smckusick continue; 10662080Smckusick case O_BUFF: 10672950Smckusic BUFF((long)(*pc.cp++)); 10682080Smckusick continue; 10692080Smckusick case O_HALT: 10702080Smckusick pc.cp++; 10715682Smckusic if (_nodump == TRUE) 10725682Smckusic psexit(0); 10735682Smckusic fputs("\nCall to procedure halt\n", stderr); 10745682Smckusic backtrace("Halted"); 10755682Smckusic psexit(0); 10762080Smckusick continue; 10772080Smckusick case O_PXPBUF: 10782080Smckusick pc.cp++; 10792080Smckusick _cntrs = *pc.lp++; 10802080Smckusick _rtns = *pc.lp++; 1081*9231Smckusick NEW(&_pcpcount, (_cntrs + 1) * sizeof(long)); 1082*9231Smckusick blkclr(_pcpcount, (_cntrs + 1) * sizeof(long)); 10832080Smckusick continue; 10842080Smckusick case O_COUNT: 10852080Smckusick pc.cp++; 10862080Smckusick _pcpcount[*pc.usp++]++; 10872080Smckusick continue; 10882080Smckusick case O_CASE1OP: 10892080Smckusick tl = *pc.cp++; /* tl = number of cases */ 10902080Smckusick if (tl == 0) 10912080Smckusick tl = *pc.usp++; 10922080Smckusick tsp = pc.sp + tl; /* ptr to end of jump table */ 10932080Smckusick tcp = (char *)tsp; /* tcp = ptr to case values */ 10942080Smckusick tl1 = pop2(); /* tl1 = element to find */ 10952080Smckusick for(; tl > 0; tl--) /* look for element */ 10962080Smckusick if (tl1 == *tcp++) 10972080Smckusick break; 10982080Smckusick if (tl == 0) /* default case => error */ 10995666Smckusic CASERNG(tl1); 11002080Smckusick pc.cp += *(tsp - tl); 11012080Smckusick continue; 11022080Smckusick case O_CASE2OP: 11032080Smckusick tl = *pc.cp++; /* tl = number of cases */ 11042080Smckusick if (tl == 0) 11052080Smckusick tl = *pc.usp++; 11062080Smckusick tsp = pc.sp + tl; /* ptr to end of jump table */ 11072080Smckusick tsp1 = tsp; /* tsp1 = ptr to case values */ 11082080Smckusick tl1 = (unsigned short)pop2();/* tl1 = element to find */ 11092080Smckusick for(; tl > 0; tl--) /* look for element */ 11102080Smckusick if (tl1 == *tsp1++) 11112080Smckusick break; 11122080Smckusick if (tl == 0) /* default case => error */ 11135666Smckusic CASERNG(tl1); 11142080Smckusick pc.cp += *(tsp - tl); 11152080Smckusick continue; 11162080Smckusick case O_CASE4OP: 11172080Smckusick tl = *pc.cp++; /* tl = number of cases */ 11182080Smckusick if (tl == 0) 11192080Smckusick tl = *pc.usp++; 11202080Smckusick tsp = pc.sp + tl; /* ptr to end of jump table */ 11212080Smckusick tlp = (long *)tsp; /* tlp = ptr to case values */ 11222080Smckusick tl1 = pop4(); /* tl1 = element to find */ 11232080Smckusick for(; tl > 0; tl--) /* look for element */ 11242080Smckusick if (tl1 == *tlp++) 11252080Smckusick break; 11262080Smckusick if (tl == 0) /* default case => error */ 11275666Smckusic CASERNG(tl1); 11282080Smckusick pc.cp += *(tsp - tl); 11292080Smckusick continue; 11302080Smckusick case O_ADDT: 11312080Smckusick tl = *pc.cp++; /* tl has comparison length */ 11322080Smckusick if (tl == 0) 11332080Smckusick tl = *pc.usp++; 11342950Smckusic tcp = pushsp((long)(0));/* tcp pts to first arg */ 11352080Smckusick ADDT(tcp + tl, tcp + tl, tcp, tl >> 2); 11362080Smckusick popsp(tl); 11372080Smckusick continue; 11382080Smckusick case O_SUBT: 11392080Smckusick tl = *pc.cp++; /* tl has comparison length */ 11402080Smckusick if (tl == 0) 11412080Smckusick tl = *pc.usp++; 11422950Smckusic tcp = pushsp((long)(0));/* tcp pts to first arg */ 11432080Smckusick SUBT(tcp + tl, tcp + tl, tcp, tl >> 2); 11442080Smckusick popsp(tl); 11452080Smckusick continue; 11462080Smckusick case O_MULT: 11472080Smckusick tl = *pc.cp++; /* tl has comparison length */ 11482080Smckusick if (tl == 0) 11492080Smckusick tl = *pc.usp++; 11502950Smckusic tcp = pushsp((long)(0));/* tcp pts to first arg */ 11512080Smckusick MULT(tcp + tl, tcp + tl, tcp, tl >> 2); 11522080Smckusick popsp(tl); 11532080Smckusick continue; 11542080Smckusick case O_INCT: 11552080Smckusick tl = *pc.cp++; /* tl has number of args */ 11562080Smckusick if (tl == 0) 11572080Smckusick tl = *pc.usp++; 11582950Smckusic tb = INCT(); 11592950Smckusic popsp(tl*sizeof(long)); 11602950Smckusic push2((short)(tb)); 11612080Smckusick continue; 11622080Smckusick case O_CTTOT: 11632080Smckusick tl = *pc.cp++; /* tl has number of args */ 11642080Smckusick if (tl == 0) 11652080Smckusick tl = *pc.usp++; 11662080Smckusick tl1 = tl * sizeof(long); 11672950Smckusic tcp = pushsp((long)(0)) + tl1; /* tcp pts to result */ 11682080Smckusick CTTOT(tcp); 11692950Smckusic popsp(tl*sizeof(long)); 11702080Smckusick continue; 11712080Smckusick case O_CARD: 11722080Smckusick tl = *pc.cp++; /* tl has comparison length */ 11732080Smckusick if (tl == 0) 11742080Smckusick tl = *pc.usp++; 11752950Smckusic tcp = pushsp((long)(0));/* tcp pts to set */ 11762080Smckusick tl1 = CARD(tcp, tl); 11772080Smckusick popsp(tl); 11782950Smckusic push2((short)(tl1)); 11792080Smckusick continue; 11802080Smckusick case O_IN: 11812080Smckusick tl = *pc.cp++; /* tl has comparison length */ 11822080Smckusick if (tl == 0) 11832080Smckusick tl = *pc.usp++; 11842080Smckusick tl1 = pop4(); /* tl1 is the element */ 11852950Smckusic tcp = pushsp((long)(0));/* tcp pts to set */ 11864026Smckusic tl2 = *pc.sp++; /* lower bound */ 11872950Smckusic tb = IN(tl1, tl2, (long)(*pc.usp++), tcp); 11882080Smckusick popsp(tl); 11892950Smckusic push2((short)(tb)); 11902080Smckusick continue; 11912080Smckusick case O_ASRT: 11922080Smckusick pc.cp++; 1193*9231Smckusick ASRTS(); 11947923Smckusick popsp((long)(sizeof(long)+sizeof(char *))); 11952080Smckusick continue; 11962080Smckusick case O_FOR1U: 11974026Smckusic /* 11984026Smckusic * with the shadowing of for loop variables 11994026Smckusic * the variable is always sizeof(long) hence 12004026Smckusic * nullifying the need for shorter length 12014026Smckusic * assignments 12024026Smckusic */ 12032080Smckusick case O_FOR2U: 12044026Smckusic tl1 = *pc.cp++; /* tl1 index lower bound */ 12054026Smckusic if (tl1 == 0) 12064026Smckusic tl1 = *pc.sp++; 12074026Smckusic tlp = (long *)popaddr(); /* tlp = ptr to index var */ 12084026Smckusic if (*tlp < pop4()) { /* still going up */ 12094026Smckusic tl = *tlp + 1; /* inc index var */ 12102191Smckusic tl2 = *pc.sp++; /* index upper bound */ 12112191Smckusic if (_runtst) 12122191Smckusic RANG4(tl, tl1, tl2); 12134026Smckusic *tlp = tl; /* update index var */ 12142080Smckusick pc.cp += *pc.sp;/* return to top of loop */ 12152080Smckusick continue; 12162080Smckusick } 12174026Smckusic pc.sp += 2; /* else fall through */ 12182080Smckusick continue; 12192080Smckusick case O_FOR4U: 12204026Smckusic tl1 = *pc.cp++; /* tl1 index lower bound */ 12214026Smckusic if (tl1 == 0) 12224026Smckusic tl1 = *pc.lp++; 12232950Smckusic tlp = (long *)popaddr(); /* tlp = ptr to index var */ 12242080Smckusick if (*tlp < pop4()) { /* still going up */ 12252191Smckusic tl = *tlp + 1; /* inc index var */ 12262191Smckusic tl2 = *pc.lp++; /* index upper bound */ 12272191Smckusic if (_runtst) 12282191Smckusic RANG4(tl, tl1, tl2); 12292191Smckusic *tlp = tl; /* update index var */ 12302080Smckusick pc.cp += *pc.sp;/* return to top of loop */ 12312080Smckusick continue; 12322080Smckusick } 12334026Smckusic pc.sp += 3; /* else fall through */ 12342080Smckusick continue; 12352080Smckusick case O_FOR1D: 12364026Smckusic /* 12374026Smckusic * with the shadowing of for loop variables 12384026Smckusic * the variable is always sizeof(long) hence 12394026Smckusic * nullifying the need for shorter length 12404026Smckusic * assignments 12414026Smckusic */ 12422080Smckusick case O_FOR2D: 12434026Smckusic tl1 = *pc.cp++; /* tl1 index lower bound */ 12444026Smckusic if (tl1 == 0) 12454026Smckusic tl1 = *pc.sp++; 12464026Smckusic tlp = (long *)popaddr(); /* tlp = ptr to index var */ 12474026Smckusic if (*tlp > pop4()) { /* still going down */ 12484026Smckusic tl = *tlp - 1; /* inc index var */ 12492191Smckusic tl2 = *pc.sp++; /* index upper bound */ 12502191Smckusic if (_runtst) 12512191Smckusic RANG4(tl, tl1, tl2); 12524026Smckusic *tlp = tl; /* update index var */ 12532080Smckusick pc.cp += *pc.sp;/* return to top of loop */ 12542080Smckusick continue; 12552080Smckusick } 12564026Smckusic pc.sp += 2; /* else fall through */ 12572080Smckusick continue; 12582080Smckusick case O_FOR4D: 12594026Smckusic tl1 = *pc.cp++; /* tl1 index lower bound */ 12604026Smckusic if (tl1 == 0) 12614026Smckusic tl1 = *pc.lp++; 12622950Smckusic tlp = (long *)popaddr(); /* tlp = ptr to index var */ 12632080Smckusick if (*tlp > pop4()) { /* still going down */ 12642191Smckusic tl = *tlp - 1; /* inc index var */ 12652191Smckusic tl2 = *pc.lp++; /* index upper bound */ 12662191Smckusic if (_runtst) 12672191Smckusic RANG4(tl, tl1, tl2); 12682191Smckusic *tlp = tl; /* update index var */ 12692080Smckusick pc.cp += *pc.sp;/* return to top of loop */ 12702080Smckusick continue; 12712080Smckusick } 12724026Smckusic pc.sp += 3; /* else fall through */ 12732080Smckusick continue; 12742080Smckusick case O_READE: 12752080Smckusick pc.cp++; 12762950Smckusic push2((short)(READE(curfile, base + *pc.lp++))); 12772080Smckusick continue; 12782080Smckusick case O_READ4: 12792080Smckusick pc.cp++; 12802080Smckusick push4(READ4(curfile)); 12812080Smckusick continue; 12822080Smckusick case O_READC: 12832080Smckusick pc.cp++; 12842950Smckusic push2((short)(READC(curfile))); 12852080Smckusick continue; 12862080Smckusick case O_READ8: 12872080Smckusick pc.cp++; 12882080Smckusick push8(READ8(curfile)); 12892080Smckusick continue; 12902080Smckusick case O_READLN: 12912080Smckusick pc.cp++; 12922080Smckusick READLN(curfile); 12932080Smckusick continue; 12942080Smckusick case O_EOF: 12952080Smckusick pc.cp++; 12962950Smckusic push2((short)(TEOF(popaddr()))); 12972080Smckusick continue; 12982080Smckusick case O_EOLN: 12992080Smckusick pc.cp++; 13002950Smckusic push2((short)(TEOLN(popaddr()))); 13012080Smckusick continue; 13022080Smckusick case O_WRITEC: 13032191Smckusic if (_runtst) { 13042191Smckusic WRITEC(curfile); 13053166Smckusic popsp((long)(*pc.cp++)); 13062191Smckusic continue; 13072191Smckusic } 13082191Smckusic fputc(); 13093166Smckusic popsp((long)(*pc.cp++)); 13102080Smckusick continue; 13112080Smckusick case O_WRITES: 13122191Smckusic if (_runtst) { 13132191Smckusic WRITES(curfile); 13143166Smckusic popsp((long)(*pc.cp++)); 13152191Smckusic continue; 13162191Smckusic } 13172191Smckusic fwrite(); 13183166Smckusic popsp((long)(*pc.cp++)); 13192080Smckusick continue; 13202080Smckusick case O_WRITEF: 13212191Smckusic if (_runtst) { 13222191Smckusic WRITEF(curfile); 13233166Smckusic popsp((long)(*pc.cp++)); 13242191Smckusic continue; 13252191Smckusic } 13262191Smckusic fprintf(); 13273166Smckusic popsp((long)(*pc.cp++)); 13282080Smckusick continue; 13292080Smckusick case O_WRITLN: 13302080Smckusick pc.cp++; 13312191Smckusic if (_runtst) { 13322191Smckusic WRITLN(curfile); 13332191Smckusic continue; 13342191Smckusic } 13352191Smckusic fputc('\n', ACTFILE(curfile)); 13362080Smckusick continue; 13372080Smckusick case O_PAGE: 13382080Smckusick pc.cp++; 13392191Smckusic if (_runtst) { 13402191Smckusic PAGE(curfile); 13412191Smckusic continue; 13422191Smckusic } 13432950Smckusic fputc('', ACTFILE(curfile)); 13442080Smckusick continue; 13452080Smckusick case O_NAM: 13462080Smckusick pc.cp++; 13472080Smckusick tl = pop4(); 13482080Smckusick pushaddr(NAM(tl, base + *pc.lp++)); 13492080Smckusick continue; 13502080Smckusick case O_MAX: 13512080Smckusick tl = *pc.cp++; 13522080Smckusick if (tl == 0) 13532080Smckusick tl = *pc.usp++; 13542080Smckusick tl1 = pop4(); 13552191Smckusic if (_runtst) { 13562950Smckusic push4(MAX(tl1, tl, (long)(*pc.usp++))); 13572191Smckusic continue; 13582191Smckusic } 13592191Smckusic tl1 -= tl; 13602191Smckusic tl = *pc.usp++; 13612191Smckusic push4(tl1 > tl ? tl1 : tl); 13622080Smckusick continue; 13632080Smckusick case O_MIN: 13642080Smckusick tl = *pc.cp++; 13652080Smckusick if (tl == 0) 13662080Smckusick tl = *pc.usp++; 13672080Smckusick tl1 = pop4(); 13682080Smckusick push4(tl1 < tl ? tl1 : tl); 13692080Smckusick continue; 13702080Smckusick case O_UNIT: 13712080Smckusick pc.cp++; 13722080Smckusick curfile = UNIT(popaddr()); 13732080Smckusick continue; 13742080Smckusick case O_UNITINP: 13752080Smckusick pc.cp++; 13762080Smckusick curfile = INPUT; 13772080Smckusick continue; 13782080Smckusick case O_UNITOUT: 13792080Smckusick pc.cp++; 13802080Smckusick curfile = OUTPUT; 13812080Smckusick continue; 13822080Smckusick case O_MESSAGE: 13832080Smckusick pc.cp++; 13842080Smckusick PFLUSH(); 13852080Smckusick curfile = ERR; 13862080Smckusick continue; 13872109Smckusic case O_PUT: 13882109Smckusic pc.cp++; 13892109Smckusic PUT(curfile); 13902109Smckusic continue; 13912080Smckusick case O_GET: 13922080Smckusick pc.cp++; 13932080Smckusick GET(curfile); 13942080Smckusick continue; 13952080Smckusick case O_FNIL: 13962080Smckusick pc.cp++; 13972080Smckusick pushaddr(FNIL(popaddr())); 13982080Smckusick continue; 13992080Smckusick case O_DEFNAME: 14002080Smckusick pc.cp++; 14012080Smckusick DEFNAME(); 14022950Smckusic popsp((long)(2*sizeof(char *)+2*sizeof(long))); 14032080Smckusick continue; 14042080Smckusick case O_RESET: 14052080Smckusick pc.cp++; 14062080Smckusick RESET(); 14072950Smckusic popsp((long)(2*sizeof(char *)+2*sizeof(long))); 14082080Smckusick continue; 14092080Smckusick case O_REWRITE: 14102080Smckusick pc.cp++; 14112080Smckusick REWRITE(); 14122950Smckusic popsp((long)(2*sizeof(char *)+2*sizeof(long))); 14132080Smckusick continue; 14142080Smckusick case O_FILE: 14152080Smckusick pc.cp++; 14162080Smckusick pushaddr(ACTFILE(curfile)); 14172080Smckusick continue; 14182080Smckusick case O_REMOVE: 14192080Smckusick pc.cp++; 14202080Smckusick REMOVE(); 14212950Smckusic popsp((long)(sizeof(char *)+sizeof(long))); 14222080Smckusick continue; 14232080Smckusick case O_FLUSH: 14242080Smckusick pc.cp++; 14252080Smckusick FLUSH(); 14262950Smckusic popsp((long)(sizeof(char *))); 14272080Smckusick continue; 14282080Smckusick case O_PACK: 14292080Smckusick pc.cp++; 14302080Smckusick PACK(); 14312950Smckusic popsp((long)(5*sizeof(long)+2*sizeof(char*))); 14322080Smckusick continue; 14332080Smckusick case O_UNPACK: 14342080Smckusick pc.cp++; 14352080Smckusick UNPACK(); 14362950Smckusic popsp((long)(5*sizeof(long)+2*sizeof(char*))); 14372080Smckusick continue; 14382080Smckusick case O_ARGC: 14392080Smckusick pc.cp++; 14402950Smckusic push4((long)_argc); 14412080Smckusick continue; 14422080Smckusick case O_ARGV: 14432080Smckusick tl = *pc.cp++; /* tl = size of char array */ 14442080Smckusick if (tl == 0) 14452080Smckusick tl = *pc.usp++; 14462080Smckusick tcp = popaddr(); /* tcp = addr of char array */ 14472080Smckusick tl1 = pop4(); /* tl1 = argv subscript */ 14482080Smckusick ARGV(tl1, tcp, tl); 14492080Smckusick continue; 14502080Smckusick case O_CLCK: 14512080Smckusick pc.cp++; 14522080Smckusick push4(CLCK()); 14532080Smckusick continue; 14542080Smckusick case O_WCLCK: 14552080Smckusick pc.cp++; 14562080Smckusick push4(time(0)); 14572080Smckusick continue; 14582080Smckusick case O_SCLCK: 14592080Smckusick pc.cp++; 14602080Smckusick push4(SCLCK()); 14612080Smckusick continue; 14622080Smckusick case O_NEW: 14632080Smckusick tl = *pc.cp++; /* tl = size being new'ed */ 14642080Smckusick if (tl == 0) 14652080Smckusick tl = *pc.usp++; 14662080Smckusick tcp = popaddr(); /* ptr to ptr being new'ed */ 1467*9231Smckusick NEW(tcp, tl); 14682191Smckusic if (_runtst) { 1469*9231Smckusick blkclr(*tcp, tl); 14702191Smckusic } 14712080Smckusick continue; 14727961Smckusick case O_DISPOSE: 14737961Smckusick tl = *pc.cp++; /* tl = size being disposed */ 14747961Smckusick if (tl == 0) 14757961Smckusick tl = *pc.usp++; 14767961Smckusick tcp = popaddr(); /* ptr to ptr being disposed */ 14777961Smckusick DISPOSE(tcp, tl); 14787961Smckusick *(char **)tcp = (char *)0; 14797961Smckusick continue; 14807961Smckusick case O_DFDISP: 14817961Smckusick tl = *pc.cp++; /* tl = size being disposed */ 14827961Smckusick if (tl == 0) 14837961Smckusick tl = *pc.usp++; 14847961Smckusick tcp = popaddr(); /* ptr to ptr being disposed */ 14857961Smckusick DFDISPOSE(tcp, tl); 14867961Smckusick *(char **)tcp = (char *)0; 14877961Smckusick continue; 14882080Smckusick case O_DATE: 14892080Smckusick pc.cp++; 14902080Smckusick DATE(popaddr()); 14912080Smckusick continue; 14922080Smckusick case O_TIME: 14932080Smckusick pc.cp++; 14942080Smckusick TIME(popaddr()); 14952080Smckusick continue; 14962080Smckusick case O_UNDEF: 14972080Smckusick pc.cp++; 14982080Smckusick pop8(); 14992950Smckusic push2((short)(0)); 15002080Smckusick continue; 15012080Smckusick case O_ATAN: 15022080Smckusick pc.cp++; 15035723Smckusic if (_runtst) { 15045723Smckusic push8(ATAN(pop8())); 15055723Smckusic continue; 15065723Smckusic } 15072080Smckusick push8(atan(pop8())); 15082080Smckusick continue; 15092080Smckusick case O_COS: 15102080Smckusick pc.cp++; 15115723Smckusic if (_runtst) { 15125723Smckusic push8(COS(pop8())); 15135723Smckusic continue; 15145723Smckusic } 15152080Smckusick push8(cos(pop8())); 15162080Smckusick continue; 15172080Smckusick case O_EXP: 15182080Smckusick pc.cp++; 15195723Smckusic if (_runtst) { 15205723Smckusic push8(EXP(pop8())); 15215723Smckusic continue; 15225723Smckusic } 15232080Smckusick push8(exp(pop8())); 15242080Smckusick continue; 15252080Smckusick case O_LN: 15262080Smckusick pc.cp++; 15272191Smckusic if (_runtst) { 15282191Smckusic push8(LN(pop8())); 15292191Smckusic continue; 15302191Smckusic } 15312191Smckusic push8(log(pop8())); 15322080Smckusick continue; 15332080Smckusick case O_SIN: 15342080Smckusick pc.cp++; 15355723Smckusic if (_runtst) { 15365723Smckusic push8(SIN(pop8())); 15375723Smckusic continue; 15385723Smckusic } 15392080Smckusick push8(sin(pop8())); 15402080Smckusick continue; 15412080Smckusick case O_SQRT: 15422080Smckusick pc.cp++; 15432191Smckusic if (_runtst) { 15442191Smckusic push8(SQRT(pop8())); 15452191Smckusic continue; 15462191Smckusic } 15472191Smckusic push8(sqrt(pop8())); 15482080Smckusick continue; 15492080Smckusick case O_CHR2: 15502080Smckusick case O_CHR4: 15512080Smckusick pc.cp++; 15522191Smckusic if (_runtst) { 15532950Smckusic push2((short)(CHR(pop4()))); 15542191Smckusic continue; 15552191Smckusic } 15562950Smckusic push2((short)(pop4())); 15572080Smckusick continue; 15582080Smckusick case O_ODD2: 15592080Smckusick case O_ODD4: 15602080Smckusick pc.cp++; 15612950Smckusic push2((short)(pop4() & 1)); 15622080Smckusick continue; 15632080Smckusick case O_SUCC2: 15642109Smckusic tl = *pc.cp++; 15652109Smckusic if (tl == 0) 15662109Smckusic tl = *pc.sp++; 15672109Smckusic tl1 = pop4(); 15682191Smckusic if (_runtst) { 15692950Smckusic push2((short)(SUCC(tl1, tl, (long)(*pc.sp++)))); 15702191Smckusic continue; 15712191Smckusic } 15722950Smckusic push2((short)(tl1 + 1)); 15732191Smckusic pc.sp++; 15742080Smckusick continue; 15752080Smckusick case O_SUCC24: 15762109Smckusic tl = *pc.cp++; 15772109Smckusic if (tl == 0) 15782109Smckusic tl = *pc.sp++; 15792109Smckusic tl1 = pop4(); 15802191Smckusic if (_runtst) { 15812950Smckusic push4(SUCC(tl1, tl, (long)(*pc.sp++))); 15822191Smckusic continue; 15832191Smckusic } 15842191Smckusic push4(tl1 + 1); 15852191Smckusic pc.sp++; 15862109Smckusic continue; 15872080Smckusick case O_SUCC4: 15882109Smckusic tl = *pc.cp++; 15892109Smckusic if (tl == 0) 15902109Smckusic tl = *pc.lp++; 15912109Smckusic tl1 = pop4(); 15922191Smckusic if (_runtst) { 15932950Smckusic push4(SUCC(tl1, tl, (long)(*pc.lp++))); 15942191Smckusic continue; 15952191Smckusic } 15962191Smckusic push4(tl1 + 1); 15972191Smckusic pc.lp++; 15982080Smckusick continue; 15992080Smckusick case O_PRED2: 16002109Smckusic tl = *pc.cp++; 16012109Smckusic if (tl == 0) 16022109Smckusic tl = *pc.sp++; 16032109Smckusic tl1 = pop4(); 16042191Smckusic if (_runtst) { 16052950Smckusic push2((short)(PRED(tl1, tl, (long)(*pc.sp++)))); 16062191Smckusic continue; 16072191Smckusic } 16082950Smckusic push2((short)(tl1 - 1)); 16092191Smckusic pc.sp++; 16102080Smckusick continue; 16112080Smckusick case O_PRED24: 16122109Smckusic tl = *pc.cp++; 16132109Smckusic if (tl == 0) 16142109Smckusic tl = *pc.sp++; 16152109Smckusic tl1 = pop4(); 16162191Smckusic if (_runtst) { 16172950Smckusic push4(PRED(tl1, tl, (long)(*pc.sp++))); 16182191Smckusic continue; 16192191Smckusic } 16202191Smckusic push4(tl1 - 1); 16212191Smckusic pc.sp++; 16222109Smckusic continue; 16232080Smckusick case O_PRED4: 16242109Smckusic tl = *pc.cp++; 16252109Smckusic if (tl == 0) 16262109Smckusic tl = *pc.lp++; 16272109Smckusic tl1 = pop4(); 16282191Smckusic if (_runtst) { 16292950Smckusic push4(PRED(tl1, tl, (long)(*pc.lp++))); 16302191Smckusic continue; 16312191Smckusic } 16322191Smckusic push4(tl1 - 1); 16332191Smckusic pc.lp++; 16342080Smckusick continue; 16352080Smckusick case O_SEED: 16362080Smckusick pc.cp++; 16372080Smckusick push4(SEED(pop4())); 16382080Smckusick continue; 16392080Smckusick case O_RANDOM: 16402080Smckusick pc.cp++; 16412080Smckusick push8(RANDOM(pop8())); 16422080Smckusick continue; 16432080Smckusick case O_EXPO: 16442080Smckusick pc.cp++; 16452080Smckusick push4(EXPO(pop8())); 16462080Smckusick continue; 16472080Smckusick case O_SQR2: 16482080Smckusick case O_SQR4: 16492080Smckusick pc.cp++; 16502080Smckusick tl = pop4(); 16512080Smckusick push4(tl * tl); 16522080Smckusick continue; 16532080Smckusick case O_SQR8: 16542080Smckusick pc.cp++; 16552080Smckusick td = pop8(); 16562080Smckusick push8(td * td); 16572080Smckusick continue; 16582080Smckusick case O_ROUND: 16592080Smckusick pc.cp++; 16602080Smckusick push4(ROUND(pop8())); 16612080Smckusick continue; 16622080Smckusick case O_TRUNC: 16632080Smckusick pc.cp++; 16642080Smckusick push4(TRUNC(pop8())); 16652080Smckusick continue; 16662950Smckusic default: 16675682Smckusic ERROR("Panic: bad op code\n"); 16682950Smckusic continue; 16692080Smckusick } 16702080Smckusick } 16712080Smckusick } 1672