12080Smckusick /* Copyright (c) 1979 Regents of the University of California */ 22080Smckusick 3*2950Smckusic static char sccsid[] = "@(#)interp.c 1.9 03/06/81"; 42080Smckusick 52080Smckusick #include <math.h> 6*2950Smckusic #include "whoami.h" 7*2950Smckusic #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; 24*2950Smckusic bool _runtst = TRUE; 25*2950Smckusic bool _nodump = FALSE; 262080Smckusick long _stlim = 500000; 272080Smckusick long _stcnt = 0; 282191Smckusic long _seed = 1; 29*2950Smckusic #ifdef VAX 302080Smckusick char *_minptr = (char *)0x7fffffff; 31*2950Smckusic #else 32*2950Smckusic char *_minptr = (char *)0xffff; 33*2950Smckusic #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; 43*2950Smckusic struct iorechd _err = { 44*2950Smckusic &_errwin, /* fileptr */ 452080Smckusick 0, /* lcount */ 462080Smckusick 0x7fffffff, /* llimit */ 47*2950Smckusic &_iob[2], /* fbuf */ 48*2950Smckusic FILNIL, /* fchain */ 492080Smckusick STDLVL, /* flev */ 50*2950Smckusic "Message file", /* pfname */ 51*2950Smckusic FTEXT | FWRITE | EOFF, /* funit */ 52*2950Smckusic 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 }; 67*2950Smckusic struct iorechd input = { 68*2950Smckusic &_inwin, /* fileptr */ 692080Smckusick 0, /* lcount */ 702080Smckusick 0x7fffffff, /* llimit */ 71*2950Smckusic &_iob[0], /* fbuf */ 72*2950Smckusic OUTPUT, /* fchain */ 732080Smckusick STDLVL, /* flev */ 74*2950Smckusic "standard input", /* pfname */ 75*2950Smckusic FTEXT | FREAD | SYNC, /* funit */ 76*2950Smckusic 0, /* fblk */ 772080Smckusick 1 /* fsize */ 782080Smckusick }; 792080Smckusick 802109Smckusic /* 81*2950Smckusic * file record variables 82*2950Smckusic */ 83*2950Smckusic long _filefre = PREDEF; 84*2950Smckusic struct iorechd _fchain = { 85*2950Smckusic 0, 0, 0, 0, /* only use fchain field */ 86*2950Smckusic INPUT /* fchain */ 87*2950Smckusic }; 88*2950Smckusic struct iorec *_actfile[MAXFILES] = { 89*2950Smckusic INPUT, 90*2950Smckusic OUTPUT, 91*2950Smckusic ERR 92*2950Smckusic }; 93*2950Smckusic 94*2950Smckusic /* 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; 124*2950Smckusic register short *tsp, *tsp1, ts; 125*2950Smckusic 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 */ 147*2950Smckusic _display.frame[0].locvars = pushsp((long)(2 * sizeof(struct iorec *))); 148*2950Smckusic _display.frame[0].locvars += 2 * sizeof(struct iorec *); 149*2950Smckusic *(struct iorec **)(_display.frame[0].locvars + OUTPUT_OFF) = OUTPUT; 150*2950Smckusic *(struct iorec **)(_display.frame[0].locvars + INPUT_OFF) = INPUT; 151*2950Smckusic 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(); 178*2950Smckusic 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 */ 181*2950Smckusic if (_runtst) /* zero stack frame */ 182*2950Smckusic blkclr(tl1, tcp); 183*2950Smckusic tcp += (int)tl1; /* offsets of locals are neg */ 1842109Smckusic _dp->locvars = tcp; /* set new display pointer */ 1852109Smckusic _dp->stp = stp; 186*2950Smckusic 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; 211*2950Smckusic stp = (struct stack *) 212*2950Smckusic 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: 2202080Smckusick tl = *pc.cp++; /* tl = number of args */ 2212080Smckusick if (tl == 0) 2222080Smckusick tl = *pc.lp++; 2232080Smckusick tfp = (struct formalrtn *)popaddr(); 224*2950Smckusic stp = (struct stack *) 225*2950Smckusic pushsp((long)(sizeof(struct stack))); 2262080Smckusick stp->lino = _lino; /* save lino, pc, dp */ 2272080Smckusick stp->pc.cp = pc.cp; 2282080Smckusick stp->dp = _dp; 2292080Smckusick pc.cp = tfp->entryaddr; /* calc new entry point */ 2302191Smckusic if (_runtst) { 2312191Smckusic tpc.sp = pc.sp + 1; 2322191Smckusic tl -= tpc.hdrp->nargs; 2332191Smckusic if (tl != 0) { 2342191Smckusic if (tl > 0) 2352191Smckusic tl += sizeof(int) - 1; 2362191Smckusic else 2372191Smckusic tl -= sizeof(int) - 1; 2382191Smckusic ERROR(ENARGS, tl / sizeof(int)); 2392191Smckusic } 2402080Smckusick } 2412109Smckusic _dp = &_display.frame[tfp->cbn];/* new display ptr */ 242*2950Smckusic blkcpy(tfp->cbn * sizeof(struct disp), 2432109Smckusic &_display.frame[1], &tfp->disp[tfp->cbn]); 244*2950Smckusic blkcpy(tfp->cbn * sizeof(struct disp), 2452109Smckusic &tfp->disp[0], &_display.frame[1]); 2462080Smckusick continue; 2472080Smckusick case O_FRTN: 2482080Smckusick tl = *pc.cp++; /* tl = size of return obj */ 2492080Smckusick if (tl == 0) 2502080Smckusick tl = *pc.usp++; 251*2950Smckusic tcp = pushsp((long)(0)); 2522080Smckusick tfp = *(struct formalrtn **)(tcp + tl); 2532080Smckusick blkcpy(tl, tcp, tcp + sizeof(struct formalrtn *)); 254*2950Smckusic popsp((long)(sizeof(struct formalrtn *))); 255*2950Smckusic blkcpy(tfp->cbn * sizeof(struct disp), 2562109Smckusic &tfp->disp[tfp->cbn], &_display.frame[1]); 2572080Smckusick continue; 2582080Smckusick case O_FSAV: 2592080Smckusick tfp = (struct formalrtn *)popaddr(); 2602080Smckusick tfp->cbn = *pc.cp++; /* blk number of routine */ 2612080Smckusick tcp = base + *pc.lp++;/* calc new entry point */ 2622080Smckusick tcp += sizeof(short); 2632080Smckusick tfp->entryaddr = base + *(long *)tcp; 264*2950Smckusic blkcpy(tfp->cbn * sizeof(struct disp), 2652109Smckusic &_display.frame[1], &tfp->disp[0]); 2662080Smckusick pushaddr(tfp); 2672080Smckusick continue; 2682080Smckusick case O_SDUP2: 2692080Smckusick pc.cp++; 2702080Smckusick tl = pop2(); 271*2950Smckusic push2((short)(tl)); 272*2950Smckusic push2((short)(tl)); 2732080Smckusick continue; 2742080Smckusick case O_SDUP4: 2752080Smckusick pc.cp++; 2762080Smckusick tl = pop4(); 2772080Smckusick push4(tl); 2782080Smckusick push4(tl); 2792080Smckusick continue; 2802080Smckusick case O_TRA: 2812080Smckusick pc.cp++; 2822080Smckusick pc.cp += *pc.sp; 2832080Smckusick continue; 2842080Smckusick case O_TRA4: 2852080Smckusick pc.cp++; 2862080Smckusick pc.cp = base + *pc.lp; 2872080Smckusick continue; 2882080Smckusick case O_GOTO: 2892109Smckusic tstp = _display.frame[*pc.cp++].stp; /* ptr to 2902109Smckusic exit frame */ 2912080Smckusick pc.cp = base + *pc.lp; 2922080Smckusick stp = _dp->stp; 2932080Smckusick while (tstp != stp) { 2942109Smckusic if (_dp == &_display.frame[1]) 2952080Smckusick ERROR(EGOTO); /* exiting prog ??? */ 2962080Smckusick PCLOSE(_dp->locvars); /* close local files */ 2972080Smckusick curfile = stp->file; /* restore active file */ 2982080Smckusick *_dp = stp->odisp; /* old display entry */ 2992080Smckusick _dp = stp->dp; /* restore dp */ 3002080Smckusick stp = _dp->stp; 3012080Smckusick } 3022080Smckusick /* pop locals, stack frame, parms, and return values */ 303*2950Smckusic popsp((long)(stp->tos - pushsp((long)(0)))); 3042080Smckusick continue; 3052080Smckusick case O_LINO: 306*2950Smckusic if (_dp->stp->tos != pushsp((long)(0))) 3072080Smckusick panic(PSTKNEMP); 3082080Smckusick _lino = *pc.cp++; /* set line number */ 3092080Smckusick if (_lino == 0) 3102080Smckusick _lino = *pc.sp++; 311*2950Smckusic if (_runtst) { 312*2950Smckusic LINO(); /* inc statement count */ 313*2950Smckusic continue; 314*2950Smckusic } 315*2950Smckusic _stcnt++; 3162080Smckusick continue; 3172080Smckusick case O_PUSH: 3182080Smckusick tl = *pc.cp++; 3192080Smckusick if (tl == 0) 3202080Smckusick tl = *pc.usp++; 3212080Smckusick tl = (-tl + 1) & ~1; 3222080Smckusick tcp = pushsp(tl); 323*2950Smckusic if (_runtst) 324*2950Smckusic blkclr(tl, tcp); 3252080Smckusick continue; 3262080Smckusick case O_IF: 3272080Smckusick pc.cp++; 3282191Smckusic if (pop2()) { 3292080Smckusick pc.sp++; 3302191Smckusic continue; 3312191Smckusic } 3322191Smckusic pc.cp += *pc.sp; 3332080Smckusick continue; 3342080Smckusick case O_REL2: 3352080Smckusick tl = pop2(); 3362080Smckusick tl1 = pop2(); 3372080Smckusick goto cmplong; 3382080Smckusick case O_REL24: 3392080Smckusick tl = pop2(); 3402080Smckusick tl1 = pop4(); 3412080Smckusick goto cmplong; 3422080Smckusick case O_REL42: 3432080Smckusick tl = pop4(); 3442080Smckusick tl1 = pop2(); 3452080Smckusick goto cmplong; 3462080Smckusick case O_REL4: 3472080Smckusick tl = pop4(); 3482080Smckusick tl1 = pop4(); 3492080Smckusick cmplong: 3502080Smckusick tl2 = *pc.cp++; 3512080Smckusick switch (tl2) { 3522080Smckusick case releq: 3532080Smckusick push2(tl1 == tl); 3542080Smckusick continue; 3552080Smckusick case relne: 3562080Smckusick push2(tl1 != tl); 3572080Smckusick continue; 3582080Smckusick case rellt: 3592080Smckusick push2(tl1 < tl); 3602080Smckusick continue; 3612080Smckusick case relgt: 3622080Smckusick push2(tl1 > tl); 3632080Smckusick continue; 3642080Smckusick case relle: 3652080Smckusick push2(tl1 <= tl); 3662080Smckusick continue; 3672080Smckusick case relge: 3682080Smckusick push2(tl1 >= tl); 3692080Smckusick continue; 3702080Smckusick default: 3712080Smckusick panic(PSYSTEM); 3722080Smckusick continue; 3732080Smckusick } 3742080Smckusick case O_RELG: 3752080Smckusick tl2 = *pc.cp++; /* tc has jump opcode */ 3762080Smckusick tl = *pc.usp++; /* tl has comparison length */ 3772080Smckusick tl1 = (tl + 1) & ~1; /* tl1 has arg stack length */ 378*2950Smckusic tcp = pushsp((long)(0));/* tcp pts to first arg */ 3792080Smckusick switch (tl2) { 3802080Smckusick case releq: 381*2950Smckusic tb = RELEQ(tl, tcp + tl1, tcp); 3822080Smckusick break; 3832080Smckusick case relne: 384*2950Smckusic tb = RELNE(tl, tcp + tl1, tcp); 3852080Smckusick break; 3862080Smckusick case rellt: 387*2950Smckusic tb = RELSLT(tl, tcp + tl1, tcp); 3882080Smckusick break; 3892080Smckusick case relgt: 390*2950Smckusic tb = RELSGT(tl, tcp + tl1, tcp); 3912080Smckusick break; 3922080Smckusick case relle: 393*2950Smckusic tb = RELSLE(tl, tcp + tl1, tcp); 3942080Smckusick break; 3952080Smckusick case relge: 396*2950Smckusic tb = RELSGE(tl, tcp + tl1, tcp); 3972080Smckusick break; 3982080Smckusick default: 3992080Smckusick panic(PSYSTEM); 4002080Smckusick break; 4012080Smckusick } 4022080Smckusick popsp(tl1 << 1); 403*2950Smckusic push2((short)(tb)); 4042080Smckusick continue; 4052080Smckusick case O_RELT: 4062080Smckusick tl2 = *pc.cp++; /* tc has jump opcode */ 4072080Smckusick tl1 = *pc.usp++; /* tl1 has comparison length */ 408*2950Smckusic tcp = pushsp((long)(0));/* tcp pts to first arg */ 4092080Smckusick switch (tl2) { 4102080Smckusick case releq: 411*2950Smckusic tb = RELEQ(tl1, tcp + tl1, tcp); 4122080Smckusick break; 4132080Smckusick case relne: 414*2950Smckusic tb = RELNE(tl1, tcp + tl1, tcp); 4152080Smckusick break; 4162080Smckusick case rellt: 417*2950Smckusic tb = RELTLT(tl1, tcp + tl1, tcp); 4182080Smckusick break; 4192080Smckusick case relgt: 420*2950Smckusic tb = RELTGT(tl1, tcp + tl1, tcp); 4212080Smckusick break; 4222080Smckusick case relle: 423*2950Smckusic tb = RELTLE(tl1, tcp + tl1, tcp); 4242080Smckusick break; 4252080Smckusick case relge: 426*2950Smckusic tb = RELTGE(tl1, tcp + tl1, tcp); 4272080Smckusick break; 4282080Smckusick default: 4292080Smckusick panic(PSYSTEM); 4302080Smckusick break; 4312080Smckusick } 4322080Smckusick popsp(tl1 << 1); 433*2950Smckusic push2((short)(tb)); 4342080Smckusick continue; 4352080Smckusick case O_REL28: 4362080Smckusick td = pop2(); 4372080Smckusick td1 = pop8(); 4382080Smckusick goto cmpdbl; 4392080Smckusick case O_REL48: 4402080Smckusick td = pop4(); 4412080Smckusick td1 = pop8(); 4422080Smckusick goto cmpdbl; 4432080Smckusick case O_REL82: 4442080Smckusick td = pop8(); 4452080Smckusick td1 = pop2(); 4462080Smckusick goto cmpdbl; 4472080Smckusick case O_REL84: 4482080Smckusick td = pop8(); 4492080Smckusick td1 = pop4(); 4502080Smckusick goto cmpdbl; 4512080Smckusick case O_REL8: 4522080Smckusick td = pop8(); 4532080Smckusick td1 = pop8(); 4542080Smckusick cmpdbl: 4552080Smckusick switch (*pc.cp++) { 4562080Smckusick case releq: 4572080Smckusick push2(td1 == td); 4582080Smckusick continue; 4592080Smckusick case relne: 4602080Smckusick push2(td1 != td); 4612080Smckusick continue; 4622080Smckusick case rellt: 4632080Smckusick push2(td1 < td); 4642080Smckusick continue; 4652080Smckusick case relgt: 4662080Smckusick push2(td1 > td); 4672080Smckusick continue; 4682080Smckusick case relle: 4692080Smckusick push2(td1 <= td); 4702080Smckusick continue; 4712080Smckusick case relge: 4722080Smckusick push2(td1 >= td); 4732080Smckusick continue; 4742080Smckusick default: 4752080Smckusick panic(PSYSTEM); 4762080Smckusick continue; 4772080Smckusick } 4782080Smckusick case O_AND: 4792080Smckusick pc.cp++; 4802080Smckusick push2(pop2() & pop2()); 4812080Smckusick continue; 4822080Smckusick case O_OR: 4832080Smckusick pc.cp++; 4842080Smckusick push2(pop2() | pop2()); 4852080Smckusick continue; 4862080Smckusick case O_NOT: 4872080Smckusick pc.cp++; 4882080Smckusick push2(pop2() ^ 1); 4892080Smckusick continue; 4902080Smckusick case O_AS2: 4912080Smckusick pc.cp++; 4922080Smckusick tl = pop2(); 4932080Smckusick *(short *)popaddr() = tl; 4942080Smckusick continue; 4952080Smckusick case O_AS4: 4962080Smckusick pc.cp++; 4972080Smckusick tl = pop4(); 4982080Smckusick *(long *)popaddr() = tl; 4992080Smckusick continue; 5002080Smckusick case O_AS24: 5012080Smckusick pc.cp++; 5022080Smckusick tl = pop2(); 5032080Smckusick *(long *)popaddr() = tl; 5042080Smckusick continue; 5052080Smckusick case O_AS42: 5062080Smckusick pc.cp++; 5072080Smckusick tl = pop4(); 5082080Smckusick *(short *)popaddr() = tl; 5092080Smckusick continue; 5102080Smckusick case O_AS21: 5112080Smckusick pc.cp++; 5122080Smckusick tl = pop2(); 5132080Smckusick *popaddr() = tl; 5142080Smckusick continue; 5152080Smckusick case O_AS41: 5162080Smckusick pc.cp++; 5172080Smckusick tl = pop4(); 5182080Smckusick *popaddr() = tl; 5192080Smckusick continue; 5202080Smckusick case O_AS28: 5212080Smckusick pc.cp++; 5222080Smckusick tl = pop2(); 5232080Smckusick *(double *)popaddr() = tl; 5242080Smckusick continue; 5252080Smckusick case O_AS48: 5262080Smckusick pc.cp++; 5272080Smckusick tl = pop4(); 5282080Smckusick *(double *)popaddr() = tl; 5292080Smckusick continue; 5302080Smckusick case O_AS8: 5312080Smckusick pc.cp++; 5322239Smckusic t8 = popsze8(); 5332239Smckusic *(struct sze8 *)popaddr() = t8; 5342080Smckusick continue; 5352080Smckusick case O_AS: 5362080Smckusick tl = *pc.cp++; 5372080Smckusick if (tl == 0) 5382080Smckusick tl = *pc.usp++; 5392080Smckusick tl1 = (tl + 1) & ~1; 540*2950Smckusic tcp = pushsp((long)(0)); 5412080Smckusick blkcpy(tl, tcp, *(char **)(tcp + tl1)); 5422080Smckusick popsp(tl1 + sizeof(char *)); 5432080Smckusick continue; 5442080Smckusick case O_INX2P2: 5452080Smckusick tl = *pc.cp++; /* tl has shift amount */ 5462080Smckusick tl1 = (pop2() - *pc.sp++) << tl; 5472080Smckusick pushaddr(popaddr() + tl1); 5482080Smckusick continue; 5492080Smckusick case O_INX4P2: 5502080Smckusick tl = *pc.cp++; /* tl has shift amount */ 5512080Smckusick tl1 = (pop4() - *pc.sp++) << tl; 5522080Smckusick pushaddr(popaddr() + tl1); 5532080Smckusick continue; 5542080Smckusick case O_INX2: 5552080Smckusick tl = *pc.cp++; /* tl has element size */ 5562080Smckusick if (tl == 0) 5572080Smckusick tl = *pc.usp++; 5582080Smckusick tl1 = pop2(); /* 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_INX4: 5662080Smckusick tl = *pc.cp++; /* tl has element size */ 5672080Smckusick if (tl == 0) 5682080Smckusick tl = *pc.usp++; 5692080Smckusick tl1 = pop4(); /* index */ 5702080Smckusick tl2 = *pc.sp++; 5712080Smckusick pushaddr(popaddr() + (tl1 - tl2) * tl); 5722191Smckusic tl = *pc.usp++; 5732191Smckusic if (_runtst) 5742191Smckusic SUBSC(tl1, tl2, tl); /* range check */ 5752080Smckusick continue; 5762080Smckusick case O_OFF: 5772080Smckusick tl = *pc.cp++; 5782080Smckusick if (tl == 0) 5792080Smckusick tl = *pc.usp++; 580*2950Smckusic pushaddr(popaddr() + tl); 5812080Smckusick continue; 5822080Smckusick case O_NIL: 5832080Smckusick pc.cp++; 5842080Smckusick NIL(); 5852080Smckusick continue; 5862080Smckusick case O_ADD2: 5872080Smckusick pc.cp++; 588*2950Smckusic push4((long)(pop2() + pop2())); 5892080Smckusick continue; 5902080Smckusick case O_ADD4: 5912080Smckusick pc.cp++; 5922080Smckusick push4(pop4() + pop4()); 5932080Smckusick continue; 5942080Smckusick case O_ADD24: 5952080Smckusick pc.cp++; 5962080Smckusick tl = pop2(); 5972080Smckusick push4(pop4() + tl); 5982080Smckusick continue; 5992080Smckusick case O_ADD42: 6002080Smckusick pc.cp++; 6012080Smckusick tl = pop4(); 6022080Smckusick push4(pop2() + tl); 6032080Smckusick continue; 6042080Smckusick case O_ADD28: 6052080Smckusick pc.cp++; 6062080Smckusick tl = pop2(); 6072080Smckusick push8(pop8() + tl); 6082080Smckusick continue; 6092080Smckusick case O_ADD48: 6102080Smckusick pc.cp++; 6112080Smckusick tl = pop4(); 6122080Smckusick push8(pop8() + tl); 6132080Smckusick continue; 6142080Smckusick case O_ADD82: 6152080Smckusick pc.cp++; 6162080Smckusick td = pop8(); 6172080Smckusick push8(pop2() + td); 6182080Smckusick continue; 6192080Smckusick case O_ADD84: 6202080Smckusick pc.cp++; 6212080Smckusick td = pop8(); 6222080Smckusick push8(pop4() + td); 6232080Smckusick continue; 6242080Smckusick case O_SUB2: 6252080Smckusick pc.cp++; 6262080Smckusick tl = pop2(); 6272080Smckusick push4(pop2() - tl); 6282080Smckusick continue; 6292080Smckusick case O_SUB4: 6302080Smckusick pc.cp++; 6312080Smckusick tl = pop4(); 6322080Smckusick push4(pop4() - tl); 6332080Smckusick continue; 6342080Smckusick case O_SUB24: 6352080Smckusick pc.cp++; 6362080Smckusick tl = pop2(); 6372080Smckusick push4(pop4() - tl); 6382080Smckusick continue; 6392080Smckusick case O_SUB42: 6402080Smckusick pc.cp++; 6412080Smckusick tl = pop4(); 6422080Smckusick push4(pop2() - tl); 6432080Smckusick continue; 6442080Smckusick case O_SUB28: 6452080Smckusick pc.cp++; 6462080Smckusick tl = pop2(); 6472080Smckusick push8(pop8() - tl); 6482080Smckusick continue; 6492080Smckusick case O_SUB48: 6502080Smckusick pc.cp++; 6512080Smckusick tl = pop4(); 6522080Smckusick push8(pop8() - tl); 6532080Smckusick continue; 6542080Smckusick case O_SUB82: 6552080Smckusick pc.cp++; 6562080Smckusick td = pop8(); 6572080Smckusick push8(pop2() - td); 6582080Smckusick continue; 6592080Smckusick case O_SUB84: 6602080Smckusick pc.cp++; 6612080Smckusick td = pop8(); 6622080Smckusick push8(pop4() - td); 6632080Smckusick continue; 6642080Smckusick case O_MUL2: 6652080Smckusick pc.cp++; 666*2950Smckusic push4((long)(pop2() * pop2())); 6672080Smckusick continue; 6682080Smckusick case O_MUL4: 6692080Smckusick pc.cp++; 6702080Smckusick push4(pop4() * pop4()); 6712080Smckusick continue; 6722080Smckusick case O_MUL24: 6732080Smckusick pc.cp++; 6742080Smckusick tl = pop2(); 6752080Smckusick push4(pop4() * tl); 6762080Smckusick continue; 6772080Smckusick case O_MUL42: 6782080Smckusick pc.cp++; 6792080Smckusick tl = pop4(); 6802080Smckusick push4(pop2() * tl); 6812080Smckusick continue; 6822080Smckusick case O_MUL28: 6832080Smckusick pc.cp++; 6842080Smckusick tl = pop2(); 6852080Smckusick push8(pop8() * tl); 6862080Smckusick continue; 6872080Smckusick case O_MUL48: 6882080Smckusick pc.cp++; 6892080Smckusick tl = pop4(); 6902080Smckusick push8(pop8() * tl); 6912080Smckusick continue; 6922080Smckusick case O_MUL82: 6932080Smckusick pc.cp++; 6942080Smckusick td = pop8(); 6952080Smckusick push8(pop2() * td); 6962080Smckusick continue; 6972080Smckusick case O_MUL84: 6982080Smckusick pc.cp++; 6992080Smckusick td = pop8(); 7002080Smckusick push8(pop4() * td); 7012080Smckusick continue; 7022080Smckusick case O_ABS2: 7032080Smckusick case O_ABS4: 7042080Smckusick pc.cp++; 7052080Smckusick tl = pop4(); 7062080Smckusick push4(tl >= 0 ? tl : -tl); 7072080Smckusick continue; 7082080Smckusick case O_ABS8: 7092080Smckusick pc.cp++; 7102080Smckusick td = pop8(); 7112080Smckusick push8(td >= 0.0 ? td : -td); 7122080Smckusick continue; 7132080Smckusick case O_NEG2: 7142080Smckusick pc.cp++; 715*2950Smckusic push4((long)(-pop2())); 7162080Smckusick continue; 7172080Smckusick case O_NEG4: 7182080Smckusick pc.cp++; 7192080Smckusick push4(-pop4()); 7202080Smckusick continue; 7212080Smckusick case O_NEG8: 7222080Smckusick pc.cp++; 7232080Smckusick push8(-pop8()); 7242080Smckusick continue; 7252080Smckusick case O_DIV2: 7262080Smckusick pc.cp++; 7272080Smckusick tl = pop2(); 7282080Smckusick push4(pop2() / tl); 7292080Smckusick continue; 7302080Smckusick case O_DIV4: 7312080Smckusick pc.cp++; 7322080Smckusick tl = pop4(); 7332080Smckusick push4(pop4() / tl); 7342080Smckusick continue; 7352080Smckusick case O_DIV24: 7362080Smckusick pc.cp++; 7372080Smckusick tl = pop2(); 7382080Smckusick push4(pop4() / tl); 7392080Smckusick continue; 7402080Smckusick case O_DIV42: 7412080Smckusick pc.cp++; 7422080Smckusick tl = pop4(); 7432080Smckusick push4(pop2() / tl); 7442080Smckusick continue; 7452080Smckusick case O_MOD2: 7462080Smckusick pc.cp++; 7472080Smckusick tl = pop2(); 7482080Smckusick push4(pop2() % tl); 7492080Smckusick continue; 7502080Smckusick case O_MOD4: 7512080Smckusick pc.cp++; 7522080Smckusick tl = pop4(); 7532080Smckusick push4(pop4() % tl); 7542080Smckusick continue; 7552080Smckusick case O_MOD24: 7562080Smckusick pc.cp++; 7572080Smckusick tl = pop2(); 7582080Smckusick push4(pop4() % tl); 7592080Smckusick continue; 7602080Smckusick case O_MOD42: 7612080Smckusick pc.cp++; 7622080Smckusick tl = pop4(); 7632080Smckusick push4(pop2() % tl); 7642080Smckusick continue; 7652080Smckusick case O_ADD8: 7662080Smckusick pc.cp++; 7672080Smckusick push8(pop8() + pop8()); 7682080Smckusick continue; 7692080Smckusick case O_SUB8: 7702080Smckusick pc.cp++; 7712080Smckusick td = pop8(); 7722080Smckusick push8(pop8() - td); 7732080Smckusick continue; 7742080Smckusick case O_MUL8: 7752080Smckusick pc.cp++; 7762080Smckusick push8(pop8() * pop8()); 7772080Smckusick continue; 7782080Smckusick case O_DVD8: 7792080Smckusick pc.cp++; 7802080Smckusick td = pop8(); 7812080Smckusick push8(pop8() / td); 7822080Smckusick continue; 7832080Smckusick case O_STOI: 7842080Smckusick pc.cp++; 785*2950Smckusic push4((long)(pop2())); 7862080Smckusick continue; 7872080Smckusick case O_STOD: 7882080Smckusick pc.cp++; 7892080Smckusick td = pop2(); 7902080Smckusick push8(td); 7912080Smckusick continue; 7922080Smckusick case O_ITOD: 7932080Smckusick pc.cp++; 7942080Smckusick td = pop4(); 7952080Smckusick push8(td); 7962080Smckusick continue; 7972080Smckusick case O_ITOS: 7982080Smckusick pc.cp++; 799*2950Smckusic push2((short)(pop4())); 8002080Smckusick continue; 8012080Smckusick case O_DVD2: 8022080Smckusick pc.cp++; 8032080Smckusick td = pop2(); 8042080Smckusick push8(pop2() / td); 8052080Smckusick continue; 8062080Smckusick case O_DVD4: 8072080Smckusick pc.cp++; 8082080Smckusick td = pop4(); 8092080Smckusick push8(pop4() / td); 8102080Smckusick continue; 8112080Smckusick case O_DVD24: 8122080Smckusick pc.cp++; 8132080Smckusick td = pop2(); 8142080Smckusick push8(pop4() / td); 8152080Smckusick continue; 8162080Smckusick case O_DVD42: 8172080Smckusick pc.cp++; 8182080Smckusick td = pop4(); 8192080Smckusick push8(pop2() / td); 8202080Smckusick continue; 8212080Smckusick case O_DVD28: 8222080Smckusick pc.cp++; 8232080Smckusick td = pop2(); 8242080Smckusick push8(pop8() / td); 8252080Smckusick continue; 8262080Smckusick case O_DVD48: 8272080Smckusick pc.cp++; 8282080Smckusick td = pop4(); 8292080Smckusick push8(pop8() / td); 8302080Smckusick continue; 8312080Smckusick case O_DVD82: 8322080Smckusick pc.cp++; 8332080Smckusick td = pop8(); 8342080Smckusick push8(pop2() / td); 8352080Smckusick continue; 8362080Smckusick case O_DVD84: 8372080Smckusick pc.cp++; 8382080Smckusick td = pop8(); 8392080Smckusick push8(pop4() / td); 8402080Smckusick continue; 8412080Smckusick case O_RV1: 8422109Smckusic tcp = _display.raw[*pc.ucp++]; 843*2950Smckusic push2((short)(*(tcp + *pc.sp++))); 8442080Smckusick continue; 8452080Smckusick case O_RV14: 8462109Smckusic tcp = _display.raw[*pc.ucp++]; 847*2950Smckusic push4((long)(*(tcp + *pc.sp++))); 8482080Smckusick continue; 8492080Smckusick case O_RV2: 8502109Smckusic tcp = _display.raw[*pc.ucp++]; 8512080Smckusick push2(*(short *)(tcp + *pc.sp++)); 8522080Smckusick continue; 8532080Smckusick case O_RV24: 8542109Smckusic tcp = _display.raw[*pc.ucp++]; 855*2950Smckusic push4((long)(*(short *)(tcp + *pc.sp++))); 8562080Smckusick continue; 8572080Smckusick case O_RV4: 8582109Smckusic tcp = _display.raw[*pc.ucp++]; 8592080Smckusick push4(*(long *)(tcp + *pc.sp++)); 8602080Smckusick continue; 8612080Smckusick case O_RV8: 8622109Smckusic tcp = _display.raw[*pc.ucp++]; 8632239Smckusic pushsze8(*(struct sze8 *)(tcp + *pc.sp++)); 8642080Smckusick continue; 8652080Smckusick case O_RV: 8662109Smckusic tcp = _display.raw[*pc.ucp++]; 8672080Smckusick tcp += *pc.sp++; 8682080Smckusick tl = *pc.usp++; 8692338Smckusic tcp1 = pushsp((tl + 1) & ~1); 8702080Smckusick blkcpy(tl, tcp, tcp1); 8712080Smckusick continue; 8722080Smckusick case O_LV: 8732109Smckusic tcp = _display.raw[*pc.ucp++]; 8742080Smckusick pushaddr(tcp + *pc.sp++); 8752080Smckusick continue; 8762080Smckusick case O_LRV1: 8772109Smckusic tcp = _display.raw[*pc.ucp++]; 878*2950Smckusic push2((short)(*(tcp + *pc.lp++))); 8792080Smckusick continue; 8802080Smckusick case O_LRV14: 8812109Smckusic tcp = _display.raw[*pc.ucp++]; 882*2950Smckusic push4((long)(*(tcp + *pc.lp++))); 8832080Smckusick continue; 8842080Smckusick case O_LRV2: 8852109Smckusic tcp = _display.raw[*pc.ucp++]; 8862080Smckusick push2(*(short *)(tcp + *pc.lp++)); 8872080Smckusick continue; 8882080Smckusick case O_LRV24: 8892109Smckusic tcp = _display.raw[*pc.ucp++]; 890*2950Smckusic push4((long)(*(short *)(tcp + *pc.lp++))); 8912080Smckusick continue; 8922080Smckusick case O_LRV4: 8932109Smckusic tcp = _display.raw[*pc.ucp++]; 8942080Smckusick push4(*(long *)(tcp + *pc.lp++)); 8952080Smckusick continue; 8962080Smckusick case O_LRV8: 8972109Smckusic tcp = _display.raw[*pc.ucp++]; 8982239Smckusic pushsze8(*(struct sze8 *)(tcp + *pc.lp++)); 8992080Smckusick continue; 9002080Smckusick case O_LRV: 9012109Smckusic tcp = _display.raw[*pc.ucp++]; 902*2950Smckusic tcp += (int)*pc.lp++; 9032080Smckusick tl = *pc.usp++; 904*2950Smckusic tcp1 = pushsp((tl + 1) & ~1); 9052080Smckusick blkcpy(tl, tcp, tcp1); 9062080Smckusick continue; 9072080Smckusick case O_LLV: 9082109Smckusic tcp = _display.raw[*pc.ucp++]; 9092080Smckusick pushaddr(tcp + *pc.lp++); 9102080Smckusick continue; 9112080Smckusick case O_IND1: 9122080Smckusick pc.cp++; 913*2950Smckusic push2((short)(*popaddr())); 9142080Smckusick continue; 9152080Smckusick case O_IND14: 9162080Smckusick pc.cp++; 917*2950Smckusic push4((long)(*popaddr())); 9182080Smckusick continue; 9192080Smckusick case O_IND2: 9202080Smckusick pc.cp++; 9212080Smckusick push2(*(short *)(popaddr())); 9222080Smckusick continue; 9232080Smckusick case O_IND24: 9242080Smckusick pc.cp++; 925*2950Smckusic push4((long)(*(short *)(popaddr()))); 9262080Smckusick continue; 9272080Smckusick case O_IND4: 9282080Smckusick pc.cp++; 9292080Smckusick push4(*(long *)(popaddr())); 9302080Smckusick continue; 9312080Smckusick case O_IND8: 9322080Smckusick pc.cp++; 9332239Smckusic pushsze8(*(struct sze8 *)(popaddr())); 9342080Smckusick continue; 9352080Smckusick case O_IND: 9362080Smckusick tl = *pc.cp++; 9372080Smckusick if (tl == 0) 9382080Smckusick tl = *pc.usp++; 9392080Smckusick tcp = popaddr(); 9402080Smckusick tcp1 = pushsp((tl + 1) & ~1); 9412080Smckusick blkcpy(tl, tcp, tcp1); 9422080Smckusick continue; 9432080Smckusick case O_CON1: 944*2950Smckusic push2((short)(*pc.cp++)); 9452080Smckusick continue; 9462080Smckusick case O_CON14: 947*2950Smckusic push4((long)(*pc.cp++)); 9482080Smckusick continue; 9492080Smckusick case O_CON2: 9502080Smckusick pc.cp++; 9512080Smckusick push2(*pc.sp++); 9522080Smckusick continue; 9532080Smckusick case O_CON24: 9542080Smckusick pc.cp++; 955*2950Smckusic push4((long)(*pc.sp++)); 9562080Smckusick continue; 9572080Smckusick case O_CON4: 9582080Smckusick pc.cp++; 9592080Smckusick push4(*pc.lp++); 9602080Smckusick continue; 9612080Smckusick case O_CON8: 9622080Smckusick pc.cp++; 963*2950Smckusic push8(*pc.dbp++); 9642080Smckusick continue; 9652080Smckusick case O_CON: 9662080Smckusick tl = *pc.cp++; 9672080Smckusick if (tl == 0) 9682080Smckusick tl = *pc.usp++; 9692080Smckusick tl = (tl + 1) & ~1; 9702080Smckusick tcp = pushsp(tl); 9712080Smckusick blkcpy(tl, pc.cp, tcp); 972*2950Smckusic pc.cp += (int)tl; 9732080Smckusick continue; 974*2950Smckusic case O_CONG: 975*2950Smckusic tl = *pc.cp++; 976*2950Smckusic if (tl == 0) 977*2950Smckusic tl = *pc.usp++; 978*2950Smckusic tl1 = (tl + 1) & ~1; 979*2950Smckusic tcp = pushsp(tl1); 980*2950Smckusic blkcpy(tl1, pc.cp, tcp); 981*2950Smckusic pc.cp += (int)((tl + 2) & ~1); 982*2950Smckusic continue; 9832080Smckusick case O_LVCON: 9842080Smckusick tl = *pc.cp++; 9852080Smckusick if (tl == 0) 9862080Smckusick tl = *pc.usp++; 9872080Smckusick tl = (tl + 1) & ~1; 9882080Smckusick pushaddr(pc.cp); 989*2950Smckusic pc.cp += (int)tl; 9902080Smckusick continue; 9912080Smckusick case O_RANG2: 9922080Smckusick tl = *pc.cp++; 9932080Smckusick if (tl == 0) 9942080Smckusick tl = *pc.sp++; 9952080Smckusick tl1 = pop2(); 996*2950Smckusic push2((short)(RANG4(tl1, tl, *pc.sp++))); 9972080Smckusick continue; 9982080Smckusick case O_RANG42: 9992080Smckusick tl = *pc.cp++; 10002080Smckusick if (tl == 0) 10012080Smckusick tl = *pc.sp++; 10022080Smckusick tl1 = pop4(); 10032080Smckusick push4(RANG4(tl1, tl, *pc.sp++)); 10042080Smckusick continue; 10052080Smckusick case O_RSNG2: 10062080Smckusick tl = *pc.cp++; 10072080Smckusick if (tl == 0) 10082080Smckusick tl = *pc.sp++; 10092080Smckusick tl1 = pop2(); 1010*2950Smckusic push2((short)(RSNG4(tl1, tl))); 10112080Smckusick continue; 10122080Smckusick case O_RSNG42: 10132080Smckusick tl = *pc.cp++; 10142080Smckusick if (tl == 0) 10152080Smckusick tl = *pc.sp++; 10162080Smckusick tl1 = pop4(); 10172080Smckusick push4(RSNG4(tl1, tl)); 10182080Smckusick continue; 10192080Smckusick case O_RANG4: 10202080Smckusick pc.cp++; 10212080Smckusick tl = *pc.lp++; 10222080Smckusick tl1 = pop4(); 10232080Smckusick push4(RANG4(tl1, tl, *pc.lp++)); 10242080Smckusick continue; 10252080Smckusick case O_RANG24: 10262080Smckusick pc.cp++; 10272080Smckusick tl = *pc.lp++; 10282080Smckusick tl1 = pop2(); 1029*2950Smckusic push2((short)(RANG4(tl1, tl, *pc.lp++))); 10302080Smckusick continue; 10312080Smckusick case O_RSNG4: 10322080Smckusick pc.cp++; 10332080Smckusick tl = pop4(); 10342080Smckusick push4(RSNG4(tl, *pc.lp++)); 10352080Smckusick continue; 10362080Smckusick case O_RSNG24: 10372080Smckusick pc.cp++; 10382080Smckusick tl = pop2(); 1039*2950Smckusic push2((short)(RSNG4(tl, *pc.lp++))); 10402080Smckusick continue; 10412080Smckusick case O_STLIM: 10422080Smckusick pc.cp++; 10432121Smckusic STLIM(); 1044*2950Smckusic popsp((long)(sizeof(long))); 10452080Smckusick continue; 10462080Smckusick case O_LLIMIT: 10472080Smckusick pc.cp++; 10482080Smckusick LLIMIT(); 1049*2950Smckusic popsp((long)(sizeof(char *)+sizeof(long))); 10502080Smckusick continue; 10512080Smckusick case O_BUFF: 1052*2950Smckusic BUFF((long)(*pc.cp++)); 10532080Smckusick continue; 10542080Smckusick case O_HALT: 10552080Smckusick pc.cp++; 10562080Smckusick panic(PHALT); 10572080Smckusick continue; 10582080Smckusick case O_PXPBUF: 10592080Smckusick pc.cp++; 10602080Smckusick _cntrs = *pc.lp++; 10612080Smckusick _rtns = *pc.lp++; 1062*2950Smckusic NEWZ(&_pcpcount, (_cntrs + 1) * sizeof(long)); 10632080Smckusick continue; 10642080Smckusick case O_COUNT: 10652080Smckusick pc.cp++; 10662080Smckusick _pcpcount[*pc.usp++]++; 10672080Smckusick continue; 10682080Smckusick case O_CASE1OP: 10692080Smckusick tl = *pc.cp++; /* tl = number of cases */ 10702080Smckusick if (tl == 0) 10712080Smckusick tl = *pc.usp++; 10722080Smckusick tsp = pc.sp + tl; /* ptr to end of jump table */ 10732080Smckusick tcp = (char *)tsp; /* tcp = ptr to case values */ 10742080Smckusick tl1 = pop2(); /* tl1 = element to find */ 10752080Smckusick for(; tl > 0; tl--) /* look for element */ 10762080Smckusick if (tl1 == *tcp++) 10772080Smckusick break; 10782080Smckusick if (tl == 0) /* default case => error */ 10792231Smckusic ERROR(ECASE, tl1); 10802080Smckusick pc.cp += *(tsp - tl); 10812080Smckusick continue; 10822080Smckusick case O_CASE2OP: 10832080Smckusick tl = *pc.cp++; /* tl = number of cases */ 10842080Smckusick if (tl == 0) 10852080Smckusick tl = *pc.usp++; 10862080Smckusick tsp = pc.sp + tl; /* ptr to end of jump table */ 10872080Smckusick tsp1 = tsp; /* tsp1 = ptr to case values */ 10882080Smckusick tl1 = (unsigned short)pop2();/* tl1 = element to find */ 10892080Smckusick for(; tl > 0; tl--) /* look for element */ 10902080Smckusick if (tl1 == *tsp1++) 10912080Smckusick break; 10922080Smckusick if (tl == 0) /* default case => error */ 10932231Smckusic ERROR(ECASE, tl1); 10942080Smckusick pc.cp += *(tsp - tl); 10952080Smckusick continue; 10962080Smckusick case O_CASE4OP: 10972080Smckusick tl = *pc.cp++; /* tl = number of cases */ 10982080Smckusick if (tl == 0) 10992080Smckusick tl = *pc.usp++; 11002080Smckusick tsp = pc.sp + tl; /* ptr to end of jump table */ 11012080Smckusick tlp = (long *)tsp; /* tlp = ptr to case values */ 11022080Smckusick tl1 = pop4(); /* tl1 = element to find */ 11032080Smckusick for(; tl > 0; tl--) /* look for element */ 11042080Smckusick if (tl1 == *tlp++) 11052080Smckusick break; 11062080Smckusick if (tl == 0) /* default case => error */ 11072231Smckusic ERROR(ECASE, tl1); 11082080Smckusick pc.cp += *(tsp - tl); 11092080Smckusick continue; 11102080Smckusick case O_ADDT: 11112080Smckusick tl = *pc.cp++; /* tl has comparison length */ 11122080Smckusick if (tl == 0) 11132080Smckusick tl = *pc.usp++; 1114*2950Smckusic tcp = pushsp((long)(0));/* tcp pts to first arg */ 11152080Smckusick ADDT(tcp + tl, tcp + tl, tcp, tl >> 2); 11162080Smckusick popsp(tl); 11172080Smckusick continue; 11182080Smckusick case O_SUBT: 11192080Smckusick tl = *pc.cp++; /* tl has comparison length */ 11202080Smckusick if (tl == 0) 11212080Smckusick tl = *pc.usp++; 1122*2950Smckusic tcp = pushsp((long)(0));/* tcp pts to first arg */ 11232080Smckusick SUBT(tcp + tl, tcp + tl, tcp, tl >> 2); 11242080Smckusick popsp(tl); 11252080Smckusick continue; 11262080Smckusick case O_MULT: 11272080Smckusick tl = *pc.cp++; /* tl has comparison length */ 11282080Smckusick if (tl == 0) 11292080Smckusick tl = *pc.usp++; 1130*2950Smckusic tcp = pushsp((long)(0));/* tcp pts to first arg */ 11312080Smckusick MULT(tcp + tl, tcp + tl, tcp, tl >> 2); 11322080Smckusick popsp(tl); 11332080Smckusick continue; 11342080Smckusick case O_INCT: 11352080Smckusick tl = *pc.cp++; /* tl has number of args */ 11362080Smckusick if (tl == 0) 11372080Smckusick tl = *pc.usp++; 1138*2950Smckusic tb = INCT(); 1139*2950Smckusic popsp(tl*sizeof(long)); 1140*2950Smckusic push2((short)(tb)); 11412080Smckusick continue; 11422080Smckusick case O_CTTOT: 11432080Smckusick tl = *pc.cp++; /* tl has number of args */ 11442080Smckusick if (tl == 0) 11452080Smckusick tl = *pc.usp++; 11462080Smckusick tl1 = tl * sizeof(long); 1147*2950Smckusic tcp = pushsp((long)(0)) + tl1; /* tcp pts to result */ 11482080Smckusick CTTOT(tcp); 1149*2950Smckusic popsp(tl*sizeof(long)); 11502080Smckusick continue; 11512080Smckusick case O_CARD: 11522080Smckusick tl = *pc.cp++; /* tl has comparison length */ 11532080Smckusick if (tl == 0) 11542080Smckusick tl = *pc.usp++; 1155*2950Smckusic tcp = pushsp((long)(0));/* tcp pts to set */ 11562080Smckusick tl1 = CARD(tcp, tl); 11572080Smckusick popsp(tl); 1158*2950Smckusic push2((short)(tl1)); 11592080Smckusick continue; 11602080Smckusick case O_IN: 11612080Smckusick tl = *pc.cp++; /* tl has comparison length */ 11622080Smckusick if (tl == 0) 11632080Smckusick tl = *pc.usp++; 11642080Smckusick tl1 = pop4(); /* tl1 is the element */ 1165*2950Smckusic tcp = pushsp((long)(0));/* tcp pts to set */ 11662080Smckusick tl2 = *pc.usp++; /* lower bound */ 1167*2950Smckusic tb = IN(tl1, tl2, (long)(*pc.usp++), tcp); 11682080Smckusick popsp(tl); 1169*2950Smckusic push2((short)(tb)); 11702080Smckusick continue; 11712080Smckusick case O_ASRT: 11722080Smckusick pc.cp++; 1173*2950Smckusic ts = pop2(); 1174*2950Smckusic ASRT(ts, ""); 11752080Smckusick continue; 11762080Smckusick case O_FOR1U: 11772080Smckusick pc.cp++; 1178*2950Smckusic tcp = popaddr(); /* tcp = ptr to index var */ 11792080Smckusick if (*tcp < pop4()) { /* still going up */ 11802191Smckusic tl = *tcp + 1; /* inc index var */ 11812191Smckusic tl1 = *pc.sp++; /* index lower bound */ 11822191Smckusic tl2 = *pc.sp++; /* index upper bound */ 11832191Smckusic if (_runtst) 11842191Smckusic RANG4(tl, tl1, tl2); 11852191Smckusic *tcp = tl; /* update index var */ 11862080Smckusick pc.cp += *pc.sp;/* return to top of loop */ 11872080Smckusick continue; 11882080Smckusick } 11892191Smckusic pc.sp += 3; /* else fall through */ 11902080Smckusick continue; 11912080Smckusick case O_FOR2U: 11922080Smckusick pc.cp++; 1193*2950Smckusic tsp = (short *)popaddr(); /* tsp = ptr to index var */ 11942080Smckusick if (*tsp < pop4()) { /* still going up */ 11952191Smckusic tl = *tsp + 1; /* inc index var */ 11962191Smckusic tl1 = *pc.sp++; /* index lower bound */ 11972191Smckusic tl2 = *pc.sp++; /* index upper bound */ 11982191Smckusic if (_runtst) 11992191Smckusic RANG4(tl, tl1, tl2); 12002191Smckusic *tsp = tl; /* update index var */ 12012080Smckusick pc.cp += *pc.sp;/* return to top of loop */ 12022080Smckusick continue; 12032080Smckusick } 12042191Smckusic pc.sp += 3; /* else fall through */ 12052080Smckusick continue; 12062080Smckusick case O_FOR4U: 12072080Smckusick pc.cp++; 1208*2950Smckusic tlp = (long *)popaddr(); /* tlp = ptr to index var */ 12092080Smckusick if (*tlp < pop4()) { /* still going up */ 12102191Smckusic tl = *tlp + 1; /* inc index var */ 12112191Smckusic tl1 = *pc.lp++; /* index lower bound */ 12122191Smckusic tl2 = *pc.lp++; /* index upper bound */ 12132191Smckusic if (_runtst) 12142191Smckusic RANG4(tl, tl1, tl2); 12152191Smckusic *tlp = tl; /* update index var */ 12162080Smckusick pc.cp += *pc.sp;/* return to top of loop */ 12172080Smckusick continue; 12182080Smckusick } 12192191Smckusic pc.sp += 5; /* else fall through */ 12202080Smckusick continue; 12212080Smckusick case O_FOR1D: 12222080Smckusick pc.cp++; 1223*2950Smckusic tcp = popaddr(); /* tcp = ptr to index var */ 12242080Smckusick if (*tcp > pop4()) { /* still going down */ 12252191Smckusic tl = *tcp - 1; /* inc index var */ 12262191Smckusic tl1 = *pc.sp++; /* index lower bound */ 12272191Smckusic tl2 = *pc.sp++; /* index upper bound */ 12282191Smckusic if (_runtst) 12292191Smckusic RANG4(tl, tl1, tl2); 12302191Smckusic *tcp = tl; /* update index var */ 12312080Smckusick pc.cp += *pc.sp;/* return to top of loop */ 12322080Smckusick continue; 12332080Smckusick } 12342191Smckusic pc.sp += 3; /* else fall through */ 12352080Smckusick continue; 12362080Smckusick case O_FOR2D: 12372080Smckusick pc.cp++; 1238*2950Smckusic tsp = (short *)popaddr(); /* tsp = ptr to index var */ 12392080Smckusick if (*tsp > pop4()) { /* still going down */ 12402191Smckusic tl = *tsp - 1; /* inc index var */ 12412191Smckusic tl1 = *pc.sp++; /* index lower bound */ 12422191Smckusic tl2 = *pc.sp++; /* index upper bound */ 12432191Smckusic if (_runtst) 12442191Smckusic RANG4(tl, tl1, tl2); 12452191Smckusic *tsp = tl; /* update index var */ 12462080Smckusick pc.cp += *pc.sp;/* return to top of loop */ 12472080Smckusick continue; 12482080Smckusick } 12492191Smckusic pc.sp += 3; /* else fall through */ 12502080Smckusick continue; 12512080Smckusick case O_FOR4D: 12522080Smckusick pc.cp++; 1253*2950Smckusic tlp = (long *)popaddr(); /* tlp = ptr to index var */ 12542080Smckusick if (*tlp > pop4()) { /* still going down */ 12552191Smckusic tl = *tlp - 1; /* inc index var */ 12562191Smckusic tl1 = *pc.lp++; /* index lower bound */ 12572191Smckusic tl2 = *pc.lp++; /* index upper bound */ 12582191Smckusic if (_runtst) 12592191Smckusic RANG4(tl, tl1, tl2); 12602191Smckusic *tlp = tl; /* update index var */ 12612080Smckusick pc.cp += *pc.sp;/* return to top of loop */ 12622080Smckusick continue; 12632080Smckusick } 12642191Smckusic pc.sp += 5; /* else fall through */ 12652080Smckusick continue; 12662080Smckusick case O_READE: 12672080Smckusick pc.cp++; 1268*2950Smckusic push2((short)(READE(curfile, base + *pc.lp++))); 12692080Smckusick continue; 12702080Smckusick case O_READ4: 12712080Smckusick pc.cp++; 12722080Smckusick push4(READ4(curfile)); 12732080Smckusick continue; 12742080Smckusick case O_READC: 12752080Smckusick pc.cp++; 1276*2950Smckusic push2((short)(READC(curfile))); 12772080Smckusick continue; 12782080Smckusick case O_READ8: 12792080Smckusick pc.cp++; 12802080Smckusick push8(READ8(curfile)); 12812080Smckusick continue; 12822080Smckusick case O_READLN: 12832080Smckusick pc.cp++; 12842080Smckusick READLN(curfile); 12852080Smckusick continue; 12862080Smckusick case O_EOF: 12872080Smckusick pc.cp++; 1288*2950Smckusic push2((short)(TEOF(popaddr()))); 12892080Smckusick continue; 12902080Smckusick case O_EOLN: 12912080Smckusick pc.cp++; 1292*2950Smckusic push2((short)(TEOLN(popaddr()))); 12932080Smckusick continue; 12942080Smckusick case O_WRITEC: 12952080Smckusick pc.cp++; 12962191Smckusic if (_runtst) { 12972191Smckusic WRITEC(curfile); 1298*2950Smckusic popsp((long)(sizeof(long)+sizeof(FILE *))); 12992191Smckusic continue; 13002191Smckusic } 1301*2950Smckusic #ifdef VAX 13022191Smckusic fputc(); 1303*2950Smckusic #else 1304*2950Smckusic WRITEC(curfile); 1305*2950Smckusic #endif VAX 1306*2950Smckusic popsp((long)(sizeof(long)+sizeof(FILE *))); 13072080Smckusick continue; 13082080Smckusick case O_WRITES: 13092080Smckusick pc.cp++; 13102191Smckusic if (_runtst) { 13112191Smckusic WRITES(curfile); 1312*2950Smckusic popsp((long)(2*sizeof(char *)+2*sizeof(long))); 13132191Smckusic continue; 13142191Smckusic } 1315*2950Smckusic #ifdef VAX 13162191Smckusic fwrite(); 1317*2950Smckusic #else 1318*2950Smckusic WRITES(curfile); 1319*2950Smckusic #endif VAX 1320*2950Smckusic popsp((long)(2*sizeof(char *)+2*sizeof(long))); 13212080Smckusick continue; 13222080Smckusick case O_WRITEF: 13232191Smckusic if (_runtst) { 13242191Smckusic WRITEF(curfile); 1325*2950Smckusic popsp((long)(((*pc.cp++ - 2) * sizeof(long)) + 1326*2950Smckusic 2 * sizeof(char *))); 13272191Smckusic continue; 13282191Smckusic } 1329*2950Smckusic #ifdef VAX 13302191Smckusic fprintf(); 1331*2950Smckusic #else 1332*2950Smckusic WRITEF(curfile); 1333*2950Smckusic #endif VAX 1334*2950Smckusic popsp((long)(((*pc.cp++ - 2) * sizeof(long)) + 1335*2950Smckusic 2 * sizeof(char *))); 13362080Smckusick continue; 13372080Smckusick case O_WRITLN: 13382080Smckusick pc.cp++; 13392191Smckusic if (_runtst) { 13402191Smckusic WRITLN(curfile); 13412191Smckusic continue; 13422191Smckusic } 13432191Smckusic fputc('\n', ACTFILE(curfile)); 13442080Smckusick continue; 13452080Smckusick case O_PAGE: 13462080Smckusick pc.cp++; 13472191Smckusic if (_runtst) { 13482191Smckusic PAGE(curfile); 13492191Smckusic continue; 13502191Smckusic } 1351*2950Smckusic fputc('', ACTFILE(curfile)); 13522080Smckusick continue; 13532080Smckusick case O_NAM: 13542080Smckusick pc.cp++; 13552080Smckusick tl = pop4(); 13562080Smckusick pushaddr(NAM(tl, base + *pc.lp++)); 13572080Smckusick continue; 13582080Smckusick case O_MAX: 13592080Smckusick tl = *pc.cp++; 13602080Smckusick if (tl == 0) 13612080Smckusick tl = *pc.usp++; 13622080Smckusick tl1 = pop4(); 13632191Smckusic if (_runtst) { 1364*2950Smckusic push4(MAX(tl1, tl, (long)(*pc.usp++))); 13652191Smckusic continue; 13662191Smckusic } 13672191Smckusic tl1 -= tl; 13682191Smckusic tl = *pc.usp++; 13692191Smckusic push4(tl1 > tl ? tl1 : tl); 13702080Smckusick continue; 13712080Smckusick case O_MIN: 13722080Smckusick tl = *pc.cp++; 13732080Smckusick if (tl == 0) 13742080Smckusick tl = *pc.usp++; 13752080Smckusick tl1 = pop4(); 13762080Smckusick push4(tl1 < tl ? tl1 : tl); 13772080Smckusick continue; 13782080Smckusick case O_UNIT: 13792080Smckusick pc.cp++; 13802080Smckusick curfile = UNIT(popaddr()); 13812080Smckusick continue; 13822080Smckusick case O_UNITINP: 13832080Smckusick pc.cp++; 13842080Smckusick curfile = INPUT; 13852080Smckusick continue; 13862080Smckusick case O_UNITOUT: 13872080Smckusick pc.cp++; 13882080Smckusick curfile = OUTPUT; 13892080Smckusick continue; 13902080Smckusick case O_MESSAGE: 13912080Smckusick pc.cp++; 13922080Smckusick PFLUSH(); 13932080Smckusick curfile = ERR; 13942080Smckusick continue; 13952109Smckusic case O_PUT: 13962109Smckusic pc.cp++; 13972109Smckusic PUT(curfile); 13982109Smckusic continue; 13992080Smckusick case O_GET: 14002080Smckusick pc.cp++; 14012080Smckusick GET(curfile); 14022080Smckusick continue; 14032080Smckusick case O_FNIL: 14042080Smckusick pc.cp++; 14052080Smckusick pushaddr(FNIL(popaddr())); 14062080Smckusick continue; 14072080Smckusick case O_DEFNAME: 14082080Smckusick pc.cp++; 14092080Smckusick DEFNAME(); 1410*2950Smckusic popsp((long)(2*sizeof(char *)+2*sizeof(long))); 14112080Smckusick continue; 14122080Smckusick case O_RESET: 14132080Smckusick pc.cp++; 14142080Smckusick RESET(); 1415*2950Smckusic popsp((long)(2*sizeof(char *)+2*sizeof(long))); 14162080Smckusick continue; 14172080Smckusick case O_REWRITE: 14182080Smckusick pc.cp++; 14192080Smckusick REWRITE(); 1420*2950Smckusic popsp((long)(2*sizeof(char *)+2*sizeof(long))); 14212080Smckusick continue; 14222080Smckusick case O_FILE: 14232080Smckusick pc.cp++; 14242080Smckusick pushaddr(ACTFILE(curfile)); 14252080Smckusick continue; 14262080Smckusick case O_REMOVE: 14272080Smckusick pc.cp++; 14282080Smckusick REMOVE(); 1429*2950Smckusic popsp((long)(sizeof(char *)+sizeof(long))); 14302080Smckusick continue; 14312080Smckusick case O_FLUSH: 14322080Smckusick pc.cp++; 14332080Smckusick FLUSH(); 1434*2950Smckusic popsp((long)(sizeof(char *))); 14352080Smckusick continue; 14362080Smckusick case O_PACK: 14372080Smckusick pc.cp++; 14382080Smckusick PACK(); 1439*2950Smckusic popsp((long)(5*sizeof(long)+2*sizeof(char*))); 14402080Smckusick continue; 14412080Smckusick case O_UNPACK: 14422080Smckusick pc.cp++; 14432080Smckusick UNPACK(); 1444*2950Smckusic popsp((long)(5*sizeof(long)+2*sizeof(char*))); 14452080Smckusick continue; 14462080Smckusick case O_ARGC: 14472080Smckusick pc.cp++; 1448*2950Smckusic push4((long)_argc); 14492080Smckusick continue; 14502080Smckusick case O_ARGV: 14512080Smckusick tl = *pc.cp++; /* tl = size of char array */ 14522080Smckusick if (tl == 0) 14532080Smckusick tl = *pc.usp++; 14542080Smckusick tcp = popaddr(); /* tcp = addr of char array */ 14552080Smckusick tl1 = pop4(); /* tl1 = argv subscript */ 14562080Smckusick ARGV(tl1, tcp, tl); 14572080Smckusick continue; 14582080Smckusick case O_CLCK: 14592080Smckusick pc.cp++; 14602080Smckusick push4(CLCK()); 14612080Smckusick continue; 14622080Smckusick case O_WCLCK: 14632080Smckusick pc.cp++; 14642080Smckusick push4(time(0)); 14652080Smckusick continue; 14662080Smckusick case O_SCLCK: 14672080Smckusick pc.cp++; 14682080Smckusick push4(SCLCK()); 14692080Smckusick continue; 14702080Smckusick case O_DISPOSE: 14712080Smckusick tl = *pc.cp++; /* tl = size being disposed */ 14722080Smckusick if (tl == 0) 14732080Smckusick tl = *pc.usp++; 14742080Smckusick tcp = popaddr(); /* ptr to ptr being disposed */ 14752080Smckusick DISPOSE(tcp, tl); 14762080Smckusick *(char **)tcp = (char *)0; 14772080Smckusick continue; 14782080Smckusick case O_NEW: 14792080Smckusick tl = *pc.cp++; /* tl = size being new'ed */ 14802080Smckusick if (tl == 0) 14812080Smckusick tl = *pc.usp++; 14822080Smckusick tcp = popaddr(); /* ptr to ptr being new'ed */ 14832191Smckusic if (_runtst) { 14842191Smckusic NEWZ(tcp, tl); 14852191Smckusic continue; 14862191Smckusic } 14872191Smckusic NEW(tcp, tl); 14882080Smckusick continue; 14892080Smckusick case O_DATE: 14902080Smckusick pc.cp++; 14912080Smckusick DATE(popaddr()); 14922080Smckusick continue; 14932080Smckusick case O_TIME: 14942080Smckusick pc.cp++; 14952080Smckusick TIME(popaddr()); 14962080Smckusick continue; 14972080Smckusick case O_UNDEF: 14982080Smckusick pc.cp++; 14992080Smckusick pop8(); 1500*2950Smckusic push2((short)(0)); 15012080Smckusick continue; 15022080Smckusick case O_ATAN: 15032080Smckusick pc.cp++; 15042080Smckusick push8(atan(pop8())); 15052080Smckusick continue; 15062080Smckusick case O_COS: 15072080Smckusick pc.cp++; 15082080Smckusick push8(cos(pop8())); 15092080Smckusick continue; 15102080Smckusick case O_EXP: 15112080Smckusick pc.cp++; 15122080Smckusick push8(exp(pop8())); 15132080Smckusick continue; 15142080Smckusick case O_LN: 15152080Smckusick pc.cp++; 15162191Smckusic if (_runtst) { 15172191Smckusic push8(LN(pop8())); 15182191Smckusic continue; 15192191Smckusic } 15202191Smckusic push8(log(pop8())); 15212080Smckusick continue; 15222080Smckusick case O_SIN: 15232080Smckusick pc.cp++; 15242080Smckusick push8(sin(pop8())); 15252080Smckusick continue; 15262080Smckusick case O_SQRT: 15272080Smckusick pc.cp++; 15282191Smckusic if (_runtst) { 15292191Smckusic push8(SQRT(pop8())); 15302191Smckusic continue; 15312191Smckusic } 15322191Smckusic push8(sqrt(pop8())); 15332080Smckusick continue; 15342080Smckusick case O_CHR2: 15352080Smckusick case O_CHR4: 15362080Smckusick pc.cp++; 15372191Smckusic if (_runtst) { 1538*2950Smckusic push2((short)(CHR(pop4()))); 15392191Smckusic continue; 15402191Smckusic } 1541*2950Smckusic push2((short)(pop4())); 15422080Smckusick continue; 15432080Smckusick case O_ODD2: 15442080Smckusick case O_ODD4: 15452080Smckusick pc.cp++; 1546*2950Smckusic push2((short)(pop4() & 1)); 15472080Smckusick continue; 15482080Smckusick case O_SUCC2: 15492109Smckusic tl = *pc.cp++; 15502109Smckusic if (tl == 0) 15512109Smckusic tl = *pc.sp++; 15522109Smckusic tl1 = pop4(); 15532191Smckusic if (_runtst) { 1554*2950Smckusic push2((short)(SUCC(tl1, tl, (long)(*pc.sp++)))); 15552191Smckusic continue; 15562191Smckusic } 1557*2950Smckusic push2((short)(tl1 + 1)); 15582191Smckusic pc.sp++; 15592080Smckusick continue; 15602080Smckusick case O_SUCC24: 15612109Smckusic tl = *pc.cp++; 15622109Smckusic if (tl == 0) 15632109Smckusic tl = *pc.sp++; 15642109Smckusic tl1 = pop4(); 15652191Smckusic if (_runtst) { 1566*2950Smckusic push4(SUCC(tl1, tl, (long)(*pc.sp++))); 15672191Smckusic continue; 15682191Smckusic } 15692191Smckusic push4(tl1 + 1); 15702191Smckusic pc.sp++; 15712109Smckusic continue; 15722080Smckusick case O_SUCC4: 15732109Smckusic tl = *pc.cp++; 15742109Smckusic if (tl == 0) 15752109Smckusic tl = *pc.lp++; 15762109Smckusic tl1 = pop4(); 15772191Smckusic if (_runtst) { 1578*2950Smckusic push4(SUCC(tl1, tl, (long)(*pc.lp++))); 15792191Smckusic continue; 15802191Smckusic } 15812191Smckusic push4(tl1 + 1); 15822191Smckusic pc.lp++; 15832080Smckusick continue; 15842080Smckusick case O_PRED2: 15852109Smckusic tl = *pc.cp++; 15862109Smckusic if (tl == 0) 15872109Smckusic tl = *pc.sp++; 15882109Smckusic tl1 = pop4(); 15892191Smckusic if (_runtst) { 1590*2950Smckusic push2((short)(PRED(tl1, tl, (long)(*pc.sp++)))); 15912191Smckusic continue; 15922191Smckusic } 1593*2950Smckusic push2((short)(tl1 - 1)); 15942191Smckusic pc.sp++; 15952080Smckusick continue; 15962080Smckusick case O_PRED24: 15972109Smckusic tl = *pc.cp++; 15982109Smckusic if (tl == 0) 15992109Smckusic tl = *pc.sp++; 16002109Smckusic tl1 = pop4(); 16012191Smckusic if (_runtst) { 1602*2950Smckusic push4(PRED(tl1, tl, (long)(*pc.sp++))); 16032191Smckusic continue; 16042191Smckusic } 16052191Smckusic push4(tl1 - 1); 16062191Smckusic pc.sp++; 16072109Smckusic continue; 16082080Smckusick case O_PRED4: 16092109Smckusic tl = *pc.cp++; 16102109Smckusic if (tl == 0) 16112109Smckusic tl = *pc.lp++; 16122109Smckusic tl1 = pop4(); 16132191Smckusic if (_runtst) { 1614*2950Smckusic push4(PRED(tl1, tl, (long)(*pc.lp++))); 16152191Smckusic continue; 16162191Smckusic } 16172191Smckusic push4(tl1 - 1); 16182191Smckusic pc.lp++; 16192080Smckusick continue; 16202080Smckusick case O_SEED: 16212080Smckusick pc.cp++; 16222080Smckusick push4(SEED(pop4())); 16232080Smckusick continue; 16242080Smckusick case O_RANDOM: 16252080Smckusick pc.cp++; 16262080Smckusick push8(RANDOM(pop8())); 16272080Smckusick continue; 16282080Smckusick case O_EXPO: 16292080Smckusick pc.cp++; 16302080Smckusick push4(EXPO(pop8())); 16312080Smckusick continue; 16322080Smckusick case O_SQR2: 16332080Smckusick case O_SQR4: 16342080Smckusick pc.cp++; 16352080Smckusick tl = pop4(); 16362080Smckusick push4(tl * tl); 16372080Smckusick continue; 16382080Smckusick case O_SQR8: 16392080Smckusick pc.cp++; 16402080Smckusick td = pop8(); 16412080Smckusick push8(td * td); 16422080Smckusick continue; 16432080Smckusick case O_ROUND: 16442080Smckusick pc.cp++; 16452080Smckusick push4(ROUND(pop8())); 16462080Smckusick continue; 16472080Smckusick case O_TRUNC: 16482080Smckusick pc.cp++; 16492080Smckusick push4(TRUNC(pop8())); 16502080Smckusick continue; 1651*2950Smckusic default: 1652*2950Smckusic panic(PBADOP); 1653*2950Smckusic continue; 16542080Smckusick } 16552080Smckusick } 16562080Smckusick } 1657