122152Sdist /* 222152Sdist * Copyright (c) 1980 Regents of the University of California. 322152Sdist * All rights reserved. The Berkeley software License Agreement 422152Sdist * specifies the terms and conditions for redistribution. 522152Sdist */ 62080Smckusick 722152Sdist #ifndef lint 8*30057Smckusick static char sccsid[] = "@(#)interp.c 5.4 (Berkeley) 11/12/86"; 922152Sdist #endif not lint 102080Smckusick 112080Smckusick #include <math.h> 1210576Smckusick #include <signal.h> 132950Smckusic #include "whoami.h" 1410576Smckusick #include "vars.h" 152950Smckusic #include "objfmt.h" 162080Smckusick #include "h02opcs.h" 172080Smckusick #include "machdep.h" 182080Smckusick #include "libpc.h" 192080Smckusick 202080Smckusick /* 212080Smckusick * program variables 222080Smckusick */ 2310576Smckusick union display _display; 2410576Smckusick struct dispsave *_dp; 252080Smckusick long _lino = 0; 262080Smckusick int _argc; 272080Smckusick char **_argv; 282080Smckusick long _mode; 2910576Smckusick long _runtst = (long)TRUE; 302950Smckusic bool _nodump = FALSE; 312080Smckusick long _stlim = 500000; 322080Smckusick long _stcnt = 0; 332191Smckusic long _seed = 1; 3410576Smckusick #ifdef ADDR32 352080Smckusick char *_minptr = (char *)0x7fffffff; 3610576Smckusick #endif ADDR32 3710576Smckusick #ifdef ADDR16 382950Smckusic char *_minptr = (char *)0xffff; 3910576Smckusick #endif ADDR16 402080Smckusick char *_maxptr = (char *)0; 412080Smckusick long *_pcpcount = (long *)0; 422080Smckusick long _cntrs = 0; 432080Smckusick long _rtns = 0; 442080Smckusick 452080Smckusick /* 462080Smckusick * standard files 472080Smckusick */ 482080Smckusick char _inwin, _outwin, _errwin; 492950Smckusic struct iorechd _err = { 502950Smckusic &_errwin, /* fileptr */ 512080Smckusick 0, /* lcount */ 522080Smckusick 0x7fffffff, /* llimit */ 532950Smckusic &_iob[2], /* fbuf */ 542950Smckusic FILNIL, /* fchain */ 552080Smckusick STDLVL, /* flev */ 562950Smckusic "Message file", /* pfname */ 572950Smckusic FTEXT | FWRITE | EOFF, /* funit */ 582950Smckusic 2, /* fblk */ 592080Smckusick 1 /* fsize */ 602080Smckusick }; 612080Smckusick struct iorechd output = { 622080Smckusick &_outwin, /* fileptr */ 632080Smckusick 0, /* lcount */ 642080Smckusick 0x7fffffff, /* llimit */ 652080Smckusick &_iob[1], /* fbuf */ 662080Smckusick ERR, /* fchain */ 672080Smckusick STDLVL, /* flev */ 682080Smckusick "standard output", /* pfname */ 692080Smckusick FTEXT | FWRITE | EOFF, /* funit */ 702080Smckusick 1, /* fblk */ 712080Smckusick 1 /* fsize */ 722080Smckusick }; 732950Smckusic struct iorechd input = { 742950Smckusic &_inwin, /* fileptr */ 752080Smckusick 0, /* lcount */ 762080Smckusick 0x7fffffff, /* llimit */ 772950Smckusic &_iob[0], /* fbuf */ 782950Smckusic OUTPUT, /* fchain */ 792080Smckusick STDLVL, /* flev */ 802950Smckusic "standard input", /* pfname */ 817569Smckusick FTEXT|FREAD|SYNC|EOLN, /* funit */ 822950Smckusic 0, /* fblk */ 832080Smckusick 1 /* fsize */ 842080Smckusick }; 852080Smckusick 862109Smckusic /* 872950Smckusic * file record variables 882950Smckusic */ 892950Smckusic long _filefre = PREDEF; 902950Smckusic struct iorechd _fchain = { 912950Smckusic 0, 0, 0, 0, /* only use fchain field */ 922950Smckusic INPUT /* fchain */ 932950Smckusic }; 942950Smckusic struct iorec *_actfile[MAXFILES] = { 952950Smckusic INPUT, 962950Smckusic OUTPUT, 972950Smckusic ERR 982950Smckusic }; 992950Smckusic 1002950Smckusic /* 1015658Slinton * stuff for pdx 1025658Slinton */ 1035658Slinton 1045658Slinton union progcntr *pcaddrp; 1055658Slinton asm(".globl _loopaddr"); 1065658Slinton 1075658Slinton /* 1082109Smckusic * Px profile array 1092109Smckusic */ 1102109Smckusic #ifdef PROFILE 1112109Smckusic long _profcnts[NUMOPS]; 1122109Smckusic #endif PROFILE 1132109Smckusic 1142109Smckusic /* 1152109Smckusic * debugging variables 1162109Smckusic */ 1172109Smckusic #ifdef DEBUG 1182109Smckusic char opc[10]; 1192109Smckusic long opcptr = 9; 1202109Smckusic #endif DEBUG 1212109Smckusic 1222080Smckusick interpreter(base) 1232080Smckusick char *base; 1242080Smckusick { 1252080Smckusick union progcntr pc; /* interpreted program cntr */ 1262080Smckusick register char *vpc; /* register used for "pc" */ 1272080Smckusick struct iorec *curfile; /* active file */ 12810576Smckusick register struct blockmark *stp; /* active stack frame ptr */ 1292080Smckusick /* 1302080Smckusick * the following variables are used as scratch 1312080Smckusick */ 1322239Smckusic register char *tcp; 13310576Smckusick register short *tsp; 134*30057Smckusick register long tl, tl1, tl2, tl3; 1352080Smckusick double td, td1; 1362239Smckusic struct sze8 t8; 13710576Smckusick register short *tsp1; 138*30057Smckusick long *tlp; 13910576Smckusick char *tcp1; 1402950Smckusic bool tb; 14110576Smckusick struct blockmark *tstp; 14210576Smckusick register struct formalrtn *tfp; 1432080Smckusick union progcntr tpc; 1442080Smckusick struct iorec **ip; 14510792Smckusick int mypid; 1462080Smckusick 1475658Slinton pcaddrp = &pc; 14810792Smckusick mypid = getpid(); 1495658Slinton 1502080Smckusick /* 1512239Smckusic * Setup sets up any hardware specific parameters before 1522239Smckusic * starting the interpreter. Typically this is inline replaced 1532239Smckusic * by interp.sed to utilize specific machine instructions. 1542239Smckusic */ 1552239Smckusic setup(); 1562239Smckusic /* 1572080Smckusick * necessary only on systems which do not initialize 1582080Smckusick * memory to zero 1592080Smckusick */ 1602080Smckusick for (ip = &_actfile[3]; ip < &_actfile[MAXFILES]; *ip++ = FILNIL) 1612080Smckusick /* void */; 1622080Smckusick /* 1632080Smckusick * set up global environment, then ``call'' the main program 1642080Smckusick */ 165*30057Smckusick STACKALIGN(tl, 2 * sizeof(struct iorec *)); 166*30057Smckusick _display.frame[0].locvars = pushsp(tl); 1672950Smckusic _display.frame[0].locvars += 2 * sizeof(struct iorec *); 1682950Smckusic *(struct iorec **)(_display.frame[0].locvars + OUTPUT_OFF) = OUTPUT; 1692950Smckusic *(struct iorec **)(_display.frame[0].locvars + INPUT_OFF) = INPUT; 170*30057Smckusick STACKALIGN(tl, sizeof(struct blockmark)); 171*30057Smckusick stp = (struct blockmark *)pushsp(tl); 1722109Smckusic _dp = &_display.frame[0]; 1732080Smckusick pc.cp = base; 1745658Slinton 1755658Slinton asm("_loopaddr:"); 1762080Smckusick for(;;) { 1772109Smckusic # ifdef DEBUG 1782080Smckusick if (++opcptr == 10) 1792080Smckusick opcptr = 0; 1802080Smckusick opc[opcptr] = *pc.ucp; 1812109Smckusic # endif DEBUG 1822109Smckusic # ifdef PROFILE 1832109Smckusic _profcnts[*pc.ucp]++; 1842109Smckusic # endif PROFILE 1852080Smckusick switch (*pc.ucp++) { 1865658Slinton case O_BPT: /* breakpoint trap */ 1875873Slinton PFLUSH(); 18810792Smckusick kill(mypid, SIGILL); 1895658Slinton pc.ucp--; 1905658Slinton continue; 1912080Smckusick case O_NODUMP: 1922191Smckusic _nodump = TRUE; 1932080Smckusick /* and fall through */ 1942080Smckusick case O_BEG: 1952080Smckusick _dp += 1; /* enter local scope */ 1962080Smckusick stp->odisp = *_dp; /* save old display value */ 1972080Smckusick tl = *pc.ucp++; /* tl = name size */ 1982080Smckusick stp->entry = pc.hdrp; /* pointer to entry info */ 1992191Smckusic tl1 = pc.hdrp->framesze;/* tl1 = size of frame */ 2002191Smckusic _lino = pc.hdrp->offset; 2012191Smckusic _runtst = pc.hdrp->tests; 2022191Smckusic disableovrflo(); 2032191Smckusic if (_runtst) 2042191Smckusic enableovrflo(); 2052950Smckusic pc.cp += (int)tl; /* skip over proc hdr info */ 2062080Smckusick stp->file = curfile; /* save active file */ 207*30057Smckusick STACKALIGN(tl2, tl1); 208*30057Smckusick tcp = pushsp(tl2); /* tcp = new top of stack */ 2092950Smckusic if (_runtst) /* zero stack frame */ 2109231Smckusick blkclr(tcp, tl1); 2112950Smckusic tcp += (int)tl1; /* offsets of locals are neg */ 2122109Smckusic _dp->locvars = tcp; /* set new display pointer */ 2132109Smckusic _dp->stp = stp; 2142950Smckusic stp->tos = pushsp((long)0); /* set tos pointer */ 2152080Smckusick continue; 2162080Smckusick case O_END: 2172080Smckusick PCLOSE(_dp->locvars); /* flush & close local files */ 2182080Smckusick stp = _dp->stp; 2192080Smckusick curfile = stp->file; /* restore old active file */ 2202080Smckusick *_dp = stp->odisp; /* restore old display entry */ 2212109Smckusic if (_dp == &_display.frame[1]) 2222080Smckusick return; /* exiting main proc ??? */ 2232080Smckusick _lino = stp->lino; /* restore lino, pc, dp */ 22410576Smckusick pc.cp = stp->pc; 2252080Smckusick _dp = stp->dp; 2262191Smckusic _runtst = stp->entry->tests; 2272191Smckusic disableovrflo(); 2282191Smckusic if (_runtst) 2292191Smckusic enableovrflo(); 230*30057Smckusick STACKALIGN(tl, stp->entry->framesze); 231*30057Smckusick STACKALIGN(tl1, sizeof(struct blockmark)); 232*30057Smckusick popsp(tl + /* pop local vars */ 233*30057Smckusick tl1 + /* pop stack frame */ 234*30057Smckusick stp->entry->nargs);/* pop parms */ 2352080Smckusick continue; 2362080Smckusick case O_CALL: 2372080Smckusick tl = *pc.cp++; 238*30057Smckusick PCLONGVAL(tl1); 239*30057Smckusick tcp = base + tl1 + sizeof(short);/* new entry point */ 240*30057Smckusick GETLONGVAL(tl1, tcp); 241*30057Smckusick tcp = base + tl1; 242*30057Smckusick STACKALIGN(tl1, sizeof(struct blockmark)); 243*30057Smckusick stp = (struct blockmark *)pushsp(tl1); 2442080Smckusick stp->lino = _lino; /* save lino, pc, dp */ 24510576Smckusick stp->pc = pc.cp; 2462080Smckusick stp->dp = _dp; 2472109Smckusic _dp = &_display.frame[tl]; /* set up new display ptr */ 2482080Smckusick pc.cp = tcp; 2492080Smckusick continue; 2502080Smckusick case O_FCALL: 2513294Smckusic pc.cp++; 2524016Smckusic tcp = popaddr(); /* ptr to display save area */ 2532080Smckusick tfp = (struct formalrtn *)popaddr(); 254*30057Smckusick STACKALIGN(tl, sizeof(struct blockmark)); 255*30057Smckusick stp = (struct blockmark *)pushsp(tl); 2562080Smckusick stp->lino = _lino; /* save lino, pc, dp */ 25710576Smckusick stp->pc = pc.cp; 2582080Smckusick stp->dp = _dp; 25910576Smckusick pc.cp = (char *)(tfp->fentryaddr);/* new entry point */ 2603436Smckusic _dp = &_display.frame[tfp->fbn];/* new display ptr */ 2619231Smckusick blkcpy(&_display.frame[1], tcp, 26210576Smckusick tfp->fbn * sizeof(struct dispsave)); 2639231Smckusick blkcpy(&tfp->fdisp[0], &_display.frame[1], 26410576Smckusick tfp->fbn * sizeof(struct dispsave)); 2652080Smckusick continue; 2662080Smckusick case O_FRTN: 2672080Smckusick tl = *pc.cp++; /* tl = size of return obj */ 2682080Smckusick if (tl == 0) 2692080Smckusick tl = *pc.usp++; 2702950Smckusic tcp = pushsp((long)(0)); 2712080Smckusick tfp = *(struct formalrtn **)(tcp + tl); 2724016Smckusic tcp1 = *(char **) 2734016Smckusic (tcp + tl + sizeof(struct formalrtn *)); 2743861Smckusic if (tl != 0) { 2759231Smckusick blkcpy(tcp, tcp + sizeof(struct formalrtn *) 2769231Smckusick + sizeof(char *), tl); 2773861Smckusic } 278*30057Smckusick STACKALIGN(tl, 279*30057Smckusick sizeof(struct formalrtn *) + sizeof (char *)); 280*30057Smckusick popsp(tl); 2819231Smckusick blkcpy(tcp1, &_display.frame[1], 28210576Smckusick tfp->fbn * sizeof(struct dispsave)); 2832080Smckusick continue; 2842080Smckusick case O_FSAV: 2852080Smckusick tfp = (struct formalrtn *)popaddr(); 2863436Smckusic tfp->fbn = *pc.cp++; /* blk number of routine */ 287*30057Smckusick PCLONGVAL(tl); 288*30057Smckusick tcp = base + tl + sizeof(short);/* new entry point */ 289*30057Smckusick GETLONGVAL(tl, tcp); 290*30057Smckusick tfp->fentryaddr = (long (*)())(base + tl); 2919231Smckusick blkcpy(&_display.frame[1], &tfp->fdisp[0], 29210576Smckusick tfp->fbn * sizeof(struct dispsave)); 2932080Smckusick pushaddr(tfp); 2942080Smckusick continue; 2952080Smckusick case O_SDUP2: 2962080Smckusick pc.cp++; 2972080Smckusick tl = pop2(); 2982950Smckusic push2((short)(tl)); 2992950Smckusic push2((short)(tl)); 3002080Smckusick continue; 3012080Smckusick case O_SDUP4: 3022080Smckusick pc.cp++; 3032080Smckusick tl = pop4(); 3042080Smckusick push4(tl); 3052080Smckusick push4(tl); 3062080Smckusick continue; 3072080Smckusick case O_TRA: 3082080Smckusick pc.cp++; 3092080Smckusick pc.cp += *pc.sp; 3102080Smckusick continue; 3112080Smckusick case O_TRA4: 3122080Smckusick pc.cp++; 313*30057Smckusick PCLONGVAL(tl); 314*30057Smckusick pc.cp = base + tl; 3152080Smckusick continue; 3162080Smckusick case O_GOTO: 3172109Smckusic tstp = _display.frame[*pc.cp++].stp; /* ptr to 3182109Smckusic exit frame */ 319*30057Smckusick PCLONGVAL(tl); 320*30057Smckusick pc.cp = base + tl; 3212080Smckusick stp = _dp->stp; 3222080Smckusick while (tstp != stp) { 3232109Smckusic if (_dp == &_display.frame[1]) 3243872Smckusic ERROR("Active frame not found in non-local goto\n", 0); /* exiting prog ??? */ 3252080Smckusick PCLOSE(_dp->locvars); /* close local files */ 3262080Smckusick curfile = stp->file; /* restore active file */ 3272080Smckusick *_dp = stp->odisp; /* old display entry */ 3282080Smckusick _dp = stp->dp; /* restore dp */ 3292080Smckusick stp = _dp->stp; 3302080Smckusick } 3312080Smckusick /* pop locals, stack frame, parms, and return values */ 3322950Smckusic popsp((long)(stp->tos - pushsp((long)(0)))); 3332080Smckusick continue; 3342080Smckusick case O_LINO: 3352950Smckusic if (_dp->stp->tos != pushsp((long)(0))) 3365682Smckusic ERROR("Panic: stack not empty between statements\n"); 3372080Smckusick _lino = *pc.cp++; /* set line number */ 3382080Smckusick if (_lino == 0) 3392080Smckusick _lino = *pc.sp++; 3402950Smckusic if (_runtst) { 3412950Smckusic LINO(); /* inc statement count */ 3422950Smckusic continue; 3432950Smckusic } 3442950Smckusic _stcnt++; 3452080Smckusick continue; 3462080Smckusick case O_PUSH: 3472080Smckusick tl = *pc.cp++; 3482080Smckusick if (tl == 0) 349*30057Smckusick PCLONGVAL(tl); 350*30057Smckusick STACKALIGN(tl1, -tl); 351*30057Smckusick tcp = pushsp(tl1); 3522950Smckusic if (_runtst) 353*30057Smckusick blkclr(tcp, tl1); 3542080Smckusick continue; 3552080Smckusick case O_IF: 3562080Smckusick pc.cp++; 3572191Smckusic if (pop2()) { 3582080Smckusick pc.sp++; 3592191Smckusic continue; 3602191Smckusic } 3612191Smckusic pc.cp += *pc.sp; 3622080Smckusick continue; 3632080Smckusick case O_REL2: 3642080Smckusick tl = pop2(); 3652080Smckusick tl1 = pop2(); 3662080Smckusick goto cmplong; 3672080Smckusick case O_REL24: 3682080Smckusick tl = pop2(); 3692080Smckusick tl1 = pop4(); 3702080Smckusick goto cmplong; 3712080Smckusick case O_REL42: 3722080Smckusick tl = pop4(); 3732080Smckusick tl1 = pop2(); 3742080Smckusick goto cmplong; 3752080Smckusick case O_REL4: 3762080Smckusick tl = pop4(); 3772080Smckusick tl1 = pop4(); 3782080Smckusick cmplong: 3795682Smckusic switch (*pc.cp++) { 3802080Smckusick case releq: 3812080Smckusick push2(tl1 == tl); 3822080Smckusick continue; 3832080Smckusick case relne: 3842080Smckusick push2(tl1 != tl); 3852080Smckusick continue; 3862080Smckusick case rellt: 3872080Smckusick push2(tl1 < tl); 3882080Smckusick continue; 3892080Smckusick case relgt: 3902080Smckusick push2(tl1 > tl); 3912080Smckusick continue; 3922080Smckusick case relle: 3932080Smckusick push2(tl1 <= tl); 3942080Smckusick continue; 3952080Smckusick case relge: 3962080Smckusick push2(tl1 >= tl); 3972080Smckusick continue; 3982080Smckusick default: 3995682Smckusic ERROR("Panic: bad relation %d to REL4*\n", 4005682Smckusic *(pc.cp - 1)); 4012080Smckusick continue; 4022080Smckusick } 4032080Smckusick case O_RELG: 4042080Smckusick tl2 = *pc.cp++; /* tc has jump opcode */ 4052080Smckusick tl = *pc.usp++; /* tl has comparison length */ 406*30057Smckusick STACKALIGN(tl1, tl); /* tl1 has arg stack length */ 4072950Smckusic tcp = pushsp((long)(0));/* tcp pts to first arg */ 4082080Smckusick switch (tl2) { 4092080Smckusick case releq: 4102950Smckusic tb = RELEQ(tl, tcp + tl1, tcp); 4112080Smckusick break; 4122080Smckusick case relne: 4132950Smckusic tb = RELNE(tl, tcp + tl1, tcp); 4142080Smckusick break; 4152080Smckusick case rellt: 4162950Smckusic tb = RELSLT(tl, tcp + tl1, tcp); 4172080Smckusick break; 4182080Smckusick case relgt: 4192950Smckusic tb = RELSGT(tl, tcp + tl1, tcp); 4202080Smckusick break; 4212080Smckusick case relle: 4222950Smckusic tb = RELSLE(tl, tcp + tl1, tcp); 4232080Smckusick break; 4242080Smckusick case relge: 4252950Smckusic tb = RELSGE(tl, tcp + tl1, tcp); 4262080Smckusick break; 4272080Smckusick default: 4285682Smckusic ERROR("Panic: bad relation %d to RELG*\n", tl2); 4292080Smckusick break; 4302080Smckusick } 4312080Smckusick popsp(tl1 << 1); 4322950Smckusic push2((short)(tb)); 4332080Smckusick continue; 4342080Smckusick case O_RELT: 4352080Smckusick tl2 = *pc.cp++; /* tc has jump opcode */ 4362080Smckusick tl1 = *pc.usp++; /* tl1 has comparison length */ 4372950Smckusic tcp = pushsp((long)(0));/* tcp pts to first arg */ 4382080Smckusick switch (tl2) { 4392080Smckusick case releq: 4402950Smckusic tb = RELEQ(tl1, tcp + tl1, tcp); 4412080Smckusick break; 4422080Smckusick case relne: 4432950Smckusic tb = RELNE(tl1, tcp + tl1, tcp); 4442080Smckusick break; 4452080Smckusick case rellt: 4462950Smckusic tb = RELTLT(tl1, tcp + tl1, tcp); 4472080Smckusick break; 4482080Smckusick case relgt: 4492950Smckusic tb = RELTGT(tl1, tcp + tl1, tcp); 4502080Smckusick break; 4512080Smckusick case relle: 4522950Smckusic tb = RELTLE(tl1, tcp + tl1, tcp); 4532080Smckusick break; 4542080Smckusick case relge: 4552950Smckusic tb = RELTGE(tl1, tcp + tl1, tcp); 4562080Smckusick break; 4572080Smckusick default: 4585682Smckusic ERROR("Panic: bad relation %d to RELT*\n", tl2); 4592080Smckusick break; 4602080Smckusick } 461*30057Smckusick STACKALIGN(tl, tl1); 462*30057Smckusick popsp(tl << 1); 4632950Smckusic push2((short)(tb)); 4642080Smckusick continue; 4652080Smckusick case O_REL28: 4662080Smckusick td = pop2(); 4672080Smckusick td1 = pop8(); 4682080Smckusick goto cmpdbl; 4692080Smckusick case O_REL48: 4702080Smckusick td = pop4(); 4712080Smckusick td1 = pop8(); 4722080Smckusick goto cmpdbl; 4732080Smckusick case O_REL82: 4742080Smckusick td = pop8(); 4752080Smckusick td1 = pop2(); 4762080Smckusick goto cmpdbl; 4772080Smckusick case O_REL84: 4782080Smckusick td = pop8(); 4792080Smckusick td1 = pop4(); 4802080Smckusick goto cmpdbl; 4812080Smckusick case O_REL8: 4822080Smckusick td = pop8(); 4832080Smckusick td1 = pop8(); 4842080Smckusick cmpdbl: 4852080Smckusick switch (*pc.cp++) { 4862080Smckusick case releq: 4872080Smckusick push2(td1 == td); 4882080Smckusick continue; 4892080Smckusick case relne: 4902080Smckusick push2(td1 != td); 4912080Smckusick continue; 4922080Smckusick case rellt: 4932080Smckusick push2(td1 < td); 4942080Smckusick continue; 4952080Smckusick case relgt: 4962080Smckusick push2(td1 > td); 4972080Smckusick continue; 4982080Smckusick case relle: 4992080Smckusick push2(td1 <= td); 5002080Smckusick continue; 5012080Smckusick case relge: 5022080Smckusick push2(td1 >= td); 5032080Smckusick continue; 5042080Smckusick default: 5055682Smckusic ERROR("Panic: bad relation %d to REL8*\n", 5065682Smckusic *(pc.cp - 1)); 5072080Smckusick continue; 5082080Smckusick } 5092080Smckusick case O_AND: 5102080Smckusick pc.cp++; 51110576Smckusick tl = pop2(); 51210576Smckusick tl1 = pop2(); 51310787Smckusick push2(tl1 & tl); 5142080Smckusick continue; 5152080Smckusick case O_OR: 5162080Smckusick pc.cp++; 51710576Smckusick tl = pop2(); 51810576Smckusick tl1 = pop2(); 51910787Smckusick push2(tl1 | tl); 5202080Smckusick continue; 5212080Smckusick case O_NOT: 5222080Smckusick pc.cp++; 52310576Smckusick tl = pop2(); 52410576Smckusick push2(tl ^ 1); 5252080Smckusick continue; 5262080Smckusick case O_AS2: 5272080Smckusick pc.cp++; 5282080Smckusick tl = pop2(); 5292080Smckusick *(short *)popaddr() = tl; 5302080Smckusick continue; 5312080Smckusick case O_AS4: 5322080Smckusick pc.cp++; 5332080Smckusick tl = pop4(); 5342080Smckusick *(long *)popaddr() = tl; 5352080Smckusick continue; 5362080Smckusick case O_AS24: 5372080Smckusick pc.cp++; 5382080Smckusick tl = pop2(); 5392080Smckusick *(long *)popaddr() = tl; 5402080Smckusick continue; 5412080Smckusick case O_AS42: 5422080Smckusick pc.cp++; 5432080Smckusick tl = pop4(); 5442080Smckusick *(short *)popaddr() = tl; 5452080Smckusick continue; 5462080Smckusick case O_AS21: 5472080Smckusick pc.cp++; 5482080Smckusick tl = pop2(); 5492080Smckusick *popaddr() = tl; 5502080Smckusick continue; 5512080Smckusick case O_AS41: 5522080Smckusick pc.cp++; 5532080Smckusick tl = pop4(); 5542080Smckusick *popaddr() = tl; 5552080Smckusick continue; 5562080Smckusick case O_AS28: 5572080Smckusick pc.cp++; 5582080Smckusick tl = pop2(); 5592080Smckusick *(double *)popaddr() = tl; 5602080Smckusick continue; 5612080Smckusick case O_AS48: 5622080Smckusick pc.cp++; 5632080Smckusick tl = pop4(); 5642080Smckusick *(double *)popaddr() = tl; 5652080Smckusick continue; 5662080Smckusick case O_AS8: 5672080Smckusick pc.cp++; 5682239Smckusic t8 = popsze8(); 5692239Smckusic *(struct sze8 *)popaddr() = t8; 5702080Smckusick continue; 5712080Smckusick case O_AS: 5722080Smckusick tl = *pc.cp++; 5732080Smckusick if (tl == 0) 5742080Smckusick tl = *pc.usp++; 575*30057Smckusick STACKALIGN(tl1, tl); 5762950Smckusic tcp = pushsp((long)(0)); 5779231Smckusick blkcpy(tcp, *(char **)(tcp + tl1), tl); 5782080Smckusick popsp(tl1 + sizeof(char *)); 5792080Smckusick continue; 58015976Smckusick case O_VAS: 58115976Smckusick pc.cp++; 58215976Smckusick tl = pop4(); 58315976Smckusick tcp1 = popaddr(); 58415976Smckusick tcp = popaddr(); 58515976Smckusick blkcpy(tcp1, tcp, tl); 58615976Smckusick continue; 5872080Smckusick case O_INX2P2: 5882080Smckusick tl = *pc.cp++; /* tl has shift amount */ 58910576Smckusick tl1 = pop2(); 59010576Smckusick tl1 = (tl1 - *pc.sp++) << tl; 59110576Smckusick tcp = popaddr(); 59210576Smckusick pushaddr(tcp + tl1); 5932080Smckusick continue; 5942080Smckusick case O_INX4P2: 5952080Smckusick tl = *pc.cp++; /* tl has shift amount */ 59610576Smckusick tl1 = pop4(); 59710576Smckusick tl1 = (tl1 - *pc.sp++) << tl; 59810576Smckusick tcp = popaddr(); 59910576Smckusick pushaddr(tcp + tl1); 6002080Smckusick continue; 6012080Smckusick case O_INX2: 6022080Smckusick tl = *pc.cp++; /* tl has element size */ 6032080Smckusick if (tl == 0) 6042080Smckusick tl = *pc.usp++; 6052080Smckusick tl1 = pop2(); /* index */ 6062080Smckusick tl2 = *pc.sp++; 60710576Smckusick tcp = popaddr(); 60810576Smckusick pushaddr(tcp + (tl1 - tl2) * tl); 6092191Smckusic tl = *pc.usp++; 6102191Smckusic if (_runtst) 6112191Smckusic SUBSC(tl1, tl2, tl); /* range check */ 6122080Smckusick continue; 6132080Smckusick case O_INX4: 6142080Smckusick tl = *pc.cp++; /* tl has element size */ 6152080Smckusick if (tl == 0) 6162080Smckusick tl = *pc.usp++; 6172080Smckusick tl1 = pop4(); /* index */ 6182080Smckusick tl2 = *pc.sp++; 61910576Smckusick tcp = popaddr(); 62010576Smckusick pushaddr(tcp + (tl1 - tl2) * tl); 6212191Smckusic tl = *pc.usp++; 6222191Smckusic if (_runtst) 6232191Smckusic SUBSC(tl1, tl2, tl); /* range check */ 6242080Smckusick continue; 62515976Smckusick case O_VINX2: 62615976Smckusick pc.cp++; 62715976Smckusick tl = pop2(); /* tl has element size */ 62815976Smckusick tl1 = pop2(); /* upper bound */ 62915976Smckusick tl2 = pop2(); /* lower bound */ 63015976Smckusick tl3 = pop2(); /* index */ 63115976Smckusick tcp = popaddr(); 63215976Smckusick pushaddr(tcp + (tl3 - tl2) * tl); 63315976Smckusick if (_runtst) 63415976Smckusick SUBSC(tl3, tl2, tl1); /* range check */ 63515976Smckusick continue; 63615976Smckusick case O_VINX24: 63715976Smckusick pc.cp++; 63815976Smckusick tl = pop2(); /* tl has element size */ 63915976Smckusick tl1 = pop2(); /* upper bound */ 64015976Smckusick tl2 = pop2(); /* lower bound */ 64115976Smckusick tl3 = pop4(); /* index */ 64215976Smckusick tcp = popaddr(); 64315976Smckusick pushaddr(tcp + (tl3 - tl2) * tl); 64415976Smckusick if (_runtst) 64515976Smckusick SUBSC(tl3, tl2, tl1); /* range check */ 64615976Smckusick continue; 64715976Smckusick case O_VINX42: 64815976Smckusick pc.cp++; 64915976Smckusick tl = pop4(); /* tl has element size */ 65015976Smckusick tl1 = pop4(); /* upper bound */ 65115976Smckusick tl2 = pop4(); /* lower bound */ 65215976Smckusick tl3 = pop2(); /* index */ 65315976Smckusick tcp = popaddr(); 65415976Smckusick pushaddr(tcp + (tl3 - tl2) * tl); 65515976Smckusick if (_runtst) 65615976Smckusick SUBSC(tl3, tl2, tl1); /* range check */ 65715976Smckusick continue; 65815976Smckusick case O_VINX4: 65915976Smckusick pc.cp++; 66015976Smckusick tl = pop4(); /* tl has element size */ 66115976Smckusick tl1 = pop4(); /* upper bound */ 66215976Smckusick tl2 = pop4(); /* lower bound */ 66315976Smckusick tl3 = pop4(); /* index */ 66415976Smckusick tcp = popaddr(); 66515976Smckusick pushaddr(tcp + (tl3 - tl2) * tl); 66615976Smckusick if (_runtst) 66715976Smckusick SUBSC(tl3, tl2, tl1); /* range check */ 66815976Smckusick continue; 6692080Smckusick case O_OFF: 6702080Smckusick tl = *pc.cp++; 6712080Smckusick if (tl == 0) 6722080Smckusick tl = *pc.usp++; 67310576Smckusick tcp = popaddr(); 67410576Smckusick pushaddr(tcp + tl); 6752080Smckusick continue; 6762080Smckusick case O_NIL: 6772080Smckusick pc.cp++; 67824938Smckusick tcp = popaddr(); 67924938Smckusick NIL(tcp); 68024938Smckusick pushaddr(tcp); 6812080Smckusick continue; 6822080Smckusick case O_ADD2: 6832080Smckusick pc.cp++; 68410576Smckusick tl = pop2(); 68510576Smckusick tl1 = pop2(); 68610576Smckusick push4(tl1 + tl); 6872080Smckusick continue; 6882080Smckusick case O_ADD4: 6892080Smckusick pc.cp++; 69010576Smckusick tl = pop4(); 69110576Smckusick tl1 = pop4(); 69210576Smckusick push4(tl1 + tl); 6932080Smckusick continue; 6942080Smckusick case O_ADD24: 6952080Smckusick pc.cp++; 6962080Smckusick tl = pop2(); 69710576Smckusick tl1 = pop4(); 69810576Smckusick push4(tl1 + tl); 6992080Smckusick continue; 7002080Smckusick case O_ADD42: 7012080Smckusick pc.cp++; 7022080Smckusick tl = pop4(); 70310576Smckusick tl1 = pop2(); 70410576Smckusick push4(tl1 + tl); 7052080Smckusick continue; 7062080Smckusick case O_ADD28: 7072080Smckusick pc.cp++; 7082080Smckusick tl = pop2(); 70910576Smckusick td = pop8(); 71010576Smckusick push8(td + tl); 7112080Smckusick continue; 7122080Smckusick case O_ADD48: 7132080Smckusick pc.cp++; 7142080Smckusick tl = pop4(); 71510576Smckusick td = pop8(); 71610576Smckusick push8(td + tl); 7172080Smckusick continue; 7182080Smckusick case O_ADD82: 7192080Smckusick pc.cp++; 7202080Smckusick td = pop8(); 72110576Smckusick td1 = pop2(); 72210576Smckusick push8(td1 + td); 7232080Smckusick continue; 7242080Smckusick case O_ADD84: 7252080Smckusick pc.cp++; 7262080Smckusick td = pop8(); 72710576Smckusick td1 = pop4(); 72810576Smckusick push8(td1 + td); 7292080Smckusick continue; 7302080Smckusick case O_SUB2: 7312080Smckusick pc.cp++; 7322080Smckusick tl = pop2(); 73310576Smckusick tl1 = pop2(); 73410576Smckusick push4(tl1 - tl); 7352080Smckusick continue; 7362080Smckusick case O_SUB4: 7372080Smckusick pc.cp++; 7382080Smckusick tl = pop4(); 73910576Smckusick tl1 = pop4(); 74010576Smckusick push4(tl1 - tl); 7412080Smckusick continue; 7422080Smckusick case O_SUB24: 7432080Smckusick pc.cp++; 7442080Smckusick tl = pop2(); 74510576Smckusick tl1 = pop4(); 74610576Smckusick push4(tl1 - tl); 7472080Smckusick continue; 7482080Smckusick case O_SUB42: 7492080Smckusick pc.cp++; 7502080Smckusick tl = pop4(); 75110576Smckusick tl1 = pop2(); 75210576Smckusick push4(tl1 - tl); 7532080Smckusick continue; 7542080Smckusick case O_SUB28: 7552080Smckusick pc.cp++; 7562080Smckusick tl = pop2(); 75710576Smckusick td = pop8(); 75810576Smckusick push8(td - tl); 7592080Smckusick continue; 7602080Smckusick case O_SUB48: 7612080Smckusick pc.cp++; 7622080Smckusick tl = pop4(); 76310576Smckusick td = pop8(); 76410576Smckusick push8(td - tl); 7652080Smckusick continue; 7662080Smckusick case O_SUB82: 7672080Smckusick pc.cp++; 7682080Smckusick td = pop8(); 76910576Smckusick td1 = pop2(); 77010576Smckusick push8(td1 - td); 7712080Smckusick continue; 7722080Smckusick case O_SUB84: 7732080Smckusick pc.cp++; 7742080Smckusick td = pop8(); 77510576Smckusick td1 = pop4(); 77610576Smckusick push8(td1 - td); 7772080Smckusick continue; 7782080Smckusick case O_MUL2: 7792080Smckusick pc.cp++; 78010576Smckusick tl = pop2(); 78110576Smckusick tl1 = pop2(); 78210576Smckusick push4(tl1 * tl); 7832080Smckusick continue; 7842080Smckusick case O_MUL4: 7852080Smckusick pc.cp++; 78610576Smckusick tl = pop4(); 78710576Smckusick tl1 = pop4(); 78810576Smckusick push4(tl1 * tl); 7892080Smckusick continue; 7902080Smckusick case O_MUL24: 7912080Smckusick pc.cp++; 7922080Smckusick tl = pop2(); 79310576Smckusick tl1 = pop4(); 79410576Smckusick push4(tl1 * tl); 7952080Smckusick continue; 7962080Smckusick case O_MUL42: 7972080Smckusick pc.cp++; 7982080Smckusick tl = pop4(); 79910576Smckusick tl1 = pop2(); 80010576Smckusick push4(tl1 * tl); 8012080Smckusick continue; 8022080Smckusick case O_MUL28: 8032080Smckusick pc.cp++; 8042080Smckusick tl = pop2(); 80510576Smckusick td = pop8(); 80610576Smckusick push8(td * tl); 8072080Smckusick continue; 8082080Smckusick case O_MUL48: 8092080Smckusick pc.cp++; 8102080Smckusick tl = pop4(); 81110576Smckusick td = pop8(); 81210576Smckusick push8(td * tl); 8132080Smckusick continue; 8142080Smckusick case O_MUL82: 8152080Smckusick pc.cp++; 8162080Smckusick td = pop8(); 81710576Smckusick td1 = pop2(); 81810576Smckusick push8(td1 * td); 8192080Smckusick continue; 8202080Smckusick case O_MUL84: 8212080Smckusick pc.cp++; 8222080Smckusick td = pop8(); 82310576Smckusick td1 = pop4(); 82410576Smckusick push8(td1 * td); 8252080Smckusick continue; 8262080Smckusick case O_ABS2: 8272080Smckusick case O_ABS4: 8282080Smckusick pc.cp++; 8292080Smckusick tl = pop4(); 8302080Smckusick push4(tl >= 0 ? tl : -tl); 8312080Smckusick continue; 8322080Smckusick case O_ABS8: 8332080Smckusick pc.cp++; 8342080Smckusick td = pop8(); 8352080Smckusick push8(td >= 0.0 ? td : -td); 8362080Smckusick continue; 8372080Smckusick case O_NEG2: 8382080Smckusick pc.cp++; 8392950Smckusic push4((long)(-pop2())); 8402080Smckusick continue; 8412080Smckusick case O_NEG4: 8422080Smckusick pc.cp++; 8432080Smckusick push4(-pop4()); 8442080Smckusick continue; 8452080Smckusick case O_NEG8: 8462080Smckusick pc.cp++; 8472080Smckusick push8(-pop8()); 8482080Smckusick continue; 8492080Smckusick case O_DIV2: 8502080Smckusick pc.cp++; 8512080Smckusick tl = pop2(); 85210576Smckusick tl1 = pop2(); 85310576Smckusick push4(tl1 / tl); 8542080Smckusick continue; 8552080Smckusick case O_DIV4: 8562080Smckusick pc.cp++; 8572080Smckusick tl = pop4(); 85810576Smckusick tl1 = pop4(); 85910576Smckusick push4(tl1 / tl); 8602080Smckusick continue; 8612080Smckusick case O_DIV24: 8622080Smckusick pc.cp++; 8632080Smckusick tl = pop2(); 86410576Smckusick tl1 = pop4(); 86510576Smckusick push4(tl1 / tl); 8662080Smckusick continue; 8672080Smckusick case O_DIV42: 8682080Smckusick pc.cp++; 8692080Smckusick tl = pop4(); 87010576Smckusick tl1 = pop2(); 87110576Smckusick push4(tl1 / tl); 8722080Smckusick continue; 8732080Smckusick case O_MOD2: 8742080Smckusick pc.cp++; 8752080Smckusick tl = pop2(); 87610576Smckusick tl1 = pop2(); 87710576Smckusick push4(tl1 % tl); 8782080Smckusick continue; 8792080Smckusick case O_MOD4: 8802080Smckusick pc.cp++; 8812080Smckusick tl = pop4(); 88210576Smckusick tl1 = pop4(); 88310576Smckusick push4(tl1 % tl); 8842080Smckusick continue; 8852080Smckusick case O_MOD24: 8862080Smckusick pc.cp++; 8872080Smckusick tl = pop2(); 88810576Smckusick tl1 = pop4(); 88910576Smckusick push4(tl1 % tl); 8902080Smckusick continue; 8912080Smckusick case O_MOD42: 8922080Smckusick pc.cp++; 8932080Smckusick tl = pop4(); 89410576Smckusick tl1 = pop2(); 89510576Smckusick push4(tl1 % tl); 8962080Smckusick continue; 8972080Smckusick case O_ADD8: 8982080Smckusick pc.cp++; 89910576Smckusick td = pop8(); 90010576Smckusick td1 = pop8(); 90110787Smckusick push8(td1 + td); 9022080Smckusick continue; 9032080Smckusick case O_SUB8: 9042080Smckusick pc.cp++; 9052080Smckusick td = pop8(); 90610576Smckusick td1 = pop8(); 90710787Smckusick push8(td1 - td); 9082080Smckusick continue; 9092080Smckusick case O_MUL8: 9102080Smckusick pc.cp++; 91110576Smckusick td = pop8(); 91210576Smckusick td1 = pop8(); 91310787Smckusick push8(td1 * td); 9142080Smckusick continue; 9152080Smckusick case O_DVD8: 9162080Smckusick pc.cp++; 9172080Smckusick td = pop8(); 91810576Smckusick td1 = pop8(); 91910787Smckusick push8(td1 / td); 9202080Smckusick continue; 9212080Smckusick case O_STOI: 9222080Smckusick pc.cp++; 9232950Smckusic push4((long)(pop2())); 9242080Smckusick continue; 9252080Smckusick case O_STOD: 9262080Smckusick pc.cp++; 9272080Smckusick td = pop2(); 9282080Smckusick push8(td); 9292080Smckusick continue; 9302080Smckusick case O_ITOD: 9312080Smckusick pc.cp++; 9322080Smckusick td = pop4(); 9332080Smckusick push8(td); 9342080Smckusick continue; 9352080Smckusick case O_ITOS: 9362080Smckusick pc.cp++; 9372950Smckusic push2((short)(pop4())); 9382080Smckusick continue; 9392080Smckusick case O_DVD2: 9402080Smckusick pc.cp++; 9412080Smckusick td = pop2(); 94210576Smckusick td1 = pop2(); 94310576Smckusick push8(td1 / td); 9442080Smckusick continue; 9452080Smckusick case O_DVD4: 9462080Smckusick pc.cp++; 9472080Smckusick td = pop4(); 94810576Smckusick td1 = pop4(); 94910576Smckusick push8(td1 / td); 9502080Smckusick continue; 9512080Smckusick case O_DVD24: 9522080Smckusick pc.cp++; 9532080Smckusick td = pop2(); 95410576Smckusick td1 = pop4(); 95510576Smckusick push8(td1 / td); 9562080Smckusick continue; 9572080Smckusick case O_DVD42: 9582080Smckusick pc.cp++; 9592080Smckusick td = pop4(); 96010576Smckusick td1 = pop2(); 96110576Smckusick push8(td1 / td); 9622080Smckusick continue; 9632080Smckusick case O_DVD28: 9642080Smckusick pc.cp++; 9652080Smckusick td = pop2(); 96610576Smckusick td1 = pop8(); 96710576Smckusick push8(td1 / td); 9682080Smckusick continue; 9692080Smckusick case O_DVD48: 9702080Smckusick pc.cp++; 97110787Smckusick td = pop4(); 97210787Smckusick td1 = pop8(); 97310787Smckusick push8(td1 / td); 9742080Smckusick continue; 9752080Smckusick case O_DVD82: 9762080Smckusick pc.cp++; 9772080Smckusick td = pop8(); 97810576Smckusick td1 = pop2(); 97910576Smckusick push8(td1 / td); 9802080Smckusick continue; 9812080Smckusick case O_DVD84: 9822080Smckusick pc.cp++; 9832080Smckusick td = pop8(); 98410576Smckusick td1 = pop4(); 98510576Smckusick push8(td1 / td); 9862080Smckusick continue; 9872080Smckusick case O_RV1: 9882109Smckusic tcp = _display.raw[*pc.ucp++]; 9892950Smckusic push2((short)(*(tcp + *pc.sp++))); 9902080Smckusick continue; 9912080Smckusick case O_RV14: 9922109Smckusic tcp = _display.raw[*pc.ucp++]; 9932950Smckusic push4((long)(*(tcp + *pc.sp++))); 9942080Smckusick continue; 9952080Smckusick case O_RV2: 9962109Smckusic tcp = _display.raw[*pc.ucp++]; 9972080Smckusick push2(*(short *)(tcp + *pc.sp++)); 9982080Smckusick continue; 9992080Smckusick case O_RV24: 10002109Smckusic tcp = _display.raw[*pc.ucp++]; 10012950Smckusic push4((long)(*(short *)(tcp + *pc.sp++))); 10022080Smckusick continue; 10032080Smckusick case O_RV4: 10042109Smckusic tcp = _display.raw[*pc.ucp++]; 10052080Smckusick push4(*(long *)(tcp + *pc.sp++)); 10062080Smckusick continue; 10072080Smckusick case O_RV8: 10082109Smckusic tcp = _display.raw[*pc.ucp++]; 10092239Smckusic pushsze8(*(struct sze8 *)(tcp + *pc.sp++)); 10102080Smckusick continue; 10112080Smckusick case O_RV: 10122109Smckusic tcp = _display.raw[*pc.ucp++]; 10132080Smckusick tcp += *pc.sp++; 10142080Smckusick tl = *pc.usp++; 1015*30057Smckusick STACKALIGN(tl1, tl); 1016*30057Smckusick tcp1 = pushsp(tl1); 10179231Smckusick blkcpy(tcp, tcp1, tl); 10182080Smckusick continue; 10192080Smckusick case O_LV: 10202109Smckusic tcp = _display.raw[*pc.ucp++]; 10212080Smckusick pushaddr(tcp + *pc.sp++); 10222080Smckusick continue; 10232080Smckusick case O_LRV1: 10242109Smckusic tcp = _display.raw[*pc.ucp++]; 1025*30057Smckusick PCLONGVAL(tl); 1026*30057Smckusick push2((short)(*(tcp + tl))); 10272080Smckusick continue; 10282080Smckusick case O_LRV14: 10292109Smckusic tcp = _display.raw[*pc.ucp++]; 1030*30057Smckusick PCLONGVAL(tl); 1031*30057Smckusick push4((long)(*(tcp + tl))); 10322080Smckusick continue; 10332080Smckusick case O_LRV2: 10342109Smckusic tcp = _display.raw[*pc.ucp++]; 1035*30057Smckusick PCLONGVAL(tl); 1036*30057Smckusick push2(*(short *)(tcp + tl)); 10372080Smckusick continue; 10382080Smckusick case O_LRV24: 10392109Smckusic tcp = _display.raw[*pc.ucp++]; 1040*30057Smckusick PCLONGVAL(tl); 1041*30057Smckusick push4((long)(*(short *)(tcp + tl))); 10422080Smckusick continue; 10432080Smckusick case O_LRV4: 10442109Smckusic tcp = _display.raw[*pc.ucp++]; 1045*30057Smckusick PCLONGVAL(tl); 1046*30057Smckusick push4(*(long *)(tcp + tl)); 10472080Smckusick continue; 10482080Smckusick case O_LRV8: 10492109Smckusic tcp = _display.raw[*pc.ucp++]; 1050*30057Smckusick PCLONGVAL(tl); 1051*30057Smckusick pushsze8(*(struct sze8 *)(tcp + tl)); 10522080Smckusick continue; 10532080Smckusick case O_LRV: 10542109Smckusic tcp = _display.raw[*pc.ucp++]; 1055*30057Smckusick PCLONGVAL(tl); 1056*30057Smckusick tcp += tl; 10572080Smckusick tl = *pc.usp++; 1058*30057Smckusick STACKALIGN(tl1, tl); 1059*30057Smckusick tcp1 = pushsp(tl1); 10609231Smckusick blkcpy(tcp, tcp1, tl); 10612080Smckusick continue; 10622080Smckusick case O_LLV: 10632109Smckusic tcp = _display.raw[*pc.ucp++]; 1064*30057Smckusick PCLONGVAL(tl); 1065*30057Smckusick pushaddr(tcp + tl); 10662080Smckusick continue; 10672080Smckusick case O_IND1: 10682080Smckusick pc.cp++; 10692950Smckusic push2((short)(*popaddr())); 10702080Smckusick continue; 10712080Smckusick case O_IND14: 10722080Smckusick pc.cp++; 10732950Smckusic push4((long)(*popaddr())); 10742080Smckusick continue; 10752080Smckusick case O_IND2: 10762080Smckusick pc.cp++; 10772080Smckusick push2(*(short *)(popaddr())); 10782080Smckusick continue; 10792080Smckusick case O_IND24: 10802080Smckusick pc.cp++; 10812950Smckusic push4((long)(*(short *)(popaddr()))); 10822080Smckusick continue; 10832080Smckusick case O_IND4: 10842080Smckusick pc.cp++; 10852080Smckusick push4(*(long *)(popaddr())); 10862080Smckusick continue; 10872080Smckusick case O_IND8: 10882080Smckusick pc.cp++; 10892239Smckusic pushsze8(*(struct sze8 *)(popaddr())); 10902080Smckusick continue; 10912080Smckusick case O_IND: 10922080Smckusick tl = *pc.cp++; 10932080Smckusick if (tl == 0) 10942080Smckusick tl = *pc.usp++; 10952080Smckusick tcp = popaddr(); 1096*30057Smckusick STACKALIGN(tl1, tl); 1097*30057Smckusick tcp1 = pushsp(tl1); 10989231Smckusick blkcpy(tcp, tcp1, tl); 10992080Smckusick continue; 11002080Smckusick case O_CON1: 11012950Smckusic push2((short)(*pc.cp++)); 11022080Smckusick continue; 11032080Smckusick case O_CON14: 11042950Smckusic push4((long)(*pc.cp++)); 11052080Smckusick continue; 11062080Smckusick case O_CON2: 11072080Smckusick pc.cp++; 11082080Smckusick push2(*pc.sp++); 11092080Smckusick continue; 11102080Smckusick case O_CON24: 11112080Smckusick pc.cp++; 11122950Smckusic push4((long)(*pc.sp++)); 11132080Smckusick continue; 11142080Smckusick case O_CON4: 11152080Smckusick pc.cp++; 1116*30057Smckusick PCLONGVAL(tl); 1117*30057Smckusick push4(tl); 11182080Smckusick continue; 11192080Smckusick case O_CON8: 11202080Smckusick pc.cp++; 1121*30057Smckusick tcp = pushsp(sizeof(double)); 1122*30057Smckusick blkcpy(pc.cp, tcp, sizeof(double)); 1123*30057Smckusick pc.dbp++; 11242080Smckusick continue; 11252080Smckusick case O_CON: 11262080Smckusick tl = *pc.cp++; 11272080Smckusick if (tl == 0) 11282080Smckusick tl = *pc.usp++; 1129*30057Smckusick STACKALIGN(tl1, tl); 1130*30057Smckusick tcp = pushsp(tl1); 11319231Smckusick blkcpy(pc.cp, tcp, tl); 11322950Smckusic pc.cp += (int)tl; 11332080Smckusick continue; 11342950Smckusic case O_CONG: 11352950Smckusic tl = *pc.cp++; 11362950Smckusic if (tl == 0) 11372950Smckusic tl = *pc.usp++; 1138*30057Smckusick STACKALIGN(tl1, tl); 11392950Smckusic tcp = pushsp(tl1); 11409231Smckusick blkcpy(pc.cp, tcp, tl1); 11412950Smckusic pc.cp += (int)((tl + 2) & ~1); 11422950Smckusic continue; 11432080Smckusick case O_LVCON: 11442080Smckusick tl = *pc.cp++; 11452080Smckusick if (tl == 0) 11462080Smckusick tl = *pc.usp++; 1147*30057Smckusick pushaddr(pc.cp); 11482080Smckusick tl = (tl + 1) & ~1; 11492950Smckusic pc.cp += (int)tl; 11502080Smckusick continue; 11512080Smckusick case O_RANG2: 11522080Smckusick tl = *pc.cp++; 11532080Smckusick if (tl == 0) 11542080Smckusick tl = *pc.sp++; 11552080Smckusick tl1 = pop2(); 11564026Smckusic push2((short)(RANG4(tl1, tl, (long)(*pc.sp++)))); 11572080Smckusick continue; 11582080Smckusick case O_RANG42: 11592080Smckusick tl = *pc.cp++; 11602080Smckusick if (tl == 0) 11612080Smckusick tl = *pc.sp++; 11622080Smckusick tl1 = pop4(); 11634026Smckusic push4(RANG4(tl1, tl, (long)(*pc.sp++))); 11642080Smckusick continue; 11652080Smckusick case O_RSNG2: 11662080Smckusick tl = *pc.cp++; 11672080Smckusick if (tl == 0) 11682080Smckusick tl = *pc.sp++; 11692080Smckusick tl1 = pop2(); 11702950Smckusic push2((short)(RSNG4(tl1, tl))); 11712080Smckusick continue; 11722080Smckusick case O_RSNG42: 11732080Smckusick tl = *pc.cp++; 11742080Smckusick if (tl == 0) 11752080Smckusick tl = *pc.sp++; 11762080Smckusick tl1 = pop4(); 11772080Smckusick push4(RSNG4(tl1, tl)); 11782080Smckusick continue; 11792080Smckusick case O_RANG4: 11804026Smckusic tl = *pc.cp++; 11814026Smckusic if (tl == 0) 1182*30057Smckusick PCLONGVAL(tl); 11832080Smckusick tl1 = pop4(); 1184*30057Smckusick PCLONGVAL(tl2); 1185*30057Smckusick push4(RANG4(tl1, tl, tl2)); 11862080Smckusick continue; 11872080Smckusick case O_RANG24: 11884026Smckusic tl = *pc.cp++; 11894026Smckusic if (tl == 0) 1190*30057Smckusick PCLONGVAL(tl); 11912080Smckusick tl1 = pop2(); 1192*30057Smckusick PCLONGVAL(tl2); 1193*30057Smckusick push2((short)(RANG4(tl1, tl, tl2))); 11942080Smckusick continue; 11952080Smckusick case O_RSNG4: 11964026Smckusic tl = *pc.cp++; 11974026Smckusic if (tl == 0) 1198*30057Smckusick PCLONGVAL(tl); 11994026Smckusic tl1 = pop4(); 12004026Smckusic push4(RSNG4(tl1, tl)); 12012080Smckusick continue; 12022080Smckusick case O_RSNG24: 12034026Smckusic tl = *pc.cp++; 12044026Smckusic if (tl == 0) 1205*30057Smckusick PCLONGVAL(tl); 12064026Smckusic tl1 = pop2(); 12074026Smckusic push2((short)(RSNG4(tl1, tl))); 12082080Smckusick continue; 12092080Smckusick case O_STLIM: 12102080Smckusick pc.cp++; 12112121Smckusic STLIM(); 12122950Smckusic popsp((long)(sizeof(long))); 12132080Smckusick continue; 12142080Smckusick case O_LLIMIT: 12152080Smckusick pc.cp++; 12162080Smckusick LLIMIT(); 12172950Smckusic popsp((long)(sizeof(char *)+sizeof(long))); 12182080Smckusick continue; 12192080Smckusick case O_BUFF: 12202950Smckusic BUFF((long)(*pc.cp++)); 12212080Smckusick continue; 12222080Smckusick case O_HALT: 12232080Smckusick pc.cp++; 12245682Smckusic if (_nodump == TRUE) 12255682Smckusic psexit(0); 12265682Smckusic fputs("\nCall to procedure halt\n", stderr); 12275682Smckusic backtrace("Halted"); 12285682Smckusic psexit(0); 12292080Smckusick continue; 12302080Smckusick case O_PXPBUF: 12312080Smckusick pc.cp++; 1232*30057Smckusick PCLONGVAL(tl); 1233*30057Smckusick _cntrs = tl; 1234*30057Smckusick PCLONGVAL(tl); 1235*30057Smckusick _rtns = tl; 12369231Smckusick NEW(&_pcpcount, (_cntrs + 1) * sizeof(long)); 12379231Smckusick blkclr(_pcpcount, (_cntrs + 1) * sizeof(long)); 12382080Smckusick continue; 12392080Smckusick case O_COUNT: 12402080Smckusick pc.cp++; 12412080Smckusick _pcpcount[*pc.usp++]++; 12422080Smckusick continue; 12432080Smckusick case O_CASE1OP: 12442080Smckusick tl = *pc.cp++; /* tl = number of cases */ 12452080Smckusick if (tl == 0) 12462080Smckusick tl = *pc.usp++; 12472080Smckusick tsp = pc.sp + tl; /* ptr to end of jump table */ 12482080Smckusick tcp = (char *)tsp; /* tcp = ptr to case values */ 12492080Smckusick tl1 = pop2(); /* tl1 = element to find */ 12502080Smckusick for(; tl > 0; tl--) /* look for element */ 12512080Smckusick if (tl1 == *tcp++) 12522080Smckusick break; 12532080Smckusick if (tl == 0) /* default case => error */ 12545666Smckusic CASERNG(tl1); 12552080Smckusick pc.cp += *(tsp - tl); 12562080Smckusick continue; 12572080Smckusick case O_CASE2OP: 12582080Smckusick tl = *pc.cp++; /* tl = number of cases */ 12592080Smckusick if (tl == 0) 12602080Smckusick tl = *pc.usp++; 12612080Smckusick tsp = pc.sp + tl; /* ptr to end of jump table */ 12622080Smckusick tsp1 = tsp; /* tsp1 = ptr to case values */ 12632080Smckusick tl1 = (unsigned short)pop2();/* tl1 = element to find */ 12642080Smckusick for(; tl > 0; tl--) /* look for element */ 1265*30057Smckusick if (tl1 == *tsp++) 12662080Smckusick break; 12672080Smckusick if (tl == 0) /* default case => error */ 12685666Smckusic CASERNG(tl1); 1269*30057Smckusick pc.cp += *(tsp1 - tl); 12702080Smckusick continue; 12712080Smckusick case O_CASE4OP: 12722080Smckusick tl = *pc.cp++; /* tl = number of cases */ 12732080Smckusick if (tl == 0) 12742080Smckusick tl = *pc.usp++; 1275*30057Smckusick tsp1 = pc.sp + tl; /* ptr to end of jump table */ 1276*30057Smckusick tlp = (long *)tsp1; /* tlp = ptr to case values */ 12772080Smckusick tl1 = pop4(); /* tl1 = element to find */ 1278*30057Smckusick for(; tl > 0; tl--) { /* look for element */ 1279*30057Smckusick GETLONGVAL(tl2, tlp++); 1280*30057Smckusick if (tl1 == tl2) 12812080Smckusick break; 1282*30057Smckusick } 12832080Smckusick if (tl == 0) /* default case => error */ 12845666Smckusic CASERNG(tl1); 1285*30057Smckusick pc.cp += *(tsp1 - tl); 12862080Smckusick continue; 12872080Smckusick case O_ADDT: 12882080Smckusick tl = *pc.cp++; /* tl has comparison length */ 12892080Smckusick if (tl == 0) 12902080Smckusick tl = *pc.usp++; 12912950Smckusic tcp = pushsp((long)(0));/* tcp pts to first arg */ 12922080Smckusick ADDT(tcp + tl, tcp + tl, tcp, tl >> 2); 12932080Smckusick popsp(tl); 12942080Smckusick continue; 12952080Smckusick case O_SUBT: 12962080Smckusick tl = *pc.cp++; /* tl has comparison length */ 12972080Smckusick if (tl == 0) 12982080Smckusick tl = *pc.usp++; 12992950Smckusic tcp = pushsp((long)(0));/* tcp pts to first arg */ 13002080Smckusick SUBT(tcp + tl, tcp + tl, tcp, tl >> 2); 13012080Smckusick popsp(tl); 13022080Smckusick continue; 13032080Smckusick case O_MULT: 13042080Smckusick tl = *pc.cp++; /* tl has comparison length */ 13052080Smckusick if (tl == 0) 13062080Smckusick tl = *pc.usp++; 13072950Smckusic tcp = pushsp((long)(0));/* tcp pts to first arg */ 13082080Smckusick MULT(tcp + tl, tcp + tl, tcp, tl >> 2); 13092080Smckusick popsp(tl); 13102080Smckusick continue; 13112080Smckusick case O_INCT: 13122080Smckusick tl = *pc.cp++; /* tl has number of args */ 13132080Smckusick if (tl == 0) 13142080Smckusick tl = *pc.usp++; 13152950Smckusic tb = INCT(); 13162950Smckusic popsp(tl*sizeof(long)); 13172950Smckusic push2((short)(tb)); 13182080Smckusick continue; 13192080Smckusick case O_CTTOT: 13202080Smckusick tl = *pc.cp++; /* tl has number of args */ 13212080Smckusick if (tl == 0) 13222080Smckusick tl = *pc.usp++; 13232080Smckusick tl1 = tl * sizeof(long); 13242950Smckusic tcp = pushsp((long)(0)) + tl1; /* tcp pts to result */ 13252080Smckusick CTTOT(tcp); 13262950Smckusic popsp(tl*sizeof(long)); 13272080Smckusick continue; 13282080Smckusick case O_CARD: 13292080Smckusick tl = *pc.cp++; /* tl has comparison length */ 13302080Smckusick if (tl == 0) 13312080Smckusick tl = *pc.usp++; 13322950Smckusic tcp = pushsp((long)(0));/* tcp pts to set */ 13332080Smckusick tl1 = CARD(tcp, tl); 13342080Smckusick popsp(tl); 13352950Smckusic push2((short)(tl1)); 13362080Smckusick continue; 13372080Smckusick case O_IN: 13382080Smckusick tl = *pc.cp++; /* tl has comparison length */ 13392080Smckusick if (tl == 0) 13402080Smckusick tl = *pc.usp++; 13412080Smckusick tl1 = pop4(); /* tl1 is the element */ 13422950Smckusic tcp = pushsp((long)(0));/* tcp pts to set */ 13434026Smckusic tl2 = *pc.sp++; /* lower bound */ 13442950Smckusic tb = IN(tl1, tl2, (long)(*pc.usp++), tcp); 13452080Smckusick popsp(tl); 13462950Smckusic push2((short)(tb)); 13472080Smckusick continue; 13482080Smckusick case O_ASRT: 13492080Smckusick pc.cp++; 135024938Smckusick tl = pop4(); 135124938Smckusick tcp = popaddr(); 135224938Smckusick ASRTS(tl, tcp); 13532080Smckusick continue; 13542080Smckusick case O_FOR1U: 135510792Smckusick tl1 = *pc.cp++; /* tl1 loop branch */ 135610576Smckusick if (tl1 == 0) 135710576Smckusick tl1 = *pc.sp++; 135810576Smckusick tcp = popaddr(); /* tcp = ptr to index var */ 135910792Smckusick tl = pop4(); /* tl upper bound */ 136010792Smckusick if (*tcp == tl) /* loop is done, fall through */ 136110576Smckusick continue; 136210792Smckusick *tcp += 1; /* inc index var */ 136310792Smckusick pc.cp += tl1; /* return to top of loop */ 136410576Smckusick continue; 13652080Smckusick case O_FOR2U: 136610792Smckusick tl1 = *pc.cp++; /* tl1 loop branch */ 13674026Smckusic if (tl1 == 0) 13684026Smckusic tl1 = *pc.sp++; 136910576Smckusick tsp = (short *)popaddr(); /* tsp = ptr to index var */ 137010792Smckusick tl = pop4(); /* tl upper bound */ 137110792Smckusick if (*tsp == tl) /* loop is done, fall through */ 13722080Smckusick continue; 137310792Smckusick *tsp += 1; /* inc index var */ 137410792Smckusick pc.cp += tl1; /* return to top of loop */ 13752080Smckusick continue; 13762080Smckusick case O_FOR4U: 137710792Smckusick tl1 = *pc.cp++; /* tl1 loop branch */ 13784026Smckusic if (tl1 == 0) 137910792Smckusick tl1 = *pc.sp++; 13802950Smckusic tlp = (long *)popaddr(); /* tlp = ptr to index var */ 138110792Smckusick tl = pop4(); /* tl upper bound */ 138210792Smckusick if (*tlp == tl) /* loop is done, fall through */ 13832080Smckusick continue; 138410792Smckusick *tlp += 1; /* inc index var */ 138510792Smckusick pc.cp += tl1; /* return to top of loop */ 13862080Smckusick continue; 13872080Smckusick case O_FOR1D: 138810792Smckusick tl1 = *pc.cp++; /* tl1 loop branch */ 138910576Smckusick if (tl1 == 0) 139010576Smckusick tl1 = *pc.sp++; 139110576Smckusick tcp = popaddr(); /* tcp = ptr to index var */ 139210792Smckusick tl = pop4(); /* tl upper bound */ 139310792Smckusick if (*tcp == tl) /* loop is done, fall through */ 139410576Smckusick continue; 139510792Smckusick *tcp -= 1; /* dec index var */ 139610792Smckusick pc.cp += tl1; /* return to top of loop */ 139710576Smckusick continue; 13982080Smckusick case O_FOR2D: 139910792Smckusick tl1 = *pc.cp++; /* tl1 loop branch */ 14004026Smckusic if (tl1 == 0) 14014026Smckusic tl1 = *pc.sp++; 140210576Smckusick tsp = (short *)popaddr(); /* tsp = ptr to index var */ 140310792Smckusick tl = pop4(); /* tl upper bound */ 140410792Smckusick if (*tsp == tl) /* loop is done, fall through */ 14052080Smckusick continue; 140610792Smckusick *tsp -= 1; /* dec index var */ 140710792Smckusick pc.cp += tl1; /* return to top of loop */ 14082080Smckusick continue; 14092080Smckusick case O_FOR4D: 141010792Smckusick tl1 = *pc.cp++; /* tl1 loop branch */ 14114026Smckusic if (tl1 == 0) 141210792Smckusick tl1 = *pc.sp++; 14132950Smckusic tlp = (long *)popaddr(); /* tlp = ptr to index var */ 141410792Smckusick tl = pop4(); /* tl upper bound */ 141510792Smckusick if (*tlp == tl) /* loop is done, fall through */ 14162080Smckusick continue; 141710792Smckusick *tlp -= 1; /* dec index var */ 141810792Smckusick pc.cp += tl1; /* return to top of loop */ 14192080Smckusick continue; 14202080Smckusick case O_READE: 14212080Smckusick pc.cp++; 1422*30057Smckusick PCLONGVAL(tl); 1423*30057Smckusick push2((short)(READE(curfile, base + tl))); 14242080Smckusick continue; 14252080Smckusick case O_READ4: 14262080Smckusick pc.cp++; 14272080Smckusick push4(READ4(curfile)); 14282080Smckusick continue; 14292080Smckusick case O_READC: 14302080Smckusick pc.cp++; 14312950Smckusic push2((short)(READC(curfile))); 14322080Smckusick continue; 14332080Smckusick case O_READ8: 14342080Smckusick pc.cp++; 14352080Smckusick push8(READ8(curfile)); 14362080Smckusick continue; 14372080Smckusick case O_READLN: 14382080Smckusick pc.cp++; 14392080Smckusick READLN(curfile); 14402080Smckusick continue; 14412080Smckusick case O_EOF: 14422080Smckusick pc.cp++; 14432950Smckusic push2((short)(TEOF(popaddr()))); 14442080Smckusick continue; 14452080Smckusick case O_EOLN: 14462080Smckusick pc.cp++; 14472950Smckusic push2((short)(TEOLN(popaddr()))); 14482080Smckusick continue; 14492080Smckusick case O_WRITEC: 14502191Smckusic if (_runtst) { 14512191Smckusic WRITEC(curfile); 14523166Smckusic popsp((long)(*pc.cp++)); 14532191Smckusic continue; 14542191Smckusic } 145524938Smckusick tl = *pc.cp++; 145624938Smckusick switch (tl - sizeof(FILE *)) { 145724938Smckusick case 2: 145824938Smckusick tl1 = pop2(); 145924938Smckusick break; 146024938Smckusick case 4: 146124938Smckusick tl1 = pop4(); 146224938Smckusick break; 146324938Smckusick default: 146424938Smckusick ERROR("Panic: bad size to O_WRITEC"); 146524938Smckusick /* NOT REACHED */ 146624938Smckusick } 146724938Smckusick tcp = popaddr(); 146824938Smckusick fputc(tl1, tcp); 14692080Smckusick continue; 14702080Smckusick case O_WRITES: 14712191Smckusic if (_runtst) { 14722191Smckusic WRITES(curfile); 14733166Smckusic popsp((long)(*pc.cp++)); 14742191Smckusic continue; 14752191Smckusic } 14762191Smckusic fwrite(); 14773166Smckusic popsp((long)(*pc.cp++)); 14782080Smckusick continue; 14792080Smckusick case O_WRITEF: 14802191Smckusic if (_runtst) { 14812191Smckusic WRITEF(curfile); 14823166Smckusic popsp((long)(*pc.cp++)); 14832191Smckusic continue; 14842191Smckusic } 14852191Smckusic fprintf(); 14863166Smckusic popsp((long)(*pc.cp++)); 14872080Smckusick continue; 14882080Smckusick case O_WRITLN: 14892080Smckusick pc.cp++; 14902191Smckusic if (_runtst) { 14912191Smckusic WRITLN(curfile); 14922191Smckusic continue; 14932191Smckusic } 14942191Smckusic fputc('\n', ACTFILE(curfile)); 14952080Smckusick continue; 14962080Smckusick case O_PAGE: 14972080Smckusick pc.cp++; 14982191Smckusic if (_runtst) { 14992191Smckusic PAGE(curfile); 15002191Smckusic continue; 15012191Smckusic } 15022950Smckusic fputc('', ACTFILE(curfile)); 15032080Smckusick continue; 15042080Smckusick case O_NAM: 15052080Smckusick pc.cp++; 15062080Smckusick tl = pop4(); 1507*30057Smckusick PCLONGVAL(tl1); 1508*30057Smckusick pushaddr(NAM(tl, base + tl1)); 15092080Smckusick continue; 15102080Smckusick case O_MAX: 15112080Smckusick tl = *pc.cp++; 15122080Smckusick if (tl == 0) 15132080Smckusick tl = *pc.usp++; 15142080Smckusick tl1 = pop4(); 15152191Smckusic if (_runtst) { 15162950Smckusic push4(MAX(tl1, tl, (long)(*pc.usp++))); 15172191Smckusic continue; 15182191Smckusic } 15192191Smckusic tl1 -= tl; 15202191Smckusic tl = *pc.usp++; 15212191Smckusic push4(tl1 > tl ? tl1 : tl); 15222080Smckusick continue; 15232080Smckusick case O_MIN: 15242080Smckusick tl = *pc.cp++; 15252080Smckusick if (tl == 0) 15262080Smckusick tl = *pc.usp++; 15272080Smckusick tl1 = pop4(); 15282080Smckusick push4(tl1 < tl ? tl1 : tl); 15292080Smckusick continue; 15302080Smckusick case O_UNIT: 15312080Smckusick pc.cp++; 15322080Smckusick curfile = UNIT(popaddr()); 15332080Smckusick continue; 15342080Smckusick case O_UNITINP: 15352080Smckusick pc.cp++; 15362080Smckusick curfile = INPUT; 15372080Smckusick continue; 15382080Smckusick case O_UNITOUT: 15392080Smckusick pc.cp++; 15402080Smckusick curfile = OUTPUT; 15412080Smckusick continue; 15422080Smckusick case O_MESSAGE: 15432080Smckusick pc.cp++; 15442080Smckusick PFLUSH(); 15452080Smckusick curfile = ERR; 15462080Smckusick continue; 15472109Smckusic case O_PUT: 15482109Smckusic pc.cp++; 15492109Smckusic PUT(curfile); 15502109Smckusic continue; 15512080Smckusick case O_GET: 15522080Smckusick pc.cp++; 15532080Smckusick GET(curfile); 15542080Smckusick continue; 15552080Smckusick case O_FNIL: 15562080Smckusick pc.cp++; 15572080Smckusick pushaddr(FNIL(popaddr())); 15582080Smckusick continue; 15592080Smckusick case O_DEFNAME: 15602080Smckusick pc.cp++; 15612080Smckusick DEFNAME(); 15622950Smckusic popsp((long)(2*sizeof(char *)+2*sizeof(long))); 15632080Smckusick continue; 15642080Smckusick case O_RESET: 15652080Smckusick pc.cp++; 15662080Smckusick RESET(); 15672950Smckusic popsp((long)(2*sizeof(char *)+2*sizeof(long))); 15682080Smckusick continue; 15692080Smckusick case O_REWRITE: 15702080Smckusick pc.cp++; 15712080Smckusick REWRITE(); 15722950Smckusic popsp((long)(2*sizeof(char *)+2*sizeof(long))); 15732080Smckusick continue; 15742080Smckusick case O_FILE: 15752080Smckusick pc.cp++; 15762080Smckusick pushaddr(ACTFILE(curfile)); 15772080Smckusick continue; 15782080Smckusick case O_REMOVE: 15792080Smckusick pc.cp++; 15802080Smckusick REMOVE(); 15812950Smckusic popsp((long)(sizeof(char *)+sizeof(long))); 15822080Smckusick continue; 15832080Smckusick case O_FLUSH: 15842080Smckusick pc.cp++; 15852080Smckusick FLUSH(); 15862950Smckusic popsp((long)(sizeof(char *))); 15872080Smckusick continue; 15882080Smckusick case O_PACK: 15892080Smckusick pc.cp++; 15902080Smckusick PACK(); 15912950Smckusic popsp((long)(5*sizeof(long)+2*sizeof(char*))); 15922080Smckusick continue; 15932080Smckusick case O_UNPACK: 15942080Smckusick pc.cp++; 15952080Smckusick UNPACK(); 15962950Smckusic popsp((long)(5*sizeof(long)+2*sizeof(char*))); 15972080Smckusick continue; 15982080Smckusick case O_ARGC: 15992080Smckusick pc.cp++; 16002950Smckusic push4((long)_argc); 16012080Smckusick continue; 16022080Smckusick case O_ARGV: 16032080Smckusick tl = *pc.cp++; /* tl = size of char array */ 16042080Smckusick if (tl == 0) 16052080Smckusick tl = *pc.usp++; 16062080Smckusick tcp = popaddr(); /* tcp = addr of char array */ 16072080Smckusick tl1 = pop4(); /* tl1 = argv subscript */ 16082080Smckusick ARGV(tl1, tcp, tl); 16092080Smckusick continue; 16102080Smckusick case O_CLCK: 16112080Smckusick pc.cp++; 16122080Smckusick push4(CLCK()); 16132080Smckusick continue; 16142080Smckusick case O_WCLCK: 16152080Smckusick pc.cp++; 16162080Smckusick push4(time(0)); 16172080Smckusick continue; 16182080Smckusick case O_SCLCK: 16192080Smckusick pc.cp++; 16202080Smckusick push4(SCLCK()); 16212080Smckusick continue; 16222080Smckusick case O_NEW: 16232080Smckusick tl = *pc.cp++; /* tl = size being new'ed */ 16242080Smckusick if (tl == 0) 16252080Smckusick tl = *pc.usp++; 16262080Smckusick tcp = popaddr(); /* ptr to ptr being new'ed */ 16279231Smckusick NEW(tcp, tl); 16282191Smckusic if (_runtst) { 16299263Smckusick blkclr(*((char **)(tcp)), tl); 16302191Smckusic } 16312080Smckusick continue; 16327961Smckusick case O_DISPOSE: 16337961Smckusick tl = *pc.cp++; /* tl = size being disposed */ 16347961Smckusick if (tl == 0) 16357961Smckusick tl = *pc.usp++; 16367961Smckusick tcp = popaddr(); /* ptr to ptr being disposed */ 16377961Smckusick DISPOSE(tcp, tl); 16387961Smckusick *(char **)tcp = (char *)0; 16397961Smckusick continue; 16407961Smckusick case O_DFDISP: 16417961Smckusick tl = *pc.cp++; /* tl = size being disposed */ 16427961Smckusick if (tl == 0) 16437961Smckusick tl = *pc.usp++; 16447961Smckusick tcp = popaddr(); /* ptr to ptr being disposed */ 16457961Smckusick DFDISPOSE(tcp, tl); 16467961Smckusick *(char **)tcp = (char *)0; 16477961Smckusick continue; 16482080Smckusick case O_DATE: 16492080Smckusick pc.cp++; 16502080Smckusick DATE(popaddr()); 16512080Smckusick continue; 16522080Smckusick case O_TIME: 16532080Smckusick pc.cp++; 16542080Smckusick TIME(popaddr()); 16552080Smckusick continue; 16562080Smckusick case O_UNDEF: 16572080Smckusick pc.cp++; 1658*30057Smckusick td = pop8(); 16592950Smckusic push2((short)(0)); 16602080Smckusick continue; 16612080Smckusick case O_ATAN: 16622080Smckusick pc.cp++; 16635723Smckusic if (_runtst) { 16645723Smckusic push8(ATAN(pop8())); 16655723Smckusic continue; 16665723Smckusic } 16672080Smckusick push8(atan(pop8())); 16682080Smckusick continue; 16692080Smckusick case O_COS: 16702080Smckusick pc.cp++; 16715723Smckusic if (_runtst) { 16725723Smckusic push8(COS(pop8())); 16735723Smckusic continue; 16745723Smckusic } 16752080Smckusick push8(cos(pop8())); 16762080Smckusick continue; 16772080Smckusick case O_EXP: 16782080Smckusick pc.cp++; 16795723Smckusic if (_runtst) { 16805723Smckusic push8(EXP(pop8())); 16815723Smckusic continue; 16825723Smckusic } 16832080Smckusick push8(exp(pop8())); 16842080Smckusick continue; 16852080Smckusick case O_LN: 16862080Smckusick pc.cp++; 16872191Smckusic if (_runtst) { 16882191Smckusic push8(LN(pop8())); 16892191Smckusic continue; 16902191Smckusic } 16912191Smckusic push8(log(pop8())); 16922080Smckusick continue; 16932080Smckusick case O_SIN: 16942080Smckusick pc.cp++; 16955723Smckusic if (_runtst) { 16965723Smckusic push8(SIN(pop8())); 16975723Smckusic continue; 16985723Smckusic } 16992080Smckusick push8(sin(pop8())); 17002080Smckusick continue; 17012080Smckusick case O_SQRT: 17022080Smckusick pc.cp++; 17032191Smckusic if (_runtst) { 17042191Smckusic push8(SQRT(pop8())); 17052191Smckusic continue; 17062191Smckusic } 17072191Smckusic push8(sqrt(pop8())); 17082080Smckusick continue; 17092080Smckusick case O_CHR2: 17102080Smckusick case O_CHR4: 17112080Smckusick pc.cp++; 17122191Smckusic if (_runtst) { 17132950Smckusic push2((short)(CHR(pop4()))); 17142191Smckusic continue; 17152191Smckusic } 17162950Smckusic push2((short)(pop4())); 17172080Smckusick continue; 17182080Smckusick case O_ODD2: 17192080Smckusick case O_ODD4: 17202080Smckusick pc.cp++; 172110576Smckusick tl = pop4(); 172210576Smckusick push2((short)(tl & 1)); 17232080Smckusick continue; 17242080Smckusick case O_SUCC2: 17252109Smckusic tl = *pc.cp++; 17262109Smckusic if (tl == 0) 17272109Smckusic tl = *pc.sp++; 17282109Smckusic tl1 = pop4(); 17292191Smckusic if (_runtst) { 17302950Smckusic push2((short)(SUCC(tl1, tl, (long)(*pc.sp++)))); 17312191Smckusic continue; 17322191Smckusic } 17332950Smckusic push2((short)(tl1 + 1)); 17342191Smckusic pc.sp++; 17352080Smckusick continue; 17362080Smckusick case O_SUCC24: 17372109Smckusic tl = *pc.cp++; 17382109Smckusic if (tl == 0) 17392109Smckusic tl = *pc.sp++; 17402109Smckusic tl1 = pop4(); 17412191Smckusic if (_runtst) { 17422950Smckusic push4(SUCC(tl1, tl, (long)(*pc.sp++))); 17432191Smckusic continue; 17442191Smckusic } 17452191Smckusic push4(tl1 + 1); 17462191Smckusic pc.sp++; 17472109Smckusic continue; 17482080Smckusick case O_SUCC4: 17492109Smckusic tl = *pc.cp++; 17502109Smckusic if (tl == 0) 1751*30057Smckusick PCLONGVAL(tl); 17522109Smckusic tl1 = pop4(); 17532191Smckusic if (_runtst) { 1754*30057Smckusick PCLONGVAL(tl2); 1755*30057Smckusick push4(SUCC(tl1, tl, (long)(tl2))); 17562191Smckusic continue; 17572191Smckusic } 17582191Smckusic push4(tl1 + 1); 17592191Smckusic pc.lp++; 17602080Smckusick continue; 17612080Smckusick case O_PRED2: 17622109Smckusic tl = *pc.cp++; 17632109Smckusic if (tl == 0) 17642109Smckusic tl = *pc.sp++; 17652109Smckusic tl1 = pop4(); 17662191Smckusic if (_runtst) { 17672950Smckusic push2((short)(PRED(tl1, tl, (long)(*pc.sp++)))); 17682191Smckusic continue; 17692191Smckusic } 17702950Smckusic push2((short)(tl1 - 1)); 17712191Smckusic pc.sp++; 17722080Smckusick continue; 17732080Smckusick case O_PRED24: 17742109Smckusic tl = *pc.cp++; 17752109Smckusic if (tl == 0) 17762109Smckusic tl = *pc.sp++; 17772109Smckusic tl1 = pop4(); 17782191Smckusic if (_runtst) { 17792950Smckusic push4(PRED(tl1, tl, (long)(*pc.sp++))); 17802191Smckusic continue; 17812191Smckusic } 17822191Smckusic push4(tl1 - 1); 17832191Smckusic pc.sp++; 17842109Smckusic continue; 17852080Smckusick case O_PRED4: 17862109Smckusic tl = *pc.cp++; 17872109Smckusic if (tl == 0) 1788*30057Smckusick PCLONGVAL(tl); 17892109Smckusic tl1 = pop4(); 17902191Smckusic if (_runtst) { 1791*30057Smckusick PCLONGVAL(tl2); 1792*30057Smckusick push4(PRED(tl1, tl, (long)(tl2))); 17932191Smckusic continue; 17942191Smckusic } 17952191Smckusic push4(tl1 - 1); 17962191Smckusic pc.lp++; 17972080Smckusick continue; 17982080Smckusick case O_SEED: 17992080Smckusick pc.cp++; 18002080Smckusick push4(SEED(pop4())); 18012080Smckusick continue; 18022080Smckusick case O_RANDOM: 18032080Smckusick pc.cp++; 18042080Smckusick push8(RANDOM(pop8())); 18052080Smckusick continue; 18062080Smckusick case O_EXPO: 18072080Smckusick pc.cp++; 18082080Smckusick push4(EXPO(pop8())); 18092080Smckusick continue; 18102080Smckusick case O_SQR2: 18112080Smckusick case O_SQR4: 18122080Smckusick pc.cp++; 18132080Smckusick tl = pop4(); 18142080Smckusick push4(tl * tl); 18152080Smckusick continue; 18162080Smckusick case O_SQR8: 18172080Smckusick pc.cp++; 18182080Smckusick td = pop8(); 18192080Smckusick push8(td * td); 18202080Smckusick continue; 18212080Smckusick case O_ROUND: 18222080Smckusick pc.cp++; 18232080Smckusick push4(ROUND(pop8())); 18242080Smckusick continue; 18252080Smckusick case O_TRUNC: 18262080Smckusick pc.cp++; 18272080Smckusick push4(TRUNC(pop8())); 18282080Smckusick continue; 18292950Smckusic default: 18305682Smckusic ERROR("Panic: bad op code\n"); 18312950Smckusic continue; 18322080Smckusick } 18332080Smckusick } 18342080Smckusick } 1835