12080Smckusick /* Copyright (c) 1979 Regents of the University of California */ 22080Smckusick 3*5666Smckusic static char sccsid[] = "@(#)interp.c 1.18 02/02/82"; 42080Smckusick 52080Smckusick #include <math.h> 62950Smckusic #include "whoami.h" 72950Smckusic #include "objfmt.h" 82080Smckusick #include "vars.h" 92080Smckusick #include "panics.h" 102080Smckusick #include "h02opcs.h" 112080Smckusick #include "machdep.h" 122080Smckusick #include "libpc.h" 132080Smckusick 142080Smckusick /* 152080Smckusick * program variables 162080Smckusick */ 172109Smckusic union disply _display; 182080Smckusick struct disp *_dp; 192080Smckusick long _lino = 0; 202080Smckusick int _argc; 212080Smckusick char **_argv; 222080Smckusick long _mode; 232950Smckusic bool _runtst = TRUE; 242950Smckusic bool _nodump = FALSE; 252080Smckusick long _stlim = 500000; 262080Smckusick long _stcnt = 0; 272191Smckusic long _seed = 1; 282950Smckusic #ifdef VAX 292080Smckusick char *_minptr = (char *)0x7fffffff; 302950Smckusic #else 312950Smckusic char *_minptr = (char *)0xffff; 322950Smckusic #endif VAX 332080Smckusick char *_maxptr = (char *)0; 342080Smckusick long *_pcpcount = (long *)0; 352080Smckusick long _cntrs = 0; 362080Smckusick long _rtns = 0; 372080Smckusick 382080Smckusick /* 392080Smckusick * standard files 402080Smckusick */ 412080Smckusick char _inwin, _outwin, _errwin; 422950Smckusic struct iorechd _err = { 432950Smckusic &_errwin, /* fileptr */ 442080Smckusick 0, /* lcount */ 452080Smckusick 0x7fffffff, /* llimit */ 462950Smckusic &_iob[2], /* fbuf */ 472950Smckusic FILNIL, /* fchain */ 482080Smckusick STDLVL, /* flev */ 492950Smckusic "Message file", /* pfname */ 502950Smckusic FTEXT | FWRITE | EOFF, /* funit */ 512950Smckusic 2, /* fblk */ 522080Smckusick 1 /* fsize */ 532080Smckusick }; 542080Smckusick struct iorechd output = { 552080Smckusick &_outwin, /* fileptr */ 562080Smckusick 0, /* lcount */ 572080Smckusick 0x7fffffff, /* llimit */ 582080Smckusick &_iob[1], /* fbuf */ 592080Smckusick ERR, /* fchain */ 602080Smckusick STDLVL, /* flev */ 612080Smckusick "standard output", /* pfname */ 622080Smckusick FTEXT | FWRITE | EOFF, /* funit */ 632080Smckusick 1, /* fblk */ 642080Smckusick 1 /* fsize */ 652080Smckusick }; 662950Smckusic struct iorechd input = { 672950Smckusic &_inwin, /* fileptr */ 682080Smckusick 0, /* lcount */ 692080Smckusick 0x7fffffff, /* llimit */ 702950Smckusic &_iob[0], /* fbuf */ 712950Smckusic OUTPUT, /* fchain */ 722080Smckusick STDLVL, /* flev */ 732950Smckusic "standard input", /* pfname */ 742950Smckusic FTEXT | FREAD | SYNC, /* funit */ 752950Smckusic 0, /* fblk */ 762080Smckusick 1 /* fsize */ 772080Smckusick }; 782080Smckusick 792109Smckusic /* 802950Smckusic * file record variables 812950Smckusic */ 822950Smckusic long _filefre = PREDEF; 832950Smckusic struct iorechd _fchain = { 842950Smckusic 0, 0, 0, 0, /* only use fchain field */ 852950Smckusic INPUT /* fchain */ 862950Smckusic }; 872950Smckusic struct iorec *_actfile[MAXFILES] = { 882950Smckusic INPUT, 892950Smckusic OUTPUT, 902950Smckusic ERR 912950Smckusic }; 922950Smckusic 932950Smckusic /* 945658Slinton * stuff for pdx 955658Slinton */ 965658Slinton 975658Slinton union progcntr *pcaddrp; 985658Slinton asm(".globl _loopaddr"); 995658Slinton 1005658Slinton /* 1012109Smckusic * Px profile array 1022109Smckusic */ 1032109Smckusic #ifdef PROFILE 1042109Smckusic long _profcnts[NUMOPS]; 1052109Smckusic #endif PROFILE 1062109Smckusic 1072109Smckusic /* 1082109Smckusic * debugging variables 1092109Smckusic */ 1102109Smckusic #ifdef DEBUG 1112109Smckusic char opc[10]; 1122109Smckusic long opcptr = 9; 1132109Smckusic #endif DEBUG 1142109Smckusic 1152080Smckusick interpreter(base) 1162080Smckusick char *base; 1172080Smckusick { 1182080Smckusick union progcntr pc; /* interpreted program cntr */ 1192080Smckusick register char *vpc; /* register used for "pc" */ 1202080Smckusick struct iorec *curfile; /* active file */ 1212080Smckusick register struct stack *stp; /* active stack frame ptr */ 1222080Smckusick /* 1232080Smckusick * the following variables are used as scratch 1242080Smckusick */ 1252239Smckusic register char *tcp; 1262239Smckusic register long tl, tl1, tl2; 1272080Smckusick double td, td1; 1282239Smckusic struct sze8 t8; 1292080Smckusick long *tlp; 1302950Smckusic register short *tsp, *tsp1, ts; 1312950Smckusic bool tb; 1322080Smckusick char *tcp1; 1332080Smckusick struct stack *tstp; 1342080Smckusick struct formalrtn *tfp; 1352080Smckusick union progcntr tpc; 1362080Smckusick struct iorec **ip; 1372080Smckusick 1385658Slinton pcaddrp = &pc; 1395658Slinton 1402080Smckusick /* 1412239Smckusic * Setup sets up any hardware specific parameters before 1422239Smckusic * starting the interpreter. Typically this is inline replaced 1432239Smckusic * by interp.sed to utilize specific machine instructions. 1442239Smckusic */ 1452239Smckusic setup(); 1462239Smckusic /* 1472080Smckusick * necessary only on systems which do not initialize 1482080Smckusick * memory to zero 1492080Smckusick */ 1502080Smckusick for (ip = &_actfile[3]; ip < &_actfile[MAXFILES]; *ip++ = FILNIL) 1512080Smckusick /* void */; 1522080Smckusick /* 1532080Smckusick * set up global environment, then ``call'' the main program 1542080Smckusick */ 1552950Smckusic _display.frame[0].locvars = pushsp((long)(2 * sizeof(struct iorec *))); 1562950Smckusic _display.frame[0].locvars += 2 * sizeof(struct iorec *); 1572950Smckusic *(struct iorec **)(_display.frame[0].locvars + OUTPUT_OFF) = OUTPUT; 1582950Smckusic *(struct iorec **)(_display.frame[0].locvars + INPUT_OFF) = INPUT; 1592950Smckusic stp = (struct stack *)pushsp((long)(sizeof(struct stack))); 1602109Smckusic _dp = &_display.frame[0]; 1612080Smckusick pc.cp = base; 1625658Slinton 1635658Slinton asm("_loopaddr:"); 1642080Smckusick for(;;) { 1652109Smckusic # ifdef DEBUG 1662080Smckusick if (++opcptr == 10) 1672080Smckusick opcptr = 0; 1682080Smckusick opc[opcptr] = *pc.ucp; 1692109Smckusic # endif DEBUG 1702109Smckusic # ifdef PROFILE 1712109Smckusic _profcnts[*pc.ucp]++; 1722109Smckusic # endif PROFILE 1732080Smckusick switch (*pc.ucp++) { 1745658Slinton case O_BPT: /* breakpoint trap */ 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 */ 1962950Smckusic blkclr(tl1, tcp); 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 */ 2443436Smckusic blkcpy(tfp->fbn * sizeof(struct disp), 2454016Smckusic &_display.frame[1], tcp); 2463436Smckusic blkcpy(tfp->fbn * sizeof(struct disp), 2473436Smckusic &tfp->fdisp[0], &_display.frame[1]); 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) { 2584016Smckusic blkcpy(tl, tcp, tcp + sizeof(struct formalrtn *) 2594016Smckusic + sizeof(char *)); 2603861Smckusic } 2614016Smckusic popsp((long) 2624016Smckusic (sizeof(struct formalrtn *) + sizeof (char *))); 2633436Smckusic blkcpy(tfp->fbn * sizeof(struct disp), 2644016Smckusic tcp1, &_display.frame[1]); 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; 2723436Smckusic blkcpy(tfp->fbn * sizeof(struct disp), 2733436Smckusic &_display.frame[1], &tfp->fdisp[0]); 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))) 3152080Smckusick panic(PSTKNEMP); 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) 3322950Smckusic blkclr(tl, tcp); 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: 3582080Smckusick tl2 = *pc.cp++; 3592080Smckusick switch (tl2) { 3602080Smckusick case releq: 3612080Smckusick push2(tl1 == tl); 3622080Smckusick continue; 3632080Smckusick case relne: 3642080Smckusick push2(tl1 != tl); 3652080Smckusick continue; 3662080Smckusick case rellt: 3672080Smckusick push2(tl1 < tl); 3682080Smckusick continue; 3692080Smckusick case relgt: 3702080Smckusick push2(tl1 > tl); 3712080Smckusick continue; 3722080Smckusick case relle: 3732080Smckusick push2(tl1 <= tl); 3742080Smckusick continue; 3752080Smckusick case relge: 3762080Smckusick push2(tl1 >= tl); 3772080Smckusick continue; 3782080Smckusick default: 3792080Smckusick panic(PSYSTEM); 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: 4072080Smckusick panic(PSYSTEM); 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: 4372080Smckusick panic(PSYSTEM); 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: 4832080Smckusick panic(PSYSTEM); 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++; 10702080Smckusick panic(PHALT); 10712080Smckusick continue; 10722080Smckusick case O_PXPBUF: 10732080Smckusick pc.cp++; 10742080Smckusick _cntrs = *pc.lp++; 10752080Smckusick _rtns = *pc.lp++; 10762950Smckusic NEWZ(&_pcpcount, (_cntrs + 1) * sizeof(long)); 10772080Smckusick continue; 10782080Smckusick case O_COUNT: 10792080Smckusick pc.cp++; 10802080Smckusick _pcpcount[*pc.usp++]++; 10812080Smckusick continue; 10822080Smckusick case O_CASE1OP: 10832080Smckusick tl = *pc.cp++; /* tl = number of cases */ 10842080Smckusick if (tl == 0) 10852080Smckusick tl = *pc.usp++; 10862080Smckusick tsp = pc.sp + tl; /* ptr to end of jump table */ 10872080Smckusick tcp = (char *)tsp; /* tcp = ptr to case values */ 10882080Smckusick tl1 = pop2(); /* tl1 = element to find */ 10892080Smckusick for(; tl > 0; tl--) /* look for element */ 10902080Smckusick if (tl1 == *tcp++) 10912080Smckusick break; 10922080Smckusick if (tl == 0) /* default case => error */ 1093*5666Smckusic CASERNG(tl1); 10942080Smckusick pc.cp += *(tsp - tl); 10952080Smckusick continue; 10962080Smckusick case O_CASE2OP: 10972080Smckusick tl = *pc.cp++; /* tl = number of cases */ 10982080Smckusick if (tl == 0) 10992080Smckusick tl = *pc.usp++; 11002080Smckusick tsp = pc.sp + tl; /* ptr to end of jump table */ 11012080Smckusick tsp1 = tsp; /* tsp1 = ptr to case values */ 11022080Smckusick tl1 = (unsigned short)pop2();/* tl1 = element to find */ 11032080Smckusick for(; tl > 0; tl--) /* look for element */ 11042080Smckusick if (tl1 == *tsp1++) 11052080Smckusick break; 11062080Smckusick if (tl == 0) /* default case => error */ 1107*5666Smckusic CASERNG(tl1); 11082080Smckusick pc.cp += *(tsp - tl); 11092080Smckusick continue; 11102080Smckusick case O_CASE4OP: 11112080Smckusick tl = *pc.cp++; /* tl = number of cases */ 11122080Smckusick if (tl == 0) 11132080Smckusick tl = *pc.usp++; 11142080Smckusick tsp = pc.sp + tl; /* ptr to end of jump table */ 11152080Smckusick tlp = (long *)tsp; /* tlp = ptr to case values */ 11162080Smckusick tl1 = pop4(); /* tl1 = element to find */ 11172080Smckusick for(; tl > 0; tl--) /* look for element */ 11182080Smckusick if (tl1 == *tlp++) 11192080Smckusick break; 11202080Smckusick if (tl == 0) /* default case => error */ 1121*5666Smckusic CASERNG(tl1); 11222080Smckusick pc.cp += *(tsp - tl); 11232080Smckusick continue; 11242080Smckusick case O_ADDT: 11252080Smckusick tl = *pc.cp++; /* tl has comparison length */ 11262080Smckusick if (tl == 0) 11272080Smckusick tl = *pc.usp++; 11282950Smckusic tcp = pushsp((long)(0));/* tcp pts to first arg */ 11292080Smckusick ADDT(tcp + tl, tcp + tl, tcp, tl >> 2); 11302080Smckusick popsp(tl); 11312080Smckusick continue; 11322080Smckusick case O_SUBT: 11332080Smckusick tl = *pc.cp++; /* tl has comparison length */ 11342080Smckusick if (tl == 0) 11352080Smckusick tl = *pc.usp++; 11362950Smckusic tcp = pushsp((long)(0));/* tcp pts to first arg */ 11372080Smckusick SUBT(tcp + tl, tcp + tl, tcp, tl >> 2); 11382080Smckusick popsp(tl); 11392080Smckusick continue; 11402080Smckusick case O_MULT: 11412080Smckusick tl = *pc.cp++; /* tl has comparison length */ 11422080Smckusick if (tl == 0) 11432080Smckusick tl = *pc.usp++; 11442950Smckusic tcp = pushsp((long)(0));/* tcp pts to first arg */ 11452080Smckusick MULT(tcp + tl, tcp + tl, tcp, tl >> 2); 11462080Smckusick popsp(tl); 11472080Smckusick continue; 11482080Smckusick case O_INCT: 11492080Smckusick tl = *pc.cp++; /* tl has number of args */ 11502080Smckusick if (tl == 0) 11512080Smckusick tl = *pc.usp++; 11522950Smckusic tb = INCT(); 11532950Smckusic popsp(tl*sizeof(long)); 11542950Smckusic push2((short)(tb)); 11552080Smckusick continue; 11562080Smckusick case O_CTTOT: 11572080Smckusick tl = *pc.cp++; /* tl has number of args */ 11582080Smckusick if (tl == 0) 11592080Smckusick tl = *pc.usp++; 11602080Smckusick tl1 = tl * sizeof(long); 11612950Smckusic tcp = pushsp((long)(0)) + tl1; /* tcp pts to result */ 11622080Smckusick CTTOT(tcp); 11632950Smckusic popsp(tl*sizeof(long)); 11642080Smckusick continue; 11652080Smckusick case O_CARD: 11662080Smckusick tl = *pc.cp++; /* tl has comparison length */ 11672080Smckusick if (tl == 0) 11682080Smckusick tl = *pc.usp++; 11692950Smckusic tcp = pushsp((long)(0));/* tcp pts to set */ 11702080Smckusick tl1 = CARD(tcp, tl); 11712080Smckusick popsp(tl); 11722950Smckusic push2((short)(tl1)); 11732080Smckusick continue; 11742080Smckusick case O_IN: 11752080Smckusick tl = *pc.cp++; /* tl has comparison length */ 11762080Smckusick if (tl == 0) 11772080Smckusick tl = *pc.usp++; 11782080Smckusick tl1 = pop4(); /* tl1 is the element */ 11792950Smckusic tcp = pushsp((long)(0));/* tcp pts to set */ 11804026Smckusic tl2 = *pc.sp++; /* lower bound */ 11812950Smckusic tb = IN(tl1, tl2, (long)(*pc.usp++), tcp); 11822080Smckusick popsp(tl); 11832950Smckusic push2((short)(tb)); 11842080Smckusick continue; 11852080Smckusick case O_ASRT: 11862080Smckusick pc.cp++; 11872950Smckusic ts = pop2(); 11882950Smckusic ASRT(ts, ""); 11892080Smckusick continue; 11902080Smckusick case O_FOR1U: 11914026Smckusic /* 11924026Smckusic * with the shadowing of for loop variables 11934026Smckusic * the variable is always sizeof(long) hence 11944026Smckusic * nullifying the need for shorter length 11954026Smckusic * assignments 11964026Smckusic */ 11972080Smckusick case O_FOR2U: 11984026Smckusic tl1 = *pc.cp++; /* tl1 index lower bound */ 11994026Smckusic if (tl1 == 0) 12004026Smckusic tl1 = *pc.sp++; 12014026Smckusic tlp = (long *)popaddr(); /* tlp = ptr to index var */ 12024026Smckusic if (*tlp < pop4()) { /* still going up */ 12034026Smckusic tl = *tlp + 1; /* inc index var */ 12042191Smckusic tl2 = *pc.sp++; /* index upper bound */ 12052191Smckusic if (_runtst) 12062191Smckusic RANG4(tl, tl1, tl2); 12074026Smckusic *tlp = tl; /* update index var */ 12082080Smckusick pc.cp += *pc.sp;/* return to top of loop */ 12092080Smckusick continue; 12102080Smckusick } 12114026Smckusic pc.sp += 2; /* else fall through */ 12122080Smckusick continue; 12132080Smckusick case O_FOR4U: 12144026Smckusic tl1 = *pc.cp++; /* tl1 index lower bound */ 12154026Smckusic if (tl1 == 0) 12164026Smckusic tl1 = *pc.lp++; 12172950Smckusic tlp = (long *)popaddr(); /* tlp = ptr to index var */ 12182080Smckusick if (*tlp < pop4()) { /* still going up */ 12192191Smckusic tl = *tlp + 1; /* inc index var */ 12202191Smckusic tl2 = *pc.lp++; /* index upper bound */ 12212191Smckusic if (_runtst) 12222191Smckusic RANG4(tl, tl1, tl2); 12232191Smckusic *tlp = tl; /* update index var */ 12242080Smckusick pc.cp += *pc.sp;/* return to top of loop */ 12252080Smckusick continue; 12262080Smckusick } 12274026Smckusic pc.sp += 3; /* else fall through */ 12282080Smckusick continue; 12292080Smckusick case O_FOR1D: 12304026Smckusic /* 12314026Smckusic * with the shadowing of for loop variables 12324026Smckusic * the variable is always sizeof(long) hence 12334026Smckusic * nullifying the need for shorter length 12344026Smckusic * assignments 12354026Smckusic */ 12362080Smckusick case O_FOR2D: 12374026Smckusic tl1 = *pc.cp++; /* tl1 index lower bound */ 12384026Smckusic if (tl1 == 0) 12394026Smckusic tl1 = *pc.sp++; 12404026Smckusic tlp = (long *)popaddr(); /* tlp = ptr to index var */ 12414026Smckusic if (*tlp > pop4()) { /* still going down */ 12424026Smckusic tl = *tlp - 1; /* inc index var */ 12432191Smckusic tl2 = *pc.sp++; /* index upper bound */ 12442191Smckusic if (_runtst) 12452191Smckusic RANG4(tl, tl1, tl2); 12464026Smckusic *tlp = tl; /* update index var */ 12472080Smckusick pc.cp += *pc.sp;/* return to top of loop */ 12482080Smckusick continue; 12492080Smckusick } 12504026Smckusic pc.sp += 2; /* else fall through */ 12512080Smckusick continue; 12522080Smckusick case O_FOR4D: 12534026Smckusic tl1 = *pc.cp++; /* tl1 index lower bound */ 12544026Smckusic if (tl1 == 0) 12554026Smckusic tl1 = *pc.lp++; 12562950Smckusic tlp = (long *)popaddr(); /* tlp = ptr to index var */ 12572080Smckusick if (*tlp > pop4()) { /* still going down */ 12582191Smckusic tl = *tlp - 1; /* inc index var */ 12592191Smckusic tl2 = *pc.lp++; /* index upper bound */ 12602191Smckusic if (_runtst) 12612191Smckusic RANG4(tl, tl1, tl2); 12622191Smckusic *tlp = tl; /* update index var */ 12632080Smckusick pc.cp += *pc.sp;/* return to top of loop */ 12642080Smckusick continue; 12652080Smckusick } 12664026Smckusic pc.sp += 3; /* else fall through */ 12672080Smckusick continue; 12682080Smckusick case O_READE: 12692080Smckusick pc.cp++; 12702950Smckusic push2((short)(READE(curfile, base + *pc.lp++))); 12712080Smckusick continue; 12722080Smckusick case O_READ4: 12732080Smckusick pc.cp++; 12742080Smckusick push4(READ4(curfile)); 12752080Smckusick continue; 12762080Smckusick case O_READC: 12772080Smckusick pc.cp++; 12782950Smckusic push2((short)(READC(curfile))); 12792080Smckusick continue; 12802080Smckusick case O_READ8: 12812080Smckusick pc.cp++; 12822080Smckusick push8(READ8(curfile)); 12832080Smckusick continue; 12842080Smckusick case O_READLN: 12852080Smckusick pc.cp++; 12862080Smckusick READLN(curfile); 12872080Smckusick continue; 12882080Smckusick case O_EOF: 12892080Smckusick pc.cp++; 12902950Smckusic push2((short)(TEOF(popaddr()))); 12912080Smckusick continue; 12922080Smckusick case O_EOLN: 12932080Smckusick pc.cp++; 12942950Smckusic push2((short)(TEOLN(popaddr()))); 12952080Smckusick continue; 12962080Smckusick case O_WRITEC: 12972191Smckusic if (_runtst) { 12982191Smckusic WRITEC(curfile); 12993166Smckusic popsp((long)(*pc.cp++)); 13002191Smckusic continue; 13012191Smckusic } 13022191Smckusic fputc(); 13033166Smckusic popsp((long)(*pc.cp++)); 13042080Smckusick continue; 13052080Smckusick case O_WRITES: 13062191Smckusic if (_runtst) { 13072191Smckusic WRITES(curfile); 13083166Smckusic popsp((long)(*pc.cp++)); 13092191Smckusic continue; 13102191Smckusic } 13112191Smckusic fwrite(); 13123166Smckusic popsp((long)(*pc.cp++)); 13132080Smckusick continue; 13142080Smckusick case O_WRITEF: 13152191Smckusic if (_runtst) { 13162191Smckusic WRITEF(curfile); 13173166Smckusic popsp((long)(*pc.cp++)); 13182191Smckusic continue; 13192191Smckusic } 13202191Smckusic fprintf(); 13213166Smckusic popsp((long)(*pc.cp++)); 13222080Smckusick continue; 13232080Smckusick case O_WRITLN: 13242080Smckusick pc.cp++; 13252191Smckusic if (_runtst) { 13262191Smckusic WRITLN(curfile); 13272191Smckusic continue; 13282191Smckusic } 13292191Smckusic fputc('\n', ACTFILE(curfile)); 13302080Smckusick continue; 13312080Smckusick case O_PAGE: 13322080Smckusick pc.cp++; 13332191Smckusic if (_runtst) { 13342191Smckusic PAGE(curfile); 13352191Smckusic continue; 13362191Smckusic } 13372950Smckusic fputc('', ACTFILE(curfile)); 13382080Smckusick continue; 13392080Smckusick case O_NAM: 13402080Smckusick pc.cp++; 13412080Smckusick tl = pop4(); 13422080Smckusick pushaddr(NAM(tl, base + *pc.lp++)); 13432080Smckusick continue; 13442080Smckusick case O_MAX: 13452080Smckusick tl = *pc.cp++; 13462080Smckusick if (tl == 0) 13472080Smckusick tl = *pc.usp++; 13482080Smckusick tl1 = pop4(); 13492191Smckusic if (_runtst) { 13502950Smckusic push4(MAX(tl1, tl, (long)(*pc.usp++))); 13512191Smckusic continue; 13522191Smckusic } 13532191Smckusic tl1 -= tl; 13542191Smckusic tl = *pc.usp++; 13552191Smckusic push4(tl1 > tl ? tl1 : tl); 13562080Smckusick continue; 13572080Smckusick case O_MIN: 13582080Smckusick tl = *pc.cp++; 13592080Smckusick if (tl == 0) 13602080Smckusick tl = *pc.usp++; 13612080Smckusick tl1 = pop4(); 13622080Smckusick push4(tl1 < tl ? tl1 : tl); 13632080Smckusick continue; 13642080Smckusick case O_UNIT: 13652080Smckusick pc.cp++; 13662080Smckusick curfile = UNIT(popaddr()); 13672080Smckusick continue; 13682080Smckusick case O_UNITINP: 13692080Smckusick pc.cp++; 13702080Smckusick curfile = INPUT; 13712080Smckusick continue; 13722080Smckusick case O_UNITOUT: 13732080Smckusick pc.cp++; 13742080Smckusick curfile = OUTPUT; 13752080Smckusick continue; 13762080Smckusick case O_MESSAGE: 13772080Smckusick pc.cp++; 13782080Smckusick PFLUSH(); 13792080Smckusick curfile = ERR; 13802080Smckusick continue; 13812109Smckusic case O_PUT: 13822109Smckusic pc.cp++; 13832109Smckusic PUT(curfile); 13842109Smckusic continue; 13852080Smckusick case O_GET: 13862080Smckusick pc.cp++; 13872080Smckusick GET(curfile); 13882080Smckusick continue; 13892080Smckusick case O_FNIL: 13902080Smckusick pc.cp++; 13912080Smckusick pushaddr(FNIL(popaddr())); 13922080Smckusick continue; 13932080Smckusick case O_DEFNAME: 13942080Smckusick pc.cp++; 13952080Smckusick DEFNAME(); 13962950Smckusic popsp((long)(2*sizeof(char *)+2*sizeof(long))); 13972080Smckusick continue; 13982080Smckusick case O_RESET: 13992080Smckusick pc.cp++; 14002080Smckusick RESET(); 14012950Smckusic popsp((long)(2*sizeof(char *)+2*sizeof(long))); 14022080Smckusick continue; 14032080Smckusick case O_REWRITE: 14042080Smckusick pc.cp++; 14052080Smckusick REWRITE(); 14062950Smckusic popsp((long)(2*sizeof(char *)+2*sizeof(long))); 14072080Smckusick continue; 14082080Smckusick case O_FILE: 14092080Smckusick pc.cp++; 14102080Smckusick pushaddr(ACTFILE(curfile)); 14112080Smckusick continue; 14122080Smckusick case O_REMOVE: 14132080Smckusick pc.cp++; 14142080Smckusick REMOVE(); 14152950Smckusic popsp((long)(sizeof(char *)+sizeof(long))); 14162080Smckusick continue; 14172080Smckusick case O_FLUSH: 14182080Smckusick pc.cp++; 14192080Smckusick FLUSH(); 14202950Smckusic popsp((long)(sizeof(char *))); 14212080Smckusick continue; 14222080Smckusick case O_PACK: 14232080Smckusick pc.cp++; 14242080Smckusick PACK(); 14252950Smckusic popsp((long)(5*sizeof(long)+2*sizeof(char*))); 14262080Smckusick continue; 14272080Smckusick case O_UNPACK: 14282080Smckusick pc.cp++; 14292080Smckusick UNPACK(); 14302950Smckusic popsp((long)(5*sizeof(long)+2*sizeof(char*))); 14312080Smckusick continue; 14322080Smckusick case O_ARGC: 14332080Smckusick pc.cp++; 14342950Smckusic push4((long)_argc); 14352080Smckusick continue; 14362080Smckusick case O_ARGV: 14372080Smckusick tl = *pc.cp++; /* tl = size of char array */ 14382080Smckusick if (tl == 0) 14392080Smckusick tl = *pc.usp++; 14402080Smckusick tcp = popaddr(); /* tcp = addr of char array */ 14412080Smckusick tl1 = pop4(); /* tl1 = argv subscript */ 14422080Smckusick ARGV(tl1, tcp, tl); 14432080Smckusick continue; 14442080Smckusick case O_CLCK: 14452080Smckusick pc.cp++; 14462080Smckusick push4(CLCK()); 14472080Smckusick continue; 14482080Smckusick case O_WCLCK: 14492080Smckusick pc.cp++; 14502080Smckusick push4(time(0)); 14512080Smckusick continue; 14522080Smckusick case O_SCLCK: 14532080Smckusick pc.cp++; 14542080Smckusick push4(SCLCK()); 14552080Smckusick continue; 14562080Smckusick case O_DISPOSE: 14572080Smckusick tl = *pc.cp++; /* tl = size being disposed */ 14582080Smckusick if (tl == 0) 14592080Smckusick tl = *pc.usp++; 14602080Smckusick tcp = popaddr(); /* ptr to ptr being disposed */ 14612080Smckusick DISPOSE(tcp, tl); 14622080Smckusick *(char **)tcp = (char *)0; 14632080Smckusick continue; 14642080Smckusick case O_NEW: 14652080Smckusick tl = *pc.cp++; /* tl = size being new'ed */ 14662080Smckusick if (tl == 0) 14672080Smckusick tl = *pc.usp++; 14682080Smckusick tcp = popaddr(); /* ptr to ptr being new'ed */ 14692191Smckusic if (_runtst) { 14702191Smckusic NEWZ(tcp, tl); 14712191Smckusic continue; 14722191Smckusic } 14732191Smckusic NEW(tcp, tl); 14742080Smckusick continue; 14752080Smckusick case O_DATE: 14762080Smckusick pc.cp++; 14772080Smckusick DATE(popaddr()); 14782080Smckusick continue; 14792080Smckusick case O_TIME: 14802080Smckusick pc.cp++; 14812080Smckusick TIME(popaddr()); 14822080Smckusick continue; 14832080Smckusick case O_UNDEF: 14842080Smckusick pc.cp++; 14852080Smckusick pop8(); 14862950Smckusic push2((short)(0)); 14872080Smckusick continue; 14882080Smckusick case O_ATAN: 14892080Smckusick pc.cp++; 14902080Smckusick push8(atan(pop8())); 14912080Smckusick continue; 14922080Smckusick case O_COS: 14932080Smckusick pc.cp++; 14942080Smckusick push8(cos(pop8())); 14952080Smckusick continue; 14962080Smckusick case O_EXP: 14972080Smckusick pc.cp++; 14982080Smckusick push8(exp(pop8())); 14992080Smckusick continue; 15002080Smckusick case O_LN: 15012080Smckusick pc.cp++; 15022191Smckusic if (_runtst) { 15032191Smckusic push8(LN(pop8())); 15042191Smckusic continue; 15052191Smckusic } 15062191Smckusic push8(log(pop8())); 15072080Smckusick continue; 15082080Smckusick case O_SIN: 15092080Smckusick pc.cp++; 15102080Smckusick push8(sin(pop8())); 15112080Smckusick continue; 15122080Smckusick case O_SQRT: 15132080Smckusick pc.cp++; 15142191Smckusic if (_runtst) { 15152191Smckusic push8(SQRT(pop8())); 15162191Smckusic continue; 15172191Smckusic } 15182191Smckusic push8(sqrt(pop8())); 15192080Smckusick continue; 15202080Smckusick case O_CHR2: 15212080Smckusick case O_CHR4: 15222080Smckusick pc.cp++; 15232191Smckusic if (_runtst) { 15242950Smckusic push2((short)(CHR(pop4()))); 15252191Smckusic continue; 15262191Smckusic } 15272950Smckusic push2((short)(pop4())); 15282080Smckusick continue; 15292080Smckusick case O_ODD2: 15302080Smckusick case O_ODD4: 15312080Smckusick pc.cp++; 15322950Smckusic push2((short)(pop4() & 1)); 15332080Smckusick continue; 15342080Smckusick case O_SUCC2: 15352109Smckusic tl = *pc.cp++; 15362109Smckusic if (tl == 0) 15372109Smckusic tl = *pc.sp++; 15382109Smckusic tl1 = pop4(); 15392191Smckusic if (_runtst) { 15402950Smckusic push2((short)(SUCC(tl1, tl, (long)(*pc.sp++)))); 15412191Smckusic continue; 15422191Smckusic } 15432950Smckusic push2((short)(tl1 + 1)); 15442191Smckusic pc.sp++; 15452080Smckusick continue; 15462080Smckusick case O_SUCC24: 15472109Smckusic tl = *pc.cp++; 15482109Smckusic if (tl == 0) 15492109Smckusic tl = *pc.sp++; 15502109Smckusic tl1 = pop4(); 15512191Smckusic if (_runtst) { 15522950Smckusic push4(SUCC(tl1, tl, (long)(*pc.sp++))); 15532191Smckusic continue; 15542191Smckusic } 15552191Smckusic push4(tl1 + 1); 15562191Smckusic pc.sp++; 15572109Smckusic continue; 15582080Smckusick case O_SUCC4: 15592109Smckusic tl = *pc.cp++; 15602109Smckusic if (tl == 0) 15612109Smckusic tl = *pc.lp++; 15622109Smckusic tl1 = pop4(); 15632191Smckusic if (_runtst) { 15642950Smckusic push4(SUCC(tl1, tl, (long)(*pc.lp++))); 15652191Smckusic continue; 15662191Smckusic } 15672191Smckusic push4(tl1 + 1); 15682191Smckusic pc.lp++; 15692080Smckusick continue; 15702080Smckusick case O_PRED2: 15712109Smckusic tl = *pc.cp++; 15722109Smckusic if (tl == 0) 15732109Smckusic tl = *pc.sp++; 15742109Smckusic tl1 = pop4(); 15752191Smckusic if (_runtst) { 15762950Smckusic push2((short)(PRED(tl1, tl, (long)(*pc.sp++)))); 15772191Smckusic continue; 15782191Smckusic } 15792950Smckusic push2((short)(tl1 - 1)); 15802191Smckusic pc.sp++; 15812080Smckusick continue; 15822080Smckusick case O_PRED24: 15832109Smckusic tl = *pc.cp++; 15842109Smckusic if (tl == 0) 15852109Smckusic tl = *pc.sp++; 15862109Smckusic tl1 = pop4(); 15872191Smckusic if (_runtst) { 15882950Smckusic push4(PRED(tl1, tl, (long)(*pc.sp++))); 15892191Smckusic continue; 15902191Smckusic } 15912191Smckusic push4(tl1 - 1); 15922191Smckusic pc.sp++; 15932109Smckusic continue; 15942080Smckusick case O_PRED4: 15952109Smckusic tl = *pc.cp++; 15962109Smckusic if (tl == 0) 15972109Smckusic tl = *pc.lp++; 15982109Smckusic tl1 = pop4(); 15992191Smckusic if (_runtst) { 16002950Smckusic push4(PRED(tl1, tl, (long)(*pc.lp++))); 16012191Smckusic continue; 16022191Smckusic } 16032191Smckusic push4(tl1 - 1); 16042191Smckusic pc.lp++; 16052080Smckusick continue; 16062080Smckusick case O_SEED: 16072080Smckusick pc.cp++; 16082080Smckusick push4(SEED(pop4())); 16092080Smckusick continue; 16102080Smckusick case O_RANDOM: 16112080Smckusick pc.cp++; 16122080Smckusick push8(RANDOM(pop8())); 16132080Smckusick continue; 16142080Smckusick case O_EXPO: 16152080Smckusick pc.cp++; 16162080Smckusick push4(EXPO(pop8())); 16172080Smckusick continue; 16182080Smckusick case O_SQR2: 16192080Smckusick case O_SQR4: 16202080Smckusick pc.cp++; 16212080Smckusick tl = pop4(); 16222080Smckusick push4(tl * tl); 16232080Smckusick continue; 16242080Smckusick case O_SQR8: 16252080Smckusick pc.cp++; 16262080Smckusick td = pop8(); 16272080Smckusick push8(td * td); 16282080Smckusick continue; 16292080Smckusick case O_ROUND: 16302080Smckusick pc.cp++; 16312080Smckusick push4(ROUND(pop8())); 16322080Smckusick continue; 16332080Smckusick case O_TRUNC: 16342080Smckusick pc.cp++; 16352080Smckusick push4(TRUNC(pop8())); 16362080Smckusick continue; 16372950Smckusic default: 16382950Smckusic panic(PBADOP); 16392950Smckusic continue; 16402080Smckusick } 16412080Smckusick } 16422080Smckusick } 1643