12080Smckusick /* Copyright (c) 1979 Regents of the University of California */ 22080Smckusick 3*2109Smckusic static char sccsid[] = "@(#)interp.c 1.2 01/10/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 */ 16*2109Smckusic union disply _display; 172080Smckusick struct disp *_dp; 182080Smckusick long _lino = 0; 192080Smckusick int _argc; 202080Smckusick char **_argv; 212080Smckusick long _mode; 222080Smckusick long _nodump; 232080Smckusick long _stlim = 500000; 242080Smckusick long _stcnt = 0; 252080Smckusick char *_minptr = (char *)0x7fffffff; 262080Smckusick char *_maxptr = (char *)0; 272080Smckusick long *_pcpcount = (long *)0; 282080Smckusick long _cntrs = 0; 292080Smckusick long _rtns = 0; 302080Smckusick 312080Smckusick /* 322080Smckusick * file record variables 332080Smckusick */ 342080Smckusick long _filefre = PREDEF; 352080Smckusick struct iorechd _fchain = { 362080Smckusick 0, 0, 0, 0, /* only use fchain field */ 372080Smckusick INPUT /* fchain */ 382080Smckusick }; 392080Smckusick struct iorec *_actfile[MAXFILES] = { 402080Smckusick INPUT, 412080Smckusick OUTPUT, 422080Smckusick ERR 432080Smckusick }; 442080Smckusick 452080Smckusick /* 462080Smckusick * standard files 472080Smckusick */ 482080Smckusick char _inwin, _outwin, _errwin; 492080Smckusick struct iorechd input = { 502080Smckusick &_inwin, /* fileptr */ 512080Smckusick 0, /* lcount */ 522080Smckusick 0x7fffffff, /* llimit */ 532080Smckusick &_iob[0], /* fbuf */ 542080Smckusick OUTPUT, /* fchain */ 552080Smckusick STDLVL, /* flev */ 562080Smckusick "standard input", /* pfname */ 572080Smckusick FTEXT | FREAD | SYNC, /* funit */ 582080Smckusick 0, /* fblk */ 592080Smckusick 1 /* fsize */ 602080Smckusick }; 612080Smckusick struct iorechd output = { 622080Smckusick &_outwin, /* fileptr */ 632080Smckusick 0, /* lcount */ 642080Smckusick 0x7fffffff, /* llimit */ 652080Smckusick &_iob[1], /* fbuf */ 662080Smckusick ERR, /* fchain */ 672080Smckusick STDLVL, /* flev */ 682080Smckusick "standard output", /* pfname */ 692080Smckusick FTEXT | FWRITE | EOFF, /* funit */ 702080Smckusick 1, /* fblk */ 712080Smckusick 1 /* fsize */ 722080Smckusick }; 732080Smckusick struct iorechd _err = { 742080Smckusick &_errwin, /* fileptr */ 752080Smckusick 0, /* lcount */ 762080Smckusick 0x7fffffff, /* llimit */ 772080Smckusick &_iob[2], /* fbuf */ 782080Smckusick FILNIL, /* fchain */ 792080Smckusick STDLVL, /* flev */ 802080Smckusick "Message file", /* pfname */ 812080Smckusick FTEXT | FWRITE | EOFF, /* funit */ 822080Smckusick 2, /* fblk */ 832080Smckusick 1 /* fsize */ 842080Smckusick }; 852080Smckusick 86*2109Smckusic /* 87*2109Smckusic * Px profile array 88*2109Smckusic */ 89*2109Smckusic #ifdef PROFILE 90*2109Smckusic long _profcnts[NUMOPS]; 91*2109Smckusic #endif PROFILE 92*2109Smckusic 93*2109Smckusic /* 94*2109Smckusic * debugging variables 95*2109Smckusic */ 96*2109Smckusic #ifdef DEBUG 97*2109Smckusic char opc[10]; 98*2109Smckusic long opcptr = 9; 99*2109Smckusic #endif DEBUG 100*2109Smckusic 1012080Smckusick interpreter(base) 1022080Smckusick char *base; 1032080Smckusick { 1042080Smckusick union progcntr pc; /* interpreted program cntr */ 1052080Smckusick register char *vpc; /* register used for "pc" */ 1062080Smckusick struct iorec *curfile; /* active file */ 1072080Smckusick register struct stack *stp; /* active stack frame ptr */ 1082080Smckusick /* 1092080Smckusick * the following variables are used as scratch 1102080Smckusick */ 1112080Smckusick double td, td1; 1122080Smckusick register long tl, tl1, tl2; 1132080Smckusick long *tlp; 1142080Smckusick short *tsp, *tsp1; 1152080Smckusick register char *tcp; 1162080Smckusick char *tcp1; 1172080Smckusick struct stack *tstp; 1182080Smckusick struct formalrtn *tfp; 1192080Smckusick union progcntr tpc; 1202080Smckusick struct iorec **ip; 1212080Smckusick 1222080Smckusick /* 1232080Smckusick * necessary only on systems which do not initialize 1242080Smckusick * memory to zero 1252080Smckusick */ 1262080Smckusick for (ip = &_actfile[3]; ip < &_actfile[MAXFILES]; *ip++ = FILNIL) 1272080Smckusick /* void */; 1282080Smckusick /* 1292080Smckusick * set up global environment, then ``call'' the main program 1302080Smckusick */ 131*2109Smckusic _display.frame[0].locvars = pushsp(2 * sizeof(struct iorec *)); 132*2109Smckusic _display.frame[0].locvars += 8; /* local offsets are negative */ 133*2109Smckusic *(struct iorec **)(_display.frame[0].locvars - 4) = OUTPUT; 134*2109Smckusic *(struct iorec **)(_display.frame[0].locvars - 8) = INPUT; 135*2109Smckusic enableovrflo(); 1362080Smckusick stp = (struct stack *)pushsp(sizeof(struct stack)); 137*2109Smckusic _dp = &_display.frame[0]; 1382080Smckusick pc.cp = base; 1392080Smckusick for(;;) { 140*2109Smckusic # ifdef DEBUG 1412080Smckusick if (++opcptr == 10) 1422080Smckusick opcptr = 0; 1432080Smckusick opc[opcptr] = *pc.ucp; 144*2109Smckusic # endif DEBUG 145*2109Smckusic # ifdef PROFILE 146*2109Smckusic _profcnts[*pc.ucp]++; 147*2109Smckusic # endif PROFILE 1482080Smckusick switch (*pc.ucp++) { 1492080Smckusick default: 1502080Smckusick panic(PBADOP); 1512080Smckusick continue; 1522080Smckusick case O_NODUMP: 1532080Smckusick _nodump++; 154*2109Smckusic disableovrflo(); 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*2109Smckusic tl1 = *pc.lp++; /* tl1 = local variable size */ 1622080Smckusick pc.lp++; /* skip over number of args */ 1632080Smckusick _lino = *pc.usp++; /* set new lino */ 1642080Smckusick pc.cp += tl; /* skip over name text */ 1652080Smckusick stp->file = curfile; /* save active file */ 1662080Smckusick tcp = pushsp(tl1); /* tcp = new top of stack */ 1672080Smckusick blkclr(tl1, tcp); /* zero stack frame */ 168*2109Smckusic tcp += tl1; /* offsets of locals are neg */ 169*2109Smckusic _dp->locvars = tcp; /* set new display pointer */ 170*2109Smckusic _dp->stp = stp; 1712080Smckusick stp->tos = pushsp(0); /* set top of stack pointer */ 1722080Smckusick continue; 1732080Smckusick case O_END: 1742080Smckusick PCLOSE(_dp->locvars); /* flush & close local files */ 1752080Smckusick stp = _dp->stp; 1762080Smckusick curfile = stp->file; /* restore old active file */ 1772080Smckusick *_dp = stp->odisp; /* restore old display entry */ 178*2109Smckusic if (_dp == &_display.frame[1]) 1792080Smckusick return; /* exiting main proc ??? */ 1802080Smckusick _lino = stp->lino; /* restore lino, pc, dp */ 1812080Smckusick pc.cp = stp->pc.cp; 1822080Smckusick _dp = stp->dp; 183*2109Smckusic popsp(stp->entry->framesze + /* pop local vars */ 1842080Smckusick sizeof(struct stack) + /* pop stack frame */ 1852080Smckusick stp->entry->nargs); /* pop parms */ 1862080Smckusick continue; 1872080Smckusick case O_CALL: 1882080Smckusick tl = *pc.cp++; 1892080Smckusick tcp = base + *pc.lp++;/* calc new entry point */ 1902080Smckusick tcp += sizeof(short); 1912080Smckusick tcp = base + *(long *)tcp; 1922080Smckusick stp = (struct stack *)pushsp(sizeof(struct stack)); 1932080Smckusick stp->lino = _lino; /* save lino, pc, dp */ 1942080Smckusick stp->pc.cp = pc.cp; 1952080Smckusick stp->dp = _dp; 196*2109Smckusic _dp = &_display.frame[tl]; /* set up new display ptr */ 1972080Smckusick pc.cp = tcp; 1982080Smckusick continue; 1992080Smckusick case O_FCALL: 2002080Smckusick tl = *pc.cp++; /* tl = number of args */ 2012080Smckusick if (tl == 0) 2022080Smckusick tl = *pc.lp++; 2032080Smckusick tfp = (struct formalrtn *)popaddr(); 2042080Smckusick stp = (struct stack *)pushsp(sizeof(struct stack)); 2052080Smckusick stp->lino = _lino; /* save lino, pc, dp */ 2062080Smckusick stp->pc.cp = pc.cp; 2072080Smckusick stp->dp = _dp; 2082080Smckusick pc.cp = tfp->entryaddr; /* calc new entry point */ 2092080Smckusick tpc.sp = pc.sp + 1; 2102080Smckusick tl -= tpc.hdrp->nargs; 2112080Smckusick if (tl != 0) { 2122080Smckusick if (tl > 0) 2132080Smckusick tl += sizeof(int) - 1; 2142080Smckusick else 2152080Smckusick tl -= sizeof(int) - 1; 2162080Smckusick ERROR(ENARGS, tl / sizeof(int)); 2172080Smckusick } 218*2109Smckusic _dp = &_display.frame[tfp->cbn];/* new display ptr */ 2192080Smckusick blkcpy(sizeof(struct disp) * tfp->cbn, 220*2109Smckusic &_display.frame[1], &tfp->disp[tfp->cbn]); 2212080Smckusick blkcpy(sizeof(struct disp) * tfp->cbn, 222*2109Smckusic &tfp->disp[0], &_display.frame[1]); 2232080Smckusick continue; 2242080Smckusick case O_FRTN: 2252080Smckusick tl = *pc.cp++; /* tl = size of return obj */ 2262080Smckusick if (tl == 0) 2272080Smckusick tl = *pc.usp++; 2282080Smckusick tcp = pushsp(0); 2292080Smckusick tfp = *(struct formalrtn **)(tcp + tl); 2302080Smckusick blkcpy(tl, tcp, tcp + sizeof(struct formalrtn *)); 2312080Smckusick popsp(sizeof(struct formalrtn *)); 2322080Smckusick blkcpy(sizeof(struct disp) * tfp->cbn, 233*2109Smckusic &tfp->disp[tfp->cbn], &_display.frame[1]); 2342080Smckusick continue; 2352080Smckusick case O_FSAV: 2362080Smckusick tfp = (struct formalrtn *)popaddr(); 2372080Smckusick tfp->cbn = *pc.cp++; /* blk number of routine */ 2382080Smckusick tcp = base + *pc.lp++;/* calc new entry point */ 2392080Smckusick tcp += sizeof(short); 2402080Smckusick tfp->entryaddr = base + *(long *)tcp; 2412080Smckusick blkcpy(sizeof(struct disp) * tfp->cbn, 242*2109Smckusic &_display.frame[1], &tfp->disp[0]); 2432080Smckusick pushaddr(tfp); 2442080Smckusick continue; 2452080Smckusick case O_SDUP2: 2462080Smckusick pc.cp++; 2472080Smckusick tl = pop2(); 2482080Smckusick push2(tl); 2492080Smckusick push2(tl); 2502080Smckusick continue; 2512080Smckusick case O_SDUP4: 2522080Smckusick pc.cp++; 2532080Smckusick tl = pop4(); 2542080Smckusick push4(tl); 2552080Smckusick push4(tl); 2562080Smckusick continue; 2572080Smckusick case O_TRA: 2582080Smckusick pc.cp++; 2592080Smckusick pc.cp += *pc.sp; 2602080Smckusick continue; 2612080Smckusick case O_TRA4: 2622080Smckusick pc.cp++; 2632080Smckusick pc.cp = base + *pc.lp; 2642080Smckusick continue; 2652080Smckusick case O_GOTO: 266*2109Smckusic tstp = _display.frame[*pc.cp++].stp; /* ptr to 267*2109Smckusic exit frame */ 2682080Smckusick pc.cp = base + *pc.lp; 2692080Smckusick stp = _dp->stp; 2702080Smckusick while (tstp != stp) { 271*2109Smckusic if (_dp == &_display.frame[1]) 2722080Smckusick ERROR(EGOTO); /* exiting prog ??? */ 2732080Smckusick PCLOSE(_dp->locvars); /* close local files */ 2742080Smckusick curfile = stp->file; /* restore active file */ 2752080Smckusick *_dp = stp->odisp; /* old display entry */ 2762080Smckusick _dp = stp->dp; /* restore dp */ 2772080Smckusick stp = _dp->stp; 2782080Smckusick } 2792080Smckusick /* pop locals, stack frame, parms, and return values */ 2802080Smckusick popsp(stp->tos - pushsp(0)); 2812080Smckusick continue; 2822080Smckusick case O_LINO: 2832080Smckusick if (_dp->stp->tos != pushsp(0)) 2842080Smckusick panic(PSTKNEMP); 2852080Smckusick _lino = *pc.cp++; /* set line number */ 2862080Smckusick if (_lino == 0) 2872080Smckusick _lino = *pc.sp++; 2882080Smckusick LINO(); /* inc statement count */ 2892080Smckusick continue; 2902080Smckusick case O_PUSH: 2912080Smckusick tl = *pc.cp++; 2922080Smckusick if (tl == 0) 2932080Smckusick tl = *pc.usp++; 2942080Smckusick tl = (-tl + 1) & ~1; 2952080Smckusick tcp = pushsp(tl); 2962080Smckusick blkclr(tl, tcp); 2972080Smckusick continue; 2982080Smckusick case O_IF: 2992080Smckusick pc.cp++; 3002080Smckusick if (pop2()) 3012080Smckusick pc.sp++; 3022080Smckusick else 3032080Smckusick pc.cp += *pc.sp; 3042080Smckusick continue; 3052080Smckusick case O_REL2: 3062080Smckusick tl = pop2(); 3072080Smckusick tl1 = pop2(); 3082080Smckusick goto cmplong; 3092080Smckusick case O_REL24: 3102080Smckusick tl = pop2(); 3112080Smckusick tl1 = pop4(); 3122080Smckusick goto cmplong; 3132080Smckusick case O_REL42: 3142080Smckusick tl = pop4(); 3152080Smckusick tl1 = pop2(); 3162080Smckusick goto cmplong; 3172080Smckusick case O_REL4: 3182080Smckusick tl = pop4(); 3192080Smckusick tl1 = pop4(); 3202080Smckusick cmplong: 3212080Smckusick tl2 = *pc.cp++; 3222080Smckusick switch (tl2) { 3232080Smckusick case releq: 3242080Smckusick push2(tl1 == tl); 3252080Smckusick continue; 3262080Smckusick case relne: 3272080Smckusick push2(tl1 != tl); 3282080Smckusick continue; 3292080Smckusick case rellt: 3302080Smckusick push2(tl1 < tl); 3312080Smckusick continue; 3322080Smckusick case relgt: 3332080Smckusick push2(tl1 > tl); 3342080Smckusick continue; 3352080Smckusick case relle: 3362080Smckusick push2(tl1 <= tl); 3372080Smckusick continue; 3382080Smckusick case relge: 3392080Smckusick push2(tl1 >= tl); 3402080Smckusick continue; 3412080Smckusick default: 3422080Smckusick panic(PSYSTEM); 3432080Smckusick continue; 3442080Smckusick } 3452080Smckusick case O_RELG: 3462080Smckusick tl2 = *pc.cp++; /* tc has jump opcode */ 3472080Smckusick tl = *pc.usp++; /* tl has comparison length */ 3482080Smckusick tl1 = (tl + 1) & ~1; /* tl1 has arg stack length */ 3492080Smckusick tcp = pushsp(0); /* tcp pts to first arg */ 3502080Smckusick switch (tl2) { 3512080Smckusick case releq: 3522080Smckusick tl = RELEQ(tl, tcp + tl1, tcp); 3532080Smckusick break; 3542080Smckusick case relne: 3552080Smckusick tl = RELNE(tl, tcp + tl1, tcp); 3562080Smckusick break; 3572080Smckusick case rellt: 3582080Smckusick tl = RELSLT(tl, tcp + tl1, tcp); 3592080Smckusick break; 3602080Smckusick case relgt: 3612080Smckusick tl = RELSGT(tl, tcp + tl1, tcp); 3622080Smckusick break; 3632080Smckusick case relle: 3642080Smckusick tl = RELSLE(tl, tcp + tl1, tcp); 3652080Smckusick break; 3662080Smckusick case relge: 3672080Smckusick tl = RELSGE(tl, tcp + tl1, tcp); 3682080Smckusick break; 3692080Smckusick default: 3702080Smckusick panic(PSYSTEM); 3712080Smckusick break; 3722080Smckusick } 3732080Smckusick popsp(tl1 << 1); 3742080Smckusick push2(tl); 3752080Smckusick continue; 3762080Smckusick case O_RELT: 3772080Smckusick tl2 = *pc.cp++; /* tc has jump opcode */ 3782080Smckusick tl1 = *pc.usp++; /* tl1 has comparison length */ 3792080Smckusick tcp = pushsp(0); /* tcp pts to first arg */ 3802080Smckusick switch (tl2) { 3812080Smckusick case releq: 3822080Smckusick tl = RELEQ(tl1, tcp + tl1, tcp); 3832080Smckusick break; 3842080Smckusick case relne: 3852080Smckusick tl = RELNE(tl1, tcp + tl1, tcp); 3862080Smckusick break; 3872080Smckusick case rellt: 3882080Smckusick tl = RELTLT(tl1, tcp + tl1, tcp); 3892080Smckusick break; 3902080Smckusick case relgt: 3912080Smckusick tl = RELTGT(tl1, tcp + tl1, tcp); 3922080Smckusick break; 3932080Smckusick case relle: 3942080Smckusick tl = RELTLE(tl1, tcp + tl1, tcp); 3952080Smckusick break; 3962080Smckusick case relge: 3972080Smckusick tl = RELTGE(tl1, tcp + tl1, tcp); 3982080Smckusick break; 3992080Smckusick default: 4002080Smckusick panic(PSYSTEM); 4012080Smckusick break; 4022080Smckusick } 4032080Smckusick popsp(tl1 << 1); 4042080Smckusick push2(tl); 4052080Smckusick continue; 4062080Smckusick case O_REL28: 4072080Smckusick td = pop2(); 4082080Smckusick td1 = pop8(); 4092080Smckusick goto cmpdbl; 4102080Smckusick case O_REL48: 4112080Smckusick td = pop4(); 4122080Smckusick td1 = pop8(); 4132080Smckusick goto cmpdbl; 4142080Smckusick case O_REL82: 4152080Smckusick td = pop8(); 4162080Smckusick td1 = pop2(); 4172080Smckusick goto cmpdbl; 4182080Smckusick case O_REL84: 4192080Smckusick td = pop8(); 4202080Smckusick td1 = pop4(); 4212080Smckusick goto cmpdbl; 4222080Smckusick case O_REL8: 4232080Smckusick td = pop8(); 4242080Smckusick td1 = pop8(); 4252080Smckusick cmpdbl: 4262080Smckusick switch (*pc.cp++) { 4272080Smckusick case releq: 4282080Smckusick push2(td1 == td); 4292080Smckusick continue; 4302080Smckusick case relne: 4312080Smckusick push2(td1 != td); 4322080Smckusick continue; 4332080Smckusick case rellt: 4342080Smckusick push2(td1 < td); 4352080Smckusick continue; 4362080Smckusick case relgt: 4372080Smckusick push2(td1 > td); 4382080Smckusick continue; 4392080Smckusick case relle: 4402080Smckusick push2(td1 <= td); 4412080Smckusick continue; 4422080Smckusick case relge: 4432080Smckusick push2(td1 >= td); 4442080Smckusick continue; 4452080Smckusick default: 4462080Smckusick panic(PSYSTEM); 4472080Smckusick continue; 4482080Smckusick } 4492080Smckusick case O_AND: 4502080Smckusick pc.cp++; 4512080Smckusick push2(pop2() & pop2()); 4522080Smckusick continue; 4532080Smckusick case O_OR: 4542080Smckusick pc.cp++; 4552080Smckusick push2(pop2() | pop2()); 4562080Smckusick continue; 4572080Smckusick case O_NOT: 4582080Smckusick pc.cp++; 4592080Smckusick push2(pop2() ^ 1); 4602080Smckusick continue; 4612080Smckusick case O_AS2: 4622080Smckusick pc.cp++; 4632080Smckusick tl = pop2(); 4642080Smckusick *(short *)popaddr() = tl; 4652080Smckusick continue; 4662080Smckusick case O_AS4: 4672080Smckusick pc.cp++; 4682080Smckusick tl = pop4(); 4692080Smckusick *(long *)popaddr() = tl; 4702080Smckusick continue; 4712080Smckusick case O_AS24: 4722080Smckusick pc.cp++; 4732080Smckusick tl = pop2(); 4742080Smckusick *(long *)popaddr() = tl; 4752080Smckusick continue; 4762080Smckusick case O_AS42: 4772080Smckusick pc.cp++; 4782080Smckusick tl = pop4(); 4792080Smckusick *(short *)popaddr() = tl; 4802080Smckusick continue; 4812080Smckusick case O_AS21: 4822080Smckusick pc.cp++; 4832080Smckusick tl = pop2(); 4842080Smckusick *popaddr() = tl; 4852080Smckusick continue; 4862080Smckusick case O_AS41: 4872080Smckusick pc.cp++; 4882080Smckusick tl = pop4(); 4892080Smckusick *popaddr() = tl; 4902080Smckusick continue; 4912080Smckusick case O_AS28: 4922080Smckusick pc.cp++; 4932080Smckusick tl = pop2(); 4942080Smckusick *(double *)popaddr() = tl; 4952080Smckusick continue; 4962080Smckusick case O_AS48: 4972080Smckusick pc.cp++; 4982080Smckusick tl = pop4(); 4992080Smckusick *(double *)popaddr() = tl; 5002080Smckusick continue; 5012080Smckusick case O_AS8: 5022080Smckusick pc.cp++; 5032080Smckusick td = pop8(); 5042080Smckusick *(double *)popaddr() = td; 5052080Smckusick continue; 5062080Smckusick case O_AS: 5072080Smckusick tl = *pc.cp++; 5082080Smckusick if (tl == 0) 5092080Smckusick tl = *pc.usp++; 5102080Smckusick tl1 = (tl + 1) & ~1; 5112080Smckusick tcp = pushsp(0); 5122080Smckusick blkcpy(tl, tcp, *(char **)(tcp + tl1)); 5132080Smckusick popsp(tl1 + sizeof(char *)); 5142080Smckusick continue; 5152080Smckusick case O_INX2P2: 5162080Smckusick tl = *pc.cp++; /* tl has shift amount */ 5172080Smckusick tl1 = (pop2() - *pc.sp++) << tl; 5182080Smckusick pushaddr(popaddr() + tl1); 5192080Smckusick continue; 5202080Smckusick case O_INX4P2: 5212080Smckusick tl = *pc.cp++; /* tl has shift amount */ 5222080Smckusick tl1 = (pop4() - *pc.sp++) << tl; 5232080Smckusick pushaddr(popaddr() + tl1); 5242080Smckusick continue; 5252080Smckusick case O_INX2: 5262080Smckusick tl = *pc.cp++; /* tl has element size */ 5272080Smckusick if (tl == 0) 5282080Smckusick tl = *pc.usp++; 5292080Smckusick tl1 = pop2(); /* index */ 5302080Smckusick tl2 = *pc.sp++; 531*2109Smckusic SUBSC(tl1, tl2, *pc.usp++); /* range check */ 5322080Smckusick pushaddr(popaddr() + (tl1 - tl2) * tl); 5332080Smckusick continue; 5342080Smckusick case O_INX4: 5352080Smckusick tl = *pc.cp++; /* tl has element size */ 5362080Smckusick if (tl == 0) 5372080Smckusick tl = *pc.usp++; 5382080Smckusick tl1 = pop4(); /* index */ 5392080Smckusick tl2 = *pc.sp++; 540*2109Smckusic SUBSC(tl1, tl2, *pc.usp++); /* range check */ 5412080Smckusick pushaddr(popaddr() + (tl1 - tl2) * tl); 5422080Smckusick continue; 5432080Smckusick case O_OFF: 5442080Smckusick tl = *pc.cp++; 5452080Smckusick if (tl == 0) 5462080Smckusick tl = *pc.usp++; 5472080Smckusick push4(pop4() + tl); 5482080Smckusick continue; 5492080Smckusick case O_NIL: 5502080Smckusick pc.cp++; 5512080Smckusick NIL(); 5522080Smckusick continue; 5532080Smckusick case O_ADD2: 5542080Smckusick pc.cp++; 5552080Smckusick push4(pop2() + pop2()); 5562080Smckusick continue; 5572080Smckusick case O_ADD4: 5582080Smckusick pc.cp++; 5592080Smckusick push4(pop4() + pop4()); 5602080Smckusick continue; 5612080Smckusick case O_ADD24: 5622080Smckusick pc.cp++; 5632080Smckusick tl = pop2(); 5642080Smckusick push4(pop4() + tl); 5652080Smckusick continue; 5662080Smckusick case O_ADD42: 5672080Smckusick pc.cp++; 5682080Smckusick tl = pop4(); 5692080Smckusick push4(pop2() + tl); 5702080Smckusick continue; 5712080Smckusick case O_ADD28: 5722080Smckusick pc.cp++; 5732080Smckusick tl = pop2(); 5742080Smckusick push8(pop8() + tl); 5752080Smckusick continue; 5762080Smckusick case O_ADD48: 5772080Smckusick pc.cp++; 5782080Smckusick tl = pop4(); 5792080Smckusick push8(pop8() + tl); 5802080Smckusick continue; 5812080Smckusick case O_ADD82: 5822080Smckusick pc.cp++; 5832080Smckusick td = pop8(); 5842080Smckusick push8(pop2() + td); 5852080Smckusick continue; 5862080Smckusick case O_ADD84: 5872080Smckusick pc.cp++; 5882080Smckusick td = pop8(); 5892080Smckusick push8(pop4() + td); 5902080Smckusick continue; 5912080Smckusick case O_SUB2: 5922080Smckusick pc.cp++; 5932080Smckusick tl = pop2(); 5942080Smckusick push4(pop2() - tl); 5952080Smckusick continue; 5962080Smckusick case O_SUB4: 5972080Smckusick pc.cp++; 5982080Smckusick tl = pop4(); 5992080Smckusick push4(pop4() - tl); 6002080Smckusick continue; 6012080Smckusick case O_SUB24: 6022080Smckusick pc.cp++; 6032080Smckusick tl = pop2(); 6042080Smckusick push4(pop4() - tl); 6052080Smckusick continue; 6062080Smckusick case O_SUB42: 6072080Smckusick pc.cp++; 6082080Smckusick tl = pop4(); 6092080Smckusick push4(pop2() - tl); 6102080Smckusick continue; 6112080Smckusick case O_SUB28: 6122080Smckusick pc.cp++; 6132080Smckusick tl = pop2(); 6142080Smckusick push8(pop8() - tl); 6152080Smckusick continue; 6162080Smckusick case O_SUB48: 6172080Smckusick pc.cp++; 6182080Smckusick tl = pop4(); 6192080Smckusick push8(pop8() - tl); 6202080Smckusick continue; 6212080Smckusick case O_SUB82: 6222080Smckusick pc.cp++; 6232080Smckusick td = pop8(); 6242080Smckusick push8(pop2() - td); 6252080Smckusick continue; 6262080Smckusick case O_SUB84: 6272080Smckusick pc.cp++; 6282080Smckusick td = pop8(); 6292080Smckusick push8(pop4() - td); 6302080Smckusick continue; 6312080Smckusick case O_MUL2: 6322080Smckusick pc.cp++; 6332080Smckusick push4(pop2() * pop2()); 6342080Smckusick continue; 6352080Smckusick case O_MUL4: 6362080Smckusick pc.cp++; 6372080Smckusick push4(pop4() * pop4()); 6382080Smckusick continue; 6392080Smckusick case O_MUL24: 6402080Smckusick pc.cp++; 6412080Smckusick tl = pop2(); 6422080Smckusick push4(pop4() * tl); 6432080Smckusick continue; 6442080Smckusick case O_MUL42: 6452080Smckusick pc.cp++; 6462080Smckusick tl = pop4(); 6472080Smckusick push4(pop2() * tl); 6482080Smckusick continue; 6492080Smckusick case O_MUL28: 6502080Smckusick pc.cp++; 6512080Smckusick tl = pop2(); 6522080Smckusick push8(pop8() * tl); 6532080Smckusick continue; 6542080Smckusick case O_MUL48: 6552080Smckusick pc.cp++; 6562080Smckusick tl = pop4(); 6572080Smckusick push8(pop8() * tl); 6582080Smckusick continue; 6592080Smckusick case O_MUL82: 6602080Smckusick pc.cp++; 6612080Smckusick td = pop8(); 6622080Smckusick push8(pop2() * td); 6632080Smckusick continue; 6642080Smckusick case O_MUL84: 6652080Smckusick pc.cp++; 6662080Smckusick td = pop8(); 6672080Smckusick push8(pop4() * td); 6682080Smckusick continue; 6692080Smckusick case O_ABS2: 6702080Smckusick case O_ABS4: 6712080Smckusick pc.cp++; 6722080Smckusick tl = pop4(); 6732080Smckusick push4(tl >= 0 ? tl : -tl); 6742080Smckusick continue; 6752080Smckusick case O_ABS8: 6762080Smckusick pc.cp++; 6772080Smckusick td = pop8(); 6782080Smckusick push8(td >= 0.0 ? td : -td); 6792080Smckusick continue; 6802080Smckusick case O_NEG2: 6812080Smckusick pc.cp++; 6822080Smckusick push4(-pop2()); 6832080Smckusick continue; 6842080Smckusick case O_NEG4: 6852080Smckusick pc.cp++; 6862080Smckusick push4(-pop4()); 6872080Smckusick continue; 6882080Smckusick case O_NEG8: 6892080Smckusick pc.cp++; 6902080Smckusick push8(-pop8()); 6912080Smckusick continue; 6922080Smckusick case O_DIV2: 6932080Smckusick pc.cp++; 6942080Smckusick tl = pop2(); 6952080Smckusick push4(pop2() / tl); 6962080Smckusick continue; 6972080Smckusick case O_DIV4: 6982080Smckusick pc.cp++; 6992080Smckusick tl = pop4(); 7002080Smckusick push4(pop4() / tl); 7012080Smckusick continue; 7022080Smckusick case O_DIV24: 7032080Smckusick pc.cp++; 7042080Smckusick tl = pop2(); 7052080Smckusick push4(pop4() / tl); 7062080Smckusick continue; 7072080Smckusick case O_DIV42: 7082080Smckusick pc.cp++; 7092080Smckusick tl = pop4(); 7102080Smckusick push4(pop2() / tl); 7112080Smckusick continue; 7122080Smckusick case O_MOD2: 7132080Smckusick pc.cp++; 7142080Smckusick tl = pop2(); 7152080Smckusick push4(pop2() % tl); 7162080Smckusick continue; 7172080Smckusick case O_MOD4: 7182080Smckusick pc.cp++; 7192080Smckusick tl = pop4(); 7202080Smckusick push4(pop4() % tl); 7212080Smckusick continue; 7222080Smckusick case O_MOD24: 7232080Smckusick pc.cp++; 7242080Smckusick tl = pop2(); 7252080Smckusick push4(pop4() % tl); 7262080Smckusick continue; 7272080Smckusick case O_MOD42: 7282080Smckusick pc.cp++; 7292080Smckusick tl = pop4(); 7302080Smckusick push4(pop2() % tl); 7312080Smckusick continue; 7322080Smckusick case O_ADD8: 7332080Smckusick pc.cp++; 7342080Smckusick push8(pop8() + pop8()); 7352080Smckusick continue; 7362080Smckusick case O_SUB8: 7372080Smckusick pc.cp++; 7382080Smckusick td = pop8(); 7392080Smckusick push8(pop8() - td); 7402080Smckusick continue; 7412080Smckusick case O_MUL8: 7422080Smckusick pc.cp++; 7432080Smckusick push8(pop8() * pop8()); 7442080Smckusick continue; 7452080Smckusick case O_DVD8: 7462080Smckusick pc.cp++; 7472080Smckusick td = pop8(); 7482080Smckusick push8(pop8() / td); 7492080Smckusick continue; 7502080Smckusick case O_STOI: 7512080Smckusick pc.cp++; 7522080Smckusick push4(pop2()); 7532080Smckusick continue; 7542080Smckusick case O_STOD: 7552080Smckusick pc.cp++; 7562080Smckusick td = pop2(); 7572080Smckusick push8(td); 7582080Smckusick continue; 7592080Smckusick case O_ITOD: 7602080Smckusick pc.cp++; 7612080Smckusick td = pop4(); 7622080Smckusick push8(td); 7632080Smckusick continue; 7642080Smckusick case O_ITOS: 7652080Smckusick pc.cp++; 7662080Smckusick push2(pop4()); 7672080Smckusick continue; 7682080Smckusick case O_DVD2: 7692080Smckusick pc.cp++; 7702080Smckusick td = pop2(); 7712080Smckusick push8(pop2() / td); 7722080Smckusick continue; 7732080Smckusick case O_DVD4: 7742080Smckusick pc.cp++; 7752080Smckusick td = pop4(); 7762080Smckusick push8(pop4() / td); 7772080Smckusick continue; 7782080Smckusick case O_DVD24: 7792080Smckusick pc.cp++; 7802080Smckusick td = pop2(); 7812080Smckusick push8(pop4() / td); 7822080Smckusick continue; 7832080Smckusick case O_DVD42: 7842080Smckusick pc.cp++; 7852080Smckusick td = pop4(); 7862080Smckusick push8(pop2() / td); 7872080Smckusick continue; 7882080Smckusick case O_DVD28: 7892080Smckusick pc.cp++; 7902080Smckusick td = pop2(); 7912080Smckusick push8(pop8() / td); 7922080Smckusick continue; 7932080Smckusick case O_DVD48: 7942080Smckusick pc.cp++; 7952080Smckusick td = pop4(); 7962080Smckusick push8(pop8() / td); 7972080Smckusick continue; 7982080Smckusick case O_DVD82: 7992080Smckusick pc.cp++; 8002080Smckusick td = pop8(); 8012080Smckusick push8(pop2() / td); 8022080Smckusick continue; 8032080Smckusick case O_DVD84: 8042080Smckusick pc.cp++; 8052080Smckusick td = pop8(); 8062080Smckusick push8(pop4() / td); 8072080Smckusick continue; 8082080Smckusick case O_RV1: 809*2109Smckusic tcp = _display.raw[*pc.ucp++]; 8102080Smckusick push2(*(tcp + *pc.sp++)); 8112080Smckusick continue; 8122080Smckusick case O_RV14: 813*2109Smckusic tcp = _display.raw[*pc.ucp++]; 8142080Smckusick push4(*(tcp + *pc.sp++)); 8152080Smckusick continue; 8162080Smckusick case O_RV2: 817*2109Smckusic tcp = _display.raw[*pc.ucp++]; 8182080Smckusick push2(*(short *)(tcp + *pc.sp++)); 8192080Smckusick continue; 8202080Smckusick case O_RV24: 821*2109Smckusic tcp = _display.raw[*pc.ucp++]; 8222080Smckusick push4(*(short *)(tcp + *pc.sp++)); 8232080Smckusick continue; 8242080Smckusick case O_RV4: 825*2109Smckusic tcp = _display.raw[*pc.ucp++]; 8262080Smckusick push4(*(long *)(tcp + *pc.sp++)); 8272080Smckusick continue; 8282080Smckusick case O_RV8: 829*2109Smckusic tcp = _display.raw[*pc.ucp++]; 8302080Smckusick push8(*(double *)(tcp + *pc.sp++)); 8312080Smckusick continue; 8322080Smckusick case O_RV: 833*2109Smckusic tcp = _display.raw[*pc.ucp++]; 8342080Smckusick tcp += *pc.sp++; 8352080Smckusick tl = *pc.usp++; 8362080Smckusick tcp1 = pushsp(tl); 8372080Smckusick blkcpy(tl, tcp, tcp1); 8382080Smckusick continue; 8392080Smckusick case O_LV: 840*2109Smckusic tcp = _display.raw[*pc.ucp++]; 8412080Smckusick pushaddr(tcp + *pc.sp++); 8422080Smckusick continue; 8432080Smckusick case O_LRV1: 844*2109Smckusic tcp = _display.raw[*pc.ucp++]; 8452080Smckusick push2(*(tcp + *pc.lp++)); 8462080Smckusick continue; 8472080Smckusick case O_LRV14: 848*2109Smckusic tcp = _display.raw[*pc.ucp++]; 8492080Smckusick push4(*(tcp + *pc.lp++)); 8502080Smckusick continue; 8512080Smckusick case O_LRV2: 852*2109Smckusic tcp = _display.raw[*pc.ucp++]; 8532080Smckusick push2(*(short *)(tcp + *pc.lp++)); 8542080Smckusick continue; 8552080Smckusick case O_LRV24: 856*2109Smckusic tcp = _display.raw[*pc.ucp++]; 8572080Smckusick push4(*(short *)(tcp + *pc.lp++)); 8582080Smckusick continue; 8592080Smckusick case O_LRV4: 860*2109Smckusic tcp = _display.raw[*pc.ucp++]; 8612080Smckusick push4(*(long *)(tcp + *pc.lp++)); 8622080Smckusick continue; 8632080Smckusick case O_LRV8: 864*2109Smckusic tcp = _display.raw[*pc.ucp++]; 8652080Smckusick push8(*(double *)(tcp + *pc.lp++)); 8662080Smckusick continue; 8672080Smckusick case O_LRV: 868*2109Smckusic tcp = _display.raw[*pc.ucp++]; 8692080Smckusick tcp += *pc.lp++; 8702080Smckusick tl = *pc.usp++; 8712080Smckusick tcp1 = pushsp(tl); 8722080Smckusick blkcpy(tl, tcp, tcp1); 8732080Smckusick continue; 8742080Smckusick case O_LLV: 875*2109Smckusic tcp = _display.raw[*pc.ucp++]; 8762080Smckusick pushaddr(tcp + *pc.lp++); 8772080Smckusick continue; 8782080Smckusick case O_IND1: 8792080Smckusick pc.cp++; 8802080Smckusick push2(*popaddr()); 8812080Smckusick continue; 8822080Smckusick case O_IND14: 8832080Smckusick pc.cp++; 8842080Smckusick push4(*popaddr()); 8852080Smckusick continue; 8862080Smckusick case O_IND2: 8872080Smckusick pc.cp++; 8882080Smckusick push2(*(short *)(popaddr())); 8892080Smckusick continue; 8902080Smckusick case O_IND24: 8912080Smckusick pc.cp++; 8922080Smckusick push4(*(short *)(popaddr())); 8932080Smckusick continue; 8942080Smckusick case O_IND4: 8952080Smckusick pc.cp++; 8962080Smckusick push4(*(long *)(popaddr())); 8972080Smckusick continue; 8982080Smckusick case O_IND8: 8992080Smckusick pc.cp++; 9002080Smckusick push8(*(double *)(popaddr())); 9012080Smckusick continue; 9022080Smckusick case O_IND: 9032080Smckusick tl = *pc.cp++; 9042080Smckusick if (tl == 0) 9052080Smckusick tl = *pc.usp++; 9062080Smckusick tcp = popaddr(); 9072080Smckusick tcp1 = pushsp((tl + 1) & ~1); 9082080Smckusick blkcpy(tl, tcp, tcp1); 9092080Smckusick continue; 9102080Smckusick case O_CON1: 9112080Smckusick push2(*pc.cp++); 9122080Smckusick continue; 9132080Smckusick case O_CON14: 9142080Smckusick push4(*pc.cp++); 9152080Smckusick continue; 9162080Smckusick case O_CON2: 9172080Smckusick pc.cp++; 9182080Smckusick push2(*pc.sp++); 9192080Smckusick continue; 9202080Smckusick case O_CON24: 9212080Smckusick pc.cp++; 9222080Smckusick push4(*pc.sp++); 9232080Smckusick continue; 9242080Smckusick case O_CON4: 9252080Smckusick pc.cp++; 9262080Smckusick push4(*pc.lp++); 9272080Smckusick continue; 9282080Smckusick case O_CON8: 9292080Smckusick pc.cp++; 9302080Smckusick push8(*pc.dp++); 9312080Smckusick continue; 9322080Smckusick case O_CON: 9332080Smckusick tl = *pc.cp++; 9342080Smckusick if (tl == 0) 9352080Smckusick tl = *pc.usp++; 9362080Smckusick tl = (tl + 1) & ~1; 9372080Smckusick tcp = pushsp(tl); 9382080Smckusick blkcpy(tl, pc.cp, tcp); 9392080Smckusick pc.cp += tl; 9402080Smckusick continue; 9412080Smckusick case O_LVCON: 9422080Smckusick tl = *pc.cp++; 9432080Smckusick if (tl == 0) 9442080Smckusick tl = *pc.usp++; 9452080Smckusick tl = (tl + 1) & ~1; 9462080Smckusick pushaddr(pc.cp); 9472080Smckusick pc.cp += tl; 9482080Smckusick continue; 9492080Smckusick case O_RANG2: 9502080Smckusick tl = *pc.cp++; 9512080Smckusick if (tl == 0) 9522080Smckusick tl = *pc.sp++; 9532080Smckusick tl1 = pop2(); 9542080Smckusick push2(RANG4(tl1, tl, *pc.sp++)); 9552080Smckusick continue; 9562080Smckusick case O_RANG42: 9572080Smckusick tl = *pc.cp++; 9582080Smckusick if (tl == 0) 9592080Smckusick tl = *pc.sp++; 9602080Smckusick tl1 = pop4(); 9612080Smckusick push4(RANG4(tl1, tl, *pc.sp++)); 9622080Smckusick continue; 9632080Smckusick case O_RSNG2: 9642080Smckusick tl = *pc.cp++; 9652080Smckusick if (tl == 0) 9662080Smckusick tl = *pc.sp++; 9672080Smckusick tl1 = pop2(); 9682080Smckusick push2(RSNG4(tl1, tl)); 9692080Smckusick continue; 9702080Smckusick case O_RSNG42: 9712080Smckusick tl = *pc.cp++; 9722080Smckusick if (tl == 0) 9732080Smckusick tl = *pc.sp++; 9742080Smckusick tl1 = pop4(); 9752080Smckusick push4(RSNG4(tl1, tl)); 9762080Smckusick continue; 9772080Smckusick case O_RANG4: 9782080Smckusick pc.cp++; 9792080Smckusick tl = *pc.lp++; 9802080Smckusick tl1 = pop4(); 9812080Smckusick push4(RANG4(tl1, tl, *pc.lp++)); 9822080Smckusick continue; 9832080Smckusick case O_RANG24: 9842080Smckusick pc.cp++; 9852080Smckusick tl = *pc.lp++; 9862080Smckusick tl1 = pop2(); 9872080Smckusick push2(RANG4(tl1, tl, *pc.lp++)); 9882080Smckusick continue; 9892080Smckusick case O_RSNG4: 9902080Smckusick pc.cp++; 9912080Smckusick tl = pop4(); 9922080Smckusick push4(RSNG4(tl, *pc.lp++)); 9932080Smckusick continue; 9942080Smckusick case O_RSNG24: 9952080Smckusick pc.cp++; 9962080Smckusick tl = pop2(); 9972080Smckusick push2(RSNG4(tl, *pc.lp++)); 9982080Smckusick continue; 9992080Smckusick case O_STLIM: 10002080Smckusick pc.cp++; 10012080Smckusick _stlim = pop4(); 10022080Smckusick _stcnt--; 10032080Smckusick LINO(); 10042080Smckusick continue; 10052080Smckusick case O_LLIMIT: 10062080Smckusick pc.cp++; 10072080Smckusick LLIMIT(); 10082080Smckusick popargs(2); 10092080Smckusick continue; 10102080Smckusick case O_BUFF: 10112080Smckusick BUFF(*pc.cp++); 10122080Smckusick continue; 10132080Smckusick case O_HALT: 10142080Smckusick pc.cp++; 10152080Smckusick panic(PHALT); 10162080Smckusick continue; 10172080Smckusick case O_PXPBUF: 10182080Smckusick pc.cp++; 10192080Smckusick _cntrs = *pc.lp++; 10202080Smckusick _rtns = *pc.lp++; 10212080Smckusick _pcpcount = (long *)calloc(_cntrs + 1, sizeof(long)); 10222080Smckusick continue; 10232080Smckusick case O_COUNT: 10242080Smckusick pc.cp++; 10252080Smckusick _pcpcount[*pc.usp++]++; 10262080Smckusick continue; 10272080Smckusick case O_CASE1OP: 10282080Smckusick tl = *pc.cp++; /* tl = number of cases */ 10292080Smckusick if (tl == 0) 10302080Smckusick tl = *pc.usp++; 10312080Smckusick tsp = pc.sp + tl; /* ptr to end of jump table */ 10322080Smckusick tcp = (char *)tsp; /* tcp = ptr to case values */ 10332080Smckusick tl1 = pop2(); /* tl1 = element to find */ 10342080Smckusick for(; tl > 0; tl--) /* look for element */ 10352080Smckusick if (tl1 == *tcp++) 10362080Smckusick break; 10372080Smckusick if (tl == 0) /* default case => error */ 10382080Smckusick ERROR(ECASE, tl2); 10392080Smckusick pc.cp += *(tsp - tl); 10402080Smckusick continue; 10412080Smckusick case O_CASE2OP: 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 tsp1 = tsp; /* tsp1 = ptr to case values */ 10472080Smckusick tl1 = (unsigned short)pop2();/* tl1 = element to find */ 10482080Smckusick for(; tl > 0; tl--) /* look for element */ 10492080Smckusick if (tl1 == *tsp1++) 10502080Smckusick break; 10512080Smckusick if (tl == 0) /* default case => error */ 10522080Smckusick ERROR(ECASE, tl2); 10532080Smckusick pc.cp += *(tsp - tl); 10542080Smckusick continue; 10552080Smckusick case O_CASE4OP: 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 tlp = (long *)tsp; /* tlp = ptr to case values */ 10612080Smckusick tl1 = pop4(); /* tl1 = element to find */ 10622080Smckusick for(; tl > 0; tl--) /* look for element */ 10632080Smckusick if (tl1 == *tlp++) 10642080Smckusick break; 10652080Smckusick if (tl == 0) /* default case => error */ 10662080Smckusick ERROR(ECASE, tl2); 10672080Smckusick pc.cp += *(tsp - tl); 10682080Smckusick continue; 10692080Smckusick case O_ADDT: 10702080Smckusick tl = *pc.cp++; /* tl has comparison length */ 10712080Smckusick if (tl == 0) 10722080Smckusick tl = *pc.usp++; 10732080Smckusick tcp = pushsp(0); /* tcp pts to first arg */ 10742080Smckusick ADDT(tcp + tl, tcp + tl, tcp, tl >> 2); 10752080Smckusick popsp(tl); 10762080Smckusick continue; 10772080Smckusick case O_SUBT: 10782080Smckusick tl = *pc.cp++; /* tl has comparison length */ 10792080Smckusick if (tl == 0) 10802080Smckusick tl = *pc.usp++; 10812080Smckusick tcp = pushsp(0); /* tcp pts to first arg */ 10822080Smckusick SUBT(tcp + tl, tcp + tl, tcp, tl >> 2); 10832080Smckusick popsp(tl); 10842080Smckusick continue; 10852080Smckusick case O_MULT: 10862080Smckusick tl = *pc.cp++; /* tl has comparison length */ 10872080Smckusick if (tl == 0) 10882080Smckusick tl = *pc.usp++; 10892080Smckusick tcp = pushsp(0); /* tcp pts to first arg */ 10902080Smckusick MULT(tcp + tl, tcp + tl, tcp, tl >> 2); 10912080Smckusick popsp(tl); 10922080Smckusick continue; 10932080Smckusick case O_INCT: 10942080Smckusick tl = *pc.cp++; /* tl has number of args */ 10952080Smckusick if (tl == 0) 10962080Smckusick tl = *pc.usp++; 10972080Smckusick tl1 = INCT(); 10982080Smckusick popargs(tl); 10992080Smckusick push2(tl1); 11002080Smckusick continue; 11012080Smckusick case O_CTTOT: 11022080Smckusick tl = *pc.cp++; /* tl has number of args */ 11032080Smckusick if (tl == 0) 11042080Smckusick tl = *pc.usp++; 11052080Smckusick tl1 = tl * sizeof(long); 11062080Smckusick tcp = pushsp(0) + tl1; /* tcp pts to result space */ 11072080Smckusick CTTOT(tcp); 11082080Smckusick popargs(tl); 11092080Smckusick continue; 11102080Smckusick case O_CARD: 11112080Smckusick tl = *pc.cp++; /* tl has comparison length */ 11122080Smckusick if (tl == 0) 11132080Smckusick tl = *pc.usp++; 11142080Smckusick tcp = pushsp(0); /* tcp pts to set */ 11152080Smckusick tl1 = CARD(tcp, tl); 11162080Smckusick popsp(tl); 11172080Smckusick push2(tl1); 11182080Smckusick continue; 11192080Smckusick case O_IN: 11202080Smckusick tl = *pc.cp++; /* tl has comparison length */ 11212080Smckusick if (tl == 0) 11222080Smckusick tl = *pc.usp++; 11232080Smckusick tl1 = pop4(); /* tl1 is the element */ 11242080Smckusick tcp = pushsp(0); /* tcp pts to set */ 11252080Smckusick tl2 = *pc.usp++; /* lower bound */ 11262080Smckusick tl1 = IN(tl1, tl2, *pc.usp++, tcp); 11272080Smckusick popsp(tl); 11282080Smckusick push2(tl1); 11292080Smckusick continue; 11302080Smckusick case O_ASRT: 11312080Smckusick pc.cp++; 1132*2109Smckusic ASRT(pop2(), ""); 11332080Smckusick continue; 11342080Smckusick case O_FOR1U: 11352080Smckusick pc.cp++; 11362080Smckusick tcp = (char *)pop4(); /* tcp = ptr to index var */ 11372080Smckusick if (*tcp < pop4()) { /* still going up */ 11382080Smckusick *tcp += 1; /* inc index var */ 11392080Smckusick pc.cp += *pc.sp;/* return to top of loop */ 11402080Smckusick continue; 11412080Smckusick } 11422080Smckusick pc.sp++; /* else fall through */ 11432080Smckusick continue; 11442080Smckusick case O_FOR2U: 11452080Smckusick pc.cp++; 11462080Smckusick tsp = (short *)pop4(); /* tsp = ptr to index var */ 11472080Smckusick if (*tsp < pop4()) { /* still going up */ 11482080Smckusick *tsp += 1; /* inc index var */ 11492080Smckusick pc.cp += *pc.sp;/* return to top of loop */ 11502080Smckusick continue; 11512080Smckusick } 11522080Smckusick pc.sp++; /* else fall through */ 11532080Smckusick continue; 11542080Smckusick case O_FOR4U: 11552080Smckusick pc.cp++; 11562080Smckusick tlp = (long *)pop4(); /* tlp = ptr to index var */ 11572080Smckusick if (*tlp < pop4()) { /* still going up */ 11582080Smckusick *tlp += 1; /* inc index var */ 11592080Smckusick pc.cp += *pc.sp;/* return to top of loop */ 11602080Smckusick continue; 11612080Smckusick } 11622080Smckusick pc.sp++; /* else fall through */ 11632080Smckusick continue; 11642080Smckusick case O_FOR1D: 11652080Smckusick pc.cp++; 11662080Smckusick tcp = (char *)pop4(); /* tcp = ptr to index var */ 11672080Smckusick if (*tcp > pop4()) { /* still going down */ 11682080Smckusick *tcp -= 1; /* dec index var */ 11692080Smckusick pc.cp += *pc.sp;/* return to top of loop */ 11702080Smckusick continue; 11712080Smckusick } 11722080Smckusick pc.sp++; /* else fall through */ 11732080Smckusick continue; 11742080Smckusick case O_FOR2D: 11752080Smckusick pc.cp++; 11762080Smckusick tsp = (short *)pop4(); /* tsp = ptr to index var */ 11772080Smckusick if (*tsp > pop4()) { /* still going down */ 11782080Smckusick *tsp -= 1; /* dec index var */ 11792080Smckusick pc.cp += *pc.sp;/* return to top of loop */ 11802080Smckusick continue; 11812080Smckusick } 11822080Smckusick pc.sp++; /* else fall through */ 11832080Smckusick continue; 11842080Smckusick case O_FOR4D: 11852080Smckusick pc.cp++; 11862080Smckusick tlp = (long *)pop4(); /* tlp = ptr to index var */ 11872080Smckusick if (*tlp > pop4()) { /* still going down */ 11882080Smckusick *tlp -= 1; /* dec index var */ 11892080Smckusick pc.cp += *pc.sp;/* return to top of loop */ 11902080Smckusick continue; 11912080Smckusick } 11922080Smckusick pc.sp++; /* else fall through */ 11932080Smckusick continue; 11942080Smckusick case O_READE: 11952080Smckusick pc.cp++; 11962080Smckusick push2(READE(curfile, base + *pc.lp++)); 11972080Smckusick continue; 11982080Smckusick case O_READ4: 11992080Smckusick pc.cp++; 12002080Smckusick push4(READ4(curfile)); 12012080Smckusick continue; 12022080Smckusick case O_READC: 12032080Smckusick pc.cp++; 12042080Smckusick push2(READC(curfile)); 12052080Smckusick continue; 12062080Smckusick case O_READ8: 12072080Smckusick pc.cp++; 12082080Smckusick push8(READ8(curfile)); 12092080Smckusick continue; 12102080Smckusick case O_READLN: 12112080Smckusick pc.cp++; 12122080Smckusick READLN(curfile); 12132080Smckusick continue; 12142080Smckusick case O_EOF: 12152080Smckusick pc.cp++; 12162080Smckusick push2(TEOF(popaddr())); 12172080Smckusick continue; 12182080Smckusick case O_EOLN: 12192080Smckusick pc.cp++; 12202080Smckusick push2(TEOLN(popaddr())); 12212080Smckusick continue; 12222080Smckusick case O_WRITEC: 12232080Smckusick pc.cp++; 12242080Smckusick WRITEC(curfile); 12252080Smckusick popargs(2); 12262080Smckusick continue; 12272080Smckusick case O_WRITES: 12282080Smckusick pc.cp++; 12292080Smckusick WRITES(curfile); 12302080Smckusick popargs(4); 12312080Smckusick continue; 12322080Smckusick case O_WRITEF: 12332080Smckusick WRITEF(curfile); 12342080Smckusick popargs(*pc.cp++); 12352080Smckusick continue; 12362080Smckusick case O_WRITLN: 12372080Smckusick pc.cp++; 12382080Smckusick WRITLN(curfile); 12392080Smckusick continue; 12402080Smckusick case O_PAGE: 12412080Smckusick pc.cp++; 12422080Smckusick PAGE(curfile); 12432080Smckusick continue; 12442080Smckusick case O_NAM: 12452080Smckusick pc.cp++; 12462080Smckusick tl = pop4(); 12472080Smckusick pushaddr(NAM(tl, base + *pc.lp++)); 12482080Smckusick continue; 12492080Smckusick case O_MAX: 12502080Smckusick tl = *pc.cp++; 12512080Smckusick if (tl == 0) 12522080Smckusick tl = *pc.usp++; 12532080Smckusick tl1 = pop4(); 12542080Smckusick push4(MAX(tl1, tl, *pc.usp++)); 12552080Smckusick continue; 12562080Smckusick case O_MIN: 12572080Smckusick tl = *pc.cp++; 12582080Smckusick if (tl == 0) 12592080Smckusick tl = *pc.usp++; 12602080Smckusick tl1 = pop4(); 12612080Smckusick push4(tl1 < tl ? tl1 : tl); 12622080Smckusick continue; 12632080Smckusick case O_UNIT: 12642080Smckusick pc.cp++; 12652080Smckusick curfile = UNIT(popaddr()); 12662080Smckusick continue; 12672080Smckusick case O_UNITINP: 12682080Smckusick pc.cp++; 12692080Smckusick curfile = INPUT; 12702080Smckusick continue; 12712080Smckusick case O_UNITOUT: 12722080Smckusick pc.cp++; 12732080Smckusick curfile = OUTPUT; 12742080Smckusick continue; 12752080Smckusick case O_MESSAGE: 12762080Smckusick pc.cp++; 12772080Smckusick PFLUSH(); 12782080Smckusick curfile = ERR; 12792080Smckusick continue; 1280*2109Smckusic case O_PUT: 1281*2109Smckusic pc.cp++; 1282*2109Smckusic PUT(curfile); 1283*2109Smckusic continue; 12842080Smckusick case O_GET: 12852080Smckusick pc.cp++; 12862080Smckusick GET(curfile); 12872080Smckusick continue; 12882080Smckusick case O_FNIL: 12892080Smckusick pc.cp++; 12902080Smckusick pushaddr(FNIL(popaddr())); 12912080Smckusick continue; 12922080Smckusick case O_DEFNAME: 12932080Smckusick pc.cp++; 12942080Smckusick DEFNAME(); 12952080Smckusick popargs(4); 12962080Smckusick continue; 12972080Smckusick case O_RESET: 12982080Smckusick pc.cp++; 12992080Smckusick RESET(); 13002080Smckusick popargs(4); 13012080Smckusick continue; 13022080Smckusick case O_REWRITE: 13032080Smckusick pc.cp++; 13042080Smckusick REWRITE(); 13052080Smckusick popargs(4); 13062080Smckusick continue; 13072080Smckusick case O_FILE: 13082080Smckusick pc.cp++; 13092080Smckusick pushaddr(ACTFILE(curfile)); 13102080Smckusick continue; 13112080Smckusick case O_REMOVE: 13122080Smckusick pc.cp++; 13132080Smckusick REMOVE(); 13142080Smckusick popargs(2); 13152080Smckusick continue; 13162080Smckusick case O_FLUSH: 13172080Smckusick pc.cp++; 13182080Smckusick FLUSH(); 13192080Smckusick popargs(1); 13202080Smckusick continue; 13212080Smckusick case O_PACK: 13222080Smckusick pc.cp++; 13232080Smckusick PACK(); 13242080Smckusick popargs(7); 13252080Smckusick continue; 13262080Smckusick case O_UNPACK: 13272080Smckusick pc.cp++; 13282080Smckusick UNPACK(); 13292080Smckusick popargs(7); 13302080Smckusick continue; 13312080Smckusick case O_ARGC: 13322080Smckusick pc.cp++; 13332080Smckusick push4(_argc); 13342080Smckusick continue; 13352080Smckusick case O_ARGV: 13362080Smckusick tl = *pc.cp++; /* tl = size of char array */ 13372080Smckusick if (tl == 0) 13382080Smckusick tl = *pc.usp++; 13392080Smckusick tcp = popaddr(); /* tcp = addr of char array */ 13402080Smckusick tl1 = pop4(); /* tl1 = argv subscript */ 13412080Smckusick ARGV(tl1, tcp, tl); 13422080Smckusick continue; 13432080Smckusick case O_CLCK: 13442080Smckusick pc.cp++; 13452080Smckusick push4(CLCK()); 13462080Smckusick continue; 13472080Smckusick case O_WCLCK: 13482080Smckusick pc.cp++; 13492080Smckusick push4(time(0)); 13502080Smckusick continue; 13512080Smckusick case O_SCLCK: 13522080Smckusick pc.cp++; 13532080Smckusick push4(SCLCK()); 13542080Smckusick continue; 13552080Smckusick case O_DISPOSE: 13562080Smckusick tl = *pc.cp++; /* tl = size being disposed */ 13572080Smckusick if (tl == 0) 13582080Smckusick tl = *pc.usp++; 13592080Smckusick tcp = popaddr(); /* ptr to ptr being disposed */ 13602080Smckusick DISPOSE(tcp, tl); 13612080Smckusick *(char **)tcp = (char *)0; 13622080Smckusick continue; 13632080Smckusick case O_NEW: 13642080Smckusick tl = *pc.cp++; /* tl = size being new'ed */ 13652080Smckusick if (tl == 0) 13662080Smckusick tl = *pc.usp++; 13672080Smckusick tcp = popaddr(); /* ptr to ptr being new'ed */ 13682080Smckusick NEWZ(tcp, tl); 13692080Smckusick continue; 13702080Smckusick case O_DATE: 13712080Smckusick pc.cp++; 13722080Smckusick DATE(popaddr()); 13732080Smckusick continue; 13742080Smckusick case O_TIME: 13752080Smckusick pc.cp++; 13762080Smckusick TIME(popaddr()); 13772080Smckusick continue; 13782080Smckusick case O_UNDEF: 13792080Smckusick pc.cp++; 13802080Smckusick pop8(); 13812080Smckusick push2(0); 13822080Smckusick continue; 13832080Smckusick case O_ATAN: 13842080Smckusick pc.cp++; 13852080Smckusick push8(atan(pop8())); 13862080Smckusick continue; 13872080Smckusick case O_COS: 13882080Smckusick pc.cp++; 13892080Smckusick push8(cos(pop8())); 13902080Smckusick continue; 13912080Smckusick case O_EXP: 13922080Smckusick pc.cp++; 13932080Smckusick push8(exp(pop8())); 13942080Smckusick continue; 13952080Smckusick case O_LN: 13962080Smckusick pc.cp++; 13972080Smckusick push8(LN(pop8())); 13982080Smckusick continue; 13992080Smckusick case O_SIN: 14002080Smckusick pc.cp++; 14012080Smckusick push8(sin(pop8())); 14022080Smckusick continue; 14032080Smckusick case O_SQRT: 14042080Smckusick pc.cp++; 14052080Smckusick push8(SQRT(pop8())); 14062080Smckusick continue; 14072080Smckusick case O_CHR2: 14082080Smckusick case O_CHR4: 14092080Smckusick pc.cp++; 14102080Smckusick push2(CHR(pop4())); 14112080Smckusick continue; 14122080Smckusick case O_ODD2: 14132080Smckusick case O_ODD4: 14142080Smckusick pc.cp++; 14152080Smckusick push2(pop4() & 1); 14162080Smckusick continue; 14172080Smckusick case O_SUCC2: 1418*2109Smckusic tl = *pc.cp++; 1419*2109Smckusic if (tl == 0) 1420*2109Smckusic tl = *pc.sp++; 1421*2109Smckusic tl1 = pop4(); 1422*2109Smckusic push2(SUCC(tl1, tl, *pc.sp++)); 14232080Smckusick continue; 14242080Smckusick case O_SUCC24: 1425*2109Smckusic tl = *pc.cp++; 1426*2109Smckusic if (tl == 0) 1427*2109Smckusic tl = *pc.sp++; 1428*2109Smckusic tl1 = pop4(); 1429*2109Smckusic push4(SUCC(tl1, tl, *pc.sp++)); 1430*2109Smckusic continue; 14312080Smckusick case O_SUCC4: 1432*2109Smckusic tl = *pc.cp++; 1433*2109Smckusic if (tl == 0) 1434*2109Smckusic tl = *pc.lp++; 1435*2109Smckusic tl1 = pop4(); 1436*2109Smckusic push4(SUCC(tl1, tl, *pc.lp++)); 14372080Smckusick continue; 14382080Smckusick case O_PRED2: 1439*2109Smckusic tl = *pc.cp++; 1440*2109Smckusic if (tl == 0) 1441*2109Smckusic tl = *pc.sp++; 1442*2109Smckusic tl1 = pop4(); 1443*2109Smckusic push2(PRED(tl1, tl, *pc.sp++)); 14442080Smckusick continue; 14452080Smckusick case O_PRED24: 1446*2109Smckusic tl = *pc.cp++; 1447*2109Smckusic if (tl == 0) 1448*2109Smckusic tl = *pc.sp++; 1449*2109Smckusic tl1 = pop4(); 1450*2109Smckusic push4(PRED(tl1, tl, *pc.sp++)); 1451*2109Smckusic continue; 14522080Smckusick case O_PRED4: 1453*2109Smckusic tl = *pc.cp++; 1454*2109Smckusic if (tl == 0) 1455*2109Smckusic tl = *pc.lp++; 1456*2109Smckusic tl1 = pop4(); 1457*2109Smckusic push4(PRED(tl1, tl, *pc.lp++)); 14582080Smckusick continue; 14592080Smckusick case O_SEED: 14602080Smckusick pc.cp++; 14612080Smckusick push4(SEED(pop4())); 14622080Smckusick continue; 14632080Smckusick case O_RANDOM: 14642080Smckusick pc.cp++; 14652080Smckusick push8(RANDOM(pop8())); 14662080Smckusick continue; 14672080Smckusick case O_EXPO: 14682080Smckusick pc.cp++; 14692080Smckusick push4(EXPO(pop8())); 14702080Smckusick continue; 14712080Smckusick case O_SQR2: 14722080Smckusick case O_SQR4: 14732080Smckusick pc.cp++; 14742080Smckusick tl = pop4(); 14752080Smckusick push4(tl * tl); 14762080Smckusick continue; 14772080Smckusick case O_SQR8: 14782080Smckusick pc.cp++; 14792080Smckusick td = pop8(); 14802080Smckusick push8(td * td); 14812080Smckusick continue; 14822080Smckusick case O_ROUND: 14832080Smckusick pc.cp++; 14842080Smckusick push4(ROUND(pop8())); 14852080Smckusick continue; 14862080Smckusick case O_TRUNC: 14872080Smckusick pc.cp++; 14882080Smckusick push4(TRUNC(pop8())); 14892080Smckusick continue; 14902080Smckusick } 14912080Smckusick } 14922080Smckusick } 1493