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