12080Smckusick /* Copyright (c) 1979 Regents of the University of California */ 22080Smckusick 3*2231Smckusic static char sccsid[] = "@(#)interp.c 1.6 01/26/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; 222191Smckusic long _runtst = TRUE; 232191Smckusic long _nodump = FALSE; 242080Smckusick long _stlim = 500000; 252080Smckusick long _stcnt = 0; 262191Smckusic 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: 1542191Smckusic _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 */ 1612191Smckusic tl1 = pc.hdrp->framesze;/* tl1 = size of frame */ 1622191Smckusic _lino = pc.hdrp->offset; 1632191Smckusic _runtst = pc.hdrp->tests; 1642191Smckusic disableovrflo(); 1652191Smckusic if (_runtst) 1662191Smckusic enableovrflo(); 1672219Smckusic pc.cp += tl; /* skip over proc hdr info */ 1682080Smckusick stp->file = curfile; /* save active file */ 1692080Smckusick tcp = pushsp(tl1); /* tcp = new top of stack */ 1702080Smckusick blkclr(tl1, tcp); /* zero stack frame */ 1712109Smckusic tcp += tl1; /* offsets of locals are neg */ 1722109Smckusic _dp->locvars = tcp; /* set new display pointer */ 1732109Smckusic _dp->stp = stp; 1742080Smckusick stp->tos = pushsp(0); /* set top of stack pointer */ 1752080Smckusick continue; 1762080Smckusick case O_END: 1772080Smckusick PCLOSE(_dp->locvars); /* flush & close local files */ 1782080Smckusick stp = _dp->stp; 1792080Smckusick curfile = stp->file; /* restore old active file */ 1802080Smckusick *_dp = stp->odisp; /* restore old display entry */ 1812109Smckusic if (_dp == &_display.frame[1]) 1822080Smckusick return; /* exiting main proc ??? */ 1832080Smckusick _lino = stp->lino; /* restore lino, pc, dp */ 1842080Smckusick pc.cp = stp->pc.cp; 1852080Smckusick _dp = stp->dp; 1862191Smckusic _runtst = stp->entry->tests; 1872191Smckusic disableovrflo(); 1882191Smckusic if (_runtst) 1892191Smckusic enableovrflo(); 1902109Smckusic popsp(stp->entry->framesze + /* pop local vars */ 1912080Smckusick sizeof(struct stack) + /* pop stack frame */ 1922080Smckusick stp->entry->nargs); /* pop parms */ 1932080Smckusick continue; 1942080Smckusick case O_CALL: 1952080Smckusick tl = *pc.cp++; 1962080Smckusick tcp = base + *pc.lp++;/* calc new entry point */ 1972080Smckusick tcp += sizeof(short); 1982080Smckusick tcp = base + *(long *)tcp; 1992080Smckusick stp = (struct stack *)pushsp(sizeof(struct stack)); 2002080Smckusick stp->lino = _lino; /* save lino, pc, dp */ 2012080Smckusick stp->pc.cp = pc.cp; 2022080Smckusick stp->dp = _dp; 2032109Smckusic _dp = &_display.frame[tl]; /* set up new display ptr */ 2042080Smckusick pc.cp = tcp; 2052080Smckusick continue; 2062080Smckusick case O_FCALL: 2072080Smckusick tl = *pc.cp++; /* tl = number of args */ 2082080Smckusick if (tl == 0) 2092080Smckusick tl = *pc.lp++; 2102080Smckusick tfp = (struct formalrtn *)popaddr(); 2112080Smckusick stp = (struct stack *)pushsp(sizeof(struct stack)); 2122080Smckusick stp->lino = _lino; /* save lino, pc, dp */ 2132080Smckusick stp->pc.cp = pc.cp; 2142080Smckusick stp->dp = _dp; 2152080Smckusick pc.cp = tfp->entryaddr; /* calc new entry point */ 2162191Smckusic if (_runtst) { 2172191Smckusic tpc.sp = pc.sp + 1; 2182191Smckusic tl -= tpc.hdrp->nargs; 2192191Smckusic if (tl != 0) { 2202191Smckusic if (tl > 0) 2212191Smckusic tl += sizeof(int) - 1; 2222191Smckusic else 2232191Smckusic tl -= sizeof(int) - 1; 2242191Smckusic ERROR(ENARGS, tl / sizeof(int)); 2252191Smckusic } 2262080Smckusick } 2272109Smckusic _dp = &_display.frame[tfp->cbn];/* new display ptr */ 2282080Smckusick blkcpy(sizeof(struct disp) * tfp->cbn, 2292109Smckusic &_display.frame[1], &tfp->disp[tfp->cbn]); 2302080Smckusick blkcpy(sizeof(struct disp) * tfp->cbn, 2312109Smckusic &tfp->disp[0], &_display.frame[1]); 2322080Smckusick continue; 2332080Smckusick case O_FRTN: 2342080Smckusick tl = *pc.cp++; /* tl = size of return obj */ 2352080Smckusick if (tl == 0) 2362080Smckusick tl = *pc.usp++; 2372080Smckusick tcp = pushsp(0); 2382080Smckusick tfp = *(struct formalrtn **)(tcp + tl); 2392080Smckusick blkcpy(tl, tcp, tcp + sizeof(struct formalrtn *)); 2402080Smckusick popsp(sizeof(struct formalrtn *)); 2412080Smckusick blkcpy(sizeof(struct disp) * tfp->cbn, 2422109Smckusic &tfp->disp[tfp->cbn], &_display.frame[1]); 2432080Smckusick continue; 2442080Smckusick case O_FSAV: 2452080Smckusick tfp = (struct formalrtn *)popaddr(); 2462080Smckusick tfp->cbn = *pc.cp++; /* blk number of routine */ 2472080Smckusick tcp = base + *pc.lp++;/* calc new entry point */ 2482080Smckusick tcp += sizeof(short); 2492080Smckusick tfp->entryaddr = base + *(long *)tcp; 2502080Smckusick blkcpy(sizeof(struct disp) * tfp->cbn, 2512109Smckusic &_display.frame[1], &tfp->disp[0]); 2522080Smckusick pushaddr(tfp); 2532080Smckusick continue; 2542080Smckusick case O_SDUP2: 2552080Smckusick pc.cp++; 2562080Smckusick tl = pop2(); 2572080Smckusick push2(tl); 2582080Smckusick push2(tl); 2592080Smckusick continue; 2602080Smckusick case O_SDUP4: 2612080Smckusick pc.cp++; 2622080Smckusick tl = pop4(); 2632080Smckusick push4(tl); 2642080Smckusick push4(tl); 2652080Smckusick continue; 2662080Smckusick case O_TRA: 2672080Smckusick pc.cp++; 2682080Smckusick pc.cp += *pc.sp; 2692080Smckusick continue; 2702080Smckusick case O_TRA4: 2712080Smckusick pc.cp++; 2722080Smckusick pc.cp = base + *pc.lp; 2732080Smckusick continue; 2742080Smckusick case O_GOTO: 2752109Smckusic tstp = _display.frame[*pc.cp++].stp; /* ptr to 2762109Smckusic exit frame */ 2772080Smckusick pc.cp = base + *pc.lp; 2782080Smckusick stp = _dp->stp; 2792080Smckusick while (tstp != stp) { 2802109Smckusic if (_dp == &_display.frame[1]) 2812080Smckusick ERROR(EGOTO); /* exiting prog ??? */ 2822080Smckusick PCLOSE(_dp->locvars); /* close local files */ 2832080Smckusick curfile = stp->file; /* restore active file */ 2842080Smckusick *_dp = stp->odisp; /* old display entry */ 2852080Smckusick _dp = stp->dp; /* restore dp */ 2862080Smckusick stp = _dp->stp; 2872080Smckusick } 2882080Smckusick /* pop locals, stack frame, parms, and return values */ 2892080Smckusick popsp(stp->tos - pushsp(0)); 2902080Smckusick continue; 2912080Smckusick case O_LINO: 2922080Smckusick if (_dp->stp->tos != pushsp(0)) 2932080Smckusick panic(PSTKNEMP); 2942080Smckusick _lino = *pc.cp++; /* set line number */ 2952080Smckusick if (_lino == 0) 2962080Smckusick _lino = *pc.sp++; 2972080Smckusick LINO(); /* inc statement count */ 2982080Smckusick continue; 2992080Smckusick case O_PUSH: 3002080Smckusick tl = *pc.cp++; 3012080Smckusick if (tl == 0) 3022080Smckusick tl = *pc.usp++; 3032080Smckusick tl = (-tl + 1) & ~1; 3042080Smckusick tcp = pushsp(tl); 3052080Smckusick blkclr(tl, tcp); 3062080Smckusick continue; 3072080Smckusick case O_IF: 3082080Smckusick pc.cp++; 3092191Smckusic if (pop2()) { 3102080Smckusick pc.sp++; 3112191Smckusic continue; 3122191Smckusic } 3132191Smckusic pc.cp += *pc.sp; 3142080Smckusick continue; 3152080Smckusick case O_REL2: 3162080Smckusick tl = pop2(); 3172080Smckusick tl1 = pop2(); 3182080Smckusick goto cmplong; 3192080Smckusick case O_REL24: 3202080Smckusick tl = pop2(); 3212080Smckusick tl1 = pop4(); 3222080Smckusick goto cmplong; 3232080Smckusick case O_REL42: 3242080Smckusick tl = pop4(); 3252080Smckusick tl1 = pop2(); 3262080Smckusick goto cmplong; 3272080Smckusick case O_REL4: 3282080Smckusick tl = pop4(); 3292080Smckusick tl1 = pop4(); 3302080Smckusick cmplong: 3312080Smckusick tl2 = *pc.cp++; 3322080Smckusick switch (tl2) { 3332080Smckusick case releq: 3342080Smckusick push2(tl1 == tl); 3352080Smckusick continue; 3362080Smckusick case relne: 3372080Smckusick push2(tl1 != tl); 3382080Smckusick continue; 3392080Smckusick case rellt: 3402080Smckusick push2(tl1 < tl); 3412080Smckusick continue; 3422080Smckusick case relgt: 3432080Smckusick push2(tl1 > tl); 3442080Smckusick continue; 3452080Smckusick case relle: 3462080Smckusick push2(tl1 <= tl); 3472080Smckusick continue; 3482080Smckusick case relge: 3492080Smckusick push2(tl1 >= tl); 3502080Smckusick continue; 3512080Smckusick default: 3522080Smckusick panic(PSYSTEM); 3532080Smckusick continue; 3542080Smckusick } 3552080Smckusick case O_RELG: 3562080Smckusick tl2 = *pc.cp++; /* tc has jump opcode */ 3572080Smckusick tl = *pc.usp++; /* tl has comparison length */ 3582080Smckusick tl1 = (tl + 1) & ~1; /* tl1 has arg stack length */ 3592080Smckusick tcp = pushsp(0); /* tcp pts to first arg */ 3602080Smckusick switch (tl2) { 3612080Smckusick case releq: 3622080Smckusick tl = RELEQ(tl, tcp + tl1, tcp); 3632080Smckusick break; 3642080Smckusick case relne: 3652080Smckusick tl = RELNE(tl, tcp + tl1, tcp); 3662080Smckusick break; 3672080Smckusick case rellt: 3682080Smckusick tl = RELSLT(tl, tcp + tl1, tcp); 3692080Smckusick break; 3702080Smckusick case relgt: 3712080Smckusick tl = RELSGT(tl, tcp + tl1, tcp); 3722080Smckusick break; 3732080Smckusick case relle: 3742080Smckusick tl = RELSLE(tl, tcp + tl1, tcp); 3752080Smckusick break; 3762080Smckusick case relge: 3772080Smckusick tl = RELSGE(tl, tcp + tl1, tcp); 3782080Smckusick break; 3792080Smckusick default: 3802080Smckusick panic(PSYSTEM); 3812080Smckusick break; 3822080Smckusick } 3832080Smckusick popsp(tl1 << 1); 3842080Smckusick push2(tl); 3852080Smckusick continue; 3862080Smckusick case O_RELT: 3872080Smckusick tl2 = *pc.cp++; /* tc has jump opcode */ 3882080Smckusick tl1 = *pc.usp++; /* tl1 has comparison length */ 3892080Smckusick tcp = pushsp(0); /* tcp pts to first arg */ 3902080Smckusick switch (tl2) { 3912080Smckusick case releq: 3922080Smckusick tl = RELEQ(tl1, tcp + tl1, tcp); 3932080Smckusick break; 3942080Smckusick case relne: 3952080Smckusick tl = RELNE(tl1, tcp + tl1, tcp); 3962080Smckusick break; 3972080Smckusick case rellt: 3982080Smckusick tl = RELTLT(tl1, tcp + tl1, tcp); 3992080Smckusick break; 4002080Smckusick case relgt: 4012080Smckusick tl = RELTGT(tl1, tcp + tl1, tcp); 4022080Smckusick break; 4032080Smckusick case relle: 4042080Smckusick tl = RELTLE(tl1, tcp + tl1, tcp); 4052080Smckusick break; 4062080Smckusick case relge: 4072080Smckusick tl = RELTGE(tl1, tcp + tl1, tcp); 4082080Smckusick break; 4092080Smckusick default: 4102080Smckusick panic(PSYSTEM); 4112080Smckusick break; 4122080Smckusick } 4132080Smckusick popsp(tl1 << 1); 4142080Smckusick push2(tl); 4152080Smckusick continue; 4162080Smckusick case O_REL28: 4172080Smckusick td = pop2(); 4182080Smckusick td1 = pop8(); 4192080Smckusick goto cmpdbl; 4202080Smckusick case O_REL48: 4212080Smckusick td = pop4(); 4222080Smckusick td1 = pop8(); 4232080Smckusick goto cmpdbl; 4242080Smckusick case O_REL82: 4252080Smckusick td = pop8(); 4262080Smckusick td1 = pop2(); 4272080Smckusick goto cmpdbl; 4282080Smckusick case O_REL84: 4292080Smckusick td = pop8(); 4302080Smckusick td1 = pop4(); 4312080Smckusick goto cmpdbl; 4322080Smckusick case O_REL8: 4332080Smckusick td = pop8(); 4342080Smckusick td1 = pop8(); 4352080Smckusick cmpdbl: 4362080Smckusick switch (*pc.cp++) { 4372080Smckusick case releq: 4382080Smckusick push2(td1 == td); 4392080Smckusick continue; 4402080Smckusick case relne: 4412080Smckusick push2(td1 != td); 4422080Smckusick continue; 4432080Smckusick case rellt: 4442080Smckusick push2(td1 < td); 4452080Smckusick continue; 4462080Smckusick case relgt: 4472080Smckusick push2(td1 > td); 4482080Smckusick continue; 4492080Smckusick case relle: 4502080Smckusick push2(td1 <= td); 4512080Smckusick continue; 4522080Smckusick case relge: 4532080Smckusick push2(td1 >= td); 4542080Smckusick continue; 4552080Smckusick default: 4562080Smckusick panic(PSYSTEM); 4572080Smckusick continue; 4582080Smckusick } 4592080Smckusick case O_AND: 4602080Smckusick pc.cp++; 4612080Smckusick push2(pop2() & pop2()); 4622080Smckusick continue; 4632080Smckusick case O_OR: 4642080Smckusick pc.cp++; 4652080Smckusick push2(pop2() | pop2()); 4662080Smckusick continue; 4672080Smckusick case O_NOT: 4682080Smckusick pc.cp++; 4692080Smckusick push2(pop2() ^ 1); 4702080Smckusick continue; 4712080Smckusick case O_AS2: 4722080Smckusick pc.cp++; 4732080Smckusick tl = pop2(); 4742080Smckusick *(short *)popaddr() = tl; 4752080Smckusick continue; 4762080Smckusick case O_AS4: 4772080Smckusick pc.cp++; 4782080Smckusick tl = pop4(); 4792080Smckusick *(long *)popaddr() = tl; 4802080Smckusick continue; 4812080Smckusick case O_AS24: 4822080Smckusick pc.cp++; 4832080Smckusick tl = pop2(); 4842080Smckusick *(long *)popaddr() = tl; 4852080Smckusick continue; 4862080Smckusick case O_AS42: 4872080Smckusick pc.cp++; 4882080Smckusick tl = pop4(); 4892080Smckusick *(short *)popaddr() = tl; 4902080Smckusick continue; 4912080Smckusick case O_AS21: 4922080Smckusick pc.cp++; 4932080Smckusick tl = pop2(); 4942080Smckusick *popaddr() = tl; 4952080Smckusick continue; 4962080Smckusick case O_AS41: 4972080Smckusick pc.cp++; 4982080Smckusick tl = pop4(); 4992080Smckusick *popaddr() = tl; 5002080Smckusick continue; 5012080Smckusick case O_AS28: 5022080Smckusick pc.cp++; 5032080Smckusick tl = pop2(); 5042080Smckusick *(double *)popaddr() = tl; 5052080Smckusick continue; 5062080Smckusick case O_AS48: 5072080Smckusick pc.cp++; 5082080Smckusick tl = pop4(); 5092080Smckusick *(double *)popaddr() = tl; 5102080Smckusick continue; 5112080Smckusick case O_AS8: 5122080Smckusick pc.cp++; 5132080Smckusick td = pop8(); 5142080Smckusick *(double *)popaddr() = td; 5152080Smckusick continue; 5162080Smckusick case O_AS: 5172080Smckusick tl = *pc.cp++; 5182080Smckusick if (tl == 0) 5192080Smckusick tl = *pc.usp++; 5202080Smckusick tl1 = (tl + 1) & ~1; 5212080Smckusick tcp = pushsp(0); 5222080Smckusick blkcpy(tl, tcp, *(char **)(tcp + tl1)); 5232080Smckusick popsp(tl1 + sizeof(char *)); 5242080Smckusick continue; 5252080Smckusick case O_INX2P2: 5262080Smckusick tl = *pc.cp++; /* tl has shift amount */ 5272080Smckusick tl1 = (pop2() - *pc.sp++) << tl; 5282080Smckusick pushaddr(popaddr() + tl1); 5292080Smckusick continue; 5302080Smckusick case O_INX4P2: 5312080Smckusick tl = *pc.cp++; /* tl has shift amount */ 5322080Smckusick tl1 = (pop4() - *pc.sp++) << tl; 5332080Smckusick pushaddr(popaddr() + tl1); 5342080Smckusick continue; 5352080Smckusick case O_INX2: 5362080Smckusick tl = *pc.cp++; /* tl has element size */ 5372080Smckusick if (tl == 0) 5382080Smckusick tl = *pc.usp++; 5392080Smckusick tl1 = pop2(); /* index */ 5402080Smckusick tl2 = *pc.sp++; 5412080Smckusick pushaddr(popaddr() + (tl1 - tl2) * tl); 5422191Smckusic tl = *pc.usp++; 5432191Smckusic if (_runtst) 5442191Smckusic SUBSC(tl1, tl2, tl); /* range check */ 5452080Smckusick continue; 5462080Smckusick case O_INX4: 5472080Smckusick tl = *pc.cp++; /* tl has element size */ 5482080Smckusick if (tl == 0) 5492080Smckusick tl = *pc.usp++; 5502080Smckusick tl1 = pop4(); /* index */ 5512080Smckusick tl2 = *pc.sp++; 5522080Smckusick pushaddr(popaddr() + (tl1 - tl2) * tl); 5532191Smckusic tl = *pc.usp++; 5542191Smckusic if (_runtst) 5552191Smckusic SUBSC(tl1, tl2, tl); /* range check */ 5562080Smckusick continue; 5572080Smckusick case O_OFF: 5582080Smckusick tl = *pc.cp++; 5592080Smckusick if (tl == 0) 5602080Smckusick tl = *pc.usp++; 5612080Smckusick push4(pop4() + tl); 5622080Smckusick continue; 5632080Smckusick case O_NIL: 5642080Smckusick pc.cp++; 5652080Smckusick NIL(); 5662080Smckusick continue; 5672080Smckusick case O_ADD2: 5682080Smckusick pc.cp++; 5692080Smckusick push4(pop2() + pop2()); 5702080Smckusick continue; 5712080Smckusick case O_ADD4: 5722080Smckusick pc.cp++; 5732080Smckusick push4(pop4() + pop4()); 5742080Smckusick continue; 5752080Smckusick case O_ADD24: 5762080Smckusick pc.cp++; 5772080Smckusick tl = pop2(); 5782080Smckusick push4(pop4() + tl); 5792080Smckusick continue; 5802080Smckusick case O_ADD42: 5812080Smckusick pc.cp++; 5822080Smckusick tl = pop4(); 5832080Smckusick push4(pop2() + tl); 5842080Smckusick continue; 5852080Smckusick case O_ADD28: 5862080Smckusick pc.cp++; 5872080Smckusick tl = pop2(); 5882080Smckusick push8(pop8() + tl); 5892080Smckusick continue; 5902080Smckusick case O_ADD48: 5912080Smckusick pc.cp++; 5922080Smckusick tl = pop4(); 5932080Smckusick push8(pop8() + tl); 5942080Smckusick continue; 5952080Smckusick case O_ADD82: 5962080Smckusick pc.cp++; 5972080Smckusick td = pop8(); 5982080Smckusick push8(pop2() + td); 5992080Smckusick continue; 6002080Smckusick case O_ADD84: 6012080Smckusick pc.cp++; 6022080Smckusick td = pop8(); 6032080Smckusick push8(pop4() + td); 6042080Smckusick continue; 6052080Smckusick case O_SUB2: 6062080Smckusick pc.cp++; 6072080Smckusick tl = pop2(); 6082080Smckusick push4(pop2() - tl); 6092080Smckusick continue; 6102080Smckusick case O_SUB4: 6112080Smckusick pc.cp++; 6122080Smckusick tl = pop4(); 6132080Smckusick push4(pop4() - tl); 6142080Smckusick continue; 6152080Smckusick case O_SUB24: 6162080Smckusick pc.cp++; 6172080Smckusick tl = pop2(); 6182080Smckusick push4(pop4() - tl); 6192080Smckusick continue; 6202080Smckusick case O_SUB42: 6212080Smckusick pc.cp++; 6222080Smckusick tl = pop4(); 6232080Smckusick push4(pop2() - tl); 6242080Smckusick continue; 6252080Smckusick case O_SUB28: 6262080Smckusick pc.cp++; 6272080Smckusick tl = pop2(); 6282080Smckusick push8(pop8() - tl); 6292080Smckusick continue; 6302080Smckusick case O_SUB48: 6312080Smckusick pc.cp++; 6322080Smckusick tl = pop4(); 6332080Smckusick push8(pop8() - tl); 6342080Smckusick continue; 6352080Smckusick case O_SUB82: 6362080Smckusick pc.cp++; 6372080Smckusick td = pop8(); 6382080Smckusick push8(pop2() - td); 6392080Smckusick continue; 6402080Smckusick case O_SUB84: 6412080Smckusick pc.cp++; 6422080Smckusick td = pop8(); 6432080Smckusick push8(pop4() - td); 6442080Smckusick continue; 6452080Smckusick case O_MUL2: 6462080Smckusick pc.cp++; 6472080Smckusick push4(pop2() * pop2()); 6482080Smckusick continue; 6492080Smckusick case O_MUL4: 6502080Smckusick pc.cp++; 6512080Smckusick push4(pop4() * pop4()); 6522080Smckusick continue; 6532080Smckusick case O_MUL24: 6542080Smckusick pc.cp++; 6552080Smckusick tl = pop2(); 6562080Smckusick push4(pop4() * tl); 6572080Smckusick continue; 6582080Smckusick case O_MUL42: 6592080Smckusick pc.cp++; 6602080Smckusick tl = pop4(); 6612080Smckusick push4(pop2() * tl); 6622080Smckusick continue; 6632080Smckusick case O_MUL28: 6642080Smckusick pc.cp++; 6652080Smckusick tl = pop2(); 6662080Smckusick push8(pop8() * tl); 6672080Smckusick continue; 6682080Smckusick case O_MUL48: 6692080Smckusick pc.cp++; 6702080Smckusick tl = pop4(); 6712080Smckusick push8(pop8() * tl); 6722080Smckusick continue; 6732080Smckusick case O_MUL82: 6742080Smckusick pc.cp++; 6752080Smckusick td = pop8(); 6762080Smckusick push8(pop2() * td); 6772080Smckusick continue; 6782080Smckusick case O_MUL84: 6792080Smckusick pc.cp++; 6802080Smckusick td = pop8(); 6812080Smckusick push8(pop4() * td); 6822080Smckusick continue; 6832080Smckusick case O_ABS2: 6842080Smckusick case O_ABS4: 6852080Smckusick pc.cp++; 6862080Smckusick tl = pop4(); 6872080Smckusick push4(tl >= 0 ? tl : -tl); 6882080Smckusick continue; 6892080Smckusick case O_ABS8: 6902080Smckusick pc.cp++; 6912080Smckusick td = pop8(); 6922080Smckusick push8(td >= 0.0 ? td : -td); 6932080Smckusick continue; 6942080Smckusick case O_NEG2: 6952080Smckusick pc.cp++; 6962080Smckusick push4(-pop2()); 6972080Smckusick continue; 6982080Smckusick case O_NEG4: 6992080Smckusick pc.cp++; 7002080Smckusick push4(-pop4()); 7012080Smckusick continue; 7022080Smckusick case O_NEG8: 7032080Smckusick pc.cp++; 7042080Smckusick push8(-pop8()); 7052080Smckusick continue; 7062080Smckusick case O_DIV2: 7072080Smckusick pc.cp++; 7082080Smckusick tl = pop2(); 7092080Smckusick push4(pop2() / tl); 7102080Smckusick continue; 7112080Smckusick case O_DIV4: 7122080Smckusick pc.cp++; 7132080Smckusick tl = pop4(); 7142080Smckusick push4(pop4() / tl); 7152080Smckusick continue; 7162080Smckusick case O_DIV24: 7172080Smckusick pc.cp++; 7182080Smckusick tl = pop2(); 7192080Smckusick push4(pop4() / tl); 7202080Smckusick continue; 7212080Smckusick case O_DIV42: 7222080Smckusick pc.cp++; 7232080Smckusick tl = pop4(); 7242080Smckusick push4(pop2() / tl); 7252080Smckusick continue; 7262080Smckusick case O_MOD2: 7272080Smckusick pc.cp++; 7282080Smckusick tl = pop2(); 7292080Smckusick push4(pop2() % tl); 7302080Smckusick continue; 7312080Smckusick case O_MOD4: 7322080Smckusick pc.cp++; 7332080Smckusick tl = pop4(); 7342080Smckusick push4(pop4() % tl); 7352080Smckusick continue; 7362080Smckusick case O_MOD24: 7372080Smckusick pc.cp++; 7382080Smckusick tl = pop2(); 7392080Smckusick push4(pop4() % tl); 7402080Smckusick continue; 7412080Smckusick case O_MOD42: 7422080Smckusick pc.cp++; 7432080Smckusick tl = pop4(); 7442080Smckusick push4(pop2() % tl); 7452080Smckusick continue; 7462080Smckusick case O_ADD8: 7472080Smckusick pc.cp++; 7482080Smckusick push8(pop8() + pop8()); 7492080Smckusick continue; 7502080Smckusick case O_SUB8: 7512080Smckusick pc.cp++; 7522080Smckusick td = pop8(); 7532080Smckusick push8(pop8() - td); 7542080Smckusick continue; 7552080Smckusick case O_MUL8: 7562080Smckusick pc.cp++; 7572080Smckusick push8(pop8() * pop8()); 7582080Smckusick continue; 7592080Smckusick case O_DVD8: 7602080Smckusick pc.cp++; 7612080Smckusick td = pop8(); 7622080Smckusick push8(pop8() / td); 7632080Smckusick continue; 7642080Smckusick case O_STOI: 7652080Smckusick pc.cp++; 7662080Smckusick push4(pop2()); 7672080Smckusick continue; 7682080Smckusick case O_STOD: 7692080Smckusick pc.cp++; 7702080Smckusick td = pop2(); 7712080Smckusick push8(td); 7722080Smckusick continue; 7732080Smckusick case O_ITOD: 7742080Smckusick pc.cp++; 7752080Smckusick td = pop4(); 7762080Smckusick push8(td); 7772080Smckusick continue; 7782080Smckusick case O_ITOS: 7792080Smckusick pc.cp++; 7802080Smckusick push2(pop4()); 7812080Smckusick continue; 7822080Smckusick case O_DVD2: 7832080Smckusick pc.cp++; 7842080Smckusick td = pop2(); 7852080Smckusick push8(pop2() / td); 7862080Smckusick continue; 7872080Smckusick case O_DVD4: 7882080Smckusick pc.cp++; 7892080Smckusick td = pop4(); 7902080Smckusick push8(pop4() / td); 7912080Smckusick continue; 7922080Smckusick case O_DVD24: 7932080Smckusick pc.cp++; 7942080Smckusick td = pop2(); 7952080Smckusick push8(pop4() / td); 7962080Smckusick continue; 7972080Smckusick case O_DVD42: 7982080Smckusick pc.cp++; 7992080Smckusick td = pop4(); 8002080Smckusick push8(pop2() / td); 8012080Smckusick continue; 8022080Smckusick case O_DVD28: 8032080Smckusick pc.cp++; 8042080Smckusick td = pop2(); 8052080Smckusick push8(pop8() / td); 8062080Smckusick continue; 8072080Smckusick case O_DVD48: 8082080Smckusick pc.cp++; 8092080Smckusick td = pop4(); 8102080Smckusick push8(pop8() / td); 8112080Smckusick continue; 8122080Smckusick case O_DVD82: 8132080Smckusick pc.cp++; 8142080Smckusick td = pop8(); 8152080Smckusick push8(pop2() / td); 8162080Smckusick continue; 8172080Smckusick case O_DVD84: 8182080Smckusick pc.cp++; 8192080Smckusick td = pop8(); 8202080Smckusick push8(pop4() / td); 8212080Smckusick continue; 8222080Smckusick case O_RV1: 8232109Smckusic tcp = _display.raw[*pc.ucp++]; 8242080Smckusick push2(*(tcp + *pc.sp++)); 8252080Smckusick continue; 8262080Smckusick case O_RV14: 8272109Smckusic tcp = _display.raw[*pc.ucp++]; 8282080Smckusick push4(*(tcp + *pc.sp++)); 8292080Smckusick continue; 8302080Smckusick case O_RV2: 8312109Smckusic tcp = _display.raw[*pc.ucp++]; 8322080Smckusick push2(*(short *)(tcp + *pc.sp++)); 8332080Smckusick continue; 8342080Smckusick case O_RV24: 8352109Smckusic tcp = _display.raw[*pc.ucp++]; 8362080Smckusick push4(*(short *)(tcp + *pc.sp++)); 8372080Smckusick continue; 8382080Smckusick case O_RV4: 8392109Smckusic tcp = _display.raw[*pc.ucp++]; 8402080Smckusick push4(*(long *)(tcp + *pc.sp++)); 8412080Smckusick continue; 8422080Smckusick case O_RV8: 8432109Smckusic tcp = _display.raw[*pc.ucp++]; 8442080Smckusick push8(*(double *)(tcp + *pc.sp++)); 8452080Smckusick continue; 8462080Smckusick case O_RV: 8472109Smckusic tcp = _display.raw[*pc.ucp++]; 8482080Smckusick tcp += *pc.sp++; 8492080Smckusick tl = *pc.usp++; 8502080Smckusick tcp1 = pushsp(tl); 8512080Smckusick blkcpy(tl, tcp, tcp1); 8522080Smckusick continue; 8532080Smckusick case O_LV: 8542109Smckusic tcp = _display.raw[*pc.ucp++]; 8552080Smckusick pushaddr(tcp + *pc.sp++); 8562080Smckusick continue; 8572080Smckusick case O_LRV1: 8582109Smckusic tcp = _display.raw[*pc.ucp++]; 8592080Smckusick push2(*(tcp + *pc.lp++)); 8602080Smckusick continue; 8612080Smckusick case O_LRV14: 8622109Smckusic tcp = _display.raw[*pc.ucp++]; 8632080Smckusick push4(*(tcp + *pc.lp++)); 8642080Smckusick continue; 8652080Smckusick case O_LRV2: 8662109Smckusic tcp = _display.raw[*pc.ucp++]; 8672080Smckusick push2(*(short *)(tcp + *pc.lp++)); 8682080Smckusick continue; 8692080Smckusick case O_LRV24: 8702109Smckusic tcp = _display.raw[*pc.ucp++]; 8712080Smckusick push4(*(short *)(tcp + *pc.lp++)); 8722080Smckusick continue; 8732080Smckusick case O_LRV4: 8742109Smckusic tcp = _display.raw[*pc.ucp++]; 8752080Smckusick push4(*(long *)(tcp + *pc.lp++)); 8762080Smckusick continue; 8772080Smckusick case O_LRV8: 8782109Smckusic tcp = _display.raw[*pc.ucp++]; 8792080Smckusick push8(*(double *)(tcp + *pc.lp++)); 8802080Smckusick continue; 8812080Smckusick case O_LRV: 8822109Smckusic tcp = _display.raw[*pc.ucp++]; 8832080Smckusick tcp += *pc.lp++; 8842080Smckusick tl = *pc.usp++; 8852080Smckusick tcp1 = pushsp(tl); 8862080Smckusick blkcpy(tl, tcp, tcp1); 8872080Smckusick continue; 8882080Smckusick case O_LLV: 8892109Smckusic tcp = _display.raw[*pc.ucp++]; 8902080Smckusick pushaddr(tcp + *pc.lp++); 8912080Smckusick continue; 8922080Smckusick case O_IND1: 8932080Smckusick pc.cp++; 8942080Smckusick push2(*popaddr()); 8952080Smckusick continue; 8962080Smckusick case O_IND14: 8972080Smckusick pc.cp++; 8982080Smckusick push4(*popaddr()); 8992080Smckusick continue; 9002080Smckusick case O_IND2: 9012080Smckusick pc.cp++; 9022080Smckusick push2(*(short *)(popaddr())); 9032080Smckusick continue; 9042080Smckusick case O_IND24: 9052080Smckusick pc.cp++; 9062080Smckusick push4(*(short *)(popaddr())); 9072080Smckusick continue; 9082080Smckusick case O_IND4: 9092080Smckusick pc.cp++; 9102080Smckusick push4(*(long *)(popaddr())); 9112080Smckusick continue; 9122080Smckusick case O_IND8: 9132080Smckusick pc.cp++; 9142080Smckusick push8(*(double *)(popaddr())); 9152080Smckusick continue; 9162080Smckusick case O_IND: 9172080Smckusick tl = *pc.cp++; 9182080Smckusick if (tl == 0) 9192080Smckusick tl = *pc.usp++; 9202080Smckusick tcp = popaddr(); 9212080Smckusick tcp1 = pushsp((tl + 1) & ~1); 9222080Smckusick blkcpy(tl, tcp, tcp1); 9232080Smckusick continue; 9242080Smckusick case O_CON1: 9252080Smckusick push2(*pc.cp++); 9262080Smckusick continue; 9272080Smckusick case O_CON14: 9282080Smckusick push4(*pc.cp++); 9292080Smckusick continue; 9302080Smckusick case O_CON2: 9312080Smckusick pc.cp++; 9322080Smckusick push2(*pc.sp++); 9332080Smckusick continue; 9342080Smckusick case O_CON24: 9352080Smckusick pc.cp++; 9362080Smckusick push4(*pc.sp++); 9372080Smckusick continue; 9382080Smckusick case O_CON4: 9392080Smckusick pc.cp++; 9402080Smckusick push4(*pc.lp++); 9412080Smckusick continue; 9422080Smckusick case O_CON8: 9432080Smckusick pc.cp++; 9442080Smckusick push8(*pc.dp++); 9452080Smckusick continue; 9462080Smckusick case O_CON: 9472080Smckusick tl = *pc.cp++; 9482080Smckusick if (tl == 0) 9492080Smckusick tl = *pc.usp++; 9502080Smckusick tl = (tl + 1) & ~1; 9512080Smckusick tcp = pushsp(tl); 9522080Smckusick blkcpy(tl, pc.cp, tcp); 9532080Smckusick pc.cp += tl; 9542080Smckusick continue; 9552080Smckusick case O_LVCON: 9562080Smckusick tl = *pc.cp++; 9572080Smckusick if (tl == 0) 9582080Smckusick tl = *pc.usp++; 9592080Smckusick tl = (tl + 1) & ~1; 9602080Smckusick pushaddr(pc.cp); 9612080Smckusick pc.cp += tl; 9622080Smckusick continue; 9632080Smckusick case O_RANG2: 9642080Smckusick tl = *pc.cp++; 9652080Smckusick if (tl == 0) 9662080Smckusick tl = *pc.sp++; 9672080Smckusick tl1 = pop2(); 9682080Smckusick push2(RANG4(tl1, tl, *pc.sp++)); 9692080Smckusick continue; 9702080Smckusick case O_RANG42: 9712080Smckusick tl = *pc.cp++; 9722080Smckusick if (tl == 0) 9732080Smckusick tl = *pc.sp++; 9742080Smckusick tl1 = pop4(); 9752080Smckusick push4(RANG4(tl1, tl, *pc.sp++)); 9762080Smckusick continue; 9772080Smckusick case O_RSNG2: 9782080Smckusick tl = *pc.cp++; 9792080Smckusick if (tl == 0) 9802080Smckusick tl = *pc.sp++; 9812080Smckusick tl1 = pop2(); 9822080Smckusick push2(RSNG4(tl1, tl)); 9832080Smckusick continue; 9842080Smckusick case O_RSNG42: 9852080Smckusick tl = *pc.cp++; 9862080Smckusick if (tl == 0) 9872080Smckusick tl = *pc.sp++; 9882080Smckusick tl1 = pop4(); 9892080Smckusick push4(RSNG4(tl1, tl)); 9902080Smckusick continue; 9912080Smckusick case O_RANG4: 9922080Smckusick pc.cp++; 9932080Smckusick tl = *pc.lp++; 9942080Smckusick tl1 = pop4(); 9952080Smckusick push4(RANG4(tl1, tl, *pc.lp++)); 9962080Smckusick continue; 9972080Smckusick case O_RANG24: 9982080Smckusick pc.cp++; 9992080Smckusick tl = *pc.lp++; 10002080Smckusick tl1 = pop2(); 10012080Smckusick push2(RANG4(tl1, tl, *pc.lp++)); 10022080Smckusick continue; 10032080Smckusick case O_RSNG4: 10042080Smckusick pc.cp++; 10052080Smckusick tl = pop4(); 10062080Smckusick push4(RSNG4(tl, *pc.lp++)); 10072080Smckusick continue; 10082080Smckusick case O_RSNG24: 10092080Smckusick pc.cp++; 10102080Smckusick tl = pop2(); 10112080Smckusick push2(RSNG4(tl, *pc.lp++)); 10122080Smckusick continue; 10132080Smckusick case O_STLIM: 10142080Smckusick pc.cp++; 10152121Smckusic STLIM(); 10162121Smckusic popargs(1); 10172080Smckusick continue; 10182080Smckusick case O_LLIMIT: 10192080Smckusick pc.cp++; 10202080Smckusick LLIMIT(); 10212080Smckusick popargs(2); 10222080Smckusick continue; 10232080Smckusick case O_BUFF: 10242080Smckusick BUFF(*pc.cp++); 10252080Smckusick continue; 10262080Smckusick case O_HALT: 10272080Smckusick pc.cp++; 10282080Smckusick panic(PHALT); 10292080Smckusick continue; 10302080Smckusick case O_PXPBUF: 10312080Smckusick pc.cp++; 10322080Smckusick _cntrs = *pc.lp++; 10332080Smckusick _rtns = *pc.lp++; 10342080Smckusick _pcpcount = (long *)calloc(_cntrs + 1, sizeof(long)); 10352080Smckusick continue; 10362080Smckusick case O_COUNT: 10372080Smckusick pc.cp++; 10382080Smckusick _pcpcount[*pc.usp++]++; 10392080Smckusick continue; 10402080Smckusick case O_CASE1OP: 10412080Smckusick tl = *pc.cp++; /* tl = number of cases */ 10422080Smckusick if (tl == 0) 10432080Smckusick tl = *pc.usp++; 10442080Smckusick tsp = pc.sp + tl; /* ptr to end of jump table */ 10452080Smckusick tcp = (char *)tsp; /* tcp = ptr to case values */ 10462080Smckusick tl1 = pop2(); /* tl1 = element to find */ 10472080Smckusick for(; tl > 0; tl--) /* look for element */ 10482080Smckusick if (tl1 == *tcp++) 10492080Smckusick break; 10502080Smckusick if (tl == 0) /* default case => error */ 1051*2231Smckusic ERROR(ECASE, tl1); 10522080Smckusick pc.cp += *(tsp - tl); 10532080Smckusick continue; 10542080Smckusick case O_CASE2OP: 10552080Smckusick tl = *pc.cp++; /* tl = number of cases */ 10562080Smckusick if (tl == 0) 10572080Smckusick tl = *pc.usp++; 10582080Smckusick tsp = pc.sp + tl; /* ptr to end of jump table */ 10592080Smckusick tsp1 = tsp; /* tsp1 = ptr to case values */ 10602080Smckusick tl1 = (unsigned short)pop2();/* tl1 = element to find */ 10612080Smckusick for(; tl > 0; tl--) /* look for element */ 10622080Smckusick if (tl1 == *tsp1++) 10632080Smckusick break; 10642080Smckusick if (tl == 0) /* default case => error */ 1065*2231Smckusic ERROR(ECASE, tl1); 10662080Smckusick pc.cp += *(tsp - tl); 10672080Smckusick continue; 10682080Smckusick case O_CASE4OP: 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 tlp = (long *)tsp; /* tlp = ptr to case values */ 10742080Smckusick tl1 = pop4(); /* tl1 = element to find */ 10752080Smckusick for(; tl > 0; tl--) /* look for element */ 10762080Smckusick if (tl1 == *tlp++) 10772080Smckusick break; 10782080Smckusick if (tl == 0) /* default case => error */ 1079*2231Smckusic ERROR(ECASE, tl1); 10802080Smckusick pc.cp += *(tsp - tl); 10812080Smckusick continue; 10822080Smckusick case O_ADDT: 10832080Smckusick tl = *pc.cp++; /* tl has comparison length */ 10842080Smckusick if (tl == 0) 10852080Smckusick tl = *pc.usp++; 10862080Smckusick tcp = pushsp(0); /* tcp pts to first arg */ 10872080Smckusick ADDT(tcp + tl, tcp + tl, tcp, tl >> 2); 10882080Smckusick popsp(tl); 10892080Smckusick continue; 10902080Smckusick case O_SUBT: 10912080Smckusick tl = *pc.cp++; /* tl has comparison length */ 10922080Smckusick if (tl == 0) 10932080Smckusick tl = *pc.usp++; 10942080Smckusick tcp = pushsp(0); /* tcp pts to first arg */ 10952080Smckusick SUBT(tcp + tl, tcp + tl, tcp, tl >> 2); 10962080Smckusick popsp(tl); 10972080Smckusick continue; 10982080Smckusick case O_MULT: 10992080Smckusick tl = *pc.cp++; /* tl has comparison length */ 11002080Smckusick if (tl == 0) 11012080Smckusick tl = *pc.usp++; 11022080Smckusick tcp = pushsp(0); /* tcp pts to first arg */ 11032080Smckusick MULT(tcp + tl, tcp + tl, tcp, tl >> 2); 11042080Smckusick popsp(tl); 11052080Smckusick continue; 11062080Smckusick case O_INCT: 11072080Smckusick tl = *pc.cp++; /* tl has number of args */ 11082080Smckusick if (tl == 0) 11092080Smckusick tl = *pc.usp++; 11102080Smckusick tl1 = INCT(); 11112080Smckusick popargs(tl); 11122080Smckusick push2(tl1); 11132080Smckusick continue; 11142080Smckusick case O_CTTOT: 11152080Smckusick tl = *pc.cp++; /* tl has number of args */ 11162080Smckusick if (tl == 0) 11172080Smckusick tl = *pc.usp++; 11182080Smckusick tl1 = tl * sizeof(long); 11192080Smckusick tcp = pushsp(0) + tl1; /* tcp pts to result space */ 11202080Smckusick CTTOT(tcp); 11212080Smckusick popargs(tl); 11222080Smckusick continue; 11232080Smckusick case O_CARD: 11242080Smckusick tl = *pc.cp++; /* tl has comparison length */ 11252080Smckusick if (tl == 0) 11262080Smckusick tl = *pc.usp++; 11272080Smckusick tcp = pushsp(0); /* tcp pts to set */ 11282080Smckusick tl1 = CARD(tcp, tl); 11292080Smckusick popsp(tl); 11302080Smckusick push2(tl1); 11312080Smckusick continue; 11322080Smckusick case O_IN: 11332080Smckusick tl = *pc.cp++; /* tl has comparison length */ 11342080Smckusick if (tl == 0) 11352080Smckusick tl = *pc.usp++; 11362080Smckusick tl1 = pop4(); /* tl1 is the element */ 11372080Smckusick tcp = pushsp(0); /* tcp pts to set */ 11382080Smckusick tl2 = *pc.usp++; /* lower bound */ 11392080Smckusick tl1 = IN(tl1, tl2, *pc.usp++, tcp); 11402080Smckusick popsp(tl); 11412080Smckusick push2(tl1); 11422080Smckusick continue; 11432080Smckusick case O_ASRT: 11442080Smckusick pc.cp++; 11452109Smckusic ASRT(pop2(), ""); 11462080Smckusick continue; 11472080Smckusick case O_FOR1U: 11482080Smckusick pc.cp++; 11492080Smckusick tcp = (char *)pop4(); /* tcp = ptr to index var */ 11502080Smckusick if (*tcp < pop4()) { /* still going up */ 11512191Smckusic tl = *tcp + 1; /* inc index var */ 11522191Smckusic tl1 = *pc.sp++; /* index lower bound */ 11532191Smckusic tl2 = *pc.sp++; /* index upper bound */ 11542191Smckusic if (_runtst) 11552191Smckusic RANG4(tl, tl1, tl2); 11562191Smckusic *tcp = tl; /* update index var */ 11572080Smckusick pc.cp += *pc.sp;/* return to top of loop */ 11582080Smckusick continue; 11592080Smckusick } 11602191Smckusic pc.sp += 3; /* else fall through */ 11612080Smckusick continue; 11622080Smckusick case O_FOR2U: 11632080Smckusick pc.cp++; 11642080Smckusick tsp = (short *)pop4(); /* tsp = ptr to index var */ 11652080Smckusick if (*tsp < pop4()) { /* still going up */ 11662191Smckusic tl = *tsp + 1; /* inc index var */ 11672191Smckusic tl1 = *pc.sp++; /* index lower bound */ 11682191Smckusic tl2 = *pc.sp++; /* index upper bound */ 11692191Smckusic if (_runtst) 11702191Smckusic RANG4(tl, tl1, tl2); 11712191Smckusic *tsp = tl; /* update index var */ 11722080Smckusick pc.cp += *pc.sp;/* return to top of loop */ 11732080Smckusick continue; 11742080Smckusick } 11752191Smckusic pc.sp += 3; /* else fall through */ 11762080Smckusick continue; 11772080Smckusick case O_FOR4U: 11782080Smckusick pc.cp++; 11792080Smckusick tlp = (long *)pop4(); /* tlp = ptr to index var */ 11802080Smckusick if (*tlp < pop4()) { /* still going up */ 11812191Smckusic tl = *tlp + 1; /* inc index var */ 11822191Smckusic tl1 = *pc.lp++; /* index lower bound */ 11832191Smckusic tl2 = *pc.lp++; /* index upper bound */ 11842191Smckusic if (_runtst) 11852191Smckusic RANG4(tl, tl1, tl2); 11862191Smckusic *tlp = tl; /* update index var */ 11872080Smckusick pc.cp += *pc.sp;/* return to top of loop */ 11882080Smckusick continue; 11892080Smckusick } 11902191Smckusic pc.sp += 5; /* else fall through */ 11912080Smckusick continue; 11922080Smckusick case O_FOR1D: 11932080Smckusick pc.cp++; 11942080Smckusick tcp = (char *)pop4(); /* tcp = ptr to index var */ 11952080Smckusick if (*tcp > pop4()) { /* still going down */ 11962191Smckusic tl = *tcp - 1; /* inc index var */ 11972191Smckusic tl1 = *pc.sp++; /* index lower bound */ 11982191Smckusic tl2 = *pc.sp++; /* index upper bound */ 11992191Smckusic if (_runtst) 12002191Smckusic RANG4(tl, tl1, tl2); 12012191Smckusic *tcp = tl; /* update index var */ 12022080Smckusick pc.cp += *pc.sp;/* return to top of loop */ 12032080Smckusick continue; 12042080Smckusick } 12052191Smckusic pc.sp += 3; /* else fall through */ 12062080Smckusick continue; 12072080Smckusick case O_FOR2D: 12082080Smckusick pc.cp++; 12092080Smckusick tsp = (short *)pop4(); /* tsp = ptr to index var */ 12102080Smckusick if (*tsp > pop4()) { /* still going down */ 12112191Smckusic tl = *tsp - 1; /* inc index var */ 12122191Smckusic tl1 = *pc.sp++; /* index lower bound */ 12132191Smckusic tl2 = *pc.sp++; /* index upper bound */ 12142191Smckusic if (_runtst) 12152191Smckusic RANG4(tl, tl1, tl2); 12162191Smckusic *tsp = tl; /* update index var */ 12172080Smckusick pc.cp += *pc.sp;/* return to top of loop */ 12182080Smckusick continue; 12192080Smckusick } 12202191Smckusic pc.sp += 3; /* else fall through */ 12212080Smckusick continue; 12222080Smckusick case O_FOR4D: 12232080Smckusick pc.cp++; 12242080Smckusick tlp = (long *)pop4(); /* tlp = ptr to index var */ 12252080Smckusick if (*tlp > pop4()) { /* still going down */ 12262191Smckusic tl = *tlp - 1; /* inc index var */ 12272191Smckusic tl1 = *pc.lp++; /* index lower bound */ 12282191Smckusic tl2 = *pc.lp++; /* index upper bound */ 12292191Smckusic if (_runtst) 12302191Smckusic RANG4(tl, tl1, tl2); 12312191Smckusic *tlp = tl; /* update index var */ 12322080Smckusick pc.cp += *pc.sp;/* return to top of loop */ 12332080Smckusick continue; 12342080Smckusick } 12352191Smckusic pc.sp += 5; /* else fall through */ 12362080Smckusick continue; 12372080Smckusick case O_READE: 12382080Smckusick pc.cp++; 12392080Smckusick push2(READE(curfile, base + *pc.lp++)); 12402080Smckusick continue; 12412080Smckusick case O_READ4: 12422080Smckusick pc.cp++; 12432080Smckusick push4(READ4(curfile)); 12442080Smckusick continue; 12452080Smckusick case O_READC: 12462080Smckusick pc.cp++; 12472080Smckusick push2(READC(curfile)); 12482080Smckusick continue; 12492080Smckusick case O_READ8: 12502080Smckusick pc.cp++; 12512080Smckusick push8(READ8(curfile)); 12522080Smckusick continue; 12532080Smckusick case O_READLN: 12542080Smckusick pc.cp++; 12552080Smckusick READLN(curfile); 12562080Smckusick continue; 12572080Smckusick case O_EOF: 12582080Smckusick pc.cp++; 12592080Smckusick push2(TEOF(popaddr())); 12602080Smckusick continue; 12612080Smckusick case O_EOLN: 12622080Smckusick pc.cp++; 12632080Smckusick push2(TEOLN(popaddr())); 12642080Smckusick continue; 12652080Smckusick case O_WRITEC: 12662080Smckusick pc.cp++; 12672191Smckusic if (_runtst) { 12682191Smckusic WRITEC(curfile); 12692191Smckusic popargs(2); 12702191Smckusic continue; 12712191Smckusic } 12722191Smckusic fputc(); 12732080Smckusick popargs(2); 12742080Smckusick continue; 12752080Smckusick case O_WRITES: 12762080Smckusick pc.cp++; 12772191Smckusic if (_runtst) { 12782191Smckusic WRITES(curfile); 12792191Smckusic popargs(4); 12802191Smckusic continue; 12812191Smckusic } 12822191Smckusic fwrite(); 12832080Smckusick popargs(4); 12842080Smckusick continue; 12852080Smckusick case O_WRITEF: 12862191Smckusic if (_runtst) { 12872191Smckusic WRITEF(curfile); 12882191Smckusic popargs(*pc.cp++); 12892191Smckusic continue; 12902191Smckusic } 12912191Smckusic fprintf(); 12922080Smckusick popargs(*pc.cp++); 12932080Smckusick continue; 12942080Smckusick case O_WRITLN: 12952080Smckusick pc.cp++; 12962191Smckusic if (_runtst) { 12972191Smckusic WRITLN(curfile); 12982191Smckusic continue; 12992191Smckusic } 13002191Smckusic fputc('\n', ACTFILE(curfile)); 13012080Smckusick continue; 13022080Smckusick case O_PAGE: 13032080Smckusick pc.cp++; 13042191Smckusic if (_runtst) { 13052191Smckusic PAGE(curfile); 13062191Smckusic continue; 13072191Smckusic } 13082191Smckusic fputc('^L', ACTFILE(curfile)); 13092080Smckusick continue; 13102080Smckusick case O_NAM: 13112080Smckusick pc.cp++; 13122080Smckusick tl = pop4(); 13132080Smckusick pushaddr(NAM(tl, base + *pc.lp++)); 13142080Smckusick continue; 13152080Smckusick case O_MAX: 13162080Smckusick tl = *pc.cp++; 13172080Smckusick if (tl == 0) 13182080Smckusick tl = *pc.usp++; 13192080Smckusick tl1 = pop4(); 13202191Smckusic if (_runtst) { 13212191Smckusic push4(MAX(tl1, tl, *pc.usp++)); 13222191Smckusic continue; 13232191Smckusic } 13242191Smckusic tl1 -= tl; 13252191Smckusic tl = *pc.usp++; 13262191Smckusic push4(tl1 > tl ? tl1 : tl); 13272080Smckusick continue; 13282080Smckusick case O_MIN: 13292080Smckusick tl = *pc.cp++; 13302080Smckusick if (tl == 0) 13312080Smckusick tl = *pc.usp++; 13322080Smckusick tl1 = pop4(); 13332080Smckusick push4(tl1 < tl ? tl1 : tl); 13342080Smckusick continue; 13352080Smckusick case O_UNIT: 13362080Smckusick pc.cp++; 13372080Smckusick curfile = UNIT(popaddr()); 13382080Smckusick continue; 13392080Smckusick case O_UNITINP: 13402080Smckusick pc.cp++; 13412080Smckusick curfile = INPUT; 13422080Smckusick continue; 13432080Smckusick case O_UNITOUT: 13442080Smckusick pc.cp++; 13452080Smckusick curfile = OUTPUT; 13462080Smckusick continue; 13472080Smckusick case O_MESSAGE: 13482080Smckusick pc.cp++; 13492080Smckusick PFLUSH(); 13502080Smckusick curfile = ERR; 13512080Smckusick continue; 13522109Smckusic case O_PUT: 13532109Smckusic pc.cp++; 13542109Smckusic PUT(curfile); 13552109Smckusic continue; 13562080Smckusick case O_GET: 13572080Smckusick pc.cp++; 13582080Smckusick GET(curfile); 13592080Smckusick continue; 13602080Smckusick case O_FNIL: 13612080Smckusick pc.cp++; 13622080Smckusick pushaddr(FNIL(popaddr())); 13632080Smckusick continue; 13642080Smckusick case O_DEFNAME: 13652080Smckusick pc.cp++; 13662080Smckusick DEFNAME(); 13672080Smckusick popargs(4); 13682080Smckusick continue; 13692080Smckusick case O_RESET: 13702080Smckusick pc.cp++; 13712080Smckusick RESET(); 13722080Smckusick popargs(4); 13732080Smckusick continue; 13742080Smckusick case O_REWRITE: 13752080Smckusick pc.cp++; 13762080Smckusick REWRITE(); 13772080Smckusick popargs(4); 13782080Smckusick continue; 13792080Smckusick case O_FILE: 13802080Smckusick pc.cp++; 13812080Smckusick pushaddr(ACTFILE(curfile)); 13822080Smckusick continue; 13832080Smckusick case O_REMOVE: 13842080Smckusick pc.cp++; 13852080Smckusick REMOVE(); 13862080Smckusick popargs(2); 13872080Smckusick continue; 13882080Smckusick case O_FLUSH: 13892080Smckusick pc.cp++; 13902080Smckusick FLUSH(); 13912080Smckusick popargs(1); 13922080Smckusick continue; 13932080Smckusick case O_PACK: 13942080Smckusick pc.cp++; 13952080Smckusick PACK(); 13962080Smckusick popargs(7); 13972080Smckusick continue; 13982080Smckusick case O_UNPACK: 13992080Smckusick pc.cp++; 14002080Smckusick UNPACK(); 14012080Smckusick popargs(7); 14022080Smckusick continue; 14032080Smckusick case O_ARGC: 14042080Smckusick pc.cp++; 14052080Smckusick push4(_argc); 14062080Smckusick continue; 14072080Smckusick case O_ARGV: 14082080Smckusick tl = *pc.cp++; /* tl = size of char array */ 14092080Smckusick if (tl == 0) 14102080Smckusick tl = *pc.usp++; 14112080Smckusick tcp = popaddr(); /* tcp = addr of char array */ 14122080Smckusick tl1 = pop4(); /* tl1 = argv subscript */ 14132080Smckusick ARGV(tl1, tcp, tl); 14142080Smckusick continue; 14152080Smckusick case O_CLCK: 14162080Smckusick pc.cp++; 14172080Smckusick push4(CLCK()); 14182080Smckusick continue; 14192080Smckusick case O_WCLCK: 14202080Smckusick pc.cp++; 14212080Smckusick push4(time(0)); 14222080Smckusick continue; 14232080Smckusick case O_SCLCK: 14242080Smckusick pc.cp++; 14252080Smckusick push4(SCLCK()); 14262080Smckusick continue; 14272080Smckusick case O_DISPOSE: 14282080Smckusick tl = *pc.cp++; /* tl = size being disposed */ 14292080Smckusick if (tl == 0) 14302080Smckusick tl = *pc.usp++; 14312080Smckusick tcp = popaddr(); /* ptr to ptr being disposed */ 14322080Smckusick DISPOSE(tcp, tl); 14332080Smckusick *(char **)tcp = (char *)0; 14342080Smckusick continue; 14352080Smckusick case O_NEW: 14362080Smckusick tl = *pc.cp++; /* tl = size being new'ed */ 14372080Smckusick if (tl == 0) 14382080Smckusick tl = *pc.usp++; 14392080Smckusick tcp = popaddr(); /* ptr to ptr being new'ed */ 14402191Smckusic if (_runtst) { 14412191Smckusic NEWZ(tcp, tl); 14422191Smckusic continue; 14432191Smckusic } 14442191Smckusic NEW(tcp, tl); 14452080Smckusick continue; 14462080Smckusick case O_DATE: 14472080Smckusick pc.cp++; 14482080Smckusick DATE(popaddr()); 14492080Smckusick continue; 14502080Smckusick case O_TIME: 14512080Smckusick pc.cp++; 14522080Smckusick TIME(popaddr()); 14532080Smckusick continue; 14542080Smckusick case O_UNDEF: 14552080Smckusick pc.cp++; 14562080Smckusick pop8(); 14572080Smckusick push2(0); 14582080Smckusick continue; 14592080Smckusick case O_ATAN: 14602080Smckusick pc.cp++; 14612080Smckusick push8(atan(pop8())); 14622080Smckusick continue; 14632080Smckusick case O_COS: 14642080Smckusick pc.cp++; 14652080Smckusick push8(cos(pop8())); 14662080Smckusick continue; 14672080Smckusick case O_EXP: 14682080Smckusick pc.cp++; 14692080Smckusick push8(exp(pop8())); 14702080Smckusick continue; 14712080Smckusick case O_LN: 14722080Smckusick pc.cp++; 14732191Smckusic if (_runtst) { 14742191Smckusic push8(LN(pop8())); 14752191Smckusic continue; 14762191Smckusic } 14772191Smckusic push8(log(pop8())); 14782080Smckusick continue; 14792080Smckusick case O_SIN: 14802080Smckusick pc.cp++; 14812080Smckusick push8(sin(pop8())); 14822080Smckusick continue; 14832080Smckusick case O_SQRT: 14842080Smckusick pc.cp++; 14852191Smckusic if (_runtst) { 14862191Smckusic push8(SQRT(pop8())); 14872191Smckusic continue; 14882191Smckusic } 14892191Smckusic push8(sqrt(pop8())); 14902080Smckusick continue; 14912080Smckusick case O_CHR2: 14922080Smckusick case O_CHR4: 14932080Smckusick pc.cp++; 14942191Smckusic if (_runtst) { 14952191Smckusic push2(CHR(pop4())); 14962191Smckusic continue; 14972191Smckusic } 14982191Smckusic push2(pop4()); 14992080Smckusick continue; 15002080Smckusick case O_ODD2: 15012080Smckusick case O_ODD4: 15022080Smckusick pc.cp++; 15032080Smckusick push2(pop4() & 1); 15042080Smckusick continue; 15052080Smckusick case O_SUCC2: 15062109Smckusic tl = *pc.cp++; 15072109Smckusic if (tl == 0) 15082109Smckusic tl = *pc.sp++; 15092109Smckusic tl1 = pop4(); 15102191Smckusic if (_runtst) { 15112191Smckusic push2(SUCC(tl1, tl, *pc.sp++)); 15122191Smckusic continue; 15132191Smckusic } 15142191Smckusic push2(tl1 + 1); 15152191Smckusic pc.sp++; 15162080Smckusick continue; 15172080Smckusick case O_SUCC24: 15182109Smckusic tl = *pc.cp++; 15192109Smckusic if (tl == 0) 15202109Smckusic tl = *pc.sp++; 15212109Smckusic tl1 = pop4(); 15222191Smckusic if (_runtst) { 15232191Smckusic push4(SUCC(tl1, tl, *pc.sp++)); 15242191Smckusic continue; 15252191Smckusic } 15262191Smckusic push4(tl1 + 1); 15272191Smckusic pc.sp++; 15282109Smckusic continue; 15292080Smckusick case O_SUCC4: 15302109Smckusic tl = *pc.cp++; 15312109Smckusic if (tl == 0) 15322109Smckusic tl = *pc.lp++; 15332109Smckusic tl1 = pop4(); 15342191Smckusic if (_runtst) { 15352191Smckusic push4(SUCC(tl1, tl, *pc.lp++)); 15362191Smckusic continue; 15372191Smckusic } 15382191Smckusic push4(tl1 + 1); 15392191Smckusic pc.lp++; 15402080Smckusick continue; 15412080Smckusick case O_PRED2: 15422109Smckusic tl = *pc.cp++; 15432109Smckusic if (tl == 0) 15442109Smckusic tl = *pc.sp++; 15452109Smckusic tl1 = pop4(); 15462191Smckusic if (_runtst) { 15472191Smckusic push2(PRED(tl1, tl, *pc.sp++)); 15482191Smckusic continue; 15492191Smckusic } 15502191Smckusic push2(tl1 - 1); 15512191Smckusic pc.sp++; 15522080Smckusick continue; 15532080Smckusick case O_PRED24: 15542109Smckusic tl = *pc.cp++; 15552109Smckusic if (tl == 0) 15562109Smckusic tl = *pc.sp++; 15572109Smckusic tl1 = pop4(); 15582191Smckusic if (_runtst) { 15592191Smckusic push4(PRED(tl1, tl, *pc.sp++)); 15602191Smckusic continue; 15612191Smckusic } 15622191Smckusic push4(tl1 - 1); 15632191Smckusic pc.sp++; 15642109Smckusic continue; 15652080Smckusick case O_PRED4: 15662109Smckusic tl = *pc.cp++; 15672109Smckusic if (tl == 0) 15682109Smckusic tl = *pc.lp++; 15692109Smckusic tl1 = pop4(); 15702191Smckusic if (_runtst) { 15712191Smckusic push4(PRED(tl1, tl, *pc.lp++)); 15722191Smckusic continue; 15732191Smckusic } 15742191Smckusic push4(tl1 - 1); 15752191Smckusic pc.lp++; 15762080Smckusick continue; 15772080Smckusick case O_SEED: 15782080Smckusick pc.cp++; 15792080Smckusick push4(SEED(pop4())); 15802080Smckusick continue; 15812080Smckusick case O_RANDOM: 15822080Smckusick pc.cp++; 15832080Smckusick push8(RANDOM(pop8())); 15842080Smckusick continue; 15852080Smckusick case O_EXPO: 15862080Smckusick pc.cp++; 15872080Smckusick push4(EXPO(pop8())); 15882080Smckusick continue; 15892080Smckusick case O_SQR2: 15902080Smckusick case O_SQR4: 15912080Smckusick pc.cp++; 15922080Smckusick tl = pop4(); 15932080Smckusick push4(tl * tl); 15942080Smckusick continue; 15952080Smckusick case O_SQR8: 15962080Smckusick pc.cp++; 15972080Smckusick td = pop8(); 15982080Smckusick push8(td * td); 15992080Smckusick continue; 16002080Smckusick case O_ROUND: 16012080Smckusick pc.cp++; 16022080Smckusick push4(ROUND(pop8())); 16032080Smckusick continue; 16042080Smckusick case O_TRUNC: 16052080Smckusick pc.cp++; 16062080Smckusick push4(TRUNC(pop8())); 16072080Smckusick continue; 16082080Smckusick } 16092080Smckusick } 16102080Smckusick } 1611