xref: /csrg-svn/usr.bin/pascal/px/interp.c (revision 10792)
12080Smckusick /* Copyright (c) 1979 Regents of the University of California */
22080Smckusick 
3*10792Smckusick static char sccsid[] = "@(#)interp.c 1.30 02/09/83";
42080Smckusick 
52080Smckusick #include <math.h>
610576Smckusick #include <signal.h>
72950Smckusic #include "whoami.h"
810576Smckusick #include "vars.h"
92950Smckusic #include "objfmt.h"
102080Smckusick #include "h02opcs.h"
112080Smckusick #include "machdep.h"
122080Smckusick #include "libpc.h"
132080Smckusick 
142080Smckusick /*
152080Smckusick  * program variables
162080Smckusick  */
1710576Smckusick union display _display;
1810576Smckusick struct dispsave	*_dp;
192080Smckusick long	_lino = 0;
202080Smckusick int	_argc;
212080Smckusick char	**_argv;
222080Smckusick long	_mode;
2310576Smckusick long	_runtst = (long)TRUE;
242950Smckusic bool	_nodump = FALSE;
252080Smckusick long	_stlim = 500000;
262080Smckusick long	_stcnt = 0;
272191Smckusic long	_seed = 1;
2810576Smckusick #ifdef ADDR32
292080Smckusick char	*_minptr = (char *)0x7fffffff;
3010576Smckusick #endif ADDR32
3110576Smckusick #ifdef ADDR16
322950Smckusic char	*_minptr = (char *)0xffff;
3310576Smckusick #endif ADDR16
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;
432950Smckusic struct iorechd	_err = {
442950Smckusic 	&_errwin,		/* fileptr */
452080Smckusick 	0,			/* lcount  */
462080Smckusick 	0x7fffffff,		/* llimit  */
472950Smckusic 	&_iob[2],		/* fbuf    */
482950Smckusic 	FILNIL,			/* fchain  */
492080Smckusick 	STDLVL,			/* flev    */
502950Smckusic 	"Message file",		/* pfname  */
512950Smckusic 	FTEXT | FWRITE | EOFF,	/* funit   */
522950Smckusic 	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 };
672950Smckusic struct iorechd	input = {
682950Smckusic 	&_inwin,		/* fileptr */
692080Smckusick 	0,			/* lcount  */
702080Smckusick 	0x7fffffff,		/* llimit  */
712950Smckusic 	&_iob[0],		/* fbuf    */
722950Smckusic 	OUTPUT,			/* fchain  */
732080Smckusick 	STDLVL,			/* flev    */
742950Smckusic 	"standard input",	/* pfname  */
757569Smckusick 	FTEXT|FREAD|SYNC|EOLN,	/* funit   */
762950Smckusic 	0,			/* fblk    */
772080Smckusick 	1			/* fsize   */
782080Smckusick };
792080Smckusick 
802109Smckusic /*
812950Smckusic  * file record variables
822950Smckusic  */
832950Smckusic long		_filefre = PREDEF;
842950Smckusic struct iorechd	_fchain = {
852950Smckusic 	0, 0, 0, 0,		/* only use fchain field */
862950Smckusic 	INPUT			/* fchain  */
872950Smckusic };
882950Smckusic struct iorec	*_actfile[MAXFILES] = {
892950Smckusic 	INPUT,
902950Smckusic 	OUTPUT,
912950Smckusic 	ERR
922950Smckusic };
932950Smckusic 
942950Smckusic /*
955658Slinton  * stuff for pdx
965658Slinton  */
975658Slinton 
985658Slinton union progcntr *pcaddrp;
995658Slinton asm(".globl _loopaddr");
1005658Slinton 
1015658Slinton /*
1022109Smckusic  * Px profile array
1032109Smckusic  */
1042109Smckusic #ifdef PROFILE
1052109Smckusic long _profcnts[NUMOPS];
1062109Smckusic #endif PROFILE
1072109Smckusic 
1082109Smckusic /*
1092109Smckusic  * debugging variables
1102109Smckusic  */
1112109Smckusic #ifdef DEBUG
1122109Smckusic char opc[10];
1132109Smckusic long opcptr = 9;
1142109Smckusic #endif DEBUG
1152109Smckusic 
1162080Smckusick interpreter(base)
1172080Smckusick 	char *base;
1182080Smckusick {
1192080Smckusick 	union progcntr pc;		/* interpreted program cntr */
1202080Smckusick 	register char *vpc;		/* register used for "pc" */
1212080Smckusick 	struct iorec *curfile;		/* active file */
12210576Smckusick 	register struct blockmark *stp;	/* active stack frame ptr */
1232080Smckusick 	/*
1242080Smckusick 	 * the following variables are used as scratch
1252080Smckusick 	 */
1262239Smckusic 	register char *tcp;
12710576Smckusick 	register short *tsp;
1282239Smckusic 	register long tl, tl1, tl2;
1292080Smckusick 	double td, td1;
1302239Smckusic 	struct sze8 t8;
13110576Smckusick 	register short *tsp1;
1322080Smckusick 	long *tlp;
13310576Smckusick 	char *tcp1;
1342950Smckusic 	bool tb;
13510576Smckusick 	struct blockmark *tstp;
13610576Smckusick 	register struct formalrtn *tfp;
1372080Smckusick 	union progcntr tpc;
1382080Smckusick 	struct iorec **ip;
139*10792Smckusick 	int mypid;
1402080Smckusick 
1415658Slinton 	pcaddrp = &pc;
142*10792Smckusick 	mypid = getpid();
1435658Slinton 
1442080Smckusick 	/*
1452239Smckusic 	 * Setup sets up any hardware specific parameters before
1462239Smckusic 	 * starting the interpreter. Typically this is inline replaced
1472239Smckusic 	 * by interp.sed to utilize specific machine instructions.
1482239Smckusic 	 */
1492239Smckusic 	 setup();
1502239Smckusic 	/*
1512080Smckusick 	 * necessary only on systems which do not initialize
1522080Smckusick 	 * memory to zero
1532080Smckusick 	 */
1542080Smckusick 	for (ip = &_actfile[3]; ip < &_actfile[MAXFILES]; *ip++ = FILNIL)
1552080Smckusick 		/* void */;
1562080Smckusick 	/*
1572080Smckusick 	 * set up global environment, then ``call'' the main program
1582080Smckusick 	 */
1592950Smckusic 	_display.frame[0].locvars = pushsp((long)(2 * sizeof(struct iorec *)));
1602950Smckusic 	_display.frame[0].locvars += 2 * sizeof(struct iorec *);
1612950Smckusic 	*(struct iorec **)(_display.frame[0].locvars + OUTPUT_OFF) = OUTPUT;
1622950Smckusic 	*(struct iorec **)(_display.frame[0].locvars + INPUT_OFF) = INPUT;
16310576Smckusick 	stp = (struct blockmark *)pushsp((long)(sizeof(struct blockmark)));
1642109Smckusic 	_dp = &_display.frame[0];
1652080Smckusick 	pc.cp = base;
1665658Slinton 
1675658Slinton 	asm("_loopaddr:");
1682080Smckusick 	for(;;) {
1692109Smckusic #		ifdef DEBUG
1702080Smckusick 		if (++opcptr == 10)
1712080Smckusick 			opcptr = 0;
1722080Smckusick 		opc[opcptr] = *pc.ucp;
1732109Smckusic #		endif DEBUG
1742109Smckusic #		ifdef PROFILE
1752109Smckusic 		_profcnts[*pc.ucp]++;
1762109Smckusic #		endif PROFILE
1772080Smckusick 		switch (*pc.ucp++) {
1785658Slinton 		case O_BPT:			/* breakpoint trap */
1795873Slinton 			PFLUSH();
180*10792Smckusick 			kill(mypid, SIGILL);
1815658Slinton 			pc.ucp--;
1825658Slinton 			continue;
1832080Smckusick 		case O_NODUMP:
1842191Smckusic 			_nodump = TRUE;
1852080Smckusick 			/* and fall through */
1862080Smckusick 		case O_BEG:
1872080Smckusick 			_dp += 1;		/* enter local scope */
1882080Smckusick 			stp->odisp = *_dp;	/* save old display value */
1892080Smckusick 			tl = *pc.ucp++;		/* tl = name size */
1902080Smckusick 			stp->entry = pc.hdrp;	/* pointer to entry info */
1912191Smckusic 			tl1 = pc.hdrp->framesze;/* tl1 = size of frame */
1922191Smckusic 			_lino = pc.hdrp->offset;
1932191Smckusic 			_runtst = pc.hdrp->tests;
1942191Smckusic 			disableovrflo();
1952191Smckusic 			if (_runtst)
1962191Smckusic 				enableovrflo();
1972950Smckusic 			pc.cp += (int)tl;	/* skip over proc hdr info */
1982080Smckusick 			stp->file = curfile;	/* save active file */
1992080Smckusick 			tcp = pushsp(tl1);	/* tcp = new top of stack */
2002950Smckusic 			if (_runtst)		/* zero stack frame */
2019231Smckusick 				blkclr(tcp, tl1);
2022950Smckusic 			tcp += (int)tl1;	/* offsets of locals are neg */
2032109Smckusic 			_dp->locvars = tcp;	/* set new display pointer */
2042109Smckusic 			_dp->stp = stp;
2052950Smckusic 			stp->tos = pushsp((long)0); /* set tos pointer */
2062080Smckusick 			continue;
2072080Smckusick 		case O_END:
2082080Smckusick 			PCLOSE(_dp->locvars);	/* flush & close local files */
2092080Smckusick 			stp = _dp->stp;
2102080Smckusick 			curfile = stp->file;	/* restore old active file */
2112080Smckusick 			*_dp = stp->odisp;	/* restore old display entry */
2122109Smckusic 			if (_dp == &_display.frame[1])
2132080Smckusick 				return;		/* exiting main proc ??? */
2142080Smckusick 			_lino = stp->lino;	/* restore lino, pc, dp */
21510576Smckusick 			pc.cp = stp->pc;
2162080Smckusick 			_dp = stp->dp;
2172191Smckusic 			_runtst = stp->entry->tests;
2182191Smckusic 			disableovrflo();
2192191Smckusic 			if (_runtst)
2202191Smckusic 				enableovrflo();
2212109Smckusic 			popsp(stp->entry->framesze +	/* pop local vars */
22210576Smckusick 			     sizeof(struct blockmark) +	/* pop stack frame */
22310576Smckusick 			     stp->entry->nargs);	/* pop parms */
2242080Smckusick 			continue;
2252080Smckusick 		case O_CALL:
2262080Smckusick 			tl = *pc.cp++;
2272080Smckusick 			tcp = base + *pc.lp++;/* calc new entry point */
2282080Smckusick 			tcp += sizeof(short);
2292080Smckusick 			tcp = base + *(long *)tcp;
23010576Smckusick 			stp = (struct blockmark *)
23110576Smckusick 				pushsp((long)(sizeof(struct blockmark)));
2322080Smckusick 			stp->lino = _lino;	/* save lino, pc, dp */
23310576Smckusick 			stp->pc = pc.cp;
2342080Smckusick 			stp->dp = _dp;
2352109Smckusic 			_dp = &_display.frame[tl]; /* set up new display ptr */
2362080Smckusick 			pc.cp = tcp;
2372080Smckusick 			continue;
2382080Smckusick 		case O_FCALL:
2393294Smckusic 			pc.cp++;
2404016Smckusic  			tcp = popaddr(); /* ptr to display save area */
2412080Smckusick 			tfp = (struct formalrtn *)popaddr();
24210576Smckusick 			stp = (struct blockmark *)
24310576Smckusick 				pushsp((long)(sizeof(struct blockmark)));
2442080Smckusick 			stp->lino = _lino;	/* save lino, pc, dp */
24510576Smckusick 			stp->pc = pc.cp;
2462080Smckusick 			stp->dp = _dp;
24710576Smckusick 			pc.cp = (char *)(tfp->fentryaddr);/* new entry point */
2483436Smckusic 			_dp = &_display.frame[tfp->fbn];/* new display ptr */
2499231Smckusick  			blkcpy(&_display.frame[1], tcp,
25010576Smckusick 				tfp->fbn * sizeof(struct dispsave));
2519231Smckusick 			blkcpy(&tfp->fdisp[0], &_display.frame[1],
25210576Smckusick 				tfp->fbn * sizeof(struct dispsave));
2532080Smckusick 			continue;
2542080Smckusick 		case O_FRTN:
2552080Smckusick 			tl = *pc.cp++;		/* tl = size of return obj */
2562080Smckusick 			if (tl == 0)
2572080Smckusick 				tl = *pc.usp++;
2582950Smckusic 			tcp = pushsp((long)(0));
2592080Smckusick 			tfp = *(struct formalrtn **)(tcp + tl);
2604016Smckusic  			tcp1 = *(char **)
2614016Smckusic  			    (tcp + tl + sizeof(struct formalrtn *));
2623861Smckusic 			if (tl != 0) {
2639231Smckusick 				blkcpy(tcp, tcp + sizeof(struct formalrtn *)
2649231Smckusick 				    + sizeof(char *), tl);
2653861Smckusic 			}
2664016Smckusic  			popsp((long)
2674016Smckusic  			    (sizeof(struct formalrtn *) + sizeof (char *)));
2689231Smckusick  			blkcpy(tcp1, &_display.frame[1],
26910576Smckusick 			    tfp->fbn * sizeof(struct dispsave));
2702080Smckusick 			continue;
2712080Smckusick 		case O_FSAV:
2722080Smckusick 			tfp = (struct formalrtn *)popaddr();
2733436Smckusic 			tfp->fbn = *pc.cp++;	/* blk number of routine */
2743861Smckusic 			tcp = base + *pc.lp++;	/* calc new entry point */
2752080Smckusick 			tcp += sizeof(short);
27610576Smckusick 			tfp->fentryaddr = (long (*)())(base + *(long *)tcp);
2779231Smckusick 			blkcpy(&_display.frame[1], &tfp->fdisp[0],
27810576Smckusick 				tfp->fbn * sizeof(struct dispsave));
2792080Smckusick 			pushaddr(tfp);
2802080Smckusick 			continue;
2812080Smckusick 		case O_SDUP2:
2822080Smckusick 			pc.cp++;
2832080Smckusick 			tl = pop2();
2842950Smckusic 			push2((short)(tl));
2852950Smckusic 			push2((short)(tl));
2862080Smckusick 			continue;
2872080Smckusick 		case O_SDUP4:
2882080Smckusick 			pc.cp++;
2892080Smckusick 			tl = pop4();
2902080Smckusick 			push4(tl);
2912080Smckusick 			push4(tl);
2922080Smckusick 			continue;
2932080Smckusick 		case O_TRA:
2942080Smckusick 			pc.cp++;
2952080Smckusick 			pc.cp += *pc.sp;
2962080Smckusick 			continue;
2972080Smckusick 		case O_TRA4:
2982080Smckusick 			pc.cp++;
2992080Smckusick 			pc.cp = base + *pc.lp;
3002080Smckusick 			continue;
3012080Smckusick 		case O_GOTO:
3022109Smckusic 			tstp = _display.frame[*pc.cp++].stp; /* ptr to
3032109Smckusic 								exit frame */
3042080Smckusick 			pc.cp = base + *pc.lp;
3052080Smckusick 			stp = _dp->stp;
3062080Smckusick 			while (tstp != stp) {
3072109Smckusic 				if (_dp == &_display.frame[1])
3083872Smckusic 					ERROR("Active frame not found in non-local goto\n", 0); /* exiting prog ??? */
3092080Smckusick 				PCLOSE(_dp->locvars); /* close local files */
3102080Smckusick 				curfile = stp->file;  /* restore active file */
3112080Smckusick 				*_dp = stp->odisp;    /* old display entry */
3122080Smckusick 				_dp = stp->dp;	      /* restore dp */
3132080Smckusick 				stp = _dp->stp;
3142080Smckusick 			}
3152080Smckusick 			/* pop locals, stack frame, parms, and return values */
3162950Smckusic 			popsp((long)(stp->tos - pushsp((long)(0))));
3172080Smckusick 			continue;
3182080Smckusick 		case O_LINO:
3192950Smckusic 			if (_dp->stp->tos != pushsp((long)(0)))
3205682Smckusic 				ERROR("Panic: stack not empty between statements\n");
3212080Smckusick 			_lino = *pc.cp++;	/* set line number */
3222080Smckusick 			if (_lino == 0)
3232080Smckusick 				_lino = *pc.sp++;
3242950Smckusic 			if (_runtst) {
3252950Smckusic 				LINO();		/* inc statement count */
3262950Smckusic 				continue;
3272950Smckusic 			}
3282950Smckusic 			_stcnt++;
3292080Smckusick 			continue;
3302080Smckusick 		case O_PUSH:
3312080Smckusick 			tl = *pc.cp++;
3322080Smckusick 			if (tl == 0)
33310188Smckusick 				tl = *pc.lp++;
3342080Smckusick 			tl = (-tl + 1) & ~1;
3352080Smckusick 			tcp = pushsp(tl);
3362950Smckusic 			if (_runtst)
3379231Smckusick 				blkclr(tcp, tl);
3382080Smckusick 			continue;
3392080Smckusick 		case O_IF:
3402080Smckusick 			pc.cp++;
3412191Smckusic 			if (pop2()) {
3422080Smckusick 				pc.sp++;
3432191Smckusic 				continue;
3442191Smckusic 			}
3452191Smckusic 			pc.cp += *pc.sp;
3462080Smckusick 			continue;
3472080Smckusick 		case O_REL2:
3482080Smckusick 			tl = pop2();
3492080Smckusick 			tl1 = pop2();
3502080Smckusick 			goto cmplong;
3512080Smckusick 		case O_REL24:
3522080Smckusick 			tl = pop2();
3532080Smckusick 			tl1 = pop4();
3542080Smckusick 			goto cmplong;
3552080Smckusick 		case O_REL42:
3562080Smckusick 			tl = pop4();
3572080Smckusick 			tl1 = pop2();
3582080Smckusick 			goto cmplong;
3592080Smckusick 		case O_REL4:
3602080Smckusick 			tl = pop4();
3612080Smckusick 			tl1 = pop4();
3622080Smckusick 		cmplong:
3635682Smckusic 			switch (*pc.cp++) {
3642080Smckusick 			case releq:
3652080Smckusick 				push2(tl1 == tl);
3662080Smckusick 				continue;
3672080Smckusick 			case relne:
3682080Smckusick 				push2(tl1 != tl);
3692080Smckusick 				continue;
3702080Smckusick 			case rellt:
3712080Smckusick 				push2(tl1 < tl);
3722080Smckusick 				continue;
3732080Smckusick 			case relgt:
3742080Smckusick 				push2(tl1 > tl);
3752080Smckusick 				continue;
3762080Smckusick 			case relle:
3772080Smckusick 				push2(tl1 <= tl);
3782080Smckusick 				continue;
3792080Smckusick 			case relge:
3802080Smckusick 				push2(tl1 >= tl);
3812080Smckusick 				continue;
3822080Smckusick 			default:
3835682Smckusic 				ERROR("Panic: bad relation %d to REL4*\n",
3845682Smckusic 				    *(pc.cp - 1));
3852080Smckusick 				continue;
3862080Smckusick 			}
3872080Smckusick 		case O_RELG:
3882080Smckusick 			tl2 = *pc.cp++;		/* tc has jump opcode */
3892080Smckusick 			tl = *pc.usp++;		/* tl has comparison length */
3902080Smckusick 			tl1 = (tl + 1) & ~1;	/* tl1 has arg stack length */
3912950Smckusic 			tcp = pushsp((long)(0));/* tcp pts to first arg */
3922080Smckusick 			switch (tl2) {
3932080Smckusick 			case releq:
3942950Smckusic 				tb = RELEQ(tl, tcp + tl1, tcp);
3952080Smckusick 				break;
3962080Smckusick 			case relne:
3972950Smckusic 				tb = RELNE(tl, tcp + tl1, tcp);
3982080Smckusick 				break;
3992080Smckusick 			case rellt:
4002950Smckusic 				tb = RELSLT(tl, tcp + tl1, tcp);
4012080Smckusick 				break;
4022080Smckusick 			case relgt:
4032950Smckusic 				tb = RELSGT(tl, tcp + tl1, tcp);
4042080Smckusick 				break;
4052080Smckusick 			case relle:
4062950Smckusic 				tb = RELSLE(tl, tcp + tl1, tcp);
4072080Smckusick 				break;
4082080Smckusick 			case relge:
4092950Smckusic 				tb = RELSGE(tl, tcp + tl1, tcp);
4102080Smckusick 				break;
4112080Smckusick 			default:
4125682Smckusic 				ERROR("Panic: bad relation %d to RELG*\n", tl2);
4132080Smckusick 				break;
4142080Smckusick 			}
4152080Smckusick 			popsp(tl1 << 1);
4162950Smckusic 			push2((short)(tb));
4172080Smckusick 			continue;
4182080Smckusick 		case O_RELT:
4192080Smckusick 			tl2 = *pc.cp++;		/* tc has jump opcode */
4202080Smckusick 			tl1 = *pc.usp++;	/* tl1 has comparison length */
4212950Smckusic 			tcp = pushsp((long)(0));/* tcp pts to first arg */
4222080Smckusick 			switch (tl2) {
4232080Smckusick 			case releq:
4242950Smckusic 				tb = RELEQ(tl1, tcp + tl1, tcp);
4252080Smckusick 				break;
4262080Smckusick 			case relne:
4272950Smckusic 				tb = RELNE(tl1, tcp + tl1, tcp);
4282080Smckusick 				break;
4292080Smckusick 			case rellt:
4302950Smckusic 				tb = RELTLT(tl1, tcp + tl1, tcp);
4312080Smckusick 				break;
4322080Smckusick 			case relgt:
4332950Smckusic 				tb = RELTGT(tl1, tcp + tl1, tcp);
4342080Smckusick 				break;
4352080Smckusick 			case relle:
4362950Smckusic 				tb = RELTLE(tl1, tcp + tl1, tcp);
4372080Smckusick 				break;
4382080Smckusick 			case relge:
4392950Smckusic 				tb = RELTGE(tl1, tcp + tl1, tcp);
4402080Smckusick 				break;
4412080Smckusick 			default:
4425682Smckusic 				ERROR("Panic: bad relation %d to RELT*\n", tl2);
4432080Smckusick 				break;
4442080Smckusick 			}
4452080Smckusick 			popsp(tl1 << 1);
4462950Smckusic 			push2((short)(tb));
4472080Smckusick 			continue;
4482080Smckusick 		case O_REL28:
4492080Smckusick 			td = pop2();
4502080Smckusick 			td1 = pop8();
4512080Smckusick 			goto cmpdbl;
4522080Smckusick 		case O_REL48:
4532080Smckusick 			td = pop4();
4542080Smckusick 			td1 = pop8();
4552080Smckusick 			goto cmpdbl;
4562080Smckusick 		case O_REL82:
4572080Smckusick 			td = pop8();
4582080Smckusick 			td1 = pop2();
4592080Smckusick 			goto cmpdbl;
4602080Smckusick 		case O_REL84:
4612080Smckusick 			td = pop8();
4622080Smckusick 			td1 = pop4();
4632080Smckusick 			goto cmpdbl;
4642080Smckusick 		case O_REL8:
4652080Smckusick 			td = pop8();
4662080Smckusick 			td1 = pop8();
4672080Smckusick 		cmpdbl:
4682080Smckusick 			switch (*pc.cp++) {
4692080Smckusick 			case releq:
4702080Smckusick 				push2(td1 == td);
4712080Smckusick 				continue;
4722080Smckusick 			case relne:
4732080Smckusick 				push2(td1 != td);
4742080Smckusick 				continue;
4752080Smckusick 			case rellt:
4762080Smckusick 				push2(td1 < td);
4772080Smckusick 				continue;
4782080Smckusick 			case relgt:
4792080Smckusick 				push2(td1 > td);
4802080Smckusick 				continue;
4812080Smckusick 			case relle:
4822080Smckusick 				push2(td1 <= td);
4832080Smckusick 				continue;
4842080Smckusick 			case relge:
4852080Smckusick 				push2(td1 >= td);
4862080Smckusick 				continue;
4872080Smckusick 			default:
4885682Smckusic 				ERROR("Panic: bad relation %d to REL8*\n",
4895682Smckusic 				    *(pc.cp - 1));
4902080Smckusick 				continue;
4912080Smckusick 			}
4922080Smckusick 		case O_AND:
4932080Smckusick 			pc.cp++;
49410576Smckusick 			tl = pop2();
49510576Smckusick 			tl1 = pop2();
49610787Smckusick 			push2(tl1 & tl);
4972080Smckusick 			continue;
4982080Smckusick 		case O_OR:
4992080Smckusick 			pc.cp++;
50010576Smckusick 			tl = pop2();
50110576Smckusick 			tl1 = pop2();
50210787Smckusick 			push2(tl1 | tl);
5032080Smckusick 			continue;
5042080Smckusick 		case O_NOT:
5052080Smckusick 			pc.cp++;
50610576Smckusick 			tl = pop2();
50710576Smckusick 			push2(tl ^ 1);
5082080Smckusick 			continue;
5092080Smckusick 		case O_AS2:
5102080Smckusick 			pc.cp++;
5112080Smckusick 			tl = pop2();
5122080Smckusick 			*(short *)popaddr() = tl;
5132080Smckusick 			continue;
5142080Smckusick 		case O_AS4:
5152080Smckusick 			pc.cp++;
5162080Smckusick 			tl = pop4();
5172080Smckusick 			*(long *)popaddr() = tl;
5182080Smckusick 			continue;
5192080Smckusick 		case O_AS24:
5202080Smckusick 			pc.cp++;
5212080Smckusick 			tl = pop2();
5222080Smckusick 			*(long *)popaddr() = tl;
5232080Smckusick 			continue;
5242080Smckusick 		case O_AS42:
5252080Smckusick 			pc.cp++;
5262080Smckusick 			tl = pop4();
5272080Smckusick 			*(short *)popaddr() = tl;
5282080Smckusick 			continue;
5292080Smckusick 		case O_AS21:
5302080Smckusick 			pc.cp++;
5312080Smckusick 			tl = pop2();
5322080Smckusick 			*popaddr() = tl;
5332080Smckusick 			continue;
5342080Smckusick 		case O_AS41:
5352080Smckusick 			pc.cp++;
5362080Smckusick 			tl = pop4();
5372080Smckusick 			*popaddr() = tl;
5382080Smckusick 			continue;
5392080Smckusick 		case O_AS28:
5402080Smckusick 			pc.cp++;
5412080Smckusick 			tl = pop2();
5422080Smckusick 			*(double *)popaddr() = tl;
5432080Smckusick 			continue;
5442080Smckusick 		case O_AS48:
5452080Smckusick 			pc.cp++;
5462080Smckusick 			tl = pop4();
5472080Smckusick 			*(double *)popaddr() = tl;
5482080Smckusick 			continue;
5492080Smckusick 		case O_AS8:
5502080Smckusick 			pc.cp++;
5512239Smckusic 			t8 = popsze8();
5522239Smckusic 			*(struct sze8 *)popaddr() = t8;
5532080Smckusick 			continue;
5542080Smckusick 		case O_AS:
5552080Smckusick 			tl = *pc.cp++;
5562080Smckusick 			if (tl == 0)
5572080Smckusick 				tl = *pc.usp++;
5582080Smckusick 			tl1 = (tl + 1) & ~1;
5592950Smckusic 			tcp = pushsp((long)(0));
5609231Smckusick 			blkcpy(tcp, *(char **)(tcp + tl1), tl);
5612080Smckusick 			popsp(tl1 + sizeof(char *));
5622080Smckusick 			continue;
5632080Smckusick 		case O_INX2P2:
5642080Smckusick 			tl = *pc.cp++;		/* tl has shift amount */
56510576Smckusick 			tl1 = pop2();
56610576Smckusick 			tl1 = (tl1 - *pc.sp++) << tl;
56710576Smckusick 			tcp = popaddr();
56810576Smckusick 			pushaddr(tcp + tl1);
5692080Smckusick 			continue;
5702080Smckusick 		case O_INX4P2:
5712080Smckusick 			tl = *pc.cp++;		/* tl has shift amount */
57210576Smckusick 			tl1 = pop4();
57310576Smckusick 			tl1 = (tl1 - *pc.sp++) << tl;
57410576Smckusick 			tcp = popaddr();
57510576Smckusick 			pushaddr(tcp + tl1);
5762080Smckusick 			continue;
5772080Smckusick 		case O_INX2:
5782080Smckusick 			tl = *pc.cp++;		/* tl has element size */
5792080Smckusick 			if (tl == 0)
5802080Smckusick 				tl = *pc.usp++;
5812080Smckusick 			tl1 = pop2();		/* index */
5822080Smckusick 			tl2 = *pc.sp++;
58310576Smckusick 			tcp = popaddr();
58410576Smckusick 			pushaddr(tcp + (tl1 - tl2) * tl);
5852191Smckusic 			tl = *pc.usp++;
5862191Smckusic 			if (_runtst)
5872191Smckusic 				SUBSC(tl1, tl2, tl); /* range check */
5882080Smckusick 			continue;
5892080Smckusick 		case O_INX4:
5902080Smckusick 			tl = *pc.cp++;		/* tl has element size */
5912080Smckusick 			if (tl == 0)
5922080Smckusick 				tl = *pc.usp++;
5932080Smckusick 			tl1 = pop4();		/* index */
5942080Smckusick 			tl2 = *pc.sp++;
59510576Smckusick 			tcp = popaddr();
59610576Smckusick 			pushaddr(tcp + (tl1 - tl2) * tl);
5972191Smckusic 			tl = *pc.usp++;
5982191Smckusic 			if (_runtst)
5992191Smckusic 				SUBSC(tl1, tl2, tl); /* range check */
6002080Smckusick 			continue;
6012080Smckusick 		case O_OFF:
6022080Smckusick 			tl = *pc.cp++;
6032080Smckusick 			if (tl == 0)
6042080Smckusick 				tl = *pc.usp++;
60510576Smckusick 			tcp = popaddr();
60610576Smckusick 			pushaddr(tcp + tl);
6072080Smckusick 			continue;
6082080Smckusick 		case O_NIL:
6092080Smckusick 			pc.cp++;
6102080Smckusick 			NIL();
6112080Smckusick 			continue;
6122080Smckusick 		case O_ADD2:
6132080Smckusick 			pc.cp++;
61410576Smckusick 			tl = pop2();
61510576Smckusick 			tl1 = pop2();
61610576Smckusick 			push4(tl1 + tl);
6172080Smckusick 			continue;
6182080Smckusick 		case O_ADD4:
6192080Smckusick 			pc.cp++;
62010576Smckusick 			tl = pop4();
62110576Smckusick 			tl1 = pop4();
62210576Smckusick 			push4(tl1 + tl);
6232080Smckusick 			continue;
6242080Smckusick 		case O_ADD24:
6252080Smckusick 			pc.cp++;
6262080Smckusick 			tl = pop2();
62710576Smckusick 			tl1 = pop4();
62810576Smckusick 			push4(tl1 + tl);
6292080Smckusick 			continue;
6302080Smckusick 		case O_ADD42:
6312080Smckusick 			pc.cp++;
6322080Smckusick 			tl = pop4();
63310576Smckusick 			tl1 = pop2();
63410576Smckusick 			push4(tl1 + tl);
6352080Smckusick 			continue;
6362080Smckusick 		case O_ADD28:
6372080Smckusick 			pc.cp++;
6382080Smckusick 			tl = pop2();
63910576Smckusick 			td = pop8();
64010576Smckusick 			push8(td + tl);
6412080Smckusick 			continue;
6422080Smckusick 		case O_ADD48:
6432080Smckusick 			pc.cp++;
6442080Smckusick 			tl = pop4();
64510576Smckusick 			td = pop8();
64610576Smckusick 			push8(td + tl);
6472080Smckusick 			continue;
6482080Smckusick 		case O_ADD82:
6492080Smckusick 			pc.cp++;
6502080Smckusick 			td = pop8();
65110576Smckusick 			td1 = pop2();
65210576Smckusick 			push8(td1 + td);
6532080Smckusick 			continue;
6542080Smckusick 		case O_ADD84:
6552080Smckusick 			pc.cp++;
6562080Smckusick 			td = pop8();
65710576Smckusick 			td1 = pop4();
65810576Smckusick 			push8(td1 + td);
6592080Smckusick 			continue;
6602080Smckusick 		case O_SUB2:
6612080Smckusick 			pc.cp++;
6622080Smckusick 			tl = pop2();
66310576Smckusick 			tl1 = pop2();
66410576Smckusick 			push4(tl1 - tl);
6652080Smckusick 			continue;
6662080Smckusick 		case O_SUB4:
6672080Smckusick 			pc.cp++;
6682080Smckusick 			tl = pop4();
66910576Smckusick 			tl1 = pop4();
67010576Smckusick 			push4(tl1 - tl);
6712080Smckusick 			continue;
6722080Smckusick 		case O_SUB24:
6732080Smckusick 			pc.cp++;
6742080Smckusick 			tl = pop2();
67510576Smckusick 			tl1 = pop4();
67610576Smckusick 			push4(tl1 - tl);
6772080Smckusick 			continue;
6782080Smckusick 		case O_SUB42:
6792080Smckusick 			pc.cp++;
6802080Smckusick 			tl = pop4();
68110576Smckusick 			tl1 = pop2();
68210576Smckusick 			push4(tl1 - tl);
6832080Smckusick 			continue;
6842080Smckusick 		case O_SUB28:
6852080Smckusick 			pc.cp++;
6862080Smckusick 			tl = pop2();
68710576Smckusick 			td = pop8();
68810576Smckusick 			push8(td - tl);
6892080Smckusick 			continue;
6902080Smckusick 		case O_SUB48:
6912080Smckusick 			pc.cp++;
6922080Smckusick 			tl = pop4();
69310576Smckusick 			td = pop8();
69410576Smckusick 			push8(td - tl);
6952080Smckusick 			continue;
6962080Smckusick 		case O_SUB82:
6972080Smckusick 			pc.cp++;
6982080Smckusick 			td = pop8();
69910576Smckusick 			td1 = pop2();
70010576Smckusick 			push8(td1 - td);
7012080Smckusick 			continue;
7022080Smckusick 		case O_SUB84:
7032080Smckusick 			pc.cp++;
7042080Smckusick 			td = pop8();
70510576Smckusick 			td1 = pop4();
70610576Smckusick 			push8(td1 - td);
7072080Smckusick 			continue;
7082080Smckusick 		case O_MUL2:
7092080Smckusick 			pc.cp++;
71010576Smckusick 			tl = pop2();
71110576Smckusick 			tl1 = pop2();
71210576Smckusick 			push4(tl1 * tl);
7132080Smckusick 			continue;
7142080Smckusick 		case O_MUL4:
7152080Smckusick 			pc.cp++;
71610576Smckusick 			tl = pop4();
71710576Smckusick 			tl1 = pop4();
71810576Smckusick 			push4(tl1 * tl);
7192080Smckusick 			continue;
7202080Smckusick 		case O_MUL24:
7212080Smckusick 			pc.cp++;
7222080Smckusick 			tl = pop2();
72310576Smckusick 			tl1 = pop4();
72410576Smckusick 			push4(tl1 * tl);
7252080Smckusick 			continue;
7262080Smckusick 		case O_MUL42:
7272080Smckusick 			pc.cp++;
7282080Smckusick 			tl = pop4();
72910576Smckusick 			tl1 = pop2();
73010576Smckusick 			push4(tl1 * tl);
7312080Smckusick 			continue;
7322080Smckusick 		case O_MUL28:
7332080Smckusick 			pc.cp++;
7342080Smckusick 			tl = pop2();
73510576Smckusick 			td = pop8();
73610576Smckusick 			push8(td * tl);
7372080Smckusick 			continue;
7382080Smckusick 		case O_MUL48:
7392080Smckusick 			pc.cp++;
7402080Smckusick 			tl = pop4();
74110576Smckusick 			td = pop8();
74210576Smckusick 			push8(td * tl);
7432080Smckusick 			continue;
7442080Smckusick 		case O_MUL82:
7452080Smckusick 			pc.cp++;
7462080Smckusick 			td = pop8();
74710576Smckusick 			td1 = pop2();
74810576Smckusick 			push8(td1 * td);
7492080Smckusick 			continue;
7502080Smckusick 		case O_MUL84:
7512080Smckusick 			pc.cp++;
7522080Smckusick 			td = pop8();
75310576Smckusick 			td1 = pop4();
75410576Smckusick 			push8(td1 * td);
7552080Smckusick 			continue;
7562080Smckusick 		case O_ABS2:
7572080Smckusick 		case O_ABS4:
7582080Smckusick 			pc.cp++;
7592080Smckusick 			tl = pop4();
7602080Smckusick 			push4(tl >= 0 ? tl : -tl);
7612080Smckusick 			continue;
7622080Smckusick 		case O_ABS8:
7632080Smckusick 			pc.cp++;
7642080Smckusick 			td = pop8();
7652080Smckusick 			push8(td >= 0.0 ? td : -td);
7662080Smckusick 			continue;
7672080Smckusick 		case O_NEG2:
7682080Smckusick 			pc.cp++;
7692950Smckusic 			push4((long)(-pop2()));
7702080Smckusick 			continue;
7712080Smckusick 		case O_NEG4:
7722080Smckusick 			pc.cp++;
7732080Smckusick 			push4(-pop4());
7742080Smckusick 			continue;
7752080Smckusick 		case O_NEG8:
7762080Smckusick 			pc.cp++;
7772080Smckusick 			push8(-pop8());
7782080Smckusick 			continue;
7792080Smckusick 		case O_DIV2:
7802080Smckusick 			pc.cp++;
7812080Smckusick 			tl = pop2();
78210576Smckusick 			tl1 = pop2();
78310576Smckusick 			push4(tl1 / tl);
7842080Smckusick 			continue;
7852080Smckusick 		case O_DIV4:
7862080Smckusick 			pc.cp++;
7872080Smckusick 			tl = pop4();
78810576Smckusick 			tl1 = pop4();
78910576Smckusick 			push4(tl1 / tl);
7902080Smckusick 			continue;
7912080Smckusick 		case O_DIV24:
7922080Smckusick 			pc.cp++;
7932080Smckusick 			tl = pop2();
79410576Smckusick 			tl1 = pop4();
79510576Smckusick 			push4(tl1 / tl);
7962080Smckusick 			continue;
7972080Smckusick 		case O_DIV42:
7982080Smckusick 			pc.cp++;
7992080Smckusick 			tl = pop4();
80010576Smckusick 			tl1 = pop2();
80110576Smckusick 			push4(tl1 / tl);
8022080Smckusick 			continue;
8032080Smckusick 		case O_MOD2:
8042080Smckusick 			pc.cp++;
8052080Smckusick 			tl = pop2();
80610576Smckusick 			tl1 = pop2();
80710576Smckusick 			push4(tl1 % tl);
8082080Smckusick 			continue;
8092080Smckusick 		case O_MOD4:
8102080Smckusick 			pc.cp++;
8112080Smckusick 			tl = pop4();
81210576Smckusick 			tl1 = pop4();
81310576Smckusick 			push4(tl1 % tl);
8142080Smckusick 			continue;
8152080Smckusick 		case O_MOD24:
8162080Smckusick 			pc.cp++;
8172080Smckusick 			tl = pop2();
81810576Smckusick 			tl1 = pop4();
81910576Smckusick 			push4(tl1 % tl);
8202080Smckusick 			continue;
8212080Smckusick 		case O_MOD42:
8222080Smckusick 			pc.cp++;
8232080Smckusick 			tl = pop4();
82410576Smckusick 			tl1 = pop2();
82510576Smckusick 			push4(tl1 % tl);
8262080Smckusick 			continue;
8272080Smckusick 		case O_ADD8:
8282080Smckusick 			pc.cp++;
82910576Smckusick 			td = pop8();
83010576Smckusick 			td1 = pop8();
83110787Smckusick 			push8(td1 + td);
8322080Smckusick 			continue;
8332080Smckusick 		case O_SUB8:
8342080Smckusick 			pc.cp++;
8352080Smckusick 			td = pop8();
83610576Smckusick 			td1 = pop8();
83710787Smckusick 			push8(td1 - td);
8382080Smckusick 			continue;
8392080Smckusick 		case O_MUL8:
8402080Smckusick 			pc.cp++;
84110576Smckusick 			td = pop8();
84210576Smckusick 			td1 = pop8();
84310787Smckusick 			push8(td1 * td);
8442080Smckusick 			continue;
8452080Smckusick 		case O_DVD8:
8462080Smckusick 			pc.cp++;
8472080Smckusick 			td = pop8();
84810576Smckusick 			td1 = pop8();
84910787Smckusick 			push8(td1 / td);
8502080Smckusick 			continue;
8512080Smckusick 		case O_STOI:
8522080Smckusick 			pc.cp++;
8532950Smckusic 			push4((long)(pop2()));
8542080Smckusick 			continue;
8552080Smckusick 		case O_STOD:
8562080Smckusick 			pc.cp++;
8572080Smckusick 			td = pop2();
8582080Smckusick 			push8(td);
8592080Smckusick 			continue;
8602080Smckusick 		case O_ITOD:
8612080Smckusick 			pc.cp++;
8622080Smckusick 			td = pop4();
8632080Smckusick 			push8(td);
8642080Smckusick 			continue;
8652080Smckusick 		case O_ITOS:
8662080Smckusick 			pc.cp++;
8672950Smckusic 			push2((short)(pop4()));
8682080Smckusick 			continue;
8692080Smckusick 		case O_DVD2:
8702080Smckusick 			pc.cp++;
8712080Smckusick 			td = pop2();
87210576Smckusick 			td1 = pop2();
87310576Smckusick 			push8(td1 / td);
8742080Smckusick 			continue;
8752080Smckusick 		case O_DVD4:
8762080Smckusick 			pc.cp++;
8772080Smckusick 			td = pop4();
87810576Smckusick 			td1 = pop4();
87910576Smckusick 			push8(td1 / td);
8802080Smckusick 			continue;
8812080Smckusick 		case O_DVD24:
8822080Smckusick 			pc.cp++;
8832080Smckusick 			td = pop2();
88410576Smckusick 			td1 = pop4();
88510576Smckusick 			push8(td1 / td);
8862080Smckusick 			continue;
8872080Smckusick 		case O_DVD42:
8882080Smckusick 			pc.cp++;
8892080Smckusick 			td = pop4();
89010576Smckusick 			td1 = pop2();
89110576Smckusick 			push8(td1 / td);
8922080Smckusick 			continue;
8932080Smckusick 		case O_DVD28:
8942080Smckusick 			pc.cp++;
8952080Smckusick 			td = pop2();
89610576Smckusick 			td1 = pop8();
89710576Smckusick 			push8(td1 / td);
8982080Smckusick 			continue;
8992080Smckusick 		case O_DVD48:
9002080Smckusick 			pc.cp++;
90110787Smckusick 			td = pop4();
90210787Smckusick 			td1 = pop8();
90310787Smckusick 			push8(td1 / td);
9042080Smckusick 			continue;
9052080Smckusick 		case O_DVD82:
9062080Smckusick 			pc.cp++;
9072080Smckusick 			td = pop8();
90810576Smckusick 			td1 = pop2();
90910576Smckusick 			push8(td1 / td);
9102080Smckusick 			continue;
9112080Smckusick 		case O_DVD84:
9122080Smckusick 			pc.cp++;
9132080Smckusick 			td = pop8();
91410576Smckusick 			td1 = pop4();
91510576Smckusick 			push8(td1 / td);
9162080Smckusick 			continue;
9172080Smckusick 		case O_RV1:
9182109Smckusic 			tcp = _display.raw[*pc.ucp++];
9192950Smckusic 			push2((short)(*(tcp + *pc.sp++)));
9202080Smckusick 			continue;
9212080Smckusick 		case O_RV14:
9222109Smckusic 			tcp = _display.raw[*pc.ucp++];
9232950Smckusic 			push4((long)(*(tcp + *pc.sp++)));
9242080Smckusick 			continue;
9252080Smckusick 		case O_RV2:
9262109Smckusic 			tcp = _display.raw[*pc.ucp++];
9272080Smckusick 			push2(*(short *)(tcp + *pc.sp++));
9282080Smckusick 			continue;
9292080Smckusick 		case O_RV24:
9302109Smckusic 			tcp = _display.raw[*pc.ucp++];
9312950Smckusic 			push4((long)(*(short *)(tcp + *pc.sp++)));
9322080Smckusick 			continue;
9332080Smckusick 		case O_RV4:
9342109Smckusic 			tcp = _display.raw[*pc.ucp++];
9352080Smckusick 			push4(*(long *)(tcp + *pc.sp++));
9362080Smckusick 			continue;
9372080Smckusick 		case O_RV8:
9382109Smckusic 			tcp = _display.raw[*pc.ucp++];
9392239Smckusic 			pushsze8(*(struct sze8 *)(tcp + *pc.sp++));
9402080Smckusick 			continue;
9412080Smckusick 		case O_RV:
9422109Smckusic 			tcp = _display.raw[*pc.ucp++];
9432080Smckusick 			tcp += *pc.sp++;
9442080Smckusick 			tl = *pc.usp++;
9452338Smckusic 			tcp1 = pushsp((tl + 1) & ~1);
9469231Smckusick 			blkcpy(tcp, tcp1, tl);
9472080Smckusick 			continue;
9482080Smckusick 		case O_LV:
9492109Smckusic 			tcp = _display.raw[*pc.ucp++];
9502080Smckusick 			pushaddr(tcp + *pc.sp++);
9512080Smckusick 			continue;
9522080Smckusick 		case O_LRV1:
9532109Smckusic 			tcp = _display.raw[*pc.ucp++];
9542950Smckusic 			push2((short)(*(tcp + *pc.lp++)));
9552080Smckusick 			continue;
9562080Smckusick 		case O_LRV14:
9572109Smckusic 			tcp = _display.raw[*pc.ucp++];
9582950Smckusic 			push4((long)(*(tcp + *pc.lp++)));
9592080Smckusick 			continue;
9602080Smckusick 		case O_LRV2:
9612109Smckusic 			tcp = _display.raw[*pc.ucp++];
9622080Smckusick 			push2(*(short *)(tcp + *pc.lp++));
9632080Smckusick 			continue;
9642080Smckusick 		case O_LRV24:
9652109Smckusic 			tcp = _display.raw[*pc.ucp++];
9662950Smckusic 			push4((long)(*(short *)(tcp + *pc.lp++)));
9672080Smckusick 			continue;
9682080Smckusick 		case O_LRV4:
9692109Smckusic 			tcp = _display.raw[*pc.ucp++];
9702080Smckusick 			push4(*(long *)(tcp + *pc.lp++));
9712080Smckusick 			continue;
9722080Smckusick 		case O_LRV8:
9732109Smckusic 			tcp = _display.raw[*pc.ucp++];
9742239Smckusic 			pushsze8(*(struct sze8 *)(tcp + *pc.lp++));
9752080Smckusick 			continue;
9762080Smckusick 		case O_LRV:
9772109Smckusic 			tcp = _display.raw[*pc.ucp++];
9782950Smckusic 			tcp += (int)*pc.lp++;
9792080Smckusick 			tl = *pc.usp++;
9802950Smckusic 			tcp1 = pushsp((tl + 1) & ~1);
9819231Smckusick 			blkcpy(tcp, tcp1, tl);
9822080Smckusick 			continue;
9832080Smckusick 		case O_LLV:
9842109Smckusic 			tcp = _display.raw[*pc.ucp++];
9852080Smckusick 			pushaddr(tcp + *pc.lp++);
9862080Smckusick 			continue;
9872080Smckusick 		case O_IND1:
9882080Smckusick 			pc.cp++;
9892950Smckusic 			push2((short)(*popaddr()));
9902080Smckusick 			continue;
9912080Smckusick 		case O_IND14:
9922080Smckusick 			pc.cp++;
9932950Smckusic 			push4((long)(*popaddr()));
9942080Smckusick 			continue;
9952080Smckusick 		case O_IND2:
9962080Smckusick 			pc.cp++;
9972080Smckusick 			push2(*(short *)(popaddr()));
9982080Smckusick 			continue;
9992080Smckusick 		case O_IND24:
10002080Smckusick 			pc.cp++;
10012950Smckusic 			push4((long)(*(short *)(popaddr())));
10022080Smckusick 			continue;
10032080Smckusick 		case O_IND4:
10042080Smckusick 			pc.cp++;
10052080Smckusick 			push4(*(long *)(popaddr()));
10062080Smckusick 			continue;
10072080Smckusick 		case O_IND8:
10082080Smckusick 			pc.cp++;
10092239Smckusic 			pushsze8(*(struct sze8 *)(popaddr()));
10102080Smckusick 			continue;
10112080Smckusick 		case O_IND:
10122080Smckusick 			tl = *pc.cp++;
10132080Smckusick 			if (tl == 0)
10142080Smckusick 				tl = *pc.usp++;
10152080Smckusick 			tcp = popaddr();
10162080Smckusick 			tcp1 = pushsp((tl + 1) & ~1);
10179231Smckusick 			blkcpy(tcp, tcp1, tl);
10182080Smckusick 			continue;
10192080Smckusick 		case O_CON1:
10202950Smckusic 			push2((short)(*pc.cp++));
10212080Smckusick 			continue;
10222080Smckusick 		case O_CON14:
10232950Smckusic 			push4((long)(*pc.cp++));
10242080Smckusick 			continue;
10252080Smckusick 		case O_CON2:
10262080Smckusick 			pc.cp++;
10272080Smckusick 			push2(*pc.sp++);
10282080Smckusick 			continue;
10292080Smckusick 		case O_CON24:
10302080Smckusick 			pc.cp++;
10312950Smckusic 			push4((long)(*pc.sp++));
10322080Smckusick 			continue;
10332080Smckusick 		case O_CON4:
10342080Smckusick 			pc.cp++;
10352080Smckusick 			push4(*pc.lp++);
10362080Smckusick 			continue;
10372080Smckusick 		case O_CON8:
10382080Smckusick 			pc.cp++;
10392950Smckusic 			push8(*pc.dbp++);
10402080Smckusick 			continue;
10412080Smckusick 		case O_CON:
10422080Smckusick 			tl = *pc.cp++;
10432080Smckusick 			if (tl == 0)
10442080Smckusick 				tl = *pc.usp++;
10452080Smckusick 			tl = (tl + 1) & ~1;
10462080Smckusick 			tcp = pushsp(tl);
10479231Smckusick 			blkcpy(pc.cp, tcp, tl);
10482950Smckusic 			pc.cp += (int)tl;
10492080Smckusick 			continue;
10502950Smckusic 		case O_CONG:
10512950Smckusic 			tl = *pc.cp++;
10522950Smckusic 			if (tl == 0)
10532950Smckusic 				tl = *pc.usp++;
10542950Smckusic 			tl1 = (tl + 1) & ~1;
10552950Smckusic 			tcp = pushsp(tl1);
10569231Smckusick 			blkcpy(pc.cp, tcp, tl1);
10572950Smckusic 			pc.cp += (int)((tl + 2) & ~1);
10582950Smckusic 			continue;
10592080Smckusick 		case O_LVCON:
10602080Smckusick 			tl = *pc.cp++;
10612080Smckusick 			if (tl == 0)
10622080Smckusick 				tl = *pc.usp++;
10632080Smckusick 			tl = (tl + 1) & ~1;
10642080Smckusick 			pushaddr(pc.cp);
10652950Smckusic 			pc.cp += (int)tl;
10662080Smckusick 			continue;
10672080Smckusick 		case O_RANG2:
10682080Smckusick 			tl = *pc.cp++;
10692080Smckusick 			if (tl == 0)
10702080Smckusick 				tl = *pc.sp++;
10712080Smckusick 			tl1 = pop2();
10724026Smckusic 			push2((short)(RANG4(tl1, tl, (long)(*pc.sp++))));
10732080Smckusick 			continue;
10742080Smckusick 		case O_RANG42:
10752080Smckusick 			tl = *pc.cp++;
10762080Smckusick 			if (tl == 0)
10772080Smckusick 				tl = *pc.sp++;
10782080Smckusick 			tl1 = pop4();
10794026Smckusic 			push4(RANG4(tl1, tl, (long)(*pc.sp++)));
10802080Smckusick 			continue;
10812080Smckusick 		case O_RSNG2:
10822080Smckusick 			tl = *pc.cp++;
10832080Smckusick 			if (tl == 0)
10842080Smckusick 				tl = *pc.sp++;
10852080Smckusick 			tl1 = pop2();
10862950Smckusic 			push2((short)(RSNG4(tl1, tl)));
10872080Smckusick 			continue;
10882080Smckusick 		case O_RSNG42:
10892080Smckusick 			tl = *pc.cp++;
10902080Smckusick 			if (tl == 0)
10912080Smckusick 				tl = *pc.sp++;
10922080Smckusick 			tl1 = pop4();
10932080Smckusick 			push4(RSNG4(tl1, tl));
10942080Smckusick 			continue;
10952080Smckusick 		case O_RANG4:
10964026Smckusic 			tl = *pc.cp++;
10974026Smckusic 			if (tl == 0)
10984026Smckusic 				tl = *pc.lp++;
10992080Smckusick 			tl1 = pop4();
11002080Smckusick 			push4(RANG4(tl1, tl, *pc.lp++));
11012080Smckusick 			continue;
11022080Smckusick 		case O_RANG24:
11034026Smckusic 			tl = *pc.cp++;
11044026Smckusic 			if (tl == 0)
11054026Smckusic 				tl = *pc.lp++;
11062080Smckusick 			tl1 = pop2();
11072950Smckusic 			push2((short)(RANG4(tl1, tl, *pc.lp++)));
11082080Smckusick 			continue;
11092080Smckusick 		case O_RSNG4:
11104026Smckusic 			tl = *pc.cp++;
11114026Smckusic 			if (tl == 0)
11124026Smckusic 				tl = *pc.lp++;
11134026Smckusic 			tl1 = pop4();
11144026Smckusic 			push4(RSNG4(tl1, tl));
11152080Smckusick 			continue;
11162080Smckusick 		case O_RSNG24:
11174026Smckusic 			tl = *pc.cp++;
11184026Smckusic 			if (tl == 0)
11194026Smckusic 				tl = *pc.lp++;
11204026Smckusic 			tl1 = pop2();
11214026Smckusic 			push2((short)(RSNG4(tl1, tl)));
11222080Smckusick 			continue;
11232080Smckusick 		case O_STLIM:
11242080Smckusick 			pc.cp++;
11252121Smckusic 			STLIM();
11262950Smckusic 			popsp((long)(sizeof(long)));
11272080Smckusick 			continue;
11282080Smckusick 		case O_LLIMIT:
11292080Smckusick 			pc.cp++;
11302080Smckusick 			LLIMIT();
11312950Smckusic 			popsp((long)(sizeof(char *)+sizeof(long)));
11322080Smckusick 			continue;
11332080Smckusick 		case O_BUFF:
11342950Smckusic 			BUFF((long)(*pc.cp++));
11352080Smckusick 			continue;
11362080Smckusick 		case O_HALT:
11372080Smckusick 			pc.cp++;
11385682Smckusic 			if (_nodump == TRUE)
11395682Smckusic 				psexit(0);
11405682Smckusic 			fputs("\nCall to procedure halt\n", stderr);
11415682Smckusic 			backtrace("Halted");
11425682Smckusic 			psexit(0);
11432080Smckusick 			continue;
11442080Smckusick 		case O_PXPBUF:
11452080Smckusick 			pc.cp++;
11462080Smckusick 			_cntrs = *pc.lp++;
11472080Smckusick 			_rtns = *pc.lp++;
11489231Smckusick 			NEW(&_pcpcount, (_cntrs + 1) * sizeof(long));
11499231Smckusick 			blkclr(_pcpcount, (_cntrs + 1) * sizeof(long));
11502080Smckusick 			continue;
11512080Smckusick 		case O_COUNT:
11522080Smckusick 			pc.cp++;
11532080Smckusick 			_pcpcount[*pc.usp++]++;
11542080Smckusick 			continue;
11552080Smckusick 		case O_CASE1OP:
11562080Smckusick 			tl = *pc.cp++;		/* tl = number of cases */
11572080Smckusick 			if (tl == 0)
11582080Smckusick 				tl = *pc.usp++;
11592080Smckusick 			tsp = pc.sp + tl;	/* ptr to end of jump table */
11602080Smckusick 			tcp = (char *)tsp;	/* tcp = ptr to case values */
11612080Smckusick 			tl1 = pop2();		/* tl1 = element to find */
11622080Smckusick 			for(; tl > 0; tl--)	/* look for element */
11632080Smckusick 				if (tl1 == *tcp++)
11642080Smckusick 					break;
11652080Smckusick 			if (tl == 0)		/* default case => error */
11665666Smckusic 				CASERNG(tl1);
11672080Smckusick 			pc.cp += *(tsp - tl);
11682080Smckusick 			continue;
11692080Smckusick 		case O_CASE2OP:
11702080Smckusick 			tl = *pc.cp++;		/* tl = number of cases */
11712080Smckusick 			if (tl == 0)
11722080Smckusick 				tl = *pc.usp++;
11732080Smckusick 			tsp = pc.sp + tl;	/* ptr to end of jump table */
11742080Smckusick 			tsp1 = tsp;		/* tsp1 = ptr to case values */
11752080Smckusick 			tl1 = (unsigned short)pop2();/* tl1 = element to find */
11762080Smckusick 			for(; tl > 0; tl--)	/* look for element */
11772080Smckusick 				if (tl1 == *tsp1++)
11782080Smckusick 					break;
11792080Smckusick 			if (tl == 0)		/* default case => error */
11805666Smckusic 				CASERNG(tl1);
11812080Smckusick 			pc.cp += *(tsp - tl);
11822080Smckusick 			continue;
11832080Smckusick 		case O_CASE4OP:
11842080Smckusick 			tl = *pc.cp++;		/* tl = number of cases */
11852080Smckusick 			if (tl == 0)
11862080Smckusick 				tl = *pc.usp++;
11872080Smckusick 			tsp = pc.sp + tl;	/* ptr to end of jump table */
11882080Smckusick 			tlp = (long *)tsp;	/* tlp = ptr to case values */
11892080Smckusick 			tl1 = pop4();		/* tl1 = element to find */
11902080Smckusick 			for(; tl > 0; tl--)	/* look for element */
11912080Smckusick 				if (tl1 == *tlp++)
11922080Smckusick 					break;
11932080Smckusick 			if (tl == 0)		/* default case => error */
11945666Smckusic 				CASERNG(tl1);
11952080Smckusick 			pc.cp += *(tsp - tl);
11962080Smckusick 			continue;
11972080Smckusick 		case O_ADDT:
11982080Smckusick 			tl = *pc.cp++;		/* tl has comparison length */
11992080Smckusick 			if (tl == 0)
12002080Smckusick 				tl = *pc.usp++;
12012950Smckusic 			tcp = pushsp((long)(0));/* tcp pts to first arg */
12022080Smckusick 			ADDT(tcp + tl, tcp + tl, tcp, tl >> 2);
12032080Smckusick 			popsp(tl);
12042080Smckusick 			continue;
12052080Smckusick 		case O_SUBT:
12062080Smckusick 			tl = *pc.cp++;		/* tl has comparison length */
12072080Smckusick 			if (tl == 0)
12082080Smckusick 				tl = *pc.usp++;
12092950Smckusic 			tcp = pushsp((long)(0));/* tcp pts to first arg */
12102080Smckusick 			SUBT(tcp + tl, tcp + tl, tcp, tl >> 2);
12112080Smckusick 			popsp(tl);
12122080Smckusick 			continue;
12132080Smckusick 		case O_MULT:
12142080Smckusick 			tl = *pc.cp++;		/* tl has comparison length */
12152080Smckusick 			if (tl == 0)
12162080Smckusick 				tl = *pc.usp++;
12172950Smckusic 			tcp = pushsp((long)(0));/* tcp pts to first arg */
12182080Smckusick 			MULT(tcp + tl, tcp + tl, tcp, tl >> 2);
12192080Smckusick 			popsp(tl);
12202080Smckusick 			continue;
12212080Smckusick 		case O_INCT:
12222080Smckusick 			tl = *pc.cp++;		/* tl has number of args */
12232080Smckusick 			if (tl == 0)
12242080Smckusick 				tl = *pc.usp++;
12252950Smckusic 			tb = INCT();
12262950Smckusic 			popsp(tl*sizeof(long));
12272950Smckusic 			push2((short)(tb));
12282080Smckusick 			continue;
12292080Smckusick 		case O_CTTOT:
12302080Smckusick 			tl = *pc.cp++;		/* tl has number of args */
12312080Smckusick 			if (tl == 0)
12322080Smckusick 				tl = *pc.usp++;
12332080Smckusick 			tl1 = tl * sizeof(long);
12342950Smckusic 			tcp = pushsp((long)(0)) + tl1; /* tcp pts to result */
12352080Smckusick 			CTTOT(tcp);
12362950Smckusic 			popsp(tl*sizeof(long));
12372080Smckusick 			continue;
12382080Smckusick 		case O_CARD:
12392080Smckusick 			tl = *pc.cp++;		/* tl has comparison length */
12402080Smckusick 			if (tl == 0)
12412080Smckusick 				tl = *pc.usp++;
12422950Smckusic 			tcp = pushsp((long)(0));/* tcp pts to set */
12432080Smckusick 			tl1 = CARD(tcp, tl);
12442080Smckusick 			popsp(tl);
12452950Smckusic 			push2((short)(tl1));
12462080Smckusick 			continue;
12472080Smckusick 		case O_IN:
12482080Smckusick 			tl = *pc.cp++;		/* tl has comparison length */
12492080Smckusick 			if (tl == 0)
12502080Smckusick 				tl = *pc.usp++;
12512080Smckusick 			tl1 = pop4();		/* tl1 is the element */
12522950Smckusic 			tcp = pushsp((long)(0));/* tcp pts to set */
12534026Smckusic 			tl2 = *pc.sp++;	/* lower bound */
12542950Smckusic 			tb = IN(tl1, tl2, (long)(*pc.usp++), tcp);
12552080Smckusick 			popsp(tl);
12562950Smckusic 			push2((short)(tb));
12572080Smckusick 			continue;
12582080Smckusick 		case O_ASRT:
12592080Smckusick 			pc.cp++;
12609231Smckusick 			ASRTS();
12617923Smckusick 			popsp((long)(sizeof(long)+sizeof(char *)));
12622080Smckusick 			continue;
12632080Smckusick 		case O_FOR1U:
1264*10792Smckusick 			tl1 = *pc.cp++;		/* tl1 loop branch */
126510576Smckusick 			if (tl1 == 0)
126610576Smckusick 				tl1 = *pc.sp++;
126710576Smckusick 			tcp = popaddr();	/* tcp = ptr to index var */
1268*10792Smckusick 			tl = pop4();		/* tl upper bound */
1269*10792Smckusick 			if (*tcp == tl)		/* loop is done, fall through */
127010576Smckusick 				continue;
1271*10792Smckusick 			*tcp += 1;		/* inc index var */
1272*10792Smckusick 			pc.cp += tl1;		/* return to top of loop */
127310576Smckusick 			continue;
12742080Smckusick 		case O_FOR2U:
1275*10792Smckusick 			tl1 = *pc.cp++;		/* tl1 loop branch */
12764026Smckusic 			if (tl1 == 0)
12774026Smckusic 				tl1 = *pc.sp++;
127810576Smckusick 			tsp = (short *)popaddr(); /* tsp = ptr to index var */
1279*10792Smckusick 			tl = pop4();		/* tl upper bound */
1280*10792Smckusick 			if (*tsp == tl)		/* loop is done, fall through */
12812080Smckusick 				continue;
1282*10792Smckusick 			*tsp += 1;		/* inc index var */
1283*10792Smckusick 			pc.cp += tl1;		/* return to top of loop */
12842080Smckusick 			continue;
12852080Smckusick 		case O_FOR4U:
1286*10792Smckusick 			tl1 = *pc.cp++;		/* tl1 loop branch */
12874026Smckusic 			if (tl1 == 0)
1288*10792Smckusick 				tl1 = *pc.sp++;
12892950Smckusic 			tlp = (long *)popaddr(); /* tlp = ptr to index var */
1290*10792Smckusick 			tl = pop4();		/* tl upper bound */
1291*10792Smckusick 			if (*tlp == tl)		/* loop is done, fall through */
12922080Smckusick 				continue;
1293*10792Smckusick 			*tlp += 1;		/* inc index var */
1294*10792Smckusick 			pc.cp += tl1;		/* return to top of loop */
12952080Smckusick 			continue;
12962080Smckusick 		case O_FOR1D:
1297*10792Smckusick 			tl1 = *pc.cp++;		/* tl1 loop branch */
129810576Smckusick 			if (tl1 == 0)
129910576Smckusick 				tl1 = *pc.sp++;
130010576Smckusick 			tcp = popaddr();	/* tcp = ptr to index var */
1301*10792Smckusick 			tl = pop4();		/* tl upper bound */
1302*10792Smckusick 			if (*tcp == tl)		/* loop is done, fall through */
130310576Smckusick 				continue;
1304*10792Smckusick 			*tcp -= 1;		/* dec index var */
1305*10792Smckusick 			pc.cp += tl1;		/* return to top of loop */
130610576Smckusick 			continue;
13072080Smckusick 		case O_FOR2D:
1308*10792Smckusick 			tl1 = *pc.cp++;		/* tl1 loop branch */
13094026Smckusic 			if (tl1 == 0)
13104026Smckusic 				tl1 = *pc.sp++;
131110576Smckusick 			tsp = (short *)popaddr(); /* tsp = ptr to index var */
1312*10792Smckusick 			tl = pop4();		/* tl upper bound */
1313*10792Smckusick 			if (*tsp == tl)		/* loop is done, fall through */
13142080Smckusick 				continue;
1315*10792Smckusick 			*tsp -= 1;		/* dec index var */
1316*10792Smckusick 			pc.cp += tl1;		/* return to top of loop */
13172080Smckusick 			continue;
13182080Smckusick 		case O_FOR4D:
1319*10792Smckusick 			tl1 = *pc.cp++;		/* tl1 loop branch */
13204026Smckusic 			if (tl1 == 0)
1321*10792Smckusick 				tl1 = *pc.sp++;
13222950Smckusic 			tlp = (long *)popaddr(); /* tlp = ptr to index var */
1323*10792Smckusick 			tl = pop4();		/* tl upper bound */
1324*10792Smckusick 			if (*tlp == tl)		/* loop is done, fall through */
13252080Smckusick 				continue;
1326*10792Smckusick 			*tlp -= 1;		/* dec index var */
1327*10792Smckusick 			pc.cp += tl1;		/* return to top of loop */
13282080Smckusick 			continue;
13292080Smckusick 		case O_READE:
13302080Smckusick 			pc.cp++;
13312950Smckusic 			push2((short)(READE(curfile, base + *pc.lp++)));
13322080Smckusick 			continue;
13332080Smckusick 		case O_READ4:
13342080Smckusick 			pc.cp++;
13352080Smckusick 			push4(READ4(curfile));
13362080Smckusick 			continue;
13372080Smckusick 		case O_READC:
13382080Smckusick 			pc.cp++;
13392950Smckusic 			push2((short)(READC(curfile)));
13402080Smckusick 			continue;
13412080Smckusick 		case O_READ8:
13422080Smckusick 			pc.cp++;
13432080Smckusick 			push8(READ8(curfile));
13442080Smckusick 			continue;
13452080Smckusick 		case O_READLN:
13462080Smckusick 			pc.cp++;
13472080Smckusick 			READLN(curfile);
13482080Smckusick 			continue;
13492080Smckusick 		case O_EOF:
13502080Smckusick 			pc.cp++;
13512950Smckusic 			push2((short)(TEOF(popaddr())));
13522080Smckusick 			continue;
13532080Smckusick 		case O_EOLN:
13542080Smckusick 			pc.cp++;
13552950Smckusic 			push2((short)(TEOLN(popaddr())));
13562080Smckusick 			continue;
13572080Smckusick 		case O_WRITEC:
13582191Smckusic 			if (_runtst) {
13592191Smckusic 				WRITEC(curfile);
13603166Smckusic 				popsp((long)(*pc.cp++));
13612191Smckusic 				continue;
13622191Smckusic 			}
13632191Smckusic 			fputc();
13643166Smckusic 			popsp((long)(*pc.cp++));
13652080Smckusick 			continue;
13662080Smckusick 		case O_WRITES:
13672191Smckusic 			if (_runtst) {
13682191Smckusic 				WRITES(curfile);
13693166Smckusic 				popsp((long)(*pc.cp++));
13702191Smckusic 				continue;
13712191Smckusic 			}
13722191Smckusic 			fwrite();
13733166Smckusic 			popsp((long)(*pc.cp++));
13742080Smckusick 			continue;
13752080Smckusick 		case O_WRITEF:
13762191Smckusic 			if (_runtst) {
13772191Smckusic 				WRITEF(curfile);
13783166Smckusic 				popsp((long)(*pc.cp++));
13792191Smckusic 				continue;
13802191Smckusic 			}
13812191Smckusic 			fprintf();
13823166Smckusic 			popsp((long)(*pc.cp++));
13832080Smckusick 			continue;
13842080Smckusick 		case O_WRITLN:
13852080Smckusick 			pc.cp++;
13862191Smckusic 			if (_runtst) {
13872191Smckusic 				WRITLN(curfile);
13882191Smckusic 				continue;
13892191Smckusic 			}
13902191Smckusic 			fputc('\n', ACTFILE(curfile));
13912080Smckusick 			continue;
13922080Smckusick 		case O_PAGE:
13932080Smckusick 			pc.cp++;
13942191Smckusic 			if (_runtst) {
13952191Smckusic 				PAGE(curfile);
13962191Smckusic 				continue;
13972191Smckusic 			}
13982950Smckusic 			fputc('', ACTFILE(curfile));
13992080Smckusick 			continue;
14002080Smckusick 		case O_NAM:
14012080Smckusick 			pc.cp++;
14022080Smckusick 			tl = pop4();
14032080Smckusick 			pushaddr(NAM(tl, base + *pc.lp++));
14042080Smckusick 			continue;
14052080Smckusick 		case O_MAX:
14062080Smckusick 			tl = *pc.cp++;
14072080Smckusick 			if (tl == 0)
14082080Smckusick 				tl = *pc.usp++;
14092080Smckusick 			tl1 = pop4();
14102191Smckusic 			if (_runtst) {
14112950Smckusic 				push4(MAX(tl1, tl, (long)(*pc.usp++)));
14122191Smckusic 				continue;
14132191Smckusic 			}
14142191Smckusic 			tl1 -= tl;
14152191Smckusic 			tl = *pc.usp++;
14162191Smckusic 			push4(tl1 > tl ? tl1 : tl);
14172080Smckusick 			continue;
14182080Smckusick 		case O_MIN:
14192080Smckusick 			tl = *pc.cp++;
14202080Smckusick 			if (tl == 0)
14212080Smckusick 				tl = *pc.usp++;
14222080Smckusick 			tl1 = pop4();
14232080Smckusick 			push4(tl1 < tl ? tl1 : tl);
14242080Smckusick 			continue;
14252080Smckusick 		case O_UNIT:
14262080Smckusick 			pc.cp++;
14272080Smckusick 			curfile = UNIT(popaddr());
14282080Smckusick 			continue;
14292080Smckusick 		case O_UNITINP:
14302080Smckusick 			pc.cp++;
14312080Smckusick 			curfile = INPUT;
14322080Smckusick 			continue;
14332080Smckusick 		case O_UNITOUT:
14342080Smckusick 			pc.cp++;
14352080Smckusick 			curfile = OUTPUT;
14362080Smckusick 			continue;
14372080Smckusick 		case O_MESSAGE:
14382080Smckusick 			pc.cp++;
14392080Smckusick 			PFLUSH();
14402080Smckusick 			curfile = ERR;
14412080Smckusick 			continue;
14422109Smckusic 		case O_PUT:
14432109Smckusic 			pc.cp++;
14442109Smckusic 			PUT(curfile);
14452109Smckusic 			continue;
14462080Smckusick 		case O_GET:
14472080Smckusick 			pc.cp++;
14482080Smckusick 			GET(curfile);
14492080Smckusick 			continue;
14502080Smckusick 		case O_FNIL:
14512080Smckusick 			pc.cp++;
14522080Smckusick 			pushaddr(FNIL(popaddr()));
14532080Smckusick 			continue;
14542080Smckusick 		case O_DEFNAME:
14552080Smckusick 			pc.cp++;
14562080Smckusick 			DEFNAME();
14572950Smckusic 			popsp((long)(2*sizeof(char *)+2*sizeof(long)));
14582080Smckusick 			continue;
14592080Smckusick 		case O_RESET:
14602080Smckusick 			pc.cp++;
14612080Smckusick 			RESET();
14622950Smckusic 			popsp((long)(2*sizeof(char *)+2*sizeof(long)));
14632080Smckusick 			continue;
14642080Smckusick 		case O_REWRITE:
14652080Smckusick 			pc.cp++;
14662080Smckusick 			REWRITE();
14672950Smckusic 			popsp((long)(2*sizeof(char *)+2*sizeof(long)));
14682080Smckusick 			continue;
14692080Smckusick 		case O_FILE:
14702080Smckusick 			pc.cp++;
14712080Smckusick 			pushaddr(ACTFILE(curfile));
14722080Smckusick 			continue;
14732080Smckusick 		case O_REMOVE:
14742080Smckusick 			pc.cp++;
14752080Smckusick 			REMOVE();
14762950Smckusic 			popsp((long)(sizeof(char *)+sizeof(long)));
14772080Smckusick 			continue;
14782080Smckusick 		case O_FLUSH:
14792080Smckusick 			pc.cp++;
14802080Smckusick 			FLUSH();
14812950Smckusic 			popsp((long)(sizeof(char *)));
14822080Smckusick 			continue;
14832080Smckusick 		case O_PACK:
14842080Smckusick 			pc.cp++;
14852080Smckusick 			PACK();
14862950Smckusic 			popsp((long)(5*sizeof(long)+2*sizeof(char*)));
14872080Smckusick 			continue;
14882080Smckusick 		case O_UNPACK:
14892080Smckusick 			pc.cp++;
14902080Smckusick 			UNPACK();
14912950Smckusic 			popsp((long)(5*sizeof(long)+2*sizeof(char*)));
14922080Smckusick 			continue;
14932080Smckusick 		case O_ARGC:
14942080Smckusick 			pc.cp++;
14952950Smckusic 			push4((long)_argc);
14962080Smckusick 			continue;
14972080Smckusick 		case O_ARGV:
14982080Smckusick 			tl = *pc.cp++;		/* tl = size of char array */
14992080Smckusick 			if (tl == 0)
15002080Smckusick 				tl = *pc.usp++;
15012080Smckusick 			tcp = popaddr();	/* tcp = addr of char array */
15022080Smckusick 			tl1 = pop4();		/* tl1 = argv subscript */
15032080Smckusick 			ARGV(tl1, tcp, tl);
15042080Smckusick 			continue;
15052080Smckusick 		case O_CLCK:
15062080Smckusick 			pc.cp++;
15072080Smckusick 			push4(CLCK());
15082080Smckusick 			continue;
15092080Smckusick 		case O_WCLCK:
15102080Smckusick 			pc.cp++;
15112080Smckusick 			push4(time(0));
15122080Smckusick 			continue;
15132080Smckusick 		case O_SCLCK:
15142080Smckusick 			pc.cp++;
15152080Smckusick 			push4(SCLCK());
15162080Smckusick 			continue;
15172080Smckusick 		case O_NEW:
15182080Smckusick 			tl = *pc.cp++;		/* tl = size being new'ed */
15192080Smckusick 			if (tl == 0)
15202080Smckusick 				tl = *pc.usp++;
15212080Smckusick 			tcp = popaddr();	/* ptr to ptr being new'ed */
15229231Smckusick 			NEW(tcp, tl);
15232191Smckusic 			if (_runtst) {
15249263Smckusick 				blkclr(*((char **)(tcp)), tl);
15252191Smckusic 			}
15262080Smckusick 			continue;
15277961Smckusick 		case O_DISPOSE:
15287961Smckusick 			tl = *pc.cp++;		/* tl = size being disposed */
15297961Smckusick 			if (tl == 0)
15307961Smckusick 				tl = *pc.usp++;
15317961Smckusick 			tcp = popaddr();	/* ptr to ptr being disposed */
15327961Smckusick 			DISPOSE(tcp, tl);
15337961Smckusick 			*(char **)tcp = (char *)0;
15347961Smckusick 			continue;
15357961Smckusick 		case O_DFDISP:
15367961Smckusick 			tl = *pc.cp++;		/* tl = size being disposed */
15377961Smckusick 			if (tl == 0)
15387961Smckusick 				tl = *pc.usp++;
15397961Smckusick 			tcp = popaddr();	/* ptr to ptr being disposed */
15407961Smckusick 			DFDISPOSE(tcp, tl);
15417961Smckusick 			*(char **)tcp = (char *)0;
15427961Smckusick 			continue;
15432080Smckusick 		case O_DATE:
15442080Smckusick 			pc.cp++;
15452080Smckusick 			DATE(popaddr());
15462080Smckusick 			continue;
15472080Smckusick 		case O_TIME:
15482080Smckusick 			pc.cp++;
15492080Smckusick 			TIME(popaddr());
15502080Smckusick 			continue;
15512080Smckusick 		case O_UNDEF:
15522080Smckusick 			pc.cp++;
15532080Smckusick 			pop8();
15542950Smckusic 			push2((short)(0));
15552080Smckusick 			continue;
15562080Smckusick 		case O_ATAN:
15572080Smckusick 			pc.cp++;
15585723Smckusic 			if (_runtst) {
15595723Smckusic 				push8(ATAN(pop8()));
15605723Smckusic 				continue;
15615723Smckusic 			}
15622080Smckusick 			push8(atan(pop8()));
15632080Smckusick 			continue;
15642080Smckusick 		case O_COS:
15652080Smckusick 			pc.cp++;
15665723Smckusic 			if (_runtst) {
15675723Smckusic 				push8(COS(pop8()));
15685723Smckusic 				continue;
15695723Smckusic 			}
15702080Smckusick 			push8(cos(pop8()));
15712080Smckusick 			continue;
15722080Smckusick 		case O_EXP:
15732080Smckusick 			pc.cp++;
15745723Smckusic 			if (_runtst) {
15755723Smckusic 				push8(EXP(pop8()));
15765723Smckusic 				continue;
15775723Smckusic 			}
15782080Smckusick 			push8(exp(pop8()));
15792080Smckusick 			continue;
15802080Smckusick 		case O_LN:
15812080Smckusick 			pc.cp++;
15822191Smckusic 			if (_runtst) {
15832191Smckusic 				push8(LN(pop8()));
15842191Smckusic 				continue;
15852191Smckusic 			}
15862191Smckusic 			push8(log(pop8()));
15872080Smckusick 			continue;
15882080Smckusick 		case O_SIN:
15892080Smckusick 			pc.cp++;
15905723Smckusic 			if (_runtst) {
15915723Smckusic 				push8(SIN(pop8()));
15925723Smckusic 				continue;
15935723Smckusic 			}
15942080Smckusick 			push8(sin(pop8()));
15952080Smckusick 			continue;
15962080Smckusick 		case O_SQRT:
15972080Smckusick 			pc.cp++;
15982191Smckusic 			if (_runtst) {
15992191Smckusic 				push8(SQRT(pop8()));
16002191Smckusic 				continue;
16012191Smckusic 			}
16022191Smckusic 			push8(sqrt(pop8()));
16032080Smckusick 			continue;
16042080Smckusick 		case O_CHR2:
16052080Smckusick 		case O_CHR4:
16062080Smckusick 			pc.cp++;
16072191Smckusic 			if (_runtst) {
16082950Smckusic 				push2((short)(CHR(pop4())));
16092191Smckusic 				continue;
16102191Smckusic 			}
16112950Smckusic 			push2((short)(pop4()));
16122080Smckusick 			continue;
16132080Smckusick 		case O_ODD2:
16142080Smckusick 		case O_ODD4:
16152080Smckusick 			pc.cp++;
161610576Smckusick 			tl = pop4();
161710576Smckusick 			push2((short)(tl & 1));
16182080Smckusick 			continue;
16192080Smckusick 		case O_SUCC2:
16202109Smckusic 			tl = *pc.cp++;
16212109Smckusic 			if (tl == 0)
16222109Smckusic 				tl = *pc.sp++;
16232109Smckusic 			tl1 = pop4();
16242191Smckusic 			if (_runtst) {
16252950Smckusic 				push2((short)(SUCC(tl1, tl, (long)(*pc.sp++))));
16262191Smckusic 				continue;
16272191Smckusic 			}
16282950Smckusic 			push2((short)(tl1 + 1));
16292191Smckusic 			pc.sp++;
16302080Smckusick 			continue;
16312080Smckusick 		case O_SUCC24:
16322109Smckusic 			tl = *pc.cp++;
16332109Smckusic 			if (tl == 0)
16342109Smckusic 				tl = *pc.sp++;
16352109Smckusic 			tl1 = pop4();
16362191Smckusic 			if (_runtst) {
16372950Smckusic 				push4(SUCC(tl1, tl, (long)(*pc.sp++)));
16382191Smckusic 				continue;
16392191Smckusic 			}
16402191Smckusic 			push4(tl1 + 1);
16412191Smckusic 			pc.sp++;
16422109Smckusic 			continue;
16432080Smckusick 		case O_SUCC4:
16442109Smckusic 			tl = *pc.cp++;
16452109Smckusic 			if (tl == 0)
16462109Smckusic 				tl = *pc.lp++;
16472109Smckusic 			tl1 = pop4();
16482191Smckusic 			if (_runtst) {
16492950Smckusic 				push4(SUCC(tl1, tl, (long)(*pc.lp++)));
16502191Smckusic 				continue;
16512191Smckusic 			}
16522191Smckusic 			push4(tl1 + 1);
16532191Smckusic 			pc.lp++;
16542080Smckusick 			continue;
16552080Smckusick 		case O_PRED2:
16562109Smckusic 			tl = *pc.cp++;
16572109Smckusic 			if (tl == 0)
16582109Smckusic 				tl = *pc.sp++;
16592109Smckusic 			tl1 = pop4();
16602191Smckusic 			if (_runtst) {
16612950Smckusic 				push2((short)(PRED(tl1, tl, (long)(*pc.sp++))));
16622191Smckusic 				continue;
16632191Smckusic 			}
16642950Smckusic 			push2((short)(tl1 - 1));
16652191Smckusic 			pc.sp++;
16662080Smckusick 			continue;
16672080Smckusick 		case O_PRED24:
16682109Smckusic 			tl = *pc.cp++;
16692109Smckusic 			if (tl == 0)
16702109Smckusic 				tl = *pc.sp++;
16712109Smckusic 			tl1 = pop4();
16722191Smckusic 			if (_runtst) {
16732950Smckusic 				push4(PRED(tl1, tl, (long)(*pc.sp++)));
16742191Smckusic 				continue;
16752191Smckusic 			}
16762191Smckusic 			push4(tl1 - 1);
16772191Smckusic 			pc.sp++;
16782109Smckusic 			continue;
16792080Smckusick 		case O_PRED4:
16802109Smckusic 			tl = *pc.cp++;
16812109Smckusic 			if (tl == 0)
16822109Smckusic 				tl = *pc.lp++;
16832109Smckusic 			tl1 = pop4();
16842191Smckusic 			if (_runtst) {
16852950Smckusic 				push4(PRED(tl1, tl, (long)(*pc.lp++)));
16862191Smckusic 				continue;
16872191Smckusic 			}
16882191Smckusic 			push4(tl1 - 1);
16892191Smckusic 			pc.lp++;
16902080Smckusick 			continue;
16912080Smckusick 		case O_SEED:
16922080Smckusick 			pc.cp++;
16932080Smckusick 			push4(SEED(pop4()));
16942080Smckusick 			continue;
16952080Smckusick 		case O_RANDOM:
16962080Smckusick 			pc.cp++;
16972080Smckusick 			push8(RANDOM(pop8()));
16982080Smckusick 			continue;
16992080Smckusick 		case O_EXPO:
17002080Smckusick 			pc.cp++;
17012080Smckusick 			push4(EXPO(pop8()));
17022080Smckusick 			continue;
17032080Smckusick 		case O_SQR2:
17042080Smckusick 		case O_SQR4:
17052080Smckusick 			pc.cp++;
17062080Smckusick 			tl = pop4();
17072080Smckusick 			push4(tl * tl);
17082080Smckusick 			continue;
17092080Smckusick 		case O_SQR8:
17102080Smckusick 			pc.cp++;
17112080Smckusick 			td = pop8();
17122080Smckusick 			push8(td * td);
17132080Smckusick 			continue;
17142080Smckusick 		case O_ROUND:
17152080Smckusick 			pc.cp++;
17162080Smckusick 			push4(ROUND(pop8()));
17172080Smckusick 			continue;
17182080Smckusick 		case O_TRUNC:
17192080Smckusick 			pc.cp++;
17202080Smckusick 			push4(TRUNC(pop8()));
17212080Smckusick 			continue;
17222950Smckusic 		default:
17235682Smckusic 			ERROR("Panic: bad op code\n");
17242950Smckusic 			continue;
17252080Smckusick 		}
17262080Smckusick 	}
17272080Smckusick }
1728