12080Smckusick /* Copyright (c) 1979 Regents of the University of California */ 22080Smckusick 3*3861Smckusic static char sccsid[] = "@(#)interp.c 1.13 06/08/81"; 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 "h01errs.h" 132080Smckusick #include "libpc.h" 142080Smckusick 152080Smckusick /* 162080Smckusick * program variables 172080Smckusick */ 182109Smckusic union disply _display; 192080Smckusick struct disp *_dp; 202080Smckusick long _lino = 0; 212080Smckusick int _argc; 222080Smckusick char **_argv; 232080Smckusick long _mode; 242950Smckusic bool _runtst = TRUE; 252950Smckusic bool _nodump = FALSE; 262080Smckusick long _stlim = 500000; 272080Smckusick long _stcnt = 0; 282191Smckusic long _seed = 1; 292950Smckusic #ifdef VAX 302080Smckusick char *_minptr = (char *)0x7fffffff; 312950Smckusic #else 322950Smckusic char *_minptr = (char *)0xffff; 332950Smckusic #endif VAX 342080Smckusick char *_maxptr = (char *)0; 352080Smckusick long *_pcpcount = (long *)0; 362080Smckusick long _cntrs = 0; 372080Smckusick long _rtns = 0; 382080Smckusick 392080Smckusick /* 402080Smckusick * standard files 412080Smckusick */ 422080Smckusick char _inwin, _outwin, _errwin; 432950Smckusic struct iorechd _err = { 442950Smckusic &_errwin, /* fileptr */ 452080Smckusick 0, /* lcount */ 462080Smckusick 0x7fffffff, /* llimit */ 472950Smckusic &_iob[2], /* fbuf */ 482950Smckusic FILNIL, /* fchain */ 492080Smckusick STDLVL, /* flev */ 502950Smckusic "Message file", /* pfname */ 512950Smckusic FTEXT | FWRITE | EOFF, /* funit */ 522950Smckusic 2, /* fblk */ 532080Smckusick 1 /* fsize */ 542080Smckusick }; 552080Smckusick struct iorechd output = { 562080Smckusick &_outwin, /* fileptr */ 572080Smckusick 0, /* lcount */ 582080Smckusick 0x7fffffff, /* llimit */ 592080Smckusick &_iob[1], /* fbuf */ 602080Smckusick ERR, /* fchain */ 612080Smckusick STDLVL, /* flev */ 622080Smckusick "standard output", /* pfname */ 632080Smckusick FTEXT | FWRITE | EOFF, /* funit */ 642080Smckusick 1, /* fblk */ 652080Smckusick 1 /* fsize */ 662080Smckusick }; 672950Smckusic struct iorechd input = { 682950Smckusic &_inwin, /* fileptr */ 692080Smckusick 0, /* lcount */ 702080Smckusick 0x7fffffff, /* llimit */ 712950Smckusic &_iob[0], /* fbuf */ 722950Smckusic OUTPUT, /* fchain */ 732080Smckusick STDLVL, /* flev */ 742950Smckusic "standard input", /* pfname */ 752950Smckusic FTEXT | FREAD | SYNC, /* funit */ 762950Smckusic 0, /* fblk */ 772080Smckusick 1 /* fsize */ 782080Smckusick }; 792080Smckusick 802109Smckusic /* 812950Smckusic * file record variables 822950Smckusic */ 832950Smckusic long _filefre = PREDEF; 842950Smckusic struct iorechd _fchain = { 852950Smckusic 0, 0, 0, 0, /* only use fchain field */ 862950Smckusic INPUT /* fchain */ 872950Smckusic }; 882950Smckusic struct iorec *_actfile[MAXFILES] = { 892950Smckusic INPUT, 902950Smckusic OUTPUT, 912950Smckusic ERR 922950Smckusic }; 932950Smckusic 942950Smckusic /* 952109Smckusic * Px profile array 962109Smckusic */ 972109Smckusic #ifdef PROFILE 982109Smckusic long _profcnts[NUMOPS]; 992109Smckusic #endif PROFILE 1002109Smckusic 1012109Smckusic /* 1022109Smckusic * debugging variables 1032109Smckusic */ 1042109Smckusic #ifdef DEBUG 1052109Smckusic char opc[10]; 1062109Smckusic long opcptr = 9; 1072109Smckusic #endif DEBUG 1082109Smckusic 1092080Smckusick interpreter(base) 1102080Smckusick char *base; 1112080Smckusick { 1122080Smckusick union progcntr pc; /* interpreted program cntr */ 1132080Smckusick register char *vpc; /* register used for "pc" */ 1142080Smckusick struct iorec *curfile; /* active file */ 1152080Smckusick register struct stack *stp; /* active stack frame ptr */ 1162080Smckusick /* 1172080Smckusick * the following variables are used as scratch 1182080Smckusick */ 1192239Smckusic register char *tcp; 1202239Smckusic register long tl, tl1, tl2; 1212080Smckusick double td, td1; 1222239Smckusic struct sze8 t8; 1232080Smckusick long *tlp; 1242950Smckusic register short *tsp, *tsp1, ts; 1252950Smckusic bool tb; 1262080Smckusick char *tcp1; 1272080Smckusick struct stack *tstp; 1282080Smckusick struct formalrtn *tfp; 1292080Smckusick union progcntr tpc; 1302080Smckusick struct iorec **ip; 1312080Smckusick 1322080Smckusick /* 1332239Smckusic * Setup sets up any hardware specific parameters before 1342239Smckusic * starting the interpreter. Typically this is inline replaced 1352239Smckusic * by interp.sed to utilize specific machine instructions. 1362239Smckusic */ 1372239Smckusic setup(); 1382239Smckusic /* 1392080Smckusick * necessary only on systems which do not initialize 1402080Smckusick * memory to zero 1412080Smckusick */ 1422080Smckusick for (ip = &_actfile[3]; ip < &_actfile[MAXFILES]; *ip++ = FILNIL) 1432080Smckusick /* void */; 1442080Smckusick /* 1452080Smckusick * set up global environment, then ``call'' the main program 1462080Smckusick */ 1472950Smckusic _display.frame[0].locvars = pushsp((long)(2 * sizeof(struct iorec *))); 1482950Smckusic _display.frame[0].locvars += 2 * sizeof(struct iorec *); 1492950Smckusic *(struct iorec **)(_display.frame[0].locvars + OUTPUT_OFF) = OUTPUT; 1502950Smckusic *(struct iorec **)(_display.frame[0].locvars + INPUT_OFF) = INPUT; 1512950Smckusic stp = (struct stack *)pushsp((long)(sizeof(struct stack))); 1522109Smckusic _dp = &_display.frame[0]; 1532080Smckusick pc.cp = base; 1542080Smckusick for(;;) { 1552109Smckusic # ifdef DEBUG 1562080Smckusick if (++opcptr == 10) 1572080Smckusick opcptr = 0; 1582080Smckusick opc[opcptr] = *pc.ucp; 1592109Smckusic # endif DEBUG 1602109Smckusic # ifdef PROFILE 1612109Smckusic _profcnts[*pc.ucp]++; 1622109Smckusic # endif PROFILE 1632080Smckusick switch (*pc.ucp++) { 1642080Smckusick case O_NODUMP: 1652191Smckusic _nodump = TRUE; 1662080Smckusick /* and fall through */ 1672080Smckusick case O_BEG: 1682080Smckusick _dp += 1; /* enter local scope */ 1692080Smckusick stp->odisp = *_dp; /* save old display value */ 1702080Smckusick tl = *pc.ucp++; /* tl = name size */ 1712080Smckusick stp->entry = pc.hdrp; /* pointer to entry info */ 1722191Smckusic tl1 = pc.hdrp->framesze;/* tl1 = size of frame */ 1732191Smckusic _lino = pc.hdrp->offset; 1742191Smckusic _runtst = pc.hdrp->tests; 1752191Smckusic disableovrflo(); 1762191Smckusic if (_runtst) 1772191Smckusic enableovrflo(); 1782950Smckusic pc.cp += (int)tl; /* skip over proc hdr info */ 1792080Smckusick stp->file = curfile; /* save active file */ 1802080Smckusick tcp = pushsp(tl1); /* tcp = new top of stack */ 1812950Smckusic if (_runtst) /* zero stack frame */ 1822950Smckusic blkclr(tl1, tcp); 1832950Smckusic tcp += (int)tl1; /* offsets of locals are neg */ 1842109Smckusic _dp->locvars = tcp; /* set new display pointer */ 1852109Smckusic _dp->stp = stp; 1862950Smckusic stp->tos = pushsp((long)0); /* set tos pointer */ 1872080Smckusick continue; 1882080Smckusick case O_END: 1892080Smckusick PCLOSE(_dp->locvars); /* flush & close local files */ 1902080Smckusick stp = _dp->stp; 1912080Smckusick curfile = stp->file; /* restore old active file */ 1922080Smckusick *_dp = stp->odisp; /* restore old display entry */ 1932109Smckusic if (_dp == &_display.frame[1]) 1942080Smckusick return; /* exiting main proc ??? */ 1952080Smckusick _lino = stp->lino; /* restore lino, pc, dp */ 1962080Smckusick pc.cp = stp->pc.cp; 1972080Smckusick _dp = stp->dp; 1982191Smckusic _runtst = stp->entry->tests; 1992191Smckusic disableovrflo(); 2002191Smckusic if (_runtst) 2012191Smckusic enableovrflo(); 2022109Smckusic popsp(stp->entry->framesze + /* pop local vars */ 2032080Smckusick sizeof(struct stack) + /* pop stack frame */ 2042080Smckusick stp->entry->nargs); /* pop parms */ 2052080Smckusick continue; 2062080Smckusick case O_CALL: 2072080Smckusick tl = *pc.cp++; 2082080Smckusick tcp = base + *pc.lp++;/* calc new entry point */ 2092080Smckusick tcp += sizeof(short); 2102080Smckusick tcp = base + *(long *)tcp; 2112950Smckusic stp = (struct stack *) 2122950Smckusic pushsp((long)(sizeof(struct stack))); 2132080Smckusick stp->lino = _lino; /* save lino, pc, dp */ 2142080Smckusick stp->pc.cp = pc.cp; 2152080Smckusick stp->dp = _dp; 2162109Smckusic _dp = &_display.frame[tl]; /* set up new display ptr */ 2172080Smckusick pc.cp = tcp; 2182080Smckusick continue; 2192080Smckusick case O_FCALL: 2203294Smckusic pc.cp++; 2212080Smckusick tfp = (struct formalrtn *)popaddr(); 2222950Smckusic stp = (struct stack *) 2232950Smckusic pushsp((long)(sizeof(struct stack))); 2242080Smckusick stp->lino = _lino; /* save lino, pc, dp */ 2252080Smckusick stp->pc.cp = pc.cp; 2262080Smckusick stp->dp = _dp; 2273436Smckusic pc.cp = tfp->fentryaddr;/* calc new entry point */ 2283436Smckusic _dp = &_display.frame[tfp->fbn];/* new display ptr */ 2293436Smckusic blkcpy(tfp->fbn * sizeof(struct disp), 230*3861Smckusic &_display.frame[1], &tfp->fdisp[tfp->fbn]); 2313436Smckusic blkcpy(tfp->fbn * sizeof(struct disp), 2323436Smckusic &tfp->fdisp[0], &_display.frame[1]); 2332080Smckusick continue; 2342080Smckusick case O_FRTN: 2352080Smckusick tl = *pc.cp++; /* tl = size of return obj */ 2362080Smckusick if (tl == 0) 2372080Smckusick tl = *pc.usp++; 2382950Smckusic tcp = pushsp((long)(0)); 2392080Smckusick tfp = *(struct formalrtn **)(tcp + tl); 240*3861Smckusic if (tl != 0) { 241*3861Smckusic blkcpy(tl, tcp, 242*3861Smckusic tcp + sizeof(struct formalrtn *)); 243*3861Smckusic } 244*3861Smckusic popsp((long)(sizeof(struct formalrtn *))); 2453436Smckusic blkcpy(tfp->fbn * sizeof(struct disp), 246*3861Smckusic &tfp->fdisp[tfp->fbn], &_display.frame[1]); 2472080Smckusick continue; 2482080Smckusick case O_FSAV: 2492080Smckusick tfp = (struct formalrtn *)popaddr(); 2503436Smckusic tfp->fbn = *pc.cp++; /* blk number of routine */ 251*3861Smckusic tcp = base + *pc.lp++; /* calc new entry point */ 2522080Smckusick tcp += sizeof(short); 2533436Smckusic tfp->fentryaddr = base + *(long *)tcp; 2543436Smckusic blkcpy(tfp->fbn * sizeof(struct disp), 2553436Smckusic &_display.frame[1], &tfp->fdisp[0]); 2562080Smckusick pushaddr(tfp); 2572080Smckusick continue; 2582080Smckusick case O_SDUP2: 2592080Smckusick pc.cp++; 2602080Smckusick tl = pop2(); 2612950Smckusic push2((short)(tl)); 2622950Smckusic push2((short)(tl)); 2632080Smckusick continue; 2642080Smckusick case O_SDUP4: 2652080Smckusick pc.cp++; 2662080Smckusick tl = pop4(); 2672080Smckusick push4(tl); 2682080Smckusick push4(tl); 2692080Smckusick continue; 2702080Smckusick case O_TRA: 2712080Smckusick pc.cp++; 2722080Smckusick pc.cp += *pc.sp; 2732080Smckusick continue; 2742080Smckusick case O_TRA4: 2752080Smckusick pc.cp++; 2762080Smckusick pc.cp = base + *pc.lp; 2772080Smckusick continue; 2782080Smckusick case O_GOTO: 2792109Smckusic tstp = _display.frame[*pc.cp++].stp; /* ptr to 2802109Smckusic exit frame */ 2812080Smckusick pc.cp = base + *pc.lp; 2822080Smckusick stp = _dp->stp; 2832080Smckusick while (tstp != stp) { 2842109Smckusic if (_dp == &_display.frame[1]) 2852080Smckusick ERROR(EGOTO); /* exiting prog ??? */ 2862080Smckusick PCLOSE(_dp->locvars); /* close local files */ 2872080Smckusick curfile = stp->file; /* restore active file */ 2882080Smckusick *_dp = stp->odisp; /* old display entry */ 2892080Smckusick _dp = stp->dp; /* restore dp */ 2902080Smckusick stp = _dp->stp; 2912080Smckusick } 2922080Smckusick /* pop locals, stack frame, parms, and return values */ 2932950Smckusic popsp((long)(stp->tos - pushsp((long)(0)))); 2942080Smckusick continue; 2952080Smckusick case O_LINO: 2962950Smckusic if (_dp->stp->tos != pushsp((long)(0))) 2972080Smckusick panic(PSTKNEMP); 2982080Smckusick _lino = *pc.cp++; /* set line number */ 2992080Smckusick if (_lino == 0) 3002080Smckusick _lino = *pc.sp++; 3012950Smckusic if (_runtst) { 3022950Smckusic LINO(); /* inc statement count */ 3032950Smckusic continue; 3042950Smckusic } 3052950Smckusic _stcnt++; 3062080Smckusick continue; 3072080Smckusick case O_PUSH: 3082080Smckusick tl = *pc.cp++; 3092080Smckusick if (tl == 0) 3102080Smckusick tl = *pc.usp++; 3112080Smckusick tl = (-tl + 1) & ~1; 3122080Smckusick tcp = pushsp(tl); 3132950Smckusic if (_runtst) 3142950Smckusic blkclr(tl, tcp); 3152080Smckusick continue; 3162080Smckusick case O_IF: 3172080Smckusick pc.cp++; 3182191Smckusic if (pop2()) { 3192080Smckusick pc.sp++; 3202191Smckusic continue; 3212191Smckusic } 3222191Smckusic pc.cp += *pc.sp; 3232080Smckusick continue; 3242080Smckusick case O_REL2: 3252080Smckusick tl = pop2(); 3262080Smckusick tl1 = pop2(); 3272080Smckusick goto cmplong; 3282080Smckusick case O_REL24: 3292080Smckusick tl = pop2(); 3302080Smckusick tl1 = pop4(); 3312080Smckusick goto cmplong; 3322080Smckusick case O_REL42: 3332080Smckusick tl = pop4(); 3342080Smckusick tl1 = pop2(); 3352080Smckusick goto cmplong; 3362080Smckusick case O_REL4: 3372080Smckusick tl = pop4(); 3382080Smckusick tl1 = pop4(); 3392080Smckusick cmplong: 3402080Smckusick tl2 = *pc.cp++; 3412080Smckusick switch (tl2) { 3422080Smckusick case releq: 3432080Smckusick push2(tl1 == tl); 3442080Smckusick continue; 3452080Smckusick case relne: 3462080Smckusick push2(tl1 != tl); 3472080Smckusick continue; 3482080Smckusick case rellt: 3492080Smckusick push2(tl1 < tl); 3502080Smckusick continue; 3512080Smckusick case relgt: 3522080Smckusick push2(tl1 > tl); 3532080Smckusick continue; 3542080Smckusick case relle: 3552080Smckusick push2(tl1 <= tl); 3562080Smckusick continue; 3572080Smckusick case relge: 3582080Smckusick push2(tl1 >= tl); 3592080Smckusick continue; 3602080Smckusick default: 3612080Smckusick panic(PSYSTEM); 3622080Smckusick continue; 3632080Smckusick } 3642080Smckusick case O_RELG: 3652080Smckusick tl2 = *pc.cp++; /* tc has jump opcode */ 3662080Smckusick tl = *pc.usp++; /* tl has comparison length */ 3672080Smckusick tl1 = (tl + 1) & ~1; /* tl1 has arg stack length */ 3682950Smckusic tcp = pushsp((long)(0));/* tcp pts to first arg */ 3692080Smckusick switch (tl2) { 3702080Smckusick case releq: 3712950Smckusic tb = RELEQ(tl, tcp + tl1, tcp); 3722080Smckusick break; 3732080Smckusick case relne: 3742950Smckusic tb = RELNE(tl, tcp + tl1, tcp); 3752080Smckusick break; 3762080Smckusick case rellt: 3772950Smckusic tb = RELSLT(tl, tcp + tl1, tcp); 3782080Smckusick break; 3792080Smckusick case relgt: 3802950Smckusic tb = RELSGT(tl, tcp + tl1, tcp); 3812080Smckusick break; 3822080Smckusick case relle: 3832950Smckusic tb = RELSLE(tl, tcp + tl1, tcp); 3842080Smckusick break; 3852080Smckusick case relge: 3862950Smckusic tb = RELSGE(tl, tcp + tl1, tcp); 3872080Smckusick break; 3882080Smckusick default: 3892080Smckusick panic(PSYSTEM); 3902080Smckusick break; 3912080Smckusick } 3922080Smckusick popsp(tl1 << 1); 3932950Smckusic push2((short)(tb)); 3942080Smckusick continue; 3952080Smckusick case O_RELT: 3962080Smckusick tl2 = *pc.cp++; /* tc has jump opcode */ 3972080Smckusick tl1 = *pc.usp++; /* tl1 has comparison length */ 3982950Smckusic tcp = pushsp((long)(0));/* tcp pts to first arg */ 3992080Smckusick switch (tl2) { 4002080Smckusick case releq: 4012950Smckusic tb = RELEQ(tl1, tcp + tl1, tcp); 4022080Smckusick break; 4032080Smckusick case relne: 4042950Smckusic tb = RELNE(tl1, tcp + tl1, tcp); 4052080Smckusick break; 4062080Smckusick case rellt: 4072950Smckusic tb = RELTLT(tl1, tcp + tl1, tcp); 4082080Smckusick break; 4092080Smckusick case relgt: 4102950Smckusic tb = RELTGT(tl1, tcp + tl1, tcp); 4112080Smckusick break; 4122080Smckusick case relle: 4132950Smckusic tb = RELTLE(tl1, tcp + tl1, tcp); 4142080Smckusick break; 4152080Smckusick case relge: 4162950Smckusic tb = RELTGE(tl1, tcp + tl1, tcp); 4172080Smckusick break; 4182080Smckusick default: 4192080Smckusick panic(PSYSTEM); 4202080Smckusick break; 4212080Smckusick } 4222080Smckusick popsp(tl1 << 1); 4232950Smckusic push2((short)(tb)); 4242080Smckusick continue; 4252080Smckusick case O_REL28: 4262080Smckusick td = pop2(); 4272080Smckusick td1 = pop8(); 4282080Smckusick goto cmpdbl; 4292080Smckusick case O_REL48: 4302080Smckusick td = pop4(); 4312080Smckusick td1 = pop8(); 4322080Smckusick goto cmpdbl; 4332080Smckusick case O_REL82: 4342080Smckusick td = pop8(); 4352080Smckusick td1 = pop2(); 4362080Smckusick goto cmpdbl; 4372080Smckusick case O_REL84: 4382080Smckusick td = pop8(); 4392080Smckusick td1 = pop4(); 4402080Smckusick goto cmpdbl; 4412080Smckusick case O_REL8: 4422080Smckusick td = pop8(); 4432080Smckusick td1 = pop8(); 4442080Smckusick cmpdbl: 4452080Smckusick switch (*pc.cp++) { 4462080Smckusick case releq: 4472080Smckusick push2(td1 == td); 4482080Smckusick continue; 4492080Smckusick case relne: 4502080Smckusick push2(td1 != td); 4512080Smckusick continue; 4522080Smckusick case rellt: 4532080Smckusick push2(td1 < td); 4542080Smckusick continue; 4552080Smckusick case relgt: 4562080Smckusick push2(td1 > td); 4572080Smckusick continue; 4582080Smckusick case relle: 4592080Smckusick push2(td1 <= td); 4602080Smckusick continue; 4612080Smckusick case relge: 4622080Smckusick push2(td1 >= td); 4632080Smckusick continue; 4642080Smckusick default: 4652080Smckusick panic(PSYSTEM); 4662080Smckusick continue; 4672080Smckusick } 4682080Smckusick case O_AND: 4692080Smckusick pc.cp++; 4702080Smckusick push2(pop2() & pop2()); 4712080Smckusick continue; 4722080Smckusick case O_OR: 4732080Smckusick pc.cp++; 4742080Smckusick push2(pop2() | pop2()); 4752080Smckusick continue; 4762080Smckusick case O_NOT: 4772080Smckusick pc.cp++; 4782080Smckusick push2(pop2() ^ 1); 4792080Smckusick continue; 4802080Smckusick case O_AS2: 4812080Smckusick pc.cp++; 4822080Smckusick tl = pop2(); 4832080Smckusick *(short *)popaddr() = tl; 4842080Smckusick continue; 4852080Smckusick case O_AS4: 4862080Smckusick pc.cp++; 4872080Smckusick tl = pop4(); 4882080Smckusick *(long *)popaddr() = tl; 4892080Smckusick continue; 4902080Smckusick case O_AS24: 4912080Smckusick pc.cp++; 4922080Smckusick tl = pop2(); 4932080Smckusick *(long *)popaddr() = tl; 4942080Smckusick continue; 4952080Smckusick case O_AS42: 4962080Smckusick pc.cp++; 4972080Smckusick tl = pop4(); 4982080Smckusick *(short *)popaddr() = tl; 4992080Smckusick continue; 5002080Smckusick case O_AS21: 5012080Smckusick pc.cp++; 5022080Smckusick tl = pop2(); 5032080Smckusick *popaddr() = tl; 5042080Smckusick continue; 5052080Smckusick case O_AS41: 5062080Smckusick pc.cp++; 5072080Smckusick tl = pop4(); 5082080Smckusick *popaddr() = tl; 5092080Smckusick continue; 5102080Smckusick case O_AS28: 5112080Smckusick pc.cp++; 5122080Smckusick tl = pop2(); 5132080Smckusick *(double *)popaddr() = tl; 5142080Smckusick continue; 5152080Smckusick case O_AS48: 5162080Smckusick pc.cp++; 5172080Smckusick tl = pop4(); 5182080Smckusick *(double *)popaddr() = tl; 5192080Smckusick continue; 5202080Smckusick case O_AS8: 5212080Smckusick pc.cp++; 5222239Smckusic t8 = popsze8(); 5232239Smckusic *(struct sze8 *)popaddr() = t8; 5242080Smckusick continue; 5252080Smckusick case O_AS: 5262080Smckusick tl = *pc.cp++; 5272080Smckusick if (tl == 0) 5282080Smckusick tl = *pc.usp++; 5292080Smckusick tl1 = (tl + 1) & ~1; 5302950Smckusic tcp = pushsp((long)(0)); 5312080Smckusick blkcpy(tl, tcp, *(char **)(tcp + tl1)); 5322080Smckusick popsp(tl1 + sizeof(char *)); 5332080Smckusick continue; 5342080Smckusick case O_INX2P2: 5352080Smckusick tl = *pc.cp++; /* tl has shift amount */ 5362080Smckusick tl1 = (pop2() - *pc.sp++) << tl; 5372080Smckusick pushaddr(popaddr() + tl1); 5382080Smckusick continue; 5392080Smckusick case O_INX4P2: 5402080Smckusick tl = *pc.cp++; /* tl has shift amount */ 5412080Smckusick tl1 = (pop4() - *pc.sp++) << tl; 5422080Smckusick pushaddr(popaddr() + tl1); 5432080Smckusick continue; 5442080Smckusick case O_INX2: 5452080Smckusick tl = *pc.cp++; /* tl has element size */ 5462080Smckusick if (tl == 0) 5472080Smckusick tl = *pc.usp++; 5482080Smckusick tl1 = pop2(); /* index */ 5492080Smckusick tl2 = *pc.sp++; 5502080Smckusick pushaddr(popaddr() + (tl1 - tl2) * tl); 5512191Smckusic tl = *pc.usp++; 5522191Smckusic if (_runtst) 5532191Smckusic SUBSC(tl1, tl2, tl); /* range check */ 5542080Smckusick continue; 5552080Smckusick case O_INX4: 5562080Smckusick tl = *pc.cp++; /* tl has element size */ 5572080Smckusick if (tl == 0) 5582080Smckusick tl = *pc.usp++; 5592080Smckusick tl1 = pop4(); /* index */ 5602080Smckusick tl2 = *pc.sp++; 5612080Smckusick pushaddr(popaddr() + (tl1 - tl2) * tl); 5622191Smckusic tl = *pc.usp++; 5632191Smckusic if (_runtst) 5642191Smckusic SUBSC(tl1, tl2, tl); /* range check */ 5652080Smckusick continue; 5662080Smckusick case O_OFF: 5672080Smckusick tl = *pc.cp++; 5682080Smckusick if (tl == 0) 5692080Smckusick tl = *pc.usp++; 5702950Smckusic pushaddr(popaddr() + tl); 5712080Smckusick continue; 5722080Smckusick case O_NIL: 5732080Smckusick pc.cp++; 5742080Smckusick NIL(); 5752080Smckusick continue; 5762080Smckusick case O_ADD2: 5772080Smckusick pc.cp++; 5782950Smckusic push4((long)(pop2() + pop2())); 5792080Smckusick continue; 5802080Smckusick case O_ADD4: 5812080Smckusick pc.cp++; 5822080Smckusick push4(pop4() + pop4()); 5832080Smckusick continue; 5842080Smckusick case O_ADD24: 5852080Smckusick pc.cp++; 5862080Smckusick tl = pop2(); 5872080Smckusick push4(pop4() + tl); 5882080Smckusick continue; 5892080Smckusick case O_ADD42: 5902080Smckusick pc.cp++; 5912080Smckusick tl = pop4(); 5922080Smckusick push4(pop2() + tl); 5932080Smckusick continue; 5942080Smckusick case O_ADD28: 5952080Smckusick pc.cp++; 5962080Smckusick tl = pop2(); 5972080Smckusick push8(pop8() + tl); 5982080Smckusick continue; 5992080Smckusick case O_ADD48: 6002080Smckusick pc.cp++; 6012080Smckusick tl = pop4(); 6022080Smckusick push8(pop8() + tl); 6032080Smckusick continue; 6042080Smckusick case O_ADD82: 6052080Smckusick pc.cp++; 6062080Smckusick td = pop8(); 6072080Smckusick push8(pop2() + td); 6082080Smckusick continue; 6092080Smckusick case O_ADD84: 6102080Smckusick pc.cp++; 6112080Smckusick td = pop8(); 6122080Smckusick push8(pop4() + td); 6132080Smckusick continue; 6142080Smckusick case O_SUB2: 6152080Smckusick pc.cp++; 6162080Smckusick tl = pop2(); 6172080Smckusick push4(pop2() - tl); 6182080Smckusick continue; 6192080Smckusick case O_SUB4: 6202080Smckusick pc.cp++; 6212080Smckusick tl = pop4(); 6222080Smckusick push4(pop4() - tl); 6232080Smckusick continue; 6242080Smckusick case O_SUB24: 6252080Smckusick pc.cp++; 6262080Smckusick tl = pop2(); 6272080Smckusick push4(pop4() - tl); 6282080Smckusick continue; 6292080Smckusick case O_SUB42: 6302080Smckusick pc.cp++; 6312080Smckusick tl = pop4(); 6322080Smckusick push4(pop2() - tl); 6332080Smckusick continue; 6342080Smckusick case O_SUB28: 6352080Smckusick pc.cp++; 6362080Smckusick tl = pop2(); 6372080Smckusick push8(pop8() - tl); 6382080Smckusick continue; 6392080Smckusick case O_SUB48: 6402080Smckusick pc.cp++; 6412080Smckusick tl = pop4(); 6422080Smckusick push8(pop8() - tl); 6432080Smckusick continue; 6442080Smckusick case O_SUB82: 6452080Smckusick pc.cp++; 6462080Smckusick td = pop8(); 6472080Smckusick push8(pop2() - td); 6482080Smckusick continue; 6492080Smckusick case O_SUB84: 6502080Smckusick pc.cp++; 6512080Smckusick td = pop8(); 6522080Smckusick push8(pop4() - td); 6532080Smckusick continue; 6542080Smckusick case O_MUL2: 6552080Smckusick pc.cp++; 6562950Smckusic push4((long)(pop2() * pop2())); 6572080Smckusick continue; 6582080Smckusick case O_MUL4: 6592080Smckusick pc.cp++; 6602080Smckusick push4(pop4() * pop4()); 6612080Smckusick continue; 6622080Smckusick case O_MUL24: 6632080Smckusick pc.cp++; 6642080Smckusick tl = pop2(); 6652080Smckusick push4(pop4() * tl); 6662080Smckusick continue; 6672080Smckusick case O_MUL42: 6682080Smckusick pc.cp++; 6692080Smckusick tl = pop4(); 6702080Smckusick push4(pop2() * tl); 6712080Smckusick continue; 6722080Smckusick case O_MUL28: 6732080Smckusick pc.cp++; 6742080Smckusick tl = pop2(); 6752080Smckusick push8(pop8() * tl); 6762080Smckusick continue; 6772080Smckusick case O_MUL48: 6782080Smckusick pc.cp++; 6792080Smckusick tl = pop4(); 6802080Smckusick push8(pop8() * tl); 6812080Smckusick continue; 6822080Smckusick case O_MUL82: 6832080Smckusick pc.cp++; 6842080Smckusick td = pop8(); 6852080Smckusick push8(pop2() * td); 6862080Smckusick continue; 6872080Smckusick case O_MUL84: 6882080Smckusick pc.cp++; 6892080Smckusick td = pop8(); 6902080Smckusick push8(pop4() * td); 6912080Smckusick continue; 6922080Smckusick case O_ABS2: 6932080Smckusick case O_ABS4: 6942080Smckusick pc.cp++; 6952080Smckusick tl = pop4(); 6962080Smckusick push4(tl >= 0 ? tl : -tl); 6972080Smckusick continue; 6982080Smckusick case O_ABS8: 6992080Smckusick pc.cp++; 7002080Smckusick td = pop8(); 7012080Smckusick push8(td >= 0.0 ? td : -td); 7022080Smckusick continue; 7032080Smckusick case O_NEG2: 7042080Smckusick pc.cp++; 7052950Smckusic push4((long)(-pop2())); 7062080Smckusick continue; 7072080Smckusick case O_NEG4: 7082080Smckusick pc.cp++; 7092080Smckusick push4(-pop4()); 7102080Smckusick continue; 7112080Smckusick case O_NEG8: 7122080Smckusick pc.cp++; 7132080Smckusick push8(-pop8()); 7142080Smckusick continue; 7152080Smckusick case O_DIV2: 7162080Smckusick pc.cp++; 7172080Smckusick tl = pop2(); 7182080Smckusick push4(pop2() / tl); 7192080Smckusick continue; 7202080Smckusick case O_DIV4: 7212080Smckusick pc.cp++; 7222080Smckusick tl = pop4(); 7232080Smckusick push4(pop4() / tl); 7242080Smckusick continue; 7252080Smckusick case O_DIV24: 7262080Smckusick pc.cp++; 7272080Smckusick tl = pop2(); 7282080Smckusick push4(pop4() / tl); 7292080Smckusick continue; 7302080Smckusick case O_DIV42: 7312080Smckusick pc.cp++; 7322080Smckusick tl = pop4(); 7332080Smckusick push4(pop2() / tl); 7342080Smckusick continue; 7352080Smckusick case O_MOD2: 7362080Smckusick pc.cp++; 7372080Smckusick tl = pop2(); 7382080Smckusick push4(pop2() % tl); 7392080Smckusick continue; 7402080Smckusick case O_MOD4: 7412080Smckusick pc.cp++; 7422080Smckusick tl = pop4(); 7432080Smckusick push4(pop4() % tl); 7442080Smckusick continue; 7452080Smckusick case O_MOD24: 7462080Smckusick pc.cp++; 7472080Smckusick tl = pop2(); 7482080Smckusick push4(pop4() % tl); 7492080Smckusick continue; 7502080Smckusick case O_MOD42: 7512080Smckusick pc.cp++; 7522080Smckusick tl = pop4(); 7532080Smckusick push4(pop2() % tl); 7542080Smckusick continue; 7552080Smckusick case O_ADD8: 7562080Smckusick pc.cp++; 7572080Smckusick push8(pop8() + pop8()); 7582080Smckusick continue; 7592080Smckusick case O_SUB8: 7602080Smckusick pc.cp++; 7612080Smckusick td = pop8(); 7622080Smckusick push8(pop8() - td); 7632080Smckusick continue; 7642080Smckusick case O_MUL8: 7652080Smckusick pc.cp++; 7662080Smckusick push8(pop8() * pop8()); 7672080Smckusick continue; 7682080Smckusick case O_DVD8: 7692080Smckusick pc.cp++; 7702080Smckusick td = pop8(); 7712080Smckusick push8(pop8() / td); 7722080Smckusick continue; 7732080Smckusick case O_STOI: 7742080Smckusick pc.cp++; 7752950Smckusic push4((long)(pop2())); 7762080Smckusick continue; 7772080Smckusick case O_STOD: 7782080Smckusick pc.cp++; 7792080Smckusick td = pop2(); 7802080Smckusick push8(td); 7812080Smckusick continue; 7822080Smckusick case O_ITOD: 7832080Smckusick pc.cp++; 7842080Smckusick td = pop4(); 7852080Smckusick push8(td); 7862080Smckusick continue; 7872080Smckusick case O_ITOS: 7882080Smckusick pc.cp++; 7892950Smckusic push2((short)(pop4())); 7902080Smckusick continue; 7912080Smckusick case O_DVD2: 7922080Smckusick pc.cp++; 7932080Smckusick td = pop2(); 7942080Smckusick push8(pop2() / td); 7952080Smckusick continue; 7962080Smckusick case O_DVD4: 7972080Smckusick pc.cp++; 7982080Smckusick td = pop4(); 7992080Smckusick push8(pop4() / td); 8002080Smckusick continue; 8012080Smckusick case O_DVD24: 8022080Smckusick pc.cp++; 8032080Smckusick td = pop2(); 8042080Smckusick push8(pop4() / td); 8052080Smckusick continue; 8062080Smckusick case O_DVD42: 8072080Smckusick pc.cp++; 8082080Smckusick td = pop4(); 8092080Smckusick push8(pop2() / td); 8102080Smckusick continue; 8112080Smckusick case O_DVD28: 8122080Smckusick pc.cp++; 8132080Smckusick td = pop2(); 8142080Smckusick push8(pop8() / td); 8152080Smckusick continue; 8162080Smckusick case O_DVD48: 8172080Smckusick pc.cp++; 8182080Smckusick td = pop4(); 8192080Smckusick push8(pop8() / td); 8202080Smckusick continue; 8212080Smckusick case O_DVD82: 8222080Smckusick pc.cp++; 8232080Smckusick td = pop8(); 8242080Smckusick push8(pop2() / td); 8252080Smckusick continue; 8262080Smckusick case O_DVD84: 8272080Smckusick pc.cp++; 8282080Smckusick td = pop8(); 8292080Smckusick push8(pop4() / td); 8302080Smckusick continue; 8312080Smckusick case O_RV1: 8322109Smckusic tcp = _display.raw[*pc.ucp++]; 8332950Smckusic push2((short)(*(tcp + *pc.sp++))); 8342080Smckusick continue; 8352080Smckusick case O_RV14: 8362109Smckusic tcp = _display.raw[*pc.ucp++]; 8372950Smckusic push4((long)(*(tcp + *pc.sp++))); 8382080Smckusick continue; 8392080Smckusick case O_RV2: 8402109Smckusic tcp = _display.raw[*pc.ucp++]; 8412080Smckusick push2(*(short *)(tcp + *pc.sp++)); 8422080Smckusick continue; 8432080Smckusick case O_RV24: 8442109Smckusic tcp = _display.raw[*pc.ucp++]; 8452950Smckusic push4((long)(*(short *)(tcp + *pc.sp++))); 8462080Smckusick continue; 8472080Smckusick case O_RV4: 8482109Smckusic tcp = _display.raw[*pc.ucp++]; 8492080Smckusick push4(*(long *)(tcp + *pc.sp++)); 8502080Smckusick continue; 8512080Smckusick case O_RV8: 8522109Smckusic tcp = _display.raw[*pc.ucp++]; 8532239Smckusic pushsze8(*(struct sze8 *)(tcp + *pc.sp++)); 8542080Smckusick continue; 8552080Smckusick case O_RV: 8562109Smckusic tcp = _display.raw[*pc.ucp++]; 8572080Smckusick tcp += *pc.sp++; 8582080Smckusick tl = *pc.usp++; 8592338Smckusic tcp1 = pushsp((tl + 1) & ~1); 8602080Smckusick blkcpy(tl, tcp, tcp1); 8612080Smckusick continue; 8622080Smckusick case O_LV: 8632109Smckusic tcp = _display.raw[*pc.ucp++]; 8642080Smckusick pushaddr(tcp + *pc.sp++); 8652080Smckusick continue; 8662080Smckusick case O_LRV1: 8672109Smckusic tcp = _display.raw[*pc.ucp++]; 8682950Smckusic push2((short)(*(tcp + *pc.lp++))); 8692080Smckusick continue; 8702080Smckusick case O_LRV14: 8712109Smckusic tcp = _display.raw[*pc.ucp++]; 8722950Smckusic push4((long)(*(tcp + *pc.lp++))); 8732080Smckusick continue; 8742080Smckusick case O_LRV2: 8752109Smckusic tcp = _display.raw[*pc.ucp++]; 8762080Smckusick push2(*(short *)(tcp + *pc.lp++)); 8772080Smckusick continue; 8782080Smckusick case O_LRV24: 8792109Smckusic tcp = _display.raw[*pc.ucp++]; 8802950Smckusic push4((long)(*(short *)(tcp + *pc.lp++))); 8812080Smckusick continue; 8822080Smckusick case O_LRV4: 8832109Smckusic tcp = _display.raw[*pc.ucp++]; 8842080Smckusick push4(*(long *)(tcp + *pc.lp++)); 8852080Smckusick continue; 8862080Smckusick case O_LRV8: 8872109Smckusic tcp = _display.raw[*pc.ucp++]; 8882239Smckusic pushsze8(*(struct sze8 *)(tcp + *pc.lp++)); 8892080Smckusick continue; 8902080Smckusick case O_LRV: 8912109Smckusic tcp = _display.raw[*pc.ucp++]; 8922950Smckusic tcp += (int)*pc.lp++; 8932080Smckusick tl = *pc.usp++; 8942950Smckusic tcp1 = pushsp((tl + 1) & ~1); 8952080Smckusick blkcpy(tl, tcp, tcp1); 8962080Smckusick continue; 8972080Smckusick case O_LLV: 8982109Smckusic tcp = _display.raw[*pc.ucp++]; 8992080Smckusick pushaddr(tcp + *pc.lp++); 9002080Smckusick continue; 9012080Smckusick case O_IND1: 9022080Smckusick pc.cp++; 9032950Smckusic push2((short)(*popaddr())); 9042080Smckusick continue; 9052080Smckusick case O_IND14: 9062080Smckusick pc.cp++; 9072950Smckusic push4((long)(*popaddr())); 9082080Smckusick continue; 9092080Smckusick case O_IND2: 9102080Smckusick pc.cp++; 9112080Smckusick push2(*(short *)(popaddr())); 9122080Smckusick continue; 9132080Smckusick case O_IND24: 9142080Smckusick pc.cp++; 9152950Smckusic push4((long)(*(short *)(popaddr()))); 9162080Smckusick continue; 9172080Smckusick case O_IND4: 9182080Smckusick pc.cp++; 9192080Smckusick push4(*(long *)(popaddr())); 9202080Smckusick continue; 9212080Smckusick case O_IND8: 9222080Smckusick pc.cp++; 9232239Smckusic pushsze8(*(struct sze8 *)(popaddr())); 9242080Smckusick continue; 9252080Smckusick case O_IND: 9262080Smckusick tl = *pc.cp++; 9272080Smckusick if (tl == 0) 9282080Smckusick tl = *pc.usp++; 9292080Smckusick tcp = popaddr(); 9302080Smckusick tcp1 = pushsp((tl + 1) & ~1); 9312080Smckusick blkcpy(tl, tcp, tcp1); 9322080Smckusick continue; 9332080Smckusick case O_CON1: 9342950Smckusic push2((short)(*pc.cp++)); 9352080Smckusick continue; 9362080Smckusick case O_CON14: 9372950Smckusic push4((long)(*pc.cp++)); 9382080Smckusick continue; 9392080Smckusick case O_CON2: 9402080Smckusick pc.cp++; 9412080Smckusick push2(*pc.sp++); 9422080Smckusick continue; 9432080Smckusick case O_CON24: 9442080Smckusick pc.cp++; 9452950Smckusic push4((long)(*pc.sp++)); 9462080Smckusick continue; 9472080Smckusick case O_CON4: 9482080Smckusick pc.cp++; 9492080Smckusick push4(*pc.lp++); 9502080Smckusick continue; 9512080Smckusick case O_CON8: 9522080Smckusick pc.cp++; 9532950Smckusic push8(*pc.dbp++); 9542080Smckusick continue; 9552080Smckusick case O_CON: 9562080Smckusick tl = *pc.cp++; 9572080Smckusick if (tl == 0) 9582080Smckusick tl = *pc.usp++; 9592080Smckusick tl = (tl + 1) & ~1; 9602080Smckusick tcp = pushsp(tl); 9612080Smckusick blkcpy(tl, pc.cp, tcp); 9622950Smckusic pc.cp += (int)tl; 9632080Smckusick continue; 9642950Smckusic case O_CONG: 9652950Smckusic tl = *pc.cp++; 9662950Smckusic if (tl == 0) 9672950Smckusic tl = *pc.usp++; 9682950Smckusic tl1 = (tl + 1) & ~1; 9692950Smckusic tcp = pushsp(tl1); 9702950Smckusic blkcpy(tl1, pc.cp, tcp); 9712950Smckusic pc.cp += (int)((tl + 2) & ~1); 9722950Smckusic continue; 9732080Smckusick case O_LVCON: 9742080Smckusick tl = *pc.cp++; 9752080Smckusick if (tl == 0) 9762080Smckusick tl = *pc.usp++; 9772080Smckusick tl = (tl + 1) & ~1; 9782080Smckusick pushaddr(pc.cp); 9792950Smckusic pc.cp += (int)tl; 9802080Smckusick continue; 9812080Smckusick case O_RANG2: 9822080Smckusick tl = *pc.cp++; 9832080Smckusick if (tl == 0) 9842080Smckusick tl = *pc.sp++; 9852080Smckusick tl1 = pop2(); 9862950Smckusic push2((short)(RANG4(tl1, tl, *pc.sp++))); 9872080Smckusick continue; 9882080Smckusick case O_RANG42: 9892080Smckusick tl = *pc.cp++; 9902080Smckusick if (tl == 0) 9912080Smckusick tl = *pc.sp++; 9922080Smckusick tl1 = pop4(); 9932080Smckusick push4(RANG4(tl1, tl, *pc.sp++)); 9942080Smckusick continue; 9952080Smckusick case O_RSNG2: 9962080Smckusick tl = *pc.cp++; 9972080Smckusick if (tl == 0) 9982080Smckusick tl = *pc.sp++; 9992080Smckusick tl1 = pop2(); 10002950Smckusic push2((short)(RSNG4(tl1, tl))); 10012080Smckusick continue; 10022080Smckusick case O_RSNG42: 10032080Smckusick tl = *pc.cp++; 10042080Smckusick if (tl == 0) 10052080Smckusick tl = *pc.sp++; 10062080Smckusick tl1 = pop4(); 10072080Smckusick push4(RSNG4(tl1, tl)); 10082080Smckusick continue; 10092080Smckusick case O_RANG4: 10102080Smckusick pc.cp++; 10112080Smckusick tl = *pc.lp++; 10122080Smckusick tl1 = pop4(); 10132080Smckusick push4(RANG4(tl1, tl, *pc.lp++)); 10142080Smckusick continue; 10152080Smckusick case O_RANG24: 10162080Smckusick pc.cp++; 10172080Smckusick tl = *pc.lp++; 10182080Smckusick tl1 = pop2(); 10192950Smckusic push2((short)(RANG4(tl1, tl, *pc.lp++))); 10202080Smckusick continue; 10212080Smckusick case O_RSNG4: 10222080Smckusick pc.cp++; 10232080Smckusick tl = pop4(); 10242080Smckusick push4(RSNG4(tl, *pc.lp++)); 10252080Smckusick continue; 10262080Smckusick case O_RSNG24: 10272080Smckusick pc.cp++; 10282080Smckusick tl = pop2(); 10292950Smckusic push2((short)(RSNG4(tl, *pc.lp++))); 10302080Smckusick continue; 10312080Smckusick case O_STLIM: 10322080Smckusick pc.cp++; 10332121Smckusic STLIM(); 10342950Smckusic popsp((long)(sizeof(long))); 10352080Smckusick continue; 10362080Smckusick case O_LLIMIT: 10372080Smckusick pc.cp++; 10382080Smckusick LLIMIT(); 10392950Smckusic popsp((long)(sizeof(char *)+sizeof(long))); 10402080Smckusick continue; 10412080Smckusick case O_BUFF: 10422950Smckusic BUFF((long)(*pc.cp++)); 10432080Smckusick continue; 10442080Smckusick case O_HALT: 10452080Smckusick pc.cp++; 10462080Smckusick panic(PHALT); 10472080Smckusick continue; 10482080Smckusick case O_PXPBUF: 10492080Smckusick pc.cp++; 10502080Smckusick _cntrs = *pc.lp++; 10512080Smckusick _rtns = *pc.lp++; 10522950Smckusic NEWZ(&_pcpcount, (_cntrs + 1) * sizeof(long)); 10532080Smckusick continue; 10542080Smckusick case O_COUNT: 10552080Smckusick pc.cp++; 10562080Smckusick _pcpcount[*pc.usp++]++; 10572080Smckusick continue; 10582080Smckusick case O_CASE1OP: 10592080Smckusick tl = *pc.cp++; /* tl = number of cases */ 10602080Smckusick if (tl == 0) 10612080Smckusick tl = *pc.usp++; 10622080Smckusick tsp = pc.sp + tl; /* ptr to end of jump table */ 10632080Smckusick tcp = (char *)tsp; /* tcp = ptr to case values */ 10642080Smckusick tl1 = pop2(); /* tl1 = element to find */ 10652080Smckusick for(; tl > 0; tl--) /* look for element */ 10662080Smckusick if (tl1 == *tcp++) 10672080Smckusick break; 10682080Smckusick if (tl == 0) /* default case => error */ 10692231Smckusic ERROR(ECASE, tl1); 10702080Smckusick pc.cp += *(tsp - tl); 10712080Smckusick continue; 10722080Smckusick case O_CASE2OP: 10732080Smckusick tl = *pc.cp++; /* tl = number of cases */ 10742080Smckusick if (tl == 0) 10752080Smckusick tl = *pc.usp++; 10762080Smckusick tsp = pc.sp + tl; /* ptr to end of jump table */ 10772080Smckusick tsp1 = tsp; /* tsp1 = ptr to case values */ 10782080Smckusick tl1 = (unsigned short)pop2();/* tl1 = element to find */ 10792080Smckusick for(; tl > 0; tl--) /* look for element */ 10802080Smckusick if (tl1 == *tsp1++) 10812080Smckusick break; 10822080Smckusick if (tl == 0) /* default case => error */ 10832231Smckusic ERROR(ECASE, tl1); 10842080Smckusick pc.cp += *(tsp - tl); 10852080Smckusick continue; 10862080Smckusick case O_CASE4OP: 10872080Smckusick tl = *pc.cp++; /* tl = number of cases */ 10882080Smckusick if (tl == 0) 10892080Smckusick tl = *pc.usp++; 10902080Smckusick tsp = pc.sp + tl; /* ptr to end of jump table */ 10912080Smckusick tlp = (long *)tsp; /* tlp = ptr to case values */ 10922080Smckusick tl1 = pop4(); /* tl1 = element to find */ 10932080Smckusick for(; tl > 0; tl--) /* look for element */ 10942080Smckusick if (tl1 == *tlp++) 10952080Smckusick break; 10962080Smckusick if (tl == 0) /* default case => error */ 10972231Smckusic ERROR(ECASE, tl1); 10982080Smckusick pc.cp += *(tsp - tl); 10992080Smckusick continue; 11002080Smckusick case O_ADDT: 11012080Smckusick tl = *pc.cp++; /* tl has comparison length */ 11022080Smckusick if (tl == 0) 11032080Smckusick tl = *pc.usp++; 11042950Smckusic tcp = pushsp((long)(0));/* tcp pts to first arg */ 11052080Smckusick ADDT(tcp + tl, tcp + tl, tcp, tl >> 2); 11062080Smckusick popsp(tl); 11072080Smckusick continue; 11082080Smckusick case O_SUBT: 11092080Smckusick tl = *pc.cp++; /* tl has comparison length */ 11102080Smckusick if (tl == 0) 11112080Smckusick tl = *pc.usp++; 11122950Smckusic tcp = pushsp((long)(0));/* tcp pts to first arg */ 11132080Smckusick SUBT(tcp + tl, tcp + tl, tcp, tl >> 2); 11142080Smckusick popsp(tl); 11152080Smckusick continue; 11162080Smckusick case O_MULT: 11172080Smckusick tl = *pc.cp++; /* tl has comparison length */ 11182080Smckusick if (tl == 0) 11192080Smckusick tl = *pc.usp++; 11202950Smckusic tcp = pushsp((long)(0));/* tcp pts to first arg */ 11212080Smckusick MULT(tcp + tl, tcp + tl, tcp, tl >> 2); 11222080Smckusick popsp(tl); 11232080Smckusick continue; 11242080Smckusick case O_INCT: 11252080Smckusick tl = *pc.cp++; /* tl has number of args */ 11262080Smckusick if (tl == 0) 11272080Smckusick tl = *pc.usp++; 11282950Smckusic tb = INCT(); 11292950Smckusic popsp(tl*sizeof(long)); 11302950Smckusic push2((short)(tb)); 11312080Smckusick continue; 11322080Smckusick case O_CTTOT: 11332080Smckusick tl = *pc.cp++; /* tl has number of args */ 11342080Smckusick if (tl == 0) 11352080Smckusick tl = *pc.usp++; 11362080Smckusick tl1 = tl * sizeof(long); 11372950Smckusic tcp = pushsp((long)(0)) + tl1; /* tcp pts to result */ 11382080Smckusick CTTOT(tcp); 11392950Smckusic popsp(tl*sizeof(long)); 11402080Smckusick continue; 11412080Smckusick case O_CARD: 11422080Smckusick tl = *pc.cp++; /* tl has comparison length */ 11432080Smckusick if (tl == 0) 11442080Smckusick tl = *pc.usp++; 11452950Smckusic tcp = pushsp((long)(0));/* tcp pts to set */ 11462080Smckusick tl1 = CARD(tcp, tl); 11472080Smckusick popsp(tl); 11482950Smckusic push2((short)(tl1)); 11492080Smckusick continue; 11502080Smckusick case O_IN: 11512080Smckusick tl = *pc.cp++; /* tl has comparison length */ 11522080Smckusick if (tl == 0) 11532080Smckusick tl = *pc.usp++; 11542080Smckusick tl1 = pop4(); /* tl1 is the element */ 11552950Smckusic tcp = pushsp((long)(0));/* tcp pts to set */ 11562080Smckusick tl2 = *pc.usp++; /* lower bound */ 11572950Smckusic tb = IN(tl1, tl2, (long)(*pc.usp++), tcp); 11582080Smckusick popsp(tl); 11592950Smckusic push2((short)(tb)); 11602080Smckusick continue; 11612080Smckusick case O_ASRT: 11622080Smckusick pc.cp++; 11632950Smckusic ts = pop2(); 11642950Smckusic ASRT(ts, ""); 11652080Smckusick continue; 11662080Smckusick case O_FOR1U: 11672080Smckusick pc.cp++; 11682950Smckusic tcp = popaddr(); /* tcp = ptr to index var */ 11692080Smckusick if (*tcp < pop4()) { /* still going up */ 11702191Smckusic tl = *tcp + 1; /* inc index var */ 11712191Smckusic tl1 = *pc.sp++; /* index lower bound */ 11722191Smckusic tl2 = *pc.sp++; /* index upper bound */ 11732191Smckusic if (_runtst) 11742191Smckusic RANG4(tl, tl1, tl2); 11752191Smckusic *tcp = tl; /* update index var */ 11762080Smckusick pc.cp += *pc.sp;/* return to top of loop */ 11772080Smckusick continue; 11782080Smckusick } 11792191Smckusic pc.sp += 3; /* else fall through */ 11802080Smckusick continue; 11812080Smckusick case O_FOR2U: 11822080Smckusick pc.cp++; 11832950Smckusic tsp = (short *)popaddr(); /* tsp = ptr to index var */ 11842080Smckusick if (*tsp < pop4()) { /* still going up */ 11852191Smckusic tl = *tsp + 1; /* inc index var */ 11862191Smckusic tl1 = *pc.sp++; /* index lower bound */ 11872191Smckusic tl2 = *pc.sp++; /* index upper bound */ 11882191Smckusic if (_runtst) 11892191Smckusic RANG4(tl, tl1, tl2); 11902191Smckusic *tsp = tl; /* update index var */ 11912080Smckusick pc.cp += *pc.sp;/* return to top of loop */ 11922080Smckusick continue; 11932080Smckusick } 11942191Smckusic pc.sp += 3; /* else fall through */ 11952080Smckusick continue; 11962080Smckusick case O_FOR4U: 11972080Smckusick pc.cp++; 11982950Smckusic tlp = (long *)popaddr(); /* tlp = ptr to index var */ 11992080Smckusick if (*tlp < pop4()) { /* still going up */ 12002191Smckusic tl = *tlp + 1; /* inc index var */ 12012191Smckusic tl1 = *pc.lp++; /* index lower bound */ 12022191Smckusic tl2 = *pc.lp++; /* index upper bound */ 12032191Smckusic if (_runtst) 12042191Smckusic RANG4(tl, tl1, tl2); 12052191Smckusic *tlp = tl; /* update index var */ 12062080Smckusick pc.cp += *pc.sp;/* return to top of loop */ 12072080Smckusick continue; 12082080Smckusick } 12092191Smckusic pc.sp += 5; /* else fall through */ 12102080Smckusick continue; 12112080Smckusick case O_FOR1D: 12122080Smckusick pc.cp++; 12132950Smckusic tcp = popaddr(); /* tcp = ptr to index var */ 12142080Smckusick if (*tcp > pop4()) { /* still going down */ 12152191Smckusic tl = *tcp - 1; /* inc index var */ 12162191Smckusic tl1 = *pc.sp++; /* index lower bound */ 12172191Smckusic tl2 = *pc.sp++; /* index upper bound */ 12182191Smckusic if (_runtst) 12192191Smckusic RANG4(tl, tl1, tl2); 12202191Smckusic *tcp = tl; /* update index var */ 12212080Smckusick pc.cp += *pc.sp;/* return to top of loop */ 12222080Smckusick continue; 12232080Smckusick } 12242191Smckusic pc.sp += 3; /* else fall through */ 12252080Smckusick continue; 12262080Smckusick case O_FOR2D: 12272080Smckusick pc.cp++; 12282950Smckusic tsp = (short *)popaddr(); /* tsp = ptr to index var */ 12292080Smckusick if (*tsp > pop4()) { /* still going down */ 12302191Smckusic tl = *tsp - 1; /* inc index var */ 12312191Smckusic tl1 = *pc.sp++; /* index lower bound */ 12322191Smckusic tl2 = *pc.sp++; /* index upper bound */ 12332191Smckusic if (_runtst) 12342191Smckusic RANG4(tl, tl1, tl2); 12352191Smckusic *tsp = tl; /* update index var */ 12362080Smckusick pc.cp += *pc.sp;/* return to top of loop */ 12372080Smckusick continue; 12382080Smckusick } 12392191Smckusic pc.sp += 3; /* else fall through */ 12402080Smckusick continue; 12412080Smckusick case O_FOR4D: 12422080Smckusick pc.cp++; 12432950Smckusic tlp = (long *)popaddr(); /* tlp = ptr to index var */ 12442080Smckusick if (*tlp > pop4()) { /* still going down */ 12452191Smckusic tl = *tlp - 1; /* inc index var */ 12462191Smckusic tl1 = *pc.lp++; /* index lower bound */ 12472191Smckusic tl2 = *pc.lp++; /* index upper bound */ 12482191Smckusic if (_runtst) 12492191Smckusic RANG4(tl, tl1, tl2); 12502191Smckusic *tlp = tl; /* update index var */ 12512080Smckusick pc.cp += *pc.sp;/* return to top of loop */ 12522080Smckusick continue; 12532080Smckusick } 12542191Smckusic pc.sp += 5; /* else fall through */ 12552080Smckusick continue; 12562080Smckusick case O_READE: 12572080Smckusick pc.cp++; 12582950Smckusic push2((short)(READE(curfile, base + *pc.lp++))); 12592080Smckusick continue; 12602080Smckusick case O_READ4: 12612080Smckusick pc.cp++; 12622080Smckusick push4(READ4(curfile)); 12632080Smckusick continue; 12642080Smckusick case O_READC: 12652080Smckusick pc.cp++; 12662950Smckusic push2((short)(READC(curfile))); 12672080Smckusick continue; 12682080Smckusick case O_READ8: 12692080Smckusick pc.cp++; 12702080Smckusick push8(READ8(curfile)); 12712080Smckusick continue; 12722080Smckusick case O_READLN: 12732080Smckusick pc.cp++; 12742080Smckusick READLN(curfile); 12752080Smckusick continue; 12762080Smckusick case O_EOF: 12772080Smckusick pc.cp++; 12782950Smckusic push2((short)(TEOF(popaddr()))); 12792080Smckusick continue; 12802080Smckusick case O_EOLN: 12812080Smckusick pc.cp++; 12822950Smckusic push2((short)(TEOLN(popaddr()))); 12832080Smckusick continue; 12842080Smckusick case O_WRITEC: 12852191Smckusic if (_runtst) { 12862191Smckusic WRITEC(curfile); 12873166Smckusic popsp((long)(*pc.cp++)); 12882191Smckusic continue; 12892191Smckusic } 12902191Smckusic fputc(); 12913166Smckusic popsp((long)(*pc.cp++)); 12922080Smckusick continue; 12932080Smckusick case O_WRITES: 12942191Smckusic if (_runtst) { 12952191Smckusic WRITES(curfile); 12963166Smckusic popsp((long)(*pc.cp++)); 12972191Smckusic continue; 12982191Smckusic } 12992191Smckusic fwrite(); 13003166Smckusic popsp((long)(*pc.cp++)); 13012080Smckusick continue; 13022080Smckusick case O_WRITEF: 13032191Smckusic if (_runtst) { 13042191Smckusic WRITEF(curfile); 13053166Smckusic popsp((long)(*pc.cp++)); 13062191Smckusic continue; 13072191Smckusic } 13082191Smckusic fprintf(); 13093166Smckusic popsp((long)(*pc.cp++)); 13102080Smckusick continue; 13112080Smckusick case O_WRITLN: 13122080Smckusick pc.cp++; 13132191Smckusic if (_runtst) { 13142191Smckusic WRITLN(curfile); 13152191Smckusic continue; 13162191Smckusic } 13172191Smckusic fputc('\n', ACTFILE(curfile)); 13182080Smckusick continue; 13192080Smckusick case O_PAGE: 13202080Smckusick pc.cp++; 13212191Smckusic if (_runtst) { 13222191Smckusic PAGE(curfile); 13232191Smckusic continue; 13242191Smckusic } 13252950Smckusic fputc('', ACTFILE(curfile)); 13262080Smckusick continue; 13272080Smckusick case O_NAM: 13282080Smckusick pc.cp++; 13292080Smckusick tl = pop4(); 13302080Smckusick pushaddr(NAM(tl, base + *pc.lp++)); 13312080Smckusick continue; 13322080Smckusick case O_MAX: 13332080Smckusick tl = *pc.cp++; 13342080Smckusick if (tl == 0) 13352080Smckusick tl = *pc.usp++; 13362080Smckusick tl1 = pop4(); 13372191Smckusic if (_runtst) { 13382950Smckusic push4(MAX(tl1, tl, (long)(*pc.usp++))); 13392191Smckusic continue; 13402191Smckusic } 13412191Smckusic tl1 -= tl; 13422191Smckusic tl = *pc.usp++; 13432191Smckusic push4(tl1 > tl ? tl1 : tl); 13442080Smckusick continue; 13452080Smckusick case O_MIN: 13462080Smckusick tl = *pc.cp++; 13472080Smckusick if (tl == 0) 13482080Smckusick tl = *pc.usp++; 13492080Smckusick tl1 = pop4(); 13502080Smckusick push4(tl1 < tl ? tl1 : tl); 13512080Smckusick continue; 13522080Smckusick case O_UNIT: 13532080Smckusick pc.cp++; 13542080Smckusick curfile = UNIT(popaddr()); 13552080Smckusick continue; 13562080Smckusick case O_UNITINP: 13572080Smckusick pc.cp++; 13582080Smckusick curfile = INPUT; 13592080Smckusick continue; 13602080Smckusick case O_UNITOUT: 13612080Smckusick pc.cp++; 13622080Smckusick curfile = OUTPUT; 13632080Smckusick continue; 13642080Smckusick case O_MESSAGE: 13652080Smckusick pc.cp++; 13662080Smckusick PFLUSH(); 13672080Smckusick curfile = ERR; 13682080Smckusick continue; 13692109Smckusic case O_PUT: 13702109Smckusic pc.cp++; 13712109Smckusic PUT(curfile); 13722109Smckusic continue; 13732080Smckusick case O_GET: 13742080Smckusick pc.cp++; 13752080Smckusick GET(curfile); 13762080Smckusick continue; 13772080Smckusick case O_FNIL: 13782080Smckusick pc.cp++; 13792080Smckusick pushaddr(FNIL(popaddr())); 13802080Smckusick continue; 13812080Smckusick case O_DEFNAME: 13822080Smckusick pc.cp++; 13832080Smckusick DEFNAME(); 13842950Smckusic popsp((long)(2*sizeof(char *)+2*sizeof(long))); 13852080Smckusick continue; 13862080Smckusick case O_RESET: 13872080Smckusick pc.cp++; 13882080Smckusick RESET(); 13892950Smckusic popsp((long)(2*sizeof(char *)+2*sizeof(long))); 13902080Smckusick continue; 13912080Smckusick case O_REWRITE: 13922080Smckusick pc.cp++; 13932080Smckusick REWRITE(); 13942950Smckusic popsp((long)(2*sizeof(char *)+2*sizeof(long))); 13952080Smckusick continue; 13962080Smckusick case O_FILE: 13972080Smckusick pc.cp++; 13982080Smckusick pushaddr(ACTFILE(curfile)); 13992080Smckusick continue; 14002080Smckusick case O_REMOVE: 14012080Smckusick pc.cp++; 14022080Smckusick REMOVE(); 14032950Smckusic popsp((long)(sizeof(char *)+sizeof(long))); 14042080Smckusick continue; 14052080Smckusick case O_FLUSH: 14062080Smckusick pc.cp++; 14072080Smckusick FLUSH(); 14082950Smckusic popsp((long)(sizeof(char *))); 14092080Smckusick continue; 14102080Smckusick case O_PACK: 14112080Smckusick pc.cp++; 14122080Smckusick PACK(); 14132950Smckusic popsp((long)(5*sizeof(long)+2*sizeof(char*))); 14142080Smckusick continue; 14152080Smckusick case O_UNPACK: 14162080Smckusick pc.cp++; 14172080Smckusick UNPACK(); 14182950Smckusic popsp((long)(5*sizeof(long)+2*sizeof(char*))); 14192080Smckusick continue; 14202080Smckusick case O_ARGC: 14212080Smckusick pc.cp++; 14222950Smckusic push4((long)_argc); 14232080Smckusick continue; 14242080Smckusick case O_ARGV: 14252080Smckusick tl = *pc.cp++; /* tl = size of char array */ 14262080Smckusick if (tl == 0) 14272080Smckusick tl = *pc.usp++; 14282080Smckusick tcp = popaddr(); /* tcp = addr of char array */ 14292080Smckusick tl1 = pop4(); /* tl1 = argv subscript */ 14302080Smckusick ARGV(tl1, tcp, tl); 14312080Smckusick continue; 14322080Smckusick case O_CLCK: 14332080Smckusick pc.cp++; 14342080Smckusick push4(CLCK()); 14352080Smckusick continue; 14362080Smckusick case O_WCLCK: 14372080Smckusick pc.cp++; 14382080Smckusick push4(time(0)); 14392080Smckusick continue; 14402080Smckusick case O_SCLCK: 14412080Smckusick pc.cp++; 14422080Smckusick push4(SCLCK()); 14432080Smckusick continue; 14442080Smckusick case O_DISPOSE: 14452080Smckusick tl = *pc.cp++; /* tl = size being disposed */ 14462080Smckusick if (tl == 0) 14472080Smckusick tl = *pc.usp++; 14482080Smckusick tcp = popaddr(); /* ptr to ptr being disposed */ 14492080Smckusick DISPOSE(tcp, tl); 14502080Smckusick *(char **)tcp = (char *)0; 14512080Smckusick continue; 14522080Smckusick case O_NEW: 14532080Smckusick tl = *pc.cp++; /* tl = size being new'ed */ 14542080Smckusick if (tl == 0) 14552080Smckusick tl = *pc.usp++; 14562080Smckusick tcp = popaddr(); /* ptr to ptr being new'ed */ 14572191Smckusic if (_runtst) { 14582191Smckusic NEWZ(tcp, tl); 14592191Smckusic continue; 14602191Smckusic } 14612191Smckusic NEW(tcp, tl); 14622080Smckusick continue; 14632080Smckusick case O_DATE: 14642080Smckusick pc.cp++; 14652080Smckusick DATE(popaddr()); 14662080Smckusick continue; 14672080Smckusick case O_TIME: 14682080Smckusick pc.cp++; 14692080Smckusick TIME(popaddr()); 14702080Smckusick continue; 14712080Smckusick case O_UNDEF: 14722080Smckusick pc.cp++; 14732080Smckusick pop8(); 14742950Smckusic push2((short)(0)); 14752080Smckusick continue; 14762080Smckusick case O_ATAN: 14772080Smckusick pc.cp++; 14782080Smckusick push8(atan(pop8())); 14792080Smckusick continue; 14802080Smckusick case O_COS: 14812080Smckusick pc.cp++; 14822080Smckusick push8(cos(pop8())); 14832080Smckusick continue; 14842080Smckusick case O_EXP: 14852080Smckusick pc.cp++; 14862080Smckusick push8(exp(pop8())); 14872080Smckusick continue; 14882080Smckusick case O_LN: 14892080Smckusick pc.cp++; 14902191Smckusic if (_runtst) { 14912191Smckusic push8(LN(pop8())); 14922191Smckusic continue; 14932191Smckusic } 14942191Smckusic push8(log(pop8())); 14952080Smckusick continue; 14962080Smckusick case O_SIN: 14972080Smckusick pc.cp++; 14982080Smckusick push8(sin(pop8())); 14992080Smckusick continue; 15002080Smckusick case O_SQRT: 15012080Smckusick pc.cp++; 15022191Smckusic if (_runtst) { 15032191Smckusic push8(SQRT(pop8())); 15042191Smckusic continue; 15052191Smckusic } 15062191Smckusic push8(sqrt(pop8())); 15072080Smckusick continue; 15082080Smckusick case O_CHR2: 15092080Smckusick case O_CHR4: 15102080Smckusick pc.cp++; 15112191Smckusic if (_runtst) { 15122950Smckusic push2((short)(CHR(pop4()))); 15132191Smckusic continue; 15142191Smckusic } 15152950Smckusic push2((short)(pop4())); 15162080Smckusick continue; 15172080Smckusick case O_ODD2: 15182080Smckusick case O_ODD4: 15192080Smckusick pc.cp++; 15202950Smckusic push2((short)(pop4() & 1)); 15212080Smckusick continue; 15222080Smckusick case O_SUCC2: 15232109Smckusic tl = *pc.cp++; 15242109Smckusic if (tl == 0) 15252109Smckusic tl = *pc.sp++; 15262109Smckusic tl1 = pop4(); 15272191Smckusic if (_runtst) { 15282950Smckusic push2((short)(SUCC(tl1, tl, (long)(*pc.sp++)))); 15292191Smckusic continue; 15302191Smckusic } 15312950Smckusic push2((short)(tl1 + 1)); 15322191Smckusic pc.sp++; 15332080Smckusick continue; 15342080Smckusick case O_SUCC24: 15352109Smckusic tl = *pc.cp++; 15362109Smckusic if (tl == 0) 15372109Smckusic tl = *pc.sp++; 15382109Smckusic tl1 = pop4(); 15392191Smckusic if (_runtst) { 15402950Smckusic push4(SUCC(tl1, tl, (long)(*pc.sp++))); 15412191Smckusic continue; 15422191Smckusic } 15432191Smckusic push4(tl1 + 1); 15442191Smckusic pc.sp++; 15452109Smckusic continue; 15462080Smckusick case O_SUCC4: 15472109Smckusic tl = *pc.cp++; 15482109Smckusic if (tl == 0) 15492109Smckusic tl = *pc.lp++; 15502109Smckusic tl1 = pop4(); 15512191Smckusic if (_runtst) { 15522950Smckusic push4(SUCC(tl1, tl, (long)(*pc.lp++))); 15532191Smckusic continue; 15542191Smckusic } 15552191Smckusic push4(tl1 + 1); 15562191Smckusic pc.lp++; 15572080Smckusick continue; 15582080Smckusick case O_PRED2: 15592109Smckusic tl = *pc.cp++; 15602109Smckusic if (tl == 0) 15612109Smckusic tl = *pc.sp++; 15622109Smckusic tl1 = pop4(); 15632191Smckusic if (_runtst) { 15642950Smckusic push2((short)(PRED(tl1, tl, (long)(*pc.sp++)))); 15652191Smckusic continue; 15662191Smckusic } 15672950Smckusic push2((short)(tl1 - 1)); 15682191Smckusic pc.sp++; 15692080Smckusick continue; 15702080Smckusick case O_PRED24: 15712109Smckusic tl = *pc.cp++; 15722109Smckusic if (tl == 0) 15732109Smckusic tl = *pc.sp++; 15742109Smckusic tl1 = pop4(); 15752191Smckusic if (_runtst) { 15762950Smckusic push4(PRED(tl1, tl, (long)(*pc.sp++))); 15772191Smckusic continue; 15782191Smckusic } 15792191Smckusic push4(tl1 - 1); 15802191Smckusic pc.sp++; 15812109Smckusic continue; 15822080Smckusick case O_PRED4: 15832109Smckusic tl = *pc.cp++; 15842109Smckusic if (tl == 0) 15852109Smckusic tl = *pc.lp++; 15862109Smckusic tl1 = pop4(); 15872191Smckusic if (_runtst) { 15882950Smckusic push4(PRED(tl1, tl, (long)(*pc.lp++))); 15892191Smckusic continue; 15902191Smckusic } 15912191Smckusic push4(tl1 - 1); 15922191Smckusic pc.lp++; 15932080Smckusick continue; 15942080Smckusick case O_SEED: 15952080Smckusick pc.cp++; 15962080Smckusick push4(SEED(pop4())); 15972080Smckusick continue; 15982080Smckusick case O_RANDOM: 15992080Smckusick pc.cp++; 16002080Smckusick push8(RANDOM(pop8())); 16012080Smckusick continue; 16022080Smckusick case O_EXPO: 16032080Smckusick pc.cp++; 16042080Smckusick push4(EXPO(pop8())); 16052080Smckusick continue; 16062080Smckusick case O_SQR2: 16072080Smckusick case O_SQR4: 16082080Smckusick pc.cp++; 16092080Smckusick tl = pop4(); 16102080Smckusick push4(tl * tl); 16112080Smckusick continue; 16122080Smckusick case O_SQR8: 16132080Smckusick pc.cp++; 16142080Smckusick td = pop8(); 16152080Smckusick push8(td * td); 16162080Smckusick continue; 16172080Smckusick case O_ROUND: 16182080Smckusick pc.cp++; 16192080Smckusick push4(ROUND(pop8())); 16202080Smckusick continue; 16212080Smckusick case O_TRUNC: 16222080Smckusick pc.cp++; 16232080Smckusick push4(TRUNC(pop8())); 16242080Smckusick continue; 16252950Smckusic default: 16262950Smckusic panic(PBADOP); 16272950Smckusic continue; 16282080Smckusick } 16292080Smckusick } 16302080Smckusick } 1631