12080Smckusick /* Copyright (c) 1979 Regents of the University of California */ 22080Smckusick 3*3872Smckusic static char sccsid[] = "@(#)interp.c 1.14 06/10/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 "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 /* 942109Smckusic * Px profile array 952109Smckusic */ 962109Smckusic #ifdef PROFILE 972109Smckusic long _profcnts[NUMOPS]; 982109Smckusic #endif PROFILE 992109Smckusic 1002109Smckusic /* 1012109Smckusic * debugging variables 1022109Smckusic */ 1032109Smckusic #ifdef DEBUG 1042109Smckusic char opc[10]; 1052109Smckusic long opcptr = 9; 1062109Smckusic #endif DEBUG 1072109Smckusic 1082080Smckusick interpreter(base) 1092080Smckusick char *base; 1102080Smckusick { 1112080Smckusick union progcntr pc; /* interpreted program cntr */ 1122080Smckusick register char *vpc; /* register used for "pc" */ 1132080Smckusick struct iorec *curfile; /* active file */ 1142080Smckusick register struct stack *stp; /* active stack frame ptr */ 1152080Smckusick /* 1162080Smckusick * the following variables are used as scratch 1172080Smckusick */ 1182239Smckusic register char *tcp; 1192239Smckusic register long tl, tl1, tl2; 1202080Smckusick double td, td1; 1212239Smckusic struct sze8 t8; 1222080Smckusick long *tlp; 1232950Smckusic register short *tsp, *tsp1, ts; 1242950Smckusic bool tb; 1252080Smckusick char *tcp1; 1262080Smckusick struct stack *tstp; 1272080Smckusick struct formalrtn *tfp; 1282080Smckusick union progcntr tpc; 1292080Smckusick struct iorec **ip; 1302080Smckusick 1312080Smckusick /* 1322239Smckusic * Setup sets up any hardware specific parameters before 1332239Smckusic * starting the interpreter. Typically this is inline replaced 1342239Smckusic * by interp.sed to utilize specific machine instructions. 1352239Smckusic */ 1362239Smckusic setup(); 1372239Smckusic /* 1382080Smckusick * necessary only on systems which do not initialize 1392080Smckusick * memory to zero 1402080Smckusick */ 1412080Smckusick for (ip = &_actfile[3]; ip < &_actfile[MAXFILES]; *ip++ = FILNIL) 1422080Smckusick /* void */; 1432080Smckusick /* 1442080Smckusick * set up global environment, then ``call'' the main program 1452080Smckusick */ 1462950Smckusic _display.frame[0].locvars = pushsp((long)(2 * sizeof(struct iorec *))); 1472950Smckusic _display.frame[0].locvars += 2 * sizeof(struct iorec *); 1482950Smckusic *(struct iorec **)(_display.frame[0].locvars + OUTPUT_OFF) = OUTPUT; 1492950Smckusic *(struct iorec **)(_display.frame[0].locvars + INPUT_OFF) = INPUT; 1502950Smckusic stp = (struct stack *)pushsp((long)(sizeof(struct stack))); 1512109Smckusic _dp = &_display.frame[0]; 1522080Smckusick pc.cp = base; 1532080Smckusick for(;;) { 1542109Smckusic # ifdef DEBUG 1552080Smckusick if (++opcptr == 10) 1562080Smckusick opcptr = 0; 1572080Smckusick opc[opcptr] = *pc.ucp; 1582109Smckusic # endif DEBUG 1592109Smckusic # ifdef PROFILE 1602109Smckusic _profcnts[*pc.ucp]++; 1612109Smckusic # endif PROFILE 1622080Smckusick switch (*pc.ucp++) { 1632080Smckusick case O_NODUMP: 1642191Smckusic _nodump = TRUE; 1652080Smckusick /* and fall through */ 1662080Smckusick case O_BEG: 1672080Smckusick _dp += 1; /* enter local scope */ 1682080Smckusick stp->odisp = *_dp; /* save old display value */ 1692080Smckusick tl = *pc.ucp++; /* tl = name size */ 1702080Smckusick stp->entry = pc.hdrp; /* pointer to entry info */ 1712191Smckusic tl1 = pc.hdrp->framesze;/* tl1 = size of frame */ 1722191Smckusic _lino = pc.hdrp->offset; 1732191Smckusic _runtst = pc.hdrp->tests; 1742191Smckusic disableovrflo(); 1752191Smckusic if (_runtst) 1762191Smckusic enableovrflo(); 1772950Smckusic pc.cp += (int)tl; /* skip over proc hdr info */ 1782080Smckusick stp->file = curfile; /* save active file */ 1792080Smckusick tcp = pushsp(tl1); /* tcp = new top of stack */ 1802950Smckusic if (_runtst) /* zero stack frame */ 1812950Smckusic blkclr(tl1, tcp); 1822950Smckusic tcp += (int)tl1; /* offsets of locals are neg */ 1832109Smckusic _dp->locvars = tcp; /* set new display pointer */ 1842109Smckusic _dp->stp = stp; 1852950Smckusic stp->tos = pushsp((long)0); /* set tos pointer */ 1862080Smckusick continue; 1872080Smckusick case O_END: 1882080Smckusick PCLOSE(_dp->locvars); /* flush & close local files */ 1892080Smckusick stp = _dp->stp; 1902080Smckusick curfile = stp->file; /* restore old active file */ 1912080Smckusick *_dp = stp->odisp; /* restore old display entry */ 1922109Smckusic if (_dp == &_display.frame[1]) 1932080Smckusick return; /* exiting main proc ??? */ 1942080Smckusick _lino = stp->lino; /* restore lino, pc, dp */ 1952080Smckusick pc.cp = stp->pc.cp; 1962080Smckusick _dp = stp->dp; 1972191Smckusic _runtst = stp->entry->tests; 1982191Smckusic disableovrflo(); 1992191Smckusic if (_runtst) 2002191Smckusic enableovrflo(); 2012109Smckusic popsp(stp->entry->framesze + /* pop local vars */ 2022080Smckusick sizeof(struct stack) + /* pop stack frame */ 2032080Smckusick stp->entry->nargs); /* pop parms */ 2042080Smckusick continue; 2052080Smckusick case O_CALL: 2062080Smckusick tl = *pc.cp++; 2072080Smckusick tcp = base + *pc.lp++;/* calc new entry point */ 2082080Smckusick tcp += sizeof(short); 2092080Smckusick tcp = base + *(long *)tcp; 2102950Smckusic stp = (struct stack *) 2112950Smckusic pushsp((long)(sizeof(struct stack))); 2122080Smckusick stp->lino = _lino; /* save lino, pc, dp */ 2132080Smckusick stp->pc.cp = pc.cp; 2142080Smckusick stp->dp = _dp; 2152109Smckusic _dp = &_display.frame[tl]; /* set up new display ptr */ 2162080Smckusick pc.cp = tcp; 2172080Smckusick continue; 2182080Smckusick case O_FCALL: 2193294Smckusic pc.cp++; 2202080Smckusick tfp = (struct formalrtn *)popaddr(); 2212950Smckusic stp = (struct stack *) 2222950Smckusic pushsp((long)(sizeof(struct stack))); 2232080Smckusick stp->lino = _lino; /* save lino, pc, dp */ 2242080Smckusick stp->pc.cp = pc.cp; 2252080Smckusick stp->dp = _dp; 2263436Smckusic pc.cp = tfp->fentryaddr;/* calc new entry point */ 2273436Smckusic _dp = &_display.frame[tfp->fbn];/* new display ptr */ 2283436Smckusic blkcpy(tfp->fbn * sizeof(struct disp), 2293861Smckusic &_display.frame[1], &tfp->fdisp[tfp->fbn]); 2303436Smckusic blkcpy(tfp->fbn * sizeof(struct disp), 2313436Smckusic &tfp->fdisp[0], &_display.frame[1]); 2322080Smckusick continue; 2332080Smckusick case O_FRTN: 2342080Smckusick tl = *pc.cp++; /* tl = size of return obj */ 2352080Smckusick if (tl == 0) 2362080Smckusick tl = *pc.usp++; 2372950Smckusic tcp = pushsp((long)(0)); 2382080Smckusick tfp = *(struct formalrtn **)(tcp + tl); 2393861Smckusic if (tl != 0) { 2403861Smckusic blkcpy(tl, tcp, 2413861Smckusic tcp + sizeof(struct formalrtn *)); 2423861Smckusic } 2433861Smckusic popsp((long)(sizeof(struct formalrtn *))); 2443436Smckusic blkcpy(tfp->fbn * sizeof(struct disp), 2453861Smckusic &tfp->fdisp[tfp->fbn], &_display.frame[1]); 2462080Smckusick continue; 2472080Smckusick case O_FSAV: 2482080Smckusick tfp = (struct formalrtn *)popaddr(); 2493436Smckusic tfp->fbn = *pc.cp++; /* blk number of routine */ 2503861Smckusic tcp = base + *pc.lp++; /* calc new entry point */ 2512080Smckusick tcp += sizeof(short); 2523436Smckusic tfp->fentryaddr = base + *(long *)tcp; 2533436Smckusic blkcpy(tfp->fbn * sizeof(struct disp), 2543436Smckusic &_display.frame[1], &tfp->fdisp[0]); 2552080Smckusick pushaddr(tfp); 2562080Smckusick continue; 2572080Smckusick case O_SDUP2: 2582080Smckusick pc.cp++; 2592080Smckusick tl = pop2(); 2602950Smckusic push2((short)(tl)); 2612950Smckusic push2((short)(tl)); 2622080Smckusick continue; 2632080Smckusick case O_SDUP4: 2642080Smckusick pc.cp++; 2652080Smckusick tl = pop4(); 2662080Smckusick push4(tl); 2672080Smckusick push4(tl); 2682080Smckusick continue; 2692080Smckusick case O_TRA: 2702080Smckusick pc.cp++; 2712080Smckusick pc.cp += *pc.sp; 2722080Smckusick continue; 2732080Smckusick case O_TRA4: 2742080Smckusick pc.cp++; 2752080Smckusick pc.cp = base + *pc.lp; 2762080Smckusick continue; 2772080Smckusick case O_GOTO: 2782109Smckusic tstp = _display.frame[*pc.cp++].stp; /* ptr to 2792109Smckusic exit frame */ 2802080Smckusick pc.cp = base + *pc.lp; 2812080Smckusick stp = _dp->stp; 2822080Smckusick while (tstp != stp) { 2832109Smckusic if (_dp == &_display.frame[1]) 284*3872Smckusic ERROR("Active frame not found in non-local goto\n", 0); /* exiting prog ??? */ 2852080Smckusick PCLOSE(_dp->locvars); /* close local files */ 2862080Smckusick curfile = stp->file; /* restore active file */ 2872080Smckusick *_dp = stp->odisp; /* old display entry */ 2882080Smckusick _dp = stp->dp; /* restore dp */ 2892080Smckusick stp = _dp->stp; 2902080Smckusick } 2912080Smckusick /* pop locals, stack frame, parms, and return values */ 2922950Smckusic popsp((long)(stp->tos - pushsp((long)(0)))); 2932080Smckusick continue; 2942080Smckusick case O_LINO: 2952950Smckusic if (_dp->stp->tos != pushsp((long)(0))) 2962080Smckusick panic(PSTKNEMP); 2972080Smckusick _lino = *pc.cp++; /* set line number */ 2982080Smckusick if (_lino == 0) 2992080Smckusick _lino = *pc.sp++; 3002950Smckusic if (_runtst) { 3012950Smckusic LINO(); /* inc statement count */ 3022950Smckusic continue; 3032950Smckusic } 3042950Smckusic _stcnt++; 3052080Smckusick continue; 3062080Smckusick case O_PUSH: 3072080Smckusick tl = *pc.cp++; 3082080Smckusick if (tl == 0) 3092080Smckusick tl = *pc.usp++; 3102080Smckusick tl = (-tl + 1) & ~1; 3112080Smckusick tcp = pushsp(tl); 3122950Smckusic if (_runtst) 3132950Smckusic blkclr(tl, tcp); 3142080Smckusick continue; 3152080Smckusick case O_IF: 3162080Smckusick pc.cp++; 3172191Smckusic if (pop2()) { 3182080Smckusick pc.sp++; 3192191Smckusic continue; 3202191Smckusic } 3212191Smckusic pc.cp += *pc.sp; 3222080Smckusick continue; 3232080Smckusick case O_REL2: 3242080Smckusick tl = pop2(); 3252080Smckusick tl1 = pop2(); 3262080Smckusick goto cmplong; 3272080Smckusick case O_REL24: 3282080Smckusick tl = pop2(); 3292080Smckusick tl1 = pop4(); 3302080Smckusick goto cmplong; 3312080Smckusick case O_REL42: 3322080Smckusick tl = pop4(); 3332080Smckusick tl1 = pop2(); 3342080Smckusick goto cmplong; 3352080Smckusick case O_REL4: 3362080Smckusick tl = pop4(); 3372080Smckusick tl1 = pop4(); 3382080Smckusick cmplong: 3392080Smckusick tl2 = *pc.cp++; 3402080Smckusick switch (tl2) { 3412080Smckusick case releq: 3422080Smckusick push2(tl1 == tl); 3432080Smckusick continue; 3442080Smckusick case relne: 3452080Smckusick push2(tl1 != tl); 3462080Smckusick continue; 3472080Smckusick case rellt: 3482080Smckusick push2(tl1 < tl); 3492080Smckusick continue; 3502080Smckusick case relgt: 3512080Smckusick push2(tl1 > tl); 3522080Smckusick continue; 3532080Smckusick case relle: 3542080Smckusick push2(tl1 <= tl); 3552080Smckusick continue; 3562080Smckusick case relge: 3572080Smckusick push2(tl1 >= tl); 3582080Smckusick continue; 3592080Smckusick default: 3602080Smckusick panic(PSYSTEM); 3612080Smckusick continue; 3622080Smckusick } 3632080Smckusick case O_RELG: 3642080Smckusick tl2 = *pc.cp++; /* tc has jump opcode */ 3652080Smckusick tl = *pc.usp++; /* tl has comparison length */ 3662080Smckusick tl1 = (tl + 1) & ~1; /* tl1 has arg stack length */ 3672950Smckusic tcp = pushsp((long)(0));/* tcp pts to first arg */ 3682080Smckusick switch (tl2) { 3692080Smckusick case releq: 3702950Smckusic tb = RELEQ(tl, tcp + tl1, tcp); 3712080Smckusick break; 3722080Smckusick case relne: 3732950Smckusic tb = RELNE(tl, tcp + tl1, tcp); 3742080Smckusick break; 3752080Smckusick case rellt: 3762950Smckusic tb = RELSLT(tl, tcp + tl1, tcp); 3772080Smckusick break; 3782080Smckusick case relgt: 3792950Smckusic tb = RELSGT(tl, tcp + tl1, tcp); 3802080Smckusick break; 3812080Smckusick case relle: 3822950Smckusic tb = RELSLE(tl, tcp + tl1, tcp); 3832080Smckusick break; 3842080Smckusick case relge: 3852950Smckusic tb = RELSGE(tl, tcp + tl1, tcp); 3862080Smckusick break; 3872080Smckusick default: 3882080Smckusick panic(PSYSTEM); 3892080Smckusick break; 3902080Smckusick } 3912080Smckusick popsp(tl1 << 1); 3922950Smckusic push2((short)(tb)); 3932080Smckusick continue; 3942080Smckusick case O_RELT: 3952080Smckusick tl2 = *pc.cp++; /* tc has jump opcode */ 3962080Smckusick tl1 = *pc.usp++; /* tl1 has comparison length */ 3972950Smckusic tcp = pushsp((long)(0));/* tcp pts to first arg */ 3982080Smckusick switch (tl2) { 3992080Smckusick case releq: 4002950Smckusic tb = RELEQ(tl1, tcp + tl1, tcp); 4012080Smckusick break; 4022080Smckusick case relne: 4032950Smckusic tb = RELNE(tl1, tcp + tl1, tcp); 4042080Smckusick break; 4052080Smckusick case rellt: 4062950Smckusic tb = RELTLT(tl1, tcp + tl1, tcp); 4072080Smckusick break; 4082080Smckusick case relgt: 4092950Smckusic tb = RELTGT(tl1, tcp + tl1, tcp); 4102080Smckusick break; 4112080Smckusick case relle: 4122950Smckusic tb = RELTLE(tl1, tcp + tl1, tcp); 4132080Smckusick break; 4142080Smckusick case relge: 4152950Smckusic tb = RELTGE(tl1, tcp + tl1, tcp); 4162080Smckusick break; 4172080Smckusick default: 4182080Smckusick panic(PSYSTEM); 4192080Smckusick break; 4202080Smckusick } 4212080Smckusick popsp(tl1 << 1); 4222950Smckusic push2((short)(tb)); 4232080Smckusick continue; 4242080Smckusick case O_REL28: 4252080Smckusick td = pop2(); 4262080Smckusick td1 = pop8(); 4272080Smckusick goto cmpdbl; 4282080Smckusick case O_REL48: 4292080Smckusick td = pop4(); 4302080Smckusick td1 = pop8(); 4312080Smckusick goto cmpdbl; 4322080Smckusick case O_REL82: 4332080Smckusick td = pop8(); 4342080Smckusick td1 = pop2(); 4352080Smckusick goto cmpdbl; 4362080Smckusick case O_REL84: 4372080Smckusick td = pop8(); 4382080Smckusick td1 = pop4(); 4392080Smckusick goto cmpdbl; 4402080Smckusick case O_REL8: 4412080Smckusick td = pop8(); 4422080Smckusick td1 = pop8(); 4432080Smckusick cmpdbl: 4442080Smckusick switch (*pc.cp++) { 4452080Smckusick case releq: 4462080Smckusick push2(td1 == td); 4472080Smckusick continue; 4482080Smckusick case relne: 4492080Smckusick push2(td1 != td); 4502080Smckusick continue; 4512080Smckusick case rellt: 4522080Smckusick push2(td1 < td); 4532080Smckusick continue; 4542080Smckusick case relgt: 4552080Smckusick push2(td1 > td); 4562080Smckusick continue; 4572080Smckusick case relle: 4582080Smckusick push2(td1 <= td); 4592080Smckusick continue; 4602080Smckusick case relge: 4612080Smckusick push2(td1 >= td); 4622080Smckusick continue; 4632080Smckusick default: 4642080Smckusick panic(PSYSTEM); 4652080Smckusick continue; 4662080Smckusick } 4672080Smckusick case O_AND: 4682080Smckusick pc.cp++; 4692080Smckusick push2(pop2() & pop2()); 4702080Smckusick continue; 4712080Smckusick case O_OR: 4722080Smckusick pc.cp++; 4732080Smckusick push2(pop2() | pop2()); 4742080Smckusick continue; 4752080Smckusick case O_NOT: 4762080Smckusick pc.cp++; 4772080Smckusick push2(pop2() ^ 1); 4782080Smckusick continue; 4792080Smckusick case O_AS2: 4802080Smckusick pc.cp++; 4812080Smckusick tl = pop2(); 4822080Smckusick *(short *)popaddr() = tl; 4832080Smckusick continue; 4842080Smckusick case O_AS4: 4852080Smckusick pc.cp++; 4862080Smckusick tl = pop4(); 4872080Smckusick *(long *)popaddr() = tl; 4882080Smckusick continue; 4892080Smckusick case O_AS24: 4902080Smckusick pc.cp++; 4912080Smckusick tl = pop2(); 4922080Smckusick *(long *)popaddr() = tl; 4932080Smckusick continue; 4942080Smckusick case O_AS42: 4952080Smckusick pc.cp++; 4962080Smckusick tl = pop4(); 4972080Smckusick *(short *)popaddr() = tl; 4982080Smckusick continue; 4992080Smckusick case O_AS21: 5002080Smckusick pc.cp++; 5012080Smckusick tl = pop2(); 5022080Smckusick *popaddr() = tl; 5032080Smckusick continue; 5042080Smckusick case O_AS41: 5052080Smckusick pc.cp++; 5062080Smckusick tl = pop4(); 5072080Smckusick *popaddr() = tl; 5082080Smckusick continue; 5092080Smckusick case O_AS28: 5102080Smckusick pc.cp++; 5112080Smckusick tl = pop2(); 5122080Smckusick *(double *)popaddr() = tl; 5132080Smckusick continue; 5142080Smckusick case O_AS48: 5152080Smckusick pc.cp++; 5162080Smckusick tl = pop4(); 5172080Smckusick *(double *)popaddr() = tl; 5182080Smckusick continue; 5192080Smckusick case O_AS8: 5202080Smckusick pc.cp++; 5212239Smckusic t8 = popsze8(); 5222239Smckusic *(struct sze8 *)popaddr() = t8; 5232080Smckusick continue; 5242080Smckusick case O_AS: 5252080Smckusick tl = *pc.cp++; 5262080Smckusick if (tl == 0) 5272080Smckusick tl = *pc.usp++; 5282080Smckusick tl1 = (tl + 1) & ~1; 5292950Smckusic tcp = pushsp((long)(0)); 5302080Smckusick blkcpy(tl, tcp, *(char **)(tcp + tl1)); 5312080Smckusick popsp(tl1 + sizeof(char *)); 5322080Smckusick continue; 5332080Smckusick case O_INX2P2: 5342080Smckusick tl = *pc.cp++; /* tl has shift amount */ 5352080Smckusick tl1 = (pop2() - *pc.sp++) << tl; 5362080Smckusick pushaddr(popaddr() + tl1); 5372080Smckusick continue; 5382080Smckusick case O_INX4P2: 5392080Smckusick tl = *pc.cp++; /* tl has shift amount */ 5402080Smckusick tl1 = (pop4() - *pc.sp++) << tl; 5412080Smckusick pushaddr(popaddr() + tl1); 5422080Smckusick continue; 5432080Smckusick case O_INX2: 5442080Smckusick tl = *pc.cp++; /* tl has element size */ 5452080Smckusick if (tl == 0) 5462080Smckusick tl = *pc.usp++; 5472080Smckusick tl1 = pop2(); /* index */ 5482080Smckusick tl2 = *pc.sp++; 5492080Smckusick pushaddr(popaddr() + (tl1 - tl2) * tl); 5502191Smckusic tl = *pc.usp++; 5512191Smckusic if (_runtst) 5522191Smckusic SUBSC(tl1, tl2, tl); /* range check */ 5532080Smckusick continue; 5542080Smckusick case O_INX4: 5552080Smckusick tl = *pc.cp++; /* tl has element size */ 5562080Smckusick if (tl == 0) 5572080Smckusick tl = *pc.usp++; 5582080Smckusick tl1 = pop4(); /* index */ 5592080Smckusick tl2 = *pc.sp++; 5602080Smckusick pushaddr(popaddr() + (tl1 - tl2) * tl); 5612191Smckusic tl = *pc.usp++; 5622191Smckusic if (_runtst) 5632191Smckusic SUBSC(tl1, tl2, tl); /* range check */ 5642080Smckusick continue; 5652080Smckusick case O_OFF: 5662080Smckusick tl = *pc.cp++; 5672080Smckusick if (tl == 0) 5682080Smckusick tl = *pc.usp++; 5692950Smckusic pushaddr(popaddr() + tl); 5702080Smckusick continue; 5712080Smckusick case O_NIL: 5722080Smckusick pc.cp++; 5732080Smckusick NIL(); 5742080Smckusick continue; 5752080Smckusick case O_ADD2: 5762080Smckusick pc.cp++; 5772950Smckusic push4((long)(pop2() + pop2())); 5782080Smckusick continue; 5792080Smckusick case O_ADD4: 5802080Smckusick pc.cp++; 5812080Smckusick push4(pop4() + pop4()); 5822080Smckusick continue; 5832080Smckusick case O_ADD24: 5842080Smckusick pc.cp++; 5852080Smckusick tl = pop2(); 5862080Smckusick push4(pop4() + tl); 5872080Smckusick continue; 5882080Smckusick case O_ADD42: 5892080Smckusick pc.cp++; 5902080Smckusick tl = pop4(); 5912080Smckusick push4(pop2() + tl); 5922080Smckusick continue; 5932080Smckusick case O_ADD28: 5942080Smckusick pc.cp++; 5952080Smckusick tl = pop2(); 5962080Smckusick push8(pop8() + tl); 5972080Smckusick continue; 5982080Smckusick case O_ADD48: 5992080Smckusick pc.cp++; 6002080Smckusick tl = pop4(); 6012080Smckusick push8(pop8() + tl); 6022080Smckusick continue; 6032080Smckusick case O_ADD82: 6042080Smckusick pc.cp++; 6052080Smckusick td = pop8(); 6062080Smckusick push8(pop2() + td); 6072080Smckusick continue; 6082080Smckusick case O_ADD84: 6092080Smckusick pc.cp++; 6102080Smckusick td = pop8(); 6112080Smckusick push8(pop4() + td); 6122080Smckusick continue; 6132080Smckusick case O_SUB2: 6142080Smckusick pc.cp++; 6152080Smckusick tl = pop2(); 6162080Smckusick push4(pop2() - tl); 6172080Smckusick continue; 6182080Smckusick case O_SUB4: 6192080Smckusick pc.cp++; 6202080Smckusick tl = pop4(); 6212080Smckusick push4(pop4() - tl); 6222080Smckusick continue; 6232080Smckusick case O_SUB24: 6242080Smckusick pc.cp++; 6252080Smckusick tl = pop2(); 6262080Smckusick push4(pop4() - tl); 6272080Smckusick continue; 6282080Smckusick case O_SUB42: 6292080Smckusick pc.cp++; 6302080Smckusick tl = pop4(); 6312080Smckusick push4(pop2() - tl); 6322080Smckusick continue; 6332080Smckusick case O_SUB28: 6342080Smckusick pc.cp++; 6352080Smckusick tl = pop2(); 6362080Smckusick push8(pop8() - tl); 6372080Smckusick continue; 6382080Smckusick case O_SUB48: 6392080Smckusick pc.cp++; 6402080Smckusick tl = pop4(); 6412080Smckusick push8(pop8() - tl); 6422080Smckusick continue; 6432080Smckusick case O_SUB82: 6442080Smckusick pc.cp++; 6452080Smckusick td = pop8(); 6462080Smckusick push8(pop2() - td); 6472080Smckusick continue; 6482080Smckusick case O_SUB84: 6492080Smckusick pc.cp++; 6502080Smckusick td = pop8(); 6512080Smckusick push8(pop4() - td); 6522080Smckusick continue; 6532080Smckusick case O_MUL2: 6542080Smckusick pc.cp++; 6552950Smckusic push4((long)(pop2() * pop2())); 6562080Smckusick continue; 6572080Smckusick case O_MUL4: 6582080Smckusick pc.cp++; 6592080Smckusick push4(pop4() * pop4()); 6602080Smckusick continue; 6612080Smckusick case O_MUL24: 6622080Smckusick pc.cp++; 6632080Smckusick tl = pop2(); 6642080Smckusick push4(pop4() * tl); 6652080Smckusick continue; 6662080Smckusick case O_MUL42: 6672080Smckusick pc.cp++; 6682080Smckusick tl = pop4(); 6692080Smckusick push4(pop2() * tl); 6702080Smckusick continue; 6712080Smckusick case O_MUL28: 6722080Smckusick pc.cp++; 6732080Smckusick tl = pop2(); 6742080Smckusick push8(pop8() * tl); 6752080Smckusick continue; 6762080Smckusick case O_MUL48: 6772080Smckusick pc.cp++; 6782080Smckusick tl = pop4(); 6792080Smckusick push8(pop8() * tl); 6802080Smckusick continue; 6812080Smckusick case O_MUL82: 6822080Smckusick pc.cp++; 6832080Smckusick td = pop8(); 6842080Smckusick push8(pop2() * td); 6852080Smckusick continue; 6862080Smckusick case O_MUL84: 6872080Smckusick pc.cp++; 6882080Smckusick td = pop8(); 6892080Smckusick push8(pop4() * td); 6902080Smckusick continue; 6912080Smckusick case O_ABS2: 6922080Smckusick case O_ABS4: 6932080Smckusick pc.cp++; 6942080Smckusick tl = pop4(); 6952080Smckusick push4(tl >= 0 ? tl : -tl); 6962080Smckusick continue; 6972080Smckusick case O_ABS8: 6982080Smckusick pc.cp++; 6992080Smckusick td = pop8(); 7002080Smckusick push8(td >= 0.0 ? td : -td); 7012080Smckusick continue; 7022080Smckusick case O_NEG2: 7032080Smckusick pc.cp++; 7042950Smckusic push4((long)(-pop2())); 7052080Smckusick continue; 7062080Smckusick case O_NEG4: 7072080Smckusick pc.cp++; 7082080Smckusick push4(-pop4()); 7092080Smckusick continue; 7102080Smckusick case O_NEG8: 7112080Smckusick pc.cp++; 7122080Smckusick push8(-pop8()); 7132080Smckusick continue; 7142080Smckusick case O_DIV2: 7152080Smckusick pc.cp++; 7162080Smckusick tl = pop2(); 7172080Smckusick push4(pop2() / tl); 7182080Smckusick continue; 7192080Smckusick case O_DIV4: 7202080Smckusick pc.cp++; 7212080Smckusick tl = pop4(); 7222080Smckusick push4(pop4() / tl); 7232080Smckusick continue; 7242080Smckusick case O_DIV24: 7252080Smckusick pc.cp++; 7262080Smckusick tl = pop2(); 7272080Smckusick push4(pop4() / tl); 7282080Smckusick continue; 7292080Smckusick case O_DIV42: 7302080Smckusick pc.cp++; 7312080Smckusick tl = pop4(); 7322080Smckusick push4(pop2() / tl); 7332080Smckusick continue; 7342080Smckusick case O_MOD2: 7352080Smckusick pc.cp++; 7362080Smckusick tl = pop2(); 7372080Smckusick push4(pop2() % tl); 7382080Smckusick continue; 7392080Smckusick case O_MOD4: 7402080Smckusick pc.cp++; 7412080Smckusick tl = pop4(); 7422080Smckusick push4(pop4() % tl); 7432080Smckusick continue; 7442080Smckusick case O_MOD24: 7452080Smckusick pc.cp++; 7462080Smckusick tl = pop2(); 7472080Smckusick push4(pop4() % tl); 7482080Smckusick continue; 7492080Smckusick case O_MOD42: 7502080Smckusick pc.cp++; 7512080Smckusick tl = pop4(); 7522080Smckusick push4(pop2() % tl); 7532080Smckusick continue; 7542080Smckusick case O_ADD8: 7552080Smckusick pc.cp++; 7562080Smckusick push8(pop8() + pop8()); 7572080Smckusick continue; 7582080Smckusick case O_SUB8: 7592080Smckusick pc.cp++; 7602080Smckusick td = pop8(); 7612080Smckusick push8(pop8() - td); 7622080Smckusick continue; 7632080Smckusick case O_MUL8: 7642080Smckusick pc.cp++; 7652080Smckusick push8(pop8() * pop8()); 7662080Smckusick continue; 7672080Smckusick case O_DVD8: 7682080Smckusick pc.cp++; 7692080Smckusick td = pop8(); 7702080Smckusick push8(pop8() / td); 7712080Smckusick continue; 7722080Smckusick case O_STOI: 7732080Smckusick pc.cp++; 7742950Smckusic push4((long)(pop2())); 7752080Smckusick continue; 7762080Smckusick case O_STOD: 7772080Smckusick pc.cp++; 7782080Smckusick td = pop2(); 7792080Smckusick push8(td); 7802080Smckusick continue; 7812080Smckusick case O_ITOD: 7822080Smckusick pc.cp++; 7832080Smckusick td = pop4(); 7842080Smckusick push8(td); 7852080Smckusick continue; 7862080Smckusick case O_ITOS: 7872080Smckusick pc.cp++; 7882950Smckusic push2((short)(pop4())); 7892080Smckusick continue; 7902080Smckusick case O_DVD2: 7912080Smckusick pc.cp++; 7922080Smckusick td = pop2(); 7932080Smckusick push8(pop2() / td); 7942080Smckusick continue; 7952080Smckusick case O_DVD4: 7962080Smckusick pc.cp++; 7972080Smckusick td = pop4(); 7982080Smckusick push8(pop4() / td); 7992080Smckusick continue; 8002080Smckusick case O_DVD24: 8012080Smckusick pc.cp++; 8022080Smckusick td = pop2(); 8032080Smckusick push8(pop4() / td); 8042080Smckusick continue; 8052080Smckusick case O_DVD42: 8062080Smckusick pc.cp++; 8072080Smckusick td = pop4(); 8082080Smckusick push8(pop2() / td); 8092080Smckusick continue; 8102080Smckusick case O_DVD28: 8112080Smckusick pc.cp++; 8122080Smckusick td = pop2(); 8132080Smckusick push8(pop8() / td); 8142080Smckusick continue; 8152080Smckusick case O_DVD48: 8162080Smckusick pc.cp++; 8172080Smckusick td = pop4(); 8182080Smckusick push8(pop8() / td); 8192080Smckusick continue; 8202080Smckusick case O_DVD82: 8212080Smckusick pc.cp++; 8222080Smckusick td = pop8(); 8232080Smckusick push8(pop2() / td); 8242080Smckusick continue; 8252080Smckusick case O_DVD84: 8262080Smckusick pc.cp++; 8272080Smckusick td = pop8(); 8282080Smckusick push8(pop4() / td); 8292080Smckusick continue; 8302080Smckusick case O_RV1: 8312109Smckusic tcp = _display.raw[*pc.ucp++]; 8322950Smckusic push2((short)(*(tcp + *pc.sp++))); 8332080Smckusick continue; 8342080Smckusick case O_RV14: 8352109Smckusic tcp = _display.raw[*pc.ucp++]; 8362950Smckusic push4((long)(*(tcp + *pc.sp++))); 8372080Smckusick continue; 8382080Smckusick case O_RV2: 8392109Smckusic tcp = _display.raw[*pc.ucp++]; 8402080Smckusick push2(*(short *)(tcp + *pc.sp++)); 8412080Smckusick continue; 8422080Smckusick case O_RV24: 8432109Smckusic tcp = _display.raw[*pc.ucp++]; 8442950Smckusic push4((long)(*(short *)(tcp + *pc.sp++))); 8452080Smckusick continue; 8462080Smckusick case O_RV4: 8472109Smckusic tcp = _display.raw[*pc.ucp++]; 8482080Smckusick push4(*(long *)(tcp + *pc.sp++)); 8492080Smckusick continue; 8502080Smckusick case O_RV8: 8512109Smckusic tcp = _display.raw[*pc.ucp++]; 8522239Smckusic pushsze8(*(struct sze8 *)(tcp + *pc.sp++)); 8532080Smckusick continue; 8542080Smckusick case O_RV: 8552109Smckusic tcp = _display.raw[*pc.ucp++]; 8562080Smckusick tcp += *pc.sp++; 8572080Smckusick tl = *pc.usp++; 8582338Smckusic tcp1 = pushsp((tl + 1) & ~1); 8592080Smckusick blkcpy(tl, tcp, tcp1); 8602080Smckusick continue; 8612080Smckusick case O_LV: 8622109Smckusic tcp = _display.raw[*pc.ucp++]; 8632080Smckusick pushaddr(tcp + *pc.sp++); 8642080Smckusick continue; 8652080Smckusick case O_LRV1: 8662109Smckusic tcp = _display.raw[*pc.ucp++]; 8672950Smckusic push2((short)(*(tcp + *pc.lp++))); 8682080Smckusick continue; 8692080Smckusick case O_LRV14: 8702109Smckusic tcp = _display.raw[*pc.ucp++]; 8712950Smckusic push4((long)(*(tcp + *pc.lp++))); 8722080Smckusick continue; 8732080Smckusick case O_LRV2: 8742109Smckusic tcp = _display.raw[*pc.ucp++]; 8752080Smckusick push2(*(short *)(tcp + *pc.lp++)); 8762080Smckusick continue; 8772080Smckusick case O_LRV24: 8782109Smckusic tcp = _display.raw[*pc.ucp++]; 8792950Smckusic push4((long)(*(short *)(tcp + *pc.lp++))); 8802080Smckusick continue; 8812080Smckusick case O_LRV4: 8822109Smckusic tcp = _display.raw[*pc.ucp++]; 8832080Smckusick push4(*(long *)(tcp + *pc.lp++)); 8842080Smckusick continue; 8852080Smckusick case O_LRV8: 8862109Smckusic tcp = _display.raw[*pc.ucp++]; 8872239Smckusic pushsze8(*(struct sze8 *)(tcp + *pc.lp++)); 8882080Smckusick continue; 8892080Smckusick case O_LRV: 8902109Smckusic tcp = _display.raw[*pc.ucp++]; 8912950Smckusic tcp += (int)*pc.lp++; 8922080Smckusick tl = *pc.usp++; 8932950Smckusic tcp1 = pushsp((tl + 1) & ~1); 8942080Smckusick blkcpy(tl, tcp, tcp1); 8952080Smckusick continue; 8962080Smckusick case O_LLV: 8972109Smckusic tcp = _display.raw[*pc.ucp++]; 8982080Smckusick pushaddr(tcp + *pc.lp++); 8992080Smckusick continue; 9002080Smckusick case O_IND1: 9012080Smckusick pc.cp++; 9022950Smckusic push2((short)(*popaddr())); 9032080Smckusick continue; 9042080Smckusick case O_IND14: 9052080Smckusick pc.cp++; 9062950Smckusic push4((long)(*popaddr())); 9072080Smckusick continue; 9082080Smckusick case O_IND2: 9092080Smckusick pc.cp++; 9102080Smckusick push2(*(short *)(popaddr())); 9112080Smckusick continue; 9122080Smckusick case O_IND24: 9132080Smckusick pc.cp++; 9142950Smckusic push4((long)(*(short *)(popaddr()))); 9152080Smckusick continue; 9162080Smckusick case O_IND4: 9172080Smckusick pc.cp++; 9182080Smckusick push4(*(long *)(popaddr())); 9192080Smckusick continue; 9202080Smckusick case O_IND8: 9212080Smckusick pc.cp++; 9222239Smckusic pushsze8(*(struct sze8 *)(popaddr())); 9232080Smckusick continue; 9242080Smckusick case O_IND: 9252080Smckusick tl = *pc.cp++; 9262080Smckusick if (tl == 0) 9272080Smckusick tl = *pc.usp++; 9282080Smckusick tcp = popaddr(); 9292080Smckusick tcp1 = pushsp((tl + 1) & ~1); 9302080Smckusick blkcpy(tl, tcp, tcp1); 9312080Smckusick continue; 9322080Smckusick case O_CON1: 9332950Smckusic push2((short)(*pc.cp++)); 9342080Smckusick continue; 9352080Smckusick case O_CON14: 9362950Smckusic push4((long)(*pc.cp++)); 9372080Smckusick continue; 9382080Smckusick case O_CON2: 9392080Smckusick pc.cp++; 9402080Smckusick push2(*pc.sp++); 9412080Smckusick continue; 9422080Smckusick case O_CON24: 9432080Smckusick pc.cp++; 9442950Smckusic push4((long)(*pc.sp++)); 9452080Smckusick continue; 9462080Smckusick case O_CON4: 9472080Smckusick pc.cp++; 9482080Smckusick push4(*pc.lp++); 9492080Smckusick continue; 9502080Smckusick case O_CON8: 9512080Smckusick pc.cp++; 9522950Smckusic push8(*pc.dbp++); 9532080Smckusick continue; 9542080Smckusick case O_CON: 9552080Smckusick tl = *pc.cp++; 9562080Smckusick if (tl == 0) 9572080Smckusick tl = *pc.usp++; 9582080Smckusick tl = (tl + 1) & ~1; 9592080Smckusick tcp = pushsp(tl); 9602080Smckusick blkcpy(tl, pc.cp, tcp); 9612950Smckusic pc.cp += (int)tl; 9622080Smckusick continue; 9632950Smckusic case O_CONG: 9642950Smckusic tl = *pc.cp++; 9652950Smckusic if (tl == 0) 9662950Smckusic tl = *pc.usp++; 9672950Smckusic tl1 = (tl + 1) & ~1; 9682950Smckusic tcp = pushsp(tl1); 9692950Smckusic blkcpy(tl1, pc.cp, tcp); 9702950Smckusic pc.cp += (int)((tl + 2) & ~1); 9712950Smckusic continue; 9722080Smckusick case O_LVCON: 9732080Smckusick tl = *pc.cp++; 9742080Smckusick if (tl == 0) 9752080Smckusick tl = *pc.usp++; 9762080Smckusick tl = (tl + 1) & ~1; 9772080Smckusick pushaddr(pc.cp); 9782950Smckusic pc.cp += (int)tl; 9792080Smckusick continue; 9802080Smckusick case O_RANG2: 9812080Smckusick tl = *pc.cp++; 9822080Smckusick if (tl == 0) 9832080Smckusick tl = *pc.sp++; 9842080Smckusick tl1 = pop2(); 9852950Smckusic push2((short)(RANG4(tl1, tl, *pc.sp++))); 9862080Smckusick continue; 9872080Smckusick case O_RANG42: 9882080Smckusick tl = *pc.cp++; 9892080Smckusick if (tl == 0) 9902080Smckusick tl = *pc.sp++; 9912080Smckusick tl1 = pop4(); 9922080Smckusick push4(RANG4(tl1, tl, *pc.sp++)); 9932080Smckusick continue; 9942080Smckusick case O_RSNG2: 9952080Smckusick tl = *pc.cp++; 9962080Smckusick if (tl == 0) 9972080Smckusick tl = *pc.sp++; 9982080Smckusick tl1 = pop2(); 9992950Smckusic push2((short)(RSNG4(tl1, tl))); 10002080Smckusick continue; 10012080Smckusick case O_RSNG42: 10022080Smckusick tl = *pc.cp++; 10032080Smckusick if (tl == 0) 10042080Smckusick tl = *pc.sp++; 10052080Smckusick tl1 = pop4(); 10062080Smckusick push4(RSNG4(tl1, tl)); 10072080Smckusick continue; 10082080Smckusick case O_RANG4: 10092080Smckusick pc.cp++; 10102080Smckusick tl = *pc.lp++; 10112080Smckusick tl1 = pop4(); 10122080Smckusick push4(RANG4(tl1, tl, *pc.lp++)); 10132080Smckusick continue; 10142080Smckusick case O_RANG24: 10152080Smckusick pc.cp++; 10162080Smckusick tl = *pc.lp++; 10172080Smckusick tl1 = pop2(); 10182950Smckusic push2((short)(RANG4(tl1, tl, *pc.lp++))); 10192080Smckusick continue; 10202080Smckusick case O_RSNG4: 10212080Smckusick pc.cp++; 10222080Smckusick tl = pop4(); 10232080Smckusick push4(RSNG4(tl, *pc.lp++)); 10242080Smckusick continue; 10252080Smckusick case O_RSNG24: 10262080Smckusick pc.cp++; 10272080Smckusick tl = pop2(); 10282950Smckusic push2((short)(RSNG4(tl, *pc.lp++))); 10292080Smckusick continue; 10302080Smckusick case O_STLIM: 10312080Smckusick pc.cp++; 10322121Smckusic STLIM(); 10332950Smckusic popsp((long)(sizeof(long))); 10342080Smckusick continue; 10352080Smckusick case O_LLIMIT: 10362080Smckusick pc.cp++; 10372080Smckusick LLIMIT(); 10382950Smckusic popsp((long)(sizeof(char *)+sizeof(long))); 10392080Smckusick continue; 10402080Smckusick case O_BUFF: 10412950Smckusic BUFF((long)(*pc.cp++)); 10422080Smckusick continue; 10432080Smckusick case O_HALT: 10442080Smckusick pc.cp++; 10452080Smckusick panic(PHALT); 10462080Smckusick continue; 10472080Smckusick case O_PXPBUF: 10482080Smckusick pc.cp++; 10492080Smckusick _cntrs = *pc.lp++; 10502080Smckusick _rtns = *pc.lp++; 10512950Smckusic NEWZ(&_pcpcount, (_cntrs + 1) * sizeof(long)); 10522080Smckusick continue; 10532080Smckusick case O_COUNT: 10542080Smckusick pc.cp++; 10552080Smckusick _pcpcount[*pc.usp++]++; 10562080Smckusick continue; 10572080Smckusick case O_CASE1OP: 10582080Smckusick tl = *pc.cp++; /* tl = number of cases */ 10592080Smckusick if (tl == 0) 10602080Smckusick tl = *pc.usp++; 10612080Smckusick tsp = pc.sp + tl; /* ptr to end of jump table */ 10622080Smckusick tcp = (char *)tsp; /* tcp = ptr to case values */ 10632080Smckusick tl1 = pop2(); /* tl1 = element to find */ 10642080Smckusick for(; tl > 0; tl--) /* look for element */ 10652080Smckusick if (tl1 == *tcp++) 10662080Smckusick break; 10672080Smckusick if (tl == 0) /* default case => error */ 1068*3872Smckusic ERROR("Label of %D not found in case\n", tl1); 10692080Smckusick pc.cp += *(tsp - tl); 10702080Smckusick continue; 10712080Smckusick case O_CASE2OP: 10722080Smckusick tl = *pc.cp++; /* tl = number of cases */ 10732080Smckusick if (tl == 0) 10742080Smckusick tl = *pc.usp++; 10752080Smckusick tsp = pc.sp + tl; /* ptr to end of jump table */ 10762080Smckusick tsp1 = tsp; /* tsp1 = ptr to case values */ 10772080Smckusick tl1 = (unsigned short)pop2();/* tl1 = element to find */ 10782080Smckusick for(; tl > 0; tl--) /* look for element */ 10792080Smckusick if (tl1 == *tsp1++) 10802080Smckusick break; 10812080Smckusick if (tl == 0) /* default case => error */ 1082*3872Smckusic ERROR("Label of %D not found in case\n", tl1); 10832080Smckusick pc.cp += *(tsp - tl); 10842080Smckusick continue; 10852080Smckusick case O_CASE4OP: 10862080Smckusick tl = *pc.cp++; /* tl = number of cases */ 10872080Smckusick if (tl == 0) 10882080Smckusick tl = *pc.usp++; 10892080Smckusick tsp = pc.sp + tl; /* ptr to end of jump table */ 10902080Smckusick tlp = (long *)tsp; /* tlp = ptr to case values */ 10912080Smckusick tl1 = pop4(); /* tl1 = element to find */ 10922080Smckusick for(; tl > 0; tl--) /* look for element */ 10932080Smckusick if (tl1 == *tlp++) 10942080Smckusick break; 10952080Smckusick if (tl == 0) /* default case => error */ 1096*3872Smckusic ERROR("Label of %D not found in case\n", tl1); 10972080Smckusick pc.cp += *(tsp - tl); 10982080Smckusick continue; 10992080Smckusick case O_ADDT: 11002080Smckusick tl = *pc.cp++; /* tl has comparison length */ 11012080Smckusick if (tl == 0) 11022080Smckusick tl = *pc.usp++; 11032950Smckusic tcp = pushsp((long)(0));/* tcp pts to first arg */ 11042080Smckusick ADDT(tcp + tl, tcp + tl, tcp, tl >> 2); 11052080Smckusick popsp(tl); 11062080Smckusick continue; 11072080Smckusick case O_SUBT: 11082080Smckusick tl = *pc.cp++; /* tl has comparison length */ 11092080Smckusick if (tl == 0) 11102080Smckusick tl = *pc.usp++; 11112950Smckusic tcp = pushsp((long)(0));/* tcp pts to first arg */ 11122080Smckusick SUBT(tcp + tl, tcp + tl, tcp, tl >> 2); 11132080Smckusick popsp(tl); 11142080Smckusick continue; 11152080Smckusick case O_MULT: 11162080Smckusick tl = *pc.cp++; /* tl has comparison length */ 11172080Smckusick if (tl == 0) 11182080Smckusick tl = *pc.usp++; 11192950Smckusic tcp = pushsp((long)(0));/* tcp pts to first arg */ 11202080Smckusick MULT(tcp + tl, tcp + tl, tcp, tl >> 2); 11212080Smckusick popsp(tl); 11222080Smckusick continue; 11232080Smckusick case O_INCT: 11242080Smckusick tl = *pc.cp++; /* tl has number of args */ 11252080Smckusick if (tl == 0) 11262080Smckusick tl = *pc.usp++; 11272950Smckusic tb = INCT(); 11282950Smckusic popsp(tl*sizeof(long)); 11292950Smckusic push2((short)(tb)); 11302080Smckusick continue; 11312080Smckusick case O_CTTOT: 11322080Smckusick tl = *pc.cp++; /* tl has number of args */ 11332080Smckusick if (tl == 0) 11342080Smckusick tl = *pc.usp++; 11352080Smckusick tl1 = tl * sizeof(long); 11362950Smckusic tcp = pushsp((long)(0)) + tl1; /* tcp pts to result */ 11372080Smckusick CTTOT(tcp); 11382950Smckusic popsp(tl*sizeof(long)); 11392080Smckusick continue; 11402080Smckusick case O_CARD: 11412080Smckusick tl = *pc.cp++; /* tl has comparison length */ 11422080Smckusick if (tl == 0) 11432080Smckusick tl = *pc.usp++; 11442950Smckusic tcp = pushsp((long)(0));/* tcp pts to set */ 11452080Smckusick tl1 = CARD(tcp, tl); 11462080Smckusick popsp(tl); 11472950Smckusic push2((short)(tl1)); 11482080Smckusick continue; 11492080Smckusick case O_IN: 11502080Smckusick tl = *pc.cp++; /* tl has comparison length */ 11512080Smckusick if (tl == 0) 11522080Smckusick tl = *pc.usp++; 11532080Smckusick tl1 = pop4(); /* tl1 is the element */ 11542950Smckusic tcp = pushsp((long)(0));/* tcp pts to set */ 11552080Smckusick tl2 = *pc.usp++; /* lower bound */ 11562950Smckusic tb = IN(tl1, tl2, (long)(*pc.usp++), tcp); 11572080Smckusick popsp(tl); 11582950Smckusic push2((short)(tb)); 11592080Smckusick continue; 11602080Smckusick case O_ASRT: 11612080Smckusick pc.cp++; 11622950Smckusic ts = pop2(); 11632950Smckusic ASRT(ts, ""); 11642080Smckusick continue; 11652080Smckusick case O_FOR1U: 11662080Smckusick pc.cp++; 11672950Smckusic tcp = popaddr(); /* tcp = ptr to index var */ 11682080Smckusick if (*tcp < pop4()) { /* still going up */ 11692191Smckusic tl = *tcp + 1; /* inc index var */ 11702191Smckusic tl1 = *pc.sp++; /* index lower bound */ 11712191Smckusic tl2 = *pc.sp++; /* index upper bound */ 11722191Smckusic if (_runtst) 11732191Smckusic RANG4(tl, tl1, tl2); 11742191Smckusic *tcp = tl; /* update index var */ 11752080Smckusick pc.cp += *pc.sp;/* return to top of loop */ 11762080Smckusick continue; 11772080Smckusick } 11782191Smckusic pc.sp += 3; /* else fall through */ 11792080Smckusick continue; 11802080Smckusick case O_FOR2U: 11812080Smckusick pc.cp++; 11822950Smckusic tsp = (short *)popaddr(); /* tsp = ptr to index var */ 11832080Smckusick if (*tsp < pop4()) { /* still going up */ 11842191Smckusic tl = *tsp + 1; /* inc index var */ 11852191Smckusic tl1 = *pc.sp++; /* index lower bound */ 11862191Smckusic tl2 = *pc.sp++; /* index upper bound */ 11872191Smckusic if (_runtst) 11882191Smckusic RANG4(tl, tl1, tl2); 11892191Smckusic *tsp = tl; /* update index var */ 11902080Smckusick pc.cp += *pc.sp;/* return to top of loop */ 11912080Smckusick continue; 11922080Smckusick } 11932191Smckusic pc.sp += 3; /* else fall through */ 11942080Smckusick continue; 11952080Smckusick case O_FOR4U: 11962080Smckusick pc.cp++; 11972950Smckusic tlp = (long *)popaddr(); /* tlp = ptr to index var */ 11982080Smckusick if (*tlp < pop4()) { /* still going up */ 11992191Smckusic tl = *tlp + 1; /* inc index var */ 12002191Smckusic tl1 = *pc.lp++; /* index lower bound */ 12012191Smckusic tl2 = *pc.lp++; /* index upper bound */ 12022191Smckusic if (_runtst) 12032191Smckusic RANG4(tl, tl1, tl2); 12042191Smckusic *tlp = tl; /* update index var */ 12052080Smckusick pc.cp += *pc.sp;/* return to top of loop */ 12062080Smckusick continue; 12072080Smckusick } 12082191Smckusic pc.sp += 5; /* else fall through */ 12092080Smckusick continue; 12102080Smckusick case O_FOR1D: 12112080Smckusick pc.cp++; 12122950Smckusic tcp = popaddr(); /* tcp = ptr to index var */ 12132080Smckusick if (*tcp > pop4()) { /* still going down */ 12142191Smckusic tl = *tcp - 1; /* inc index var */ 12152191Smckusic tl1 = *pc.sp++; /* index lower bound */ 12162191Smckusic tl2 = *pc.sp++; /* index upper bound */ 12172191Smckusic if (_runtst) 12182191Smckusic RANG4(tl, tl1, tl2); 12192191Smckusic *tcp = tl; /* update index var */ 12202080Smckusick pc.cp += *pc.sp;/* return to top of loop */ 12212080Smckusick continue; 12222080Smckusick } 12232191Smckusic pc.sp += 3; /* else fall through */ 12242080Smckusick continue; 12252080Smckusick case O_FOR2D: 12262080Smckusick pc.cp++; 12272950Smckusic tsp = (short *)popaddr(); /* tsp = ptr to index var */ 12282080Smckusick if (*tsp > pop4()) { /* still going down */ 12292191Smckusic tl = *tsp - 1; /* inc index var */ 12302191Smckusic tl1 = *pc.sp++; /* index lower bound */ 12312191Smckusic tl2 = *pc.sp++; /* index upper bound */ 12322191Smckusic if (_runtst) 12332191Smckusic RANG4(tl, tl1, tl2); 12342191Smckusic *tsp = tl; /* update index var */ 12352080Smckusick pc.cp += *pc.sp;/* return to top of loop */ 12362080Smckusick continue; 12372080Smckusick } 12382191Smckusic pc.sp += 3; /* else fall through */ 12392080Smckusick continue; 12402080Smckusick case O_FOR4D: 12412080Smckusick pc.cp++; 12422950Smckusic tlp = (long *)popaddr(); /* tlp = ptr to index var */ 12432080Smckusick if (*tlp > pop4()) { /* still going down */ 12442191Smckusic tl = *tlp - 1; /* inc index var */ 12452191Smckusic tl1 = *pc.lp++; /* index lower bound */ 12462191Smckusic tl2 = *pc.lp++; /* index upper bound */ 12472191Smckusic if (_runtst) 12482191Smckusic RANG4(tl, tl1, tl2); 12492191Smckusic *tlp = tl; /* update index var */ 12502080Smckusick pc.cp += *pc.sp;/* return to top of loop */ 12512080Smckusick continue; 12522080Smckusick } 12532191Smckusic pc.sp += 5; /* else fall through */ 12542080Smckusick continue; 12552080Smckusick case O_READE: 12562080Smckusick pc.cp++; 12572950Smckusic push2((short)(READE(curfile, base + *pc.lp++))); 12582080Smckusick continue; 12592080Smckusick case O_READ4: 12602080Smckusick pc.cp++; 12612080Smckusick push4(READ4(curfile)); 12622080Smckusick continue; 12632080Smckusick case O_READC: 12642080Smckusick pc.cp++; 12652950Smckusic push2((short)(READC(curfile))); 12662080Smckusick continue; 12672080Smckusick case O_READ8: 12682080Smckusick pc.cp++; 12692080Smckusick push8(READ8(curfile)); 12702080Smckusick continue; 12712080Smckusick case O_READLN: 12722080Smckusick pc.cp++; 12732080Smckusick READLN(curfile); 12742080Smckusick continue; 12752080Smckusick case O_EOF: 12762080Smckusick pc.cp++; 12772950Smckusic push2((short)(TEOF(popaddr()))); 12782080Smckusick continue; 12792080Smckusick case O_EOLN: 12802080Smckusick pc.cp++; 12812950Smckusic push2((short)(TEOLN(popaddr()))); 12822080Smckusick continue; 12832080Smckusick case O_WRITEC: 12842191Smckusic if (_runtst) { 12852191Smckusic WRITEC(curfile); 12863166Smckusic popsp((long)(*pc.cp++)); 12872191Smckusic continue; 12882191Smckusic } 12892191Smckusic fputc(); 12903166Smckusic popsp((long)(*pc.cp++)); 12912080Smckusick continue; 12922080Smckusick case O_WRITES: 12932191Smckusic if (_runtst) { 12942191Smckusic WRITES(curfile); 12953166Smckusic popsp((long)(*pc.cp++)); 12962191Smckusic continue; 12972191Smckusic } 12982191Smckusic fwrite(); 12993166Smckusic popsp((long)(*pc.cp++)); 13002080Smckusick continue; 13012080Smckusick case O_WRITEF: 13022191Smckusic if (_runtst) { 13032191Smckusic WRITEF(curfile); 13043166Smckusic popsp((long)(*pc.cp++)); 13052191Smckusic continue; 13062191Smckusic } 13072191Smckusic fprintf(); 13083166Smckusic popsp((long)(*pc.cp++)); 13092080Smckusick continue; 13102080Smckusick case O_WRITLN: 13112080Smckusick pc.cp++; 13122191Smckusic if (_runtst) { 13132191Smckusic WRITLN(curfile); 13142191Smckusic continue; 13152191Smckusic } 13162191Smckusic fputc('\n', ACTFILE(curfile)); 13172080Smckusick continue; 13182080Smckusick case O_PAGE: 13192080Smckusick pc.cp++; 13202191Smckusic if (_runtst) { 13212191Smckusic PAGE(curfile); 13222191Smckusic continue; 13232191Smckusic } 13242950Smckusic fputc('', ACTFILE(curfile)); 13252080Smckusick continue; 13262080Smckusick case O_NAM: 13272080Smckusick pc.cp++; 13282080Smckusick tl = pop4(); 13292080Smckusick pushaddr(NAM(tl, base + *pc.lp++)); 13302080Smckusick continue; 13312080Smckusick case O_MAX: 13322080Smckusick tl = *pc.cp++; 13332080Smckusick if (tl == 0) 13342080Smckusick tl = *pc.usp++; 13352080Smckusick tl1 = pop4(); 13362191Smckusic if (_runtst) { 13372950Smckusic push4(MAX(tl1, tl, (long)(*pc.usp++))); 13382191Smckusic continue; 13392191Smckusic } 13402191Smckusic tl1 -= tl; 13412191Smckusic tl = *pc.usp++; 13422191Smckusic push4(tl1 > tl ? tl1 : tl); 13432080Smckusick continue; 13442080Smckusick case O_MIN: 13452080Smckusick tl = *pc.cp++; 13462080Smckusick if (tl == 0) 13472080Smckusick tl = *pc.usp++; 13482080Smckusick tl1 = pop4(); 13492080Smckusick push4(tl1 < tl ? tl1 : tl); 13502080Smckusick continue; 13512080Smckusick case O_UNIT: 13522080Smckusick pc.cp++; 13532080Smckusick curfile = UNIT(popaddr()); 13542080Smckusick continue; 13552080Smckusick case O_UNITINP: 13562080Smckusick pc.cp++; 13572080Smckusick curfile = INPUT; 13582080Smckusick continue; 13592080Smckusick case O_UNITOUT: 13602080Smckusick pc.cp++; 13612080Smckusick curfile = OUTPUT; 13622080Smckusick continue; 13632080Smckusick case O_MESSAGE: 13642080Smckusick pc.cp++; 13652080Smckusick PFLUSH(); 13662080Smckusick curfile = ERR; 13672080Smckusick continue; 13682109Smckusic case O_PUT: 13692109Smckusic pc.cp++; 13702109Smckusic PUT(curfile); 13712109Smckusic continue; 13722080Smckusick case O_GET: 13732080Smckusick pc.cp++; 13742080Smckusick GET(curfile); 13752080Smckusick continue; 13762080Smckusick case O_FNIL: 13772080Smckusick pc.cp++; 13782080Smckusick pushaddr(FNIL(popaddr())); 13792080Smckusick continue; 13802080Smckusick case O_DEFNAME: 13812080Smckusick pc.cp++; 13822080Smckusick DEFNAME(); 13832950Smckusic popsp((long)(2*sizeof(char *)+2*sizeof(long))); 13842080Smckusick continue; 13852080Smckusick case O_RESET: 13862080Smckusick pc.cp++; 13872080Smckusick RESET(); 13882950Smckusic popsp((long)(2*sizeof(char *)+2*sizeof(long))); 13892080Smckusick continue; 13902080Smckusick case O_REWRITE: 13912080Smckusick pc.cp++; 13922080Smckusick REWRITE(); 13932950Smckusic popsp((long)(2*sizeof(char *)+2*sizeof(long))); 13942080Smckusick continue; 13952080Smckusick case O_FILE: 13962080Smckusick pc.cp++; 13972080Smckusick pushaddr(ACTFILE(curfile)); 13982080Smckusick continue; 13992080Smckusick case O_REMOVE: 14002080Smckusick pc.cp++; 14012080Smckusick REMOVE(); 14022950Smckusic popsp((long)(sizeof(char *)+sizeof(long))); 14032080Smckusick continue; 14042080Smckusick case O_FLUSH: 14052080Smckusick pc.cp++; 14062080Smckusick FLUSH(); 14072950Smckusic popsp((long)(sizeof(char *))); 14082080Smckusick continue; 14092080Smckusick case O_PACK: 14102080Smckusick pc.cp++; 14112080Smckusick PACK(); 14122950Smckusic popsp((long)(5*sizeof(long)+2*sizeof(char*))); 14132080Smckusick continue; 14142080Smckusick case O_UNPACK: 14152080Smckusick pc.cp++; 14162080Smckusick UNPACK(); 14172950Smckusic popsp((long)(5*sizeof(long)+2*sizeof(char*))); 14182080Smckusick continue; 14192080Smckusick case O_ARGC: 14202080Smckusick pc.cp++; 14212950Smckusic push4((long)_argc); 14222080Smckusick continue; 14232080Smckusick case O_ARGV: 14242080Smckusick tl = *pc.cp++; /* tl = size of char array */ 14252080Smckusick if (tl == 0) 14262080Smckusick tl = *pc.usp++; 14272080Smckusick tcp = popaddr(); /* tcp = addr of char array */ 14282080Smckusick tl1 = pop4(); /* tl1 = argv subscript */ 14292080Smckusick ARGV(tl1, tcp, tl); 14302080Smckusick continue; 14312080Smckusick case O_CLCK: 14322080Smckusick pc.cp++; 14332080Smckusick push4(CLCK()); 14342080Smckusick continue; 14352080Smckusick case O_WCLCK: 14362080Smckusick pc.cp++; 14372080Smckusick push4(time(0)); 14382080Smckusick continue; 14392080Smckusick case O_SCLCK: 14402080Smckusick pc.cp++; 14412080Smckusick push4(SCLCK()); 14422080Smckusick continue; 14432080Smckusick case O_DISPOSE: 14442080Smckusick tl = *pc.cp++; /* tl = size being disposed */ 14452080Smckusick if (tl == 0) 14462080Smckusick tl = *pc.usp++; 14472080Smckusick tcp = popaddr(); /* ptr to ptr being disposed */ 14482080Smckusick DISPOSE(tcp, tl); 14492080Smckusick *(char **)tcp = (char *)0; 14502080Smckusick continue; 14512080Smckusick case O_NEW: 14522080Smckusick tl = *pc.cp++; /* tl = size being new'ed */ 14532080Smckusick if (tl == 0) 14542080Smckusick tl = *pc.usp++; 14552080Smckusick tcp = popaddr(); /* ptr to ptr being new'ed */ 14562191Smckusic if (_runtst) { 14572191Smckusic NEWZ(tcp, tl); 14582191Smckusic continue; 14592191Smckusic } 14602191Smckusic NEW(tcp, tl); 14612080Smckusick continue; 14622080Smckusick case O_DATE: 14632080Smckusick pc.cp++; 14642080Smckusick DATE(popaddr()); 14652080Smckusick continue; 14662080Smckusick case O_TIME: 14672080Smckusick pc.cp++; 14682080Smckusick TIME(popaddr()); 14692080Smckusick continue; 14702080Smckusick case O_UNDEF: 14712080Smckusick pc.cp++; 14722080Smckusick pop8(); 14732950Smckusic push2((short)(0)); 14742080Smckusick continue; 14752080Smckusick case O_ATAN: 14762080Smckusick pc.cp++; 14772080Smckusick push8(atan(pop8())); 14782080Smckusick continue; 14792080Smckusick case O_COS: 14802080Smckusick pc.cp++; 14812080Smckusick push8(cos(pop8())); 14822080Smckusick continue; 14832080Smckusick case O_EXP: 14842080Smckusick pc.cp++; 14852080Smckusick push8(exp(pop8())); 14862080Smckusick continue; 14872080Smckusick case O_LN: 14882080Smckusick pc.cp++; 14892191Smckusic if (_runtst) { 14902191Smckusic push8(LN(pop8())); 14912191Smckusic continue; 14922191Smckusic } 14932191Smckusic push8(log(pop8())); 14942080Smckusick continue; 14952080Smckusick case O_SIN: 14962080Smckusick pc.cp++; 14972080Smckusick push8(sin(pop8())); 14982080Smckusick continue; 14992080Smckusick case O_SQRT: 15002080Smckusick pc.cp++; 15012191Smckusic if (_runtst) { 15022191Smckusic push8(SQRT(pop8())); 15032191Smckusic continue; 15042191Smckusic } 15052191Smckusic push8(sqrt(pop8())); 15062080Smckusick continue; 15072080Smckusick case O_CHR2: 15082080Smckusick case O_CHR4: 15092080Smckusick pc.cp++; 15102191Smckusic if (_runtst) { 15112950Smckusic push2((short)(CHR(pop4()))); 15122191Smckusic continue; 15132191Smckusic } 15142950Smckusic push2((short)(pop4())); 15152080Smckusick continue; 15162080Smckusick case O_ODD2: 15172080Smckusick case O_ODD4: 15182080Smckusick pc.cp++; 15192950Smckusic push2((short)(pop4() & 1)); 15202080Smckusick continue; 15212080Smckusick case O_SUCC2: 15222109Smckusic tl = *pc.cp++; 15232109Smckusic if (tl == 0) 15242109Smckusic tl = *pc.sp++; 15252109Smckusic tl1 = pop4(); 15262191Smckusic if (_runtst) { 15272950Smckusic push2((short)(SUCC(tl1, tl, (long)(*pc.sp++)))); 15282191Smckusic continue; 15292191Smckusic } 15302950Smckusic push2((short)(tl1 + 1)); 15312191Smckusic pc.sp++; 15322080Smckusick continue; 15332080Smckusick case O_SUCC24: 15342109Smckusic tl = *pc.cp++; 15352109Smckusic if (tl == 0) 15362109Smckusic tl = *pc.sp++; 15372109Smckusic tl1 = pop4(); 15382191Smckusic if (_runtst) { 15392950Smckusic push4(SUCC(tl1, tl, (long)(*pc.sp++))); 15402191Smckusic continue; 15412191Smckusic } 15422191Smckusic push4(tl1 + 1); 15432191Smckusic pc.sp++; 15442109Smckusic continue; 15452080Smckusick case O_SUCC4: 15462109Smckusic tl = *pc.cp++; 15472109Smckusic if (tl == 0) 15482109Smckusic tl = *pc.lp++; 15492109Smckusic tl1 = pop4(); 15502191Smckusic if (_runtst) { 15512950Smckusic push4(SUCC(tl1, tl, (long)(*pc.lp++))); 15522191Smckusic continue; 15532191Smckusic } 15542191Smckusic push4(tl1 + 1); 15552191Smckusic pc.lp++; 15562080Smckusick continue; 15572080Smckusick case O_PRED2: 15582109Smckusic tl = *pc.cp++; 15592109Smckusic if (tl == 0) 15602109Smckusic tl = *pc.sp++; 15612109Smckusic tl1 = pop4(); 15622191Smckusic if (_runtst) { 15632950Smckusic push2((short)(PRED(tl1, tl, (long)(*pc.sp++)))); 15642191Smckusic continue; 15652191Smckusic } 15662950Smckusic push2((short)(tl1 - 1)); 15672191Smckusic pc.sp++; 15682080Smckusick continue; 15692080Smckusick case O_PRED24: 15702109Smckusic tl = *pc.cp++; 15712109Smckusic if (tl == 0) 15722109Smckusic tl = *pc.sp++; 15732109Smckusic tl1 = pop4(); 15742191Smckusic if (_runtst) { 15752950Smckusic push4(PRED(tl1, tl, (long)(*pc.sp++))); 15762191Smckusic continue; 15772191Smckusic } 15782191Smckusic push4(tl1 - 1); 15792191Smckusic pc.sp++; 15802109Smckusic continue; 15812080Smckusick case O_PRED4: 15822109Smckusic tl = *pc.cp++; 15832109Smckusic if (tl == 0) 15842109Smckusic tl = *pc.lp++; 15852109Smckusic tl1 = pop4(); 15862191Smckusic if (_runtst) { 15872950Smckusic push4(PRED(tl1, tl, (long)(*pc.lp++))); 15882191Smckusic continue; 15892191Smckusic } 15902191Smckusic push4(tl1 - 1); 15912191Smckusic pc.lp++; 15922080Smckusick continue; 15932080Smckusick case O_SEED: 15942080Smckusick pc.cp++; 15952080Smckusick push4(SEED(pop4())); 15962080Smckusick continue; 15972080Smckusick case O_RANDOM: 15982080Smckusick pc.cp++; 15992080Smckusick push8(RANDOM(pop8())); 16002080Smckusick continue; 16012080Smckusick case O_EXPO: 16022080Smckusick pc.cp++; 16032080Smckusick push4(EXPO(pop8())); 16042080Smckusick continue; 16052080Smckusick case O_SQR2: 16062080Smckusick case O_SQR4: 16072080Smckusick pc.cp++; 16082080Smckusick tl = pop4(); 16092080Smckusick push4(tl * tl); 16102080Smckusick continue; 16112080Smckusick case O_SQR8: 16122080Smckusick pc.cp++; 16132080Smckusick td = pop8(); 16142080Smckusick push8(td * td); 16152080Smckusick continue; 16162080Smckusick case O_ROUND: 16172080Smckusick pc.cp++; 16182080Smckusick push4(ROUND(pop8())); 16192080Smckusick continue; 16202080Smckusick case O_TRUNC: 16212080Smckusick pc.cp++; 16222080Smckusick push4(TRUNC(pop8())); 16232080Smckusick continue; 16242950Smckusic default: 16252950Smckusic panic(PBADOP); 16262950Smckusic continue; 16272080Smckusick } 16282080Smckusick } 16292080Smckusick } 1630