xref: /csrg-svn/usr.bin/pascal/px/interp.c (revision 10576)
12080Smckusick /* Copyright (c) 1979 Regents of the University of California */
22080Smckusick 
3*10576Smckusick static char sccsid[] = "@(#)interp.c 1.28 01/22/83";
42080Smckusick 
52080Smckusick #include <math.h>
6*10576Smckusick #include <signal.h>
72950Smckusic #include "whoami.h"
8*10576Smckusick #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  */
17*10576Smckusick union display _display;
18*10576Smckusick struct dispsave	*_dp;
192080Smckusick long	_lino = 0;
202080Smckusick int	_argc;
212080Smckusick char	**_argv;
222080Smckusick long	_mode;
23*10576Smckusick long	_runtst = (long)TRUE;
242950Smckusic bool	_nodump = FALSE;
252080Smckusick long	_stlim = 500000;
262080Smckusick long	_stcnt = 0;
272191Smckusic long	_seed = 1;
28*10576Smckusick #ifdef ADDR32
292080Smckusick char	*_minptr = (char *)0x7fffffff;
30*10576Smckusick #endif ADDR32
31*10576Smckusick #ifdef ADDR16
322950Smckusic char	*_minptr = (char *)0xffff;
33*10576Smckusick #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 */
122*10576Smckusick 	register struct blockmark *stp;	/* active stack frame ptr */
1232080Smckusick 	/*
1242080Smckusick 	 * the following variables are used as scratch
1252080Smckusick 	 */
1262239Smckusic 	register char *tcp;
127*10576Smckusick 	register short *tsp;
1282239Smckusic 	register long tl, tl1, tl2;
1292080Smckusick 	double td, td1;
1302239Smckusic 	struct sze8 t8;
131*10576Smckusick 	register short *tsp1;
1322080Smckusick 	long *tlp;
133*10576Smckusick 	char *tcp1;
1342950Smckusic 	bool tb;
135*10576Smckusick 	struct blockmark *tstp;
136*10576Smckusick 	register struct formalrtn *tfp;
1372080Smckusick 	union progcntr tpc;
1382080Smckusick 	struct iorec **ip;
1392080Smckusick 
1405658Slinton 	pcaddrp = &pc;
1415658Slinton 
1422080Smckusick 	/*
1432239Smckusic 	 * Setup sets up any hardware specific parameters before
1442239Smckusic 	 * starting the interpreter. Typically this is inline replaced
1452239Smckusic 	 * by interp.sed to utilize specific machine instructions.
1462239Smckusic 	 */
1472239Smckusic 	 setup();
1482239Smckusic 	/*
1492080Smckusick 	 * necessary only on systems which do not initialize
1502080Smckusick 	 * memory to zero
1512080Smckusick 	 */
1522080Smckusick 	for (ip = &_actfile[3]; ip < &_actfile[MAXFILES]; *ip++ = FILNIL)
1532080Smckusick 		/* void */;
1542080Smckusick 	/*
1552080Smckusick 	 * set up global environment, then ``call'' the main program
1562080Smckusick 	 */
1572950Smckusic 	_display.frame[0].locvars = pushsp((long)(2 * sizeof(struct iorec *)));
1582950Smckusic 	_display.frame[0].locvars += 2 * sizeof(struct iorec *);
1592950Smckusic 	*(struct iorec **)(_display.frame[0].locvars + OUTPUT_OFF) = OUTPUT;
1602950Smckusic 	*(struct iorec **)(_display.frame[0].locvars + INPUT_OFF) = INPUT;
161*10576Smckusick 	stp = (struct blockmark *)pushsp((long)(sizeof(struct blockmark)));
1622109Smckusic 	_dp = &_display.frame[0];
1632080Smckusick 	pc.cp = base;
1645658Slinton 
1655658Slinton 	asm("_loopaddr:");
1662080Smckusick 	for(;;) {
1672109Smckusic #		ifdef DEBUG
1682080Smckusick 		if (++opcptr == 10)
1692080Smckusick 			opcptr = 0;
1702080Smckusick 		opc[opcptr] = *pc.ucp;
1712109Smckusic #		endif DEBUG
1722109Smckusic #		ifdef PROFILE
1732109Smckusic 		_profcnts[*pc.ucp]++;
1742109Smckusic #		endif PROFILE
1752080Smckusick 		switch (*pc.ucp++) {
1765658Slinton 		case O_BPT:			/* breakpoint trap */
1775873Slinton 			PFLUSH();
178*10576Smckusick 			kill(getpid(), SIGILL);
1795658Slinton 			pc.ucp--;
1805658Slinton 			continue;
1812080Smckusick 		case O_NODUMP:
1822191Smckusic 			_nodump = TRUE;
1832080Smckusick 			/* and fall through */
1842080Smckusick 		case O_BEG:
1852080Smckusick 			_dp += 1;		/* enter local scope */
1862080Smckusick 			stp->odisp = *_dp;	/* save old display value */
1872080Smckusick 			tl = *pc.ucp++;		/* tl = name size */
1882080Smckusick 			stp->entry = pc.hdrp;	/* pointer to entry info */
1892191Smckusic 			tl1 = pc.hdrp->framesze;/* tl1 = size of frame */
1902191Smckusic 			_lino = pc.hdrp->offset;
1912191Smckusic 			_runtst = pc.hdrp->tests;
1922191Smckusic 			disableovrflo();
1932191Smckusic 			if (_runtst)
1942191Smckusic 				enableovrflo();
1952950Smckusic 			pc.cp += (int)tl;	/* skip over proc hdr info */
1962080Smckusick 			stp->file = curfile;	/* save active file */
1972080Smckusick 			tcp = pushsp(tl1);	/* tcp = new top of stack */
1982950Smckusic 			if (_runtst)		/* zero stack frame */
1999231Smckusick 				blkclr(tcp, tl1);
2002950Smckusic 			tcp += (int)tl1;	/* offsets of locals are neg */
2012109Smckusic 			_dp->locvars = tcp;	/* set new display pointer */
2022109Smckusic 			_dp->stp = stp;
2032950Smckusic 			stp->tos = pushsp((long)0); /* set tos pointer */
2042080Smckusick 			continue;
2052080Smckusick 		case O_END:
2062080Smckusick 			PCLOSE(_dp->locvars);	/* flush & close local files */
2072080Smckusick 			stp = _dp->stp;
2082080Smckusick 			curfile = stp->file;	/* restore old active file */
2092080Smckusick 			*_dp = stp->odisp;	/* restore old display entry */
2102109Smckusic 			if (_dp == &_display.frame[1])
2112080Smckusick 				return;		/* exiting main proc ??? */
2122080Smckusick 			_lino = stp->lino;	/* restore lino, pc, dp */
213*10576Smckusick 			pc.cp = stp->pc;
2142080Smckusick 			_dp = stp->dp;
2152191Smckusic 			_runtst = stp->entry->tests;
2162191Smckusic 			disableovrflo();
2172191Smckusic 			if (_runtst)
2182191Smckusic 				enableovrflo();
2192109Smckusic 			popsp(stp->entry->framesze +	/* pop local vars */
220*10576Smckusick 			     sizeof(struct blockmark) +	/* pop stack frame */
221*10576Smckusick 			     stp->entry->nargs);	/* pop parms */
2222080Smckusick 			continue;
2232080Smckusick 		case O_CALL:
2242080Smckusick 			tl = *pc.cp++;
2252080Smckusick 			tcp = base + *pc.lp++;/* calc new entry point */
2262080Smckusick 			tcp += sizeof(short);
2272080Smckusick 			tcp = base + *(long *)tcp;
228*10576Smckusick 			stp = (struct blockmark *)
229*10576Smckusick 				pushsp((long)(sizeof(struct blockmark)));
2302080Smckusick 			stp->lino = _lino;	/* save lino, pc, dp */
231*10576Smckusick 			stp->pc = pc.cp;
2322080Smckusick 			stp->dp = _dp;
2332109Smckusic 			_dp = &_display.frame[tl]; /* set up new display ptr */
2342080Smckusick 			pc.cp = tcp;
2352080Smckusick 			continue;
2362080Smckusick 		case O_FCALL:
2373294Smckusic 			pc.cp++;
2384016Smckusic  			tcp = popaddr(); /* ptr to display save area */
2392080Smckusick 			tfp = (struct formalrtn *)popaddr();
240*10576Smckusick 			stp = (struct blockmark *)
241*10576Smckusick 				pushsp((long)(sizeof(struct blockmark)));
2422080Smckusick 			stp->lino = _lino;	/* save lino, pc, dp */
243*10576Smckusick 			stp->pc = pc.cp;
2442080Smckusick 			stp->dp = _dp;
245*10576Smckusick 			pc.cp = (char *)(tfp->fentryaddr);/* new entry point */
2463436Smckusic 			_dp = &_display.frame[tfp->fbn];/* new display ptr */
2479231Smckusick  			blkcpy(&_display.frame[1], tcp,
248*10576Smckusick 				tfp->fbn * sizeof(struct dispsave));
2499231Smckusick 			blkcpy(&tfp->fdisp[0], &_display.frame[1],
250*10576Smckusick 				tfp->fbn * sizeof(struct dispsave));
2512080Smckusick 			continue;
2522080Smckusick 		case O_FRTN:
2532080Smckusick 			tl = *pc.cp++;		/* tl = size of return obj */
2542080Smckusick 			if (tl == 0)
2552080Smckusick 				tl = *pc.usp++;
2562950Smckusic 			tcp = pushsp((long)(0));
2572080Smckusick 			tfp = *(struct formalrtn **)(tcp + tl);
2584016Smckusic  			tcp1 = *(char **)
2594016Smckusic  			    (tcp + tl + sizeof(struct formalrtn *));
2603861Smckusic 			if (tl != 0) {
2619231Smckusick 				blkcpy(tcp, tcp + sizeof(struct formalrtn *)
2629231Smckusick 				    + sizeof(char *), tl);
2633861Smckusic 			}
2644016Smckusic  			popsp((long)
2654016Smckusic  			    (sizeof(struct formalrtn *) + sizeof (char *)));
2669231Smckusick  			blkcpy(tcp1, &_display.frame[1],
267*10576Smckusick 			    tfp->fbn * sizeof(struct dispsave));
2682080Smckusick 			continue;
2692080Smckusick 		case O_FSAV:
2702080Smckusick 			tfp = (struct formalrtn *)popaddr();
2713436Smckusic 			tfp->fbn = *pc.cp++;	/* blk number of routine */
2723861Smckusic 			tcp = base + *pc.lp++;	/* calc new entry point */
2732080Smckusick 			tcp += sizeof(short);
274*10576Smckusick 			tfp->fentryaddr = (long (*)())(base + *(long *)tcp);
2759231Smckusick 			blkcpy(&_display.frame[1], &tfp->fdisp[0],
276*10576Smckusick 				tfp->fbn * sizeof(struct dispsave));
2772080Smckusick 			pushaddr(tfp);
2782080Smckusick 			continue;
2792080Smckusick 		case O_SDUP2:
2802080Smckusick 			pc.cp++;
2812080Smckusick 			tl = pop2();
2822950Smckusic 			push2((short)(tl));
2832950Smckusic 			push2((short)(tl));
2842080Smckusick 			continue;
2852080Smckusick 		case O_SDUP4:
2862080Smckusick 			pc.cp++;
2872080Smckusick 			tl = pop4();
2882080Smckusick 			push4(tl);
2892080Smckusick 			push4(tl);
2902080Smckusick 			continue;
2912080Smckusick 		case O_TRA:
2922080Smckusick 			pc.cp++;
2932080Smckusick 			pc.cp += *pc.sp;
2942080Smckusick 			continue;
2952080Smckusick 		case O_TRA4:
2962080Smckusick 			pc.cp++;
2972080Smckusick 			pc.cp = base + *pc.lp;
2982080Smckusick 			continue;
2992080Smckusick 		case O_GOTO:
3002109Smckusic 			tstp = _display.frame[*pc.cp++].stp; /* ptr to
3012109Smckusic 								exit frame */
3022080Smckusick 			pc.cp = base + *pc.lp;
3032080Smckusick 			stp = _dp->stp;
3042080Smckusick 			while (tstp != stp) {
3052109Smckusic 				if (_dp == &_display.frame[1])
3063872Smckusic 					ERROR("Active frame not found in non-local goto\n", 0); /* exiting prog ??? */
3072080Smckusick 				PCLOSE(_dp->locvars); /* close local files */
3082080Smckusick 				curfile = stp->file;  /* restore active file */
3092080Smckusick 				*_dp = stp->odisp;    /* old display entry */
3102080Smckusick 				_dp = stp->dp;	      /* restore dp */
3112080Smckusick 				stp = _dp->stp;
3122080Smckusick 			}
3132080Smckusick 			/* pop locals, stack frame, parms, and return values */
3142950Smckusic 			popsp((long)(stp->tos - pushsp((long)(0))));
3152080Smckusick 			continue;
3162080Smckusick 		case O_LINO:
3172950Smckusic 			if (_dp->stp->tos != pushsp((long)(0)))
3185682Smckusic 				ERROR("Panic: stack not empty between statements\n");
3192080Smckusick 			_lino = *pc.cp++;	/* set line number */
3202080Smckusick 			if (_lino == 0)
3212080Smckusick 				_lino = *pc.sp++;
3222950Smckusic 			if (_runtst) {
3232950Smckusic 				LINO();		/* inc statement count */
3242950Smckusic 				continue;
3252950Smckusic 			}
3262950Smckusic 			_stcnt++;
3272080Smckusick 			continue;
3282080Smckusick 		case O_PUSH:
3292080Smckusick 			tl = *pc.cp++;
3302080Smckusick 			if (tl == 0)
33110188Smckusick 				tl = *pc.lp++;
3322080Smckusick 			tl = (-tl + 1) & ~1;
3332080Smckusick 			tcp = pushsp(tl);
3342950Smckusic 			if (_runtst)
3359231Smckusick 				blkclr(tcp, tl);
3362080Smckusick 			continue;
3372080Smckusick 		case O_IF:
3382080Smckusick 			pc.cp++;
3392191Smckusic 			if (pop2()) {
3402080Smckusick 				pc.sp++;
3412191Smckusic 				continue;
3422191Smckusic 			}
3432191Smckusic 			pc.cp += *pc.sp;
3442080Smckusick 			continue;
3452080Smckusick 		case O_REL2:
3462080Smckusick 			tl = pop2();
3472080Smckusick 			tl1 = pop2();
3482080Smckusick 			goto cmplong;
3492080Smckusick 		case O_REL24:
3502080Smckusick 			tl = pop2();
3512080Smckusick 			tl1 = pop4();
3522080Smckusick 			goto cmplong;
3532080Smckusick 		case O_REL42:
3542080Smckusick 			tl = pop4();
3552080Smckusick 			tl1 = pop2();
3562080Smckusick 			goto cmplong;
3572080Smckusick 		case O_REL4:
3582080Smckusick 			tl = pop4();
3592080Smckusick 			tl1 = pop4();
3602080Smckusick 		cmplong:
3615682Smckusic 			switch (*pc.cp++) {
3622080Smckusick 			case releq:
3632080Smckusick 				push2(tl1 == tl);
3642080Smckusick 				continue;
3652080Smckusick 			case relne:
3662080Smckusick 				push2(tl1 != tl);
3672080Smckusick 				continue;
3682080Smckusick 			case rellt:
3692080Smckusick 				push2(tl1 < tl);
3702080Smckusick 				continue;
3712080Smckusick 			case relgt:
3722080Smckusick 				push2(tl1 > tl);
3732080Smckusick 				continue;
3742080Smckusick 			case relle:
3752080Smckusick 				push2(tl1 <= tl);
3762080Smckusick 				continue;
3772080Smckusick 			case relge:
3782080Smckusick 				push2(tl1 >= tl);
3792080Smckusick 				continue;
3802080Smckusick 			default:
3815682Smckusic 				ERROR("Panic: bad relation %d to REL4*\n",
3825682Smckusic 				    *(pc.cp - 1));
3832080Smckusick 				continue;
3842080Smckusick 			}
3852080Smckusick 		case O_RELG:
3862080Smckusick 			tl2 = *pc.cp++;		/* tc has jump opcode */
3872080Smckusick 			tl = *pc.usp++;		/* tl has comparison length */
3882080Smckusick 			tl1 = (tl + 1) & ~1;	/* tl1 has arg stack length */
3892950Smckusic 			tcp = pushsp((long)(0));/* tcp pts to first arg */
3902080Smckusick 			switch (tl2) {
3912080Smckusick 			case releq:
3922950Smckusic 				tb = RELEQ(tl, tcp + tl1, tcp);
3932080Smckusick 				break;
3942080Smckusick 			case relne:
3952950Smckusic 				tb = RELNE(tl, tcp + tl1, tcp);
3962080Smckusick 				break;
3972080Smckusick 			case rellt:
3982950Smckusic 				tb = RELSLT(tl, tcp + tl1, tcp);
3992080Smckusick 				break;
4002080Smckusick 			case relgt:
4012950Smckusic 				tb = RELSGT(tl, tcp + tl1, tcp);
4022080Smckusick 				break;
4032080Smckusick 			case relle:
4042950Smckusic 				tb = RELSLE(tl, tcp + tl1, tcp);
4052080Smckusick 				break;
4062080Smckusick 			case relge:
4072950Smckusic 				tb = RELSGE(tl, tcp + tl1, tcp);
4082080Smckusick 				break;
4092080Smckusick 			default:
4105682Smckusic 				ERROR("Panic: bad relation %d to RELG*\n", tl2);
4112080Smckusick 				break;
4122080Smckusick 			}
4132080Smckusick 			popsp(tl1 << 1);
4142950Smckusic 			push2((short)(tb));
4152080Smckusick 			continue;
4162080Smckusick 		case O_RELT:
4172080Smckusick 			tl2 = *pc.cp++;		/* tc has jump opcode */
4182080Smckusick 			tl1 = *pc.usp++;	/* tl1 has comparison length */
4192950Smckusic 			tcp = pushsp((long)(0));/* tcp pts to first arg */
4202080Smckusick 			switch (tl2) {
4212080Smckusick 			case releq:
4222950Smckusic 				tb = RELEQ(tl1, tcp + tl1, tcp);
4232080Smckusick 				break;
4242080Smckusick 			case relne:
4252950Smckusic 				tb = RELNE(tl1, tcp + tl1, tcp);
4262080Smckusick 				break;
4272080Smckusick 			case rellt:
4282950Smckusic 				tb = RELTLT(tl1, tcp + tl1, tcp);
4292080Smckusick 				break;
4302080Smckusick 			case relgt:
4312950Smckusic 				tb = RELTGT(tl1, tcp + tl1, tcp);
4322080Smckusick 				break;
4332080Smckusick 			case relle:
4342950Smckusic 				tb = RELTLE(tl1, tcp + tl1, tcp);
4352080Smckusick 				break;
4362080Smckusick 			case relge:
4372950Smckusic 				tb = RELTGE(tl1, tcp + tl1, tcp);
4382080Smckusick 				break;
4392080Smckusick 			default:
4405682Smckusic 				ERROR("Panic: bad relation %d to RELT*\n", tl2);
4412080Smckusick 				break;
4422080Smckusick 			}
4432080Smckusick 			popsp(tl1 << 1);
4442950Smckusic 			push2((short)(tb));
4452080Smckusick 			continue;
4462080Smckusick 		case O_REL28:
4472080Smckusick 			td = pop2();
4482080Smckusick 			td1 = pop8();
4492080Smckusick 			goto cmpdbl;
4502080Smckusick 		case O_REL48:
4512080Smckusick 			td = pop4();
4522080Smckusick 			td1 = pop8();
4532080Smckusick 			goto cmpdbl;
4542080Smckusick 		case O_REL82:
4552080Smckusick 			td = pop8();
4562080Smckusick 			td1 = pop2();
4572080Smckusick 			goto cmpdbl;
4582080Smckusick 		case O_REL84:
4592080Smckusick 			td = pop8();
4602080Smckusick 			td1 = pop4();
4612080Smckusick 			goto cmpdbl;
4622080Smckusick 		case O_REL8:
4632080Smckusick 			td = pop8();
4642080Smckusick 			td1 = pop8();
4652080Smckusick 		cmpdbl:
4662080Smckusick 			switch (*pc.cp++) {
4672080Smckusick 			case releq:
4682080Smckusick 				push2(td1 == td);
4692080Smckusick 				continue;
4702080Smckusick 			case relne:
4712080Smckusick 				push2(td1 != td);
4722080Smckusick 				continue;
4732080Smckusick 			case rellt:
4742080Smckusick 				push2(td1 < td);
4752080Smckusick 				continue;
4762080Smckusick 			case relgt:
4772080Smckusick 				push2(td1 > td);
4782080Smckusick 				continue;
4792080Smckusick 			case relle:
4802080Smckusick 				push2(td1 <= td);
4812080Smckusick 				continue;
4822080Smckusick 			case relge:
4832080Smckusick 				push2(td1 >= td);
4842080Smckusick 				continue;
4852080Smckusick 			default:
4865682Smckusic 				ERROR("Panic: bad relation %d to REL8*\n",
4875682Smckusic 				    *(pc.cp - 1));
4882080Smckusick 				continue;
4892080Smckusick 			}
4902080Smckusick 		case O_AND:
4912080Smckusick 			pc.cp++;
492*10576Smckusick 			tl = pop2();
493*10576Smckusick 			tl1 = pop2();
494*10576Smckusick 			push2(tl & tl1);
4952080Smckusick 			continue;
4962080Smckusick 		case O_OR:
4972080Smckusick 			pc.cp++;
498*10576Smckusick 			tl = pop2();
499*10576Smckusick 			tl1 = pop2();
500*10576Smckusick 			push2(tl | tl1);
5012080Smckusick 			continue;
5022080Smckusick 		case O_NOT:
5032080Smckusick 			pc.cp++;
504*10576Smckusick 			tl = pop2();
505*10576Smckusick 			push2(tl ^ 1);
5062080Smckusick 			continue;
5072080Smckusick 		case O_AS2:
5082080Smckusick 			pc.cp++;
5092080Smckusick 			tl = pop2();
5102080Smckusick 			*(short *)popaddr() = tl;
5112080Smckusick 			continue;
5122080Smckusick 		case O_AS4:
5132080Smckusick 			pc.cp++;
5142080Smckusick 			tl = pop4();
5152080Smckusick 			*(long *)popaddr() = tl;
5162080Smckusick 			continue;
5172080Smckusick 		case O_AS24:
5182080Smckusick 			pc.cp++;
5192080Smckusick 			tl = pop2();
5202080Smckusick 			*(long *)popaddr() = tl;
5212080Smckusick 			continue;
5222080Smckusick 		case O_AS42:
5232080Smckusick 			pc.cp++;
5242080Smckusick 			tl = pop4();
5252080Smckusick 			*(short *)popaddr() = tl;
5262080Smckusick 			continue;
5272080Smckusick 		case O_AS21:
5282080Smckusick 			pc.cp++;
5292080Smckusick 			tl = pop2();
5302080Smckusick 			*popaddr() = tl;
5312080Smckusick 			continue;
5322080Smckusick 		case O_AS41:
5332080Smckusick 			pc.cp++;
5342080Smckusick 			tl = pop4();
5352080Smckusick 			*popaddr() = tl;
5362080Smckusick 			continue;
5372080Smckusick 		case O_AS28:
5382080Smckusick 			pc.cp++;
5392080Smckusick 			tl = pop2();
5402080Smckusick 			*(double *)popaddr() = tl;
5412080Smckusick 			continue;
5422080Smckusick 		case O_AS48:
5432080Smckusick 			pc.cp++;
5442080Smckusick 			tl = pop4();
5452080Smckusick 			*(double *)popaddr() = tl;
5462080Smckusick 			continue;
5472080Smckusick 		case O_AS8:
5482080Smckusick 			pc.cp++;
5492239Smckusic 			t8 = popsze8();
5502239Smckusic 			*(struct sze8 *)popaddr() = t8;
5512080Smckusick 			continue;
5522080Smckusick 		case O_AS:
5532080Smckusick 			tl = *pc.cp++;
5542080Smckusick 			if (tl == 0)
5552080Smckusick 				tl = *pc.usp++;
5562080Smckusick 			tl1 = (tl + 1) & ~1;
5572950Smckusic 			tcp = pushsp((long)(0));
5589231Smckusick 			blkcpy(tcp, *(char **)(tcp + tl1), tl);
5592080Smckusick 			popsp(tl1 + sizeof(char *));
5602080Smckusick 			continue;
5612080Smckusick 		case O_INX2P2:
5622080Smckusick 			tl = *pc.cp++;		/* tl has shift amount */
563*10576Smckusick 			tl1 = pop2();
564*10576Smckusick 			tl1 = (tl1 - *pc.sp++) << tl;
565*10576Smckusick 			tcp = popaddr();
566*10576Smckusick 			pushaddr(tcp + tl1);
5672080Smckusick 			continue;
5682080Smckusick 		case O_INX4P2:
5692080Smckusick 			tl = *pc.cp++;		/* tl has shift amount */
570*10576Smckusick 			tl1 = pop4();
571*10576Smckusick 			tl1 = (tl1 - *pc.sp++) << tl;
572*10576Smckusick 			tcp = popaddr();
573*10576Smckusick 			pushaddr(tcp + tl1);
5742080Smckusick 			continue;
5752080Smckusick 		case O_INX2:
5762080Smckusick 			tl = *pc.cp++;		/* tl has element size */
5772080Smckusick 			if (tl == 0)
5782080Smckusick 				tl = *pc.usp++;
5792080Smckusick 			tl1 = pop2();		/* index */
5802080Smckusick 			tl2 = *pc.sp++;
581*10576Smckusick 			tcp = popaddr();
582*10576Smckusick 			pushaddr(tcp + (tl1 - tl2) * tl);
5832191Smckusic 			tl = *pc.usp++;
5842191Smckusic 			if (_runtst)
5852191Smckusic 				SUBSC(tl1, tl2, tl); /* range check */
5862080Smckusick 			continue;
5872080Smckusick 		case O_INX4:
5882080Smckusick 			tl = *pc.cp++;		/* tl has element size */
5892080Smckusick 			if (tl == 0)
5902080Smckusick 				tl = *pc.usp++;
5912080Smckusick 			tl1 = pop4();		/* index */
5922080Smckusick 			tl2 = *pc.sp++;
593*10576Smckusick 			tcp = popaddr();
594*10576Smckusick 			pushaddr(tcp + (tl1 - tl2) * tl);
5952191Smckusic 			tl = *pc.usp++;
5962191Smckusic 			if (_runtst)
5972191Smckusic 				SUBSC(tl1, tl2, tl); /* range check */
5982080Smckusick 			continue;
5992080Smckusick 		case O_OFF:
6002080Smckusick 			tl = *pc.cp++;
6012080Smckusick 			if (tl == 0)
6022080Smckusick 				tl = *pc.usp++;
603*10576Smckusick 			tcp = popaddr();
604*10576Smckusick 			pushaddr(tcp + tl);
6052080Smckusick 			continue;
6062080Smckusick 		case O_NIL:
6072080Smckusick 			pc.cp++;
6082080Smckusick 			NIL();
6092080Smckusick 			continue;
6102080Smckusick 		case O_ADD2:
6112080Smckusick 			pc.cp++;
612*10576Smckusick 			tl = pop2();
613*10576Smckusick 			tl1 = pop2();
614*10576Smckusick 			push4(tl1 + tl);
6152080Smckusick 			continue;
6162080Smckusick 		case O_ADD4:
6172080Smckusick 			pc.cp++;
618*10576Smckusick 			tl = pop4();
619*10576Smckusick 			tl1 = pop4();
620*10576Smckusick 			push4(tl1 + tl);
6212080Smckusick 			continue;
6222080Smckusick 		case O_ADD24:
6232080Smckusick 			pc.cp++;
6242080Smckusick 			tl = pop2();
625*10576Smckusick 			tl1 = pop4();
626*10576Smckusick 			push4(tl1 + tl);
6272080Smckusick 			continue;
6282080Smckusick 		case O_ADD42:
6292080Smckusick 			pc.cp++;
6302080Smckusick 			tl = pop4();
631*10576Smckusick 			tl1 = pop2();
632*10576Smckusick 			push4(tl1 + tl);
6332080Smckusick 			continue;
6342080Smckusick 		case O_ADD28:
6352080Smckusick 			pc.cp++;
6362080Smckusick 			tl = pop2();
637*10576Smckusick 			td = pop8();
638*10576Smckusick 			push8(td + tl);
6392080Smckusick 			continue;
6402080Smckusick 		case O_ADD48:
6412080Smckusick 			pc.cp++;
6422080Smckusick 			tl = pop4();
643*10576Smckusick 			td = pop8();
644*10576Smckusick 			push8(td + tl);
6452080Smckusick 			continue;
6462080Smckusick 		case O_ADD82:
6472080Smckusick 			pc.cp++;
6482080Smckusick 			td = pop8();
649*10576Smckusick 			td1 = pop2();
650*10576Smckusick 			push8(td1 + td);
6512080Smckusick 			continue;
6522080Smckusick 		case O_ADD84:
6532080Smckusick 			pc.cp++;
6542080Smckusick 			td = pop8();
655*10576Smckusick 			td1 = pop4();
656*10576Smckusick 			push8(td1 + td);
6572080Smckusick 			continue;
6582080Smckusick 		case O_SUB2:
6592080Smckusick 			pc.cp++;
6602080Smckusick 			tl = pop2();
661*10576Smckusick 			tl1 = pop2();
662*10576Smckusick 			push4(tl1 - tl);
6632080Smckusick 			continue;
6642080Smckusick 		case O_SUB4:
6652080Smckusick 			pc.cp++;
6662080Smckusick 			tl = pop4();
667*10576Smckusick 			tl1 = pop4();
668*10576Smckusick 			push4(tl1 - tl);
6692080Smckusick 			continue;
6702080Smckusick 		case O_SUB24:
6712080Smckusick 			pc.cp++;
6722080Smckusick 			tl = pop2();
673*10576Smckusick 			tl1 = pop4();
674*10576Smckusick 			push4(tl1 - tl);
6752080Smckusick 			continue;
6762080Smckusick 		case O_SUB42:
6772080Smckusick 			pc.cp++;
6782080Smckusick 			tl = pop4();
679*10576Smckusick 			tl1 = pop2();
680*10576Smckusick 			push4(tl1 - tl);
6812080Smckusick 			continue;
6822080Smckusick 		case O_SUB28:
6832080Smckusick 			pc.cp++;
6842080Smckusick 			tl = pop2();
685*10576Smckusick 			td = pop8();
686*10576Smckusick 			push8(td - tl);
6872080Smckusick 			continue;
6882080Smckusick 		case O_SUB48:
6892080Smckusick 			pc.cp++;
6902080Smckusick 			tl = pop4();
691*10576Smckusick 			td = pop8();
692*10576Smckusick 			push8(td - tl);
6932080Smckusick 			continue;
6942080Smckusick 		case O_SUB82:
6952080Smckusick 			pc.cp++;
6962080Smckusick 			td = pop8();
697*10576Smckusick 			td1 = pop2();
698*10576Smckusick 			push8(td1 - td);
6992080Smckusick 			continue;
7002080Smckusick 		case O_SUB84:
7012080Smckusick 			pc.cp++;
7022080Smckusick 			td = pop8();
703*10576Smckusick 			td1 = pop4();
704*10576Smckusick 			push8(td1 - td);
7052080Smckusick 			continue;
7062080Smckusick 		case O_MUL2:
7072080Smckusick 			pc.cp++;
708*10576Smckusick 			tl = pop2();
709*10576Smckusick 			tl1 = pop2();
710*10576Smckusick 			push4(tl1 * tl);
7112080Smckusick 			continue;
7122080Smckusick 		case O_MUL4:
7132080Smckusick 			pc.cp++;
714*10576Smckusick 			tl = pop4();
715*10576Smckusick 			tl1 = pop4();
716*10576Smckusick 			push4(tl1 * tl);
7172080Smckusick 			continue;
7182080Smckusick 		case O_MUL24:
7192080Smckusick 			pc.cp++;
7202080Smckusick 			tl = pop2();
721*10576Smckusick 			tl1 = pop4();
722*10576Smckusick 			push4(tl1 * tl);
7232080Smckusick 			continue;
7242080Smckusick 		case O_MUL42:
7252080Smckusick 			pc.cp++;
7262080Smckusick 			tl = pop4();
727*10576Smckusick 			tl1 = pop2();
728*10576Smckusick 			push4(tl1 * tl);
7292080Smckusick 			continue;
7302080Smckusick 		case O_MUL28:
7312080Smckusick 			pc.cp++;
7322080Smckusick 			tl = pop2();
733*10576Smckusick 			td = pop8();
734*10576Smckusick 			push8(td * tl);
7352080Smckusick 			continue;
7362080Smckusick 		case O_MUL48:
7372080Smckusick 			pc.cp++;
7382080Smckusick 			tl = pop4();
739*10576Smckusick 			td = pop8();
740*10576Smckusick 			push8(td * tl);
7412080Smckusick 			continue;
7422080Smckusick 		case O_MUL82:
7432080Smckusick 			pc.cp++;
7442080Smckusick 			td = pop8();
745*10576Smckusick 			td1 = pop2();
746*10576Smckusick 			push8(td1 * td);
7472080Smckusick 			continue;
7482080Smckusick 		case O_MUL84:
7492080Smckusick 			pc.cp++;
7502080Smckusick 			td = pop8();
751*10576Smckusick 			td1 = pop4();
752*10576Smckusick 			push8(td1 * td);
7532080Smckusick 			continue;
7542080Smckusick 		case O_ABS2:
7552080Smckusick 		case O_ABS4:
7562080Smckusick 			pc.cp++;
7572080Smckusick 			tl = pop4();
7582080Smckusick 			push4(tl >= 0 ? tl : -tl);
7592080Smckusick 			continue;
7602080Smckusick 		case O_ABS8:
7612080Smckusick 			pc.cp++;
7622080Smckusick 			td = pop8();
7632080Smckusick 			push8(td >= 0.0 ? td : -td);
7642080Smckusick 			continue;
7652080Smckusick 		case O_NEG2:
7662080Smckusick 			pc.cp++;
7672950Smckusic 			push4((long)(-pop2()));
7682080Smckusick 			continue;
7692080Smckusick 		case O_NEG4:
7702080Smckusick 			pc.cp++;
7712080Smckusick 			push4(-pop4());
7722080Smckusick 			continue;
7732080Smckusick 		case O_NEG8:
7742080Smckusick 			pc.cp++;
7752080Smckusick 			push8(-pop8());
7762080Smckusick 			continue;
7772080Smckusick 		case O_DIV2:
7782080Smckusick 			pc.cp++;
7792080Smckusick 			tl = pop2();
780*10576Smckusick 			tl1 = pop2();
781*10576Smckusick 			push4(tl1 / tl);
7822080Smckusick 			continue;
7832080Smckusick 		case O_DIV4:
7842080Smckusick 			pc.cp++;
7852080Smckusick 			tl = pop4();
786*10576Smckusick 			tl1 = pop4();
787*10576Smckusick 			push4(tl1 / tl);
7882080Smckusick 			continue;
7892080Smckusick 		case O_DIV24:
7902080Smckusick 			pc.cp++;
7912080Smckusick 			tl = pop2();
792*10576Smckusick 			tl1 = pop4();
793*10576Smckusick 			push4(tl1 / tl);
7942080Smckusick 			continue;
7952080Smckusick 		case O_DIV42:
7962080Smckusick 			pc.cp++;
7972080Smckusick 			tl = pop4();
798*10576Smckusick 			tl1 = pop2();
799*10576Smckusick 			push4(tl1 / tl);
8002080Smckusick 			continue;
8012080Smckusick 		case O_MOD2:
8022080Smckusick 			pc.cp++;
8032080Smckusick 			tl = pop2();
804*10576Smckusick 			tl1 = pop2();
805*10576Smckusick 			push4(tl1 % tl);
8062080Smckusick 			continue;
8072080Smckusick 		case O_MOD4:
8082080Smckusick 			pc.cp++;
8092080Smckusick 			tl = pop4();
810*10576Smckusick 			tl1 = pop4();
811*10576Smckusick 			push4(tl1 % tl);
8122080Smckusick 			continue;
8132080Smckusick 		case O_MOD24:
8142080Smckusick 			pc.cp++;
8152080Smckusick 			tl = pop2();
816*10576Smckusick 			tl1 = pop4();
817*10576Smckusick 			push4(tl1 % tl);
8182080Smckusick 			continue;
8192080Smckusick 		case O_MOD42:
8202080Smckusick 			pc.cp++;
8212080Smckusick 			tl = pop4();
822*10576Smckusick 			tl1 = pop2();
823*10576Smckusick 			push4(tl1 % tl);
8242080Smckusick 			continue;
8252080Smckusick 		case O_ADD8:
8262080Smckusick 			pc.cp++;
827*10576Smckusick 			td = pop8();
828*10576Smckusick 			td1 = pop8();
829*10576Smckusick 			push8(td + td1);
8302080Smckusick 			continue;
8312080Smckusick 		case O_SUB8:
8322080Smckusick 			pc.cp++;
8332080Smckusick 			td = pop8();
834*10576Smckusick 			td1 = pop8();
835*10576Smckusick 			push8(td - td1);
8362080Smckusick 			continue;
8372080Smckusick 		case O_MUL8:
8382080Smckusick 			pc.cp++;
839*10576Smckusick 			td = pop8();
840*10576Smckusick 			td1 = pop8();
841*10576Smckusick 			push8(td * td1);
8422080Smckusick 			continue;
8432080Smckusick 		case O_DVD8:
8442080Smckusick 			pc.cp++;
8452080Smckusick 			td = pop8();
846*10576Smckusick 			td1 = pop8();
847*10576Smckusick 			push8(td / td1);
8482080Smckusick 			continue;
8492080Smckusick 		case O_STOI:
8502080Smckusick 			pc.cp++;
8512950Smckusic 			push4((long)(pop2()));
8522080Smckusick 			continue;
8532080Smckusick 		case O_STOD:
8542080Smckusick 			pc.cp++;
8552080Smckusick 			td = pop2();
8562080Smckusick 			push8(td);
8572080Smckusick 			continue;
8582080Smckusick 		case O_ITOD:
8592080Smckusick 			pc.cp++;
8602080Smckusick 			td = pop4();
8612080Smckusick 			push8(td);
8622080Smckusick 			continue;
8632080Smckusick 		case O_ITOS:
8642080Smckusick 			pc.cp++;
8652950Smckusic 			push2((short)(pop4()));
8662080Smckusick 			continue;
8672080Smckusick 		case O_DVD2:
8682080Smckusick 			pc.cp++;
8692080Smckusick 			td = pop2();
870*10576Smckusick 			td1 = pop2();
871*10576Smckusick 			push8(td1 / td);
8722080Smckusick 			continue;
8732080Smckusick 		case O_DVD4:
8742080Smckusick 			pc.cp++;
8752080Smckusick 			td = pop4();
876*10576Smckusick 			td1 = pop4();
877*10576Smckusick 			push8(td1 / td);
8782080Smckusick 			continue;
8792080Smckusick 		case O_DVD24:
8802080Smckusick 			pc.cp++;
8812080Smckusick 			td = pop2();
882*10576Smckusick 			td1 = pop4();
883*10576Smckusick 			push8(td1 / td);
8842080Smckusick 			continue;
8852080Smckusick 		case O_DVD42:
8862080Smckusick 			pc.cp++;
8872080Smckusick 			td = pop4();
888*10576Smckusick 			td1 = pop2();
889*10576Smckusick 			push8(td1 / td);
8902080Smckusick 			continue;
8912080Smckusick 		case O_DVD28:
8922080Smckusick 			pc.cp++;
8932080Smckusick 			td = pop2();
894*10576Smckusick 			td1 = pop8();
895*10576Smckusick 			push8(td1 / td);
8962080Smckusick 			continue;
8972080Smckusick 		case O_DVD48:
8982080Smckusick 			pc.cp++;
899*10576Smckusick 			td1 = pop4();
900*10576Smckusick 			td = pop8();
901*10576Smckusick 			push8(td / td1);
9022080Smckusick 			continue;
9032080Smckusick 		case O_DVD82:
9042080Smckusick 			pc.cp++;
9052080Smckusick 			td = pop8();
906*10576Smckusick 			td1 = pop2();
907*10576Smckusick 			push8(td1 / td);
9082080Smckusick 			continue;
9092080Smckusick 		case O_DVD84:
9102080Smckusick 			pc.cp++;
9112080Smckusick 			td = pop8();
912*10576Smckusick 			td1 = pop4();
913*10576Smckusick 			push8(td1 / td);
9142080Smckusick 			continue;
9152080Smckusick 		case O_RV1:
9162109Smckusic 			tcp = _display.raw[*pc.ucp++];
9172950Smckusic 			push2((short)(*(tcp + *pc.sp++)));
9182080Smckusick 			continue;
9192080Smckusick 		case O_RV14:
9202109Smckusic 			tcp = _display.raw[*pc.ucp++];
9212950Smckusic 			push4((long)(*(tcp + *pc.sp++)));
9222080Smckusick 			continue;
9232080Smckusick 		case O_RV2:
9242109Smckusic 			tcp = _display.raw[*pc.ucp++];
9252080Smckusick 			push2(*(short *)(tcp + *pc.sp++));
9262080Smckusick 			continue;
9272080Smckusick 		case O_RV24:
9282109Smckusic 			tcp = _display.raw[*pc.ucp++];
9292950Smckusic 			push4((long)(*(short *)(tcp + *pc.sp++)));
9302080Smckusick 			continue;
9312080Smckusick 		case O_RV4:
9322109Smckusic 			tcp = _display.raw[*pc.ucp++];
9332080Smckusick 			push4(*(long *)(tcp + *pc.sp++));
9342080Smckusick 			continue;
9352080Smckusick 		case O_RV8:
9362109Smckusic 			tcp = _display.raw[*pc.ucp++];
9372239Smckusic 			pushsze8(*(struct sze8 *)(tcp + *pc.sp++));
9382080Smckusick 			continue;
9392080Smckusick 		case O_RV:
9402109Smckusic 			tcp = _display.raw[*pc.ucp++];
9412080Smckusick 			tcp += *pc.sp++;
9422080Smckusick 			tl = *pc.usp++;
9432338Smckusic 			tcp1 = pushsp((tl + 1) & ~1);
9449231Smckusick 			blkcpy(tcp, tcp1, tl);
9452080Smckusick 			continue;
9462080Smckusick 		case O_LV:
9472109Smckusic 			tcp = _display.raw[*pc.ucp++];
9482080Smckusick 			pushaddr(tcp + *pc.sp++);
9492080Smckusick 			continue;
9502080Smckusick 		case O_LRV1:
9512109Smckusic 			tcp = _display.raw[*pc.ucp++];
9522950Smckusic 			push2((short)(*(tcp + *pc.lp++)));
9532080Smckusick 			continue;
9542080Smckusick 		case O_LRV14:
9552109Smckusic 			tcp = _display.raw[*pc.ucp++];
9562950Smckusic 			push4((long)(*(tcp + *pc.lp++)));
9572080Smckusick 			continue;
9582080Smckusick 		case O_LRV2:
9592109Smckusic 			tcp = _display.raw[*pc.ucp++];
9602080Smckusick 			push2(*(short *)(tcp + *pc.lp++));
9612080Smckusick 			continue;
9622080Smckusick 		case O_LRV24:
9632109Smckusic 			tcp = _display.raw[*pc.ucp++];
9642950Smckusic 			push4((long)(*(short *)(tcp + *pc.lp++)));
9652080Smckusick 			continue;
9662080Smckusick 		case O_LRV4:
9672109Smckusic 			tcp = _display.raw[*pc.ucp++];
9682080Smckusick 			push4(*(long *)(tcp + *pc.lp++));
9692080Smckusick 			continue;
9702080Smckusick 		case O_LRV8:
9712109Smckusic 			tcp = _display.raw[*pc.ucp++];
9722239Smckusic 			pushsze8(*(struct sze8 *)(tcp + *pc.lp++));
9732080Smckusick 			continue;
9742080Smckusick 		case O_LRV:
9752109Smckusic 			tcp = _display.raw[*pc.ucp++];
9762950Smckusic 			tcp += (int)*pc.lp++;
9772080Smckusick 			tl = *pc.usp++;
9782950Smckusic 			tcp1 = pushsp((tl + 1) & ~1);
9799231Smckusick 			blkcpy(tcp, tcp1, tl);
9802080Smckusick 			continue;
9812080Smckusick 		case O_LLV:
9822109Smckusic 			tcp = _display.raw[*pc.ucp++];
9832080Smckusick 			pushaddr(tcp + *pc.lp++);
9842080Smckusick 			continue;
9852080Smckusick 		case O_IND1:
9862080Smckusick 			pc.cp++;
9872950Smckusic 			push2((short)(*popaddr()));
9882080Smckusick 			continue;
9892080Smckusick 		case O_IND14:
9902080Smckusick 			pc.cp++;
9912950Smckusic 			push4((long)(*popaddr()));
9922080Smckusick 			continue;
9932080Smckusick 		case O_IND2:
9942080Smckusick 			pc.cp++;
9952080Smckusick 			push2(*(short *)(popaddr()));
9962080Smckusick 			continue;
9972080Smckusick 		case O_IND24:
9982080Smckusick 			pc.cp++;
9992950Smckusic 			push4((long)(*(short *)(popaddr())));
10002080Smckusick 			continue;
10012080Smckusick 		case O_IND4:
10022080Smckusick 			pc.cp++;
10032080Smckusick 			push4(*(long *)(popaddr()));
10042080Smckusick 			continue;
10052080Smckusick 		case O_IND8:
10062080Smckusick 			pc.cp++;
10072239Smckusic 			pushsze8(*(struct sze8 *)(popaddr()));
10082080Smckusick 			continue;
10092080Smckusick 		case O_IND:
10102080Smckusick 			tl = *pc.cp++;
10112080Smckusick 			if (tl == 0)
10122080Smckusick 				tl = *pc.usp++;
10132080Smckusick 			tcp = popaddr();
10142080Smckusick 			tcp1 = pushsp((tl + 1) & ~1);
10159231Smckusick 			blkcpy(tcp, tcp1, tl);
10162080Smckusick 			continue;
10172080Smckusick 		case O_CON1:
10182950Smckusic 			push2((short)(*pc.cp++));
10192080Smckusick 			continue;
10202080Smckusick 		case O_CON14:
10212950Smckusic 			push4((long)(*pc.cp++));
10222080Smckusick 			continue;
10232080Smckusick 		case O_CON2:
10242080Smckusick 			pc.cp++;
10252080Smckusick 			push2(*pc.sp++);
10262080Smckusick 			continue;
10272080Smckusick 		case O_CON24:
10282080Smckusick 			pc.cp++;
10292950Smckusic 			push4((long)(*pc.sp++));
10302080Smckusick 			continue;
10312080Smckusick 		case O_CON4:
10322080Smckusick 			pc.cp++;
10332080Smckusick 			push4(*pc.lp++);
10342080Smckusick 			continue;
10352080Smckusick 		case O_CON8:
10362080Smckusick 			pc.cp++;
10372950Smckusic 			push8(*pc.dbp++);
10382080Smckusick 			continue;
10392080Smckusick 		case O_CON:
10402080Smckusick 			tl = *pc.cp++;
10412080Smckusick 			if (tl == 0)
10422080Smckusick 				tl = *pc.usp++;
10432080Smckusick 			tl = (tl + 1) & ~1;
10442080Smckusick 			tcp = pushsp(tl);
10459231Smckusick 			blkcpy(pc.cp, tcp, tl);
10462950Smckusic 			pc.cp += (int)tl;
10472080Smckusick 			continue;
10482950Smckusic 		case O_CONG:
10492950Smckusic 			tl = *pc.cp++;
10502950Smckusic 			if (tl == 0)
10512950Smckusic 				tl = *pc.usp++;
10522950Smckusic 			tl1 = (tl + 1) & ~1;
10532950Smckusic 			tcp = pushsp(tl1);
10549231Smckusick 			blkcpy(pc.cp, tcp, tl1);
10552950Smckusic 			pc.cp += (int)((tl + 2) & ~1);
10562950Smckusic 			continue;
10572080Smckusick 		case O_LVCON:
10582080Smckusick 			tl = *pc.cp++;
10592080Smckusick 			if (tl == 0)
10602080Smckusick 				tl = *pc.usp++;
10612080Smckusick 			tl = (tl + 1) & ~1;
10622080Smckusick 			pushaddr(pc.cp);
10632950Smckusic 			pc.cp += (int)tl;
10642080Smckusick 			continue;
10652080Smckusick 		case O_RANG2:
10662080Smckusick 			tl = *pc.cp++;
10672080Smckusick 			if (tl == 0)
10682080Smckusick 				tl = *pc.sp++;
10692080Smckusick 			tl1 = pop2();
10704026Smckusic 			push2((short)(RANG4(tl1, tl, (long)(*pc.sp++))));
10712080Smckusick 			continue;
10722080Smckusick 		case O_RANG42:
10732080Smckusick 			tl = *pc.cp++;
10742080Smckusick 			if (tl == 0)
10752080Smckusick 				tl = *pc.sp++;
10762080Smckusick 			tl1 = pop4();
10774026Smckusic 			push4(RANG4(tl1, tl, (long)(*pc.sp++)));
10782080Smckusick 			continue;
10792080Smckusick 		case O_RSNG2:
10802080Smckusick 			tl = *pc.cp++;
10812080Smckusick 			if (tl == 0)
10822080Smckusick 				tl = *pc.sp++;
10832080Smckusick 			tl1 = pop2();
10842950Smckusic 			push2((short)(RSNG4(tl1, tl)));
10852080Smckusick 			continue;
10862080Smckusick 		case O_RSNG42:
10872080Smckusick 			tl = *pc.cp++;
10882080Smckusick 			if (tl == 0)
10892080Smckusick 				tl = *pc.sp++;
10902080Smckusick 			tl1 = pop4();
10912080Smckusick 			push4(RSNG4(tl1, tl));
10922080Smckusick 			continue;
10932080Smckusick 		case O_RANG4:
10944026Smckusic 			tl = *pc.cp++;
10954026Smckusic 			if (tl == 0)
10964026Smckusic 				tl = *pc.lp++;
10972080Smckusick 			tl1 = pop4();
10982080Smckusick 			push4(RANG4(tl1, tl, *pc.lp++));
10992080Smckusick 			continue;
11002080Smckusick 		case O_RANG24:
11014026Smckusic 			tl = *pc.cp++;
11024026Smckusic 			if (tl == 0)
11034026Smckusic 				tl = *pc.lp++;
11042080Smckusick 			tl1 = pop2();
11052950Smckusic 			push2((short)(RANG4(tl1, tl, *pc.lp++)));
11062080Smckusick 			continue;
11072080Smckusick 		case O_RSNG4:
11084026Smckusic 			tl = *pc.cp++;
11094026Smckusic 			if (tl == 0)
11104026Smckusic 				tl = *pc.lp++;
11114026Smckusic 			tl1 = pop4();
11124026Smckusic 			push4(RSNG4(tl1, tl));
11132080Smckusick 			continue;
11142080Smckusick 		case O_RSNG24:
11154026Smckusic 			tl = *pc.cp++;
11164026Smckusic 			if (tl == 0)
11174026Smckusic 				tl = *pc.lp++;
11184026Smckusic 			tl1 = pop2();
11194026Smckusic 			push2((short)(RSNG4(tl1, tl)));
11202080Smckusick 			continue;
11212080Smckusick 		case O_STLIM:
11222080Smckusick 			pc.cp++;
11232121Smckusic 			STLIM();
11242950Smckusic 			popsp((long)(sizeof(long)));
11252080Smckusick 			continue;
11262080Smckusick 		case O_LLIMIT:
11272080Smckusick 			pc.cp++;
11282080Smckusick 			LLIMIT();
11292950Smckusic 			popsp((long)(sizeof(char *)+sizeof(long)));
11302080Smckusick 			continue;
11312080Smckusick 		case O_BUFF:
11322950Smckusic 			BUFF((long)(*pc.cp++));
11332080Smckusick 			continue;
11342080Smckusick 		case O_HALT:
11352080Smckusick 			pc.cp++;
11365682Smckusic 			if (_nodump == TRUE)
11375682Smckusic 				psexit(0);
11385682Smckusic 			fputs("\nCall to procedure halt\n", stderr);
11395682Smckusic 			backtrace("Halted");
11405682Smckusic 			psexit(0);
11412080Smckusick 			continue;
11422080Smckusick 		case O_PXPBUF:
11432080Smckusick 			pc.cp++;
11442080Smckusick 			_cntrs = *pc.lp++;
11452080Smckusick 			_rtns = *pc.lp++;
11469231Smckusick 			NEW(&_pcpcount, (_cntrs + 1) * sizeof(long));
11479231Smckusick 			blkclr(_pcpcount, (_cntrs + 1) * sizeof(long));
11482080Smckusick 			continue;
11492080Smckusick 		case O_COUNT:
11502080Smckusick 			pc.cp++;
11512080Smckusick 			_pcpcount[*pc.usp++]++;
11522080Smckusick 			continue;
11532080Smckusick 		case O_CASE1OP:
11542080Smckusick 			tl = *pc.cp++;		/* tl = number of cases */
11552080Smckusick 			if (tl == 0)
11562080Smckusick 				tl = *pc.usp++;
11572080Smckusick 			tsp = pc.sp + tl;	/* ptr to end of jump table */
11582080Smckusick 			tcp = (char *)tsp;	/* tcp = ptr to case values */
11592080Smckusick 			tl1 = pop2();		/* tl1 = element to find */
11602080Smckusick 			for(; tl > 0; tl--)	/* look for element */
11612080Smckusick 				if (tl1 == *tcp++)
11622080Smckusick 					break;
11632080Smckusick 			if (tl == 0)		/* default case => error */
11645666Smckusic 				CASERNG(tl1);
11652080Smckusick 			pc.cp += *(tsp - tl);
11662080Smckusick 			continue;
11672080Smckusick 		case O_CASE2OP:
11682080Smckusick 			tl = *pc.cp++;		/* tl = number of cases */
11692080Smckusick 			if (tl == 0)
11702080Smckusick 				tl = *pc.usp++;
11712080Smckusick 			tsp = pc.sp + tl;	/* ptr to end of jump table */
11722080Smckusick 			tsp1 = tsp;		/* tsp1 = ptr to case values */
11732080Smckusick 			tl1 = (unsigned short)pop2();/* tl1 = element to find */
11742080Smckusick 			for(; tl > 0; tl--)	/* look for element */
11752080Smckusick 				if (tl1 == *tsp1++)
11762080Smckusick 					break;
11772080Smckusick 			if (tl == 0)		/* default case => error */
11785666Smckusic 				CASERNG(tl1);
11792080Smckusick 			pc.cp += *(tsp - tl);
11802080Smckusick 			continue;
11812080Smckusick 		case O_CASE4OP:
11822080Smckusick 			tl = *pc.cp++;		/* tl = number of cases */
11832080Smckusick 			if (tl == 0)
11842080Smckusick 				tl = *pc.usp++;
11852080Smckusick 			tsp = pc.sp + tl;	/* ptr to end of jump table */
11862080Smckusick 			tlp = (long *)tsp;	/* tlp = ptr to case values */
11872080Smckusick 			tl1 = pop4();		/* tl1 = element to find */
11882080Smckusick 			for(; tl > 0; tl--)	/* look for element */
11892080Smckusick 				if (tl1 == *tlp++)
11902080Smckusick 					break;
11912080Smckusick 			if (tl == 0)		/* default case => error */
11925666Smckusic 				CASERNG(tl1);
11932080Smckusick 			pc.cp += *(tsp - tl);
11942080Smckusick 			continue;
11952080Smckusick 		case O_ADDT:
11962080Smckusick 			tl = *pc.cp++;		/* tl has comparison length */
11972080Smckusick 			if (tl == 0)
11982080Smckusick 				tl = *pc.usp++;
11992950Smckusic 			tcp = pushsp((long)(0));/* tcp pts to first arg */
12002080Smckusick 			ADDT(tcp + tl, tcp + tl, tcp, tl >> 2);
12012080Smckusick 			popsp(tl);
12022080Smckusick 			continue;
12032080Smckusick 		case O_SUBT:
12042080Smckusick 			tl = *pc.cp++;		/* tl has comparison length */
12052080Smckusick 			if (tl == 0)
12062080Smckusick 				tl = *pc.usp++;
12072950Smckusic 			tcp = pushsp((long)(0));/* tcp pts to first arg */
12082080Smckusick 			SUBT(tcp + tl, tcp + tl, tcp, tl >> 2);
12092080Smckusick 			popsp(tl);
12102080Smckusick 			continue;
12112080Smckusick 		case O_MULT:
12122080Smckusick 			tl = *pc.cp++;		/* tl has comparison length */
12132080Smckusick 			if (tl == 0)
12142080Smckusick 				tl = *pc.usp++;
12152950Smckusic 			tcp = pushsp((long)(0));/* tcp pts to first arg */
12162080Smckusick 			MULT(tcp + tl, tcp + tl, tcp, tl >> 2);
12172080Smckusick 			popsp(tl);
12182080Smckusick 			continue;
12192080Smckusick 		case O_INCT:
12202080Smckusick 			tl = *pc.cp++;		/* tl has number of args */
12212080Smckusick 			if (tl == 0)
12222080Smckusick 				tl = *pc.usp++;
12232950Smckusic 			tb = INCT();
12242950Smckusic 			popsp(tl*sizeof(long));
12252950Smckusic 			push2((short)(tb));
12262080Smckusick 			continue;
12272080Smckusick 		case O_CTTOT:
12282080Smckusick 			tl = *pc.cp++;		/* tl has number of args */
12292080Smckusick 			if (tl == 0)
12302080Smckusick 				tl = *pc.usp++;
12312080Smckusick 			tl1 = tl * sizeof(long);
12322950Smckusic 			tcp = pushsp((long)(0)) + tl1; /* tcp pts to result */
12332080Smckusick 			CTTOT(tcp);
12342950Smckusic 			popsp(tl*sizeof(long));
12352080Smckusick 			continue;
12362080Smckusick 		case O_CARD:
12372080Smckusick 			tl = *pc.cp++;		/* tl has comparison length */
12382080Smckusick 			if (tl == 0)
12392080Smckusick 				tl = *pc.usp++;
12402950Smckusic 			tcp = pushsp((long)(0));/* tcp pts to set */
12412080Smckusick 			tl1 = CARD(tcp, tl);
12422080Smckusick 			popsp(tl);
12432950Smckusic 			push2((short)(tl1));
12442080Smckusick 			continue;
12452080Smckusick 		case O_IN:
12462080Smckusick 			tl = *pc.cp++;		/* tl has comparison length */
12472080Smckusick 			if (tl == 0)
12482080Smckusick 				tl = *pc.usp++;
12492080Smckusick 			tl1 = pop4();		/* tl1 is the element */
12502950Smckusic 			tcp = pushsp((long)(0));/* tcp pts to set */
12514026Smckusic 			tl2 = *pc.sp++;	/* lower bound */
12522950Smckusic 			tb = IN(tl1, tl2, (long)(*pc.usp++), tcp);
12532080Smckusick 			popsp(tl);
12542950Smckusic 			push2((short)(tb));
12552080Smckusick 			continue;
12562080Smckusick 		case O_ASRT:
12572080Smckusick 			pc.cp++;
12589231Smckusick 			ASRTS();
12597923Smckusick 			popsp((long)(sizeof(long)+sizeof(char *)));
12602080Smckusick 			continue;
12612080Smckusick 		case O_FOR1U:
1262*10576Smckusick 			tl1 = *pc.cp++;		/* tl1 index lower bound */
1263*10576Smckusick 			if (tl1 == 0)
1264*10576Smckusick 				tl1 = *pc.sp++;
1265*10576Smckusick 			tcp = popaddr();	/* tcp = ptr to index var */
1266*10576Smckusick 			tl = pop4();
1267*10576Smckusick 			if (*tcp < tl) {	/* still going up */
1268*10576Smckusick 				tl = *tcp + 1;	/* inc index var */
1269*10576Smckusick 				tl2 = *pc.sp++;	/* index upper bound */
1270*10576Smckusick 				if (_runtst)
1271*10576Smckusick 					RANG4(tl, tl1, tl2);
1272*10576Smckusick 				*tcp = tl;	/* update index var */
1273*10576Smckusick 				pc.cp += *pc.sp;/* return to top of loop */
1274*10576Smckusick 				continue;
1275*10576Smckusick 			}
1276*10576Smckusick 			pc.sp += 2;		/* else fall through */
1277*10576Smckusick 			continue;
12782080Smckusick 		case O_FOR2U:
12794026Smckusic 			tl1 = *pc.cp++;		/* tl1 index lower bound */
12804026Smckusic 			if (tl1 == 0)
12814026Smckusic 				tl1 = *pc.sp++;
1282*10576Smckusick 			tsp = (short *)popaddr(); /* tsp = ptr to index var */
1283*10576Smckusick 			tl = pop4();
1284*10576Smckusick 			if (*tsp < tl) {	/* still going up */
1285*10576Smckusick 				tl = *tsp + 1;	/* inc index var */
12862191Smckusic 				tl2 = *pc.sp++;	/* index upper bound */
12872191Smckusic 				if (_runtst)
12882191Smckusic 					RANG4(tl, tl1, tl2);
1289*10576Smckusick 				*tsp = tl;	/* update index var */
12902080Smckusick 				pc.cp += *pc.sp;/* return to top of loop */
12912080Smckusick 				continue;
12922080Smckusick 			}
12934026Smckusic 			pc.sp += 2;		/* else fall through */
12942080Smckusick 			continue;
12952080Smckusick 		case O_FOR4U:
12964026Smckusic 			tl1 = *pc.cp++;		/* tl1 index lower bound */
12974026Smckusic 			if (tl1 == 0)
12984026Smckusic 				tl1 = *pc.lp++;
12992950Smckusic 			tlp = (long *)popaddr(); /* tlp = ptr to index var */
1300*10576Smckusick 			tl = pop4();
1301*10576Smckusick 			if (*tlp < tl) {	/* still going up */
13022191Smckusic 				tl = *tlp + 1;	/* inc index var */
13032191Smckusic 				tl2 = *pc.lp++;	/* index upper bound */
13042191Smckusic 				if (_runtst)
13052191Smckusic 					RANG4(tl, tl1, tl2);
13062191Smckusic 				*tlp = tl;	/* update index var */
13072080Smckusick 				pc.cp += *pc.sp;/* return to top of loop */
13082080Smckusick 				continue;
13092080Smckusick 			}
13104026Smckusic 			pc.sp += 3;		/* else fall through */
13112080Smckusick 			continue;
13122080Smckusick 		case O_FOR1D:
1313*10576Smckusick 			tl1 = *pc.cp++;		/* tl1 index lower bound */
1314*10576Smckusick 			if (tl1 == 0)
1315*10576Smckusick 				tl1 = *pc.sp++;
1316*10576Smckusick 			tcp = popaddr();	/* tcp = ptr to index var */
1317*10576Smckusick 			tl = pop4();
1318*10576Smckusick 			if (*tcp > tl) {	/* still going down */
1319*10576Smckusick 				tl = *tcp - 1;	/* inc index var */
1320*10576Smckusick 				tl2 = *pc.sp++;	/* index upper bound */
1321*10576Smckusick 				if (_runtst)
1322*10576Smckusick 					RANG4(tl, tl1, tl2);
1323*10576Smckusick 				*tcp = tl;	/* update index var */
1324*10576Smckusick 				pc.cp += *pc.sp;/* return to top of loop */
1325*10576Smckusick 				continue;
1326*10576Smckusick 			}
1327*10576Smckusick 			pc.sp += 2;		/* else fall through */
1328*10576Smckusick 			continue;
13292080Smckusick 		case O_FOR2D:
13304026Smckusic 			tl1 = *pc.cp++;		/* tl1 index lower bound */
13314026Smckusic 			if (tl1 == 0)
13324026Smckusic 				tl1 = *pc.sp++;
1333*10576Smckusick 			tsp = (short *)popaddr(); /* tsp = ptr to index var */
1334*10576Smckusick 			tl = pop4();
1335*10576Smckusick 			if (*tsp > tl) {	/* still going down */
1336*10576Smckusick 				tl = *tsp - 1;	/* inc index var */
13372191Smckusic 				tl2 = *pc.sp++;	/* index upper bound */
13382191Smckusic 				if (_runtst)
13392191Smckusic 					RANG4(tl, tl1, tl2);
1340*10576Smckusick 				*tsp = tl;	/* update index var */
13412080Smckusick 				pc.cp += *pc.sp;/* return to top of loop */
13422080Smckusick 				continue;
13432080Smckusick 			}
13444026Smckusic 			pc.sp += 2;		/* else fall through */
13452080Smckusick 			continue;
13462080Smckusick 		case O_FOR4D:
13474026Smckusic 			tl1 = *pc.cp++;		/* tl1 index lower bound */
13484026Smckusic 			if (tl1 == 0)
13494026Smckusic 				tl1 = *pc.lp++;
13502950Smckusic 			tlp = (long *)popaddr(); /* tlp = ptr to index var */
1351*10576Smckusick 			tl = pop4();
1352*10576Smckusick 			if (*tlp > tl) {	/* still going down */
13532191Smckusic 				tl = *tlp - 1;	/* inc index var */
13542191Smckusic 				tl2 = *pc.lp++;	/* index upper bound */
13552191Smckusic 				if (_runtst)
13562191Smckusic 					RANG4(tl, tl1, tl2);
13572191Smckusic 				*tlp = tl;	/* update index var */
13582080Smckusick 				pc.cp += *pc.sp;/* return to top of loop */
13592080Smckusick 				continue;
13602080Smckusick 			}
13614026Smckusic 			pc.sp += 3;		/* else fall through */
13622080Smckusick 			continue;
13632080Smckusick 		case O_READE:
13642080Smckusick 			pc.cp++;
13652950Smckusic 			push2((short)(READE(curfile, base + *pc.lp++)));
13662080Smckusick 			continue;
13672080Smckusick 		case O_READ4:
13682080Smckusick 			pc.cp++;
13692080Smckusick 			push4(READ4(curfile));
13702080Smckusick 			continue;
13712080Smckusick 		case O_READC:
13722080Smckusick 			pc.cp++;
13732950Smckusic 			push2((short)(READC(curfile)));
13742080Smckusick 			continue;
13752080Smckusick 		case O_READ8:
13762080Smckusick 			pc.cp++;
13772080Smckusick 			push8(READ8(curfile));
13782080Smckusick 			continue;
13792080Smckusick 		case O_READLN:
13802080Smckusick 			pc.cp++;
13812080Smckusick 			READLN(curfile);
13822080Smckusick 			continue;
13832080Smckusick 		case O_EOF:
13842080Smckusick 			pc.cp++;
13852950Smckusic 			push2((short)(TEOF(popaddr())));
13862080Smckusick 			continue;
13872080Smckusick 		case O_EOLN:
13882080Smckusick 			pc.cp++;
13892950Smckusic 			push2((short)(TEOLN(popaddr())));
13902080Smckusick 			continue;
13912080Smckusick 		case O_WRITEC:
13922191Smckusic 			if (_runtst) {
13932191Smckusic 				WRITEC(curfile);
13943166Smckusic 				popsp((long)(*pc.cp++));
13952191Smckusic 				continue;
13962191Smckusic 			}
13972191Smckusic 			fputc();
13983166Smckusic 			popsp((long)(*pc.cp++));
13992080Smckusick 			continue;
14002080Smckusick 		case O_WRITES:
14012191Smckusic 			if (_runtst) {
14022191Smckusic 				WRITES(curfile);
14033166Smckusic 				popsp((long)(*pc.cp++));
14042191Smckusic 				continue;
14052191Smckusic 			}
14062191Smckusic 			fwrite();
14073166Smckusic 			popsp((long)(*pc.cp++));
14082080Smckusick 			continue;
14092080Smckusick 		case O_WRITEF:
14102191Smckusic 			if (_runtst) {
14112191Smckusic 				WRITEF(curfile);
14123166Smckusic 				popsp((long)(*pc.cp++));
14132191Smckusic 				continue;
14142191Smckusic 			}
14152191Smckusic 			fprintf();
14163166Smckusic 			popsp((long)(*pc.cp++));
14172080Smckusick 			continue;
14182080Smckusick 		case O_WRITLN:
14192080Smckusick 			pc.cp++;
14202191Smckusic 			if (_runtst) {
14212191Smckusic 				WRITLN(curfile);
14222191Smckusic 				continue;
14232191Smckusic 			}
14242191Smckusic 			fputc('\n', ACTFILE(curfile));
14252080Smckusick 			continue;
14262080Smckusick 		case O_PAGE:
14272080Smckusick 			pc.cp++;
14282191Smckusic 			if (_runtst) {
14292191Smckusic 				PAGE(curfile);
14302191Smckusic 				continue;
14312191Smckusic 			}
14322950Smckusic 			fputc('', ACTFILE(curfile));
14332080Smckusick 			continue;
14342080Smckusick 		case O_NAM:
14352080Smckusick 			pc.cp++;
14362080Smckusick 			tl = pop4();
14372080Smckusick 			pushaddr(NAM(tl, base + *pc.lp++));
14382080Smckusick 			continue;
14392080Smckusick 		case O_MAX:
14402080Smckusick 			tl = *pc.cp++;
14412080Smckusick 			if (tl == 0)
14422080Smckusick 				tl = *pc.usp++;
14432080Smckusick 			tl1 = pop4();
14442191Smckusic 			if (_runtst) {
14452950Smckusic 				push4(MAX(tl1, tl, (long)(*pc.usp++)));
14462191Smckusic 				continue;
14472191Smckusic 			}
14482191Smckusic 			tl1 -= tl;
14492191Smckusic 			tl = *pc.usp++;
14502191Smckusic 			push4(tl1 > tl ? tl1 : tl);
14512080Smckusick 			continue;
14522080Smckusick 		case O_MIN:
14532080Smckusick 			tl = *pc.cp++;
14542080Smckusick 			if (tl == 0)
14552080Smckusick 				tl = *pc.usp++;
14562080Smckusick 			tl1 = pop4();
14572080Smckusick 			push4(tl1 < tl ? tl1 : tl);
14582080Smckusick 			continue;
14592080Smckusick 		case O_UNIT:
14602080Smckusick 			pc.cp++;
14612080Smckusick 			curfile = UNIT(popaddr());
14622080Smckusick 			continue;
14632080Smckusick 		case O_UNITINP:
14642080Smckusick 			pc.cp++;
14652080Smckusick 			curfile = INPUT;
14662080Smckusick 			continue;
14672080Smckusick 		case O_UNITOUT:
14682080Smckusick 			pc.cp++;
14692080Smckusick 			curfile = OUTPUT;
14702080Smckusick 			continue;
14712080Smckusick 		case O_MESSAGE:
14722080Smckusick 			pc.cp++;
14732080Smckusick 			PFLUSH();
14742080Smckusick 			curfile = ERR;
14752080Smckusick 			continue;
14762109Smckusic 		case O_PUT:
14772109Smckusic 			pc.cp++;
14782109Smckusic 			PUT(curfile);
14792109Smckusic 			continue;
14802080Smckusick 		case O_GET:
14812080Smckusick 			pc.cp++;
14822080Smckusick 			GET(curfile);
14832080Smckusick 			continue;
14842080Smckusick 		case O_FNIL:
14852080Smckusick 			pc.cp++;
14862080Smckusick 			pushaddr(FNIL(popaddr()));
14872080Smckusick 			continue;
14882080Smckusick 		case O_DEFNAME:
14892080Smckusick 			pc.cp++;
14902080Smckusick 			DEFNAME();
14912950Smckusic 			popsp((long)(2*sizeof(char *)+2*sizeof(long)));
14922080Smckusick 			continue;
14932080Smckusick 		case O_RESET:
14942080Smckusick 			pc.cp++;
14952080Smckusick 			RESET();
14962950Smckusic 			popsp((long)(2*sizeof(char *)+2*sizeof(long)));
14972080Smckusick 			continue;
14982080Smckusick 		case O_REWRITE:
14992080Smckusick 			pc.cp++;
15002080Smckusick 			REWRITE();
15012950Smckusic 			popsp((long)(2*sizeof(char *)+2*sizeof(long)));
15022080Smckusick 			continue;
15032080Smckusick 		case O_FILE:
15042080Smckusick 			pc.cp++;
15052080Smckusick 			pushaddr(ACTFILE(curfile));
15062080Smckusick 			continue;
15072080Smckusick 		case O_REMOVE:
15082080Smckusick 			pc.cp++;
15092080Smckusick 			REMOVE();
15102950Smckusic 			popsp((long)(sizeof(char *)+sizeof(long)));
15112080Smckusick 			continue;
15122080Smckusick 		case O_FLUSH:
15132080Smckusick 			pc.cp++;
15142080Smckusick 			FLUSH();
15152950Smckusic 			popsp((long)(sizeof(char *)));
15162080Smckusick 			continue;
15172080Smckusick 		case O_PACK:
15182080Smckusick 			pc.cp++;
15192080Smckusick 			PACK();
15202950Smckusic 			popsp((long)(5*sizeof(long)+2*sizeof(char*)));
15212080Smckusick 			continue;
15222080Smckusick 		case O_UNPACK:
15232080Smckusick 			pc.cp++;
15242080Smckusick 			UNPACK();
15252950Smckusic 			popsp((long)(5*sizeof(long)+2*sizeof(char*)));
15262080Smckusick 			continue;
15272080Smckusick 		case O_ARGC:
15282080Smckusick 			pc.cp++;
15292950Smckusic 			push4((long)_argc);
15302080Smckusick 			continue;
15312080Smckusick 		case O_ARGV:
15322080Smckusick 			tl = *pc.cp++;		/* tl = size of char array */
15332080Smckusick 			if (tl == 0)
15342080Smckusick 				tl = *pc.usp++;
15352080Smckusick 			tcp = popaddr();	/* tcp = addr of char array */
15362080Smckusick 			tl1 = pop4();		/* tl1 = argv subscript */
15372080Smckusick 			ARGV(tl1, tcp, tl);
15382080Smckusick 			continue;
15392080Smckusick 		case O_CLCK:
15402080Smckusick 			pc.cp++;
15412080Smckusick 			push4(CLCK());
15422080Smckusick 			continue;
15432080Smckusick 		case O_WCLCK:
15442080Smckusick 			pc.cp++;
15452080Smckusick 			push4(time(0));
15462080Smckusick 			continue;
15472080Smckusick 		case O_SCLCK:
15482080Smckusick 			pc.cp++;
15492080Smckusick 			push4(SCLCK());
15502080Smckusick 			continue;
15512080Smckusick 		case O_NEW:
15522080Smckusick 			tl = *pc.cp++;		/* tl = size being new'ed */
15532080Smckusick 			if (tl == 0)
15542080Smckusick 				tl = *pc.usp++;
15552080Smckusick 			tcp = popaddr();	/* ptr to ptr being new'ed */
15569231Smckusick 			NEW(tcp, tl);
15572191Smckusic 			if (_runtst) {
15589263Smckusick 				blkclr(*((char **)(tcp)), tl);
15592191Smckusic 			}
15602080Smckusick 			continue;
15617961Smckusick 		case O_DISPOSE:
15627961Smckusick 			tl = *pc.cp++;		/* tl = size being disposed */
15637961Smckusick 			if (tl == 0)
15647961Smckusick 				tl = *pc.usp++;
15657961Smckusick 			tcp = popaddr();	/* ptr to ptr being disposed */
15667961Smckusick 			DISPOSE(tcp, tl);
15677961Smckusick 			*(char **)tcp = (char *)0;
15687961Smckusick 			continue;
15697961Smckusick 		case O_DFDISP:
15707961Smckusick 			tl = *pc.cp++;		/* tl = size being disposed */
15717961Smckusick 			if (tl == 0)
15727961Smckusick 				tl = *pc.usp++;
15737961Smckusick 			tcp = popaddr();	/* ptr to ptr being disposed */
15747961Smckusick 			DFDISPOSE(tcp, tl);
15757961Smckusick 			*(char **)tcp = (char *)0;
15767961Smckusick 			continue;
15772080Smckusick 		case O_DATE:
15782080Smckusick 			pc.cp++;
15792080Smckusick 			DATE(popaddr());
15802080Smckusick 			continue;
15812080Smckusick 		case O_TIME:
15822080Smckusick 			pc.cp++;
15832080Smckusick 			TIME(popaddr());
15842080Smckusick 			continue;
15852080Smckusick 		case O_UNDEF:
15862080Smckusick 			pc.cp++;
15872080Smckusick 			pop8();
15882950Smckusic 			push2((short)(0));
15892080Smckusick 			continue;
15902080Smckusick 		case O_ATAN:
15912080Smckusick 			pc.cp++;
15925723Smckusic 			if (_runtst) {
15935723Smckusic 				push8(ATAN(pop8()));
15945723Smckusic 				continue;
15955723Smckusic 			}
15962080Smckusick 			push8(atan(pop8()));
15972080Smckusick 			continue;
15982080Smckusick 		case O_COS:
15992080Smckusick 			pc.cp++;
16005723Smckusic 			if (_runtst) {
16015723Smckusic 				push8(COS(pop8()));
16025723Smckusic 				continue;
16035723Smckusic 			}
16042080Smckusick 			push8(cos(pop8()));
16052080Smckusick 			continue;
16062080Smckusick 		case O_EXP:
16072080Smckusick 			pc.cp++;
16085723Smckusic 			if (_runtst) {
16095723Smckusic 				push8(EXP(pop8()));
16105723Smckusic 				continue;
16115723Smckusic 			}
16122080Smckusick 			push8(exp(pop8()));
16132080Smckusick 			continue;
16142080Smckusick 		case O_LN:
16152080Smckusick 			pc.cp++;
16162191Smckusic 			if (_runtst) {
16172191Smckusic 				push8(LN(pop8()));
16182191Smckusic 				continue;
16192191Smckusic 			}
16202191Smckusic 			push8(log(pop8()));
16212080Smckusick 			continue;
16222080Smckusick 		case O_SIN:
16232080Smckusick 			pc.cp++;
16245723Smckusic 			if (_runtst) {
16255723Smckusic 				push8(SIN(pop8()));
16265723Smckusic 				continue;
16275723Smckusic 			}
16282080Smckusick 			push8(sin(pop8()));
16292080Smckusick 			continue;
16302080Smckusick 		case O_SQRT:
16312080Smckusick 			pc.cp++;
16322191Smckusic 			if (_runtst) {
16332191Smckusic 				push8(SQRT(pop8()));
16342191Smckusic 				continue;
16352191Smckusic 			}
16362191Smckusic 			push8(sqrt(pop8()));
16372080Smckusick 			continue;
16382080Smckusick 		case O_CHR2:
16392080Smckusick 		case O_CHR4:
16402080Smckusick 			pc.cp++;
16412191Smckusic 			if (_runtst) {
16422950Smckusic 				push2((short)(CHR(pop4())));
16432191Smckusic 				continue;
16442191Smckusic 			}
16452950Smckusic 			push2((short)(pop4()));
16462080Smckusick 			continue;
16472080Smckusick 		case O_ODD2:
16482080Smckusick 		case O_ODD4:
16492080Smckusick 			pc.cp++;
1650*10576Smckusick 			tl = pop4();
1651*10576Smckusick 			push2((short)(tl & 1));
16522080Smckusick 			continue;
16532080Smckusick 		case O_SUCC2:
16542109Smckusic 			tl = *pc.cp++;
16552109Smckusic 			if (tl == 0)
16562109Smckusic 				tl = *pc.sp++;
16572109Smckusic 			tl1 = pop4();
16582191Smckusic 			if (_runtst) {
16592950Smckusic 				push2((short)(SUCC(tl1, tl, (long)(*pc.sp++))));
16602191Smckusic 				continue;
16612191Smckusic 			}
16622950Smckusic 			push2((short)(tl1 + 1));
16632191Smckusic 			pc.sp++;
16642080Smckusick 			continue;
16652080Smckusick 		case O_SUCC24:
16662109Smckusic 			tl = *pc.cp++;
16672109Smckusic 			if (tl == 0)
16682109Smckusic 				tl = *pc.sp++;
16692109Smckusic 			tl1 = pop4();
16702191Smckusic 			if (_runtst) {
16712950Smckusic 				push4(SUCC(tl1, tl, (long)(*pc.sp++)));
16722191Smckusic 				continue;
16732191Smckusic 			}
16742191Smckusic 			push4(tl1 + 1);
16752191Smckusic 			pc.sp++;
16762109Smckusic 			continue;
16772080Smckusick 		case O_SUCC4:
16782109Smckusic 			tl = *pc.cp++;
16792109Smckusic 			if (tl == 0)
16802109Smckusic 				tl = *pc.lp++;
16812109Smckusic 			tl1 = pop4();
16822191Smckusic 			if (_runtst) {
16832950Smckusic 				push4(SUCC(tl1, tl, (long)(*pc.lp++)));
16842191Smckusic 				continue;
16852191Smckusic 			}
16862191Smckusic 			push4(tl1 + 1);
16872191Smckusic 			pc.lp++;
16882080Smckusick 			continue;
16892080Smckusick 		case O_PRED2:
16902109Smckusic 			tl = *pc.cp++;
16912109Smckusic 			if (tl == 0)
16922109Smckusic 				tl = *pc.sp++;
16932109Smckusic 			tl1 = pop4();
16942191Smckusic 			if (_runtst) {
16952950Smckusic 				push2((short)(PRED(tl1, tl, (long)(*pc.sp++))));
16962191Smckusic 				continue;
16972191Smckusic 			}
16982950Smckusic 			push2((short)(tl1 - 1));
16992191Smckusic 			pc.sp++;
17002080Smckusick 			continue;
17012080Smckusick 		case O_PRED24:
17022109Smckusic 			tl = *pc.cp++;
17032109Smckusic 			if (tl == 0)
17042109Smckusic 				tl = *pc.sp++;
17052109Smckusic 			tl1 = pop4();
17062191Smckusic 			if (_runtst) {
17072950Smckusic 				push4(PRED(tl1, tl, (long)(*pc.sp++)));
17082191Smckusic 				continue;
17092191Smckusic 			}
17102191Smckusic 			push4(tl1 - 1);
17112191Smckusic 			pc.sp++;
17122109Smckusic 			continue;
17132080Smckusick 		case O_PRED4:
17142109Smckusic 			tl = *pc.cp++;
17152109Smckusic 			if (tl == 0)
17162109Smckusic 				tl = *pc.lp++;
17172109Smckusic 			tl1 = pop4();
17182191Smckusic 			if (_runtst) {
17192950Smckusic 				push4(PRED(tl1, tl, (long)(*pc.lp++)));
17202191Smckusic 				continue;
17212191Smckusic 			}
17222191Smckusic 			push4(tl1 - 1);
17232191Smckusic 			pc.lp++;
17242080Smckusick 			continue;
17252080Smckusick 		case O_SEED:
17262080Smckusick 			pc.cp++;
17272080Smckusick 			push4(SEED(pop4()));
17282080Smckusick 			continue;
17292080Smckusick 		case O_RANDOM:
17302080Smckusick 			pc.cp++;
17312080Smckusick 			push8(RANDOM(pop8()));
17322080Smckusick 			continue;
17332080Smckusick 		case O_EXPO:
17342080Smckusick 			pc.cp++;
17352080Smckusick 			push4(EXPO(pop8()));
17362080Smckusick 			continue;
17372080Smckusick 		case O_SQR2:
17382080Smckusick 		case O_SQR4:
17392080Smckusick 			pc.cp++;
17402080Smckusick 			tl = pop4();
17412080Smckusick 			push4(tl * tl);
17422080Smckusick 			continue;
17432080Smckusick 		case O_SQR8:
17442080Smckusick 			pc.cp++;
17452080Smckusick 			td = pop8();
17462080Smckusick 			push8(td * td);
17472080Smckusick 			continue;
17482080Smckusick 		case O_ROUND:
17492080Smckusick 			pc.cp++;
17502080Smckusick 			push4(ROUND(pop8()));
17512080Smckusick 			continue;
17522080Smckusick 		case O_TRUNC:
17532080Smckusick 			pc.cp++;
17542080Smckusick 			push4(TRUNC(pop8()));
17552080Smckusick 			continue;
17562950Smckusic 		default:
17575682Smckusic 			ERROR("Panic: bad op code\n");
17582950Smckusic 			continue;
17592080Smckusick 		}
17602080Smckusick 	}
17612080Smckusick }
1762