12080Smckusick /* Copyright (c) 1979 Regents of the University of California */ 22080Smckusick 3*15976Smckusick static char sccsid[] = "@(#)interp.c 1.31 02/08/84"; 42080Smckusick 52080Smckusick #include <math.h> 610576Smckusick #include <signal.h> 72950Smckusic #include "whoami.h" 810576Smckusick #include "vars.h" 92950Smckusic #include "objfmt.h" 102080Smckusick #include "h02opcs.h" 112080Smckusick #include "machdep.h" 122080Smckusick #include "libpc.h" 132080Smckusick 142080Smckusick /* 152080Smckusick * program variables 162080Smckusick */ 1710576Smckusick union display _display; 1810576Smckusick struct dispsave *_dp; 192080Smckusick long _lino = 0; 202080Smckusick int _argc; 212080Smckusick char **_argv; 222080Smckusick long _mode; 2310576Smckusick long _runtst = (long)TRUE; 242950Smckusic bool _nodump = FALSE; 252080Smckusick long _stlim = 500000; 262080Smckusick long _stcnt = 0; 272191Smckusic long _seed = 1; 2810576Smckusick #ifdef ADDR32 292080Smckusick char *_minptr = (char *)0x7fffffff; 3010576Smckusick #endif ADDR32 3110576Smckusick #ifdef ADDR16 322950Smckusic char *_minptr = (char *)0xffff; 3310576Smckusick #endif ADDR16 342080Smckusick char *_maxptr = (char *)0; 352080Smckusick long *_pcpcount = (long *)0; 362080Smckusick long _cntrs = 0; 372080Smckusick long _rtns = 0; 382080Smckusick 392080Smckusick /* 402080Smckusick * standard files 412080Smckusick */ 422080Smckusick char _inwin, _outwin, _errwin; 432950Smckusic struct iorechd _err = { 442950Smckusic &_errwin, /* fileptr */ 452080Smckusick 0, /* lcount */ 462080Smckusick 0x7fffffff, /* llimit */ 472950Smckusic &_iob[2], /* fbuf */ 482950Smckusic FILNIL, /* fchain */ 492080Smckusick STDLVL, /* flev */ 502950Smckusic "Message file", /* pfname */ 512950Smckusic FTEXT | FWRITE | EOFF, /* funit */ 522950Smckusic 2, /* fblk */ 532080Smckusick 1 /* fsize */ 542080Smckusick }; 552080Smckusick struct iorechd output = { 562080Smckusick &_outwin, /* fileptr */ 572080Smckusick 0, /* lcount */ 582080Smckusick 0x7fffffff, /* llimit */ 592080Smckusick &_iob[1], /* fbuf */ 602080Smckusick ERR, /* fchain */ 612080Smckusick STDLVL, /* flev */ 622080Smckusick "standard output", /* pfname */ 632080Smckusick FTEXT | FWRITE | EOFF, /* funit */ 642080Smckusick 1, /* fblk */ 652080Smckusick 1 /* fsize */ 662080Smckusick }; 672950Smckusic struct iorechd input = { 682950Smckusic &_inwin, /* fileptr */ 692080Smckusick 0, /* lcount */ 702080Smckusick 0x7fffffff, /* llimit */ 712950Smckusic &_iob[0], /* fbuf */ 722950Smckusic OUTPUT, /* fchain */ 732080Smckusick STDLVL, /* flev */ 742950Smckusic "standard input", /* pfname */ 757569Smckusick FTEXT|FREAD|SYNC|EOLN, /* funit */ 762950Smckusic 0, /* fblk */ 772080Smckusick 1 /* fsize */ 782080Smckusick }; 792080Smckusick 802109Smckusic /* 812950Smckusic * file record variables 822950Smckusic */ 832950Smckusic long _filefre = PREDEF; 842950Smckusic struct iorechd _fchain = { 852950Smckusic 0, 0, 0, 0, /* only use fchain field */ 862950Smckusic INPUT /* fchain */ 872950Smckusic }; 882950Smckusic struct iorec *_actfile[MAXFILES] = { 892950Smckusic INPUT, 902950Smckusic OUTPUT, 912950Smckusic ERR 922950Smckusic }; 932950Smckusic 942950Smckusic /* 955658Slinton * stuff for pdx 965658Slinton */ 975658Slinton 985658Slinton union progcntr *pcaddrp; 995658Slinton asm(".globl _loopaddr"); 1005658Slinton 1015658Slinton /* 1022109Smckusic * Px profile array 1032109Smckusic */ 1042109Smckusic #ifdef PROFILE 1052109Smckusic long _profcnts[NUMOPS]; 1062109Smckusic #endif PROFILE 1072109Smckusic 1082109Smckusic /* 1092109Smckusic * debugging variables 1102109Smckusic */ 1112109Smckusic #ifdef DEBUG 1122109Smckusic char opc[10]; 1132109Smckusic long opcptr = 9; 1142109Smckusic #endif DEBUG 1152109Smckusic 1162080Smckusick interpreter(base) 1172080Smckusick char *base; 1182080Smckusick { 1192080Smckusick union progcntr pc; /* interpreted program cntr */ 1202080Smckusick register char *vpc; /* register used for "pc" */ 1212080Smckusick struct iorec *curfile; /* active file */ 12210576Smckusick register struct blockmark *stp; /* active stack frame ptr */ 1232080Smckusick /* 1242080Smckusick * the following variables are used as scratch 1252080Smckusick */ 1262239Smckusic register char *tcp; 12710576Smckusick register short *tsp; 1282239Smckusic register long tl, tl1, tl2; 1292080Smckusick double td, td1; 1302239Smckusic struct sze8 t8; 13110576Smckusick register short *tsp1; 132*15976Smckusick long *tlp, tl3; 13310576Smckusick char *tcp1; 1342950Smckusic bool tb; 13510576Smckusick struct blockmark *tstp; 13610576Smckusick register struct formalrtn *tfp; 1372080Smckusick union progcntr tpc; 1382080Smckusick struct iorec **ip; 13910792Smckusick int mypid; 1402080Smckusick 1415658Slinton pcaddrp = &pc; 14210792Smckusick mypid = getpid(); 1435658Slinton 1442080Smckusick /* 1452239Smckusic * Setup sets up any hardware specific parameters before 1462239Smckusic * starting the interpreter. Typically this is inline replaced 1472239Smckusic * by interp.sed to utilize specific machine instructions. 1482239Smckusic */ 1492239Smckusic setup(); 1502239Smckusic /* 1512080Smckusick * necessary only on systems which do not initialize 1522080Smckusick * memory to zero 1532080Smckusick */ 1542080Smckusick for (ip = &_actfile[3]; ip < &_actfile[MAXFILES]; *ip++ = FILNIL) 1552080Smckusick /* void */; 1562080Smckusick /* 1572080Smckusick * set up global environment, then ``call'' the main program 1582080Smckusick */ 1592950Smckusic _display.frame[0].locvars = pushsp((long)(2 * sizeof(struct iorec *))); 1602950Smckusic _display.frame[0].locvars += 2 * sizeof(struct iorec *); 1612950Smckusic *(struct iorec **)(_display.frame[0].locvars + OUTPUT_OFF) = OUTPUT; 1622950Smckusic *(struct iorec **)(_display.frame[0].locvars + INPUT_OFF) = INPUT; 16310576Smckusick stp = (struct blockmark *)pushsp((long)(sizeof(struct blockmark))); 1642109Smckusic _dp = &_display.frame[0]; 1652080Smckusick pc.cp = base; 1665658Slinton 1675658Slinton asm("_loopaddr:"); 1682080Smckusick for(;;) { 1692109Smckusic # ifdef DEBUG 1702080Smckusick if (++opcptr == 10) 1712080Smckusick opcptr = 0; 1722080Smckusick opc[opcptr] = *pc.ucp; 1732109Smckusic # endif DEBUG 1742109Smckusic # ifdef PROFILE 1752109Smckusic _profcnts[*pc.ucp]++; 1762109Smckusic # endif PROFILE 1772080Smckusick switch (*pc.ucp++) { 1785658Slinton case O_BPT: /* breakpoint trap */ 1795873Slinton PFLUSH(); 18010792Smckusick kill(mypid, SIGILL); 1815658Slinton pc.ucp--; 1825658Slinton continue; 1832080Smckusick case O_NODUMP: 1842191Smckusic _nodump = TRUE; 1852080Smckusick /* and fall through */ 1862080Smckusick case O_BEG: 1872080Smckusick _dp += 1; /* enter local scope */ 1882080Smckusick stp->odisp = *_dp; /* save old display value */ 1892080Smckusick tl = *pc.ucp++; /* tl = name size */ 1902080Smckusick stp->entry = pc.hdrp; /* pointer to entry info */ 1912191Smckusic tl1 = pc.hdrp->framesze;/* tl1 = size of frame */ 1922191Smckusic _lino = pc.hdrp->offset; 1932191Smckusic _runtst = pc.hdrp->tests; 1942191Smckusic disableovrflo(); 1952191Smckusic if (_runtst) 1962191Smckusic enableovrflo(); 1972950Smckusic pc.cp += (int)tl; /* skip over proc hdr info */ 1982080Smckusick stp->file = curfile; /* save active file */ 1992080Smckusick tcp = pushsp(tl1); /* tcp = new top of stack */ 2002950Smckusic if (_runtst) /* zero stack frame */ 2019231Smckusick blkclr(tcp, tl1); 2022950Smckusic tcp += (int)tl1; /* offsets of locals are neg */ 2032109Smckusic _dp->locvars = tcp; /* set new display pointer */ 2042109Smckusic _dp->stp = stp; 2052950Smckusic stp->tos = pushsp((long)0); /* set tos pointer */ 2062080Smckusick continue; 2072080Smckusick case O_END: 2082080Smckusick PCLOSE(_dp->locvars); /* flush & close local files */ 2092080Smckusick stp = _dp->stp; 2102080Smckusick curfile = stp->file; /* restore old active file */ 2112080Smckusick *_dp = stp->odisp; /* restore old display entry */ 2122109Smckusic if (_dp == &_display.frame[1]) 2132080Smckusick return; /* exiting main proc ??? */ 2142080Smckusick _lino = stp->lino; /* restore lino, pc, dp */ 21510576Smckusick pc.cp = stp->pc; 2162080Smckusick _dp = stp->dp; 2172191Smckusic _runtst = stp->entry->tests; 2182191Smckusic disableovrflo(); 2192191Smckusic if (_runtst) 2202191Smckusic enableovrflo(); 2212109Smckusic popsp(stp->entry->framesze + /* pop local vars */ 22210576Smckusick sizeof(struct blockmark) + /* pop stack frame */ 22310576Smckusick stp->entry->nargs); /* pop parms */ 2242080Smckusick continue; 2252080Smckusick case O_CALL: 2262080Smckusick tl = *pc.cp++; 2272080Smckusick tcp = base + *pc.lp++;/* calc new entry point */ 2282080Smckusick tcp += sizeof(short); 2292080Smckusick tcp = base + *(long *)tcp; 23010576Smckusick stp = (struct blockmark *) 23110576Smckusick pushsp((long)(sizeof(struct blockmark))); 2322080Smckusick stp->lino = _lino; /* save lino, pc, dp */ 23310576Smckusick stp->pc = pc.cp; 2342080Smckusick stp->dp = _dp; 2352109Smckusic _dp = &_display.frame[tl]; /* set up new display ptr */ 2362080Smckusick pc.cp = tcp; 2372080Smckusick continue; 2382080Smckusick case O_FCALL: 2393294Smckusic pc.cp++; 2404016Smckusic tcp = popaddr(); /* ptr to display save area */ 2412080Smckusick tfp = (struct formalrtn *)popaddr(); 24210576Smckusick stp = (struct blockmark *) 24310576Smckusick pushsp((long)(sizeof(struct blockmark))); 2442080Smckusick stp->lino = _lino; /* save lino, pc, dp */ 24510576Smckusick stp->pc = pc.cp; 2462080Smckusick stp->dp = _dp; 24710576Smckusick pc.cp = (char *)(tfp->fentryaddr);/* new entry point */ 2483436Smckusic _dp = &_display.frame[tfp->fbn];/* new display ptr */ 2499231Smckusick blkcpy(&_display.frame[1], tcp, 25010576Smckusick tfp->fbn * sizeof(struct dispsave)); 2519231Smckusick blkcpy(&tfp->fdisp[0], &_display.frame[1], 25210576Smckusick tfp->fbn * sizeof(struct dispsave)); 2532080Smckusick continue; 2542080Smckusick case O_FRTN: 2552080Smckusick tl = *pc.cp++; /* tl = size of return obj */ 2562080Smckusick if (tl == 0) 2572080Smckusick tl = *pc.usp++; 2582950Smckusic tcp = pushsp((long)(0)); 2592080Smckusick tfp = *(struct formalrtn **)(tcp + tl); 2604016Smckusic tcp1 = *(char **) 2614016Smckusic (tcp + tl + sizeof(struct formalrtn *)); 2623861Smckusic if (tl != 0) { 2639231Smckusick blkcpy(tcp, tcp + sizeof(struct formalrtn *) 2649231Smckusick + sizeof(char *), tl); 2653861Smckusic } 2664016Smckusic popsp((long) 2674016Smckusic (sizeof(struct formalrtn *) + sizeof (char *))); 2689231Smckusick blkcpy(tcp1, &_display.frame[1], 26910576Smckusick tfp->fbn * sizeof(struct dispsave)); 2702080Smckusick continue; 2712080Smckusick case O_FSAV: 2722080Smckusick tfp = (struct formalrtn *)popaddr(); 2733436Smckusic tfp->fbn = *pc.cp++; /* blk number of routine */ 2743861Smckusic tcp = base + *pc.lp++; /* calc new entry point */ 2752080Smckusick tcp += sizeof(short); 27610576Smckusick tfp->fentryaddr = (long (*)())(base + *(long *)tcp); 2779231Smckusick blkcpy(&_display.frame[1], &tfp->fdisp[0], 27810576Smckusick tfp->fbn * sizeof(struct dispsave)); 2792080Smckusick pushaddr(tfp); 2802080Smckusick continue; 2812080Smckusick case O_SDUP2: 2822080Smckusick pc.cp++; 2832080Smckusick tl = pop2(); 2842950Smckusic push2((short)(tl)); 2852950Smckusic push2((short)(tl)); 2862080Smckusick continue; 2872080Smckusick case O_SDUP4: 2882080Smckusick pc.cp++; 2892080Smckusick tl = pop4(); 2902080Smckusick push4(tl); 2912080Smckusick push4(tl); 2922080Smckusick continue; 2932080Smckusick case O_TRA: 2942080Smckusick pc.cp++; 2952080Smckusick pc.cp += *pc.sp; 2962080Smckusick continue; 2972080Smckusick case O_TRA4: 2982080Smckusick pc.cp++; 2992080Smckusick pc.cp = base + *pc.lp; 3002080Smckusick continue; 3012080Smckusick case O_GOTO: 3022109Smckusic tstp = _display.frame[*pc.cp++].stp; /* ptr to 3032109Smckusic exit frame */ 3042080Smckusick pc.cp = base + *pc.lp; 3052080Smckusick stp = _dp->stp; 3062080Smckusick while (tstp != stp) { 3072109Smckusic if (_dp == &_display.frame[1]) 3083872Smckusic ERROR("Active frame not found in non-local goto\n", 0); /* exiting prog ??? */ 3092080Smckusick PCLOSE(_dp->locvars); /* close local files */ 3102080Smckusick curfile = stp->file; /* restore active file */ 3112080Smckusick *_dp = stp->odisp; /* old display entry */ 3122080Smckusick _dp = stp->dp; /* restore dp */ 3132080Smckusick stp = _dp->stp; 3142080Smckusick } 3152080Smckusick /* pop locals, stack frame, parms, and return values */ 3162950Smckusic popsp((long)(stp->tos - pushsp((long)(0)))); 3172080Smckusick continue; 3182080Smckusick case O_LINO: 3192950Smckusic if (_dp->stp->tos != pushsp((long)(0))) 3205682Smckusic ERROR("Panic: stack not empty between statements\n"); 3212080Smckusick _lino = *pc.cp++; /* set line number */ 3222080Smckusick if (_lino == 0) 3232080Smckusick _lino = *pc.sp++; 3242950Smckusic if (_runtst) { 3252950Smckusic LINO(); /* inc statement count */ 3262950Smckusic continue; 3272950Smckusic } 3282950Smckusic _stcnt++; 3292080Smckusick continue; 3302080Smckusick case O_PUSH: 3312080Smckusick tl = *pc.cp++; 3322080Smckusick if (tl == 0) 33310188Smckusick tl = *pc.lp++; 3342080Smckusick tl = (-tl + 1) & ~1; 3352080Smckusick tcp = pushsp(tl); 3362950Smckusic if (_runtst) 3379231Smckusick blkclr(tcp, tl); 3382080Smckusick continue; 3392080Smckusick case O_IF: 3402080Smckusick pc.cp++; 3412191Smckusic if (pop2()) { 3422080Smckusick pc.sp++; 3432191Smckusic continue; 3442191Smckusic } 3452191Smckusic pc.cp += *pc.sp; 3462080Smckusick continue; 3472080Smckusick case O_REL2: 3482080Smckusick tl = pop2(); 3492080Smckusick tl1 = pop2(); 3502080Smckusick goto cmplong; 3512080Smckusick case O_REL24: 3522080Smckusick tl = pop2(); 3532080Smckusick tl1 = pop4(); 3542080Smckusick goto cmplong; 3552080Smckusick case O_REL42: 3562080Smckusick tl = pop4(); 3572080Smckusick tl1 = pop2(); 3582080Smckusick goto cmplong; 3592080Smckusick case O_REL4: 3602080Smckusick tl = pop4(); 3612080Smckusick tl1 = pop4(); 3622080Smckusick cmplong: 3635682Smckusic switch (*pc.cp++) { 3642080Smckusick case releq: 3652080Smckusick push2(tl1 == tl); 3662080Smckusick continue; 3672080Smckusick case relne: 3682080Smckusick push2(tl1 != tl); 3692080Smckusick continue; 3702080Smckusick case rellt: 3712080Smckusick push2(tl1 < tl); 3722080Smckusick continue; 3732080Smckusick case relgt: 3742080Smckusick push2(tl1 > tl); 3752080Smckusick continue; 3762080Smckusick case relle: 3772080Smckusick push2(tl1 <= tl); 3782080Smckusick continue; 3792080Smckusick case relge: 3802080Smckusick push2(tl1 >= tl); 3812080Smckusick continue; 3822080Smckusick default: 3835682Smckusic ERROR("Panic: bad relation %d to REL4*\n", 3845682Smckusic *(pc.cp - 1)); 3852080Smckusick continue; 3862080Smckusick } 3872080Smckusick case O_RELG: 3882080Smckusick tl2 = *pc.cp++; /* tc has jump opcode */ 3892080Smckusick tl = *pc.usp++; /* tl has comparison length */ 3902080Smckusick tl1 = (tl + 1) & ~1; /* tl1 has arg stack length */ 3912950Smckusic tcp = pushsp((long)(0));/* tcp pts to first arg */ 3922080Smckusick switch (tl2) { 3932080Smckusick case releq: 3942950Smckusic tb = RELEQ(tl, tcp + tl1, tcp); 3952080Smckusick break; 3962080Smckusick case relne: 3972950Smckusic tb = RELNE(tl, tcp + tl1, tcp); 3982080Smckusick break; 3992080Smckusick case rellt: 4002950Smckusic tb = RELSLT(tl, tcp + tl1, tcp); 4012080Smckusick break; 4022080Smckusick case relgt: 4032950Smckusic tb = RELSGT(tl, tcp + tl1, tcp); 4042080Smckusick break; 4052080Smckusick case relle: 4062950Smckusic tb = RELSLE(tl, tcp + tl1, tcp); 4072080Smckusick break; 4082080Smckusick case relge: 4092950Smckusic tb = RELSGE(tl, tcp + tl1, tcp); 4102080Smckusick break; 4112080Smckusick default: 4125682Smckusic ERROR("Panic: bad relation %d to RELG*\n", tl2); 4132080Smckusick break; 4142080Smckusick } 4152080Smckusick popsp(tl1 << 1); 4162950Smckusic push2((short)(tb)); 4172080Smckusick continue; 4182080Smckusick case O_RELT: 4192080Smckusick tl2 = *pc.cp++; /* tc has jump opcode */ 4202080Smckusick tl1 = *pc.usp++; /* tl1 has comparison length */ 4212950Smckusic tcp = pushsp((long)(0));/* tcp pts to first arg */ 4222080Smckusick switch (tl2) { 4232080Smckusick case releq: 4242950Smckusic tb = RELEQ(tl1, tcp + tl1, tcp); 4252080Smckusick break; 4262080Smckusick case relne: 4272950Smckusic tb = RELNE(tl1, tcp + tl1, tcp); 4282080Smckusick break; 4292080Smckusick case rellt: 4302950Smckusic tb = RELTLT(tl1, tcp + tl1, tcp); 4312080Smckusick break; 4322080Smckusick case relgt: 4332950Smckusic tb = RELTGT(tl1, tcp + tl1, tcp); 4342080Smckusick break; 4352080Smckusick case relle: 4362950Smckusic tb = RELTLE(tl1, tcp + tl1, tcp); 4372080Smckusick break; 4382080Smckusick case relge: 4392950Smckusic tb = RELTGE(tl1, tcp + tl1, tcp); 4402080Smckusick break; 4412080Smckusick default: 4425682Smckusic ERROR("Panic: bad relation %d to RELT*\n", tl2); 4432080Smckusick break; 4442080Smckusick } 4452080Smckusick popsp(tl1 << 1); 4462950Smckusic push2((short)(tb)); 4472080Smckusick continue; 4482080Smckusick case O_REL28: 4492080Smckusick td = pop2(); 4502080Smckusick td1 = pop8(); 4512080Smckusick goto cmpdbl; 4522080Smckusick case O_REL48: 4532080Smckusick td = pop4(); 4542080Smckusick td1 = pop8(); 4552080Smckusick goto cmpdbl; 4562080Smckusick case O_REL82: 4572080Smckusick td = pop8(); 4582080Smckusick td1 = pop2(); 4592080Smckusick goto cmpdbl; 4602080Smckusick case O_REL84: 4612080Smckusick td = pop8(); 4622080Smckusick td1 = pop4(); 4632080Smckusick goto cmpdbl; 4642080Smckusick case O_REL8: 4652080Smckusick td = pop8(); 4662080Smckusick td1 = pop8(); 4672080Smckusick cmpdbl: 4682080Smckusick switch (*pc.cp++) { 4692080Smckusick case releq: 4702080Smckusick push2(td1 == td); 4712080Smckusick continue; 4722080Smckusick case relne: 4732080Smckusick push2(td1 != td); 4742080Smckusick continue; 4752080Smckusick case rellt: 4762080Smckusick push2(td1 < td); 4772080Smckusick continue; 4782080Smckusick case relgt: 4792080Smckusick push2(td1 > td); 4802080Smckusick continue; 4812080Smckusick case relle: 4822080Smckusick push2(td1 <= td); 4832080Smckusick continue; 4842080Smckusick case relge: 4852080Smckusick push2(td1 >= td); 4862080Smckusick continue; 4872080Smckusick default: 4885682Smckusic ERROR("Panic: bad relation %d to REL8*\n", 4895682Smckusic *(pc.cp - 1)); 4902080Smckusick continue; 4912080Smckusick } 4922080Smckusick case O_AND: 4932080Smckusick pc.cp++; 49410576Smckusick tl = pop2(); 49510576Smckusick tl1 = pop2(); 49610787Smckusick push2(tl1 & tl); 4972080Smckusick continue; 4982080Smckusick case O_OR: 4992080Smckusick pc.cp++; 50010576Smckusick tl = pop2(); 50110576Smckusick tl1 = pop2(); 50210787Smckusick push2(tl1 | tl); 5032080Smckusick continue; 5042080Smckusick case O_NOT: 5052080Smckusick pc.cp++; 50610576Smckusick tl = pop2(); 50710576Smckusick push2(tl ^ 1); 5082080Smckusick continue; 5092080Smckusick case O_AS2: 5102080Smckusick pc.cp++; 5112080Smckusick tl = pop2(); 5122080Smckusick *(short *)popaddr() = tl; 5132080Smckusick continue; 5142080Smckusick case O_AS4: 5152080Smckusick pc.cp++; 5162080Smckusick tl = pop4(); 5172080Smckusick *(long *)popaddr() = tl; 5182080Smckusick continue; 5192080Smckusick case O_AS24: 5202080Smckusick pc.cp++; 5212080Smckusick tl = pop2(); 5222080Smckusick *(long *)popaddr() = tl; 5232080Smckusick continue; 5242080Smckusick case O_AS42: 5252080Smckusick pc.cp++; 5262080Smckusick tl = pop4(); 5272080Smckusick *(short *)popaddr() = tl; 5282080Smckusick continue; 5292080Smckusick case O_AS21: 5302080Smckusick pc.cp++; 5312080Smckusick tl = pop2(); 5322080Smckusick *popaddr() = tl; 5332080Smckusick continue; 5342080Smckusick case O_AS41: 5352080Smckusick pc.cp++; 5362080Smckusick tl = pop4(); 5372080Smckusick *popaddr() = tl; 5382080Smckusick continue; 5392080Smckusick case O_AS28: 5402080Smckusick pc.cp++; 5412080Smckusick tl = pop2(); 5422080Smckusick *(double *)popaddr() = tl; 5432080Smckusick continue; 5442080Smckusick case O_AS48: 5452080Smckusick pc.cp++; 5462080Smckusick tl = pop4(); 5472080Smckusick *(double *)popaddr() = tl; 5482080Smckusick continue; 5492080Smckusick case O_AS8: 5502080Smckusick pc.cp++; 5512239Smckusic t8 = popsze8(); 5522239Smckusic *(struct sze8 *)popaddr() = t8; 5532080Smckusick continue; 5542080Smckusick case O_AS: 5552080Smckusick tl = *pc.cp++; 5562080Smckusick if (tl == 0) 5572080Smckusick tl = *pc.usp++; 5582080Smckusick tl1 = (tl + 1) & ~1; 5592950Smckusic tcp = pushsp((long)(0)); 5609231Smckusick blkcpy(tcp, *(char **)(tcp + tl1), tl); 5612080Smckusick popsp(tl1 + sizeof(char *)); 5622080Smckusick continue; 563*15976Smckusick case O_VAS: 564*15976Smckusick pc.cp++; 565*15976Smckusick tl = pop4(); 566*15976Smckusick tcp1 = popaddr(); 567*15976Smckusick tcp = popaddr(); 568*15976Smckusick blkcpy(tcp1, tcp, tl); 569*15976Smckusick continue; 5702080Smckusick case O_INX2P2: 5712080Smckusick tl = *pc.cp++; /* tl has shift amount */ 57210576Smckusick tl1 = pop2(); 57310576Smckusick tl1 = (tl1 - *pc.sp++) << tl; 57410576Smckusick tcp = popaddr(); 57510576Smckusick pushaddr(tcp + tl1); 5762080Smckusick continue; 5772080Smckusick case O_INX4P2: 5782080Smckusick tl = *pc.cp++; /* tl has shift amount */ 57910576Smckusick tl1 = pop4(); 58010576Smckusick tl1 = (tl1 - *pc.sp++) << tl; 58110576Smckusick tcp = popaddr(); 58210576Smckusick pushaddr(tcp + tl1); 5832080Smckusick continue; 5842080Smckusick case O_INX2: 5852080Smckusick tl = *pc.cp++; /* tl has element size */ 5862080Smckusick if (tl == 0) 5872080Smckusick tl = *pc.usp++; 5882080Smckusick tl1 = pop2(); /* index */ 5892080Smckusick tl2 = *pc.sp++; 59010576Smckusick tcp = popaddr(); 59110576Smckusick pushaddr(tcp + (tl1 - tl2) * tl); 5922191Smckusic tl = *pc.usp++; 5932191Smckusic if (_runtst) 5942191Smckusic SUBSC(tl1, tl2, tl); /* range check */ 5952080Smckusick continue; 5962080Smckusick case O_INX4: 5972080Smckusick tl = *pc.cp++; /* tl has element size */ 5982080Smckusick if (tl == 0) 5992080Smckusick tl = *pc.usp++; 6002080Smckusick tl1 = pop4(); /* index */ 6012080Smckusick tl2 = *pc.sp++; 60210576Smckusick tcp = popaddr(); 60310576Smckusick pushaddr(tcp + (tl1 - tl2) * tl); 6042191Smckusic tl = *pc.usp++; 6052191Smckusic if (_runtst) 6062191Smckusic SUBSC(tl1, tl2, tl); /* range check */ 6072080Smckusick continue; 608*15976Smckusick case O_VINX2: 609*15976Smckusick pc.cp++; 610*15976Smckusick tl = pop2(); /* tl has element size */ 611*15976Smckusick tl1 = pop2(); /* upper bound */ 612*15976Smckusick tl2 = pop2(); /* lower bound */ 613*15976Smckusick tl3 = pop2(); /* index */ 614*15976Smckusick tcp = popaddr(); 615*15976Smckusick pushaddr(tcp + (tl3 - tl2) * tl); 616*15976Smckusick if (_runtst) 617*15976Smckusick SUBSC(tl3, tl2, tl1); /* range check */ 618*15976Smckusick continue; 619*15976Smckusick case O_VINX24: 620*15976Smckusick pc.cp++; 621*15976Smckusick tl = pop2(); /* tl has element size */ 622*15976Smckusick tl1 = pop2(); /* upper bound */ 623*15976Smckusick tl2 = pop2(); /* lower bound */ 624*15976Smckusick tl3 = pop4(); /* index */ 625*15976Smckusick tcp = popaddr(); 626*15976Smckusick pushaddr(tcp + (tl3 - tl2) * tl); 627*15976Smckusick if (_runtst) 628*15976Smckusick SUBSC(tl3, tl2, tl1); /* range check */ 629*15976Smckusick continue; 630*15976Smckusick case O_VINX42: 631*15976Smckusick pc.cp++; 632*15976Smckusick tl = pop4(); /* tl has element size */ 633*15976Smckusick tl1 = pop4(); /* upper bound */ 634*15976Smckusick tl2 = pop4(); /* lower bound */ 635*15976Smckusick tl3 = pop2(); /* index */ 636*15976Smckusick tcp = popaddr(); 637*15976Smckusick pushaddr(tcp + (tl3 - tl2) * tl); 638*15976Smckusick if (_runtst) 639*15976Smckusick SUBSC(tl3, tl2, tl1); /* range check */ 640*15976Smckusick continue; 641*15976Smckusick case O_VINX4: 642*15976Smckusick pc.cp++; 643*15976Smckusick tl = pop4(); /* tl has element size */ 644*15976Smckusick tl1 = pop4(); /* upper bound */ 645*15976Smckusick tl2 = pop4(); /* lower bound */ 646*15976Smckusick tl3 = pop4(); /* index */ 647*15976Smckusick tcp = popaddr(); 648*15976Smckusick pushaddr(tcp + (tl3 - tl2) * tl); 649*15976Smckusick if (_runtst) 650*15976Smckusick SUBSC(tl3, tl2, tl1); /* range check */ 651*15976Smckusick continue; 6522080Smckusick case O_OFF: 6532080Smckusick tl = *pc.cp++; 6542080Smckusick if (tl == 0) 6552080Smckusick tl = *pc.usp++; 65610576Smckusick tcp = popaddr(); 65710576Smckusick pushaddr(tcp + tl); 6582080Smckusick continue; 6592080Smckusick case O_NIL: 6602080Smckusick pc.cp++; 6612080Smckusick NIL(); 6622080Smckusick continue; 6632080Smckusick case O_ADD2: 6642080Smckusick pc.cp++; 66510576Smckusick tl = pop2(); 66610576Smckusick tl1 = pop2(); 66710576Smckusick push4(tl1 + tl); 6682080Smckusick continue; 6692080Smckusick case O_ADD4: 6702080Smckusick pc.cp++; 67110576Smckusick tl = pop4(); 67210576Smckusick tl1 = pop4(); 67310576Smckusick push4(tl1 + tl); 6742080Smckusick continue; 6752080Smckusick case O_ADD24: 6762080Smckusick pc.cp++; 6772080Smckusick tl = pop2(); 67810576Smckusick tl1 = pop4(); 67910576Smckusick push4(tl1 + tl); 6802080Smckusick continue; 6812080Smckusick case O_ADD42: 6822080Smckusick pc.cp++; 6832080Smckusick tl = pop4(); 68410576Smckusick tl1 = pop2(); 68510576Smckusick push4(tl1 + tl); 6862080Smckusick continue; 6872080Smckusick case O_ADD28: 6882080Smckusick pc.cp++; 6892080Smckusick tl = pop2(); 69010576Smckusick td = pop8(); 69110576Smckusick push8(td + tl); 6922080Smckusick continue; 6932080Smckusick case O_ADD48: 6942080Smckusick pc.cp++; 6952080Smckusick tl = pop4(); 69610576Smckusick td = pop8(); 69710576Smckusick push8(td + tl); 6982080Smckusick continue; 6992080Smckusick case O_ADD82: 7002080Smckusick pc.cp++; 7012080Smckusick td = pop8(); 70210576Smckusick td1 = pop2(); 70310576Smckusick push8(td1 + td); 7042080Smckusick continue; 7052080Smckusick case O_ADD84: 7062080Smckusick pc.cp++; 7072080Smckusick td = pop8(); 70810576Smckusick td1 = pop4(); 70910576Smckusick push8(td1 + td); 7102080Smckusick continue; 7112080Smckusick case O_SUB2: 7122080Smckusick pc.cp++; 7132080Smckusick tl = pop2(); 71410576Smckusick tl1 = pop2(); 71510576Smckusick push4(tl1 - tl); 7162080Smckusick continue; 7172080Smckusick case O_SUB4: 7182080Smckusick pc.cp++; 7192080Smckusick tl = pop4(); 72010576Smckusick tl1 = pop4(); 72110576Smckusick push4(tl1 - tl); 7222080Smckusick continue; 7232080Smckusick case O_SUB24: 7242080Smckusick pc.cp++; 7252080Smckusick tl = pop2(); 72610576Smckusick tl1 = pop4(); 72710576Smckusick push4(tl1 - tl); 7282080Smckusick continue; 7292080Smckusick case O_SUB42: 7302080Smckusick pc.cp++; 7312080Smckusick tl = pop4(); 73210576Smckusick tl1 = pop2(); 73310576Smckusick push4(tl1 - tl); 7342080Smckusick continue; 7352080Smckusick case O_SUB28: 7362080Smckusick pc.cp++; 7372080Smckusick tl = pop2(); 73810576Smckusick td = pop8(); 73910576Smckusick push8(td - tl); 7402080Smckusick continue; 7412080Smckusick case O_SUB48: 7422080Smckusick pc.cp++; 7432080Smckusick tl = pop4(); 74410576Smckusick td = pop8(); 74510576Smckusick push8(td - tl); 7462080Smckusick continue; 7472080Smckusick case O_SUB82: 7482080Smckusick pc.cp++; 7492080Smckusick td = pop8(); 75010576Smckusick td1 = pop2(); 75110576Smckusick push8(td1 - td); 7522080Smckusick continue; 7532080Smckusick case O_SUB84: 7542080Smckusick pc.cp++; 7552080Smckusick td = pop8(); 75610576Smckusick td1 = pop4(); 75710576Smckusick push8(td1 - td); 7582080Smckusick continue; 7592080Smckusick case O_MUL2: 7602080Smckusick pc.cp++; 76110576Smckusick tl = pop2(); 76210576Smckusick tl1 = pop2(); 76310576Smckusick push4(tl1 * tl); 7642080Smckusick continue; 7652080Smckusick case O_MUL4: 7662080Smckusick pc.cp++; 76710576Smckusick tl = pop4(); 76810576Smckusick tl1 = pop4(); 76910576Smckusick push4(tl1 * tl); 7702080Smckusick continue; 7712080Smckusick case O_MUL24: 7722080Smckusick pc.cp++; 7732080Smckusick tl = pop2(); 77410576Smckusick tl1 = pop4(); 77510576Smckusick push4(tl1 * tl); 7762080Smckusick continue; 7772080Smckusick case O_MUL42: 7782080Smckusick pc.cp++; 7792080Smckusick tl = pop4(); 78010576Smckusick tl1 = pop2(); 78110576Smckusick push4(tl1 * tl); 7822080Smckusick continue; 7832080Smckusick case O_MUL28: 7842080Smckusick pc.cp++; 7852080Smckusick tl = pop2(); 78610576Smckusick td = pop8(); 78710576Smckusick push8(td * tl); 7882080Smckusick continue; 7892080Smckusick case O_MUL48: 7902080Smckusick pc.cp++; 7912080Smckusick tl = pop4(); 79210576Smckusick td = pop8(); 79310576Smckusick push8(td * tl); 7942080Smckusick continue; 7952080Smckusick case O_MUL82: 7962080Smckusick pc.cp++; 7972080Smckusick td = pop8(); 79810576Smckusick td1 = pop2(); 79910576Smckusick push8(td1 * td); 8002080Smckusick continue; 8012080Smckusick case O_MUL84: 8022080Smckusick pc.cp++; 8032080Smckusick td = pop8(); 80410576Smckusick td1 = pop4(); 80510576Smckusick push8(td1 * td); 8062080Smckusick continue; 8072080Smckusick case O_ABS2: 8082080Smckusick case O_ABS4: 8092080Smckusick pc.cp++; 8102080Smckusick tl = pop4(); 8112080Smckusick push4(tl >= 0 ? tl : -tl); 8122080Smckusick continue; 8132080Smckusick case O_ABS8: 8142080Smckusick pc.cp++; 8152080Smckusick td = pop8(); 8162080Smckusick push8(td >= 0.0 ? td : -td); 8172080Smckusick continue; 8182080Smckusick case O_NEG2: 8192080Smckusick pc.cp++; 8202950Smckusic push4((long)(-pop2())); 8212080Smckusick continue; 8222080Smckusick case O_NEG4: 8232080Smckusick pc.cp++; 8242080Smckusick push4(-pop4()); 8252080Smckusick continue; 8262080Smckusick case O_NEG8: 8272080Smckusick pc.cp++; 8282080Smckusick push8(-pop8()); 8292080Smckusick continue; 8302080Smckusick case O_DIV2: 8312080Smckusick pc.cp++; 8322080Smckusick tl = pop2(); 83310576Smckusick tl1 = pop2(); 83410576Smckusick push4(tl1 / tl); 8352080Smckusick continue; 8362080Smckusick case O_DIV4: 8372080Smckusick pc.cp++; 8382080Smckusick tl = pop4(); 83910576Smckusick tl1 = pop4(); 84010576Smckusick push4(tl1 / tl); 8412080Smckusick continue; 8422080Smckusick case O_DIV24: 8432080Smckusick pc.cp++; 8442080Smckusick tl = pop2(); 84510576Smckusick tl1 = pop4(); 84610576Smckusick push4(tl1 / tl); 8472080Smckusick continue; 8482080Smckusick case O_DIV42: 8492080Smckusick pc.cp++; 8502080Smckusick tl = pop4(); 85110576Smckusick tl1 = pop2(); 85210576Smckusick push4(tl1 / tl); 8532080Smckusick continue; 8542080Smckusick case O_MOD2: 8552080Smckusick pc.cp++; 8562080Smckusick tl = pop2(); 85710576Smckusick tl1 = pop2(); 85810576Smckusick push4(tl1 % tl); 8592080Smckusick continue; 8602080Smckusick case O_MOD4: 8612080Smckusick pc.cp++; 8622080Smckusick tl = pop4(); 86310576Smckusick tl1 = pop4(); 86410576Smckusick push4(tl1 % tl); 8652080Smckusick continue; 8662080Smckusick case O_MOD24: 8672080Smckusick pc.cp++; 8682080Smckusick tl = pop2(); 86910576Smckusick tl1 = pop4(); 87010576Smckusick push4(tl1 % tl); 8712080Smckusick continue; 8722080Smckusick case O_MOD42: 8732080Smckusick pc.cp++; 8742080Smckusick tl = pop4(); 87510576Smckusick tl1 = pop2(); 87610576Smckusick push4(tl1 % tl); 8772080Smckusick continue; 8782080Smckusick case O_ADD8: 8792080Smckusick pc.cp++; 88010576Smckusick td = pop8(); 88110576Smckusick td1 = pop8(); 88210787Smckusick push8(td1 + td); 8832080Smckusick continue; 8842080Smckusick case O_SUB8: 8852080Smckusick pc.cp++; 8862080Smckusick td = pop8(); 88710576Smckusick td1 = pop8(); 88810787Smckusick push8(td1 - td); 8892080Smckusick continue; 8902080Smckusick case O_MUL8: 8912080Smckusick pc.cp++; 89210576Smckusick td = pop8(); 89310576Smckusick td1 = pop8(); 89410787Smckusick push8(td1 * td); 8952080Smckusick continue; 8962080Smckusick case O_DVD8: 8972080Smckusick pc.cp++; 8982080Smckusick td = pop8(); 89910576Smckusick td1 = pop8(); 90010787Smckusick push8(td1 / td); 9012080Smckusick continue; 9022080Smckusick case O_STOI: 9032080Smckusick pc.cp++; 9042950Smckusic push4((long)(pop2())); 9052080Smckusick continue; 9062080Smckusick case O_STOD: 9072080Smckusick pc.cp++; 9082080Smckusick td = pop2(); 9092080Smckusick push8(td); 9102080Smckusick continue; 9112080Smckusick case O_ITOD: 9122080Smckusick pc.cp++; 9132080Smckusick td = pop4(); 9142080Smckusick push8(td); 9152080Smckusick continue; 9162080Smckusick case O_ITOS: 9172080Smckusick pc.cp++; 9182950Smckusic push2((short)(pop4())); 9192080Smckusick continue; 9202080Smckusick case O_DVD2: 9212080Smckusick pc.cp++; 9222080Smckusick td = pop2(); 92310576Smckusick td1 = pop2(); 92410576Smckusick push8(td1 / td); 9252080Smckusick continue; 9262080Smckusick case O_DVD4: 9272080Smckusick pc.cp++; 9282080Smckusick td = pop4(); 92910576Smckusick td1 = pop4(); 93010576Smckusick push8(td1 / td); 9312080Smckusick continue; 9322080Smckusick case O_DVD24: 9332080Smckusick pc.cp++; 9342080Smckusick td = pop2(); 93510576Smckusick td1 = pop4(); 93610576Smckusick push8(td1 / td); 9372080Smckusick continue; 9382080Smckusick case O_DVD42: 9392080Smckusick pc.cp++; 9402080Smckusick td = pop4(); 94110576Smckusick td1 = pop2(); 94210576Smckusick push8(td1 / td); 9432080Smckusick continue; 9442080Smckusick case O_DVD28: 9452080Smckusick pc.cp++; 9462080Smckusick td = pop2(); 94710576Smckusick td1 = pop8(); 94810576Smckusick push8(td1 / td); 9492080Smckusick continue; 9502080Smckusick case O_DVD48: 9512080Smckusick pc.cp++; 95210787Smckusick td = pop4(); 95310787Smckusick td1 = pop8(); 95410787Smckusick push8(td1 / td); 9552080Smckusick continue; 9562080Smckusick case O_DVD82: 9572080Smckusick pc.cp++; 9582080Smckusick td = pop8(); 95910576Smckusick td1 = pop2(); 96010576Smckusick push8(td1 / td); 9612080Smckusick continue; 9622080Smckusick case O_DVD84: 9632080Smckusick pc.cp++; 9642080Smckusick td = pop8(); 96510576Smckusick td1 = pop4(); 96610576Smckusick push8(td1 / td); 9672080Smckusick continue; 9682080Smckusick case O_RV1: 9692109Smckusic tcp = _display.raw[*pc.ucp++]; 9702950Smckusic push2((short)(*(tcp + *pc.sp++))); 9712080Smckusick continue; 9722080Smckusick case O_RV14: 9732109Smckusic tcp = _display.raw[*pc.ucp++]; 9742950Smckusic push4((long)(*(tcp + *pc.sp++))); 9752080Smckusick continue; 9762080Smckusick case O_RV2: 9772109Smckusic tcp = _display.raw[*pc.ucp++]; 9782080Smckusick push2(*(short *)(tcp + *pc.sp++)); 9792080Smckusick continue; 9802080Smckusick case O_RV24: 9812109Smckusic tcp = _display.raw[*pc.ucp++]; 9822950Smckusic push4((long)(*(short *)(tcp + *pc.sp++))); 9832080Smckusick continue; 9842080Smckusick case O_RV4: 9852109Smckusic tcp = _display.raw[*pc.ucp++]; 9862080Smckusick push4(*(long *)(tcp + *pc.sp++)); 9872080Smckusick continue; 9882080Smckusick case O_RV8: 9892109Smckusic tcp = _display.raw[*pc.ucp++]; 9902239Smckusic pushsze8(*(struct sze8 *)(tcp + *pc.sp++)); 9912080Smckusick continue; 9922080Smckusick case O_RV: 9932109Smckusic tcp = _display.raw[*pc.ucp++]; 9942080Smckusick tcp += *pc.sp++; 9952080Smckusick tl = *pc.usp++; 9962338Smckusic tcp1 = pushsp((tl + 1) & ~1); 9979231Smckusick blkcpy(tcp, tcp1, tl); 9982080Smckusick continue; 9992080Smckusick case O_LV: 10002109Smckusic tcp = _display.raw[*pc.ucp++]; 10012080Smckusick pushaddr(tcp + *pc.sp++); 10022080Smckusick continue; 10032080Smckusick case O_LRV1: 10042109Smckusic tcp = _display.raw[*pc.ucp++]; 10052950Smckusic push2((short)(*(tcp + *pc.lp++))); 10062080Smckusick continue; 10072080Smckusick case O_LRV14: 10082109Smckusic tcp = _display.raw[*pc.ucp++]; 10092950Smckusic push4((long)(*(tcp + *pc.lp++))); 10102080Smckusick continue; 10112080Smckusick case O_LRV2: 10122109Smckusic tcp = _display.raw[*pc.ucp++]; 10132080Smckusick push2(*(short *)(tcp + *pc.lp++)); 10142080Smckusick continue; 10152080Smckusick case O_LRV24: 10162109Smckusic tcp = _display.raw[*pc.ucp++]; 10172950Smckusic push4((long)(*(short *)(tcp + *pc.lp++))); 10182080Smckusick continue; 10192080Smckusick case O_LRV4: 10202109Smckusic tcp = _display.raw[*pc.ucp++]; 10212080Smckusick push4(*(long *)(tcp + *pc.lp++)); 10222080Smckusick continue; 10232080Smckusick case O_LRV8: 10242109Smckusic tcp = _display.raw[*pc.ucp++]; 10252239Smckusic pushsze8(*(struct sze8 *)(tcp + *pc.lp++)); 10262080Smckusick continue; 10272080Smckusick case O_LRV: 10282109Smckusic tcp = _display.raw[*pc.ucp++]; 10292950Smckusic tcp += (int)*pc.lp++; 10302080Smckusick tl = *pc.usp++; 10312950Smckusic tcp1 = pushsp((tl + 1) & ~1); 10329231Smckusick blkcpy(tcp, tcp1, tl); 10332080Smckusick continue; 10342080Smckusick case O_LLV: 10352109Smckusic tcp = _display.raw[*pc.ucp++]; 10362080Smckusick pushaddr(tcp + *pc.lp++); 10372080Smckusick continue; 10382080Smckusick case O_IND1: 10392080Smckusick pc.cp++; 10402950Smckusic push2((short)(*popaddr())); 10412080Smckusick continue; 10422080Smckusick case O_IND14: 10432080Smckusick pc.cp++; 10442950Smckusic push4((long)(*popaddr())); 10452080Smckusick continue; 10462080Smckusick case O_IND2: 10472080Smckusick pc.cp++; 10482080Smckusick push2(*(short *)(popaddr())); 10492080Smckusick continue; 10502080Smckusick case O_IND24: 10512080Smckusick pc.cp++; 10522950Smckusic push4((long)(*(short *)(popaddr()))); 10532080Smckusick continue; 10542080Smckusick case O_IND4: 10552080Smckusick pc.cp++; 10562080Smckusick push4(*(long *)(popaddr())); 10572080Smckusick continue; 10582080Smckusick case O_IND8: 10592080Smckusick pc.cp++; 10602239Smckusic pushsze8(*(struct sze8 *)(popaddr())); 10612080Smckusick continue; 10622080Smckusick case O_IND: 10632080Smckusick tl = *pc.cp++; 10642080Smckusick if (tl == 0) 10652080Smckusick tl = *pc.usp++; 10662080Smckusick tcp = popaddr(); 10672080Smckusick tcp1 = pushsp((tl + 1) & ~1); 10689231Smckusick blkcpy(tcp, tcp1, tl); 10692080Smckusick continue; 10702080Smckusick case O_CON1: 10712950Smckusic push2((short)(*pc.cp++)); 10722080Smckusick continue; 10732080Smckusick case O_CON14: 10742950Smckusic push4((long)(*pc.cp++)); 10752080Smckusick continue; 10762080Smckusick case O_CON2: 10772080Smckusick pc.cp++; 10782080Smckusick push2(*pc.sp++); 10792080Smckusick continue; 10802080Smckusick case O_CON24: 10812080Smckusick pc.cp++; 10822950Smckusic push4((long)(*pc.sp++)); 10832080Smckusick continue; 10842080Smckusick case O_CON4: 10852080Smckusick pc.cp++; 10862080Smckusick push4(*pc.lp++); 10872080Smckusick continue; 10882080Smckusick case O_CON8: 10892080Smckusick pc.cp++; 10902950Smckusic push8(*pc.dbp++); 10912080Smckusick continue; 10922080Smckusick case O_CON: 10932080Smckusick tl = *pc.cp++; 10942080Smckusick if (tl == 0) 10952080Smckusick tl = *pc.usp++; 10962080Smckusick tl = (tl + 1) & ~1; 10972080Smckusick tcp = pushsp(tl); 10989231Smckusick blkcpy(pc.cp, tcp, tl); 10992950Smckusic pc.cp += (int)tl; 11002080Smckusick continue; 11012950Smckusic case O_CONG: 11022950Smckusic tl = *pc.cp++; 11032950Smckusic if (tl == 0) 11042950Smckusic tl = *pc.usp++; 11052950Smckusic tl1 = (tl + 1) & ~1; 11062950Smckusic tcp = pushsp(tl1); 11079231Smckusick blkcpy(pc.cp, tcp, tl1); 11082950Smckusic pc.cp += (int)((tl + 2) & ~1); 11092950Smckusic continue; 11102080Smckusick case O_LVCON: 11112080Smckusick tl = *pc.cp++; 11122080Smckusick if (tl == 0) 11132080Smckusick tl = *pc.usp++; 11142080Smckusick tl = (tl + 1) & ~1; 11152080Smckusick pushaddr(pc.cp); 11162950Smckusic pc.cp += (int)tl; 11172080Smckusick continue; 11182080Smckusick case O_RANG2: 11192080Smckusick tl = *pc.cp++; 11202080Smckusick if (tl == 0) 11212080Smckusick tl = *pc.sp++; 11222080Smckusick tl1 = pop2(); 11234026Smckusic push2((short)(RANG4(tl1, tl, (long)(*pc.sp++)))); 11242080Smckusick continue; 11252080Smckusick case O_RANG42: 11262080Smckusick tl = *pc.cp++; 11272080Smckusick if (tl == 0) 11282080Smckusick tl = *pc.sp++; 11292080Smckusick tl1 = pop4(); 11304026Smckusic push4(RANG4(tl1, tl, (long)(*pc.sp++))); 11312080Smckusick continue; 11322080Smckusick case O_RSNG2: 11332080Smckusick tl = *pc.cp++; 11342080Smckusick if (tl == 0) 11352080Smckusick tl = *pc.sp++; 11362080Smckusick tl1 = pop2(); 11372950Smckusic push2((short)(RSNG4(tl1, tl))); 11382080Smckusick continue; 11392080Smckusick case O_RSNG42: 11402080Smckusick tl = *pc.cp++; 11412080Smckusick if (tl == 0) 11422080Smckusick tl = *pc.sp++; 11432080Smckusick tl1 = pop4(); 11442080Smckusick push4(RSNG4(tl1, tl)); 11452080Smckusick continue; 11462080Smckusick case O_RANG4: 11474026Smckusic tl = *pc.cp++; 11484026Smckusic if (tl == 0) 11494026Smckusic tl = *pc.lp++; 11502080Smckusick tl1 = pop4(); 11512080Smckusick push4(RANG4(tl1, tl, *pc.lp++)); 11522080Smckusick continue; 11532080Smckusick case O_RANG24: 11544026Smckusic tl = *pc.cp++; 11554026Smckusic if (tl == 0) 11564026Smckusic tl = *pc.lp++; 11572080Smckusick tl1 = pop2(); 11582950Smckusic push2((short)(RANG4(tl1, tl, *pc.lp++))); 11592080Smckusick continue; 11602080Smckusick case O_RSNG4: 11614026Smckusic tl = *pc.cp++; 11624026Smckusic if (tl == 0) 11634026Smckusic tl = *pc.lp++; 11644026Smckusic tl1 = pop4(); 11654026Smckusic push4(RSNG4(tl1, tl)); 11662080Smckusick continue; 11672080Smckusick case O_RSNG24: 11684026Smckusic tl = *pc.cp++; 11694026Smckusic if (tl == 0) 11704026Smckusic tl = *pc.lp++; 11714026Smckusic tl1 = pop2(); 11724026Smckusic push2((short)(RSNG4(tl1, tl))); 11732080Smckusick continue; 11742080Smckusick case O_STLIM: 11752080Smckusick pc.cp++; 11762121Smckusic STLIM(); 11772950Smckusic popsp((long)(sizeof(long))); 11782080Smckusick continue; 11792080Smckusick case O_LLIMIT: 11802080Smckusick pc.cp++; 11812080Smckusick LLIMIT(); 11822950Smckusic popsp((long)(sizeof(char *)+sizeof(long))); 11832080Smckusick continue; 11842080Smckusick case O_BUFF: 11852950Smckusic BUFF((long)(*pc.cp++)); 11862080Smckusick continue; 11872080Smckusick case O_HALT: 11882080Smckusick pc.cp++; 11895682Smckusic if (_nodump == TRUE) 11905682Smckusic psexit(0); 11915682Smckusic fputs("\nCall to procedure halt\n", stderr); 11925682Smckusic backtrace("Halted"); 11935682Smckusic psexit(0); 11942080Smckusick continue; 11952080Smckusick case O_PXPBUF: 11962080Smckusick pc.cp++; 11972080Smckusick _cntrs = *pc.lp++; 11982080Smckusick _rtns = *pc.lp++; 11999231Smckusick NEW(&_pcpcount, (_cntrs + 1) * sizeof(long)); 12009231Smckusick blkclr(_pcpcount, (_cntrs + 1) * sizeof(long)); 12012080Smckusick continue; 12022080Smckusick case O_COUNT: 12032080Smckusick pc.cp++; 12042080Smckusick _pcpcount[*pc.usp++]++; 12052080Smckusick continue; 12062080Smckusick case O_CASE1OP: 12072080Smckusick tl = *pc.cp++; /* tl = number of cases */ 12082080Smckusick if (tl == 0) 12092080Smckusick tl = *pc.usp++; 12102080Smckusick tsp = pc.sp + tl; /* ptr to end of jump table */ 12112080Smckusick tcp = (char *)tsp; /* tcp = ptr to case values */ 12122080Smckusick tl1 = pop2(); /* tl1 = element to find */ 12132080Smckusick for(; tl > 0; tl--) /* look for element */ 12142080Smckusick if (tl1 == *tcp++) 12152080Smckusick break; 12162080Smckusick if (tl == 0) /* default case => error */ 12175666Smckusic CASERNG(tl1); 12182080Smckusick pc.cp += *(tsp - tl); 12192080Smckusick continue; 12202080Smckusick case O_CASE2OP: 12212080Smckusick tl = *pc.cp++; /* tl = number of cases */ 12222080Smckusick if (tl == 0) 12232080Smckusick tl = *pc.usp++; 12242080Smckusick tsp = pc.sp + tl; /* ptr to end of jump table */ 12252080Smckusick tsp1 = tsp; /* tsp1 = ptr to case values */ 12262080Smckusick tl1 = (unsigned short)pop2();/* tl1 = element to find */ 12272080Smckusick for(; tl > 0; tl--) /* look for element */ 12282080Smckusick if (tl1 == *tsp1++) 12292080Smckusick break; 12302080Smckusick if (tl == 0) /* default case => error */ 12315666Smckusic CASERNG(tl1); 12322080Smckusick pc.cp += *(tsp - tl); 12332080Smckusick continue; 12342080Smckusick case O_CASE4OP: 12352080Smckusick tl = *pc.cp++; /* tl = number of cases */ 12362080Smckusick if (tl == 0) 12372080Smckusick tl = *pc.usp++; 12382080Smckusick tsp = pc.sp + tl; /* ptr to end of jump table */ 12392080Smckusick tlp = (long *)tsp; /* tlp = ptr to case values */ 12402080Smckusick tl1 = pop4(); /* tl1 = element to find */ 12412080Smckusick for(; tl > 0; tl--) /* look for element */ 12422080Smckusick if (tl1 == *tlp++) 12432080Smckusick break; 12442080Smckusick if (tl == 0) /* default case => error */ 12455666Smckusic CASERNG(tl1); 12462080Smckusick pc.cp += *(tsp - tl); 12472080Smckusick continue; 12482080Smckusick case O_ADDT: 12492080Smckusick tl = *pc.cp++; /* tl has comparison length */ 12502080Smckusick if (tl == 0) 12512080Smckusick tl = *pc.usp++; 12522950Smckusic tcp = pushsp((long)(0));/* tcp pts to first arg */ 12532080Smckusick ADDT(tcp + tl, tcp + tl, tcp, tl >> 2); 12542080Smckusick popsp(tl); 12552080Smckusick continue; 12562080Smckusick case O_SUBT: 12572080Smckusick tl = *pc.cp++; /* tl has comparison length */ 12582080Smckusick if (tl == 0) 12592080Smckusick tl = *pc.usp++; 12602950Smckusic tcp = pushsp((long)(0));/* tcp pts to first arg */ 12612080Smckusick SUBT(tcp + tl, tcp + tl, tcp, tl >> 2); 12622080Smckusick popsp(tl); 12632080Smckusick continue; 12642080Smckusick case O_MULT: 12652080Smckusick tl = *pc.cp++; /* tl has comparison length */ 12662080Smckusick if (tl == 0) 12672080Smckusick tl = *pc.usp++; 12682950Smckusic tcp = pushsp((long)(0));/* tcp pts to first arg */ 12692080Smckusick MULT(tcp + tl, tcp + tl, tcp, tl >> 2); 12702080Smckusick popsp(tl); 12712080Smckusick continue; 12722080Smckusick case O_INCT: 12732080Smckusick tl = *pc.cp++; /* tl has number of args */ 12742080Smckusick if (tl == 0) 12752080Smckusick tl = *pc.usp++; 12762950Smckusic tb = INCT(); 12772950Smckusic popsp(tl*sizeof(long)); 12782950Smckusic push2((short)(tb)); 12792080Smckusick continue; 12802080Smckusick case O_CTTOT: 12812080Smckusick tl = *pc.cp++; /* tl has number of args */ 12822080Smckusick if (tl == 0) 12832080Smckusick tl = *pc.usp++; 12842080Smckusick tl1 = tl * sizeof(long); 12852950Smckusic tcp = pushsp((long)(0)) + tl1; /* tcp pts to result */ 12862080Smckusick CTTOT(tcp); 12872950Smckusic popsp(tl*sizeof(long)); 12882080Smckusick continue; 12892080Smckusick case O_CARD: 12902080Smckusick tl = *pc.cp++; /* tl has comparison length */ 12912080Smckusick if (tl == 0) 12922080Smckusick tl = *pc.usp++; 12932950Smckusic tcp = pushsp((long)(0));/* tcp pts to set */ 12942080Smckusick tl1 = CARD(tcp, tl); 12952080Smckusick popsp(tl); 12962950Smckusic push2((short)(tl1)); 12972080Smckusick continue; 12982080Smckusick case O_IN: 12992080Smckusick tl = *pc.cp++; /* tl has comparison length */ 13002080Smckusick if (tl == 0) 13012080Smckusick tl = *pc.usp++; 13022080Smckusick tl1 = pop4(); /* tl1 is the element */ 13032950Smckusic tcp = pushsp((long)(0));/* tcp pts to set */ 13044026Smckusic tl2 = *pc.sp++; /* lower bound */ 13052950Smckusic tb = IN(tl1, tl2, (long)(*pc.usp++), tcp); 13062080Smckusick popsp(tl); 13072950Smckusic push2((short)(tb)); 13082080Smckusick continue; 13092080Smckusick case O_ASRT: 13102080Smckusick pc.cp++; 13119231Smckusick ASRTS(); 13127923Smckusick popsp((long)(sizeof(long)+sizeof(char *))); 13132080Smckusick continue; 13142080Smckusick case O_FOR1U: 131510792Smckusick tl1 = *pc.cp++; /* tl1 loop branch */ 131610576Smckusick if (tl1 == 0) 131710576Smckusick tl1 = *pc.sp++; 131810576Smckusick tcp = popaddr(); /* tcp = ptr to index var */ 131910792Smckusick tl = pop4(); /* tl upper bound */ 132010792Smckusick if (*tcp == tl) /* loop is done, fall through */ 132110576Smckusick continue; 132210792Smckusick *tcp += 1; /* inc index var */ 132310792Smckusick pc.cp += tl1; /* return to top of loop */ 132410576Smckusick continue; 13252080Smckusick case O_FOR2U: 132610792Smckusick tl1 = *pc.cp++; /* tl1 loop branch */ 13274026Smckusic if (tl1 == 0) 13284026Smckusic tl1 = *pc.sp++; 132910576Smckusick tsp = (short *)popaddr(); /* tsp = ptr to index var */ 133010792Smckusick tl = pop4(); /* tl upper bound */ 133110792Smckusick if (*tsp == tl) /* loop is done, fall through */ 13322080Smckusick continue; 133310792Smckusick *tsp += 1; /* inc index var */ 133410792Smckusick pc.cp += tl1; /* return to top of loop */ 13352080Smckusick continue; 13362080Smckusick case O_FOR4U: 133710792Smckusick tl1 = *pc.cp++; /* tl1 loop branch */ 13384026Smckusic if (tl1 == 0) 133910792Smckusick tl1 = *pc.sp++; 13402950Smckusic tlp = (long *)popaddr(); /* tlp = ptr to index var */ 134110792Smckusick tl = pop4(); /* tl upper bound */ 134210792Smckusick if (*tlp == tl) /* loop is done, fall through */ 13432080Smckusick continue; 134410792Smckusick *tlp += 1; /* inc index var */ 134510792Smckusick pc.cp += tl1; /* return to top of loop */ 13462080Smckusick continue; 13472080Smckusick case O_FOR1D: 134810792Smckusick tl1 = *pc.cp++; /* tl1 loop branch */ 134910576Smckusick if (tl1 == 0) 135010576Smckusick tl1 = *pc.sp++; 135110576Smckusick tcp = popaddr(); /* tcp = ptr to index var */ 135210792Smckusick tl = pop4(); /* tl upper bound */ 135310792Smckusick if (*tcp == tl) /* loop is done, fall through */ 135410576Smckusick continue; 135510792Smckusick *tcp -= 1; /* dec index var */ 135610792Smckusick pc.cp += tl1; /* return to top of loop */ 135710576Smckusick continue; 13582080Smckusick case O_FOR2D: 135910792Smckusick tl1 = *pc.cp++; /* tl1 loop branch */ 13604026Smckusic if (tl1 == 0) 13614026Smckusic tl1 = *pc.sp++; 136210576Smckusick tsp = (short *)popaddr(); /* tsp = ptr to index var */ 136310792Smckusick tl = pop4(); /* tl upper bound */ 136410792Smckusick if (*tsp == tl) /* loop is done, fall through */ 13652080Smckusick continue; 136610792Smckusick *tsp -= 1; /* dec index var */ 136710792Smckusick pc.cp += tl1; /* return to top of loop */ 13682080Smckusick continue; 13692080Smckusick case O_FOR4D: 137010792Smckusick tl1 = *pc.cp++; /* tl1 loop branch */ 13714026Smckusic if (tl1 == 0) 137210792Smckusick tl1 = *pc.sp++; 13732950Smckusic tlp = (long *)popaddr(); /* tlp = ptr to index var */ 137410792Smckusick tl = pop4(); /* tl upper bound */ 137510792Smckusick if (*tlp == tl) /* loop is done, fall through */ 13762080Smckusick continue; 137710792Smckusick *tlp -= 1; /* dec index var */ 137810792Smckusick pc.cp += tl1; /* return to top of loop */ 13792080Smckusick continue; 13802080Smckusick case O_READE: 13812080Smckusick pc.cp++; 13822950Smckusic push2((short)(READE(curfile, base + *pc.lp++))); 13832080Smckusick continue; 13842080Smckusick case O_READ4: 13852080Smckusick pc.cp++; 13862080Smckusick push4(READ4(curfile)); 13872080Smckusick continue; 13882080Smckusick case O_READC: 13892080Smckusick pc.cp++; 13902950Smckusic push2((short)(READC(curfile))); 13912080Smckusick continue; 13922080Smckusick case O_READ8: 13932080Smckusick pc.cp++; 13942080Smckusick push8(READ8(curfile)); 13952080Smckusick continue; 13962080Smckusick case O_READLN: 13972080Smckusick pc.cp++; 13982080Smckusick READLN(curfile); 13992080Smckusick continue; 14002080Smckusick case O_EOF: 14012080Smckusick pc.cp++; 14022950Smckusic push2((short)(TEOF(popaddr()))); 14032080Smckusick continue; 14042080Smckusick case O_EOLN: 14052080Smckusick pc.cp++; 14062950Smckusic push2((short)(TEOLN(popaddr()))); 14072080Smckusick continue; 14082080Smckusick case O_WRITEC: 14092191Smckusic if (_runtst) { 14102191Smckusic WRITEC(curfile); 14113166Smckusic popsp((long)(*pc.cp++)); 14122191Smckusic continue; 14132191Smckusic } 14142191Smckusic fputc(); 14153166Smckusic popsp((long)(*pc.cp++)); 14162080Smckusick continue; 14172080Smckusick case O_WRITES: 14182191Smckusic if (_runtst) { 14192191Smckusic WRITES(curfile); 14203166Smckusic popsp((long)(*pc.cp++)); 14212191Smckusic continue; 14222191Smckusic } 14232191Smckusic fwrite(); 14243166Smckusic popsp((long)(*pc.cp++)); 14252080Smckusick continue; 14262080Smckusick case O_WRITEF: 14272191Smckusic if (_runtst) { 14282191Smckusic WRITEF(curfile); 14293166Smckusic popsp((long)(*pc.cp++)); 14302191Smckusic continue; 14312191Smckusic } 14322191Smckusic fprintf(); 14333166Smckusic popsp((long)(*pc.cp++)); 14342080Smckusick continue; 14352080Smckusick case O_WRITLN: 14362080Smckusick pc.cp++; 14372191Smckusic if (_runtst) { 14382191Smckusic WRITLN(curfile); 14392191Smckusic continue; 14402191Smckusic } 14412191Smckusic fputc('\n', ACTFILE(curfile)); 14422080Smckusick continue; 14432080Smckusick case O_PAGE: 14442080Smckusick pc.cp++; 14452191Smckusic if (_runtst) { 14462191Smckusic PAGE(curfile); 14472191Smckusic continue; 14482191Smckusic } 14492950Smckusic fputc('', ACTFILE(curfile)); 14502080Smckusick continue; 14512080Smckusick case O_NAM: 14522080Smckusick pc.cp++; 14532080Smckusick tl = pop4(); 14542080Smckusick pushaddr(NAM(tl, base + *pc.lp++)); 14552080Smckusick continue; 14562080Smckusick case O_MAX: 14572080Smckusick tl = *pc.cp++; 14582080Smckusick if (tl == 0) 14592080Smckusick tl = *pc.usp++; 14602080Smckusick tl1 = pop4(); 14612191Smckusic if (_runtst) { 14622950Smckusic push4(MAX(tl1, tl, (long)(*pc.usp++))); 14632191Smckusic continue; 14642191Smckusic } 14652191Smckusic tl1 -= tl; 14662191Smckusic tl = *pc.usp++; 14672191Smckusic push4(tl1 > tl ? tl1 : tl); 14682080Smckusick continue; 14692080Smckusick case O_MIN: 14702080Smckusick tl = *pc.cp++; 14712080Smckusick if (tl == 0) 14722080Smckusick tl = *pc.usp++; 14732080Smckusick tl1 = pop4(); 14742080Smckusick push4(tl1 < tl ? tl1 : tl); 14752080Smckusick continue; 14762080Smckusick case O_UNIT: 14772080Smckusick pc.cp++; 14782080Smckusick curfile = UNIT(popaddr()); 14792080Smckusick continue; 14802080Smckusick case O_UNITINP: 14812080Smckusick pc.cp++; 14822080Smckusick curfile = INPUT; 14832080Smckusick continue; 14842080Smckusick case O_UNITOUT: 14852080Smckusick pc.cp++; 14862080Smckusick curfile = OUTPUT; 14872080Smckusick continue; 14882080Smckusick case O_MESSAGE: 14892080Smckusick pc.cp++; 14902080Smckusick PFLUSH(); 14912080Smckusick curfile = ERR; 14922080Smckusick continue; 14932109Smckusic case O_PUT: 14942109Smckusic pc.cp++; 14952109Smckusic PUT(curfile); 14962109Smckusic continue; 14972080Smckusick case O_GET: 14982080Smckusick pc.cp++; 14992080Smckusick GET(curfile); 15002080Smckusick continue; 15012080Smckusick case O_FNIL: 15022080Smckusick pc.cp++; 15032080Smckusick pushaddr(FNIL(popaddr())); 15042080Smckusick continue; 15052080Smckusick case O_DEFNAME: 15062080Smckusick pc.cp++; 15072080Smckusick DEFNAME(); 15082950Smckusic popsp((long)(2*sizeof(char *)+2*sizeof(long))); 15092080Smckusick continue; 15102080Smckusick case O_RESET: 15112080Smckusick pc.cp++; 15122080Smckusick RESET(); 15132950Smckusic popsp((long)(2*sizeof(char *)+2*sizeof(long))); 15142080Smckusick continue; 15152080Smckusick case O_REWRITE: 15162080Smckusick pc.cp++; 15172080Smckusick REWRITE(); 15182950Smckusic popsp((long)(2*sizeof(char *)+2*sizeof(long))); 15192080Smckusick continue; 15202080Smckusick case O_FILE: 15212080Smckusick pc.cp++; 15222080Smckusick pushaddr(ACTFILE(curfile)); 15232080Smckusick continue; 15242080Smckusick case O_REMOVE: 15252080Smckusick pc.cp++; 15262080Smckusick REMOVE(); 15272950Smckusic popsp((long)(sizeof(char *)+sizeof(long))); 15282080Smckusick continue; 15292080Smckusick case O_FLUSH: 15302080Smckusick pc.cp++; 15312080Smckusick FLUSH(); 15322950Smckusic popsp((long)(sizeof(char *))); 15332080Smckusick continue; 15342080Smckusick case O_PACK: 15352080Smckusick pc.cp++; 15362080Smckusick PACK(); 15372950Smckusic popsp((long)(5*sizeof(long)+2*sizeof(char*))); 15382080Smckusick continue; 15392080Smckusick case O_UNPACK: 15402080Smckusick pc.cp++; 15412080Smckusick UNPACK(); 15422950Smckusic popsp((long)(5*sizeof(long)+2*sizeof(char*))); 15432080Smckusick continue; 15442080Smckusick case O_ARGC: 15452080Smckusick pc.cp++; 15462950Smckusic push4((long)_argc); 15472080Smckusick continue; 15482080Smckusick case O_ARGV: 15492080Smckusick tl = *pc.cp++; /* tl = size of char array */ 15502080Smckusick if (tl == 0) 15512080Smckusick tl = *pc.usp++; 15522080Smckusick tcp = popaddr(); /* tcp = addr of char array */ 15532080Smckusick tl1 = pop4(); /* tl1 = argv subscript */ 15542080Smckusick ARGV(tl1, tcp, tl); 15552080Smckusick continue; 15562080Smckusick case O_CLCK: 15572080Smckusick pc.cp++; 15582080Smckusick push4(CLCK()); 15592080Smckusick continue; 15602080Smckusick case O_WCLCK: 15612080Smckusick pc.cp++; 15622080Smckusick push4(time(0)); 15632080Smckusick continue; 15642080Smckusick case O_SCLCK: 15652080Smckusick pc.cp++; 15662080Smckusick push4(SCLCK()); 15672080Smckusick continue; 15682080Smckusick case O_NEW: 15692080Smckusick tl = *pc.cp++; /* tl = size being new'ed */ 15702080Smckusick if (tl == 0) 15712080Smckusick tl = *pc.usp++; 15722080Smckusick tcp = popaddr(); /* ptr to ptr being new'ed */ 15739231Smckusick NEW(tcp, tl); 15742191Smckusic if (_runtst) { 15759263Smckusick blkclr(*((char **)(tcp)), tl); 15762191Smckusic } 15772080Smckusick continue; 15787961Smckusick case O_DISPOSE: 15797961Smckusick tl = *pc.cp++; /* tl = size being disposed */ 15807961Smckusick if (tl == 0) 15817961Smckusick tl = *pc.usp++; 15827961Smckusick tcp = popaddr(); /* ptr to ptr being disposed */ 15837961Smckusick DISPOSE(tcp, tl); 15847961Smckusick *(char **)tcp = (char *)0; 15857961Smckusick continue; 15867961Smckusick case O_DFDISP: 15877961Smckusick tl = *pc.cp++; /* tl = size being disposed */ 15887961Smckusick if (tl == 0) 15897961Smckusick tl = *pc.usp++; 15907961Smckusick tcp = popaddr(); /* ptr to ptr being disposed */ 15917961Smckusick DFDISPOSE(tcp, tl); 15927961Smckusick *(char **)tcp = (char *)0; 15937961Smckusick continue; 15942080Smckusick case O_DATE: 15952080Smckusick pc.cp++; 15962080Smckusick DATE(popaddr()); 15972080Smckusick continue; 15982080Smckusick case O_TIME: 15992080Smckusick pc.cp++; 16002080Smckusick TIME(popaddr()); 16012080Smckusick continue; 16022080Smckusick case O_UNDEF: 16032080Smckusick pc.cp++; 16042080Smckusick pop8(); 16052950Smckusic push2((short)(0)); 16062080Smckusick continue; 16072080Smckusick case O_ATAN: 16082080Smckusick pc.cp++; 16095723Smckusic if (_runtst) { 16105723Smckusic push8(ATAN(pop8())); 16115723Smckusic continue; 16125723Smckusic } 16132080Smckusick push8(atan(pop8())); 16142080Smckusick continue; 16152080Smckusick case O_COS: 16162080Smckusick pc.cp++; 16175723Smckusic if (_runtst) { 16185723Smckusic push8(COS(pop8())); 16195723Smckusic continue; 16205723Smckusic } 16212080Smckusick push8(cos(pop8())); 16222080Smckusick continue; 16232080Smckusick case O_EXP: 16242080Smckusick pc.cp++; 16255723Smckusic if (_runtst) { 16265723Smckusic push8(EXP(pop8())); 16275723Smckusic continue; 16285723Smckusic } 16292080Smckusick push8(exp(pop8())); 16302080Smckusick continue; 16312080Smckusick case O_LN: 16322080Smckusick pc.cp++; 16332191Smckusic if (_runtst) { 16342191Smckusic push8(LN(pop8())); 16352191Smckusic continue; 16362191Smckusic } 16372191Smckusic push8(log(pop8())); 16382080Smckusick continue; 16392080Smckusick case O_SIN: 16402080Smckusick pc.cp++; 16415723Smckusic if (_runtst) { 16425723Smckusic push8(SIN(pop8())); 16435723Smckusic continue; 16445723Smckusic } 16452080Smckusick push8(sin(pop8())); 16462080Smckusick continue; 16472080Smckusick case O_SQRT: 16482080Smckusick pc.cp++; 16492191Smckusic if (_runtst) { 16502191Smckusic push8(SQRT(pop8())); 16512191Smckusic continue; 16522191Smckusic } 16532191Smckusic push8(sqrt(pop8())); 16542080Smckusick continue; 16552080Smckusick case O_CHR2: 16562080Smckusick case O_CHR4: 16572080Smckusick pc.cp++; 16582191Smckusic if (_runtst) { 16592950Smckusic push2((short)(CHR(pop4()))); 16602191Smckusic continue; 16612191Smckusic } 16622950Smckusic push2((short)(pop4())); 16632080Smckusick continue; 16642080Smckusick case O_ODD2: 16652080Smckusick case O_ODD4: 16662080Smckusick pc.cp++; 166710576Smckusick tl = pop4(); 166810576Smckusick push2((short)(tl & 1)); 16692080Smckusick continue; 16702080Smckusick case O_SUCC2: 16712109Smckusic tl = *pc.cp++; 16722109Smckusic if (tl == 0) 16732109Smckusic tl = *pc.sp++; 16742109Smckusic tl1 = pop4(); 16752191Smckusic if (_runtst) { 16762950Smckusic push2((short)(SUCC(tl1, tl, (long)(*pc.sp++)))); 16772191Smckusic continue; 16782191Smckusic } 16792950Smckusic push2((short)(tl1 + 1)); 16802191Smckusic pc.sp++; 16812080Smckusick continue; 16822080Smckusick case O_SUCC24: 16832109Smckusic tl = *pc.cp++; 16842109Smckusic if (tl == 0) 16852109Smckusic tl = *pc.sp++; 16862109Smckusic tl1 = pop4(); 16872191Smckusic if (_runtst) { 16882950Smckusic push4(SUCC(tl1, tl, (long)(*pc.sp++))); 16892191Smckusic continue; 16902191Smckusic } 16912191Smckusic push4(tl1 + 1); 16922191Smckusic pc.sp++; 16932109Smckusic continue; 16942080Smckusick case O_SUCC4: 16952109Smckusic tl = *pc.cp++; 16962109Smckusic if (tl == 0) 16972109Smckusic tl = *pc.lp++; 16982109Smckusic tl1 = pop4(); 16992191Smckusic if (_runtst) { 17002950Smckusic push4(SUCC(tl1, tl, (long)(*pc.lp++))); 17012191Smckusic continue; 17022191Smckusic } 17032191Smckusic push4(tl1 + 1); 17042191Smckusic pc.lp++; 17052080Smckusick continue; 17062080Smckusick case O_PRED2: 17072109Smckusic tl = *pc.cp++; 17082109Smckusic if (tl == 0) 17092109Smckusic tl = *pc.sp++; 17102109Smckusic tl1 = pop4(); 17112191Smckusic if (_runtst) { 17122950Smckusic push2((short)(PRED(tl1, tl, (long)(*pc.sp++)))); 17132191Smckusic continue; 17142191Smckusic } 17152950Smckusic push2((short)(tl1 - 1)); 17162191Smckusic pc.sp++; 17172080Smckusick continue; 17182080Smckusick case O_PRED24: 17192109Smckusic tl = *pc.cp++; 17202109Smckusic if (tl == 0) 17212109Smckusic tl = *pc.sp++; 17222109Smckusic tl1 = pop4(); 17232191Smckusic if (_runtst) { 17242950Smckusic push4(PRED(tl1, tl, (long)(*pc.sp++))); 17252191Smckusic continue; 17262191Smckusic } 17272191Smckusic push4(tl1 - 1); 17282191Smckusic pc.sp++; 17292109Smckusic continue; 17302080Smckusick case O_PRED4: 17312109Smckusic tl = *pc.cp++; 17322109Smckusic if (tl == 0) 17332109Smckusic tl = *pc.lp++; 17342109Smckusic tl1 = pop4(); 17352191Smckusic if (_runtst) { 17362950Smckusic push4(PRED(tl1, tl, (long)(*pc.lp++))); 17372191Smckusic continue; 17382191Smckusic } 17392191Smckusic push4(tl1 - 1); 17402191Smckusic pc.lp++; 17412080Smckusick continue; 17422080Smckusick case O_SEED: 17432080Smckusick pc.cp++; 17442080Smckusick push4(SEED(pop4())); 17452080Smckusick continue; 17462080Smckusick case O_RANDOM: 17472080Smckusick pc.cp++; 17482080Smckusick push8(RANDOM(pop8())); 17492080Smckusick continue; 17502080Smckusick case O_EXPO: 17512080Smckusick pc.cp++; 17522080Smckusick push4(EXPO(pop8())); 17532080Smckusick continue; 17542080Smckusick case O_SQR2: 17552080Smckusick case O_SQR4: 17562080Smckusick pc.cp++; 17572080Smckusick tl = pop4(); 17582080Smckusick push4(tl * tl); 17592080Smckusick continue; 17602080Smckusick case O_SQR8: 17612080Smckusick pc.cp++; 17622080Smckusick td = pop8(); 17632080Smckusick push8(td * td); 17642080Smckusick continue; 17652080Smckusick case O_ROUND: 17662080Smckusick pc.cp++; 17672080Smckusick push4(ROUND(pop8())); 17682080Smckusick continue; 17692080Smckusick case O_TRUNC: 17702080Smckusick pc.cp++; 17712080Smckusick push4(TRUNC(pop8())); 17722080Smckusick continue; 17732950Smckusic default: 17745682Smckusic ERROR("Panic: bad op code\n"); 17752950Smckusic continue; 17762080Smckusick } 17772080Smckusick } 17782080Smckusick } 1779