12080Smckusick /* Copyright (c) 1979 Regents of the University of California */ 22080Smckusick 3*2191Smckusic static char sccsid[] = "@(#)interp.c 1.4 01/16/81"; 42080Smckusick 52080Smckusick #include <math.h> 62080Smckusick #include "vars.h" 72080Smckusick #include "panics.h" 82080Smckusick #include "h02opcs.h" 92080Smckusick #include "machdep.h" 102080Smckusick #include "h01errs.h" 112080Smckusick #include "libpc.h" 122080Smckusick 132080Smckusick /* 142080Smckusick * program variables 152080Smckusick */ 162109Smckusic union disply _display; 172080Smckusick struct disp *_dp; 182080Smckusick long _lino = 0; 192080Smckusick int _argc; 202080Smckusick char **_argv; 212080Smckusick long _mode; 22*2191Smckusic long _runtst = TRUE; 23*2191Smckusic long _nodump = FALSE; 242080Smckusick long _stlim = 500000; 252080Smckusick long _stcnt = 0; 26*2191Smckusic long _seed = 1; 272080Smckusick char *_minptr = (char *)0x7fffffff; 282080Smckusick char *_maxptr = (char *)0; 292080Smckusick long *_pcpcount = (long *)0; 302080Smckusick long _cntrs = 0; 312080Smckusick long _rtns = 0; 322080Smckusick 332080Smckusick /* 342080Smckusick * file record variables 352080Smckusick */ 362080Smckusick long _filefre = PREDEF; 372080Smckusick struct iorechd _fchain = { 382080Smckusick 0, 0, 0, 0, /* only use fchain field */ 392080Smckusick INPUT /* fchain */ 402080Smckusick }; 412080Smckusick struct iorec *_actfile[MAXFILES] = { 422080Smckusick INPUT, 432080Smckusick OUTPUT, 442080Smckusick ERR 452080Smckusick }; 462080Smckusick 472080Smckusick /* 482080Smckusick * standard files 492080Smckusick */ 502080Smckusick char _inwin, _outwin, _errwin; 512080Smckusick struct iorechd input = { 522080Smckusick &_inwin, /* fileptr */ 532080Smckusick 0, /* lcount */ 542080Smckusick 0x7fffffff, /* llimit */ 552080Smckusick &_iob[0], /* fbuf */ 562080Smckusick OUTPUT, /* fchain */ 572080Smckusick STDLVL, /* flev */ 582080Smckusick "standard input", /* pfname */ 592080Smckusick FTEXT | FREAD | SYNC, /* funit */ 602080Smckusick 0, /* fblk */ 612080Smckusick 1 /* fsize */ 622080Smckusick }; 632080Smckusick struct iorechd output = { 642080Smckusick &_outwin, /* fileptr */ 652080Smckusick 0, /* lcount */ 662080Smckusick 0x7fffffff, /* llimit */ 672080Smckusick &_iob[1], /* fbuf */ 682080Smckusick ERR, /* fchain */ 692080Smckusick STDLVL, /* flev */ 702080Smckusick "standard output", /* pfname */ 712080Smckusick FTEXT | FWRITE | EOFF, /* funit */ 722080Smckusick 1, /* fblk */ 732080Smckusick 1 /* fsize */ 742080Smckusick }; 752080Smckusick struct iorechd _err = { 762080Smckusick &_errwin, /* fileptr */ 772080Smckusick 0, /* lcount */ 782080Smckusick 0x7fffffff, /* llimit */ 792080Smckusick &_iob[2], /* fbuf */ 802080Smckusick FILNIL, /* fchain */ 812080Smckusick STDLVL, /* flev */ 822080Smckusick "Message file", /* pfname */ 832080Smckusick FTEXT | FWRITE | EOFF, /* funit */ 842080Smckusick 2, /* fblk */ 852080Smckusick 1 /* fsize */ 862080Smckusick }; 872080Smckusick 882109Smckusic /* 892109Smckusic * Px profile array 902109Smckusic */ 912109Smckusic #ifdef PROFILE 922109Smckusic long _profcnts[NUMOPS]; 932109Smckusic #endif PROFILE 942109Smckusic 952109Smckusic /* 962109Smckusic * debugging variables 972109Smckusic */ 982109Smckusic #ifdef DEBUG 992109Smckusic char opc[10]; 1002109Smckusic long opcptr = 9; 1012109Smckusic #endif DEBUG 1022109Smckusic 1032080Smckusick interpreter(base) 1042080Smckusick char *base; 1052080Smckusick { 1062080Smckusick union progcntr pc; /* interpreted program cntr */ 1072080Smckusick register char *vpc; /* register used for "pc" */ 1082080Smckusick struct iorec *curfile; /* active file */ 1092080Smckusick register struct stack *stp; /* active stack frame ptr */ 1102080Smckusick /* 1112080Smckusick * the following variables are used as scratch 1122080Smckusick */ 1132080Smckusick double td, td1; 1142080Smckusick register long tl, tl1, tl2; 1152080Smckusick long *tlp; 1162080Smckusick short *tsp, *tsp1; 1172080Smckusick register char *tcp; 1182080Smckusick char *tcp1; 1192080Smckusick struct stack *tstp; 1202080Smckusick struct formalrtn *tfp; 1212080Smckusick union progcntr tpc; 1222080Smckusick struct iorec **ip; 1232080Smckusick 1242080Smckusick /* 1252080Smckusick * necessary only on systems which do not initialize 1262080Smckusick * memory to zero 1272080Smckusick */ 1282080Smckusick for (ip = &_actfile[3]; ip < &_actfile[MAXFILES]; *ip++ = FILNIL) 1292080Smckusick /* void */; 1302080Smckusick /* 1312080Smckusick * set up global environment, then ``call'' the main program 1322080Smckusick */ 1332109Smckusic _display.frame[0].locvars = pushsp(2 * sizeof(struct iorec *)); 1342109Smckusic _display.frame[0].locvars += 8; /* local offsets are negative */ 1352109Smckusic *(struct iorec **)(_display.frame[0].locvars - 4) = OUTPUT; 1362109Smckusic *(struct iorec **)(_display.frame[0].locvars - 8) = INPUT; 1372080Smckusick stp = (struct stack *)pushsp(sizeof(struct stack)); 1382109Smckusic _dp = &_display.frame[0]; 1392080Smckusick pc.cp = base; 1402080Smckusick for(;;) { 1412109Smckusic # ifdef DEBUG 1422080Smckusick if (++opcptr == 10) 1432080Smckusick opcptr = 0; 1442080Smckusick opc[opcptr] = *pc.ucp; 1452109Smckusic # endif DEBUG 1462109Smckusic # ifdef PROFILE 1472109Smckusic _profcnts[*pc.ucp]++; 1482109Smckusic # endif PROFILE 1492080Smckusick switch (*pc.ucp++) { 1502080Smckusick default: 1512080Smckusick panic(PBADOP); 1522080Smckusick continue; 1532080Smckusick case O_NODUMP: 154*2191Smckusic _nodump = TRUE; 1552080Smckusick /* and fall through */ 1562080Smckusick case O_BEG: 1572080Smckusick _dp += 1; /* enter local scope */ 1582080Smckusick stp->odisp = *_dp; /* save old display value */ 1592080Smckusick tl = *pc.ucp++; /* tl = name size */ 1602080Smckusick stp->entry = pc.hdrp; /* pointer to entry info */ 161*2191Smckusic tl1 = pc.hdrp->framesze;/* tl1 = size of frame */ 162*2191Smckusic _lino = pc.hdrp->offset; 163*2191Smckusic _runtst = pc.hdrp->tests; 164*2191Smckusic disableovrflo(); 165*2191Smckusic if (_runtst) 166*2191Smckusic enableovrflo(); 167*2191Smckusic pc.cp += tl + /* skip over proc hdr info */ 168*2191Smckusic sizeof(struct hdr) - 4; 1692080Smckusick stp->file = curfile; /* save active file */ 1702080Smckusick tcp = pushsp(tl1); /* tcp = new top of stack */ 1712080Smckusick blkclr(tl1, tcp); /* zero stack frame */ 1722109Smckusic tcp += tl1; /* offsets of locals are neg */ 1732109Smckusic _dp->locvars = tcp; /* set new display pointer */ 1742109Smckusic _dp->stp = stp; 1752080Smckusick stp->tos = pushsp(0); /* set top of stack pointer */ 1762080Smckusick continue; 1772080Smckusick case O_END: 1782080Smckusick PCLOSE(_dp->locvars); /* flush & close local files */ 1792080Smckusick stp = _dp->stp; 1802080Smckusick curfile = stp->file; /* restore old active file */ 1812080Smckusick *_dp = stp->odisp; /* restore old display entry */ 1822109Smckusic if (_dp == &_display.frame[1]) 1832080Smckusick return; /* exiting main proc ??? */ 1842080Smckusick _lino = stp->lino; /* restore lino, pc, dp */ 1852080Smckusick pc.cp = stp->pc.cp; 1862080Smckusick _dp = stp->dp; 187*2191Smckusic _runtst = stp->entry->tests; 188*2191Smckusic disableovrflo(); 189*2191Smckusic if (_runtst) 190*2191Smckusic enableovrflo(); 1912109Smckusic popsp(stp->entry->framesze + /* pop local vars */ 1922080Smckusick sizeof(struct stack) + /* pop stack frame */ 1932080Smckusick stp->entry->nargs); /* pop parms */ 1942080Smckusick continue; 1952080Smckusick case O_CALL: 1962080Smckusick tl = *pc.cp++; 1972080Smckusick tcp = base + *pc.lp++;/* calc new entry point */ 1982080Smckusick tcp += sizeof(short); 1992080Smckusick tcp = base + *(long *)tcp; 2002080Smckusick stp = (struct stack *)pushsp(sizeof(struct stack)); 2012080Smckusick stp->lino = _lino; /* save lino, pc, dp */ 2022080Smckusick stp->pc.cp = pc.cp; 2032080Smckusick stp->dp = _dp; 2042109Smckusic _dp = &_display.frame[tl]; /* set up new display ptr */ 2052080Smckusick pc.cp = tcp; 2062080Smckusick continue; 2072080Smckusick case O_FCALL: 2082080Smckusick tl = *pc.cp++; /* tl = number of args */ 2092080Smckusick if (tl == 0) 2102080Smckusick tl = *pc.lp++; 2112080Smckusick tfp = (struct formalrtn *)popaddr(); 2122080Smckusick stp = (struct stack *)pushsp(sizeof(struct stack)); 2132080Smckusick stp->lino = _lino; /* save lino, pc, dp */ 2142080Smckusick stp->pc.cp = pc.cp; 2152080Smckusick stp->dp = _dp; 2162080Smckusick pc.cp = tfp->entryaddr; /* calc new entry point */ 217*2191Smckusic if (_runtst) { 218*2191Smckusic tpc.sp = pc.sp + 1; 219*2191Smckusic tl -= tpc.hdrp->nargs; 220*2191Smckusic if (tl != 0) { 221*2191Smckusic if (tl > 0) 222*2191Smckusic tl += sizeof(int) - 1; 223*2191Smckusic else 224*2191Smckusic tl -= sizeof(int) - 1; 225*2191Smckusic ERROR(ENARGS, tl / sizeof(int)); 226*2191Smckusic } 2272080Smckusick } 2282109Smckusic _dp = &_display.frame[tfp->cbn];/* new display ptr */ 2292080Smckusick blkcpy(sizeof(struct disp) * tfp->cbn, 2302109Smckusic &_display.frame[1], &tfp->disp[tfp->cbn]); 2312080Smckusick blkcpy(sizeof(struct disp) * tfp->cbn, 2322109Smckusic &tfp->disp[0], &_display.frame[1]); 2332080Smckusick continue; 2342080Smckusick case O_FRTN: 2352080Smckusick tl = *pc.cp++; /* tl = size of return obj */ 2362080Smckusick if (tl == 0) 2372080Smckusick tl = *pc.usp++; 2382080Smckusick tcp = pushsp(0); 2392080Smckusick tfp = *(struct formalrtn **)(tcp + tl); 2402080Smckusick blkcpy(tl, tcp, tcp + sizeof(struct formalrtn *)); 2412080Smckusick popsp(sizeof(struct formalrtn *)); 2422080Smckusick blkcpy(sizeof(struct disp) * tfp->cbn, 2432109Smckusic &tfp->disp[tfp->cbn], &_display.frame[1]); 2442080Smckusick continue; 2452080Smckusick case O_FSAV: 2462080Smckusick tfp = (struct formalrtn *)popaddr(); 2472080Smckusick tfp->cbn = *pc.cp++; /* blk number of routine */ 2482080Smckusick tcp = base + *pc.lp++;/* calc new entry point */ 2492080Smckusick tcp += sizeof(short); 2502080Smckusick tfp->entryaddr = base + *(long *)tcp; 2512080Smckusick blkcpy(sizeof(struct disp) * tfp->cbn, 2522109Smckusic &_display.frame[1], &tfp->disp[0]); 2532080Smckusick pushaddr(tfp); 2542080Smckusick continue; 2552080Smckusick case O_SDUP2: 2562080Smckusick pc.cp++; 2572080Smckusick tl = pop2(); 2582080Smckusick push2(tl); 2592080Smckusick push2(tl); 2602080Smckusick continue; 2612080Smckusick case O_SDUP4: 2622080Smckusick pc.cp++; 2632080Smckusick tl = pop4(); 2642080Smckusick push4(tl); 2652080Smckusick push4(tl); 2662080Smckusick continue; 2672080Smckusick case O_TRA: 2682080Smckusick pc.cp++; 2692080Smckusick pc.cp += *pc.sp; 2702080Smckusick continue; 2712080Smckusick case O_TRA4: 2722080Smckusick pc.cp++; 2732080Smckusick pc.cp = base + *pc.lp; 2742080Smckusick continue; 2752080Smckusick case O_GOTO: 2762109Smckusic tstp = _display.frame[*pc.cp++].stp; /* ptr to 2772109Smckusic exit frame */ 2782080Smckusick pc.cp = base + *pc.lp; 2792080Smckusick stp = _dp->stp; 2802080Smckusick while (tstp != stp) { 2812109Smckusic if (_dp == &_display.frame[1]) 2822080Smckusick ERROR(EGOTO); /* exiting prog ??? */ 2832080Smckusick PCLOSE(_dp->locvars); /* close local files */ 2842080Smckusick curfile = stp->file; /* restore active file */ 2852080Smckusick *_dp = stp->odisp; /* old display entry */ 2862080Smckusick _dp = stp->dp; /* restore dp */ 2872080Smckusick stp = _dp->stp; 2882080Smckusick } 2892080Smckusick /* pop locals, stack frame, parms, and return values */ 2902080Smckusick popsp(stp->tos - pushsp(0)); 2912080Smckusick continue; 2922080Smckusick case O_LINO: 2932080Smckusick if (_dp->stp->tos != pushsp(0)) 2942080Smckusick panic(PSTKNEMP); 2952080Smckusick _lino = *pc.cp++; /* set line number */ 2962080Smckusick if (_lino == 0) 2972080Smckusick _lino = *pc.sp++; 2982080Smckusick LINO(); /* inc statement count */ 2992080Smckusick continue; 3002080Smckusick case O_PUSH: 3012080Smckusick tl = *pc.cp++; 3022080Smckusick if (tl == 0) 3032080Smckusick tl = *pc.usp++; 3042080Smckusick tl = (-tl + 1) & ~1; 3052080Smckusick tcp = pushsp(tl); 3062080Smckusick blkclr(tl, tcp); 3072080Smckusick continue; 3082080Smckusick case O_IF: 3092080Smckusick pc.cp++; 310*2191Smckusic if (pop2()) { 3112080Smckusick pc.sp++; 312*2191Smckusic continue; 313*2191Smckusic } 314*2191Smckusic pc.cp += *pc.sp; 3152080Smckusick continue; 3162080Smckusick case O_REL2: 3172080Smckusick tl = pop2(); 3182080Smckusick tl1 = pop2(); 3192080Smckusick goto cmplong; 3202080Smckusick case O_REL24: 3212080Smckusick tl = pop2(); 3222080Smckusick tl1 = pop4(); 3232080Smckusick goto cmplong; 3242080Smckusick case O_REL42: 3252080Smckusick tl = pop4(); 3262080Smckusick tl1 = pop2(); 3272080Smckusick goto cmplong; 3282080Smckusick case O_REL4: 3292080Smckusick tl = pop4(); 3302080Smckusick tl1 = pop4(); 3312080Smckusick cmplong: 3322080Smckusick tl2 = *pc.cp++; 3332080Smckusick switch (tl2) { 3342080Smckusick case releq: 3352080Smckusick push2(tl1 == tl); 3362080Smckusick continue; 3372080Smckusick case relne: 3382080Smckusick push2(tl1 != tl); 3392080Smckusick continue; 3402080Smckusick case rellt: 3412080Smckusick push2(tl1 < tl); 3422080Smckusick continue; 3432080Smckusick case relgt: 3442080Smckusick push2(tl1 > tl); 3452080Smckusick continue; 3462080Smckusick case relle: 3472080Smckusick push2(tl1 <= tl); 3482080Smckusick continue; 3492080Smckusick case relge: 3502080Smckusick push2(tl1 >= tl); 3512080Smckusick continue; 3522080Smckusick default: 3532080Smckusick panic(PSYSTEM); 3542080Smckusick continue; 3552080Smckusick } 3562080Smckusick case O_RELG: 3572080Smckusick tl2 = *pc.cp++; /* tc has jump opcode */ 3582080Smckusick tl = *pc.usp++; /* tl has comparison length */ 3592080Smckusick tl1 = (tl + 1) & ~1; /* tl1 has arg stack length */ 3602080Smckusick tcp = pushsp(0); /* tcp pts to first arg */ 3612080Smckusick switch (tl2) { 3622080Smckusick case releq: 3632080Smckusick tl = RELEQ(tl, tcp + tl1, tcp); 3642080Smckusick break; 3652080Smckusick case relne: 3662080Smckusick tl = RELNE(tl, tcp + tl1, tcp); 3672080Smckusick break; 3682080Smckusick case rellt: 3692080Smckusick tl = RELSLT(tl, tcp + tl1, tcp); 3702080Smckusick break; 3712080Smckusick case relgt: 3722080Smckusick tl = RELSGT(tl, tcp + tl1, tcp); 3732080Smckusick break; 3742080Smckusick case relle: 3752080Smckusick tl = RELSLE(tl, tcp + tl1, tcp); 3762080Smckusick break; 3772080Smckusick case relge: 3782080Smckusick tl = RELSGE(tl, tcp + tl1, tcp); 3792080Smckusick break; 3802080Smckusick default: 3812080Smckusick panic(PSYSTEM); 3822080Smckusick break; 3832080Smckusick } 3842080Smckusick popsp(tl1 << 1); 3852080Smckusick push2(tl); 3862080Smckusick continue; 3872080Smckusick case O_RELT: 3882080Smckusick tl2 = *pc.cp++; /* tc has jump opcode */ 3892080Smckusick tl1 = *pc.usp++; /* tl1 has comparison length */ 3902080Smckusick tcp = pushsp(0); /* tcp pts to first arg */ 3912080Smckusick switch (tl2) { 3922080Smckusick case releq: 3932080Smckusick tl = RELEQ(tl1, tcp + tl1, tcp); 3942080Smckusick break; 3952080Smckusick case relne: 3962080Smckusick tl = RELNE(tl1, tcp + tl1, tcp); 3972080Smckusick break; 3982080Smckusick case rellt: 3992080Smckusick tl = RELTLT(tl1, tcp + tl1, tcp); 4002080Smckusick break; 4012080Smckusick case relgt: 4022080Smckusick tl = RELTGT(tl1, tcp + tl1, tcp); 4032080Smckusick break; 4042080Smckusick case relle: 4052080Smckusick tl = RELTLE(tl1, tcp + tl1, tcp); 4062080Smckusick break; 4072080Smckusick case relge: 4082080Smckusick tl = RELTGE(tl1, tcp + tl1, tcp); 4092080Smckusick break; 4102080Smckusick default: 4112080Smckusick panic(PSYSTEM); 4122080Smckusick break; 4132080Smckusick } 4142080Smckusick popsp(tl1 << 1); 4152080Smckusick push2(tl); 4162080Smckusick continue; 4172080Smckusick case O_REL28: 4182080Smckusick td = pop2(); 4192080Smckusick td1 = pop8(); 4202080Smckusick goto cmpdbl; 4212080Smckusick case O_REL48: 4222080Smckusick td = pop4(); 4232080Smckusick td1 = pop8(); 4242080Smckusick goto cmpdbl; 4252080Smckusick case O_REL82: 4262080Smckusick td = pop8(); 4272080Smckusick td1 = pop2(); 4282080Smckusick goto cmpdbl; 4292080Smckusick case O_REL84: 4302080Smckusick td = pop8(); 4312080Smckusick td1 = pop4(); 4322080Smckusick goto cmpdbl; 4332080Smckusick case O_REL8: 4342080Smckusick td = pop8(); 4352080Smckusick td1 = pop8(); 4362080Smckusick cmpdbl: 4372080Smckusick switch (*pc.cp++) { 4382080Smckusick case releq: 4392080Smckusick push2(td1 == td); 4402080Smckusick continue; 4412080Smckusick case relne: 4422080Smckusick push2(td1 != td); 4432080Smckusick continue; 4442080Smckusick case rellt: 4452080Smckusick push2(td1 < td); 4462080Smckusick continue; 4472080Smckusick case relgt: 4482080Smckusick push2(td1 > td); 4492080Smckusick continue; 4502080Smckusick case relle: 4512080Smckusick push2(td1 <= td); 4522080Smckusick continue; 4532080Smckusick case relge: 4542080Smckusick push2(td1 >= td); 4552080Smckusick continue; 4562080Smckusick default: 4572080Smckusick panic(PSYSTEM); 4582080Smckusick continue; 4592080Smckusick } 4602080Smckusick case O_AND: 4612080Smckusick pc.cp++; 4622080Smckusick push2(pop2() & pop2()); 4632080Smckusick continue; 4642080Smckusick case O_OR: 4652080Smckusick pc.cp++; 4662080Smckusick push2(pop2() | pop2()); 4672080Smckusick continue; 4682080Smckusick case O_NOT: 4692080Smckusick pc.cp++; 4702080Smckusick push2(pop2() ^ 1); 4712080Smckusick continue; 4722080Smckusick case O_AS2: 4732080Smckusick pc.cp++; 4742080Smckusick tl = pop2(); 4752080Smckusick *(short *)popaddr() = tl; 4762080Smckusick continue; 4772080Smckusick case O_AS4: 4782080Smckusick pc.cp++; 4792080Smckusick tl = pop4(); 4802080Smckusick *(long *)popaddr() = tl; 4812080Smckusick continue; 4822080Smckusick case O_AS24: 4832080Smckusick pc.cp++; 4842080Smckusick tl = pop2(); 4852080Smckusick *(long *)popaddr() = tl; 4862080Smckusick continue; 4872080Smckusick case O_AS42: 4882080Smckusick pc.cp++; 4892080Smckusick tl = pop4(); 4902080Smckusick *(short *)popaddr() = tl; 4912080Smckusick continue; 4922080Smckusick case O_AS21: 4932080Smckusick pc.cp++; 4942080Smckusick tl = pop2(); 4952080Smckusick *popaddr() = tl; 4962080Smckusick continue; 4972080Smckusick case O_AS41: 4982080Smckusick pc.cp++; 4992080Smckusick tl = pop4(); 5002080Smckusick *popaddr() = tl; 5012080Smckusick continue; 5022080Smckusick case O_AS28: 5032080Smckusick pc.cp++; 5042080Smckusick tl = pop2(); 5052080Smckusick *(double *)popaddr() = tl; 5062080Smckusick continue; 5072080Smckusick case O_AS48: 5082080Smckusick pc.cp++; 5092080Smckusick tl = pop4(); 5102080Smckusick *(double *)popaddr() = tl; 5112080Smckusick continue; 5122080Smckusick case O_AS8: 5132080Smckusick pc.cp++; 5142080Smckusick td = pop8(); 5152080Smckusick *(double *)popaddr() = td; 5162080Smckusick continue; 5172080Smckusick case O_AS: 5182080Smckusick tl = *pc.cp++; 5192080Smckusick if (tl == 0) 5202080Smckusick tl = *pc.usp++; 5212080Smckusick tl1 = (tl + 1) & ~1; 5222080Smckusick tcp = pushsp(0); 5232080Smckusick blkcpy(tl, tcp, *(char **)(tcp + tl1)); 5242080Smckusick popsp(tl1 + sizeof(char *)); 5252080Smckusick continue; 5262080Smckusick case O_INX2P2: 5272080Smckusick tl = *pc.cp++; /* tl has shift amount */ 5282080Smckusick tl1 = (pop2() - *pc.sp++) << tl; 5292080Smckusick pushaddr(popaddr() + tl1); 5302080Smckusick continue; 5312080Smckusick case O_INX4P2: 5322080Smckusick tl = *pc.cp++; /* tl has shift amount */ 5332080Smckusick tl1 = (pop4() - *pc.sp++) << tl; 5342080Smckusick pushaddr(popaddr() + tl1); 5352080Smckusick continue; 5362080Smckusick case O_INX2: 5372080Smckusick tl = *pc.cp++; /* tl has element size */ 5382080Smckusick if (tl == 0) 5392080Smckusick tl = *pc.usp++; 5402080Smckusick tl1 = pop2(); /* index */ 5412080Smckusick tl2 = *pc.sp++; 5422080Smckusick pushaddr(popaddr() + (tl1 - tl2) * tl); 543*2191Smckusic tl = *pc.usp++; 544*2191Smckusic if (_runtst) 545*2191Smckusic SUBSC(tl1, tl2, tl); /* range check */ 5462080Smckusick continue; 5472080Smckusick case O_INX4: 5482080Smckusick tl = *pc.cp++; /* tl has element size */ 5492080Smckusick if (tl == 0) 5502080Smckusick tl = *pc.usp++; 5512080Smckusick tl1 = pop4(); /* index */ 5522080Smckusick tl2 = *pc.sp++; 5532080Smckusick pushaddr(popaddr() + (tl1 - tl2) * tl); 554*2191Smckusic tl = *pc.usp++; 555*2191Smckusic if (_runtst) 556*2191Smckusic SUBSC(tl1, tl2, tl); /* range check */ 5572080Smckusick continue; 5582080Smckusick case O_OFF: 5592080Smckusick tl = *pc.cp++; 5602080Smckusick if (tl == 0) 5612080Smckusick tl = *pc.usp++; 5622080Smckusick push4(pop4() + tl); 5632080Smckusick continue; 5642080Smckusick case O_NIL: 5652080Smckusick pc.cp++; 5662080Smckusick NIL(); 5672080Smckusick continue; 5682080Smckusick case O_ADD2: 5692080Smckusick pc.cp++; 5702080Smckusick push4(pop2() + pop2()); 5712080Smckusick continue; 5722080Smckusick case O_ADD4: 5732080Smckusick pc.cp++; 5742080Smckusick push4(pop4() + pop4()); 5752080Smckusick continue; 5762080Smckusick case O_ADD24: 5772080Smckusick pc.cp++; 5782080Smckusick tl = pop2(); 5792080Smckusick push4(pop4() + tl); 5802080Smckusick continue; 5812080Smckusick case O_ADD42: 5822080Smckusick pc.cp++; 5832080Smckusick tl = pop4(); 5842080Smckusick push4(pop2() + tl); 5852080Smckusick continue; 5862080Smckusick case O_ADD28: 5872080Smckusick pc.cp++; 5882080Smckusick tl = pop2(); 5892080Smckusick push8(pop8() + tl); 5902080Smckusick continue; 5912080Smckusick case O_ADD48: 5922080Smckusick pc.cp++; 5932080Smckusick tl = pop4(); 5942080Smckusick push8(pop8() + tl); 5952080Smckusick continue; 5962080Smckusick case O_ADD82: 5972080Smckusick pc.cp++; 5982080Smckusick td = pop8(); 5992080Smckusick push8(pop2() + td); 6002080Smckusick continue; 6012080Smckusick case O_ADD84: 6022080Smckusick pc.cp++; 6032080Smckusick td = pop8(); 6042080Smckusick push8(pop4() + td); 6052080Smckusick continue; 6062080Smckusick case O_SUB2: 6072080Smckusick pc.cp++; 6082080Smckusick tl = pop2(); 6092080Smckusick push4(pop2() - tl); 6102080Smckusick continue; 6112080Smckusick case O_SUB4: 6122080Smckusick pc.cp++; 6132080Smckusick tl = pop4(); 6142080Smckusick push4(pop4() - tl); 6152080Smckusick continue; 6162080Smckusick case O_SUB24: 6172080Smckusick pc.cp++; 6182080Smckusick tl = pop2(); 6192080Smckusick push4(pop4() - tl); 6202080Smckusick continue; 6212080Smckusick case O_SUB42: 6222080Smckusick pc.cp++; 6232080Smckusick tl = pop4(); 6242080Smckusick push4(pop2() - tl); 6252080Smckusick continue; 6262080Smckusick case O_SUB28: 6272080Smckusick pc.cp++; 6282080Smckusick tl = pop2(); 6292080Smckusick push8(pop8() - tl); 6302080Smckusick continue; 6312080Smckusick case O_SUB48: 6322080Smckusick pc.cp++; 6332080Smckusick tl = pop4(); 6342080Smckusick push8(pop8() - tl); 6352080Smckusick continue; 6362080Smckusick case O_SUB82: 6372080Smckusick pc.cp++; 6382080Smckusick td = pop8(); 6392080Smckusick push8(pop2() - td); 6402080Smckusick continue; 6412080Smckusick case O_SUB84: 6422080Smckusick pc.cp++; 6432080Smckusick td = pop8(); 6442080Smckusick push8(pop4() - td); 6452080Smckusick continue; 6462080Smckusick case O_MUL2: 6472080Smckusick pc.cp++; 6482080Smckusick push4(pop2() * pop2()); 6492080Smckusick continue; 6502080Smckusick case O_MUL4: 6512080Smckusick pc.cp++; 6522080Smckusick push4(pop4() * pop4()); 6532080Smckusick continue; 6542080Smckusick case O_MUL24: 6552080Smckusick pc.cp++; 6562080Smckusick tl = pop2(); 6572080Smckusick push4(pop4() * tl); 6582080Smckusick continue; 6592080Smckusick case O_MUL42: 6602080Smckusick pc.cp++; 6612080Smckusick tl = pop4(); 6622080Smckusick push4(pop2() * tl); 6632080Smckusick continue; 6642080Smckusick case O_MUL28: 6652080Smckusick pc.cp++; 6662080Smckusick tl = pop2(); 6672080Smckusick push8(pop8() * tl); 6682080Smckusick continue; 6692080Smckusick case O_MUL48: 6702080Smckusick pc.cp++; 6712080Smckusick tl = pop4(); 6722080Smckusick push8(pop8() * tl); 6732080Smckusick continue; 6742080Smckusick case O_MUL82: 6752080Smckusick pc.cp++; 6762080Smckusick td = pop8(); 6772080Smckusick push8(pop2() * td); 6782080Smckusick continue; 6792080Smckusick case O_MUL84: 6802080Smckusick pc.cp++; 6812080Smckusick td = pop8(); 6822080Smckusick push8(pop4() * td); 6832080Smckusick continue; 6842080Smckusick case O_ABS2: 6852080Smckusick case O_ABS4: 6862080Smckusick pc.cp++; 6872080Smckusick tl = pop4(); 6882080Smckusick push4(tl >= 0 ? tl : -tl); 6892080Smckusick continue; 6902080Smckusick case O_ABS8: 6912080Smckusick pc.cp++; 6922080Smckusick td = pop8(); 6932080Smckusick push8(td >= 0.0 ? td : -td); 6942080Smckusick continue; 6952080Smckusick case O_NEG2: 6962080Smckusick pc.cp++; 6972080Smckusick push4(-pop2()); 6982080Smckusick continue; 6992080Smckusick case O_NEG4: 7002080Smckusick pc.cp++; 7012080Smckusick push4(-pop4()); 7022080Smckusick continue; 7032080Smckusick case O_NEG8: 7042080Smckusick pc.cp++; 7052080Smckusick push8(-pop8()); 7062080Smckusick continue; 7072080Smckusick case O_DIV2: 7082080Smckusick pc.cp++; 7092080Smckusick tl = pop2(); 7102080Smckusick push4(pop2() / tl); 7112080Smckusick continue; 7122080Smckusick case O_DIV4: 7132080Smckusick pc.cp++; 7142080Smckusick tl = pop4(); 7152080Smckusick push4(pop4() / tl); 7162080Smckusick continue; 7172080Smckusick case O_DIV24: 7182080Smckusick pc.cp++; 7192080Smckusick tl = pop2(); 7202080Smckusick push4(pop4() / tl); 7212080Smckusick continue; 7222080Smckusick case O_DIV42: 7232080Smckusick pc.cp++; 7242080Smckusick tl = pop4(); 7252080Smckusick push4(pop2() / tl); 7262080Smckusick continue; 7272080Smckusick case O_MOD2: 7282080Smckusick pc.cp++; 7292080Smckusick tl = pop2(); 7302080Smckusick push4(pop2() % tl); 7312080Smckusick continue; 7322080Smckusick case O_MOD4: 7332080Smckusick pc.cp++; 7342080Smckusick tl = pop4(); 7352080Smckusick push4(pop4() % tl); 7362080Smckusick continue; 7372080Smckusick case O_MOD24: 7382080Smckusick pc.cp++; 7392080Smckusick tl = pop2(); 7402080Smckusick push4(pop4() % tl); 7412080Smckusick continue; 7422080Smckusick case O_MOD42: 7432080Smckusick pc.cp++; 7442080Smckusick tl = pop4(); 7452080Smckusick push4(pop2() % tl); 7462080Smckusick continue; 7472080Smckusick case O_ADD8: 7482080Smckusick pc.cp++; 7492080Smckusick push8(pop8() + pop8()); 7502080Smckusick continue; 7512080Smckusick case O_SUB8: 7522080Smckusick pc.cp++; 7532080Smckusick td = pop8(); 7542080Smckusick push8(pop8() - td); 7552080Smckusick continue; 7562080Smckusick case O_MUL8: 7572080Smckusick pc.cp++; 7582080Smckusick push8(pop8() * pop8()); 7592080Smckusick continue; 7602080Smckusick case O_DVD8: 7612080Smckusick pc.cp++; 7622080Smckusick td = pop8(); 7632080Smckusick push8(pop8() / td); 7642080Smckusick continue; 7652080Smckusick case O_STOI: 7662080Smckusick pc.cp++; 7672080Smckusick push4(pop2()); 7682080Smckusick continue; 7692080Smckusick case O_STOD: 7702080Smckusick pc.cp++; 7712080Smckusick td = pop2(); 7722080Smckusick push8(td); 7732080Smckusick continue; 7742080Smckusick case O_ITOD: 7752080Smckusick pc.cp++; 7762080Smckusick td = pop4(); 7772080Smckusick push8(td); 7782080Smckusick continue; 7792080Smckusick case O_ITOS: 7802080Smckusick pc.cp++; 7812080Smckusick push2(pop4()); 7822080Smckusick continue; 7832080Smckusick case O_DVD2: 7842080Smckusick pc.cp++; 7852080Smckusick td = pop2(); 7862080Smckusick push8(pop2() / td); 7872080Smckusick continue; 7882080Smckusick case O_DVD4: 7892080Smckusick pc.cp++; 7902080Smckusick td = pop4(); 7912080Smckusick push8(pop4() / td); 7922080Smckusick continue; 7932080Smckusick case O_DVD24: 7942080Smckusick pc.cp++; 7952080Smckusick td = pop2(); 7962080Smckusick push8(pop4() / td); 7972080Smckusick continue; 7982080Smckusick case O_DVD42: 7992080Smckusick pc.cp++; 8002080Smckusick td = pop4(); 8012080Smckusick push8(pop2() / td); 8022080Smckusick continue; 8032080Smckusick case O_DVD28: 8042080Smckusick pc.cp++; 8052080Smckusick td = pop2(); 8062080Smckusick push8(pop8() / td); 8072080Smckusick continue; 8082080Smckusick case O_DVD48: 8092080Smckusick pc.cp++; 8102080Smckusick td = pop4(); 8112080Smckusick push8(pop8() / td); 8122080Smckusick continue; 8132080Smckusick case O_DVD82: 8142080Smckusick pc.cp++; 8152080Smckusick td = pop8(); 8162080Smckusick push8(pop2() / td); 8172080Smckusick continue; 8182080Smckusick case O_DVD84: 8192080Smckusick pc.cp++; 8202080Smckusick td = pop8(); 8212080Smckusick push8(pop4() / td); 8222080Smckusick continue; 8232080Smckusick case O_RV1: 8242109Smckusic tcp = _display.raw[*pc.ucp++]; 8252080Smckusick push2(*(tcp + *pc.sp++)); 8262080Smckusick continue; 8272080Smckusick case O_RV14: 8282109Smckusic tcp = _display.raw[*pc.ucp++]; 8292080Smckusick push4(*(tcp + *pc.sp++)); 8302080Smckusick continue; 8312080Smckusick case O_RV2: 8322109Smckusic tcp = _display.raw[*pc.ucp++]; 8332080Smckusick push2(*(short *)(tcp + *pc.sp++)); 8342080Smckusick continue; 8352080Smckusick case O_RV24: 8362109Smckusic tcp = _display.raw[*pc.ucp++]; 8372080Smckusick push4(*(short *)(tcp + *pc.sp++)); 8382080Smckusick continue; 8392080Smckusick case O_RV4: 8402109Smckusic tcp = _display.raw[*pc.ucp++]; 8412080Smckusick push4(*(long *)(tcp + *pc.sp++)); 8422080Smckusick continue; 8432080Smckusick case O_RV8: 8442109Smckusic tcp = _display.raw[*pc.ucp++]; 8452080Smckusick push8(*(double *)(tcp + *pc.sp++)); 8462080Smckusick continue; 8472080Smckusick case O_RV: 8482109Smckusic tcp = _display.raw[*pc.ucp++]; 8492080Smckusick tcp += *pc.sp++; 8502080Smckusick tl = *pc.usp++; 8512080Smckusick tcp1 = pushsp(tl); 8522080Smckusick blkcpy(tl, tcp, tcp1); 8532080Smckusick continue; 8542080Smckusick case O_LV: 8552109Smckusic tcp = _display.raw[*pc.ucp++]; 8562080Smckusick pushaddr(tcp + *pc.sp++); 8572080Smckusick continue; 8582080Smckusick case O_LRV1: 8592109Smckusic tcp = _display.raw[*pc.ucp++]; 8602080Smckusick push2(*(tcp + *pc.lp++)); 8612080Smckusick continue; 8622080Smckusick case O_LRV14: 8632109Smckusic tcp = _display.raw[*pc.ucp++]; 8642080Smckusick push4(*(tcp + *pc.lp++)); 8652080Smckusick continue; 8662080Smckusick case O_LRV2: 8672109Smckusic tcp = _display.raw[*pc.ucp++]; 8682080Smckusick push2(*(short *)(tcp + *pc.lp++)); 8692080Smckusick continue; 8702080Smckusick case O_LRV24: 8712109Smckusic tcp = _display.raw[*pc.ucp++]; 8722080Smckusick push4(*(short *)(tcp + *pc.lp++)); 8732080Smckusick continue; 8742080Smckusick case O_LRV4: 8752109Smckusic tcp = _display.raw[*pc.ucp++]; 8762080Smckusick push4(*(long *)(tcp + *pc.lp++)); 8772080Smckusick continue; 8782080Smckusick case O_LRV8: 8792109Smckusic tcp = _display.raw[*pc.ucp++]; 8802080Smckusick push8(*(double *)(tcp + *pc.lp++)); 8812080Smckusick continue; 8822080Smckusick case O_LRV: 8832109Smckusic tcp = _display.raw[*pc.ucp++]; 8842080Smckusick tcp += *pc.lp++; 8852080Smckusick tl = *pc.usp++; 8862080Smckusick tcp1 = pushsp(tl); 8872080Smckusick blkcpy(tl, tcp, tcp1); 8882080Smckusick continue; 8892080Smckusick case O_LLV: 8902109Smckusic tcp = _display.raw[*pc.ucp++]; 8912080Smckusick pushaddr(tcp + *pc.lp++); 8922080Smckusick continue; 8932080Smckusick case O_IND1: 8942080Smckusick pc.cp++; 8952080Smckusick push2(*popaddr()); 8962080Smckusick continue; 8972080Smckusick case O_IND14: 8982080Smckusick pc.cp++; 8992080Smckusick push4(*popaddr()); 9002080Smckusick continue; 9012080Smckusick case O_IND2: 9022080Smckusick pc.cp++; 9032080Smckusick push2(*(short *)(popaddr())); 9042080Smckusick continue; 9052080Smckusick case O_IND24: 9062080Smckusick pc.cp++; 9072080Smckusick push4(*(short *)(popaddr())); 9082080Smckusick continue; 9092080Smckusick case O_IND4: 9102080Smckusick pc.cp++; 9112080Smckusick push4(*(long *)(popaddr())); 9122080Smckusick continue; 9132080Smckusick case O_IND8: 9142080Smckusick pc.cp++; 9152080Smckusick push8(*(double *)(popaddr())); 9162080Smckusick continue; 9172080Smckusick case O_IND: 9182080Smckusick tl = *pc.cp++; 9192080Smckusick if (tl == 0) 9202080Smckusick tl = *pc.usp++; 9212080Smckusick tcp = popaddr(); 9222080Smckusick tcp1 = pushsp((tl + 1) & ~1); 9232080Smckusick blkcpy(tl, tcp, tcp1); 9242080Smckusick continue; 9252080Smckusick case O_CON1: 9262080Smckusick push2(*pc.cp++); 9272080Smckusick continue; 9282080Smckusick case O_CON14: 9292080Smckusick push4(*pc.cp++); 9302080Smckusick continue; 9312080Smckusick case O_CON2: 9322080Smckusick pc.cp++; 9332080Smckusick push2(*pc.sp++); 9342080Smckusick continue; 9352080Smckusick case O_CON24: 9362080Smckusick pc.cp++; 9372080Smckusick push4(*pc.sp++); 9382080Smckusick continue; 9392080Smckusick case O_CON4: 9402080Smckusick pc.cp++; 9412080Smckusick push4(*pc.lp++); 9422080Smckusick continue; 9432080Smckusick case O_CON8: 9442080Smckusick pc.cp++; 9452080Smckusick push8(*pc.dp++); 9462080Smckusick continue; 9472080Smckusick case O_CON: 9482080Smckusick tl = *pc.cp++; 9492080Smckusick if (tl == 0) 9502080Smckusick tl = *pc.usp++; 9512080Smckusick tl = (tl + 1) & ~1; 9522080Smckusick tcp = pushsp(tl); 9532080Smckusick blkcpy(tl, pc.cp, tcp); 9542080Smckusick pc.cp += tl; 9552080Smckusick continue; 9562080Smckusick case O_LVCON: 9572080Smckusick tl = *pc.cp++; 9582080Smckusick if (tl == 0) 9592080Smckusick tl = *pc.usp++; 9602080Smckusick tl = (tl + 1) & ~1; 9612080Smckusick pushaddr(pc.cp); 9622080Smckusick pc.cp += tl; 9632080Smckusick continue; 9642080Smckusick case O_RANG2: 9652080Smckusick tl = *pc.cp++; 9662080Smckusick if (tl == 0) 9672080Smckusick tl = *pc.sp++; 9682080Smckusick tl1 = pop2(); 9692080Smckusick push2(RANG4(tl1, tl, *pc.sp++)); 9702080Smckusick continue; 9712080Smckusick case O_RANG42: 9722080Smckusick tl = *pc.cp++; 9732080Smckusick if (tl == 0) 9742080Smckusick tl = *pc.sp++; 9752080Smckusick tl1 = pop4(); 9762080Smckusick push4(RANG4(tl1, tl, *pc.sp++)); 9772080Smckusick continue; 9782080Smckusick case O_RSNG2: 9792080Smckusick tl = *pc.cp++; 9802080Smckusick if (tl == 0) 9812080Smckusick tl = *pc.sp++; 9822080Smckusick tl1 = pop2(); 9832080Smckusick push2(RSNG4(tl1, tl)); 9842080Smckusick continue; 9852080Smckusick case O_RSNG42: 9862080Smckusick tl = *pc.cp++; 9872080Smckusick if (tl == 0) 9882080Smckusick tl = *pc.sp++; 9892080Smckusick tl1 = pop4(); 9902080Smckusick push4(RSNG4(tl1, tl)); 9912080Smckusick continue; 9922080Smckusick case O_RANG4: 9932080Smckusick pc.cp++; 9942080Smckusick tl = *pc.lp++; 9952080Smckusick tl1 = pop4(); 9962080Smckusick push4(RANG4(tl1, tl, *pc.lp++)); 9972080Smckusick continue; 9982080Smckusick case O_RANG24: 9992080Smckusick pc.cp++; 10002080Smckusick tl = *pc.lp++; 10012080Smckusick tl1 = pop2(); 10022080Smckusick push2(RANG4(tl1, tl, *pc.lp++)); 10032080Smckusick continue; 10042080Smckusick case O_RSNG4: 10052080Smckusick pc.cp++; 10062080Smckusick tl = pop4(); 10072080Smckusick push4(RSNG4(tl, *pc.lp++)); 10082080Smckusick continue; 10092080Smckusick case O_RSNG24: 10102080Smckusick pc.cp++; 10112080Smckusick tl = pop2(); 10122080Smckusick push2(RSNG4(tl, *pc.lp++)); 10132080Smckusick continue; 10142080Smckusick case O_STLIM: 10152080Smckusick pc.cp++; 10162121Smckusic STLIM(); 10172121Smckusic popargs(1); 10182080Smckusick continue; 10192080Smckusick case O_LLIMIT: 10202080Smckusick pc.cp++; 10212080Smckusick LLIMIT(); 10222080Smckusick popargs(2); 10232080Smckusick continue; 10242080Smckusick case O_BUFF: 10252080Smckusick BUFF(*pc.cp++); 10262080Smckusick continue; 10272080Smckusick case O_HALT: 10282080Smckusick pc.cp++; 10292080Smckusick panic(PHALT); 10302080Smckusick continue; 10312080Smckusick case O_PXPBUF: 10322080Smckusick pc.cp++; 10332080Smckusick _cntrs = *pc.lp++; 10342080Smckusick _rtns = *pc.lp++; 10352080Smckusick _pcpcount = (long *)calloc(_cntrs + 1, sizeof(long)); 10362080Smckusick continue; 10372080Smckusick case O_COUNT: 10382080Smckusick pc.cp++; 10392080Smckusick _pcpcount[*pc.usp++]++; 10402080Smckusick continue; 10412080Smckusick case O_CASE1OP: 10422080Smckusick tl = *pc.cp++; /* tl = number of cases */ 10432080Smckusick if (tl == 0) 10442080Smckusick tl = *pc.usp++; 10452080Smckusick tsp = pc.sp + tl; /* ptr to end of jump table */ 10462080Smckusick tcp = (char *)tsp; /* tcp = ptr to case values */ 10472080Smckusick tl1 = pop2(); /* tl1 = element to find */ 10482080Smckusick for(; tl > 0; tl--) /* look for element */ 10492080Smckusick if (tl1 == *tcp++) 10502080Smckusick break; 10512080Smckusick if (tl == 0) /* default case => error */ 10522080Smckusick ERROR(ECASE, tl2); 10532080Smckusick pc.cp += *(tsp - tl); 10542080Smckusick continue; 10552080Smckusick case O_CASE2OP: 10562080Smckusick tl = *pc.cp++; /* tl = number of cases */ 10572080Smckusick if (tl == 0) 10582080Smckusick tl = *pc.usp++; 10592080Smckusick tsp = pc.sp + tl; /* ptr to end of jump table */ 10602080Smckusick tsp1 = tsp; /* tsp1 = ptr to case values */ 10612080Smckusick tl1 = (unsigned short)pop2();/* tl1 = element to find */ 10622080Smckusick for(; tl > 0; tl--) /* look for element */ 10632080Smckusick if (tl1 == *tsp1++) 10642080Smckusick break; 10652080Smckusick if (tl == 0) /* default case => error */ 10662080Smckusick ERROR(ECASE, tl2); 10672080Smckusick pc.cp += *(tsp - tl); 10682080Smckusick continue; 10692080Smckusick case O_CASE4OP: 10702080Smckusick tl = *pc.cp++; /* tl = number of cases */ 10712080Smckusick if (tl == 0) 10722080Smckusick tl = *pc.usp++; 10732080Smckusick tsp = pc.sp + tl; /* ptr to end of jump table */ 10742080Smckusick tlp = (long *)tsp; /* tlp = ptr to case values */ 10752080Smckusick tl1 = pop4(); /* tl1 = element to find */ 10762080Smckusick for(; tl > 0; tl--) /* look for element */ 10772080Smckusick if (tl1 == *tlp++) 10782080Smckusick break; 10792080Smckusick if (tl == 0) /* default case => error */ 10802080Smckusick ERROR(ECASE, tl2); 10812080Smckusick pc.cp += *(tsp - tl); 10822080Smckusick continue; 10832080Smckusick case O_ADDT: 10842080Smckusick tl = *pc.cp++; /* tl has comparison length */ 10852080Smckusick if (tl == 0) 10862080Smckusick tl = *pc.usp++; 10872080Smckusick tcp = pushsp(0); /* tcp pts to first arg */ 10882080Smckusick ADDT(tcp + tl, tcp + tl, tcp, tl >> 2); 10892080Smckusick popsp(tl); 10902080Smckusick continue; 10912080Smckusick case O_SUBT: 10922080Smckusick tl = *pc.cp++; /* tl has comparison length */ 10932080Smckusick if (tl == 0) 10942080Smckusick tl = *pc.usp++; 10952080Smckusick tcp = pushsp(0); /* tcp pts to first arg */ 10962080Smckusick SUBT(tcp + tl, tcp + tl, tcp, tl >> 2); 10972080Smckusick popsp(tl); 10982080Smckusick continue; 10992080Smckusick case O_MULT: 11002080Smckusick tl = *pc.cp++; /* tl has comparison length */ 11012080Smckusick if (tl == 0) 11022080Smckusick tl = *pc.usp++; 11032080Smckusick tcp = pushsp(0); /* tcp pts to first arg */ 11042080Smckusick MULT(tcp + tl, tcp + tl, tcp, tl >> 2); 11052080Smckusick popsp(tl); 11062080Smckusick continue; 11072080Smckusick case O_INCT: 11082080Smckusick tl = *pc.cp++; /* tl has number of args */ 11092080Smckusick if (tl == 0) 11102080Smckusick tl = *pc.usp++; 11112080Smckusick tl1 = INCT(); 11122080Smckusick popargs(tl); 11132080Smckusick push2(tl1); 11142080Smckusick continue; 11152080Smckusick case O_CTTOT: 11162080Smckusick tl = *pc.cp++; /* tl has number of args */ 11172080Smckusick if (tl == 0) 11182080Smckusick tl = *pc.usp++; 11192080Smckusick tl1 = tl * sizeof(long); 11202080Smckusick tcp = pushsp(0) + tl1; /* tcp pts to result space */ 11212080Smckusick CTTOT(tcp); 11222080Smckusick popargs(tl); 11232080Smckusick continue; 11242080Smckusick case O_CARD: 11252080Smckusick tl = *pc.cp++; /* tl has comparison length */ 11262080Smckusick if (tl == 0) 11272080Smckusick tl = *pc.usp++; 11282080Smckusick tcp = pushsp(0); /* tcp pts to set */ 11292080Smckusick tl1 = CARD(tcp, tl); 11302080Smckusick popsp(tl); 11312080Smckusick push2(tl1); 11322080Smckusick continue; 11332080Smckusick case O_IN: 11342080Smckusick tl = *pc.cp++; /* tl has comparison length */ 11352080Smckusick if (tl == 0) 11362080Smckusick tl = *pc.usp++; 11372080Smckusick tl1 = pop4(); /* tl1 is the element */ 11382080Smckusick tcp = pushsp(0); /* tcp pts to set */ 11392080Smckusick tl2 = *pc.usp++; /* lower bound */ 11402080Smckusick tl1 = IN(tl1, tl2, *pc.usp++, tcp); 11412080Smckusick popsp(tl); 11422080Smckusick push2(tl1); 11432080Smckusick continue; 11442080Smckusick case O_ASRT: 11452080Smckusick pc.cp++; 11462109Smckusic ASRT(pop2(), ""); 11472080Smckusick continue; 11482080Smckusick case O_FOR1U: 11492080Smckusick pc.cp++; 11502080Smckusick tcp = (char *)pop4(); /* tcp = ptr to index var */ 11512080Smckusick if (*tcp < pop4()) { /* still going up */ 1152*2191Smckusic tl = *tcp + 1; /* inc index var */ 1153*2191Smckusic tl1 = *pc.sp++; /* index lower bound */ 1154*2191Smckusic tl2 = *pc.sp++; /* index upper bound */ 1155*2191Smckusic if (_runtst) 1156*2191Smckusic RANG4(tl, tl1, tl2); 1157*2191Smckusic *tcp = tl; /* update index var */ 11582080Smckusick pc.cp += *pc.sp;/* return to top of loop */ 11592080Smckusick continue; 11602080Smckusick } 1161*2191Smckusic pc.sp += 3; /* else fall through */ 11622080Smckusick continue; 11632080Smckusick case O_FOR2U: 11642080Smckusick pc.cp++; 11652080Smckusick tsp = (short *)pop4(); /* tsp = ptr to index var */ 11662080Smckusick if (*tsp < pop4()) { /* still going up */ 1167*2191Smckusic tl = *tsp + 1; /* inc index var */ 1168*2191Smckusic tl1 = *pc.sp++; /* index lower bound */ 1169*2191Smckusic tl2 = *pc.sp++; /* index upper bound */ 1170*2191Smckusic if (_runtst) 1171*2191Smckusic RANG4(tl, tl1, tl2); 1172*2191Smckusic *tsp = tl; /* update index var */ 11732080Smckusick pc.cp += *pc.sp;/* return to top of loop */ 11742080Smckusick continue; 11752080Smckusick } 1176*2191Smckusic pc.sp += 3; /* else fall through */ 11772080Smckusick continue; 11782080Smckusick case O_FOR4U: 11792080Smckusick pc.cp++; 11802080Smckusick tlp = (long *)pop4(); /* tlp = ptr to index var */ 11812080Smckusick if (*tlp < pop4()) { /* still going up */ 1182*2191Smckusic tl = *tlp + 1; /* inc index var */ 1183*2191Smckusic tl1 = *pc.lp++; /* index lower bound */ 1184*2191Smckusic tl2 = *pc.lp++; /* index upper bound */ 1185*2191Smckusic if (_runtst) 1186*2191Smckusic RANG4(tl, tl1, tl2); 1187*2191Smckusic *tlp = tl; /* update index var */ 11882080Smckusick pc.cp += *pc.sp;/* return to top of loop */ 11892080Smckusick continue; 11902080Smckusick } 1191*2191Smckusic pc.sp += 5; /* else fall through */ 11922080Smckusick continue; 11932080Smckusick case O_FOR1D: 11942080Smckusick pc.cp++; 11952080Smckusick tcp = (char *)pop4(); /* tcp = ptr to index var */ 11962080Smckusick if (*tcp > pop4()) { /* still going down */ 1197*2191Smckusic tl = *tcp - 1; /* inc index var */ 1198*2191Smckusic tl1 = *pc.sp++; /* index lower bound */ 1199*2191Smckusic tl2 = *pc.sp++; /* index upper bound */ 1200*2191Smckusic if (_runtst) 1201*2191Smckusic RANG4(tl, tl1, tl2); 1202*2191Smckusic *tcp = tl; /* update index var */ 12032080Smckusick pc.cp += *pc.sp;/* return to top of loop */ 12042080Smckusick continue; 12052080Smckusick } 1206*2191Smckusic pc.sp += 3; /* else fall through */ 12072080Smckusick continue; 12082080Smckusick case O_FOR2D: 12092080Smckusick pc.cp++; 12102080Smckusick tsp = (short *)pop4(); /* tsp = ptr to index var */ 12112080Smckusick if (*tsp > pop4()) { /* still going down */ 1212*2191Smckusic tl = *tsp - 1; /* inc index var */ 1213*2191Smckusic tl1 = *pc.sp++; /* index lower bound */ 1214*2191Smckusic tl2 = *pc.sp++; /* index upper bound */ 1215*2191Smckusic if (_runtst) 1216*2191Smckusic RANG4(tl, tl1, tl2); 1217*2191Smckusic *tsp = tl; /* update index var */ 12182080Smckusick pc.cp += *pc.sp;/* return to top of loop */ 12192080Smckusick continue; 12202080Smckusick } 1221*2191Smckusic pc.sp += 3; /* else fall through */ 12222080Smckusick continue; 12232080Smckusick case O_FOR4D: 12242080Smckusick pc.cp++; 12252080Smckusick tlp = (long *)pop4(); /* tlp = ptr to index var */ 12262080Smckusick if (*tlp > pop4()) { /* still going down */ 1227*2191Smckusic tl = *tlp - 1; /* inc index var */ 1228*2191Smckusic tl1 = *pc.lp++; /* index lower bound */ 1229*2191Smckusic tl2 = *pc.lp++; /* index upper bound */ 1230*2191Smckusic if (_runtst) 1231*2191Smckusic RANG4(tl, tl1, tl2); 1232*2191Smckusic *tlp = tl; /* update index var */ 12332080Smckusick pc.cp += *pc.sp;/* return to top of loop */ 12342080Smckusick continue; 12352080Smckusick } 1236*2191Smckusic pc.sp += 5; /* else fall through */ 12372080Smckusick continue; 12382080Smckusick case O_READE: 12392080Smckusick pc.cp++; 12402080Smckusick push2(READE(curfile, base + *pc.lp++)); 12412080Smckusick continue; 12422080Smckusick case O_READ4: 12432080Smckusick pc.cp++; 12442080Smckusick push4(READ4(curfile)); 12452080Smckusick continue; 12462080Smckusick case O_READC: 12472080Smckusick pc.cp++; 12482080Smckusick push2(READC(curfile)); 12492080Smckusick continue; 12502080Smckusick case O_READ8: 12512080Smckusick pc.cp++; 12522080Smckusick push8(READ8(curfile)); 12532080Smckusick continue; 12542080Smckusick case O_READLN: 12552080Smckusick pc.cp++; 12562080Smckusick READLN(curfile); 12572080Smckusick continue; 12582080Smckusick case O_EOF: 12592080Smckusick pc.cp++; 12602080Smckusick push2(TEOF(popaddr())); 12612080Smckusick continue; 12622080Smckusick case O_EOLN: 12632080Smckusick pc.cp++; 12642080Smckusick push2(TEOLN(popaddr())); 12652080Smckusick continue; 12662080Smckusick case O_WRITEC: 12672080Smckusick pc.cp++; 1268*2191Smckusic if (_runtst) { 1269*2191Smckusic WRITEC(curfile); 1270*2191Smckusic popargs(2); 1271*2191Smckusic continue; 1272*2191Smckusic } 1273*2191Smckusic fputc(); 12742080Smckusick popargs(2); 12752080Smckusick continue; 12762080Smckusick case O_WRITES: 12772080Smckusick pc.cp++; 1278*2191Smckusic if (_runtst) { 1279*2191Smckusic WRITES(curfile); 1280*2191Smckusic popargs(4); 1281*2191Smckusic continue; 1282*2191Smckusic } 1283*2191Smckusic fwrite(); 12842080Smckusick popargs(4); 12852080Smckusick continue; 12862080Smckusick case O_WRITEF: 1287*2191Smckusic if (_runtst) { 1288*2191Smckusic WRITEF(curfile); 1289*2191Smckusic popargs(*pc.cp++); 1290*2191Smckusic continue; 1291*2191Smckusic } 1292*2191Smckusic fprintf(); 12932080Smckusick popargs(*pc.cp++); 12942080Smckusick continue; 12952080Smckusick case O_WRITLN: 12962080Smckusick pc.cp++; 1297*2191Smckusic if (_runtst) { 1298*2191Smckusic WRITLN(curfile); 1299*2191Smckusic continue; 1300*2191Smckusic } 1301*2191Smckusic fputc('\n', ACTFILE(curfile)); 13022080Smckusick continue; 13032080Smckusick case O_PAGE: 13042080Smckusick pc.cp++; 1305*2191Smckusic if (_runtst) { 1306*2191Smckusic PAGE(curfile); 1307*2191Smckusic continue; 1308*2191Smckusic } 1309*2191Smckusic fputc('^L', ACTFILE(curfile)); 13102080Smckusick continue; 13112080Smckusick case O_NAM: 13122080Smckusick pc.cp++; 13132080Smckusick tl = pop4(); 13142080Smckusick pushaddr(NAM(tl, base + *pc.lp++)); 13152080Smckusick continue; 13162080Smckusick case O_MAX: 13172080Smckusick tl = *pc.cp++; 13182080Smckusick if (tl == 0) 13192080Smckusick tl = *pc.usp++; 13202080Smckusick tl1 = pop4(); 1321*2191Smckusic if (_runtst) { 1322*2191Smckusic push4(MAX(tl1, tl, *pc.usp++)); 1323*2191Smckusic continue; 1324*2191Smckusic } 1325*2191Smckusic tl1 -= tl; 1326*2191Smckusic tl = *pc.usp++; 1327*2191Smckusic push4(tl1 > tl ? tl1 : tl); 13282080Smckusick continue; 13292080Smckusick case O_MIN: 13302080Smckusick tl = *pc.cp++; 13312080Smckusick if (tl == 0) 13322080Smckusick tl = *pc.usp++; 13332080Smckusick tl1 = pop4(); 13342080Smckusick push4(tl1 < tl ? tl1 : tl); 13352080Smckusick continue; 13362080Smckusick case O_UNIT: 13372080Smckusick pc.cp++; 13382080Smckusick curfile = UNIT(popaddr()); 13392080Smckusick continue; 13402080Smckusick case O_UNITINP: 13412080Smckusick pc.cp++; 13422080Smckusick curfile = INPUT; 13432080Smckusick continue; 13442080Smckusick case O_UNITOUT: 13452080Smckusick pc.cp++; 13462080Smckusick curfile = OUTPUT; 13472080Smckusick continue; 13482080Smckusick case O_MESSAGE: 13492080Smckusick pc.cp++; 13502080Smckusick PFLUSH(); 13512080Smckusick curfile = ERR; 13522080Smckusick continue; 13532109Smckusic case O_PUT: 13542109Smckusic pc.cp++; 13552109Smckusic PUT(curfile); 13562109Smckusic continue; 13572080Smckusick case O_GET: 13582080Smckusick pc.cp++; 13592080Smckusick GET(curfile); 13602080Smckusick continue; 13612080Smckusick case O_FNIL: 13622080Smckusick pc.cp++; 13632080Smckusick pushaddr(FNIL(popaddr())); 13642080Smckusick continue; 13652080Smckusick case O_DEFNAME: 13662080Smckusick pc.cp++; 13672080Smckusick DEFNAME(); 13682080Smckusick popargs(4); 13692080Smckusick continue; 13702080Smckusick case O_RESET: 13712080Smckusick pc.cp++; 13722080Smckusick RESET(); 13732080Smckusick popargs(4); 13742080Smckusick continue; 13752080Smckusick case O_REWRITE: 13762080Smckusick pc.cp++; 13772080Smckusick REWRITE(); 13782080Smckusick popargs(4); 13792080Smckusick continue; 13802080Smckusick case O_FILE: 13812080Smckusick pc.cp++; 13822080Smckusick pushaddr(ACTFILE(curfile)); 13832080Smckusick continue; 13842080Smckusick case O_REMOVE: 13852080Smckusick pc.cp++; 13862080Smckusick REMOVE(); 13872080Smckusick popargs(2); 13882080Smckusick continue; 13892080Smckusick case O_FLUSH: 13902080Smckusick pc.cp++; 13912080Smckusick FLUSH(); 13922080Smckusick popargs(1); 13932080Smckusick continue; 13942080Smckusick case O_PACK: 13952080Smckusick pc.cp++; 13962080Smckusick PACK(); 13972080Smckusick popargs(7); 13982080Smckusick continue; 13992080Smckusick case O_UNPACK: 14002080Smckusick pc.cp++; 14012080Smckusick UNPACK(); 14022080Smckusick popargs(7); 14032080Smckusick continue; 14042080Smckusick case O_ARGC: 14052080Smckusick pc.cp++; 14062080Smckusick push4(_argc); 14072080Smckusick continue; 14082080Smckusick case O_ARGV: 14092080Smckusick tl = *pc.cp++; /* tl = size of char array */ 14102080Smckusick if (tl == 0) 14112080Smckusick tl = *pc.usp++; 14122080Smckusick tcp = popaddr(); /* tcp = addr of char array */ 14132080Smckusick tl1 = pop4(); /* tl1 = argv subscript */ 14142080Smckusick ARGV(tl1, tcp, tl); 14152080Smckusick continue; 14162080Smckusick case O_CLCK: 14172080Smckusick pc.cp++; 14182080Smckusick push4(CLCK()); 14192080Smckusick continue; 14202080Smckusick case O_WCLCK: 14212080Smckusick pc.cp++; 14222080Smckusick push4(time(0)); 14232080Smckusick continue; 14242080Smckusick case O_SCLCK: 14252080Smckusick pc.cp++; 14262080Smckusick push4(SCLCK()); 14272080Smckusick continue; 14282080Smckusick case O_DISPOSE: 14292080Smckusick tl = *pc.cp++; /* tl = size being disposed */ 14302080Smckusick if (tl == 0) 14312080Smckusick tl = *pc.usp++; 14322080Smckusick tcp = popaddr(); /* ptr to ptr being disposed */ 14332080Smckusick DISPOSE(tcp, tl); 14342080Smckusick *(char **)tcp = (char *)0; 14352080Smckusick continue; 14362080Smckusick case O_NEW: 14372080Smckusick tl = *pc.cp++; /* tl = size being new'ed */ 14382080Smckusick if (tl == 0) 14392080Smckusick tl = *pc.usp++; 14402080Smckusick tcp = popaddr(); /* ptr to ptr being new'ed */ 1441*2191Smckusic if (_runtst) { 1442*2191Smckusic NEWZ(tcp, tl); 1443*2191Smckusic continue; 1444*2191Smckusic } 1445*2191Smckusic NEW(tcp, tl); 14462080Smckusick continue; 14472080Smckusick case O_DATE: 14482080Smckusick pc.cp++; 14492080Smckusick DATE(popaddr()); 14502080Smckusick continue; 14512080Smckusick case O_TIME: 14522080Smckusick pc.cp++; 14532080Smckusick TIME(popaddr()); 14542080Smckusick continue; 14552080Smckusick case O_UNDEF: 14562080Smckusick pc.cp++; 14572080Smckusick pop8(); 14582080Smckusick push2(0); 14592080Smckusick continue; 14602080Smckusick case O_ATAN: 14612080Smckusick pc.cp++; 14622080Smckusick push8(atan(pop8())); 14632080Smckusick continue; 14642080Smckusick case O_COS: 14652080Smckusick pc.cp++; 14662080Smckusick push8(cos(pop8())); 14672080Smckusick continue; 14682080Smckusick case O_EXP: 14692080Smckusick pc.cp++; 14702080Smckusick push8(exp(pop8())); 14712080Smckusick continue; 14722080Smckusick case O_LN: 14732080Smckusick pc.cp++; 1474*2191Smckusic if (_runtst) { 1475*2191Smckusic push8(LN(pop8())); 1476*2191Smckusic continue; 1477*2191Smckusic } 1478*2191Smckusic push8(log(pop8())); 14792080Smckusick continue; 14802080Smckusick case O_SIN: 14812080Smckusick pc.cp++; 14822080Smckusick push8(sin(pop8())); 14832080Smckusick continue; 14842080Smckusick case O_SQRT: 14852080Smckusick pc.cp++; 1486*2191Smckusic if (_runtst) { 1487*2191Smckusic push8(SQRT(pop8())); 1488*2191Smckusic continue; 1489*2191Smckusic } 1490*2191Smckusic push8(sqrt(pop8())); 14912080Smckusick continue; 14922080Smckusick case O_CHR2: 14932080Smckusick case O_CHR4: 14942080Smckusick pc.cp++; 1495*2191Smckusic if (_runtst) { 1496*2191Smckusic push2(CHR(pop4())); 1497*2191Smckusic continue; 1498*2191Smckusic } 1499*2191Smckusic push2(pop4()); 15002080Smckusick continue; 15012080Smckusick case O_ODD2: 15022080Smckusick case O_ODD4: 15032080Smckusick pc.cp++; 15042080Smckusick push2(pop4() & 1); 15052080Smckusick continue; 15062080Smckusick case O_SUCC2: 15072109Smckusic tl = *pc.cp++; 15082109Smckusic if (tl == 0) 15092109Smckusic tl = *pc.sp++; 15102109Smckusic tl1 = pop4(); 1511*2191Smckusic if (_runtst) { 1512*2191Smckusic push2(SUCC(tl1, tl, *pc.sp++)); 1513*2191Smckusic continue; 1514*2191Smckusic } 1515*2191Smckusic push2(tl1 + 1); 1516*2191Smckusic pc.sp++; 15172080Smckusick continue; 15182080Smckusick case O_SUCC24: 15192109Smckusic tl = *pc.cp++; 15202109Smckusic if (tl == 0) 15212109Smckusic tl = *pc.sp++; 15222109Smckusic tl1 = pop4(); 1523*2191Smckusic if (_runtst) { 1524*2191Smckusic push4(SUCC(tl1, tl, *pc.sp++)); 1525*2191Smckusic continue; 1526*2191Smckusic } 1527*2191Smckusic push4(tl1 + 1); 1528*2191Smckusic pc.sp++; 15292109Smckusic continue; 15302080Smckusick case O_SUCC4: 15312109Smckusic tl = *pc.cp++; 15322109Smckusic if (tl == 0) 15332109Smckusic tl = *pc.lp++; 15342109Smckusic tl1 = pop4(); 1535*2191Smckusic if (_runtst) { 1536*2191Smckusic push4(SUCC(tl1, tl, *pc.lp++)); 1537*2191Smckusic continue; 1538*2191Smckusic } 1539*2191Smckusic push4(tl1 + 1); 1540*2191Smckusic pc.lp++; 15412080Smckusick continue; 15422080Smckusick case O_PRED2: 15432109Smckusic tl = *pc.cp++; 15442109Smckusic if (tl == 0) 15452109Smckusic tl = *pc.sp++; 15462109Smckusic tl1 = pop4(); 1547*2191Smckusic if (_runtst) { 1548*2191Smckusic push2(PRED(tl1, tl, *pc.sp++)); 1549*2191Smckusic continue; 1550*2191Smckusic } 1551*2191Smckusic push2(tl1 - 1); 1552*2191Smckusic pc.sp++; 15532080Smckusick continue; 15542080Smckusick case O_PRED24: 15552109Smckusic tl = *pc.cp++; 15562109Smckusic if (tl == 0) 15572109Smckusic tl = *pc.sp++; 15582109Smckusic tl1 = pop4(); 1559*2191Smckusic if (_runtst) { 1560*2191Smckusic push4(PRED(tl1, tl, *pc.sp++)); 1561*2191Smckusic continue; 1562*2191Smckusic } 1563*2191Smckusic push4(tl1 - 1); 1564*2191Smckusic pc.sp++; 15652109Smckusic continue; 15662080Smckusick case O_PRED4: 15672109Smckusic tl = *pc.cp++; 15682109Smckusic if (tl == 0) 15692109Smckusic tl = *pc.lp++; 15702109Smckusic tl1 = pop4(); 1571*2191Smckusic if (_runtst) { 1572*2191Smckusic push4(PRED(tl1, tl, *pc.lp++)); 1573*2191Smckusic continue; 1574*2191Smckusic } 1575*2191Smckusic push4(tl1 - 1); 1576*2191Smckusic pc.lp++; 15772080Smckusick continue; 15782080Smckusick case O_SEED: 15792080Smckusick pc.cp++; 15802080Smckusick push4(SEED(pop4())); 15812080Smckusick continue; 15822080Smckusick case O_RANDOM: 15832080Smckusick pc.cp++; 15842080Smckusick push8(RANDOM(pop8())); 15852080Smckusick continue; 15862080Smckusick case O_EXPO: 15872080Smckusick pc.cp++; 15882080Smckusick push4(EXPO(pop8())); 15892080Smckusick continue; 15902080Smckusick case O_SQR2: 15912080Smckusick case O_SQR4: 15922080Smckusick pc.cp++; 15932080Smckusick tl = pop4(); 15942080Smckusick push4(tl * tl); 15952080Smckusick continue; 15962080Smckusick case O_SQR8: 15972080Smckusick pc.cp++; 15982080Smckusick td = pop8(); 15992080Smckusick push8(td * td); 16002080Smckusick continue; 16012080Smckusick case O_ROUND: 16022080Smckusick pc.cp++; 16032080Smckusick push4(ROUND(pop8())); 16042080Smckusick continue; 16052080Smckusick case O_TRUNC: 16062080Smckusick pc.cp++; 16072080Smckusick push4(TRUNC(pop8())); 16082080Smckusick continue; 16092080Smckusick } 16102080Smckusick } 16112080Smckusick } 1612