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