1*48108Sbostic /*- 2*48108Sbostic * Copyright (c) 1991 The Regents of the University of California. 3*48108Sbostic * All rights reserved. 4*48108Sbostic * 5*48108Sbostic * %sccs.include.redist.c% 622152Sdist */ 72080Smckusick 822152Sdist #ifndef lint 9*48108Sbostic static char sccsid[] = "@(#)interp.c 5.8 (Berkeley) 04/16/91"; 10*48108Sbostic #endif /* not lint */ 112080Smckusick 122080Smckusick #include <math.h> 1310576Smckusick #include <signal.h> 142950Smckusic #include "whoami.h" 1510576Smckusick #include "vars.h" 162950Smckusic #include "objfmt.h" 172080Smckusick #include "h02opcs.h" 182080Smckusick #include "machdep.h" 192080Smckusick #include "libpc.h" 202080Smckusick 212080Smckusick /* 222080Smckusick * program variables 232080Smckusick */ 2410576Smckusick union display _display; 2510576Smckusick struct dispsave *_dp; 262080Smckusick long _lino = 0; 272080Smckusick int _argc; 282080Smckusick char **_argv; 292080Smckusick long _mode; 3010576Smckusick long _runtst = (long)TRUE; 312950Smckusic bool _nodump = FALSE; 322080Smckusick long _stlim = 500000; 332080Smckusick long _stcnt = 0; 342191Smckusic long _seed = 1; 3510576Smckusick #ifdef ADDR32 362080Smckusick char *_minptr = (char *)0x7fffffff; 3710576Smckusick #endif ADDR32 3810576Smckusick #ifdef ADDR16 392950Smckusic char *_minptr = (char *)0xffff; 4010576Smckusick #endif ADDR16 412080Smckusick char *_maxptr = (char *)0; 422080Smckusick long *_pcpcount = (long *)0; 432080Smckusick long _cntrs = 0; 442080Smckusick long _rtns = 0; 452080Smckusick 462080Smckusick /* 472080Smckusick * standard files 482080Smckusick */ 492080Smckusick char _inwin, _outwin, _errwin; 502950Smckusic struct iorechd _err = { 512950Smckusic &_errwin, /* fileptr */ 522080Smckusick 0, /* lcount */ 532080Smckusick 0x7fffffff, /* llimit */ 5446289Storek stderr, /* fbuf */ 552950Smckusic FILNIL, /* fchain */ 562080Smckusick STDLVL, /* flev */ 572950Smckusic "Message file", /* pfname */ 582950Smckusic FTEXT | FWRITE | EOFF, /* funit */ 592950Smckusic 2, /* fblk */ 602080Smckusick 1 /* fsize */ 612080Smckusick }; 622080Smckusick struct iorechd output = { 632080Smckusick &_outwin, /* fileptr */ 642080Smckusick 0, /* lcount */ 652080Smckusick 0x7fffffff, /* llimit */ 6646289Storek stdout, /* fbuf */ 672080Smckusick ERR, /* fchain */ 682080Smckusick STDLVL, /* flev */ 692080Smckusick "standard output", /* pfname */ 702080Smckusick FTEXT | FWRITE | EOFF, /* funit */ 712080Smckusick 1, /* fblk */ 722080Smckusick 1 /* fsize */ 732080Smckusick }; 742950Smckusic struct iorechd input = { 752950Smckusic &_inwin, /* fileptr */ 762080Smckusick 0, /* lcount */ 772080Smckusick 0x7fffffff, /* llimit */ 7846289Storek stdin, /* fbuf */ 792950Smckusic OUTPUT, /* fchain */ 802080Smckusick STDLVL, /* flev */ 812950Smckusic "standard input", /* pfname */ 827569Smckusick FTEXT|FREAD|SYNC|EOLN, /* funit */ 832950Smckusic 0, /* fblk */ 842080Smckusick 1 /* fsize */ 852080Smckusick }; 862080Smckusick 872109Smckusic /* 882950Smckusic * file record variables 892950Smckusic */ 902950Smckusic long _filefre = PREDEF; 912950Smckusic struct iorechd _fchain = { 922950Smckusic 0, 0, 0, 0, /* only use fchain field */ 932950Smckusic INPUT /* fchain */ 942950Smckusic }; 952950Smckusic struct iorec *_actfile[MAXFILES] = { 962950Smckusic INPUT, 972950Smckusic OUTPUT, 982950Smckusic ERR 992950Smckusic }; 1002950Smckusic 1012950Smckusic /* 10236537Smckusick * stuff for pdx to watch what the interpreter is doing. 10336537Smckusick * The .globl is #ifndef DBX since it breaks DBX to have a global 10436537Smckusick * asm label in the middle of a function (see _loopaddr: below). 1055658Slinton */ 1065658Slinton 10736537Smckusick union progcntr pdx_pc; 10836537Smckusick #ifndef DBX 1095658Slinton asm(".globl _loopaddr"); 11036537Smckusick #endif DBX 1115658Slinton 1125658Slinton /* 1132109Smckusic * Px profile array 1142109Smckusic */ 1152109Smckusic #ifdef PROFILE 1162109Smckusic long _profcnts[NUMOPS]; 1172109Smckusic #endif PROFILE 1182109Smckusic 1192109Smckusic /* 1202109Smckusic * debugging variables 1212109Smckusic */ 12230058Smckusick #ifdef PXDEBUG 1232109Smckusic char opc[10]; 1242109Smckusic long opcptr = 9; 12530058Smckusick #endif PXDEBUG 1262109Smckusic 12736537Smckusick void 1282080Smckusick interpreter(base) 1292080Smckusick char *base; 1302080Smckusick { 13136537Smckusick /* register */ union progcntr pc; /* interpreted program cntr */ 1322080Smckusick struct iorec *curfile; /* active file */ 13310576Smckusick register struct blockmark *stp; /* active stack frame ptr */ 1342080Smckusick /* 1352080Smckusick * the following variables are used as scratch 1362080Smckusick */ 1372239Smckusic register char *tcp; 13810576Smckusick register short *tsp; 13930057Smckusick register long tl, tl1, tl2, tl3; 14036537Smckusick char *tcp2; 14136537Smckusick long tl4; 1422080Smckusick double td, td1; 1432239Smckusic struct sze8 t8; 14410576Smckusick register short *tsp1; 14530057Smckusick long *tlp; 14610576Smckusick char *tcp1; 1472950Smckusic bool tb; 14810576Smckusick struct blockmark *tstp; 14910576Smckusick register struct formalrtn *tfp; 1502080Smckusick struct iorec **ip; 15110792Smckusick int mypid; 15236537Smckusick int ti, ti2; 15336537Smckusick short ts; 15436537Smckusick FILE *tf; 15536537Smckusick /* register */ union progcntr stack; /* Interpreted stack */ 1562080Smckusick 15710792Smckusick mypid = getpid(); 1585658Slinton 1592080Smckusick /* 1602239Smckusic * Setup sets up any hardware specific parameters before 16136537Smckusick * starting the interpreter. Typically this is macro- or inline- 16236537Smckusick * replaced by "machdep.h" or interp.sed. 1632239Smckusic */ 16436537Smckusick setup(); 1652239Smckusic /* 1662080Smckusick * necessary only on systems which do not initialize 1672080Smckusick * memory to zero 1682080Smckusick */ 1692080Smckusick for (ip = &_actfile[3]; ip < &_actfile[MAXFILES]; *ip++ = FILNIL) 1702080Smckusick /* void */; 1712080Smckusick /* 1722080Smckusick * set up global environment, then ``call'' the main program 1732080Smckusick */ 17430057Smckusick STACKALIGN(tl, 2 * sizeof(struct iorec *)); 17530057Smckusick _display.frame[0].locvars = pushsp(tl); 1762950Smckusic _display.frame[0].locvars += 2 * sizeof(struct iorec *); 1772950Smckusic *(struct iorec **)(_display.frame[0].locvars + OUTPUT_OFF) = OUTPUT; 1782950Smckusic *(struct iorec **)(_display.frame[0].locvars + INPUT_OFF) = INPUT; 17930057Smckusick STACKALIGN(tl, sizeof(struct blockmark)); 18030057Smckusick stp = (struct blockmark *)pushsp(tl); 1812109Smckusic _dp = &_display.frame[0]; 1822080Smckusick pc.cp = base; 1835658Slinton 1842080Smckusick for(;;) { 18530058Smckusick # ifdef PXDEBUG 1862080Smckusick if (++opcptr == 10) 1872080Smckusick opcptr = 0; 1882080Smckusick opc[opcptr] = *pc.ucp; 18930058Smckusick # endif PXDEBUG 1902109Smckusic # ifdef PROFILE 1912109Smckusic _profcnts[*pc.ucp]++; 1922109Smckusic # endif PROFILE 19336537Smckusick 19436537Smckusick /* 19536537Smckusick * Save away the program counter to a fixed location for pdx. 19636537Smckusick */ 19736537Smckusick pdx_pc = pc; 19836537Smckusick 19936537Smckusick /* 20036537Smckusick * Having the label below makes dbx not work 20136537Smckusick * to debug this interpreter, 20236537Smckusick * since it thinks a new function called loopaddr() 20336537Smckusick * has started here, and it won't display the local 20436537Smckusick * variables of interpreter(). You have to compile 20536537Smckusick * -DDBX to avoid this problem... 20636537Smckusick */ 20736537Smckusick # ifndef DBX 20836537Smckusick ;asm("_loopaddr:"); 20936537Smckusick # endif DBX 21036537Smckusick 2112080Smckusick switch (*pc.ucp++) { 2125658Slinton case O_BPT: /* breakpoint trap */ 2135873Slinton PFLUSH(); 21410792Smckusick kill(mypid, SIGILL); 2155658Slinton pc.ucp--; 2165658Slinton continue; 2172080Smckusick case O_NODUMP: 2182191Smckusic _nodump = TRUE; 2192080Smckusick /* and fall through */ 2202080Smckusick case O_BEG: 2212080Smckusick _dp += 1; /* enter local scope */ 2222080Smckusick stp->odisp = *_dp; /* save old display value */ 2232080Smckusick tl = *pc.ucp++; /* tl = name size */ 2242080Smckusick stp->entry = pc.hdrp; /* pointer to entry info */ 2252191Smckusic tl1 = pc.hdrp->framesze;/* tl1 = size of frame */ 2262191Smckusic _lino = pc.hdrp->offset; 2272191Smckusic _runtst = pc.hdrp->tests; 2282191Smckusic disableovrflo(); 2292191Smckusic if (_runtst) 2302191Smckusic enableovrflo(); 2312950Smckusic pc.cp += (int)tl; /* skip over proc hdr info */ 2322080Smckusick stp->file = curfile; /* save active file */ 23330057Smckusick STACKALIGN(tl2, tl1); 23430057Smckusick tcp = pushsp(tl2); /* tcp = new top of stack */ 2352950Smckusic if (_runtst) /* zero stack frame */ 2369231Smckusick blkclr(tcp, tl1); 2372950Smckusic tcp += (int)tl1; /* offsets of locals are neg */ 2382109Smckusic _dp->locvars = tcp; /* set new display pointer */ 2392109Smckusic _dp->stp = stp; 2402950Smckusic stp->tos = pushsp((long)0); /* set tos pointer */ 2412080Smckusick continue; 2422080Smckusick case O_END: 2432080Smckusick PCLOSE(_dp->locvars); /* flush & close local files */ 2442080Smckusick stp = _dp->stp; 2452080Smckusick curfile = stp->file; /* restore old active file */ 2462080Smckusick *_dp = stp->odisp; /* restore old display entry */ 2472109Smckusic if (_dp == &_display.frame[1]) 2482080Smckusick return; /* exiting main proc ??? */ 2492080Smckusick _lino = stp->lino; /* restore lino, pc, dp */ 25010576Smckusick pc.cp = stp->pc; 2512080Smckusick _dp = stp->dp; 2522191Smckusic _runtst = stp->entry->tests; 2532191Smckusic disableovrflo(); 2542191Smckusic if (_runtst) 2552191Smckusic enableovrflo(); 25630057Smckusick STACKALIGN(tl, stp->entry->framesze); 25730057Smckusick STACKALIGN(tl1, sizeof(struct blockmark)); 25830057Smckusick popsp(tl + /* pop local vars */ 25930057Smckusick tl1 + /* pop stack frame */ 26030057Smckusick stp->entry->nargs);/* pop parms */ 2612080Smckusick continue; 2622080Smckusick case O_CALL: 2632080Smckusick tl = *pc.cp++; 26430057Smckusick PCLONGVAL(tl1); 26530057Smckusick tcp = base + tl1 + sizeof(short);/* new entry point */ 26630057Smckusick GETLONGVAL(tl1, tcp); 26730057Smckusick tcp = base + tl1; 26830057Smckusick STACKALIGN(tl1, sizeof(struct blockmark)); 26930057Smckusick stp = (struct blockmark *)pushsp(tl1); 2702080Smckusick stp->lino = _lino; /* save lino, pc, dp */ 27110576Smckusick stp->pc = pc.cp; 2722080Smckusick stp->dp = _dp; 2732109Smckusic _dp = &_display.frame[tl]; /* set up new display ptr */ 2742080Smckusick pc.cp = tcp; 2752080Smckusick continue; 2762080Smckusick case O_FCALL: 2773294Smckusic pc.cp++; 2784016Smckusic tcp = popaddr(); /* ptr to display save area */ 2792080Smckusick tfp = (struct formalrtn *)popaddr(); 28030057Smckusick STACKALIGN(tl, sizeof(struct blockmark)); 28130057Smckusick stp = (struct blockmark *)pushsp(tl); 2822080Smckusick stp->lino = _lino; /* save lino, pc, dp */ 28310576Smckusick stp->pc = pc.cp; 2842080Smckusick stp->dp = _dp; 28510576Smckusick pc.cp = (char *)(tfp->fentryaddr);/* new entry point */ 2863436Smckusic _dp = &_display.frame[tfp->fbn];/* new display ptr */ 2879231Smckusick blkcpy(&_display.frame[1], tcp, 28810576Smckusick tfp->fbn * sizeof(struct dispsave)); 2899231Smckusick blkcpy(&tfp->fdisp[0], &_display.frame[1], 29010576Smckusick tfp->fbn * sizeof(struct dispsave)); 2912080Smckusick continue; 2922080Smckusick case O_FRTN: 2932080Smckusick tl = *pc.cp++; /* tl = size of return obj */ 2942080Smckusick if (tl == 0) 2952080Smckusick tl = *pc.usp++; 2962950Smckusic tcp = pushsp((long)(0)); 2972080Smckusick tfp = *(struct formalrtn **)(tcp + tl); 2984016Smckusic tcp1 = *(char **) 2994016Smckusic (tcp + tl + sizeof(struct formalrtn *)); 3003861Smckusic if (tl != 0) { 3019231Smckusick blkcpy(tcp, tcp + sizeof(struct formalrtn *) 3029231Smckusick + sizeof(char *), tl); 3033861Smckusic } 30430057Smckusick STACKALIGN(tl, 30530057Smckusick sizeof(struct formalrtn *) + sizeof (char *)); 30630057Smckusick popsp(tl); 3079231Smckusick blkcpy(tcp1, &_display.frame[1], 30810576Smckusick tfp->fbn * sizeof(struct dispsave)); 3092080Smckusick continue; 3102080Smckusick case O_FSAV: 3112080Smckusick tfp = (struct formalrtn *)popaddr(); 3123436Smckusic tfp->fbn = *pc.cp++; /* blk number of routine */ 31330057Smckusick PCLONGVAL(tl); 31430057Smckusick tcp = base + tl + sizeof(short);/* new entry point */ 31530057Smckusick GETLONGVAL(tl, tcp); 31630057Smckusick tfp->fentryaddr = (long (*)())(base + tl); 3179231Smckusick blkcpy(&_display.frame[1], &tfp->fdisp[0], 31810576Smckusick tfp->fbn * sizeof(struct dispsave)); 3192080Smckusick pushaddr(tfp); 3202080Smckusick continue; 3212080Smckusick case O_SDUP2: 3222080Smckusick pc.cp++; 3232080Smckusick tl = pop2(); 3242950Smckusic push2((short)(tl)); 3252950Smckusic push2((short)(tl)); 3262080Smckusick continue; 3272080Smckusick case O_SDUP4: 3282080Smckusick pc.cp++; 3292080Smckusick tl = pop4(); 3302080Smckusick push4(tl); 3312080Smckusick push4(tl); 3322080Smckusick continue; 3332080Smckusick case O_TRA: 3342080Smckusick pc.cp++; 3352080Smckusick pc.cp += *pc.sp; 3362080Smckusick continue; 3372080Smckusick case O_TRA4: 3382080Smckusick pc.cp++; 33930057Smckusick PCLONGVAL(tl); 34030057Smckusick pc.cp = base + tl; 3412080Smckusick continue; 3422080Smckusick case O_GOTO: 3432109Smckusic tstp = _display.frame[*pc.cp++].stp; /* ptr to 3442109Smckusic exit frame */ 34530057Smckusick PCLONGVAL(tl); 34630057Smckusick pc.cp = base + tl; 3472080Smckusick stp = _dp->stp; 3482080Smckusick while (tstp != stp) { 3492109Smckusic if (_dp == &_display.frame[1]) 3503872Smckusic ERROR("Active frame not found in non-local goto\n", 0); /* exiting prog ??? */ 3512080Smckusick PCLOSE(_dp->locvars); /* close local files */ 3522080Smckusick curfile = stp->file; /* restore active file */ 3532080Smckusick *_dp = stp->odisp; /* old display entry */ 3542080Smckusick _dp = stp->dp; /* restore dp */ 3552080Smckusick stp = _dp->stp; 3562080Smckusick } 3572080Smckusick /* pop locals, stack frame, parms, and return values */ 3582950Smckusic popsp((long)(stp->tos - pushsp((long)(0)))); 3592080Smckusick continue; 3602080Smckusick case O_LINO: 3612950Smckusic if (_dp->stp->tos != pushsp((long)(0))) 3625682Smckusic ERROR("Panic: stack not empty between statements\n"); 3632080Smckusick _lino = *pc.cp++; /* set line number */ 3642080Smckusick if (_lino == 0) 3652080Smckusick _lino = *pc.sp++; 3662950Smckusic if (_runtst) { 3672950Smckusic LINO(); /* inc statement count */ 3682950Smckusic continue; 3692950Smckusic } 3702950Smckusic _stcnt++; 3712080Smckusick continue; 3722080Smckusick case O_PUSH: 3732080Smckusick tl = *pc.cp++; 3742080Smckusick if (tl == 0) 37530057Smckusick PCLONGVAL(tl); 37630057Smckusick STACKALIGN(tl1, -tl); 37730057Smckusick tcp = pushsp(tl1); 3782950Smckusic if (_runtst) 37930057Smckusick blkclr(tcp, tl1); 3802080Smckusick continue; 3812080Smckusick case O_IF: 3822080Smckusick pc.cp++; 3832191Smckusic if (pop2()) { 3842080Smckusick pc.sp++; 3852191Smckusic continue; 3862191Smckusic } 3872191Smckusic pc.cp += *pc.sp; 3882080Smckusick continue; 3892080Smckusick case O_REL2: 3902080Smckusick tl = pop2(); 3912080Smckusick tl1 = pop2(); 3922080Smckusick goto cmplong; 3932080Smckusick case O_REL24: 3942080Smckusick tl = pop2(); 3952080Smckusick tl1 = pop4(); 3962080Smckusick goto cmplong; 3972080Smckusick case O_REL42: 3982080Smckusick tl = pop4(); 3992080Smckusick tl1 = pop2(); 4002080Smckusick goto cmplong; 4012080Smckusick case O_REL4: 4022080Smckusick tl = pop4(); 4032080Smckusick tl1 = pop4(); 4042080Smckusick cmplong: 4055682Smckusic switch (*pc.cp++) { 4062080Smckusick case releq: 4072080Smckusick push2(tl1 == tl); 4082080Smckusick continue; 4092080Smckusick case relne: 4102080Smckusick push2(tl1 != tl); 4112080Smckusick continue; 4122080Smckusick case rellt: 4132080Smckusick push2(tl1 < tl); 4142080Smckusick continue; 4152080Smckusick case relgt: 4162080Smckusick push2(tl1 > tl); 4172080Smckusick continue; 4182080Smckusick case relle: 4192080Smckusick push2(tl1 <= tl); 4202080Smckusick continue; 4212080Smckusick case relge: 4222080Smckusick push2(tl1 >= tl); 4232080Smckusick continue; 4242080Smckusick default: 4255682Smckusic ERROR("Panic: bad relation %d to REL4*\n", 4265682Smckusic *(pc.cp - 1)); 4272080Smckusick continue; 4282080Smckusick } 4292080Smckusick case O_RELG: 4302080Smckusick tl2 = *pc.cp++; /* tc has jump opcode */ 4312080Smckusick tl = *pc.usp++; /* tl has comparison length */ 43230057Smckusick STACKALIGN(tl1, tl); /* tl1 has arg stack length */ 4332950Smckusic tcp = pushsp((long)(0));/* tcp pts to first arg */ 4342080Smckusick switch (tl2) { 4352080Smckusick case releq: 4362950Smckusic tb = RELEQ(tl, tcp + tl1, tcp); 4372080Smckusick break; 4382080Smckusick case relne: 4392950Smckusic tb = RELNE(tl, tcp + tl1, tcp); 4402080Smckusick break; 4412080Smckusick case rellt: 4422950Smckusic tb = RELSLT(tl, tcp + tl1, tcp); 4432080Smckusick break; 4442080Smckusick case relgt: 4452950Smckusic tb = RELSGT(tl, tcp + tl1, tcp); 4462080Smckusick break; 4472080Smckusick case relle: 4482950Smckusic tb = RELSLE(tl, tcp + tl1, tcp); 4492080Smckusick break; 4502080Smckusick case relge: 4512950Smckusic tb = RELSGE(tl, tcp + tl1, tcp); 4522080Smckusick break; 4532080Smckusick default: 4545682Smckusic ERROR("Panic: bad relation %d to RELG*\n", tl2); 4552080Smckusick break; 4562080Smckusick } 4572080Smckusick popsp(tl1 << 1); 4582950Smckusic push2((short)(tb)); 4592080Smckusick continue; 4602080Smckusick case O_RELT: 4612080Smckusick tl2 = *pc.cp++; /* tc has jump opcode */ 4622080Smckusick tl1 = *pc.usp++; /* tl1 has comparison length */ 4632950Smckusic tcp = pushsp((long)(0));/* tcp pts to first arg */ 4642080Smckusick switch (tl2) { 4652080Smckusick case releq: 4662950Smckusic tb = RELEQ(tl1, tcp + tl1, tcp); 4672080Smckusick break; 4682080Smckusick case relne: 4692950Smckusic tb = RELNE(tl1, tcp + tl1, tcp); 4702080Smckusick break; 4712080Smckusick case rellt: 4722950Smckusic tb = RELTLT(tl1, tcp + tl1, tcp); 4732080Smckusick break; 4742080Smckusick case relgt: 4752950Smckusic tb = RELTGT(tl1, tcp + tl1, tcp); 4762080Smckusick break; 4772080Smckusick case relle: 4782950Smckusic tb = RELTLE(tl1, tcp + tl1, tcp); 4792080Smckusick break; 4802080Smckusick case relge: 4812950Smckusic tb = RELTGE(tl1, tcp + tl1, tcp); 4822080Smckusick break; 4832080Smckusick default: 4845682Smckusic ERROR("Panic: bad relation %d to RELT*\n", tl2); 4852080Smckusick break; 4862080Smckusick } 48730057Smckusick STACKALIGN(tl, tl1); 48830057Smckusick popsp(tl << 1); 4892950Smckusic push2((short)(tb)); 4902080Smckusick continue; 4912080Smckusick case O_REL28: 4922080Smckusick td = pop2(); 4932080Smckusick td1 = pop8(); 4942080Smckusick goto cmpdbl; 4952080Smckusick case O_REL48: 4962080Smckusick td = pop4(); 4972080Smckusick td1 = pop8(); 4982080Smckusick goto cmpdbl; 4992080Smckusick case O_REL82: 5002080Smckusick td = pop8(); 5012080Smckusick td1 = pop2(); 5022080Smckusick goto cmpdbl; 5032080Smckusick case O_REL84: 5042080Smckusick td = pop8(); 5052080Smckusick td1 = pop4(); 5062080Smckusick goto cmpdbl; 5072080Smckusick case O_REL8: 5082080Smckusick td = pop8(); 5092080Smckusick td1 = pop8(); 5102080Smckusick cmpdbl: 5112080Smckusick switch (*pc.cp++) { 5122080Smckusick case releq: 5132080Smckusick push2(td1 == td); 5142080Smckusick continue; 5152080Smckusick case relne: 5162080Smckusick push2(td1 != td); 5172080Smckusick continue; 5182080Smckusick case rellt: 5192080Smckusick push2(td1 < td); 5202080Smckusick continue; 5212080Smckusick case relgt: 5222080Smckusick push2(td1 > td); 5232080Smckusick continue; 5242080Smckusick case relle: 5252080Smckusick push2(td1 <= td); 5262080Smckusick continue; 5272080Smckusick case relge: 5282080Smckusick push2(td1 >= td); 5292080Smckusick continue; 5302080Smckusick default: 5315682Smckusic ERROR("Panic: bad relation %d to REL8*\n", 5325682Smckusic *(pc.cp - 1)); 5332080Smckusick continue; 5342080Smckusick } 5352080Smckusick case O_AND: 5362080Smckusick pc.cp++; 53710576Smckusick tl = pop2(); 53810576Smckusick tl1 = pop2(); 53910787Smckusick push2(tl1 & tl); 5402080Smckusick continue; 5412080Smckusick case O_OR: 5422080Smckusick pc.cp++; 54310576Smckusick tl = pop2(); 54410576Smckusick tl1 = pop2(); 54510787Smckusick push2(tl1 | tl); 5462080Smckusick continue; 5472080Smckusick case O_NOT: 5482080Smckusick pc.cp++; 54910576Smckusick tl = pop2(); 55010576Smckusick push2(tl ^ 1); 5512080Smckusick continue; 5522080Smckusick case O_AS2: 5532080Smckusick pc.cp++; 5542080Smckusick tl = pop2(); 5552080Smckusick *(short *)popaddr() = tl; 5562080Smckusick continue; 5572080Smckusick case O_AS4: 5582080Smckusick pc.cp++; 5592080Smckusick tl = pop4(); 5602080Smckusick *(long *)popaddr() = tl; 5612080Smckusick continue; 5622080Smckusick case O_AS24: 5632080Smckusick pc.cp++; 5642080Smckusick tl = pop2(); 5652080Smckusick *(long *)popaddr() = tl; 5662080Smckusick continue; 5672080Smckusick case O_AS42: 5682080Smckusick pc.cp++; 5692080Smckusick tl = pop4(); 5702080Smckusick *(short *)popaddr() = tl; 5712080Smckusick continue; 5722080Smckusick case O_AS21: 5732080Smckusick pc.cp++; 5742080Smckusick tl = pop2(); 5752080Smckusick *popaddr() = tl; 5762080Smckusick continue; 5772080Smckusick case O_AS41: 5782080Smckusick pc.cp++; 5792080Smckusick tl = pop4(); 5802080Smckusick *popaddr() = tl; 5812080Smckusick continue; 5822080Smckusick case O_AS28: 5832080Smckusick pc.cp++; 5842080Smckusick tl = pop2(); 5852080Smckusick *(double *)popaddr() = tl; 5862080Smckusick continue; 5872080Smckusick case O_AS48: 5882080Smckusick pc.cp++; 5892080Smckusick tl = pop4(); 5902080Smckusick *(double *)popaddr() = tl; 5912080Smckusick continue; 5922080Smckusick case O_AS8: 5932080Smckusick pc.cp++; 5942239Smckusic t8 = popsze8(); 5952239Smckusic *(struct sze8 *)popaddr() = t8; 5962080Smckusick continue; 5972080Smckusick case O_AS: 5982080Smckusick tl = *pc.cp++; 5992080Smckusick if (tl == 0) 6002080Smckusick tl = *pc.usp++; 60130057Smckusick STACKALIGN(tl1, tl); 6022950Smckusic tcp = pushsp((long)(0)); 6039231Smckusick blkcpy(tcp, *(char **)(tcp + tl1), tl); 6042080Smckusick popsp(tl1 + sizeof(char *)); 6052080Smckusick continue; 60615976Smckusick case O_VAS: 60715976Smckusick pc.cp++; 60815976Smckusick tl = pop4(); 60915976Smckusick tcp1 = popaddr(); 61015976Smckusick tcp = popaddr(); 61115976Smckusick blkcpy(tcp1, tcp, tl); 61215976Smckusick continue; 6132080Smckusick case O_INX2P2: 6142080Smckusick tl = *pc.cp++; /* tl has shift amount */ 61510576Smckusick tl1 = pop2(); 61610576Smckusick tl1 = (tl1 - *pc.sp++) << tl; 61710576Smckusick tcp = popaddr(); 61810576Smckusick pushaddr(tcp + tl1); 6192080Smckusick continue; 6202080Smckusick case O_INX4P2: 6212080Smckusick tl = *pc.cp++; /* tl has shift amount */ 62210576Smckusick tl1 = pop4(); 62310576Smckusick tl1 = (tl1 - *pc.sp++) << tl; 62410576Smckusick tcp = popaddr(); 62510576Smckusick pushaddr(tcp + tl1); 6262080Smckusick continue; 6272080Smckusick case O_INX2: 6282080Smckusick tl = *pc.cp++; /* tl has element size */ 6292080Smckusick if (tl == 0) 6302080Smckusick tl = *pc.usp++; 6312080Smckusick tl1 = pop2(); /* index */ 6322080Smckusick tl2 = *pc.sp++; 63310576Smckusick tcp = popaddr(); 63410576Smckusick pushaddr(tcp + (tl1 - tl2) * tl); 6352191Smckusic tl = *pc.usp++; 6362191Smckusic if (_runtst) 6372191Smckusic SUBSC(tl1, tl2, tl); /* range check */ 6382080Smckusick continue; 6392080Smckusick case O_INX4: 6402080Smckusick tl = *pc.cp++; /* tl has element size */ 6412080Smckusick if (tl == 0) 6422080Smckusick tl = *pc.usp++; 6432080Smckusick tl1 = pop4(); /* index */ 6442080Smckusick tl2 = *pc.sp++; 64510576Smckusick tcp = popaddr(); 64610576Smckusick pushaddr(tcp + (tl1 - tl2) * tl); 6472191Smckusic tl = *pc.usp++; 6482191Smckusic if (_runtst) 6492191Smckusic SUBSC(tl1, tl2, tl); /* range check */ 6502080Smckusick continue; 65115976Smckusick case O_VINX2: 65215976Smckusick pc.cp++; 65315976Smckusick tl = pop2(); /* tl has element size */ 65415976Smckusick tl1 = pop2(); /* upper bound */ 65515976Smckusick tl2 = pop2(); /* lower bound */ 65615976Smckusick tl3 = pop2(); /* index */ 65715976Smckusick tcp = popaddr(); 65815976Smckusick pushaddr(tcp + (tl3 - tl2) * tl); 65915976Smckusick if (_runtst) 66015976Smckusick SUBSC(tl3, tl2, tl1); /* range check */ 66115976Smckusick continue; 66215976Smckusick case O_VINX24: 66315976Smckusick pc.cp++; 66415976Smckusick tl = pop2(); /* tl has element size */ 66515976Smckusick tl1 = pop2(); /* upper bound */ 66615976Smckusick tl2 = pop2(); /* lower bound */ 66715976Smckusick tl3 = pop4(); /* index */ 66815976Smckusick tcp = popaddr(); 66915976Smckusick pushaddr(tcp + (tl3 - tl2) * tl); 67015976Smckusick if (_runtst) 67115976Smckusick SUBSC(tl3, tl2, tl1); /* range check */ 67215976Smckusick continue; 67315976Smckusick case O_VINX42: 67415976Smckusick pc.cp++; 67515976Smckusick tl = pop4(); /* tl has element size */ 67615976Smckusick tl1 = pop4(); /* upper bound */ 67715976Smckusick tl2 = pop4(); /* lower bound */ 67815976Smckusick tl3 = pop2(); /* index */ 67915976Smckusick tcp = popaddr(); 68015976Smckusick pushaddr(tcp + (tl3 - tl2) * tl); 68115976Smckusick if (_runtst) 68215976Smckusick SUBSC(tl3, tl2, tl1); /* range check */ 68315976Smckusick continue; 68415976Smckusick case O_VINX4: 68515976Smckusick pc.cp++; 68615976Smckusick tl = pop4(); /* tl has element size */ 68715976Smckusick tl1 = pop4(); /* upper bound */ 68815976Smckusick tl2 = pop4(); /* lower bound */ 68915976Smckusick tl3 = pop4(); /* index */ 69015976Smckusick tcp = popaddr(); 69115976Smckusick pushaddr(tcp + (tl3 - tl2) * tl); 69215976Smckusick if (_runtst) 69315976Smckusick SUBSC(tl3, tl2, tl1); /* range check */ 69415976Smckusick continue; 6952080Smckusick case O_OFF: 6962080Smckusick tl = *pc.cp++; 6972080Smckusick if (tl == 0) 6982080Smckusick tl = *pc.usp++; 69910576Smckusick tcp = popaddr(); 70010576Smckusick pushaddr(tcp + tl); 7012080Smckusick continue; 7022080Smckusick case O_NIL: 7032080Smckusick pc.cp++; 70424938Smckusick tcp = popaddr(); 70524938Smckusick NIL(tcp); 70624938Smckusick pushaddr(tcp); 7072080Smckusick continue; 7082080Smckusick case O_ADD2: 7092080Smckusick pc.cp++; 71010576Smckusick tl = pop2(); 71110576Smckusick tl1 = pop2(); 71210576Smckusick push4(tl1 + tl); 7132080Smckusick continue; 7142080Smckusick case O_ADD4: 7152080Smckusick pc.cp++; 71610576Smckusick tl = pop4(); 71710576Smckusick tl1 = pop4(); 71810576Smckusick push4(tl1 + tl); 7192080Smckusick continue; 7202080Smckusick case O_ADD24: 7212080Smckusick pc.cp++; 7222080Smckusick tl = pop2(); 72310576Smckusick tl1 = pop4(); 72410576Smckusick push4(tl1 + tl); 7252080Smckusick continue; 7262080Smckusick case O_ADD42: 7272080Smckusick pc.cp++; 7282080Smckusick tl = pop4(); 72910576Smckusick tl1 = pop2(); 73010576Smckusick push4(tl1 + tl); 7312080Smckusick continue; 7322080Smckusick case O_ADD28: 7332080Smckusick pc.cp++; 7342080Smckusick tl = pop2(); 73510576Smckusick td = pop8(); 73610576Smckusick push8(td + tl); 7372080Smckusick continue; 7382080Smckusick case O_ADD48: 7392080Smckusick pc.cp++; 7402080Smckusick tl = pop4(); 74110576Smckusick td = pop8(); 74210576Smckusick push8(td + tl); 7432080Smckusick continue; 7442080Smckusick case O_ADD82: 7452080Smckusick pc.cp++; 7462080Smckusick td = pop8(); 74710576Smckusick td1 = pop2(); 74810576Smckusick push8(td1 + td); 7492080Smckusick continue; 7502080Smckusick case O_ADD84: 7512080Smckusick pc.cp++; 7522080Smckusick td = pop8(); 75310576Smckusick td1 = pop4(); 75410576Smckusick push8(td1 + td); 7552080Smckusick continue; 7562080Smckusick case O_SUB2: 7572080Smckusick pc.cp++; 7582080Smckusick tl = pop2(); 75910576Smckusick tl1 = pop2(); 76010576Smckusick push4(tl1 - tl); 7612080Smckusick continue; 7622080Smckusick case O_SUB4: 7632080Smckusick pc.cp++; 7642080Smckusick tl = pop4(); 76510576Smckusick tl1 = pop4(); 76610576Smckusick push4(tl1 - tl); 7672080Smckusick continue; 7682080Smckusick case O_SUB24: 7692080Smckusick pc.cp++; 7702080Smckusick tl = pop2(); 77110576Smckusick tl1 = pop4(); 77210576Smckusick push4(tl1 - tl); 7732080Smckusick continue; 7742080Smckusick case O_SUB42: 7752080Smckusick pc.cp++; 7762080Smckusick tl = pop4(); 77710576Smckusick tl1 = pop2(); 77810576Smckusick push4(tl1 - tl); 7792080Smckusick continue; 7802080Smckusick case O_SUB28: 7812080Smckusick pc.cp++; 7822080Smckusick tl = pop2(); 78310576Smckusick td = pop8(); 78410576Smckusick push8(td - tl); 7852080Smckusick continue; 7862080Smckusick case O_SUB48: 7872080Smckusick pc.cp++; 7882080Smckusick tl = pop4(); 78910576Smckusick td = pop8(); 79010576Smckusick push8(td - tl); 7912080Smckusick continue; 7922080Smckusick case O_SUB82: 7932080Smckusick pc.cp++; 7942080Smckusick td = pop8(); 79510576Smckusick td1 = pop2(); 79610576Smckusick push8(td1 - td); 7972080Smckusick continue; 7982080Smckusick case O_SUB84: 7992080Smckusick pc.cp++; 8002080Smckusick td = pop8(); 80110576Smckusick td1 = pop4(); 80210576Smckusick push8(td1 - td); 8032080Smckusick continue; 8042080Smckusick case O_MUL2: 8052080Smckusick pc.cp++; 80610576Smckusick tl = pop2(); 80710576Smckusick tl1 = pop2(); 80810576Smckusick push4(tl1 * tl); 8092080Smckusick continue; 8102080Smckusick case O_MUL4: 8112080Smckusick pc.cp++; 81210576Smckusick tl = pop4(); 81310576Smckusick tl1 = pop4(); 81410576Smckusick push4(tl1 * tl); 8152080Smckusick continue; 8162080Smckusick case O_MUL24: 8172080Smckusick pc.cp++; 8182080Smckusick tl = pop2(); 81910576Smckusick tl1 = pop4(); 82010576Smckusick push4(tl1 * tl); 8212080Smckusick continue; 8222080Smckusick case O_MUL42: 8232080Smckusick pc.cp++; 8242080Smckusick tl = pop4(); 82510576Smckusick tl1 = pop2(); 82610576Smckusick push4(tl1 * tl); 8272080Smckusick continue; 8282080Smckusick case O_MUL28: 8292080Smckusick pc.cp++; 8302080Smckusick tl = pop2(); 83110576Smckusick td = pop8(); 83210576Smckusick push8(td * tl); 8332080Smckusick continue; 8342080Smckusick case O_MUL48: 8352080Smckusick pc.cp++; 8362080Smckusick tl = pop4(); 83710576Smckusick td = pop8(); 83810576Smckusick push8(td * tl); 8392080Smckusick continue; 8402080Smckusick case O_MUL82: 8412080Smckusick pc.cp++; 8422080Smckusick td = pop8(); 84310576Smckusick td1 = pop2(); 84410576Smckusick push8(td1 * td); 8452080Smckusick continue; 8462080Smckusick case O_MUL84: 8472080Smckusick pc.cp++; 8482080Smckusick td = pop8(); 84910576Smckusick td1 = pop4(); 85010576Smckusick push8(td1 * td); 8512080Smckusick continue; 8522080Smckusick case O_ABS2: 8532080Smckusick case O_ABS4: 8542080Smckusick pc.cp++; 8552080Smckusick tl = pop4(); 8562080Smckusick push4(tl >= 0 ? tl : -tl); 8572080Smckusick continue; 8582080Smckusick case O_ABS8: 8592080Smckusick pc.cp++; 8602080Smckusick td = pop8(); 8612080Smckusick push8(td >= 0.0 ? td : -td); 8622080Smckusick continue; 8632080Smckusick case O_NEG2: 8642080Smckusick pc.cp++; 86536537Smckusick ts = -pop2(); 86636537Smckusick push4((long)ts); 8672080Smckusick continue; 8682080Smckusick case O_NEG4: 8692080Smckusick pc.cp++; 87036537Smckusick tl = -pop4(); 87136537Smckusick push4(tl); 8722080Smckusick continue; 8732080Smckusick case O_NEG8: 8742080Smckusick pc.cp++; 87536537Smckusick td = -pop8(); 87636537Smckusick push8(td); 8772080Smckusick continue; 8782080Smckusick case O_DIV2: 8792080Smckusick pc.cp++; 8802080Smckusick tl = pop2(); 88110576Smckusick tl1 = pop2(); 88210576Smckusick push4(tl1 / tl); 8832080Smckusick continue; 8842080Smckusick case O_DIV4: 8852080Smckusick pc.cp++; 8862080Smckusick tl = pop4(); 88710576Smckusick tl1 = pop4(); 88810576Smckusick push4(tl1 / tl); 8892080Smckusick continue; 8902080Smckusick case O_DIV24: 8912080Smckusick pc.cp++; 8922080Smckusick tl = pop2(); 89310576Smckusick tl1 = pop4(); 89410576Smckusick push4(tl1 / tl); 8952080Smckusick continue; 8962080Smckusick case O_DIV42: 8972080Smckusick pc.cp++; 8982080Smckusick tl = pop4(); 89910576Smckusick tl1 = pop2(); 90010576Smckusick push4(tl1 / tl); 9012080Smckusick continue; 9022080Smckusick case O_MOD2: 9032080Smckusick pc.cp++; 9042080Smckusick tl = pop2(); 90510576Smckusick tl1 = pop2(); 90610576Smckusick push4(tl1 % tl); 9072080Smckusick continue; 9082080Smckusick case O_MOD4: 9092080Smckusick pc.cp++; 9102080Smckusick tl = pop4(); 91110576Smckusick tl1 = pop4(); 91210576Smckusick push4(tl1 % tl); 9132080Smckusick continue; 9142080Smckusick case O_MOD24: 9152080Smckusick pc.cp++; 9162080Smckusick tl = pop2(); 91710576Smckusick tl1 = pop4(); 91810576Smckusick push4(tl1 % tl); 9192080Smckusick continue; 9202080Smckusick case O_MOD42: 9212080Smckusick pc.cp++; 9222080Smckusick tl = pop4(); 92310576Smckusick tl1 = pop2(); 92410576Smckusick push4(tl1 % tl); 9252080Smckusick continue; 9262080Smckusick case O_ADD8: 9272080Smckusick pc.cp++; 92810576Smckusick td = pop8(); 92910576Smckusick td1 = pop8(); 93010787Smckusick push8(td1 + td); 9312080Smckusick continue; 9322080Smckusick case O_SUB8: 9332080Smckusick pc.cp++; 9342080Smckusick td = pop8(); 93510576Smckusick td1 = pop8(); 93610787Smckusick push8(td1 - td); 9372080Smckusick continue; 9382080Smckusick case O_MUL8: 9392080Smckusick pc.cp++; 94010576Smckusick td = pop8(); 94110576Smckusick td1 = pop8(); 94210787Smckusick push8(td1 * td); 9432080Smckusick continue; 9442080Smckusick case O_DVD8: 9452080Smckusick pc.cp++; 9462080Smckusick td = pop8(); 94710576Smckusick td1 = pop8(); 94810787Smckusick push8(td1 / td); 9492080Smckusick continue; 9502080Smckusick case O_STOI: 9512080Smckusick pc.cp++; 95236537Smckusick ts = pop2(); 95336537Smckusick push4((long)ts); 9542080Smckusick continue; 9552080Smckusick case O_STOD: 9562080Smckusick pc.cp++; 9572080Smckusick td = pop2(); 9582080Smckusick push8(td); 9592080Smckusick continue; 9602080Smckusick case O_ITOD: 9612080Smckusick pc.cp++; 9622080Smckusick td = pop4(); 9632080Smckusick push8(td); 9642080Smckusick continue; 9652080Smckusick case O_ITOS: 9662080Smckusick pc.cp++; 96736537Smckusick tl = pop4(); 96836537Smckusick push2((short)tl); 9692080Smckusick continue; 9702080Smckusick case O_DVD2: 9712080Smckusick pc.cp++; 9722080Smckusick td = pop2(); 97310576Smckusick td1 = pop2(); 97410576Smckusick push8(td1 / td); 9752080Smckusick continue; 9762080Smckusick case O_DVD4: 9772080Smckusick pc.cp++; 9782080Smckusick td = pop4(); 97910576Smckusick td1 = pop4(); 98010576Smckusick push8(td1 / td); 9812080Smckusick continue; 9822080Smckusick case O_DVD24: 9832080Smckusick pc.cp++; 9842080Smckusick td = pop2(); 98510576Smckusick td1 = pop4(); 98610576Smckusick push8(td1 / td); 9872080Smckusick continue; 9882080Smckusick case O_DVD42: 9892080Smckusick pc.cp++; 9902080Smckusick td = pop4(); 99110576Smckusick td1 = pop2(); 99210576Smckusick push8(td1 / td); 9932080Smckusick continue; 9942080Smckusick case O_DVD28: 9952080Smckusick pc.cp++; 9962080Smckusick td = pop2(); 99710576Smckusick td1 = pop8(); 99810576Smckusick push8(td1 / td); 9992080Smckusick continue; 10002080Smckusick case O_DVD48: 10012080Smckusick pc.cp++; 100210787Smckusick td = pop4(); 100310787Smckusick td1 = pop8(); 100410787Smckusick push8(td1 / td); 10052080Smckusick continue; 10062080Smckusick case O_DVD82: 10072080Smckusick pc.cp++; 10082080Smckusick td = pop8(); 100910576Smckusick td1 = pop2(); 101010576Smckusick push8(td1 / td); 10112080Smckusick continue; 10122080Smckusick case O_DVD84: 10132080Smckusick pc.cp++; 10142080Smckusick td = pop8(); 101510576Smckusick td1 = pop4(); 101610576Smckusick push8(td1 / td); 10172080Smckusick continue; 10182080Smckusick case O_RV1: 10192109Smckusic tcp = _display.raw[*pc.ucp++]; 10202950Smckusic push2((short)(*(tcp + *pc.sp++))); 10212080Smckusick continue; 10222080Smckusick case O_RV14: 10232109Smckusic tcp = _display.raw[*pc.ucp++]; 10242950Smckusic push4((long)(*(tcp + *pc.sp++))); 10252080Smckusick continue; 10262080Smckusick case O_RV2: 10272109Smckusic tcp = _display.raw[*pc.ucp++]; 10282080Smckusick push2(*(short *)(tcp + *pc.sp++)); 10292080Smckusick continue; 10302080Smckusick case O_RV24: 10312109Smckusic tcp = _display.raw[*pc.ucp++]; 10322950Smckusic push4((long)(*(short *)(tcp + *pc.sp++))); 10332080Smckusick continue; 10342080Smckusick case O_RV4: 10352109Smckusic tcp = _display.raw[*pc.ucp++]; 10362080Smckusick push4(*(long *)(tcp + *pc.sp++)); 10372080Smckusick continue; 10382080Smckusick case O_RV8: 10392109Smckusic tcp = _display.raw[*pc.ucp++]; 10402239Smckusic pushsze8(*(struct sze8 *)(tcp + *pc.sp++)); 10412080Smckusick continue; 10422080Smckusick case O_RV: 10432109Smckusic tcp = _display.raw[*pc.ucp++]; 10442080Smckusick tcp += *pc.sp++; 10452080Smckusick tl = *pc.usp++; 104630057Smckusick STACKALIGN(tl1, tl); 104730057Smckusick tcp1 = pushsp(tl1); 10489231Smckusick blkcpy(tcp, tcp1, tl); 10492080Smckusick continue; 10502080Smckusick case O_LV: 10512109Smckusic tcp = _display.raw[*pc.ucp++]; 10522080Smckusick pushaddr(tcp + *pc.sp++); 10532080Smckusick continue; 10542080Smckusick case O_LRV1: 10552109Smckusic tcp = _display.raw[*pc.ucp++]; 105630057Smckusick PCLONGVAL(tl); 105730057Smckusick push2((short)(*(tcp + tl))); 10582080Smckusick continue; 10592080Smckusick case O_LRV14: 10602109Smckusic tcp = _display.raw[*pc.ucp++]; 106130057Smckusick PCLONGVAL(tl); 106230057Smckusick push4((long)(*(tcp + tl))); 10632080Smckusick continue; 10642080Smckusick case O_LRV2: 10652109Smckusic tcp = _display.raw[*pc.ucp++]; 106630057Smckusick PCLONGVAL(tl); 106730057Smckusick push2(*(short *)(tcp + tl)); 10682080Smckusick continue; 10692080Smckusick case O_LRV24: 10702109Smckusic tcp = _display.raw[*pc.ucp++]; 107130057Smckusick PCLONGVAL(tl); 107230057Smckusick push4((long)(*(short *)(tcp + tl))); 10732080Smckusick continue; 10742080Smckusick case O_LRV4: 10752109Smckusic tcp = _display.raw[*pc.ucp++]; 107630057Smckusick PCLONGVAL(tl); 107730057Smckusick push4(*(long *)(tcp + tl)); 10782080Smckusick continue; 10792080Smckusick case O_LRV8: 10802109Smckusic tcp = _display.raw[*pc.ucp++]; 108130057Smckusick PCLONGVAL(tl); 108230057Smckusick pushsze8(*(struct sze8 *)(tcp + tl)); 10832080Smckusick continue; 10842080Smckusick case O_LRV: 10852109Smckusic tcp = _display.raw[*pc.ucp++]; 108630057Smckusick PCLONGVAL(tl); 108730057Smckusick tcp += tl; 10882080Smckusick tl = *pc.usp++; 108930057Smckusick STACKALIGN(tl1, tl); 109030057Smckusick tcp1 = pushsp(tl1); 10919231Smckusick blkcpy(tcp, tcp1, tl); 10922080Smckusick continue; 10932080Smckusick case O_LLV: 10942109Smckusic tcp = _display.raw[*pc.ucp++]; 109530057Smckusick PCLONGVAL(tl); 109630057Smckusick pushaddr(tcp + tl); 10972080Smckusick continue; 10982080Smckusick case O_IND1: 10992080Smckusick pc.cp++; 110036537Smckusick ts = *popaddr(); 110136537Smckusick push2(ts); 11022080Smckusick continue; 11032080Smckusick case O_IND14: 11042080Smckusick pc.cp++; 110536537Smckusick ti = *popaddr(); 110636537Smckusick push4((long)ti); 11072080Smckusick continue; 11082080Smckusick case O_IND2: 11092080Smckusick pc.cp++; 111036537Smckusick ts = *(short *)(popaddr()); 111136537Smckusick push2(ts); 11122080Smckusick continue; 11132080Smckusick case O_IND24: 11142080Smckusick pc.cp++; 111536537Smckusick ts = *(short *)(popaddr()); 111636537Smckusick push4((long)ts); 11172080Smckusick continue; 11182080Smckusick case O_IND4: 11192080Smckusick pc.cp++; 112036537Smckusick tl = *(long *)(popaddr()); 112136537Smckusick push4(tl); 11222080Smckusick continue; 11232080Smckusick case O_IND8: 11242080Smckusick pc.cp++; 112536537Smckusick t8 = *(struct sze8 *)(popaddr()); 112636537Smckusick pushsze8(t8); 11272080Smckusick continue; 11282080Smckusick case O_IND: 11292080Smckusick tl = *pc.cp++; 11302080Smckusick if (tl == 0) 11312080Smckusick tl = *pc.usp++; 11322080Smckusick tcp = popaddr(); 113330057Smckusick STACKALIGN(tl1, tl); 113430057Smckusick tcp1 = pushsp(tl1); 11359231Smckusick blkcpy(tcp, tcp1, tl); 11362080Smckusick continue; 11372080Smckusick case O_CON1: 11382950Smckusic push2((short)(*pc.cp++)); 11392080Smckusick continue; 11402080Smckusick case O_CON14: 11412950Smckusic push4((long)(*pc.cp++)); 11422080Smckusick continue; 11432080Smckusick case O_CON2: 11442080Smckusick pc.cp++; 11452080Smckusick push2(*pc.sp++); 11462080Smckusick continue; 11472080Smckusick case O_CON24: 11482080Smckusick pc.cp++; 11492950Smckusic push4((long)(*pc.sp++)); 11502080Smckusick continue; 11512080Smckusick case O_CON4: 11522080Smckusick pc.cp++; 115330057Smckusick PCLONGVAL(tl); 115430057Smckusick push4(tl); 11552080Smckusick continue; 11562080Smckusick case O_CON8: 11572080Smckusick pc.cp++; 115830057Smckusick tcp = pushsp(sizeof(double)); 115930057Smckusick blkcpy(pc.cp, tcp, sizeof(double)); 116030057Smckusick pc.dbp++; 11612080Smckusick continue; 11622080Smckusick case O_CON: 11632080Smckusick tl = *pc.cp++; 11642080Smckusick if (tl == 0) 11652080Smckusick tl = *pc.usp++; 116630057Smckusick STACKALIGN(tl1, tl); 116730057Smckusick tcp = pushsp(tl1); 11689231Smckusick blkcpy(pc.cp, tcp, tl); 11692950Smckusic pc.cp += (int)tl; 11702080Smckusick continue; 11712950Smckusic case O_CONG: 11722950Smckusic tl = *pc.cp++; 11732950Smckusic if (tl == 0) 11742950Smckusic tl = *pc.usp++; 117530057Smckusick STACKALIGN(tl1, tl); 11762950Smckusic tcp = pushsp(tl1); 11779231Smckusick blkcpy(pc.cp, tcp, tl1); 11782950Smckusic pc.cp += (int)((tl + 2) & ~1); 11792950Smckusic continue; 11802080Smckusick case O_LVCON: 11812080Smckusick tl = *pc.cp++; 11822080Smckusick if (tl == 0) 11832080Smckusick tl = *pc.usp++; 118430057Smckusick pushaddr(pc.cp); 11852080Smckusick tl = (tl + 1) & ~1; 11862950Smckusic pc.cp += (int)tl; 11872080Smckusick continue; 11882080Smckusick case O_RANG2: 11892080Smckusick tl = *pc.cp++; 11902080Smckusick if (tl == 0) 11912080Smckusick tl = *pc.sp++; 11922080Smckusick tl1 = pop2(); 11934026Smckusic push2((short)(RANG4(tl1, tl, (long)(*pc.sp++)))); 11942080Smckusick continue; 11952080Smckusick case O_RANG42: 11962080Smckusick tl = *pc.cp++; 11972080Smckusick if (tl == 0) 11982080Smckusick tl = *pc.sp++; 11992080Smckusick tl1 = pop4(); 12004026Smckusic push4(RANG4(tl1, tl, (long)(*pc.sp++))); 12012080Smckusick continue; 12022080Smckusick case O_RSNG2: 12032080Smckusick tl = *pc.cp++; 12042080Smckusick if (tl == 0) 12052080Smckusick tl = *pc.sp++; 12062080Smckusick tl1 = pop2(); 12072950Smckusic push2((short)(RSNG4(tl1, tl))); 12082080Smckusick continue; 12092080Smckusick case O_RSNG42: 12102080Smckusick tl = *pc.cp++; 12112080Smckusick if (tl == 0) 12122080Smckusick tl = *pc.sp++; 12132080Smckusick tl1 = pop4(); 12142080Smckusick push4(RSNG4(tl1, tl)); 12152080Smckusick continue; 12162080Smckusick case O_RANG4: 12174026Smckusic tl = *pc.cp++; 12184026Smckusic if (tl == 0) 121930057Smckusick PCLONGVAL(tl); 12202080Smckusick tl1 = pop4(); 122130057Smckusick PCLONGVAL(tl2); 122230057Smckusick push4(RANG4(tl1, tl, tl2)); 12232080Smckusick continue; 12242080Smckusick case O_RANG24: 12254026Smckusic tl = *pc.cp++; 12264026Smckusic if (tl == 0) 122730057Smckusick PCLONGVAL(tl); 12282080Smckusick tl1 = pop2(); 122930057Smckusick PCLONGVAL(tl2); 123030057Smckusick push2((short)(RANG4(tl1, tl, tl2))); 12312080Smckusick continue; 12322080Smckusick case O_RSNG4: 12334026Smckusic tl = *pc.cp++; 12344026Smckusic if (tl == 0) 123530057Smckusick PCLONGVAL(tl); 12364026Smckusic tl1 = pop4(); 12374026Smckusic push4(RSNG4(tl1, tl)); 12382080Smckusick continue; 12392080Smckusick case O_RSNG24: 12404026Smckusic tl = *pc.cp++; 12414026Smckusic if (tl == 0) 124230057Smckusick PCLONGVAL(tl); 12434026Smckusic tl1 = pop2(); 12444026Smckusic push2((short)(RSNG4(tl1, tl))); 12452080Smckusick continue; 12462080Smckusick case O_STLIM: 12472080Smckusick pc.cp++; 124836537Smckusick tl = pop4(); 124936537Smckusick STLIM(tl); 12502080Smckusick continue; 12512080Smckusick case O_LLIMIT: 12522080Smckusick pc.cp++; 125336537Smckusick tcp = popaddr(); 125436537Smckusick tl = pop4(); 125536537Smckusick LLIMIT(tcp, tl); 12562080Smckusick continue; 12572080Smckusick case O_BUFF: 12582950Smckusic BUFF((long)(*pc.cp++)); 12592080Smckusick continue; 12602080Smckusick case O_HALT: 12612080Smckusick pc.cp++; 12625682Smckusic if (_nodump == TRUE) 12635682Smckusic psexit(0); 12645682Smckusic fputs("\nCall to procedure halt\n", stderr); 12655682Smckusic backtrace("Halted"); 12665682Smckusic psexit(0); 12672080Smckusick continue; 12682080Smckusick case O_PXPBUF: 12692080Smckusick pc.cp++; 127030057Smckusick PCLONGVAL(tl); 127130057Smckusick _cntrs = tl; 127230057Smckusick PCLONGVAL(tl); 127330057Smckusick _rtns = tl; 12749231Smckusick NEW(&_pcpcount, (_cntrs + 1) * sizeof(long)); 12759231Smckusick blkclr(_pcpcount, (_cntrs + 1) * sizeof(long)); 12762080Smckusick continue; 12772080Smckusick case O_COUNT: 12782080Smckusick pc.cp++; 12792080Smckusick _pcpcount[*pc.usp++]++; 12802080Smckusick continue; 12812080Smckusick case O_CASE1OP: 12822080Smckusick tl = *pc.cp++; /* tl = number of cases */ 12832080Smckusick if (tl == 0) 12842080Smckusick tl = *pc.usp++; 12852080Smckusick tsp = pc.sp + tl; /* ptr to end of jump table */ 12862080Smckusick tcp = (char *)tsp; /* tcp = ptr to case values */ 12872080Smckusick tl1 = pop2(); /* tl1 = element to find */ 12882080Smckusick for(; tl > 0; tl--) /* look for element */ 12892080Smckusick if (tl1 == *tcp++) 12902080Smckusick break; 12912080Smckusick if (tl == 0) /* default case => error */ 12925666Smckusic CASERNG(tl1); 12932080Smckusick pc.cp += *(tsp - tl); 12942080Smckusick continue; 12952080Smckusick case O_CASE2OP: 12962080Smckusick tl = *pc.cp++; /* tl = number of cases */ 12972080Smckusick if (tl == 0) 12982080Smckusick tl = *pc.usp++; 12992080Smckusick tsp = pc.sp + tl; /* ptr to end of jump table */ 13002080Smckusick tsp1 = tsp; /* tsp1 = ptr to case values */ 13012080Smckusick tl1 = (unsigned short)pop2();/* tl1 = element to find */ 13022080Smckusick for(; tl > 0; tl--) /* look for element */ 130330057Smckusick if (tl1 == *tsp++) 13042080Smckusick break; 13052080Smckusick if (tl == 0) /* default case => error */ 13065666Smckusic CASERNG(tl1); 130730057Smckusick pc.cp += *(tsp1 - tl); 13082080Smckusick continue; 13092080Smckusick case O_CASE4OP: 13102080Smckusick tl = *pc.cp++; /* tl = number of cases */ 13112080Smckusick if (tl == 0) 13122080Smckusick tl = *pc.usp++; 131330057Smckusick tsp1 = pc.sp + tl; /* ptr to end of jump table */ 131430057Smckusick tlp = (long *)tsp1; /* tlp = ptr to case values */ 13152080Smckusick tl1 = pop4(); /* tl1 = element to find */ 131630057Smckusick for(; tl > 0; tl--) { /* look for element */ 131730057Smckusick GETLONGVAL(tl2, tlp++); 131830057Smckusick if (tl1 == tl2) 13192080Smckusick break; 132030057Smckusick } 13212080Smckusick if (tl == 0) /* default case => error */ 13225666Smckusic CASERNG(tl1); 132330057Smckusick pc.cp += *(tsp1 - tl); 13242080Smckusick continue; 13252080Smckusick case O_ADDT: 13262080Smckusick tl = *pc.cp++; /* tl has comparison length */ 13272080Smckusick if (tl == 0) 13282080Smckusick tl = *pc.usp++; 13292950Smckusic tcp = pushsp((long)(0));/* tcp pts to first arg */ 13302080Smckusick ADDT(tcp + tl, tcp + tl, tcp, tl >> 2); 13312080Smckusick popsp(tl); 13322080Smckusick continue; 13332080Smckusick case O_SUBT: 13342080Smckusick tl = *pc.cp++; /* tl has comparison length */ 13352080Smckusick if (tl == 0) 13362080Smckusick tl = *pc.usp++; 13372950Smckusic tcp = pushsp((long)(0));/* tcp pts to first arg */ 13382080Smckusick SUBT(tcp + tl, tcp + tl, tcp, tl >> 2); 13392080Smckusick popsp(tl); 13402080Smckusick continue; 13412080Smckusick case O_MULT: 13422080Smckusick tl = *pc.cp++; /* tl has comparison length */ 13432080Smckusick if (tl == 0) 13442080Smckusick tl = *pc.usp++; 13452950Smckusic tcp = pushsp((long)(0));/* tcp pts to first arg */ 13462080Smckusick MULT(tcp + tl, tcp + tl, tcp, tl >> 2); 13472080Smckusick popsp(tl); 13482080Smckusick continue; 13492080Smckusick case O_INCT: 13502080Smckusick tl = *pc.cp++; /* tl has number of args */ 13512080Smckusick if (tl == 0) 13522080Smckusick tl = *pc.usp++; 13532950Smckusic tb = INCT(); 13542950Smckusic popsp(tl*sizeof(long)); 13552950Smckusic push2((short)(tb)); 13562080Smckusick continue; 13572080Smckusick case O_CTTOT: 13582080Smckusick tl = *pc.cp++; /* tl has number of args */ 13592080Smckusick if (tl == 0) 13602080Smckusick tl = *pc.usp++; 136136537Smckusick tl1 = tl * sizeof(long); /* Size of all args */ 13622950Smckusic tcp = pushsp((long)(0)) + tl1; /* tcp pts to result */ 136336537Smckusick tl1 = pop4(); /* Pop the 4 fixed args */ 136436537Smckusick tl2 = pop4(); 136536537Smckusick tl3 = pop4(); 136636537Smckusick tl4 = pop4(); 136736537Smckusick tcp2 = pushsp((long)0); /* tcp2 -> data values */ 136836537Smckusick CTTOTA(tcp, tl1, tl2, tl3, tl4, tcp2); 136936537Smckusick popsp(tl*sizeof(long) - 4*sizeof(long)); /* Pop data */ 13702080Smckusick continue; 13712080Smckusick case O_CARD: 13722080Smckusick tl = *pc.cp++; /* tl has comparison length */ 13732080Smckusick if (tl == 0) 13742080Smckusick tl = *pc.usp++; 13752950Smckusic tcp = pushsp((long)(0));/* tcp pts to set */ 13762080Smckusick tl1 = CARD(tcp, tl); 13772080Smckusick popsp(tl); 13782950Smckusic push2((short)(tl1)); 13792080Smckusick continue; 13802080Smckusick case O_IN: 13812080Smckusick tl = *pc.cp++; /* tl has comparison length */ 13822080Smckusick if (tl == 0) 13832080Smckusick tl = *pc.usp++; 13842080Smckusick tl1 = pop4(); /* tl1 is the element */ 13852950Smckusic tcp = pushsp((long)(0));/* tcp pts to set */ 13864026Smckusic tl2 = *pc.sp++; /* lower bound */ 13872950Smckusic tb = IN(tl1, tl2, (long)(*pc.usp++), tcp); 13882080Smckusick popsp(tl); 13892950Smckusic push2((short)(tb)); 13902080Smckusick continue; 13912080Smckusick case O_ASRT: 13922080Smckusick pc.cp++; 139324938Smckusick tl = pop4(); 139424938Smckusick tcp = popaddr(); 139524938Smckusick ASRTS(tl, tcp); 13962080Smckusick continue; 13972080Smckusick case O_FOR1U: 139810792Smckusick tl1 = *pc.cp++; /* tl1 loop branch */ 139910576Smckusick if (tl1 == 0) 140010576Smckusick tl1 = *pc.sp++; 140110576Smckusick tcp = popaddr(); /* tcp = ptr to index var */ 140210792Smckusick tl = pop4(); /* tl upper bound */ 140310792Smckusick if (*tcp == tl) /* loop is done, fall through */ 140410576Smckusick continue; 140510792Smckusick *tcp += 1; /* inc index var */ 140610792Smckusick pc.cp += tl1; /* return to top of loop */ 140710576Smckusick continue; 14082080Smckusick case O_FOR2U: 140910792Smckusick tl1 = *pc.cp++; /* tl1 loop branch */ 14104026Smckusic if (tl1 == 0) 14114026Smckusic tl1 = *pc.sp++; 141210576Smckusick tsp = (short *)popaddr(); /* tsp = ptr to index var */ 141310792Smckusick tl = pop4(); /* tl upper bound */ 141410792Smckusick if (*tsp == tl) /* loop is done, fall through */ 14152080Smckusick continue; 141610792Smckusick *tsp += 1; /* inc index var */ 141710792Smckusick pc.cp += tl1; /* return to top of loop */ 14182080Smckusick continue; 14192080Smckusick case O_FOR4U: 142010792Smckusick tl1 = *pc.cp++; /* tl1 loop branch */ 14214026Smckusic if (tl1 == 0) 142210792Smckusick tl1 = *pc.sp++; 14232950Smckusic tlp = (long *)popaddr(); /* tlp = ptr to index var */ 142410792Smckusick tl = pop4(); /* tl upper bound */ 142510792Smckusick if (*tlp == tl) /* loop is done, fall through */ 14262080Smckusick continue; 142710792Smckusick *tlp += 1; /* inc index var */ 142810792Smckusick pc.cp += tl1; /* return to top of loop */ 14292080Smckusick continue; 14302080Smckusick case O_FOR1D: 143110792Smckusick tl1 = *pc.cp++; /* tl1 loop branch */ 143210576Smckusick if (tl1 == 0) 143310576Smckusick tl1 = *pc.sp++; 143410576Smckusick tcp = popaddr(); /* tcp = ptr to index var */ 143510792Smckusick tl = pop4(); /* tl upper bound */ 143610792Smckusick if (*tcp == tl) /* loop is done, fall through */ 143710576Smckusick continue; 143810792Smckusick *tcp -= 1; /* dec index var */ 143910792Smckusick pc.cp += tl1; /* return to top of loop */ 144010576Smckusick continue; 14412080Smckusick case O_FOR2D: 144210792Smckusick tl1 = *pc.cp++; /* tl1 loop branch */ 14434026Smckusic if (tl1 == 0) 14444026Smckusic tl1 = *pc.sp++; 144510576Smckusick tsp = (short *)popaddr(); /* tsp = ptr to index var */ 144610792Smckusick tl = pop4(); /* tl upper bound */ 144710792Smckusick if (*tsp == tl) /* loop is done, fall through */ 14482080Smckusick continue; 144910792Smckusick *tsp -= 1; /* dec index var */ 145010792Smckusick pc.cp += tl1; /* return to top of loop */ 14512080Smckusick continue; 14522080Smckusick case O_FOR4D: 145310792Smckusick tl1 = *pc.cp++; /* tl1 loop branch */ 14544026Smckusic if (tl1 == 0) 145510792Smckusick tl1 = *pc.sp++; 14562950Smckusic tlp = (long *)popaddr(); /* tlp = ptr to index var */ 145710792Smckusick tl = pop4(); /* tl upper bound */ 145810792Smckusick if (*tlp == tl) /* loop is done, fall through */ 14592080Smckusick continue; 146010792Smckusick *tlp -= 1; /* dec index var */ 146110792Smckusick pc.cp += tl1; /* return to top of loop */ 14622080Smckusick continue; 14632080Smckusick case O_READE: 14642080Smckusick pc.cp++; 146530057Smckusick PCLONGVAL(tl); 146630057Smckusick push2((short)(READE(curfile, base + tl))); 14672080Smckusick continue; 14682080Smckusick case O_READ4: 14692080Smckusick pc.cp++; 14702080Smckusick push4(READ4(curfile)); 14712080Smckusick continue; 14722080Smckusick case O_READC: 14732080Smckusick pc.cp++; 14742950Smckusic push2((short)(READC(curfile))); 14752080Smckusick continue; 14762080Smckusick case O_READ8: 14772080Smckusick pc.cp++; 14782080Smckusick push8(READ8(curfile)); 14792080Smckusick continue; 14802080Smckusick case O_READLN: 14812080Smckusick pc.cp++; 14822080Smckusick READLN(curfile); 14832080Smckusick continue; 14842080Smckusick case O_EOF: 14852080Smckusick pc.cp++; 148636537Smckusick tcp = popaddr(); 148736537Smckusick push2((short)(TEOF(tcp))); 14882080Smckusick continue; 14892080Smckusick case O_EOLN: 14902080Smckusick pc.cp++; 149136537Smckusick tcp = popaddr(); 149236537Smckusick push2((short)(TEOLN(tcp))); 14932080Smckusick continue; 14942080Smckusick case O_WRITEC: 149536537Smckusick pc.cp++; 149636537Smckusick ti = popint(); 149736537Smckusick tf = popfile(); 14982191Smckusic if (_runtst) { 149936537Smckusick WRITEC(curfile, ti, tf); 15002191Smckusic continue; 15012191Smckusic } 150236537Smckusick fputc(ti, tf); 15032080Smckusick continue; 15042080Smckusick case O_WRITES: 150536537Smckusick pc.cp++; /* Skip arg size */ 150636537Smckusick tf = popfile(); 150736537Smckusick ti = popint(); 150836537Smckusick ti2 = popint(); 150936537Smckusick tcp2 = popaddr(); 15102191Smckusic if (_runtst) { 151136537Smckusick WRITES(curfile, tf, ti, ti2, tcp2); 15122191Smckusic continue; 15132191Smckusic } 151436537Smckusick fwrite(tf, ti, ti2, tcp2); 15152080Smckusick continue; 15162080Smckusick case O_WRITEF: 151736537Smckusick tf = popfile(); 151836537Smckusick tcp = popaddr(); 151936537Smckusick tcp2 = pushsp((long)0); /* Addr of printf's args */ 15202191Smckusic if (_runtst) { 152136537Smckusick VWRITEF(curfile, tf, tcp, tcp2); 152236537Smckusick } else { 152336537Smckusick vfprintf(tf, tcp, tcp2); 15242191Smckusic } 152536537Smckusick popsp((long) 152636537Smckusick (*pc.cp++) - (sizeof (FILE *)) - sizeof (char *)); 15272080Smckusick continue; 15282080Smckusick case O_WRITLN: 15292080Smckusick pc.cp++; 15302191Smckusic if (_runtst) { 15312191Smckusic WRITLN(curfile); 15322191Smckusic continue; 15332191Smckusic } 15342191Smckusic fputc('\n', ACTFILE(curfile)); 15352080Smckusick continue; 15362080Smckusick case O_PAGE: 15372080Smckusick pc.cp++; 15382191Smckusic if (_runtst) { 15392191Smckusic PAGE(curfile); 15402191Smckusic continue; 15412191Smckusic } 15422950Smckusic fputc('', ACTFILE(curfile)); 15432080Smckusick continue; 15442080Smckusick case O_NAM: 15452080Smckusick pc.cp++; 15462080Smckusick tl = pop4(); 154730057Smckusick PCLONGVAL(tl1); 154830057Smckusick pushaddr(NAM(tl, base + tl1)); 15492080Smckusick continue; 15502080Smckusick case O_MAX: 15512080Smckusick tl = *pc.cp++; 15522080Smckusick if (tl == 0) 15532080Smckusick tl = *pc.usp++; 15542080Smckusick tl1 = pop4(); 15552191Smckusic if (_runtst) { 15562950Smckusic push4(MAX(tl1, tl, (long)(*pc.usp++))); 15572191Smckusic continue; 15582191Smckusic } 15592191Smckusic tl1 -= tl; 15602191Smckusic tl = *pc.usp++; 15612191Smckusic push4(tl1 > tl ? tl1 : tl); 15622080Smckusick continue; 15632080Smckusick case O_MIN: 15642080Smckusick tl = *pc.cp++; 15652080Smckusick if (tl == 0) 15662080Smckusick tl = *pc.usp++; 15672080Smckusick tl1 = pop4(); 15682080Smckusick push4(tl1 < tl ? tl1 : tl); 15692080Smckusick continue; 15702080Smckusick case O_UNIT: 15712080Smckusick pc.cp++; 15722080Smckusick curfile = UNIT(popaddr()); 15732080Smckusick continue; 15742080Smckusick case O_UNITINP: 15752080Smckusick pc.cp++; 15762080Smckusick curfile = INPUT; 15772080Smckusick continue; 15782080Smckusick case O_UNITOUT: 15792080Smckusick pc.cp++; 15802080Smckusick curfile = OUTPUT; 15812080Smckusick continue; 15822080Smckusick case O_MESSAGE: 15832080Smckusick pc.cp++; 15842080Smckusick PFLUSH(); 15852080Smckusick curfile = ERR; 15862080Smckusick continue; 15872109Smckusic case O_PUT: 15882109Smckusic pc.cp++; 15892109Smckusic PUT(curfile); 15902109Smckusic continue; 15912080Smckusick case O_GET: 15922080Smckusick pc.cp++; 15932080Smckusick GET(curfile); 15942080Smckusick continue; 15952080Smckusick case O_FNIL: 15962080Smckusick pc.cp++; 159736537Smckusick tcp = popaddr(); 159836537Smckusick pushaddr(FNIL(tcp)); 15992080Smckusick continue; 16002080Smckusick case O_DEFNAME: 16012080Smckusick pc.cp++; 160236537Smckusick tcp2 = popaddr(); 160336537Smckusick tcp = popaddr(); 160436537Smckusick tl = pop4(); 160536537Smckusick tl2 = pop4(); 160636537Smckusick DEFNAME((struct iorec *)tcp2, tcp, tl, tl2); 16072080Smckusick continue; 16082080Smckusick case O_RESET: 16092080Smckusick pc.cp++; 161036537Smckusick tcp2 = popaddr(); 161136537Smckusick tcp = popaddr(); 161236537Smckusick tl = pop4(); 161336537Smckusick tl2 = pop4(); 161436537Smckusick RESET((struct iorec *)tcp2, tcp, tl, tl2); 16152080Smckusick continue; 16162080Smckusick case O_REWRITE: 16172080Smckusick pc.cp++; 161836537Smckusick tcp2 = popaddr(); 161936537Smckusick tcp = popaddr(); 162036537Smckusick tl = pop4(); 162136537Smckusick tl2 = pop4(); 162236537Smckusick REWRITE((struct iorec *)tcp2, tcp, tl, tl2); 16232080Smckusick continue; 16242080Smckusick case O_FILE: 16252080Smckusick pc.cp++; 16262080Smckusick pushaddr(ACTFILE(curfile)); 16272080Smckusick continue; 16282080Smckusick case O_REMOVE: 16292080Smckusick pc.cp++; 163036537Smckusick tcp = popaddr(); 163136537Smckusick tl = pop4(); 163236537Smckusick REMOVE(tcp, tl); 16332080Smckusick continue; 16342080Smckusick case O_FLUSH: 16352080Smckusick pc.cp++; 163636537Smckusick tcp = popaddr(); 163736537Smckusick FLUSH((struct iorec *)tcp); 16382080Smckusick continue; 16392080Smckusick case O_PACK: 16402080Smckusick pc.cp++; 164136537Smckusick tl = pop4(); 164236537Smckusick tcp = popaddr(); 164336537Smckusick tcp2 = popaddr(); 164436537Smckusick tl1 = pop4(); 164536537Smckusick tl2 = pop4(); 164636537Smckusick tl3 = pop4(); 164736537Smckusick tl4 = pop4(); 164836537Smckusick PACK(tl, tcp, tcp2, tl1, tl2, tl3, tl4); 16492080Smckusick continue; 16502080Smckusick case O_UNPACK: 16512080Smckusick pc.cp++; 165236537Smckusick tl = pop4(); 165336537Smckusick tcp = popaddr(); 165436537Smckusick tcp2 = popaddr(); 165536537Smckusick tl1 = pop4(); 165636537Smckusick tl2 = pop4(); 165736537Smckusick tl3 = pop4(); 165836537Smckusick tl4 = pop4(); 165936537Smckusick UNPACK(tl, tcp, tcp2, tl1, tl2, tl3, tl4); 16602080Smckusick continue; 16612080Smckusick case O_ARGC: 16622080Smckusick pc.cp++; 16632950Smckusic push4((long)_argc); 16642080Smckusick continue; 16652080Smckusick case O_ARGV: 16662080Smckusick tl = *pc.cp++; /* tl = size of char array */ 16672080Smckusick if (tl == 0) 16682080Smckusick tl = *pc.usp++; 16692080Smckusick tcp = popaddr(); /* tcp = addr of char array */ 16702080Smckusick tl1 = pop4(); /* tl1 = argv subscript */ 16712080Smckusick ARGV(tl1, tcp, tl); 16722080Smckusick continue; 16732080Smckusick case O_CLCK: 16742080Smckusick pc.cp++; 16752080Smckusick push4(CLCK()); 16762080Smckusick continue; 16772080Smckusick case O_WCLCK: 16782080Smckusick pc.cp++; 16792080Smckusick push4(time(0)); 16802080Smckusick continue; 16812080Smckusick case O_SCLCK: 16822080Smckusick pc.cp++; 16832080Smckusick push4(SCLCK()); 16842080Smckusick continue; 16852080Smckusick case O_NEW: 16862080Smckusick tl = *pc.cp++; /* tl = size being new'ed */ 16872080Smckusick if (tl == 0) 16882080Smckusick tl = *pc.usp++; 16892080Smckusick tcp = popaddr(); /* ptr to ptr being new'ed */ 16909231Smckusick NEW(tcp, tl); 16912191Smckusic if (_runtst) { 16929263Smckusick blkclr(*((char **)(tcp)), tl); 16932191Smckusic } 16942080Smckusick continue; 16957961Smckusick case O_DISPOSE: 16967961Smckusick tl = *pc.cp++; /* tl = size being disposed */ 16977961Smckusick if (tl == 0) 16987961Smckusick tl = *pc.usp++; 16997961Smckusick tcp = popaddr(); /* ptr to ptr being disposed */ 17007961Smckusick DISPOSE(tcp, tl); 17017961Smckusick *(char **)tcp = (char *)0; 17027961Smckusick continue; 17037961Smckusick case O_DFDISP: 17047961Smckusick tl = *pc.cp++; /* tl = size being disposed */ 17057961Smckusick if (tl == 0) 17067961Smckusick tl = *pc.usp++; 17077961Smckusick tcp = popaddr(); /* ptr to ptr being disposed */ 17087961Smckusick DFDISPOSE(tcp, tl); 17097961Smckusick *(char **)tcp = (char *)0; 17107961Smckusick continue; 17112080Smckusick case O_DATE: 17122080Smckusick pc.cp++; 17132080Smckusick DATE(popaddr()); 17142080Smckusick continue; 17152080Smckusick case O_TIME: 17162080Smckusick pc.cp++; 17172080Smckusick TIME(popaddr()); 17182080Smckusick continue; 17192080Smckusick case O_UNDEF: 17202080Smckusick pc.cp++; 172130057Smckusick td = pop8(); 17222950Smckusic push2((short)(0)); 17232080Smckusick continue; 17242080Smckusick case O_ATAN: 17252080Smckusick pc.cp++; 172636537Smckusick td = pop8(); 17275723Smckusic if (_runtst) { 172836537Smckusick push8(ATAN(td)); 17295723Smckusic continue; 17305723Smckusic } 173136537Smckusick push8(atan(td)); 17322080Smckusick continue; 17332080Smckusick case O_COS: 17342080Smckusick pc.cp++; 173536537Smckusick td = pop8(); 17365723Smckusic if (_runtst) { 173736537Smckusick push8(COS(td)); 17385723Smckusic continue; 17395723Smckusic } 174036537Smckusick push8(cos(td)); 17412080Smckusick continue; 17422080Smckusick case O_EXP: 17432080Smckusick pc.cp++; 174436537Smckusick td = pop8(); 17455723Smckusic if (_runtst) { 174636537Smckusick push8(EXP(td)); 17475723Smckusic continue; 17485723Smckusic } 174936537Smckusick push8(exp(td)); 17502080Smckusick continue; 17512080Smckusick case O_LN: 17522080Smckusick pc.cp++; 175336537Smckusick td = pop8(); 17542191Smckusic if (_runtst) { 175536537Smckusick push8(LN(td)); 17562191Smckusic continue; 17572191Smckusic } 175836537Smckusick push8(log(td)); 17592080Smckusick continue; 17602080Smckusick case O_SIN: 17612080Smckusick pc.cp++; 176236537Smckusick td = pop8(); 17635723Smckusic if (_runtst) { 176436537Smckusick push8(SIN(td)); 17655723Smckusic continue; 17665723Smckusic } 176736537Smckusick push8(sin(td)); 17682080Smckusick continue; 17692080Smckusick case O_SQRT: 17702080Smckusick pc.cp++; 177136537Smckusick td = pop8(); 17722191Smckusic if (_runtst) { 177336537Smckusick push8(SQRT(td)); 17742191Smckusic continue; 17752191Smckusic } 177636537Smckusick push8(sqrt(td)); 17772080Smckusick continue; 17782080Smckusick case O_CHR2: 17792080Smckusick case O_CHR4: 17802080Smckusick pc.cp++; 178136537Smckusick tl = pop4(); 17822191Smckusic if (_runtst) { 178336537Smckusick push2((short)(CHR(tl))); 17842191Smckusic continue; 17852191Smckusic } 178636537Smckusick push2((short)tl); 17872080Smckusick continue; 17882080Smckusick case O_ODD2: 17892080Smckusick case O_ODD4: 17902080Smckusick pc.cp++; 179110576Smckusick tl = pop4(); 179210576Smckusick push2((short)(tl & 1)); 17932080Smckusick continue; 17942080Smckusick case O_SUCC2: 17952109Smckusic tl = *pc.cp++; 17962109Smckusic if (tl == 0) 17972109Smckusic tl = *pc.sp++; 17982109Smckusic tl1 = pop4(); 17992191Smckusic if (_runtst) { 18002950Smckusic push2((short)(SUCC(tl1, tl, (long)(*pc.sp++)))); 18012191Smckusic continue; 18022191Smckusic } 18032950Smckusic push2((short)(tl1 + 1)); 18042191Smckusic pc.sp++; 18052080Smckusick continue; 18062080Smckusick case O_SUCC24: 18072109Smckusic tl = *pc.cp++; 18082109Smckusic if (tl == 0) 18092109Smckusic tl = *pc.sp++; 18102109Smckusic tl1 = pop4(); 18112191Smckusic if (_runtst) { 18122950Smckusic push4(SUCC(tl1, tl, (long)(*pc.sp++))); 18132191Smckusic continue; 18142191Smckusic } 18152191Smckusic push4(tl1 + 1); 18162191Smckusic pc.sp++; 18172109Smckusic continue; 18182080Smckusick case O_SUCC4: 18192109Smckusic tl = *pc.cp++; 18202109Smckusic if (tl == 0) 182130057Smckusick PCLONGVAL(tl); 18222109Smckusic tl1 = pop4(); 18232191Smckusic if (_runtst) { 182430057Smckusick PCLONGVAL(tl2); 182530057Smckusick push4(SUCC(tl1, tl, (long)(tl2))); 18262191Smckusic continue; 18272191Smckusic } 18282191Smckusic push4(tl1 + 1); 18292191Smckusic pc.lp++; 18302080Smckusick continue; 18312080Smckusick case O_PRED2: 18322109Smckusic tl = *pc.cp++; 18332109Smckusic if (tl == 0) 18342109Smckusic tl = *pc.sp++; 18352109Smckusic tl1 = pop4(); 18362191Smckusic if (_runtst) { 18372950Smckusic push2((short)(PRED(tl1, tl, (long)(*pc.sp++)))); 18382191Smckusic continue; 18392191Smckusic } 18402950Smckusic push2((short)(tl1 - 1)); 18412191Smckusic pc.sp++; 18422080Smckusick continue; 18432080Smckusick case O_PRED24: 18442109Smckusic tl = *pc.cp++; 18452109Smckusic if (tl == 0) 18462109Smckusic tl = *pc.sp++; 18472109Smckusic tl1 = pop4(); 18482191Smckusic if (_runtst) { 18492950Smckusic push4(PRED(tl1, tl, (long)(*pc.sp++))); 18502191Smckusic continue; 18512191Smckusic } 18522191Smckusic push4(tl1 - 1); 18532191Smckusic pc.sp++; 18542109Smckusic continue; 18552080Smckusick case O_PRED4: 18562109Smckusic tl = *pc.cp++; 18572109Smckusic if (tl == 0) 185830057Smckusick PCLONGVAL(tl); 18592109Smckusic tl1 = pop4(); 18602191Smckusic if (_runtst) { 186130057Smckusick PCLONGVAL(tl2); 186230057Smckusick push4(PRED(tl1, tl, (long)(tl2))); 18632191Smckusic continue; 18642191Smckusic } 18652191Smckusic push4(tl1 - 1); 18662191Smckusic pc.lp++; 18672080Smckusick continue; 18682080Smckusick case O_SEED: 18692080Smckusick pc.cp++; 187036537Smckusick tl = pop4(); 187136537Smckusick push4(SEED(tl)); 18722080Smckusick continue; 18732080Smckusick case O_RANDOM: 18742080Smckusick pc.cp++; 187536537Smckusick td = pop8(); /* Argument is ignored */ 187636537Smckusick push8(RANDOM()); 18772080Smckusick continue; 18782080Smckusick case O_EXPO: 18792080Smckusick pc.cp++; 188036537Smckusick td = pop8(); 188136537Smckusick push4(EXPO(td)); 18822080Smckusick continue; 18832080Smckusick case O_SQR2: 18842080Smckusick case O_SQR4: 18852080Smckusick pc.cp++; 18862080Smckusick tl = pop4(); 18872080Smckusick push4(tl * tl); 18882080Smckusick continue; 18892080Smckusick case O_SQR8: 18902080Smckusick pc.cp++; 18912080Smckusick td = pop8(); 18922080Smckusick push8(td * td); 18932080Smckusick continue; 18942080Smckusick case O_ROUND: 18952080Smckusick pc.cp++; 189636537Smckusick td = pop8(); 189736537Smckusick push4(ROUND(td)); 18982080Smckusick continue; 18992080Smckusick case O_TRUNC: 19002080Smckusick pc.cp++; 190136537Smckusick td = pop8(); 190236537Smckusick push4(TRUNC(td)); 19032080Smckusick continue; 19042950Smckusic default: 19055682Smckusic ERROR("Panic: bad op code\n"); 19062950Smckusic continue; 19072080Smckusick } 19082080Smckusick } 19092080Smckusick } 1910