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*36537Smckusick static char sccsid[] = "@(#)interp.c 5.6 (Berkeley) 01/09/89"; 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 /* 101*36537Smckusick * stuff for pdx to watch what the interpreter is doing. 102*36537Smckusick * The .globl is #ifndef DBX since it breaks DBX to have a global 103*36537Smckusick * asm label in the middle of a function (see _loopaddr: below). 1045658Slinton */ 1055658Slinton 106*36537Smckusick union progcntr pdx_pc; 107*36537Smckusick #ifndef DBX 1085658Slinton asm(".globl _loopaddr"); 109*36537Smckusick #endif DBX 1105658Slinton 1115658Slinton /* 1122109Smckusic * Px profile array 1132109Smckusic */ 1142109Smckusic #ifdef PROFILE 1152109Smckusic long _profcnts[NUMOPS]; 1162109Smckusic #endif PROFILE 1172109Smckusic 1182109Smckusic /* 1192109Smckusic * debugging variables 1202109Smckusic */ 12130058Smckusick #ifdef PXDEBUG 1222109Smckusic char opc[10]; 1232109Smckusic long opcptr = 9; 12430058Smckusick #endif PXDEBUG 1252109Smckusic 126*36537Smckusick void 1272080Smckusick interpreter(base) 1282080Smckusick char *base; 1292080Smckusick { 130*36537Smckusick /* register */ union progcntr pc; /* interpreted program cntr */ 1312080Smckusick struct iorec *curfile; /* active file */ 13210576Smckusick register struct blockmark *stp; /* active stack frame ptr */ 1332080Smckusick /* 1342080Smckusick * the following variables are used as scratch 1352080Smckusick */ 1362239Smckusic register char *tcp; 13710576Smckusick register short *tsp; 13830057Smckusick register long tl, tl1, tl2, tl3; 139*36537Smckusick char *tcp2; 140*36537Smckusick long tl4; 1412080Smckusick double td, td1; 1422239Smckusic struct sze8 t8; 14310576Smckusick register short *tsp1; 14430057Smckusick long *tlp; 14510576Smckusick char *tcp1; 1462950Smckusic bool tb; 14710576Smckusick struct blockmark *tstp; 14810576Smckusick register struct formalrtn *tfp; 1492080Smckusick struct iorec **ip; 15010792Smckusick int mypid; 151*36537Smckusick int ti, ti2; 152*36537Smckusick short ts; 153*36537Smckusick FILE *tf; 154*36537Smckusick /* register */ union progcntr stack; /* Interpreted stack */ 1552080Smckusick 15610792Smckusick mypid = getpid(); 1575658Slinton 1582080Smckusick /* 1592239Smckusic * Setup sets up any hardware specific parameters before 160*36537Smckusick * starting the interpreter. Typically this is macro- or inline- 161*36537Smckusick * replaced by "machdep.h" or interp.sed. 1622239Smckusic */ 163*36537Smckusick setup(); 1642239Smckusic /* 1652080Smckusick * necessary only on systems which do not initialize 1662080Smckusick * memory to zero 1672080Smckusick */ 1682080Smckusick for (ip = &_actfile[3]; ip < &_actfile[MAXFILES]; *ip++ = FILNIL) 1692080Smckusick /* void */; 1702080Smckusick /* 1712080Smckusick * set up global environment, then ``call'' the main program 1722080Smckusick */ 17330057Smckusick STACKALIGN(tl, 2 * sizeof(struct iorec *)); 17430057Smckusick _display.frame[0].locvars = pushsp(tl); 1752950Smckusic _display.frame[0].locvars += 2 * sizeof(struct iorec *); 1762950Smckusic *(struct iorec **)(_display.frame[0].locvars + OUTPUT_OFF) = OUTPUT; 1772950Smckusic *(struct iorec **)(_display.frame[0].locvars + INPUT_OFF) = INPUT; 17830057Smckusick STACKALIGN(tl, sizeof(struct blockmark)); 17930057Smckusick stp = (struct blockmark *)pushsp(tl); 1802109Smckusic _dp = &_display.frame[0]; 1812080Smckusick pc.cp = base; 1825658Slinton 1832080Smckusick for(;;) { 18430058Smckusick # ifdef PXDEBUG 1852080Smckusick if (++opcptr == 10) 1862080Smckusick opcptr = 0; 1872080Smckusick opc[opcptr] = *pc.ucp; 18830058Smckusick # endif PXDEBUG 1892109Smckusic # ifdef PROFILE 1902109Smckusic _profcnts[*pc.ucp]++; 1912109Smckusic # endif PROFILE 192*36537Smckusick 193*36537Smckusick /* 194*36537Smckusick * Save away the program counter to a fixed location for pdx. 195*36537Smckusick */ 196*36537Smckusick pdx_pc = pc; 197*36537Smckusick 198*36537Smckusick /* 199*36537Smckusick * Having the label below makes dbx not work 200*36537Smckusick * to debug this interpreter, 201*36537Smckusick * since it thinks a new function called loopaddr() 202*36537Smckusick * has started here, and it won't display the local 203*36537Smckusick * variables of interpreter(). You have to compile 204*36537Smckusick * -DDBX to avoid this problem... 205*36537Smckusick */ 206*36537Smckusick # ifndef DBX 207*36537Smckusick ;asm("_loopaddr:"); 208*36537Smckusick # endif DBX 209*36537Smckusick 2102080Smckusick switch (*pc.ucp++) { 2115658Slinton case O_BPT: /* breakpoint trap */ 2125873Slinton PFLUSH(); 21310792Smckusick kill(mypid, SIGILL); 2145658Slinton pc.ucp--; 2155658Slinton continue; 2162080Smckusick case O_NODUMP: 2172191Smckusic _nodump = TRUE; 2182080Smckusick /* and fall through */ 2192080Smckusick case O_BEG: 2202080Smckusick _dp += 1; /* enter local scope */ 2212080Smckusick stp->odisp = *_dp; /* save old display value */ 2222080Smckusick tl = *pc.ucp++; /* tl = name size */ 2232080Smckusick stp->entry = pc.hdrp; /* pointer to entry info */ 2242191Smckusic tl1 = pc.hdrp->framesze;/* tl1 = size of frame */ 2252191Smckusic _lino = pc.hdrp->offset; 2262191Smckusic _runtst = pc.hdrp->tests; 2272191Smckusic disableovrflo(); 2282191Smckusic if (_runtst) 2292191Smckusic enableovrflo(); 2302950Smckusic pc.cp += (int)tl; /* skip over proc hdr info */ 2312080Smckusick stp->file = curfile; /* save active file */ 23230057Smckusick STACKALIGN(tl2, tl1); 23330057Smckusick tcp = pushsp(tl2); /* tcp = new top of stack */ 2342950Smckusic if (_runtst) /* zero stack frame */ 2359231Smckusick blkclr(tcp, tl1); 2362950Smckusic tcp += (int)tl1; /* offsets of locals are neg */ 2372109Smckusic _dp->locvars = tcp; /* set new display pointer */ 2382109Smckusic _dp->stp = stp; 2392950Smckusic stp->tos = pushsp((long)0); /* set tos pointer */ 2402080Smckusick continue; 2412080Smckusick case O_END: 2422080Smckusick PCLOSE(_dp->locvars); /* flush & close local files */ 2432080Smckusick stp = _dp->stp; 2442080Smckusick curfile = stp->file; /* restore old active file */ 2452080Smckusick *_dp = stp->odisp; /* restore old display entry */ 2462109Smckusic if (_dp == &_display.frame[1]) 2472080Smckusick return; /* exiting main proc ??? */ 2482080Smckusick _lino = stp->lino; /* restore lino, pc, dp */ 24910576Smckusick pc.cp = stp->pc; 2502080Smckusick _dp = stp->dp; 2512191Smckusic _runtst = stp->entry->tests; 2522191Smckusic disableovrflo(); 2532191Smckusic if (_runtst) 2542191Smckusic enableovrflo(); 25530057Smckusick STACKALIGN(tl, stp->entry->framesze); 25630057Smckusick STACKALIGN(tl1, sizeof(struct blockmark)); 25730057Smckusick popsp(tl + /* pop local vars */ 25830057Smckusick tl1 + /* pop stack frame */ 25930057Smckusick stp->entry->nargs);/* pop parms */ 2602080Smckusick continue; 2612080Smckusick case O_CALL: 2622080Smckusick tl = *pc.cp++; 26330057Smckusick PCLONGVAL(tl1); 26430057Smckusick tcp = base + tl1 + sizeof(short);/* new entry point */ 26530057Smckusick GETLONGVAL(tl1, tcp); 26630057Smckusick tcp = base + tl1; 26730057Smckusick STACKALIGN(tl1, sizeof(struct blockmark)); 26830057Smckusick stp = (struct blockmark *)pushsp(tl1); 2692080Smckusick stp->lino = _lino; /* save lino, pc, dp */ 27010576Smckusick stp->pc = pc.cp; 2712080Smckusick stp->dp = _dp; 2722109Smckusic _dp = &_display.frame[tl]; /* set up new display ptr */ 2732080Smckusick pc.cp = tcp; 2742080Smckusick continue; 2752080Smckusick case O_FCALL: 2763294Smckusic pc.cp++; 2774016Smckusic tcp = popaddr(); /* ptr to display save area */ 2782080Smckusick tfp = (struct formalrtn *)popaddr(); 27930057Smckusick STACKALIGN(tl, sizeof(struct blockmark)); 28030057Smckusick stp = (struct blockmark *)pushsp(tl); 2812080Smckusick stp->lino = _lino; /* save lino, pc, dp */ 28210576Smckusick stp->pc = pc.cp; 2832080Smckusick stp->dp = _dp; 28410576Smckusick pc.cp = (char *)(tfp->fentryaddr);/* new entry point */ 2853436Smckusic _dp = &_display.frame[tfp->fbn];/* new display ptr */ 2869231Smckusick blkcpy(&_display.frame[1], tcp, 28710576Smckusick tfp->fbn * sizeof(struct dispsave)); 2889231Smckusick blkcpy(&tfp->fdisp[0], &_display.frame[1], 28910576Smckusick tfp->fbn * sizeof(struct dispsave)); 2902080Smckusick continue; 2912080Smckusick case O_FRTN: 2922080Smckusick tl = *pc.cp++; /* tl = size of return obj */ 2932080Smckusick if (tl == 0) 2942080Smckusick tl = *pc.usp++; 2952950Smckusic tcp = pushsp((long)(0)); 2962080Smckusick tfp = *(struct formalrtn **)(tcp + tl); 2974016Smckusic tcp1 = *(char **) 2984016Smckusic (tcp + tl + sizeof(struct formalrtn *)); 2993861Smckusic if (tl != 0) { 3009231Smckusick blkcpy(tcp, tcp + sizeof(struct formalrtn *) 3019231Smckusick + sizeof(char *), tl); 3023861Smckusic } 30330057Smckusick STACKALIGN(tl, 30430057Smckusick sizeof(struct formalrtn *) + sizeof (char *)); 30530057Smckusick popsp(tl); 3069231Smckusick blkcpy(tcp1, &_display.frame[1], 30710576Smckusick tfp->fbn * sizeof(struct dispsave)); 3082080Smckusick continue; 3092080Smckusick case O_FSAV: 3102080Smckusick tfp = (struct formalrtn *)popaddr(); 3113436Smckusic tfp->fbn = *pc.cp++; /* blk number of routine */ 31230057Smckusick PCLONGVAL(tl); 31330057Smckusick tcp = base + tl + sizeof(short);/* new entry point */ 31430057Smckusick GETLONGVAL(tl, tcp); 31530057Smckusick tfp->fentryaddr = (long (*)())(base + tl); 3169231Smckusick blkcpy(&_display.frame[1], &tfp->fdisp[0], 31710576Smckusick tfp->fbn * sizeof(struct dispsave)); 3182080Smckusick pushaddr(tfp); 3192080Smckusick continue; 3202080Smckusick case O_SDUP2: 3212080Smckusick pc.cp++; 3222080Smckusick tl = pop2(); 3232950Smckusic push2((short)(tl)); 3242950Smckusic push2((short)(tl)); 3252080Smckusick continue; 3262080Smckusick case O_SDUP4: 3272080Smckusick pc.cp++; 3282080Smckusick tl = pop4(); 3292080Smckusick push4(tl); 3302080Smckusick push4(tl); 3312080Smckusick continue; 3322080Smckusick case O_TRA: 3332080Smckusick pc.cp++; 3342080Smckusick pc.cp += *pc.sp; 3352080Smckusick continue; 3362080Smckusick case O_TRA4: 3372080Smckusick pc.cp++; 33830057Smckusick PCLONGVAL(tl); 33930057Smckusick pc.cp = base + tl; 3402080Smckusick continue; 3412080Smckusick case O_GOTO: 3422109Smckusic tstp = _display.frame[*pc.cp++].stp; /* ptr to 3432109Smckusic exit frame */ 34430057Smckusick PCLONGVAL(tl); 34530057Smckusick pc.cp = base + tl; 3462080Smckusick stp = _dp->stp; 3472080Smckusick while (tstp != stp) { 3482109Smckusic if (_dp == &_display.frame[1]) 3493872Smckusic ERROR("Active frame not found in non-local goto\n", 0); /* exiting prog ??? */ 3502080Smckusick PCLOSE(_dp->locvars); /* close local files */ 3512080Smckusick curfile = stp->file; /* restore active file */ 3522080Smckusick *_dp = stp->odisp; /* old display entry */ 3532080Smckusick _dp = stp->dp; /* restore dp */ 3542080Smckusick stp = _dp->stp; 3552080Smckusick } 3562080Smckusick /* pop locals, stack frame, parms, and return values */ 3572950Smckusic popsp((long)(stp->tos - pushsp((long)(0)))); 3582080Smckusick continue; 3592080Smckusick case O_LINO: 3602950Smckusic if (_dp->stp->tos != pushsp((long)(0))) 3615682Smckusic ERROR("Panic: stack not empty between statements\n"); 3622080Smckusick _lino = *pc.cp++; /* set line number */ 3632080Smckusick if (_lino == 0) 3642080Smckusick _lino = *pc.sp++; 3652950Smckusic if (_runtst) { 3662950Smckusic LINO(); /* inc statement count */ 3672950Smckusic continue; 3682950Smckusic } 3692950Smckusic _stcnt++; 3702080Smckusick continue; 3712080Smckusick case O_PUSH: 3722080Smckusick tl = *pc.cp++; 3732080Smckusick if (tl == 0) 37430057Smckusick PCLONGVAL(tl); 37530057Smckusick STACKALIGN(tl1, -tl); 37630057Smckusick tcp = pushsp(tl1); 3772950Smckusic if (_runtst) 37830057Smckusick blkclr(tcp, tl1); 3792080Smckusick continue; 3802080Smckusick case O_IF: 3812080Smckusick pc.cp++; 3822191Smckusic if (pop2()) { 3832080Smckusick pc.sp++; 3842191Smckusic continue; 3852191Smckusic } 3862191Smckusic pc.cp += *pc.sp; 3872080Smckusick continue; 3882080Smckusick case O_REL2: 3892080Smckusick tl = pop2(); 3902080Smckusick tl1 = pop2(); 3912080Smckusick goto cmplong; 3922080Smckusick case O_REL24: 3932080Smckusick tl = pop2(); 3942080Smckusick tl1 = pop4(); 3952080Smckusick goto cmplong; 3962080Smckusick case O_REL42: 3972080Smckusick tl = pop4(); 3982080Smckusick tl1 = pop2(); 3992080Smckusick goto cmplong; 4002080Smckusick case O_REL4: 4012080Smckusick tl = pop4(); 4022080Smckusick tl1 = pop4(); 4032080Smckusick cmplong: 4045682Smckusic switch (*pc.cp++) { 4052080Smckusick case releq: 4062080Smckusick push2(tl1 == tl); 4072080Smckusick continue; 4082080Smckusick case relne: 4092080Smckusick push2(tl1 != tl); 4102080Smckusick continue; 4112080Smckusick case rellt: 4122080Smckusick push2(tl1 < tl); 4132080Smckusick continue; 4142080Smckusick case relgt: 4152080Smckusick push2(tl1 > tl); 4162080Smckusick continue; 4172080Smckusick case relle: 4182080Smckusick push2(tl1 <= tl); 4192080Smckusick continue; 4202080Smckusick case relge: 4212080Smckusick push2(tl1 >= tl); 4222080Smckusick continue; 4232080Smckusick default: 4245682Smckusic ERROR("Panic: bad relation %d to REL4*\n", 4255682Smckusic *(pc.cp - 1)); 4262080Smckusick continue; 4272080Smckusick } 4282080Smckusick case O_RELG: 4292080Smckusick tl2 = *pc.cp++; /* tc has jump opcode */ 4302080Smckusick tl = *pc.usp++; /* tl has comparison length */ 43130057Smckusick STACKALIGN(tl1, tl); /* tl1 has arg stack length */ 4322950Smckusic tcp = pushsp((long)(0));/* tcp pts to first arg */ 4332080Smckusick switch (tl2) { 4342080Smckusick case releq: 4352950Smckusic tb = RELEQ(tl, tcp + tl1, tcp); 4362080Smckusick break; 4372080Smckusick case relne: 4382950Smckusic tb = RELNE(tl, tcp + tl1, tcp); 4392080Smckusick break; 4402080Smckusick case rellt: 4412950Smckusic tb = RELSLT(tl, tcp + tl1, tcp); 4422080Smckusick break; 4432080Smckusick case relgt: 4442950Smckusic tb = RELSGT(tl, tcp + tl1, tcp); 4452080Smckusick break; 4462080Smckusick case relle: 4472950Smckusic tb = RELSLE(tl, tcp + tl1, tcp); 4482080Smckusick break; 4492080Smckusick case relge: 4502950Smckusic tb = RELSGE(tl, tcp + tl1, tcp); 4512080Smckusick break; 4522080Smckusick default: 4535682Smckusic ERROR("Panic: bad relation %d to RELG*\n", tl2); 4542080Smckusick break; 4552080Smckusick } 4562080Smckusick popsp(tl1 << 1); 4572950Smckusic push2((short)(tb)); 4582080Smckusick continue; 4592080Smckusick case O_RELT: 4602080Smckusick tl2 = *pc.cp++; /* tc has jump opcode */ 4612080Smckusick tl1 = *pc.usp++; /* tl1 has comparison length */ 4622950Smckusic tcp = pushsp((long)(0));/* tcp pts to first arg */ 4632080Smckusick switch (tl2) { 4642080Smckusick case releq: 4652950Smckusic tb = RELEQ(tl1, tcp + tl1, tcp); 4662080Smckusick break; 4672080Smckusick case relne: 4682950Smckusic tb = RELNE(tl1, tcp + tl1, tcp); 4692080Smckusick break; 4702080Smckusick case rellt: 4712950Smckusic tb = RELTLT(tl1, tcp + tl1, tcp); 4722080Smckusick break; 4732080Smckusick case relgt: 4742950Smckusic tb = RELTGT(tl1, tcp + tl1, tcp); 4752080Smckusick break; 4762080Smckusick case relle: 4772950Smckusic tb = RELTLE(tl1, tcp + tl1, tcp); 4782080Smckusick break; 4792080Smckusick case relge: 4802950Smckusic tb = RELTGE(tl1, tcp + tl1, tcp); 4812080Smckusick break; 4822080Smckusick default: 4835682Smckusic ERROR("Panic: bad relation %d to RELT*\n", tl2); 4842080Smckusick break; 4852080Smckusick } 48630057Smckusick STACKALIGN(tl, tl1); 48730057Smckusick popsp(tl << 1); 4882950Smckusic push2((short)(tb)); 4892080Smckusick continue; 4902080Smckusick case O_REL28: 4912080Smckusick td = pop2(); 4922080Smckusick td1 = pop8(); 4932080Smckusick goto cmpdbl; 4942080Smckusick case O_REL48: 4952080Smckusick td = pop4(); 4962080Smckusick td1 = pop8(); 4972080Smckusick goto cmpdbl; 4982080Smckusick case O_REL82: 4992080Smckusick td = pop8(); 5002080Smckusick td1 = pop2(); 5012080Smckusick goto cmpdbl; 5022080Smckusick case O_REL84: 5032080Smckusick td = pop8(); 5042080Smckusick td1 = pop4(); 5052080Smckusick goto cmpdbl; 5062080Smckusick case O_REL8: 5072080Smckusick td = pop8(); 5082080Smckusick td1 = pop8(); 5092080Smckusick cmpdbl: 5102080Smckusick switch (*pc.cp++) { 5112080Smckusick case releq: 5122080Smckusick push2(td1 == td); 5132080Smckusick continue; 5142080Smckusick case relne: 5152080Smckusick push2(td1 != td); 5162080Smckusick continue; 5172080Smckusick case rellt: 5182080Smckusick push2(td1 < td); 5192080Smckusick continue; 5202080Smckusick case relgt: 5212080Smckusick push2(td1 > td); 5222080Smckusick continue; 5232080Smckusick case relle: 5242080Smckusick push2(td1 <= td); 5252080Smckusick continue; 5262080Smckusick case relge: 5272080Smckusick push2(td1 >= td); 5282080Smckusick continue; 5292080Smckusick default: 5305682Smckusic ERROR("Panic: bad relation %d to REL8*\n", 5315682Smckusic *(pc.cp - 1)); 5322080Smckusick continue; 5332080Smckusick } 5342080Smckusick case O_AND: 5352080Smckusick pc.cp++; 53610576Smckusick tl = pop2(); 53710576Smckusick tl1 = pop2(); 53810787Smckusick push2(tl1 & tl); 5392080Smckusick continue; 5402080Smckusick case O_OR: 5412080Smckusick pc.cp++; 54210576Smckusick tl = pop2(); 54310576Smckusick tl1 = pop2(); 54410787Smckusick push2(tl1 | tl); 5452080Smckusick continue; 5462080Smckusick case O_NOT: 5472080Smckusick pc.cp++; 54810576Smckusick tl = pop2(); 54910576Smckusick push2(tl ^ 1); 5502080Smckusick continue; 5512080Smckusick case O_AS2: 5522080Smckusick pc.cp++; 5532080Smckusick tl = pop2(); 5542080Smckusick *(short *)popaddr() = tl; 5552080Smckusick continue; 5562080Smckusick case O_AS4: 5572080Smckusick pc.cp++; 5582080Smckusick tl = pop4(); 5592080Smckusick *(long *)popaddr() = tl; 5602080Smckusick continue; 5612080Smckusick case O_AS24: 5622080Smckusick pc.cp++; 5632080Smckusick tl = pop2(); 5642080Smckusick *(long *)popaddr() = tl; 5652080Smckusick continue; 5662080Smckusick case O_AS42: 5672080Smckusick pc.cp++; 5682080Smckusick tl = pop4(); 5692080Smckusick *(short *)popaddr() = tl; 5702080Smckusick continue; 5712080Smckusick case O_AS21: 5722080Smckusick pc.cp++; 5732080Smckusick tl = pop2(); 5742080Smckusick *popaddr() = tl; 5752080Smckusick continue; 5762080Smckusick case O_AS41: 5772080Smckusick pc.cp++; 5782080Smckusick tl = pop4(); 5792080Smckusick *popaddr() = tl; 5802080Smckusick continue; 5812080Smckusick case O_AS28: 5822080Smckusick pc.cp++; 5832080Smckusick tl = pop2(); 5842080Smckusick *(double *)popaddr() = tl; 5852080Smckusick continue; 5862080Smckusick case O_AS48: 5872080Smckusick pc.cp++; 5882080Smckusick tl = pop4(); 5892080Smckusick *(double *)popaddr() = tl; 5902080Smckusick continue; 5912080Smckusick case O_AS8: 5922080Smckusick pc.cp++; 5932239Smckusic t8 = popsze8(); 5942239Smckusic *(struct sze8 *)popaddr() = t8; 5952080Smckusick continue; 5962080Smckusick case O_AS: 5972080Smckusick tl = *pc.cp++; 5982080Smckusick if (tl == 0) 5992080Smckusick tl = *pc.usp++; 60030057Smckusick STACKALIGN(tl1, tl); 6012950Smckusic tcp = pushsp((long)(0)); 6029231Smckusick blkcpy(tcp, *(char **)(tcp + tl1), tl); 6032080Smckusick popsp(tl1 + sizeof(char *)); 6042080Smckusick continue; 60515976Smckusick case O_VAS: 60615976Smckusick pc.cp++; 60715976Smckusick tl = pop4(); 60815976Smckusick tcp1 = popaddr(); 60915976Smckusick tcp = popaddr(); 61015976Smckusick blkcpy(tcp1, tcp, tl); 61115976Smckusick continue; 6122080Smckusick case O_INX2P2: 6132080Smckusick tl = *pc.cp++; /* tl has shift amount */ 61410576Smckusick tl1 = pop2(); 61510576Smckusick tl1 = (tl1 - *pc.sp++) << tl; 61610576Smckusick tcp = popaddr(); 61710576Smckusick pushaddr(tcp + tl1); 6182080Smckusick continue; 6192080Smckusick case O_INX4P2: 6202080Smckusick tl = *pc.cp++; /* tl has shift amount */ 62110576Smckusick tl1 = pop4(); 62210576Smckusick tl1 = (tl1 - *pc.sp++) << tl; 62310576Smckusick tcp = popaddr(); 62410576Smckusick pushaddr(tcp + tl1); 6252080Smckusick continue; 6262080Smckusick case O_INX2: 6272080Smckusick tl = *pc.cp++; /* tl has element size */ 6282080Smckusick if (tl == 0) 6292080Smckusick tl = *pc.usp++; 6302080Smckusick tl1 = pop2(); /* index */ 6312080Smckusick tl2 = *pc.sp++; 63210576Smckusick tcp = popaddr(); 63310576Smckusick pushaddr(tcp + (tl1 - tl2) * tl); 6342191Smckusic tl = *pc.usp++; 6352191Smckusic if (_runtst) 6362191Smckusic SUBSC(tl1, tl2, tl); /* range check */ 6372080Smckusick continue; 6382080Smckusick case O_INX4: 6392080Smckusick tl = *pc.cp++; /* tl has element size */ 6402080Smckusick if (tl == 0) 6412080Smckusick tl = *pc.usp++; 6422080Smckusick tl1 = pop4(); /* index */ 6432080Smckusick tl2 = *pc.sp++; 64410576Smckusick tcp = popaddr(); 64510576Smckusick pushaddr(tcp + (tl1 - tl2) * tl); 6462191Smckusic tl = *pc.usp++; 6472191Smckusic if (_runtst) 6482191Smckusic SUBSC(tl1, tl2, tl); /* range check */ 6492080Smckusick continue; 65015976Smckusick case O_VINX2: 65115976Smckusick pc.cp++; 65215976Smckusick tl = pop2(); /* tl has element size */ 65315976Smckusick tl1 = pop2(); /* upper bound */ 65415976Smckusick tl2 = pop2(); /* lower bound */ 65515976Smckusick tl3 = pop2(); /* index */ 65615976Smckusick tcp = popaddr(); 65715976Smckusick pushaddr(tcp + (tl3 - tl2) * tl); 65815976Smckusick if (_runtst) 65915976Smckusick SUBSC(tl3, tl2, tl1); /* range check */ 66015976Smckusick continue; 66115976Smckusick case O_VINX24: 66215976Smckusick pc.cp++; 66315976Smckusick tl = pop2(); /* tl has element size */ 66415976Smckusick tl1 = pop2(); /* upper bound */ 66515976Smckusick tl2 = pop2(); /* lower bound */ 66615976Smckusick tl3 = pop4(); /* index */ 66715976Smckusick tcp = popaddr(); 66815976Smckusick pushaddr(tcp + (tl3 - tl2) * tl); 66915976Smckusick if (_runtst) 67015976Smckusick SUBSC(tl3, tl2, tl1); /* range check */ 67115976Smckusick continue; 67215976Smckusick case O_VINX42: 67315976Smckusick pc.cp++; 67415976Smckusick tl = pop4(); /* tl has element size */ 67515976Smckusick tl1 = pop4(); /* upper bound */ 67615976Smckusick tl2 = pop4(); /* lower bound */ 67715976Smckusick tl3 = pop2(); /* index */ 67815976Smckusick tcp = popaddr(); 67915976Smckusick pushaddr(tcp + (tl3 - tl2) * tl); 68015976Smckusick if (_runtst) 68115976Smckusick SUBSC(tl3, tl2, tl1); /* range check */ 68215976Smckusick continue; 68315976Smckusick case O_VINX4: 68415976Smckusick pc.cp++; 68515976Smckusick tl = pop4(); /* tl has element size */ 68615976Smckusick tl1 = pop4(); /* upper bound */ 68715976Smckusick tl2 = pop4(); /* lower bound */ 68815976Smckusick tl3 = pop4(); /* index */ 68915976Smckusick tcp = popaddr(); 69015976Smckusick pushaddr(tcp + (tl3 - tl2) * tl); 69115976Smckusick if (_runtst) 69215976Smckusick SUBSC(tl3, tl2, tl1); /* range check */ 69315976Smckusick continue; 6942080Smckusick case O_OFF: 6952080Smckusick tl = *pc.cp++; 6962080Smckusick if (tl == 0) 6972080Smckusick tl = *pc.usp++; 69810576Smckusick tcp = popaddr(); 69910576Smckusick pushaddr(tcp + tl); 7002080Smckusick continue; 7012080Smckusick case O_NIL: 7022080Smckusick pc.cp++; 70324938Smckusick tcp = popaddr(); 70424938Smckusick NIL(tcp); 70524938Smckusick pushaddr(tcp); 7062080Smckusick continue; 7072080Smckusick case O_ADD2: 7082080Smckusick pc.cp++; 70910576Smckusick tl = pop2(); 71010576Smckusick tl1 = pop2(); 71110576Smckusick push4(tl1 + tl); 7122080Smckusick continue; 7132080Smckusick case O_ADD4: 7142080Smckusick pc.cp++; 71510576Smckusick tl = pop4(); 71610576Smckusick tl1 = pop4(); 71710576Smckusick push4(tl1 + tl); 7182080Smckusick continue; 7192080Smckusick case O_ADD24: 7202080Smckusick pc.cp++; 7212080Smckusick tl = pop2(); 72210576Smckusick tl1 = pop4(); 72310576Smckusick push4(tl1 + tl); 7242080Smckusick continue; 7252080Smckusick case O_ADD42: 7262080Smckusick pc.cp++; 7272080Smckusick tl = pop4(); 72810576Smckusick tl1 = pop2(); 72910576Smckusick push4(tl1 + tl); 7302080Smckusick continue; 7312080Smckusick case O_ADD28: 7322080Smckusick pc.cp++; 7332080Smckusick tl = pop2(); 73410576Smckusick td = pop8(); 73510576Smckusick push8(td + tl); 7362080Smckusick continue; 7372080Smckusick case O_ADD48: 7382080Smckusick pc.cp++; 7392080Smckusick tl = pop4(); 74010576Smckusick td = pop8(); 74110576Smckusick push8(td + tl); 7422080Smckusick continue; 7432080Smckusick case O_ADD82: 7442080Smckusick pc.cp++; 7452080Smckusick td = pop8(); 74610576Smckusick td1 = pop2(); 74710576Smckusick push8(td1 + td); 7482080Smckusick continue; 7492080Smckusick case O_ADD84: 7502080Smckusick pc.cp++; 7512080Smckusick td = pop8(); 75210576Smckusick td1 = pop4(); 75310576Smckusick push8(td1 + td); 7542080Smckusick continue; 7552080Smckusick case O_SUB2: 7562080Smckusick pc.cp++; 7572080Smckusick tl = pop2(); 75810576Smckusick tl1 = pop2(); 75910576Smckusick push4(tl1 - tl); 7602080Smckusick continue; 7612080Smckusick case O_SUB4: 7622080Smckusick pc.cp++; 7632080Smckusick tl = pop4(); 76410576Smckusick tl1 = pop4(); 76510576Smckusick push4(tl1 - tl); 7662080Smckusick continue; 7672080Smckusick case O_SUB24: 7682080Smckusick pc.cp++; 7692080Smckusick tl = pop2(); 77010576Smckusick tl1 = pop4(); 77110576Smckusick push4(tl1 - tl); 7722080Smckusick continue; 7732080Smckusick case O_SUB42: 7742080Smckusick pc.cp++; 7752080Smckusick tl = pop4(); 77610576Smckusick tl1 = pop2(); 77710576Smckusick push4(tl1 - tl); 7782080Smckusick continue; 7792080Smckusick case O_SUB28: 7802080Smckusick pc.cp++; 7812080Smckusick tl = pop2(); 78210576Smckusick td = pop8(); 78310576Smckusick push8(td - tl); 7842080Smckusick continue; 7852080Smckusick case O_SUB48: 7862080Smckusick pc.cp++; 7872080Smckusick tl = pop4(); 78810576Smckusick td = pop8(); 78910576Smckusick push8(td - tl); 7902080Smckusick continue; 7912080Smckusick case O_SUB82: 7922080Smckusick pc.cp++; 7932080Smckusick td = pop8(); 79410576Smckusick td1 = pop2(); 79510576Smckusick push8(td1 - td); 7962080Smckusick continue; 7972080Smckusick case O_SUB84: 7982080Smckusick pc.cp++; 7992080Smckusick td = pop8(); 80010576Smckusick td1 = pop4(); 80110576Smckusick push8(td1 - td); 8022080Smckusick continue; 8032080Smckusick case O_MUL2: 8042080Smckusick pc.cp++; 80510576Smckusick tl = pop2(); 80610576Smckusick tl1 = pop2(); 80710576Smckusick push4(tl1 * tl); 8082080Smckusick continue; 8092080Smckusick case O_MUL4: 8102080Smckusick pc.cp++; 81110576Smckusick tl = pop4(); 81210576Smckusick tl1 = pop4(); 81310576Smckusick push4(tl1 * tl); 8142080Smckusick continue; 8152080Smckusick case O_MUL24: 8162080Smckusick pc.cp++; 8172080Smckusick tl = pop2(); 81810576Smckusick tl1 = pop4(); 81910576Smckusick push4(tl1 * tl); 8202080Smckusick continue; 8212080Smckusick case O_MUL42: 8222080Smckusick pc.cp++; 8232080Smckusick tl = pop4(); 82410576Smckusick tl1 = pop2(); 82510576Smckusick push4(tl1 * tl); 8262080Smckusick continue; 8272080Smckusick case O_MUL28: 8282080Smckusick pc.cp++; 8292080Smckusick tl = pop2(); 83010576Smckusick td = pop8(); 83110576Smckusick push8(td * tl); 8322080Smckusick continue; 8332080Smckusick case O_MUL48: 8342080Smckusick pc.cp++; 8352080Smckusick tl = pop4(); 83610576Smckusick td = pop8(); 83710576Smckusick push8(td * tl); 8382080Smckusick continue; 8392080Smckusick case O_MUL82: 8402080Smckusick pc.cp++; 8412080Smckusick td = pop8(); 84210576Smckusick td1 = pop2(); 84310576Smckusick push8(td1 * td); 8442080Smckusick continue; 8452080Smckusick case O_MUL84: 8462080Smckusick pc.cp++; 8472080Smckusick td = pop8(); 84810576Smckusick td1 = pop4(); 84910576Smckusick push8(td1 * td); 8502080Smckusick continue; 8512080Smckusick case O_ABS2: 8522080Smckusick case O_ABS4: 8532080Smckusick pc.cp++; 8542080Smckusick tl = pop4(); 8552080Smckusick push4(tl >= 0 ? tl : -tl); 8562080Smckusick continue; 8572080Smckusick case O_ABS8: 8582080Smckusick pc.cp++; 8592080Smckusick td = pop8(); 8602080Smckusick push8(td >= 0.0 ? td : -td); 8612080Smckusick continue; 8622080Smckusick case O_NEG2: 8632080Smckusick pc.cp++; 864*36537Smckusick ts = -pop2(); 865*36537Smckusick push4((long)ts); 8662080Smckusick continue; 8672080Smckusick case O_NEG4: 8682080Smckusick pc.cp++; 869*36537Smckusick tl = -pop4(); 870*36537Smckusick push4(tl); 8712080Smckusick continue; 8722080Smckusick case O_NEG8: 8732080Smckusick pc.cp++; 874*36537Smckusick td = -pop8(); 875*36537Smckusick push8(td); 8762080Smckusick continue; 8772080Smckusick case O_DIV2: 8782080Smckusick pc.cp++; 8792080Smckusick tl = pop2(); 88010576Smckusick tl1 = pop2(); 88110576Smckusick push4(tl1 / tl); 8822080Smckusick continue; 8832080Smckusick case O_DIV4: 8842080Smckusick pc.cp++; 8852080Smckusick tl = pop4(); 88610576Smckusick tl1 = pop4(); 88710576Smckusick push4(tl1 / tl); 8882080Smckusick continue; 8892080Smckusick case O_DIV24: 8902080Smckusick pc.cp++; 8912080Smckusick tl = pop2(); 89210576Smckusick tl1 = pop4(); 89310576Smckusick push4(tl1 / tl); 8942080Smckusick continue; 8952080Smckusick case O_DIV42: 8962080Smckusick pc.cp++; 8972080Smckusick tl = pop4(); 89810576Smckusick tl1 = pop2(); 89910576Smckusick push4(tl1 / tl); 9002080Smckusick continue; 9012080Smckusick case O_MOD2: 9022080Smckusick pc.cp++; 9032080Smckusick tl = pop2(); 90410576Smckusick tl1 = pop2(); 90510576Smckusick push4(tl1 % tl); 9062080Smckusick continue; 9072080Smckusick case O_MOD4: 9082080Smckusick pc.cp++; 9092080Smckusick tl = pop4(); 91010576Smckusick tl1 = pop4(); 91110576Smckusick push4(tl1 % tl); 9122080Smckusick continue; 9132080Smckusick case O_MOD24: 9142080Smckusick pc.cp++; 9152080Smckusick tl = pop2(); 91610576Smckusick tl1 = pop4(); 91710576Smckusick push4(tl1 % tl); 9182080Smckusick continue; 9192080Smckusick case O_MOD42: 9202080Smckusick pc.cp++; 9212080Smckusick tl = pop4(); 92210576Smckusick tl1 = pop2(); 92310576Smckusick push4(tl1 % tl); 9242080Smckusick continue; 9252080Smckusick case O_ADD8: 9262080Smckusick pc.cp++; 92710576Smckusick td = pop8(); 92810576Smckusick td1 = pop8(); 92910787Smckusick push8(td1 + td); 9302080Smckusick continue; 9312080Smckusick case O_SUB8: 9322080Smckusick pc.cp++; 9332080Smckusick td = pop8(); 93410576Smckusick td1 = pop8(); 93510787Smckusick push8(td1 - td); 9362080Smckusick continue; 9372080Smckusick case O_MUL8: 9382080Smckusick pc.cp++; 93910576Smckusick td = pop8(); 94010576Smckusick td1 = pop8(); 94110787Smckusick push8(td1 * td); 9422080Smckusick continue; 9432080Smckusick case O_DVD8: 9442080Smckusick pc.cp++; 9452080Smckusick td = pop8(); 94610576Smckusick td1 = pop8(); 94710787Smckusick push8(td1 / td); 9482080Smckusick continue; 9492080Smckusick case O_STOI: 9502080Smckusick pc.cp++; 951*36537Smckusick ts = pop2(); 952*36537Smckusick push4((long)ts); 9532080Smckusick continue; 9542080Smckusick case O_STOD: 9552080Smckusick pc.cp++; 9562080Smckusick td = pop2(); 9572080Smckusick push8(td); 9582080Smckusick continue; 9592080Smckusick case O_ITOD: 9602080Smckusick pc.cp++; 9612080Smckusick td = pop4(); 9622080Smckusick push8(td); 9632080Smckusick continue; 9642080Smckusick case O_ITOS: 9652080Smckusick pc.cp++; 966*36537Smckusick tl = pop4(); 967*36537Smckusick push2((short)tl); 9682080Smckusick continue; 9692080Smckusick case O_DVD2: 9702080Smckusick pc.cp++; 9712080Smckusick td = pop2(); 97210576Smckusick td1 = pop2(); 97310576Smckusick push8(td1 / td); 9742080Smckusick continue; 9752080Smckusick case O_DVD4: 9762080Smckusick pc.cp++; 9772080Smckusick td = pop4(); 97810576Smckusick td1 = pop4(); 97910576Smckusick push8(td1 / td); 9802080Smckusick continue; 9812080Smckusick case O_DVD24: 9822080Smckusick pc.cp++; 9832080Smckusick td = pop2(); 98410576Smckusick td1 = pop4(); 98510576Smckusick push8(td1 / td); 9862080Smckusick continue; 9872080Smckusick case O_DVD42: 9882080Smckusick pc.cp++; 9892080Smckusick td = pop4(); 99010576Smckusick td1 = pop2(); 99110576Smckusick push8(td1 / td); 9922080Smckusick continue; 9932080Smckusick case O_DVD28: 9942080Smckusick pc.cp++; 9952080Smckusick td = pop2(); 99610576Smckusick td1 = pop8(); 99710576Smckusick push8(td1 / td); 9982080Smckusick continue; 9992080Smckusick case O_DVD48: 10002080Smckusick pc.cp++; 100110787Smckusick td = pop4(); 100210787Smckusick td1 = pop8(); 100310787Smckusick push8(td1 / td); 10042080Smckusick continue; 10052080Smckusick case O_DVD82: 10062080Smckusick pc.cp++; 10072080Smckusick td = pop8(); 100810576Smckusick td1 = pop2(); 100910576Smckusick push8(td1 / td); 10102080Smckusick continue; 10112080Smckusick case O_DVD84: 10122080Smckusick pc.cp++; 10132080Smckusick td = pop8(); 101410576Smckusick td1 = pop4(); 101510576Smckusick push8(td1 / td); 10162080Smckusick continue; 10172080Smckusick case O_RV1: 10182109Smckusic tcp = _display.raw[*pc.ucp++]; 10192950Smckusic push2((short)(*(tcp + *pc.sp++))); 10202080Smckusick continue; 10212080Smckusick case O_RV14: 10222109Smckusic tcp = _display.raw[*pc.ucp++]; 10232950Smckusic push4((long)(*(tcp + *pc.sp++))); 10242080Smckusick continue; 10252080Smckusick case O_RV2: 10262109Smckusic tcp = _display.raw[*pc.ucp++]; 10272080Smckusick push2(*(short *)(tcp + *pc.sp++)); 10282080Smckusick continue; 10292080Smckusick case O_RV24: 10302109Smckusic tcp = _display.raw[*pc.ucp++]; 10312950Smckusic push4((long)(*(short *)(tcp + *pc.sp++))); 10322080Smckusick continue; 10332080Smckusick case O_RV4: 10342109Smckusic tcp = _display.raw[*pc.ucp++]; 10352080Smckusick push4(*(long *)(tcp + *pc.sp++)); 10362080Smckusick continue; 10372080Smckusick case O_RV8: 10382109Smckusic tcp = _display.raw[*pc.ucp++]; 10392239Smckusic pushsze8(*(struct sze8 *)(tcp + *pc.sp++)); 10402080Smckusick continue; 10412080Smckusick case O_RV: 10422109Smckusic tcp = _display.raw[*pc.ucp++]; 10432080Smckusick tcp += *pc.sp++; 10442080Smckusick tl = *pc.usp++; 104530057Smckusick STACKALIGN(tl1, tl); 104630057Smckusick tcp1 = pushsp(tl1); 10479231Smckusick blkcpy(tcp, tcp1, tl); 10482080Smckusick continue; 10492080Smckusick case O_LV: 10502109Smckusic tcp = _display.raw[*pc.ucp++]; 10512080Smckusick pushaddr(tcp + *pc.sp++); 10522080Smckusick continue; 10532080Smckusick case O_LRV1: 10542109Smckusic tcp = _display.raw[*pc.ucp++]; 105530057Smckusick PCLONGVAL(tl); 105630057Smckusick push2((short)(*(tcp + tl))); 10572080Smckusick continue; 10582080Smckusick case O_LRV14: 10592109Smckusic tcp = _display.raw[*pc.ucp++]; 106030057Smckusick PCLONGVAL(tl); 106130057Smckusick push4((long)(*(tcp + tl))); 10622080Smckusick continue; 10632080Smckusick case O_LRV2: 10642109Smckusic tcp = _display.raw[*pc.ucp++]; 106530057Smckusick PCLONGVAL(tl); 106630057Smckusick push2(*(short *)(tcp + tl)); 10672080Smckusick continue; 10682080Smckusick case O_LRV24: 10692109Smckusic tcp = _display.raw[*pc.ucp++]; 107030057Smckusick PCLONGVAL(tl); 107130057Smckusick push4((long)(*(short *)(tcp + tl))); 10722080Smckusick continue; 10732080Smckusick case O_LRV4: 10742109Smckusic tcp = _display.raw[*pc.ucp++]; 107530057Smckusick PCLONGVAL(tl); 107630057Smckusick push4(*(long *)(tcp + tl)); 10772080Smckusick continue; 10782080Smckusick case O_LRV8: 10792109Smckusic tcp = _display.raw[*pc.ucp++]; 108030057Smckusick PCLONGVAL(tl); 108130057Smckusick pushsze8(*(struct sze8 *)(tcp + tl)); 10822080Smckusick continue; 10832080Smckusick case O_LRV: 10842109Smckusic tcp = _display.raw[*pc.ucp++]; 108530057Smckusick PCLONGVAL(tl); 108630057Smckusick tcp += tl; 10872080Smckusick tl = *pc.usp++; 108830057Smckusick STACKALIGN(tl1, tl); 108930057Smckusick tcp1 = pushsp(tl1); 10909231Smckusick blkcpy(tcp, tcp1, tl); 10912080Smckusick continue; 10922080Smckusick case O_LLV: 10932109Smckusic tcp = _display.raw[*pc.ucp++]; 109430057Smckusick PCLONGVAL(tl); 109530057Smckusick pushaddr(tcp + tl); 10962080Smckusick continue; 10972080Smckusick case O_IND1: 10982080Smckusick pc.cp++; 1099*36537Smckusick ts = *popaddr(); 1100*36537Smckusick push2(ts); 11012080Smckusick continue; 11022080Smckusick case O_IND14: 11032080Smckusick pc.cp++; 1104*36537Smckusick ti = *popaddr(); 1105*36537Smckusick push4((long)ti); 11062080Smckusick continue; 11072080Smckusick case O_IND2: 11082080Smckusick pc.cp++; 1109*36537Smckusick ts = *(short *)(popaddr()); 1110*36537Smckusick push2(ts); 11112080Smckusick continue; 11122080Smckusick case O_IND24: 11132080Smckusick pc.cp++; 1114*36537Smckusick ts = *(short *)(popaddr()); 1115*36537Smckusick push4((long)ts); 11162080Smckusick continue; 11172080Smckusick case O_IND4: 11182080Smckusick pc.cp++; 1119*36537Smckusick tl = *(long *)(popaddr()); 1120*36537Smckusick push4(tl); 11212080Smckusick continue; 11222080Smckusick case O_IND8: 11232080Smckusick pc.cp++; 1124*36537Smckusick t8 = *(struct sze8 *)(popaddr()); 1125*36537Smckusick pushsze8(t8); 11262080Smckusick continue; 11272080Smckusick case O_IND: 11282080Smckusick tl = *pc.cp++; 11292080Smckusick if (tl == 0) 11302080Smckusick tl = *pc.usp++; 11312080Smckusick tcp = popaddr(); 113230057Smckusick STACKALIGN(tl1, tl); 113330057Smckusick tcp1 = pushsp(tl1); 11349231Smckusick blkcpy(tcp, tcp1, tl); 11352080Smckusick continue; 11362080Smckusick case O_CON1: 11372950Smckusic push2((short)(*pc.cp++)); 11382080Smckusick continue; 11392080Smckusick case O_CON14: 11402950Smckusic push4((long)(*pc.cp++)); 11412080Smckusick continue; 11422080Smckusick case O_CON2: 11432080Smckusick pc.cp++; 11442080Smckusick push2(*pc.sp++); 11452080Smckusick continue; 11462080Smckusick case O_CON24: 11472080Smckusick pc.cp++; 11482950Smckusic push4((long)(*pc.sp++)); 11492080Smckusick continue; 11502080Smckusick case O_CON4: 11512080Smckusick pc.cp++; 115230057Smckusick PCLONGVAL(tl); 115330057Smckusick push4(tl); 11542080Smckusick continue; 11552080Smckusick case O_CON8: 11562080Smckusick pc.cp++; 115730057Smckusick tcp = pushsp(sizeof(double)); 115830057Smckusick blkcpy(pc.cp, tcp, sizeof(double)); 115930057Smckusick pc.dbp++; 11602080Smckusick continue; 11612080Smckusick case O_CON: 11622080Smckusick tl = *pc.cp++; 11632080Smckusick if (tl == 0) 11642080Smckusick tl = *pc.usp++; 116530057Smckusick STACKALIGN(tl1, tl); 116630057Smckusick tcp = pushsp(tl1); 11679231Smckusick blkcpy(pc.cp, tcp, tl); 11682950Smckusic pc.cp += (int)tl; 11692080Smckusick continue; 11702950Smckusic case O_CONG: 11712950Smckusic tl = *pc.cp++; 11722950Smckusic if (tl == 0) 11732950Smckusic tl = *pc.usp++; 117430057Smckusick STACKALIGN(tl1, tl); 11752950Smckusic tcp = pushsp(tl1); 11769231Smckusick blkcpy(pc.cp, tcp, tl1); 11772950Smckusic pc.cp += (int)((tl + 2) & ~1); 11782950Smckusic continue; 11792080Smckusick case O_LVCON: 11802080Smckusick tl = *pc.cp++; 11812080Smckusick if (tl == 0) 11822080Smckusick tl = *pc.usp++; 118330057Smckusick pushaddr(pc.cp); 11842080Smckusick tl = (tl + 1) & ~1; 11852950Smckusic pc.cp += (int)tl; 11862080Smckusick continue; 11872080Smckusick case O_RANG2: 11882080Smckusick tl = *pc.cp++; 11892080Smckusick if (tl == 0) 11902080Smckusick tl = *pc.sp++; 11912080Smckusick tl1 = pop2(); 11924026Smckusic push2((short)(RANG4(tl1, tl, (long)(*pc.sp++)))); 11932080Smckusick continue; 11942080Smckusick case O_RANG42: 11952080Smckusick tl = *pc.cp++; 11962080Smckusick if (tl == 0) 11972080Smckusick tl = *pc.sp++; 11982080Smckusick tl1 = pop4(); 11994026Smckusic push4(RANG4(tl1, tl, (long)(*pc.sp++))); 12002080Smckusick continue; 12012080Smckusick case O_RSNG2: 12022080Smckusick tl = *pc.cp++; 12032080Smckusick if (tl == 0) 12042080Smckusick tl = *pc.sp++; 12052080Smckusick tl1 = pop2(); 12062950Smckusic push2((short)(RSNG4(tl1, tl))); 12072080Smckusick continue; 12082080Smckusick case O_RSNG42: 12092080Smckusick tl = *pc.cp++; 12102080Smckusick if (tl == 0) 12112080Smckusick tl = *pc.sp++; 12122080Smckusick tl1 = pop4(); 12132080Smckusick push4(RSNG4(tl1, tl)); 12142080Smckusick continue; 12152080Smckusick case O_RANG4: 12164026Smckusic tl = *pc.cp++; 12174026Smckusic if (tl == 0) 121830057Smckusick PCLONGVAL(tl); 12192080Smckusick tl1 = pop4(); 122030057Smckusick PCLONGVAL(tl2); 122130057Smckusick push4(RANG4(tl1, tl, tl2)); 12222080Smckusick continue; 12232080Smckusick case O_RANG24: 12244026Smckusic tl = *pc.cp++; 12254026Smckusic if (tl == 0) 122630057Smckusick PCLONGVAL(tl); 12272080Smckusick tl1 = pop2(); 122830057Smckusick PCLONGVAL(tl2); 122930057Smckusick push2((short)(RANG4(tl1, tl, tl2))); 12302080Smckusick continue; 12312080Smckusick case O_RSNG4: 12324026Smckusic tl = *pc.cp++; 12334026Smckusic if (tl == 0) 123430057Smckusick PCLONGVAL(tl); 12354026Smckusic tl1 = pop4(); 12364026Smckusic push4(RSNG4(tl1, tl)); 12372080Smckusick continue; 12382080Smckusick case O_RSNG24: 12394026Smckusic tl = *pc.cp++; 12404026Smckusic if (tl == 0) 124130057Smckusick PCLONGVAL(tl); 12424026Smckusic tl1 = pop2(); 12434026Smckusic push2((short)(RSNG4(tl1, tl))); 12442080Smckusick continue; 12452080Smckusick case O_STLIM: 12462080Smckusick pc.cp++; 1247*36537Smckusick tl = pop4(); 1248*36537Smckusick STLIM(tl); 12492080Smckusick continue; 12502080Smckusick case O_LLIMIT: 12512080Smckusick pc.cp++; 1252*36537Smckusick tcp = popaddr(); 1253*36537Smckusick tl = pop4(); 1254*36537Smckusick LLIMIT(tcp, tl); 12552080Smckusick continue; 12562080Smckusick case O_BUFF: 12572950Smckusic BUFF((long)(*pc.cp++)); 12582080Smckusick continue; 12592080Smckusick case O_HALT: 12602080Smckusick pc.cp++; 12615682Smckusic if (_nodump == TRUE) 12625682Smckusic psexit(0); 12635682Smckusic fputs("\nCall to procedure halt\n", stderr); 12645682Smckusic backtrace("Halted"); 12655682Smckusic psexit(0); 12662080Smckusick continue; 12672080Smckusick case O_PXPBUF: 12682080Smckusick pc.cp++; 126930057Smckusick PCLONGVAL(tl); 127030057Smckusick _cntrs = tl; 127130057Smckusick PCLONGVAL(tl); 127230057Smckusick _rtns = tl; 12739231Smckusick NEW(&_pcpcount, (_cntrs + 1) * sizeof(long)); 12749231Smckusick blkclr(_pcpcount, (_cntrs + 1) * sizeof(long)); 12752080Smckusick continue; 12762080Smckusick case O_COUNT: 12772080Smckusick pc.cp++; 12782080Smckusick _pcpcount[*pc.usp++]++; 12792080Smckusick continue; 12802080Smckusick case O_CASE1OP: 12812080Smckusick tl = *pc.cp++; /* tl = number of cases */ 12822080Smckusick if (tl == 0) 12832080Smckusick tl = *pc.usp++; 12842080Smckusick tsp = pc.sp + tl; /* ptr to end of jump table */ 12852080Smckusick tcp = (char *)tsp; /* tcp = ptr to case values */ 12862080Smckusick tl1 = pop2(); /* tl1 = element to find */ 12872080Smckusick for(; tl > 0; tl--) /* look for element */ 12882080Smckusick if (tl1 == *tcp++) 12892080Smckusick break; 12902080Smckusick if (tl == 0) /* default case => error */ 12915666Smckusic CASERNG(tl1); 12922080Smckusick pc.cp += *(tsp - tl); 12932080Smckusick continue; 12942080Smckusick case O_CASE2OP: 12952080Smckusick tl = *pc.cp++; /* tl = number of cases */ 12962080Smckusick if (tl == 0) 12972080Smckusick tl = *pc.usp++; 12982080Smckusick tsp = pc.sp + tl; /* ptr to end of jump table */ 12992080Smckusick tsp1 = tsp; /* tsp1 = ptr to case values */ 13002080Smckusick tl1 = (unsigned short)pop2();/* tl1 = element to find */ 13012080Smckusick for(; tl > 0; tl--) /* look for element */ 130230057Smckusick if (tl1 == *tsp++) 13032080Smckusick break; 13042080Smckusick if (tl == 0) /* default case => error */ 13055666Smckusic CASERNG(tl1); 130630057Smckusick pc.cp += *(tsp1 - tl); 13072080Smckusick continue; 13082080Smckusick case O_CASE4OP: 13092080Smckusick tl = *pc.cp++; /* tl = number of cases */ 13102080Smckusick if (tl == 0) 13112080Smckusick tl = *pc.usp++; 131230057Smckusick tsp1 = pc.sp + tl; /* ptr to end of jump table */ 131330057Smckusick tlp = (long *)tsp1; /* tlp = ptr to case values */ 13142080Smckusick tl1 = pop4(); /* tl1 = element to find */ 131530057Smckusick for(; tl > 0; tl--) { /* look for element */ 131630057Smckusick GETLONGVAL(tl2, tlp++); 131730057Smckusick if (tl1 == tl2) 13182080Smckusick break; 131930057Smckusick } 13202080Smckusick if (tl == 0) /* default case => error */ 13215666Smckusic CASERNG(tl1); 132230057Smckusick pc.cp += *(tsp1 - tl); 13232080Smckusick continue; 13242080Smckusick case O_ADDT: 13252080Smckusick tl = *pc.cp++; /* tl has comparison length */ 13262080Smckusick if (tl == 0) 13272080Smckusick tl = *pc.usp++; 13282950Smckusic tcp = pushsp((long)(0));/* tcp pts to first arg */ 13292080Smckusick ADDT(tcp + tl, tcp + tl, tcp, tl >> 2); 13302080Smckusick popsp(tl); 13312080Smckusick continue; 13322080Smckusick case O_SUBT: 13332080Smckusick tl = *pc.cp++; /* tl has comparison length */ 13342080Smckusick if (tl == 0) 13352080Smckusick tl = *pc.usp++; 13362950Smckusic tcp = pushsp((long)(0));/* tcp pts to first arg */ 13372080Smckusick SUBT(tcp + tl, tcp + tl, tcp, tl >> 2); 13382080Smckusick popsp(tl); 13392080Smckusick continue; 13402080Smckusick case O_MULT: 13412080Smckusick tl = *pc.cp++; /* tl has comparison length */ 13422080Smckusick if (tl == 0) 13432080Smckusick tl = *pc.usp++; 13442950Smckusic tcp = pushsp((long)(0));/* tcp pts to first arg */ 13452080Smckusick MULT(tcp + tl, tcp + tl, tcp, tl >> 2); 13462080Smckusick popsp(tl); 13472080Smckusick continue; 13482080Smckusick case O_INCT: 13492080Smckusick tl = *pc.cp++; /* tl has number of args */ 13502080Smckusick if (tl == 0) 13512080Smckusick tl = *pc.usp++; 13522950Smckusic tb = INCT(); 13532950Smckusic popsp(tl*sizeof(long)); 13542950Smckusic push2((short)(tb)); 13552080Smckusick continue; 13562080Smckusick case O_CTTOT: 13572080Smckusick tl = *pc.cp++; /* tl has number of args */ 13582080Smckusick if (tl == 0) 13592080Smckusick tl = *pc.usp++; 1360*36537Smckusick tl1 = tl * sizeof(long); /* Size of all args */ 13612950Smckusic tcp = pushsp((long)(0)) + tl1; /* tcp pts to result */ 1362*36537Smckusick tl1 = pop4(); /* Pop the 4 fixed args */ 1363*36537Smckusick tl2 = pop4(); 1364*36537Smckusick tl3 = pop4(); 1365*36537Smckusick tl4 = pop4(); 1366*36537Smckusick tcp2 = pushsp((long)0); /* tcp2 -> data values */ 1367*36537Smckusick CTTOTA(tcp, tl1, tl2, tl3, tl4, tcp2); 1368*36537Smckusick popsp(tl*sizeof(long) - 4*sizeof(long)); /* Pop data */ 13692080Smckusick continue; 13702080Smckusick case O_CARD: 13712080Smckusick tl = *pc.cp++; /* tl has comparison length */ 13722080Smckusick if (tl == 0) 13732080Smckusick tl = *pc.usp++; 13742950Smckusic tcp = pushsp((long)(0));/* tcp pts to set */ 13752080Smckusick tl1 = CARD(tcp, tl); 13762080Smckusick popsp(tl); 13772950Smckusic push2((short)(tl1)); 13782080Smckusick continue; 13792080Smckusick case O_IN: 13802080Smckusick tl = *pc.cp++; /* tl has comparison length */ 13812080Smckusick if (tl == 0) 13822080Smckusick tl = *pc.usp++; 13832080Smckusick tl1 = pop4(); /* tl1 is the element */ 13842950Smckusic tcp = pushsp((long)(0));/* tcp pts to set */ 13854026Smckusic tl2 = *pc.sp++; /* lower bound */ 13862950Smckusic tb = IN(tl1, tl2, (long)(*pc.usp++), tcp); 13872080Smckusick popsp(tl); 13882950Smckusic push2((short)(tb)); 13892080Smckusick continue; 13902080Smckusick case O_ASRT: 13912080Smckusick pc.cp++; 139224938Smckusick tl = pop4(); 139324938Smckusick tcp = popaddr(); 139424938Smckusick ASRTS(tl, tcp); 13952080Smckusick continue; 13962080Smckusick case O_FOR1U: 139710792Smckusick tl1 = *pc.cp++; /* tl1 loop branch */ 139810576Smckusick if (tl1 == 0) 139910576Smckusick tl1 = *pc.sp++; 140010576Smckusick tcp = popaddr(); /* tcp = ptr to index var */ 140110792Smckusick tl = pop4(); /* tl upper bound */ 140210792Smckusick if (*tcp == tl) /* loop is done, fall through */ 140310576Smckusick continue; 140410792Smckusick *tcp += 1; /* inc index var */ 140510792Smckusick pc.cp += tl1; /* return to top of loop */ 140610576Smckusick continue; 14072080Smckusick case O_FOR2U: 140810792Smckusick tl1 = *pc.cp++; /* tl1 loop branch */ 14094026Smckusic if (tl1 == 0) 14104026Smckusic tl1 = *pc.sp++; 141110576Smckusick tsp = (short *)popaddr(); /* tsp = ptr to index var */ 141210792Smckusick tl = pop4(); /* tl upper bound */ 141310792Smckusick if (*tsp == tl) /* loop is done, fall through */ 14142080Smckusick continue; 141510792Smckusick *tsp += 1; /* inc index var */ 141610792Smckusick pc.cp += tl1; /* return to top of loop */ 14172080Smckusick continue; 14182080Smckusick case O_FOR4U: 141910792Smckusick tl1 = *pc.cp++; /* tl1 loop branch */ 14204026Smckusic if (tl1 == 0) 142110792Smckusick tl1 = *pc.sp++; 14222950Smckusic tlp = (long *)popaddr(); /* tlp = ptr to index var */ 142310792Smckusick tl = pop4(); /* tl upper bound */ 142410792Smckusick if (*tlp == tl) /* loop is done, fall through */ 14252080Smckusick continue; 142610792Smckusick *tlp += 1; /* inc index var */ 142710792Smckusick pc.cp += tl1; /* return to top of loop */ 14282080Smckusick continue; 14292080Smckusick case O_FOR1D: 143010792Smckusick tl1 = *pc.cp++; /* tl1 loop branch */ 143110576Smckusick if (tl1 == 0) 143210576Smckusick tl1 = *pc.sp++; 143310576Smckusick tcp = popaddr(); /* tcp = ptr to index var */ 143410792Smckusick tl = pop4(); /* tl upper bound */ 143510792Smckusick if (*tcp == tl) /* loop is done, fall through */ 143610576Smckusick continue; 143710792Smckusick *tcp -= 1; /* dec index var */ 143810792Smckusick pc.cp += tl1; /* return to top of loop */ 143910576Smckusick continue; 14402080Smckusick case O_FOR2D: 144110792Smckusick tl1 = *pc.cp++; /* tl1 loop branch */ 14424026Smckusic if (tl1 == 0) 14434026Smckusic tl1 = *pc.sp++; 144410576Smckusick tsp = (short *)popaddr(); /* tsp = ptr to index var */ 144510792Smckusick tl = pop4(); /* tl upper bound */ 144610792Smckusick if (*tsp == tl) /* loop is done, fall through */ 14472080Smckusick continue; 144810792Smckusick *tsp -= 1; /* dec index var */ 144910792Smckusick pc.cp += tl1; /* return to top of loop */ 14502080Smckusick continue; 14512080Smckusick case O_FOR4D: 145210792Smckusick tl1 = *pc.cp++; /* tl1 loop branch */ 14534026Smckusic if (tl1 == 0) 145410792Smckusick tl1 = *pc.sp++; 14552950Smckusic tlp = (long *)popaddr(); /* tlp = ptr to index var */ 145610792Smckusick tl = pop4(); /* tl upper bound */ 145710792Smckusick if (*tlp == tl) /* loop is done, fall through */ 14582080Smckusick continue; 145910792Smckusick *tlp -= 1; /* dec index var */ 146010792Smckusick pc.cp += tl1; /* return to top of loop */ 14612080Smckusick continue; 14622080Smckusick case O_READE: 14632080Smckusick pc.cp++; 146430057Smckusick PCLONGVAL(tl); 146530057Smckusick push2((short)(READE(curfile, base + tl))); 14662080Smckusick continue; 14672080Smckusick case O_READ4: 14682080Smckusick pc.cp++; 14692080Smckusick push4(READ4(curfile)); 14702080Smckusick continue; 14712080Smckusick case O_READC: 14722080Smckusick pc.cp++; 14732950Smckusic push2((short)(READC(curfile))); 14742080Smckusick continue; 14752080Smckusick case O_READ8: 14762080Smckusick pc.cp++; 14772080Smckusick push8(READ8(curfile)); 14782080Smckusick continue; 14792080Smckusick case O_READLN: 14802080Smckusick pc.cp++; 14812080Smckusick READLN(curfile); 14822080Smckusick continue; 14832080Smckusick case O_EOF: 14842080Smckusick pc.cp++; 1485*36537Smckusick tcp = popaddr(); 1486*36537Smckusick push2((short)(TEOF(tcp))); 14872080Smckusick continue; 14882080Smckusick case O_EOLN: 14892080Smckusick pc.cp++; 1490*36537Smckusick tcp = popaddr(); 1491*36537Smckusick push2((short)(TEOLN(tcp))); 14922080Smckusick continue; 14932080Smckusick case O_WRITEC: 1494*36537Smckusick pc.cp++; 1495*36537Smckusick ti = popint(); 1496*36537Smckusick tf = popfile(); 14972191Smckusic if (_runtst) { 1498*36537Smckusick WRITEC(curfile, ti, tf); 14992191Smckusic continue; 15002191Smckusic } 1501*36537Smckusick fputc(ti, tf); 15022080Smckusick continue; 15032080Smckusick case O_WRITES: 1504*36537Smckusick pc.cp++; /* Skip arg size */ 1505*36537Smckusick tf = popfile(); 1506*36537Smckusick ti = popint(); 1507*36537Smckusick ti2 = popint(); 1508*36537Smckusick tcp2 = popaddr(); 15092191Smckusic if (_runtst) { 1510*36537Smckusick WRITES(curfile, tf, ti, ti2, tcp2); 15112191Smckusic continue; 15122191Smckusic } 1513*36537Smckusick fwrite(tf, ti, ti2, tcp2); 15142080Smckusick continue; 15152080Smckusick case O_WRITEF: 1516*36537Smckusick tf = popfile(); 1517*36537Smckusick tcp = popaddr(); 1518*36537Smckusick tcp2 = pushsp((long)0); /* Addr of printf's args */ 15192191Smckusic if (_runtst) { 1520*36537Smckusick VWRITEF(curfile, tf, tcp, tcp2); 1521*36537Smckusick } else { 1522*36537Smckusick vfprintf(tf, tcp, tcp2); 15232191Smckusic } 1524*36537Smckusick popsp((long) 1525*36537Smckusick (*pc.cp++) - (sizeof (FILE *)) - sizeof (char *)); 15262080Smckusick continue; 15272080Smckusick case O_WRITLN: 15282080Smckusick pc.cp++; 15292191Smckusic if (_runtst) { 15302191Smckusic WRITLN(curfile); 15312191Smckusic continue; 15322191Smckusic } 15332191Smckusic fputc('\n', ACTFILE(curfile)); 15342080Smckusick continue; 15352080Smckusick case O_PAGE: 15362080Smckusick pc.cp++; 15372191Smckusic if (_runtst) { 15382191Smckusic PAGE(curfile); 15392191Smckusic continue; 15402191Smckusic } 15412950Smckusic fputc('', ACTFILE(curfile)); 15422080Smckusick continue; 15432080Smckusick case O_NAM: 15442080Smckusick pc.cp++; 15452080Smckusick tl = pop4(); 154630057Smckusick PCLONGVAL(tl1); 154730057Smckusick pushaddr(NAM(tl, base + tl1)); 15482080Smckusick continue; 15492080Smckusick case O_MAX: 15502080Smckusick tl = *pc.cp++; 15512080Smckusick if (tl == 0) 15522080Smckusick tl = *pc.usp++; 15532080Smckusick tl1 = pop4(); 15542191Smckusic if (_runtst) { 15552950Smckusic push4(MAX(tl1, tl, (long)(*pc.usp++))); 15562191Smckusic continue; 15572191Smckusic } 15582191Smckusic tl1 -= tl; 15592191Smckusic tl = *pc.usp++; 15602191Smckusic push4(tl1 > tl ? tl1 : tl); 15612080Smckusick continue; 15622080Smckusick case O_MIN: 15632080Smckusick tl = *pc.cp++; 15642080Smckusick if (tl == 0) 15652080Smckusick tl = *pc.usp++; 15662080Smckusick tl1 = pop4(); 15672080Smckusick push4(tl1 < tl ? tl1 : tl); 15682080Smckusick continue; 15692080Smckusick case O_UNIT: 15702080Smckusick pc.cp++; 15712080Smckusick curfile = UNIT(popaddr()); 15722080Smckusick continue; 15732080Smckusick case O_UNITINP: 15742080Smckusick pc.cp++; 15752080Smckusick curfile = INPUT; 15762080Smckusick continue; 15772080Smckusick case O_UNITOUT: 15782080Smckusick pc.cp++; 15792080Smckusick curfile = OUTPUT; 15802080Smckusick continue; 15812080Smckusick case O_MESSAGE: 15822080Smckusick pc.cp++; 15832080Smckusick PFLUSH(); 15842080Smckusick curfile = ERR; 15852080Smckusick continue; 15862109Smckusic case O_PUT: 15872109Smckusic pc.cp++; 15882109Smckusic PUT(curfile); 15892109Smckusic continue; 15902080Smckusick case O_GET: 15912080Smckusick pc.cp++; 15922080Smckusick GET(curfile); 15932080Smckusick continue; 15942080Smckusick case O_FNIL: 15952080Smckusick pc.cp++; 1596*36537Smckusick tcp = popaddr(); 1597*36537Smckusick pushaddr(FNIL(tcp)); 15982080Smckusick continue; 15992080Smckusick case O_DEFNAME: 16002080Smckusick pc.cp++; 1601*36537Smckusick tcp2 = popaddr(); 1602*36537Smckusick tcp = popaddr(); 1603*36537Smckusick tl = pop4(); 1604*36537Smckusick tl2 = pop4(); 1605*36537Smckusick DEFNAME((struct iorec *)tcp2, tcp, tl, tl2); 16062080Smckusick continue; 16072080Smckusick case O_RESET: 16082080Smckusick pc.cp++; 1609*36537Smckusick tcp2 = popaddr(); 1610*36537Smckusick tcp = popaddr(); 1611*36537Smckusick tl = pop4(); 1612*36537Smckusick tl2 = pop4(); 1613*36537Smckusick RESET((struct iorec *)tcp2, tcp, tl, tl2); 16142080Smckusick continue; 16152080Smckusick case O_REWRITE: 16162080Smckusick pc.cp++; 1617*36537Smckusick tcp2 = popaddr(); 1618*36537Smckusick tcp = popaddr(); 1619*36537Smckusick tl = pop4(); 1620*36537Smckusick tl2 = pop4(); 1621*36537Smckusick REWRITE((struct iorec *)tcp2, tcp, tl, tl2); 16222080Smckusick continue; 16232080Smckusick case O_FILE: 16242080Smckusick pc.cp++; 16252080Smckusick pushaddr(ACTFILE(curfile)); 16262080Smckusick continue; 16272080Smckusick case O_REMOVE: 16282080Smckusick pc.cp++; 1629*36537Smckusick tcp = popaddr(); 1630*36537Smckusick tl = pop4(); 1631*36537Smckusick REMOVE(tcp, tl); 16322080Smckusick continue; 16332080Smckusick case O_FLUSH: 16342080Smckusick pc.cp++; 1635*36537Smckusick tcp = popaddr(); 1636*36537Smckusick FLUSH((struct iorec *)tcp); 16372080Smckusick continue; 16382080Smckusick case O_PACK: 16392080Smckusick pc.cp++; 1640*36537Smckusick tl = pop4(); 1641*36537Smckusick tcp = popaddr(); 1642*36537Smckusick tcp2 = popaddr(); 1643*36537Smckusick tl1 = pop4(); 1644*36537Smckusick tl2 = pop4(); 1645*36537Smckusick tl3 = pop4(); 1646*36537Smckusick tl4 = pop4(); 1647*36537Smckusick PACK(tl, tcp, tcp2, tl1, tl2, tl3, tl4); 16482080Smckusick continue; 16492080Smckusick case O_UNPACK: 16502080Smckusick pc.cp++; 1651*36537Smckusick tl = pop4(); 1652*36537Smckusick tcp = popaddr(); 1653*36537Smckusick tcp2 = popaddr(); 1654*36537Smckusick tl1 = pop4(); 1655*36537Smckusick tl2 = pop4(); 1656*36537Smckusick tl3 = pop4(); 1657*36537Smckusick tl4 = pop4(); 1658*36537Smckusick UNPACK(tl, tcp, tcp2, tl1, tl2, tl3, tl4); 16592080Smckusick continue; 16602080Smckusick case O_ARGC: 16612080Smckusick pc.cp++; 16622950Smckusic push4((long)_argc); 16632080Smckusick continue; 16642080Smckusick case O_ARGV: 16652080Smckusick tl = *pc.cp++; /* tl = size of char array */ 16662080Smckusick if (tl == 0) 16672080Smckusick tl = *pc.usp++; 16682080Smckusick tcp = popaddr(); /* tcp = addr of char array */ 16692080Smckusick tl1 = pop4(); /* tl1 = argv subscript */ 16702080Smckusick ARGV(tl1, tcp, tl); 16712080Smckusick continue; 16722080Smckusick case O_CLCK: 16732080Smckusick pc.cp++; 16742080Smckusick push4(CLCK()); 16752080Smckusick continue; 16762080Smckusick case O_WCLCK: 16772080Smckusick pc.cp++; 16782080Smckusick push4(time(0)); 16792080Smckusick continue; 16802080Smckusick case O_SCLCK: 16812080Smckusick pc.cp++; 16822080Smckusick push4(SCLCK()); 16832080Smckusick continue; 16842080Smckusick case O_NEW: 16852080Smckusick tl = *pc.cp++; /* tl = size being new'ed */ 16862080Smckusick if (tl == 0) 16872080Smckusick tl = *pc.usp++; 16882080Smckusick tcp = popaddr(); /* ptr to ptr being new'ed */ 16899231Smckusick NEW(tcp, tl); 16902191Smckusic if (_runtst) { 16919263Smckusick blkclr(*((char **)(tcp)), tl); 16922191Smckusic } 16932080Smckusick continue; 16947961Smckusick case O_DISPOSE: 16957961Smckusick tl = *pc.cp++; /* tl = size being disposed */ 16967961Smckusick if (tl == 0) 16977961Smckusick tl = *pc.usp++; 16987961Smckusick tcp = popaddr(); /* ptr to ptr being disposed */ 16997961Smckusick DISPOSE(tcp, tl); 17007961Smckusick *(char **)tcp = (char *)0; 17017961Smckusick continue; 17027961Smckusick case O_DFDISP: 17037961Smckusick tl = *pc.cp++; /* tl = size being disposed */ 17047961Smckusick if (tl == 0) 17057961Smckusick tl = *pc.usp++; 17067961Smckusick tcp = popaddr(); /* ptr to ptr being disposed */ 17077961Smckusick DFDISPOSE(tcp, tl); 17087961Smckusick *(char **)tcp = (char *)0; 17097961Smckusick continue; 17102080Smckusick case O_DATE: 17112080Smckusick pc.cp++; 17122080Smckusick DATE(popaddr()); 17132080Smckusick continue; 17142080Smckusick case O_TIME: 17152080Smckusick pc.cp++; 17162080Smckusick TIME(popaddr()); 17172080Smckusick continue; 17182080Smckusick case O_UNDEF: 17192080Smckusick pc.cp++; 172030057Smckusick td = pop8(); 17212950Smckusic push2((short)(0)); 17222080Smckusick continue; 17232080Smckusick case O_ATAN: 17242080Smckusick pc.cp++; 1725*36537Smckusick td = pop8(); 17265723Smckusic if (_runtst) { 1727*36537Smckusick push8(ATAN(td)); 17285723Smckusic continue; 17295723Smckusic } 1730*36537Smckusick push8(atan(td)); 17312080Smckusick continue; 17322080Smckusick case O_COS: 17332080Smckusick pc.cp++; 1734*36537Smckusick td = pop8(); 17355723Smckusic if (_runtst) { 1736*36537Smckusick push8(COS(td)); 17375723Smckusic continue; 17385723Smckusic } 1739*36537Smckusick push8(cos(td)); 17402080Smckusick continue; 17412080Smckusick case O_EXP: 17422080Smckusick pc.cp++; 1743*36537Smckusick td = pop8(); 17445723Smckusic if (_runtst) { 1745*36537Smckusick push8(EXP(td)); 17465723Smckusic continue; 17475723Smckusic } 1748*36537Smckusick push8(exp(td)); 17492080Smckusick continue; 17502080Smckusick case O_LN: 17512080Smckusick pc.cp++; 1752*36537Smckusick td = pop8(); 17532191Smckusic if (_runtst) { 1754*36537Smckusick push8(LN(td)); 17552191Smckusic continue; 17562191Smckusic } 1757*36537Smckusick push8(log(td)); 17582080Smckusick continue; 17592080Smckusick case O_SIN: 17602080Smckusick pc.cp++; 1761*36537Smckusick td = pop8(); 17625723Smckusic if (_runtst) { 1763*36537Smckusick push8(SIN(td)); 17645723Smckusic continue; 17655723Smckusic } 1766*36537Smckusick push8(sin(td)); 17672080Smckusick continue; 17682080Smckusick case O_SQRT: 17692080Smckusick pc.cp++; 1770*36537Smckusick td = pop8(); 17712191Smckusic if (_runtst) { 1772*36537Smckusick push8(SQRT(td)); 17732191Smckusic continue; 17742191Smckusic } 1775*36537Smckusick push8(sqrt(td)); 17762080Smckusick continue; 17772080Smckusick case O_CHR2: 17782080Smckusick case O_CHR4: 17792080Smckusick pc.cp++; 1780*36537Smckusick tl = pop4(); 17812191Smckusic if (_runtst) { 1782*36537Smckusick push2((short)(CHR(tl))); 17832191Smckusic continue; 17842191Smckusic } 1785*36537Smckusick push2((short)tl); 17862080Smckusick continue; 17872080Smckusick case O_ODD2: 17882080Smckusick case O_ODD4: 17892080Smckusick pc.cp++; 179010576Smckusick tl = pop4(); 179110576Smckusick push2((short)(tl & 1)); 17922080Smckusick continue; 17932080Smckusick case O_SUCC2: 17942109Smckusic tl = *pc.cp++; 17952109Smckusic if (tl == 0) 17962109Smckusic tl = *pc.sp++; 17972109Smckusic tl1 = pop4(); 17982191Smckusic if (_runtst) { 17992950Smckusic push2((short)(SUCC(tl1, tl, (long)(*pc.sp++)))); 18002191Smckusic continue; 18012191Smckusic } 18022950Smckusic push2((short)(tl1 + 1)); 18032191Smckusic pc.sp++; 18042080Smckusick continue; 18052080Smckusick case O_SUCC24: 18062109Smckusic tl = *pc.cp++; 18072109Smckusic if (tl == 0) 18082109Smckusic tl = *pc.sp++; 18092109Smckusic tl1 = pop4(); 18102191Smckusic if (_runtst) { 18112950Smckusic push4(SUCC(tl1, tl, (long)(*pc.sp++))); 18122191Smckusic continue; 18132191Smckusic } 18142191Smckusic push4(tl1 + 1); 18152191Smckusic pc.sp++; 18162109Smckusic continue; 18172080Smckusick case O_SUCC4: 18182109Smckusic tl = *pc.cp++; 18192109Smckusic if (tl == 0) 182030057Smckusick PCLONGVAL(tl); 18212109Smckusic tl1 = pop4(); 18222191Smckusic if (_runtst) { 182330057Smckusick PCLONGVAL(tl2); 182430057Smckusick push4(SUCC(tl1, tl, (long)(tl2))); 18252191Smckusic continue; 18262191Smckusic } 18272191Smckusic push4(tl1 + 1); 18282191Smckusic pc.lp++; 18292080Smckusick continue; 18302080Smckusick case O_PRED2: 18312109Smckusic tl = *pc.cp++; 18322109Smckusic if (tl == 0) 18332109Smckusic tl = *pc.sp++; 18342109Smckusic tl1 = pop4(); 18352191Smckusic if (_runtst) { 18362950Smckusic push2((short)(PRED(tl1, tl, (long)(*pc.sp++)))); 18372191Smckusic continue; 18382191Smckusic } 18392950Smckusic push2((short)(tl1 - 1)); 18402191Smckusic pc.sp++; 18412080Smckusick continue; 18422080Smckusick case O_PRED24: 18432109Smckusic tl = *pc.cp++; 18442109Smckusic if (tl == 0) 18452109Smckusic tl = *pc.sp++; 18462109Smckusic tl1 = pop4(); 18472191Smckusic if (_runtst) { 18482950Smckusic push4(PRED(tl1, tl, (long)(*pc.sp++))); 18492191Smckusic continue; 18502191Smckusic } 18512191Smckusic push4(tl1 - 1); 18522191Smckusic pc.sp++; 18532109Smckusic continue; 18542080Smckusick case O_PRED4: 18552109Smckusic tl = *pc.cp++; 18562109Smckusic if (tl == 0) 185730057Smckusick PCLONGVAL(tl); 18582109Smckusic tl1 = pop4(); 18592191Smckusic if (_runtst) { 186030057Smckusick PCLONGVAL(tl2); 186130057Smckusick push4(PRED(tl1, tl, (long)(tl2))); 18622191Smckusic continue; 18632191Smckusic } 18642191Smckusic push4(tl1 - 1); 18652191Smckusic pc.lp++; 18662080Smckusick continue; 18672080Smckusick case O_SEED: 18682080Smckusick pc.cp++; 1869*36537Smckusick tl = pop4(); 1870*36537Smckusick push4(SEED(tl)); 18712080Smckusick continue; 18722080Smckusick case O_RANDOM: 18732080Smckusick pc.cp++; 1874*36537Smckusick td = pop8(); /* Argument is ignored */ 1875*36537Smckusick push8(RANDOM()); 18762080Smckusick continue; 18772080Smckusick case O_EXPO: 18782080Smckusick pc.cp++; 1879*36537Smckusick td = pop8(); 1880*36537Smckusick push4(EXPO(td)); 18812080Smckusick continue; 18822080Smckusick case O_SQR2: 18832080Smckusick case O_SQR4: 18842080Smckusick pc.cp++; 18852080Smckusick tl = pop4(); 18862080Smckusick push4(tl * tl); 18872080Smckusick continue; 18882080Smckusick case O_SQR8: 18892080Smckusick pc.cp++; 18902080Smckusick td = pop8(); 18912080Smckusick push8(td * td); 18922080Smckusick continue; 18932080Smckusick case O_ROUND: 18942080Smckusick pc.cp++; 1895*36537Smckusick td = pop8(); 1896*36537Smckusick push4(ROUND(td)); 18972080Smckusick continue; 18982080Smckusick case O_TRUNC: 18992080Smckusick pc.cp++; 1900*36537Smckusick td = pop8(); 1901*36537Smckusick push4(TRUNC(td)); 19022080Smckusick continue; 19032950Smckusic default: 19045682Smckusic ERROR("Panic: bad op code\n"); 19052950Smckusic continue; 19062080Smckusick } 19072080Smckusick } 19082080Smckusick } 1909