122152Sdist /* 222152Sdist * Copyright (c) 1980 Regents of the University of California. 322152Sdist * All rights reserved. The Berkeley software License Agreement 422152Sdist * specifies the terms and conditions for redistribution. 522152Sdist */ 62080Smckusick 722152Sdist #ifndef lint 8*24938Smckusick static char sccsid[] = "@(#)interp.c 5.3 (Berkeley) 09/18/85"; 922152Sdist #endif not lint 102080Smckusick 112080Smckusick #include <math.h> 1210576Smckusick #include <signal.h> 132950Smckusic #include "whoami.h" 1410576Smckusick #include "vars.h" 152950Smckusic #include "objfmt.h" 162080Smckusick #include "h02opcs.h" 172080Smckusick #include "machdep.h" 182080Smckusick #include "libpc.h" 192080Smckusick 202080Smckusick /* 212080Smckusick * program variables 222080Smckusick */ 2310576Smckusick union display _display; 2410576Smckusick struct dispsave *_dp; 252080Smckusick long _lino = 0; 262080Smckusick int _argc; 272080Smckusick char **_argv; 282080Smckusick long _mode; 2910576Smckusick long _runtst = (long)TRUE; 302950Smckusic bool _nodump = FALSE; 312080Smckusick long _stlim = 500000; 322080Smckusick long _stcnt = 0; 332191Smckusic long _seed = 1; 3410576Smckusick #ifdef ADDR32 352080Smckusick char *_minptr = (char *)0x7fffffff; 3610576Smckusick #endif ADDR32 3710576Smckusick #ifdef ADDR16 382950Smckusic char *_minptr = (char *)0xffff; 3910576Smckusick #endif ADDR16 402080Smckusick char *_maxptr = (char *)0; 412080Smckusick long *_pcpcount = (long *)0; 422080Smckusick long _cntrs = 0; 432080Smckusick long _rtns = 0; 442080Smckusick 452080Smckusick /* 462080Smckusick * standard files 472080Smckusick */ 482080Smckusick char _inwin, _outwin, _errwin; 492950Smckusic struct iorechd _err = { 502950Smckusic &_errwin, /* fileptr */ 512080Smckusick 0, /* lcount */ 522080Smckusick 0x7fffffff, /* llimit */ 532950Smckusic &_iob[2], /* fbuf */ 542950Smckusic FILNIL, /* fchain */ 552080Smckusick STDLVL, /* flev */ 562950Smckusic "Message file", /* pfname */ 572950Smckusic FTEXT | FWRITE | EOFF, /* funit */ 582950Smckusic 2, /* fblk */ 592080Smckusick 1 /* fsize */ 602080Smckusick }; 612080Smckusick struct iorechd output = { 622080Smckusick &_outwin, /* fileptr */ 632080Smckusick 0, /* lcount */ 642080Smckusick 0x7fffffff, /* llimit */ 652080Smckusick &_iob[1], /* fbuf */ 662080Smckusick ERR, /* fchain */ 672080Smckusick STDLVL, /* flev */ 682080Smckusick "standard output", /* pfname */ 692080Smckusick FTEXT | FWRITE | EOFF, /* funit */ 702080Smckusick 1, /* fblk */ 712080Smckusick 1 /* fsize */ 722080Smckusick }; 732950Smckusic struct iorechd input = { 742950Smckusic &_inwin, /* fileptr */ 752080Smckusick 0, /* lcount */ 762080Smckusick 0x7fffffff, /* llimit */ 772950Smckusic &_iob[0], /* fbuf */ 782950Smckusic OUTPUT, /* fchain */ 792080Smckusick STDLVL, /* flev */ 802950Smckusic "standard input", /* pfname */ 817569Smckusick FTEXT|FREAD|SYNC|EOLN, /* funit */ 822950Smckusic 0, /* fblk */ 832080Smckusick 1 /* fsize */ 842080Smckusick }; 852080Smckusick 862109Smckusic /* 872950Smckusic * file record variables 882950Smckusic */ 892950Smckusic long _filefre = PREDEF; 902950Smckusic struct iorechd _fchain = { 912950Smckusic 0, 0, 0, 0, /* only use fchain field */ 922950Smckusic INPUT /* fchain */ 932950Smckusic }; 942950Smckusic struct iorec *_actfile[MAXFILES] = { 952950Smckusic INPUT, 962950Smckusic OUTPUT, 972950Smckusic ERR 982950Smckusic }; 992950Smckusic 1002950Smckusic /* 1015658Slinton * stuff for pdx 1025658Slinton */ 1035658Slinton 1045658Slinton union progcntr *pcaddrp; 1055658Slinton asm(".globl _loopaddr"); 1065658Slinton 1075658Slinton /* 1082109Smckusic * Px profile array 1092109Smckusic */ 1102109Smckusic #ifdef PROFILE 1112109Smckusic long _profcnts[NUMOPS]; 1122109Smckusic #endif PROFILE 1132109Smckusic 1142109Smckusic /* 1152109Smckusic * debugging variables 1162109Smckusic */ 1172109Smckusic #ifdef DEBUG 1182109Smckusic char opc[10]; 1192109Smckusic long opcptr = 9; 1202109Smckusic #endif DEBUG 1212109Smckusic 1222080Smckusick interpreter(base) 1232080Smckusick char *base; 1242080Smckusick { 1252080Smckusick union progcntr pc; /* interpreted program cntr */ 1262080Smckusick register char *vpc; /* register used for "pc" */ 1272080Smckusick struct iorec *curfile; /* active file */ 12810576Smckusick register struct blockmark *stp; /* active stack frame ptr */ 1292080Smckusick /* 1302080Smckusick * the following variables are used as scratch 1312080Smckusick */ 1322239Smckusic register char *tcp; 13310576Smckusick register short *tsp; 1342239Smckusic register long tl, tl1, tl2; 1352080Smckusick double td, td1; 1362239Smckusic struct sze8 t8; 13710576Smckusick register short *tsp1; 13815976Smckusick long *tlp, tl3; 13910576Smckusick char *tcp1; 1402950Smckusic bool tb; 14110576Smckusick struct blockmark *tstp; 14210576Smckusick register struct formalrtn *tfp; 1432080Smckusick union progcntr tpc; 1442080Smckusick struct iorec **ip; 14510792Smckusick int mypid; 1462080Smckusick 1475658Slinton pcaddrp = &pc; 14810792Smckusick mypid = getpid(); 1495658Slinton 1502080Smckusick /* 1512239Smckusic * Setup sets up any hardware specific parameters before 1522239Smckusic * starting the interpreter. Typically this is inline replaced 1532239Smckusic * by interp.sed to utilize specific machine instructions. 1542239Smckusic */ 1552239Smckusic setup(); 1562239Smckusic /* 1572080Smckusick * necessary only on systems which do not initialize 1582080Smckusick * memory to zero 1592080Smckusick */ 1602080Smckusick for (ip = &_actfile[3]; ip < &_actfile[MAXFILES]; *ip++ = FILNIL) 1612080Smckusick /* void */; 1622080Smckusick /* 1632080Smckusick * set up global environment, then ``call'' the main program 1642080Smckusick */ 1652950Smckusic _display.frame[0].locvars = pushsp((long)(2 * sizeof(struct iorec *))); 1662950Smckusic _display.frame[0].locvars += 2 * sizeof(struct iorec *); 1672950Smckusic *(struct iorec **)(_display.frame[0].locvars + OUTPUT_OFF) = OUTPUT; 1682950Smckusic *(struct iorec **)(_display.frame[0].locvars + INPUT_OFF) = INPUT; 16910576Smckusick stp = (struct blockmark *)pushsp((long)(sizeof(struct blockmark))); 1702109Smckusic _dp = &_display.frame[0]; 1712080Smckusick pc.cp = base; 1725658Slinton 1735658Slinton asm("_loopaddr:"); 1742080Smckusick for(;;) { 1752109Smckusic # ifdef DEBUG 1762080Smckusick if (++opcptr == 10) 1772080Smckusick opcptr = 0; 1782080Smckusick opc[opcptr] = *pc.ucp; 1792109Smckusic # endif DEBUG 1802109Smckusic # ifdef PROFILE 1812109Smckusic _profcnts[*pc.ucp]++; 1822109Smckusic # endif PROFILE 1832080Smckusick switch (*pc.ucp++) { 1845658Slinton case O_BPT: /* breakpoint trap */ 1855873Slinton PFLUSH(); 18610792Smckusick kill(mypid, SIGILL); 1875658Slinton pc.ucp--; 1885658Slinton continue; 1892080Smckusick case O_NODUMP: 1902191Smckusic _nodump = TRUE; 1912080Smckusick /* and fall through */ 1922080Smckusick case O_BEG: 1932080Smckusick _dp += 1; /* enter local scope */ 1942080Smckusick stp->odisp = *_dp; /* save old display value */ 1952080Smckusick tl = *pc.ucp++; /* tl = name size */ 1962080Smckusick stp->entry = pc.hdrp; /* pointer to entry info */ 1972191Smckusic tl1 = pc.hdrp->framesze;/* tl1 = size of frame */ 1982191Smckusic _lino = pc.hdrp->offset; 1992191Smckusic _runtst = pc.hdrp->tests; 2002191Smckusic disableovrflo(); 2012191Smckusic if (_runtst) 2022191Smckusic enableovrflo(); 2032950Smckusic pc.cp += (int)tl; /* skip over proc hdr info */ 2042080Smckusick stp->file = curfile; /* save active file */ 2052080Smckusick tcp = pushsp(tl1); /* tcp = new top of stack */ 2062950Smckusic if (_runtst) /* zero stack frame */ 2079231Smckusick blkclr(tcp, tl1); 2082950Smckusic tcp += (int)tl1; /* offsets of locals are neg */ 2092109Smckusic _dp->locvars = tcp; /* set new display pointer */ 2102109Smckusic _dp->stp = stp; 2112950Smckusic stp->tos = pushsp((long)0); /* set tos pointer */ 2122080Smckusick continue; 2132080Smckusick case O_END: 2142080Smckusick PCLOSE(_dp->locvars); /* flush & close local files */ 2152080Smckusick stp = _dp->stp; 2162080Smckusick curfile = stp->file; /* restore old active file */ 2172080Smckusick *_dp = stp->odisp; /* restore old display entry */ 2182109Smckusic if (_dp == &_display.frame[1]) 2192080Smckusick return; /* exiting main proc ??? */ 2202080Smckusick _lino = stp->lino; /* restore lino, pc, dp */ 22110576Smckusick pc.cp = stp->pc; 2222080Smckusick _dp = stp->dp; 2232191Smckusic _runtst = stp->entry->tests; 2242191Smckusic disableovrflo(); 2252191Smckusic if (_runtst) 2262191Smckusic enableovrflo(); 2272109Smckusic popsp(stp->entry->framesze + /* pop local vars */ 22810576Smckusick sizeof(struct blockmark) + /* pop stack frame */ 22910576Smckusick stp->entry->nargs); /* pop parms */ 2302080Smckusick continue; 2312080Smckusick case O_CALL: 2322080Smckusick tl = *pc.cp++; 2332080Smckusick tcp = base + *pc.lp++;/* calc new entry point */ 2342080Smckusick tcp += sizeof(short); 2352080Smckusick tcp = base + *(long *)tcp; 23610576Smckusick stp = (struct blockmark *) 23710576Smckusick pushsp((long)(sizeof(struct blockmark))); 2382080Smckusick stp->lino = _lino; /* save lino, pc, dp */ 23910576Smckusick stp->pc = pc.cp; 2402080Smckusick stp->dp = _dp; 2412109Smckusic _dp = &_display.frame[tl]; /* set up new display ptr */ 2422080Smckusick pc.cp = tcp; 2432080Smckusick continue; 2442080Smckusick case O_FCALL: 2453294Smckusic pc.cp++; 2464016Smckusic tcp = popaddr(); /* ptr to display save area */ 2472080Smckusick tfp = (struct formalrtn *)popaddr(); 24810576Smckusick stp = (struct blockmark *) 24910576Smckusick pushsp((long)(sizeof(struct blockmark))); 2502080Smckusick stp->lino = _lino; /* save lino, pc, dp */ 25110576Smckusick stp->pc = pc.cp; 2522080Smckusick stp->dp = _dp; 25310576Smckusick pc.cp = (char *)(tfp->fentryaddr);/* new entry point */ 2543436Smckusic _dp = &_display.frame[tfp->fbn];/* new display ptr */ 2559231Smckusick blkcpy(&_display.frame[1], tcp, 25610576Smckusick tfp->fbn * sizeof(struct dispsave)); 2579231Smckusick blkcpy(&tfp->fdisp[0], &_display.frame[1], 25810576Smckusick tfp->fbn * sizeof(struct dispsave)); 2592080Smckusick continue; 2602080Smckusick case O_FRTN: 2612080Smckusick tl = *pc.cp++; /* tl = size of return obj */ 2622080Smckusick if (tl == 0) 2632080Smckusick tl = *pc.usp++; 2642950Smckusic tcp = pushsp((long)(0)); 2652080Smckusick tfp = *(struct formalrtn **)(tcp + tl); 2664016Smckusic tcp1 = *(char **) 2674016Smckusic (tcp + tl + sizeof(struct formalrtn *)); 2683861Smckusic if (tl != 0) { 2699231Smckusick blkcpy(tcp, tcp + sizeof(struct formalrtn *) 2709231Smckusick + sizeof(char *), tl); 2713861Smckusic } 2724016Smckusic popsp((long) 2734016Smckusic (sizeof(struct formalrtn *) + sizeof (char *))); 2749231Smckusick blkcpy(tcp1, &_display.frame[1], 27510576Smckusick tfp->fbn * sizeof(struct dispsave)); 2762080Smckusick continue; 2772080Smckusick case O_FSAV: 2782080Smckusick tfp = (struct formalrtn *)popaddr(); 2793436Smckusic tfp->fbn = *pc.cp++; /* blk number of routine */ 2803861Smckusic tcp = base + *pc.lp++; /* calc new entry point */ 2812080Smckusick tcp += sizeof(short); 28210576Smckusick tfp->fentryaddr = (long (*)())(base + *(long *)tcp); 2839231Smckusick blkcpy(&_display.frame[1], &tfp->fdisp[0], 28410576Smckusick tfp->fbn * sizeof(struct dispsave)); 2852080Smckusick pushaddr(tfp); 2862080Smckusick continue; 2872080Smckusick case O_SDUP2: 2882080Smckusick pc.cp++; 2892080Smckusick tl = pop2(); 2902950Smckusic push2((short)(tl)); 2912950Smckusic push2((short)(tl)); 2922080Smckusick continue; 2932080Smckusick case O_SDUP4: 2942080Smckusick pc.cp++; 2952080Smckusick tl = pop4(); 2962080Smckusick push4(tl); 2972080Smckusick push4(tl); 2982080Smckusick continue; 2992080Smckusick case O_TRA: 3002080Smckusick pc.cp++; 3012080Smckusick pc.cp += *pc.sp; 3022080Smckusick continue; 3032080Smckusick case O_TRA4: 3042080Smckusick pc.cp++; 3052080Smckusick pc.cp = base + *pc.lp; 3062080Smckusick continue; 3072080Smckusick case O_GOTO: 3082109Smckusic tstp = _display.frame[*pc.cp++].stp; /* ptr to 3092109Smckusic exit frame */ 3102080Smckusick pc.cp = base + *pc.lp; 3112080Smckusick stp = _dp->stp; 3122080Smckusick while (tstp != stp) { 3132109Smckusic if (_dp == &_display.frame[1]) 3143872Smckusic ERROR("Active frame not found in non-local goto\n", 0); /* exiting prog ??? */ 3152080Smckusick PCLOSE(_dp->locvars); /* close local files */ 3162080Smckusick curfile = stp->file; /* restore active file */ 3172080Smckusick *_dp = stp->odisp; /* old display entry */ 3182080Smckusick _dp = stp->dp; /* restore dp */ 3192080Smckusick stp = _dp->stp; 3202080Smckusick } 3212080Smckusick /* pop locals, stack frame, parms, and return values */ 3222950Smckusic popsp((long)(stp->tos - pushsp((long)(0)))); 3232080Smckusick continue; 3242080Smckusick case O_LINO: 3252950Smckusic if (_dp->stp->tos != pushsp((long)(0))) 3265682Smckusic ERROR("Panic: stack not empty between statements\n"); 3272080Smckusick _lino = *pc.cp++; /* set line number */ 3282080Smckusick if (_lino == 0) 3292080Smckusick _lino = *pc.sp++; 3302950Smckusic if (_runtst) { 3312950Smckusic LINO(); /* inc statement count */ 3322950Smckusic continue; 3332950Smckusic } 3342950Smckusic _stcnt++; 3352080Smckusick continue; 3362080Smckusick case O_PUSH: 3372080Smckusick tl = *pc.cp++; 3382080Smckusick if (tl == 0) 33910188Smckusick tl = *pc.lp++; 3402080Smckusick tl = (-tl + 1) & ~1; 3412080Smckusick tcp = pushsp(tl); 3422950Smckusic if (_runtst) 3439231Smckusick blkclr(tcp, tl); 3442080Smckusick continue; 3452080Smckusick case O_IF: 3462080Smckusick pc.cp++; 3472191Smckusic if (pop2()) { 3482080Smckusick pc.sp++; 3492191Smckusic continue; 3502191Smckusic } 3512191Smckusic pc.cp += *pc.sp; 3522080Smckusick continue; 3532080Smckusick case O_REL2: 3542080Smckusick tl = pop2(); 3552080Smckusick tl1 = pop2(); 3562080Smckusick goto cmplong; 3572080Smckusick case O_REL24: 3582080Smckusick tl = pop2(); 3592080Smckusick tl1 = pop4(); 3602080Smckusick goto cmplong; 3612080Smckusick case O_REL42: 3622080Smckusick tl = pop4(); 3632080Smckusick tl1 = pop2(); 3642080Smckusick goto cmplong; 3652080Smckusick case O_REL4: 3662080Smckusick tl = pop4(); 3672080Smckusick tl1 = pop4(); 3682080Smckusick cmplong: 3695682Smckusic switch (*pc.cp++) { 3702080Smckusick case releq: 3712080Smckusick push2(tl1 == tl); 3722080Smckusick continue; 3732080Smckusick case relne: 3742080Smckusick push2(tl1 != tl); 3752080Smckusick continue; 3762080Smckusick case rellt: 3772080Smckusick push2(tl1 < tl); 3782080Smckusick continue; 3792080Smckusick case relgt: 3802080Smckusick push2(tl1 > tl); 3812080Smckusick continue; 3822080Smckusick case relle: 3832080Smckusick push2(tl1 <= tl); 3842080Smckusick continue; 3852080Smckusick case relge: 3862080Smckusick push2(tl1 >= tl); 3872080Smckusick continue; 3882080Smckusick default: 3895682Smckusic ERROR("Panic: bad relation %d to REL4*\n", 3905682Smckusic *(pc.cp - 1)); 3912080Smckusick continue; 3922080Smckusick } 3932080Smckusick case O_RELG: 3942080Smckusick tl2 = *pc.cp++; /* tc has jump opcode */ 3952080Smckusick tl = *pc.usp++; /* tl has comparison length */ 3962080Smckusick tl1 = (tl + 1) & ~1; /* tl1 has arg stack length */ 3972950Smckusic tcp = pushsp((long)(0));/* tcp pts to first arg */ 3982080Smckusick switch (tl2) { 3992080Smckusick case releq: 4002950Smckusic tb = RELEQ(tl, tcp + tl1, tcp); 4012080Smckusick break; 4022080Smckusick case relne: 4032950Smckusic tb = RELNE(tl, tcp + tl1, tcp); 4042080Smckusick break; 4052080Smckusick case rellt: 4062950Smckusic tb = RELSLT(tl, tcp + tl1, tcp); 4072080Smckusick break; 4082080Smckusick case relgt: 4092950Smckusic tb = RELSGT(tl, tcp + tl1, tcp); 4102080Smckusick break; 4112080Smckusick case relle: 4122950Smckusic tb = RELSLE(tl, tcp + tl1, tcp); 4132080Smckusick break; 4142080Smckusick case relge: 4152950Smckusic tb = RELSGE(tl, tcp + tl1, tcp); 4162080Smckusick break; 4172080Smckusick default: 4185682Smckusic ERROR("Panic: bad relation %d to RELG*\n", tl2); 4192080Smckusick break; 4202080Smckusick } 4212080Smckusick popsp(tl1 << 1); 4222950Smckusic push2((short)(tb)); 4232080Smckusick continue; 4242080Smckusick case O_RELT: 4252080Smckusick tl2 = *pc.cp++; /* tc has jump opcode */ 4262080Smckusick tl1 = *pc.usp++; /* tl1 has comparison length */ 4272950Smckusic tcp = pushsp((long)(0));/* tcp pts to first arg */ 4282080Smckusick switch (tl2) { 4292080Smckusick case releq: 4302950Smckusic tb = RELEQ(tl1, tcp + tl1, tcp); 4312080Smckusick break; 4322080Smckusick case relne: 4332950Smckusic tb = RELNE(tl1, tcp + tl1, tcp); 4342080Smckusick break; 4352080Smckusick case rellt: 4362950Smckusic tb = RELTLT(tl1, tcp + tl1, tcp); 4372080Smckusick break; 4382080Smckusick case relgt: 4392950Smckusic tb = RELTGT(tl1, tcp + tl1, tcp); 4402080Smckusick break; 4412080Smckusick case relle: 4422950Smckusic tb = RELTLE(tl1, tcp + tl1, tcp); 4432080Smckusick break; 4442080Smckusick case relge: 4452950Smckusic tb = RELTGE(tl1, tcp + tl1, tcp); 4462080Smckusick break; 4472080Smckusick default: 4485682Smckusic ERROR("Panic: bad relation %d to RELT*\n", tl2); 4492080Smckusick break; 4502080Smckusick } 4512080Smckusick popsp(tl1 << 1); 4522950Smckusic push2((short)(tb)); 4532080Smckusick continue; 4542080Smckusick case O_REL28: 4552080Smckusick td = pop2(); 4562080Smckusick td1 = pop8(); 4572080Smckusick goto cmpdbl; 4582080Smckusick case O_REL48: 4592080Smckusick td = pop4(); 4602080Smckusick td1 = pop8(); 4612080Smckusick goto cmpdbl; 4622080Smckusick case O_REL82: 4632080Smckusick td = pop8(); 4642080Smckusick td1 = pop2(); 4652080Smckusick goto cmpdbl; 4662080Smckusick case O_REL84: 4672080Smckusick td = pop8(); 4682080Smckusick td1 = pop4(); 4692080Smckusick goto cmpdbl; 4702080Smckusick case O_REL8: 4712080Smckusick td = pop8(); 4722080Smckusick td1 = pop8(); 4732080Smckusick cmpdbl: 4742080Smckusick switch (*pc.cp++) { 4752080Smckusick case releq: 4762080Smckusick push2(td1 == td); 4772080Smckusick continue; 4782080Smckusick case relne: 4792080Smckusick push2(td1 != td); 4802080Smckusick continue; 4812080Smckusick case rellt: 4822080Smckusick push2(td1 < td); 4832080Smckusick continue; 4842080Smckusick case relgt: 4852080Smckusick push2(td1 > td); 4862080Smckusick continue; 4872080Smckusick case relle: 4882080Smckusick push2(td1 <= td); 4892080Smckusick continue; 4902080Smckusick case relge: 4912080Smckusick push2(td1 >= td); 4922080Smckusick continue; 4932080Smckusick default: 4945682Smckusic ERROR("Panic: bad relation %d to REL8*\n", 4955682Smckusic *(pc.cp - 1)); 4962080Smckusick continue; 4972080Smckusick } 4982080Smckusick case O_AND: 4992080Smckusick pc.cp++; 50010576Smckusick tl = pop2(); 50110576Smckusick tl1 = pop2(); 50210787Smckusick push2(tl1 & tl); 5032080Smckusick continue; 5042080Smckusick case O_OR: 5052080Smckusick pc.cp++; 50610576Smckusick tl = pop2(); 50710576Smckusick tl1 = pop2(); 50810787Smckusick push2(tl1 | tl); 5092080Smckusick continue; 5102080Smckusick case O_NOT: 5112080Smckusick pc.cp++; 51210576Smckusick tl = pop2(); 51310576Smckusick push2(tl ^ 1); 5142080Smckusick continue; 5152080Smckusick case O_AS2: 5162080Smckusick pc.cp++; 5172080Smckusick tl = pop2(); 5182080Smckusick *(short *)popaddr() = tl; 5192080Smckusick continue; 5202080Smckusick case O_AS4: 5212080Smckusick pc.cp++; 5222080Smckusick tl = pop4(); 5232080Smckusick *(long *)popaddr() = tl; 5242080Smckusick continue; 5252080Smckusick case O_AS24: 5262080Smckusick pc.cp++; 5272080Smckusick tl = pop2(); 5282080Smckusick *(long *)popaddr() = tl; 5292080Smckusick continue; 5302080Smckusick case O_AS42: 5312080Smckusick pc.cp++; 5322080Smckusick tl = pop4(); 5332080Smckusick *(short *)popaddr() = tl; 5342080Smckusick continue; 5352080Smckusick case O_AS21: 5362080Smckusick pc.cp++; 5372080Smckusick tl = pop2(); 5382080Smckusick *popaddr() = tl; 5392080Smckusick continue; 5402080Smckusick case O_AS41: 5412080Smckusick pc.cp++; 5422080Smckusick tl = pop4(); 5432080Smckusick *popaddr() = tl; 5442080Smckusick continue; 5452080Smckusick case O_AS28: 5462080Smckusick pc.cp++; 5472080Smckusick tl = pop2(); 5482080Smckusick *(double *)popaddr() = tl; 5492080Smckusick continue; 5502080Smckusick case O_AS48: 5512080Smckusick pc.cp++; 5522080Smckusick tl = pop4(); 5532080Smckusick *(double *)popaddr() = tl; 5542080Smckusick continue; 5552080Smckusick case O_AS8: 5562080Smckusick pc.cp++; 5572239Smckusic t8 = popsze8(); 5582239Smckusic *(struct sze8 *)popaddr() = t8; 5592080Smckusick continue; 5602080Smckusick case O_AS: 5612080Smckusick tl = *pc.cp++; 5622080Smckusick if (tl == 0) 5632080Smckusick tl = *pc.usp++; 5642080Smckusick tl1 = (tl + 1) & ~1; 5652950Smckusic tcp = pushsp((long)(0)); 5669231Smckusick blkcpy(tcp, *(char **)(tcp + tl1), tl); 5672080Smckusick popsp(tl1 + sizeof(char *)); 5682080Smckusick continue; 56915976Smckusick case O_VAS: 57015976Smckusick pc.cp++; 57115976Smckusick tl = pop4(); 57215976Smckusick tcp1 = popaddr(); 57315976Smckusick tcp = popaddr(); 57415976Smckusick blkcpy(tcp1, tcp, tl); 57515976Smckusick continue; 5762080Smckusick case O_INX2P2: 5772080Smckusick tl = *pc.cp++; /* tl has shift amount */ 57810576Smckusick tl1 = pop2(); 57910576Smckusick tl1 = (tl1 - *pc.sp++) << tl; 58010576Smckusick tcp = popaddr(); 58110576Smckusick pushaddr(tcp + tl1); 5822080Smckusick continue; 5832080Smckusick case O_INX4P2: 5842080Smckusick tl = *pc.cp++; /* tl has shift amount */ 58510576Smckusick tl1 = pop4(); 58610576Smckusick tl1 = (tl1 - *pc.sp++) << tl; 58710576Smckusick tcp = popaddr(); 58810576Smckusick pushaddr(tcp + tl1); 5892080Smckusick continue; 5902080Smckusick case O_INX2: 5912080Smckusick tl = *pc.cp++; /* tl has element size */ 5922080Smckusick if (tl == 0) 5932080Smckusick tl = *pc.usp++; 5942080Smckusick tl1 = pop2(); /* index */ 5952080Smckusick tl2 = *pc.sp++; 59610576Smckusick tcp = popaddr(); 59710576Smckusick pushaddr(tcp + (tl1 - tl2) * tl); 5982191Smckusic tl = *pc.usp++; 5992191Smckusic if (_runtst) 6002191Smckusic SUBSC(tl1, tl2, tl); /* range check */ 6012080Smckusick continue; 6022080Smckusick case O_INX4: 6032080Smckusick tl = *pc.cp++; /* tl has element size */ 6042080Smckusick if (tl == 0) 6052080Smckusick tl = *pc.usp++; 6062080Smckusick tl1 = pop4(); /* index */ 6072080Smckusick tl2 = *pc.sp++; 60810576Smckusick tcp = popaddr(); 60910576Smckusick pushaddr(tcp + (tl1 - tl2) * tl); 6102191Smckusic tl = *pc.usp++; 6112191Smckusic if (_runtst) 6122191Smckusic SUBSC(tl1, tl2, tl); /* range check */ 6132080Smckusick continue; 61415976Smckusick case O_VINX2: 61515976Smckusick pc.cp++; 61615976Smckusick tl = pop2(); /* tl has element size */ 61715976Smckusick tl1 = pop2(); /* upper bound */ 61815976Smckusick tl2 = pop2(); /* lower bound */ 61915976Smckusick tl3 = pop2(); /* index */ 62015976Smckusick tcp = popaddr(); 62115976Smckusick pushaddr(tcp + (tl3 - tl2) * tl); 62215976Smckusick if (_runtst) 62315976Smckusick SUBSC(tl3, tl2, tl1); /* range check */ 62415976Smckusick continue; 62515976Smckusick case O_VINX24: 62615976Smckusick pc.cp++; 62715976Smckusick tl = pop2(); /* tl has element size */ 62815976Smckusick tl1 = pop2(); /* upper bound */ 62915976Smckusick tl2 = pop2(); /* lower bound */ 63015976Smckusick tl3 = pop4(); /* index */ 63115976Smckusick tcp = popaddr(); 63215976Smckusick pushaddr(tcp + (tl3 - tl2) * tl); 63315976Smckusick if (_runtst) 63415976Smckusick SUBSC(tl3, tl2, tl1); /* range check */ 63515976Smckusick continue; 63615976Smckusick case O_VINX42: 63715976Smckusick pc.cp++; 63815976Smckusick tl = pop4(); /* tl has element size */ 63915976Smckusick tl1 = pop4(); /* upper bound */ 64015976Smckusick tl2 = pop4(); /* lower bound */ 64115976Smckusick tl3 = pop2(); /* index */ 64215976Smckusick tcp = popaddr(); 64315976Smckusick pushaddr(tcp + (tl3 - tl2) * tl); 64415976Smckusick if (_runtst) 64515976Smckusick SUBSC(tl3, tl2, tl1); /* range check */ 64615976Smckusick continue; 64715976Smckusick case O_VINX4: 64815976Smckusick pc.cp++; 64915976Smckusick tl = pop4(); /* tl has element size */ 65015976Smckusick tl1 = pop4(); /* upper bound */ 65115976Smckusick tl2 = pop4(); /* lower bound */ 65215976Smckusick tl3 = pop4(); /* index */ 65315976Smckusick tcp = popaddr(); 65415976Smckusick pushaddr(tcp + (tl3 - tl2) * tl); 65515976Smckusick if (_runtst) 65615976Smckusick SUBSC(tl3, tl2, tl1); /* range check */ 65715976Smckusick continue; 6582080Smckusick case O_OFF: 6592080Smckusick tl = *pc.cp++; 6602080Smckusick if (tl == 0) 6612080Smckusick tl = *pc.usp++; 66210576Smckusick tcp = popaddr(); 66310576Smckusick pushaddr(tcp + tl); 6642080Smckusick continue; 6652080Smckusick case O_NIL: 6662080Smckusick pc.cp++; 667*24938Smckusick tcp = popaddr(); 668*24938Smckusick NIL(tcp); 669*24938Smckusick pushaddr(tcp); 6702080Smckusick continue; 6712080Smckusick case O_ADD2: 6722080Smckusick pc.cp++; 67310576Smckusick tl = pop2(); 67410576Smckusick tl1 = pop2(); 67510576Smckusick push4(tl1 + tl); 6762080Smckusick continue; 6772080Smckusick case O_ADD4: 6782080Smckusick pc.cp++; 67910576Smckusick tl = pop4(); 68010576Smckusick tl1 = pop4(); 68110576Smckusick push4(tl1 + tl); 6822080Smckusick continue; 6832080Smckusick case O_ADD24: 6842080Smckusick pc.cp++; 6852080Smckusick tl = pop2(); 68610576Smckusick tl1 = pop4(); 68710576Smckusick push4(tl1 + tl); 6882080Smckusick continue; 6892080Smckusick case O_ADD42: 6902080Smckusick pc.cp++; 6912080Smckusick tl = pop4(); 69210576Smckusick tl1 = pop2(); 69310576Smckusick push4(tl1 + tl); 6942080Smckusick continue; 6952080Smckusick case O_ADD28: 6962080Smckusick pc.cp++; 6972080Smckusick tl = pop2(); 69810576Smckusick td = pop8(); 69910576Smckusick push8(td + tl); 7002080Smckusick continue; 7012080Smckusick case O_ADD48: 7022080Smckusick pc.cp++; 7032080Smckusick tl = pop4(); 70410576Smckusick td = pop8(); 70510576Smckusick push8(td + tl); 7062080Smckusick continue; 7072080Smckusick case O_ADD82: 7082080Smckusick pc.cp++; 7092080Smckusick td = pop8(); 71010576Smckusick td1 = pop2(); 71110576Smckusick push8(td1 + td); 7122080Smckusick continue; 7132080Smckusick case O_ADD84: 7142080Smckusick pc.cp++; 7152080Smckusick td = pop8(); 71610576Smckusick td1 = pop4(); 71710576Smckusick push8(td1 + td); 7182080Smckusick continue; 7192080Smckusick case O_SUB2: 7202080Smckusick pc.cp++; 7212080Smckusick tl = pop2(); 72210576Smckusick tl1 = pop2(); 72310576Smckusick push4(tl1 - tl); 7242080Smckusick continue; 7252080Smckusick case O_SUB4: 7262080Smckusick pc.cp++; 7272080Smckusick tl = pop4(); 72810576Smckusick tl1 = pop4(); 72910576Smckusick push4(tl1 - tl); 7302080Smckusick continue; 7312080Smckusick case O_SUB24: 7322080Smckusick pc.cp++; 7332080Smckusick tl = pop2(); 73410576Smckusick tl1 = pop4(); 73510576Smckusick push4(tl1 - tl); 7362080Smckusick continue; 7372080Smckusick case O_SUB42: 7382080Smckusick pc.cp++; 7392080Smckusick tl = pop4(); 74010576Smckusick tl1 = pop2(); 74110576Smckusick push4(tl1 - tl); 7422080Smckusick continue; 7432080Smckusick case O_SUB28: 7442080Smckusick pc.cp++; 7452080Smckusick tl = pop2(); 74610576Smckusick td = pop8(); 74710576Smckusick push8(td - tl); 7482080Smckusick continue; 7492080Smckusick case O_SUB48: 7502080Smckusick pc.cp++; 7512080Smckusick tl = pop4(); 75210576Smckusick td = pop8(); 75310576Smckusick push8(td - tl); 7542080Smckusick continue; 7552080Smckusick case O_SUB82: 7562080Smckusick pc.cp++; 7572080Smckusick td = pop8(); 75810576Smckusick td1 = pop2(); 75910576Smckusick push8(td1 - td); 7602080Smckusick continue; 7612080Smckusick case O_SUB84: 7622080Smckusick pc.cp++; 7632080Smckusick td = pop8(); 76410576Smckusick td1 = pop4(); 76510576Smckusick push8(td1 - td); 7662080Smckusick continue; 7672080Smckusick case O_MUL2: 7682080Smckusick pc.cp++; 76910576Smckusick tl = pop2(); 77010576Smckusick tl1 = pop2(); 77110576Smckusick push4(tl1 * tl); 7722080Smckusick continue; 7732080Smckusick case O_MUL4: 7742080Smckusick pc.cp++; 77510576Smckusick tl = pop4(); 77610576Smckusick tl1 = pop4(); 77710576Smckusick push4(tl1 * tl); 7782080Smckusick continue; 7792080Smckusick case O_MUL24: 7802080Smckusick pc.cp++; 7812080Smckusick tl = pop2(); 78210576Smckusick tl1 = pop4(); 78310576Smckusick push4(tl1 * tl); 7842080Smckusick continue; 7852080Smckusick case O_MUL42: 7862080Smckusick pc.cp++; 7872080Smckusick tl = pop4(); 78810576Smckusick tl1 = pop2(); 78910576Smckusick push4(tl1 * tl); 7902080Smckusick continue; 7912080Smckusick case O_MUL28: 7922080Smckusick pc.cp++; 7932080Smckusick tl = pop2(); 79410576Smckusick td = pop8(); 79510576Smckusick push8(td * tl); 7962080Smckusick continue; 7972080Smckusick case O_MUL48: 7982080Smckusick pc.cp++; 7992080Smckusick tl = pop4(); 80010576Smckusick td = pop8(); 80110576Smckusick push8(td * tl); 8022080Smckusick continue; 8032080Smckusick case O_MUL82: 8042080Smckusick pc.cp++; 8052080Smckusick td = pop8(); 80610576Smckusick td1 = pop2(); 80710576Smckusick push8(td1 * td); 8082080Smckusick continue; 8092080Smckusick case O_MUL84: 8102080Smckusick pc.cp++; 8112080Smckusick td = pop8(); 81210576Smckusick td1 = pop4(); 81310576Smckusick push8(td1 * td); 8142080Smckusick continue; 8152080Smckusick case O_ABS2: 8162080Smckusick case O_ABS4: 8172080Smckusick pc.cp++; 8182080Smckusick tl = pop4(); 8192080Smckusick push4(tl >= 0 ? tl : -tl); 8202080Smckusick continue; 8212080Smckusick case O_ABS8: 8222080Smckusick pc.cp++; 8232080Smckusick td = pop8(); 8242080Smckusick push8(td >= 0.0 ? td : -td); 8252080Smckusick continue; 8262080Smckusick case O_NEG2: 8272080Smckusick pc.cp++; 8282950Smckusic push4((long)(-pop2())); 8292080Smckusick continue; 8302080Smckusick case O_NEG4: 8312080Smckusick pc.cp++; 8322080Smckusick push4(-pop4()); 8332080Smckusick continue; 8342080Smckusick case O_NEG8: 8352080Smckusick pc.cp++; 8362080Smckusick push8(-pop8()); 8372080Smckusick continue; 8382080Smckusick case O_DIV2: 8392080Smckusick pc.cp++; 8402080Smckusick tl = pop2(); 84110576Smckusick tl1 = pop2(); 84210576Smckusick push4(tl1 / tl); 8432080Smckusick continue; 8442080Smckusick case O_DIV4: 8452080Smckusick pc.cp++; 8462080Smckusick tl = pop4(); 84710576Smckusick tl1 = pop4(); 84810576Smckusick push4(tl1 / tl); 8492080Smckusick continue; 8502080Smckusick case O_DIV24: 8512080Smckusick pc.cp++; 8522080Smckusick tl = pop2(); 85310576Smckusick tl1 = pop4(); 85410576Smckusick push4(tl1 / tl); 8552080Smckusick continue; 8562080Smckusick case O_DIV42: 8572080Smckusick pc.cp++; 8582080Smckusick tl = pop4(); 85910576Smckusick tl1 = pop2(); 86010576Smckusick push4(tl1 / tl); 8612080Smckusick continue; 8622080Smckusick case O_MOD2: 8632080Smckusick pc.cp++; 8642080Smckusick tl = pop2(); 86510576Smckusick tl1 = pop2(); 86610576Smckusick push4(tl1 % tl); 8672080Smckusick continue; 8682080Smckusick case O_MOD4: 8692080Smckusick pc.cp++; 8702080Smckusick tl = pop4(); 87110576Smckusick tl1 = pop4(); 87210576Smckusick push4(tl1 % tl); 8732080Smckusick continue; 8742080Smckusick case O_MOD24: 8752080Smckusick pc.cp++; 8762080Smckusick tl = pop2(); 87710576Smckusick tl1 = pop4(); 87810576Smckusick push4(tl1 % tl); 8792080Smckusick continue; 8802080Smckusick case O_MOD42: 8812080Smckusick pc.cp++; 8822080Smckusick tl = pop4(); 88310576Smckusick tl1 = pop2(); 88410576Smckusick push4(tl1 % tl); 8852080Smckusick continue; 8862080Smckusick case O_ADD8: 8872080Smckusick pc.cp++; 88810576Smckusick td = pop8(); 88910576Smckusick td1 = pop8(); 89010787Smckusick push8(td1 + td); 8912080Smckusick continue; 8922080Smckusick case O_SUB8: 8932080Smckusick pc.cp++; 8942080Smckusick td = pop8(); 89510576Smckusick td1 = pop8(); 89610787Smckusick push8(td1 - td); 8972080Smckusick continue; 8982080Smckusick case O_MUL8: 8992080Smckusick pc.cp++; 90010576Smckusick td = pop8(); 90110576Smckusick td1 = pop8(); 90210787Smckusick push8(td1 * td); 9032080Smckusick continue; 9042080Smckusick case O_DVD8: 9052080Smckusick pc.cp++; 9062080Smckusick td = pop8(); 90710576Smckusick td1 = pop8(); 90810787Smckusick push8(td1 / td); 9092080Smckusick continue; 9102080Smckusick case O_STOI: 9112080Smckusick pc.cp++; 9122950Smckusic push4((long)(pop2())); 9132080Smckusick continue; 9142080Smckusick case O_STOD: 9152080Smckusick pc.cp++; 9162080Smckusick td = pop2(); 9172080Smckusick push8(td); 9182080Smckusick continue; 9192080Smckusick case O_ITOD: 9202080Smckusick pc.cp++; 9212080Smckusick td = pop4(); 9222080Smckusick push8(td); 9232080Smckusick continue; 9242080Smckusick case O_ITOS: 9252080Smckusick pc.cp++; 9262950Smckusic push2((short)(pop4())); 9272080Smckusick continue; 9282080Smckusick case O_DVD2: 9292080Smckusick pc.cp++; 9302080Smckusick td = pop2(); 93110576Smckusick td1 = pop2(); 93210576Smckusick push8(td1 / td); 9332080Smckusick continue; 9342080Smckusick case O_DVD4: 9352080Smckusick pc.cp++; 9362080Smckusick td = pop4(); 93710576Smckusick td1 = pop4(); 93810576Smckusick push8(td1 / td); 9392080Smckusick continue; 9402080Smckusick case O_DVD24: 9412080Smckusick pc.cp++; 9422080Smckusick td = pop2(); 94310576Smckusick td1 = pop4(); 94410576Smckusick push8(td1 / td); 9452080Smckusick continue; 9462080Smckusick case O_DVD42: 9472080Smckusick pc.cp++; 9482080Smckusick td = pop4(); 94910576Smckusick td1 = pop2(); 95010576Smckusick push8(td1 / td); 9512080Smckusick continue; 9522080Smckusick case O_DVD28: 9532080Smckusick pc.cp++; 9542080Smckusick td = pop2(); 95510576Smckusick td1 = pop8(); 95610576Smckusick push8(td1 / td); 9572080Smckusick continue; 9582080Smckusick case O_DVD48: 9592080Smckusick pc.cp++; 96010787Smckusick td = pop4(); 96110787Smckusick td1 = pop8(); 96210787Smckusick push8(td1 / td); 9632080Smckusick continue; 9642080Smckusick case O_DVD82: 9652080Smckusick pc.cp++; 9662080Smckusick td = pop8(); 96710576Smckusick td1 = pop2(); 96810576Smckusick push8(td1 / td); 9692080Smckusick continue; 9702080Smckusick case O_DVD84: 9712080Smckusick pc.cp++; 9722080Smckusick td = pop8(); 97310576Smckusick td1 = pop4(); 97410576Smckusick push8(td1 / td); 9752080Smckusick continue; 9762080Smckusick case O_RV1: 9772109Smckusic tcp = _display.raw[*pc.ucp++]; 9782950Smckusic push2((short)(*(tcp + *pc.sp++))); 9792080Smckusick continue; 9802080Smckusick case O_RV14: 9812109Smckusic tcp = _display.raw[*pc.ucp++]; 9822950Smckusic push4((long)(*(tcp + *pc.sp++))); 9832080Smckusick continue; 9842080Smckusick case O_RV2: 9852109Smckusic tcp = _display.raw[*pc.ucp++]; 9862080Smckusick push2(*(short *)(tcp + *pc.sp++)); 9872080Smckusick continue; 9882080Smckusick case O_RV24: 9892109Smckusic tcp = _display.raw[*pc.ucp++]; 9902950Smckusic push4((long)(*(short *)(tcp + *pc.sp++))); 9912080Smckusick continue; 9922080Smckusick case O_RV4: 9932109Smckusic tcp = _display.raw[*pc.ucp++]; 9942080Smckusick push4(*(long *)(tcp + *pc.sp++)); 9952080Smckusick continue; 9962080Smckusick case O_RV8: 9972109Smckusic tcp = _display.raw[*pc.ucp++]; 9982239Smckusic pushsze8(*(struct sze8 *)(tcp + *pc.sp++)); 9992080Smckusick continue; 10002080Smckusick case O_RV: 10012109Smckusic tcp = _display.raw[*pc.ucp++]; 10022080Smckusick tcp += *pc.sp++; 10032080Smckusick tl = *pc.usp++; 10042338Smckusic tcp1 = pushsp((tl + 1) & ~1); 10059231Smckusick blkcpy(tcp, tcp1, tl); 10062080Smckusick continue; 10072080Smckusick case O_LV: 10082109Smckusic tcp = _display.raw[*pc.ucp++]; 10092080Smckusick pushaddr(tcp + *pc.sp++); 10102080Smckusick continue; 10112080Smckusick case O_LRV1: 10122109Smckusic tcp = _display.raw[*pc.ucp++]; 10132950Smckusic push2((short)(*(tcp + *pc.lp++))); 10142080Smckusick continue; 10152080Smckusick case O_LRV14: 10162109Smckusic tcp = _display.raw[*pc.ucp++]; 10172950Smckusic push4((long)(*(tcp + *pc.lp++))); 10182080Smckusick continue; 10192080Smckusick case O_LRV2: 10202109Smckusic tcp = _display.raw[*pc.ucp++]; 10212080Smckusick push2(*(short *)(tcp + *pc.lp++)); 10222080Smckusick continue; 10232080Smckusick case O_LRV24: 10242109Smckusic tcp = _display.raw[*pc.ucp++]; 10252950Smckusic push4((long)(*(short *)(tcp + *pc.lp++))); 10262080Smckusick continue; 10272080Smckusick case O_LRV4: 10282109Smckusic tcp = _display.raw[*pc.ucp++]; 10292080Smckusick push4(*(long *)(tcp + *pc.lp++)); 10302080Smckusick continue; 10312080Smckusick case O_LRV8: 10322109Smckusic tcp = _display.raw[*pc.ucp++]; 10332239Smckusic pushsze8(*(struct sze8 *)(tcp + *pc.lp++)); 10342080Smckusick continue; 10352080Smckusick case O_LRV: 10362109Smckusic tcp = _display.raw[*pc.ucp++]; 10372950Smckusic tcp += (int)*pc.lp++; 10382080Smckusick tl = *pc.usp++; 10392950Smckusic tcp1 = pushsp((tl + 1) & ~1); 10409231Smckusick blkcpy(tcp, tcp1, tl); 10412080Smckusick continue; 10422080Smckusick case O_LLV: 10432109Smckusic tcp = _display.raw[*pc.ucp++]; 10442080Smckusick pushaddr(tcp + *pc.lp++); 10452080Smckusick continue; 10462080Smckusick case O_IND1: 10472080Smckusick pc.cp++; 10482950Smckusic push2((short)(*popaddr())); 10492080Smckusick continue; 10502080Smckusick case O_IND14: 10512080Smckusick pc.cp++; 10522950Smckusic push4((long)(*popaddr())); 10532080Smckusick continue; 10542080Smckusick case O_IND2: 10552080Smckusick pc.cp++; 10562080Smckusick push2(*(short *)(popaddr())); 10572080Smckusick continue; 10582080Smckusick case O_IND24: 10592080Smckusick pc.cp++; 10602950Smckusic push4((long)(*(short *)(popaddr()))); 10612080Smckusick continue; 10622080Smckusick case O_IND4: 10632080Smckusick pc.cp++; 10642080Smckusick push4(*(long *)(popaddr())); 10652080Smckusick continue; 10662080Smckusick case O_IND8: 10672080Smckusick pc.cp++; 10682239Smckusic pushsze8(*(struct sze8 *)(popaddr())); 10692080Smckusick continue; 10702080Smckusick case O_IND: 10712080Smckusick tl = *pc.cp++; 10722080Smckusick if (tl == 0) 10732080Smckusick tl = *pc.usp++; 10742080Smckusick tcp = popaddr(); 10752080Smckusick tcp1 = pushsp((tl + 1) & ~1); 10769231Smckusick blkcpy(tcp, tcp1, tl); 10772080Smckusick continue; 10782080Smckusick case O_CON1: 10792950Smckusic push2((short)(*pc.cp++)); 10802080Smckusick continue; 10812080Smckusick case O_CON14: 10822950Smckusic push4((long)(*pc.cp++)); 10832080Smckusick continue; 10842080Smckusick case O_CON2: 10852080Smckusick pc.cp++; 10862080Smckusick push2(*pc.sp++); 10872080Smckusick continue; 10882080Smckusick case O_CON24: 10892080Smckusick pc.cp++; 10902950Smckusic push4((long)(*pc.sp++)); 10912080Smckusick continue; 10922080Smckusick case O_CON4: 10932080Smckusick pc.cp++; 10942080Smckusick push4(*pc.lp++); 10952080Smckusick continue; 10962080Smckusick case O_CON8: 10972080Smckusick pc.cp++; 10982950Smckusic push8(*pc.dbp++); 10992080Smckusick continue; 11002080Smckusick case O_CON: 11012080Smckusick tl = *pc.cp++; 11022080Smckusick if (tl == 0) 11032080Smckusick tl = *pc.usp++; 11042080Smckusick tl = (tl + 1) & ~1; 11052080Smckusick tcp = pushsp(tl); 11069231Smckusick blkcpy(pc.cp, tcp, tl); 11072950Smckusic pc.cp += (int)tl; 11082080Smckusick continue; 11092950Smckusic case O_CONG: 11102950Smckusic tl = *pc.cp++; 11112950Smckusic if (tl == 0) 11122950Smckusic tl = *pc.usp++; 11132950Smckusic tl1 = (tl + 1) & ~1; 11142950Smckusic tcp = pushsp(tl1); 11159231Smckusick blkcpy(pc.cp, tcp, tl1); 11162950Smckusic pc.cp += (int)((tl + 2) & ~1); 11172950Smckusic continue; 11182080Smckusick case O_LVCON: 11192080Smckusick tl = *pc.cp++; 11202080Smckusick if (tl == 0) 11212080Smckusick tl = *pc.usp++; 11222080Smckusick tl = (tl + 1) & ~1; 11232080Smckusick pushaddr(pc.cp); 11242950Smckusic pc.cp += (int)tl; 11252080Smckusick continue; 11262080Smckusick case O_RANG2: 11272080Smckusick tl = *pc.cp++; 11282080Smckusick if (tl == 0) 11292080Smckusick tl = *pc.sp++; 11302080Smckusick tl1 = pop2(); 11314026Smckusic push2((short)(RANG4(tl1, tl, (long)(*pc.sp++)))); 11322080Smckusick continue; 11332080Smckusick case O_RANG42: 11342080Smckusick tl = *pc.cp++; 11352080Smckusick if (tl == 0) 11362080Smckusick tl = *pc.sp++; 11372080Smckusick tl1 = pop4(); 11384026Smckusic push4(RANG4(tl1, tl, (long)(*pc.sp++))); 11392080Smckusick continue; 11402080Smckusick case O_RSNG2: 11412080Smckusick tl = *pc.cp++; 11422080Smckusick if (tl == 0) 11432080Smckusick tl = *pc.sp++; 11442080Smckusick tl1 = pop2(); 11452950Smckusic push2((short)(RSNG4(tl1, tl))); 11462080Smckusick continue; 11472080Smckusick case O_RSNG42: 11482080Smckusick tl = *pc.cp++; 11492080Smckusick if (tl == 0) 11502080Smckusick tl = *pc.sp++; 11512080Smckusick tl1 = pop4(); 11522080Smckusick push4(RSNG4(tl1, tl)); 11532080Smckusick continue; 11542080Smckusick case O_RANG4: 11554026Smckusic tl = *pc.cp++; 11564026Smckusic if (tl == 0) 11574026Smckusic tl = *pc.lp++; 11582080Smckusick tl1 = pop4(); 11592080Smckusick push4(RANG4(tl1, tl, *pc.lp++)); 11602080Smckusick continue; 11612080Smckusick case O_RANG24: 11624026Smckusic tl = *pc.cp++; 11634026Smckusic if (tl == 0) 11644026Smckusic tl = *pc.lp++; 11652080Smckusick tl1 = pop2(); 11662950Smckusic push2((short)(RANG4(tl1, tl, *pc.lp++))); 11672080Smckusick continue; 11682080Smckusick case O_RSNG4: 11694026Smckusic tl = *pc.cp++; 11704026Smckusic if (tl == 0) 11714026Smckusic tl = *pc.lp++; 11724026Smckusic tl1 = pop4(); 11734026Smckusic push4(RSNG4(tl1, tl)); 11742080Smckusick continue; 11752080Smckusick case O_RSNG24: 11764026Smckusic tl = *pc.cp++; 11774026Smckusic if (tl == 0) 11784026Smckusic tl = *pc.lp++; 11794026Smckusic tl1 = pop2(); 11804026Smckusic push2((short)(RSNG4(tl1, tl))); 11812080Smckusick continue; 11822080Smckusick case O_STLIM: 11832080Smckusick pc.cp++; 11842121Smckusic STLIM(); 11852950Smckusic popsp((long)(sizeof(long))); 11862080Smckusick continue; 11872080Smckusick case O_LLIMIT: 11882080Smckusick pc.cp++; 11892080Smckusick LLIMIT(); 11902950Smckusic popsp((long)(sizeof(char *)+sizeof(long))); 11912080Smckusick continue; 11922080Smckusick case O_BUFF: 11932950Smckusic BUFF((long)(*pc.cp++)); 11942080Smckusick continue; 11952080Smckusick case O_HALT: 11962080Smckusick pc.cp++; 11975682Smckusic if (_nodump == TRUE) 11985682Smckusic psexit(0); 11995682Smckusic fputs("\nCall to procedure halt\n", stderr); 12005682Smckusic backtrace("Halted"); 12015682Smckusic psexit(0); 12022080Smckusick continue; 12032080Smckusick case O_PXPBUF: 12042080Smckusick pc.cp++; 12052080Smckusick _cntrs = *pc.lp++; 12062080Smckusick _rtns = *pc.lp++; 12079231Smckusick NEW(&_pcpcount, (_cntrs + 1) * sizeof(long)); 12089231Smckusick blkclr(_pcpcount, (_cntrs + 1) * sizeof(long)); 12092080Smckusick continue; 12102080Smckusick case O_COUNT: 12112080Smckusick pc.cp++; 12122080Smckusick _pcpcount[*pc.usp++]++; 12132080Smckusick continue; 12142080Smckusick case O_CASE1OP: 12152080Smckusick tl = *pc.cp++; /* tl = number of cases */ 12162080Smckusick if (tl == 0) 12172080Smckusick tl = *pc.usp++; 12182080Smckusick tsp = pc.sp + tl; /* ptr to end of jump table */ 12192080Smckusick tcp = (char *)tsp; /* tcp = ptr to case values */ 12202080Smckusick tl1 = pop2(); /* tl1 = element to find */ 12212080Smckusick for(; tl > 0; tl--) /* look for element */ 12222080Smckusick if (tl1 == *tcp++) 12232080Smckusick break; 12242080Smckusick if (tl == 0) /* default case => error */ 12255666Smckusic CASERNG(tl1); 12262080Smckusick pc.cp += *(tsp - tl); 12272080Smckusick continue; 12282080Smckusick case O_CASE2OP: 12292080Smckusick tl = *pc.cp++; /* tl = number of cases */ 12302080Smckusick if (tl == 0) 12312080Smckusick tl = *pc.usp++; 12322080Smckusick tsp = pc.sp + tl; /* ptr to end of jump table */ 12332080Smckusick tsp1 = tsp; /* tsp1 = ptr to case values */ 12342080Smckusick tl1 = (unsigned short)pop2();/* tl1 = element to find */ 12352080Smckusick for(; tl > 0; tl--) /* look for element */ 12362080Smckusick if (tl1 == *tsp1++) 12372080Smckusick break; 12382080Smckusick if (tl == 0) /* default case => error */ 12395666Smckusic CASERNG(tl1); 12402080Smckusick pc.cp += *(tsp - tl); 12412080Smckusick continue; 12422080Smckusick case O_CASE4OP: 12432080Smckusick tl = *pc.cp++; /* tl = number of cases */ 12442080Smckusick if (tl == 0) 12452080Smckusick tl = *pc.usp++; 12462080Smckusick tsp = pc.sp + tl; /* ptr to end of jump table */ 12472080Smckusick tlp = (long *)tsp; /* tlp = ptr to case values */ 12482080Smckusick tl1 = pop4(); /* tl1 = element to find */ 12492080Smckusick for(; tl > 0; tl--) /* look for element */ 12502080Smckusick if (tl1 == *tlp++) 12512080Smckusick break; 12522080Smckusick if (tl == 0) /* default case => error */ 12535666Smckusic CASERNG(tl1); 12542080Smckusick pc.cp += *(tsp - tl); 12552080Smckusick continue; 12562080Smckusick case O_ADDT: 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 ADDT(tcp + tl, tcp + tl, tcp, tl >> 2); 12622080Smckusick popsp(tl); 12632080Smckusick continue; 12642080Smckusick case O_SUBT: 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 SUBT(tcp + tl, tcp + tl, tcp, tl >> 2); 12702080Smckusick popsp(tl); 12712080Smckusick continue; 12722080Smckusick case O_MULT: 12732080Smckusick tl = *pc.cp++; /* tl has comparison length */ 12742080Smckusick if (tl == 0) 12752080Smckusick tl = *pc.usp++; 12762950Smckusic tcp = pushsp((long)(0));/* tcp pts to first arg */ 12772080Smckusick MULT(tcp + tl, tcp + tl, tcp, tl >> 2); 12782080Smckusick popsp(tl); 12792080Smckusick continue; 12802080Smckusick case O_INCT: 12812080Smckusick tl = *pc.cp++; /* tl has number of args */ 12822080Smckusick if (tl == 0) 12832080Smckusick tl = *pc.usp++; 12842950Smckusic tb = INCT(); 12852950Smckusic popsp(tl*sizeof(long)); 12862950Smckusic push2((short)(tb)); 12872080Smckusick continue; 12882080Smckusick case O_CTTOT: 12892080Smckusick tl = *pc.cp++; /* tl has number of args */ 12902080Smckusick if (tl == 0) 12912080Smckusick tl = *pc.usp++; 12922080Smckusick tl1 = tl * sizeof(long); 12932950Smckusic tcp = pushsp((long)(0)) + tl1; /* tcp pts to result */ 12942080Smckusick CTTOT(tcp); 12952950Smckusic popsp(tl*sizeof(long)); 12962080Smckusick continue; 12972080Smckusick case O_CARD: 12982080Smckusick tl = *pc.cp++; /* tl has comparison length */ 12992080Smckusick if (tl == 0) 13002080Smckusick tl = *pc.usp++; 13012950Smckusic tcp = pushsp((long)(0));/* tcp pts to set */ 13022080Smckusick tl1 = CARD(tcp, tl); 13032080Smckusick popsp(tl); 13042950Smckusic push2((short)(tl1)); 13052080Smckusick continue; 13062080Smckusick case O_IN: 13072080Smckusick tl = *pc.cp++; /* tl has comparison length */ 13082080Smckusick if (tl == 0) 13092080Smckusick tl = *pc.usp++; 13102080Smckusick tl1 = pop4(); /* tl1 is the element */ 13112950Smckusic tcp = pushsp((long)(0));/* tcp pts to set */ 13124026Smckusic tl2 = *pc.sp++; /* lower bound */ 13132950Smckusic tb = IN(tl1, tl2, (long)(*pc.usp++), tcp); 13142080Smckusick popsp(tl); 13152950Smckusic push2((short)(tb)); 13162080Smckusick continue; 13172080Smckusick case O_ASRT: 13182080Smckusick pc.cp++; 1319*24938Smckusick tl = pop4(); 1320*24938Smckusick tcp = popaddr(); 1321*24938Smckusick ASRTS(tl, tcp); 13222080Smckusick continue; 13232080Smckusick case O_FOR1U: 132410792Smckusick tl1 = *pc.cp++; /* tl1 loop branch */ 132510576Smckusick if (tl1 == 0) 132610576Smckusick tl1 = *pc.sp++; 132710576Smckusick tcp = popaddr(); /* tcp = ptr to index var */ 132810792Smckusick tl = pop4(); /* tl upper bound */ 132910792Smckusick if (*tcp == tl) /* loop is done, fall through */ 133010576Smckusick continue; 133110792Smckusick *tcp += 1; /* inc index var */ 133210792Smckusick pc.cp += tl1; /* return to top of loop */ 133310576Smckusick continue; 13342080Smckusick case O_FOR2U: 133510792Smckusick tl1 = *pc.cp++; /* tl1 loop branch */ 13364026Smckusic if (tl1 == 0) 13374026Smckusic tl1 = *pc.sp++; 133810576Smckusick tsp = (short *)popaddr(); /* tsp = ptr to index var */ 133910792Smckusick tl = pop4(); /* tl upper bound */ 134010792Smckusick if (*tsp == tl) /* loop is done, fall through */ 13412080Smckusick continue; 134210792Smckusick *tsp += 1; /* inc index var */ 134310792Smckusick pc.cp += tl1; /* return to top of loop */ 13442080Smckusick continue; 13452080Smckusick case O_FOR4U: 134610792Smckusick tl1 = *pc.cp++; /* tl1 loop branch */ 13474026Smckusic if (tl1 == 0) 134810792Smckusick tl1 = *pc.sp++; 13492950Smckusic tlp = (long *)popaddr(); /* tlp = ptr to index var */ 135010792Smckusick tl = pop4(); /* tl upper bound */ 135110792Smckusick if (*tlp == tl) /* loop is done, fall through */ 13522080Smckusick continue; 135310792Smckusick *tlp += 1; /* inc index var */ 135410792Smckusick pc.cp += tl1; /* return to top of loop */ 13552080Smckusick continue; 13562080Smckusick case O_FOR1D: 135710792Smckusick tl1 = *pc.cp++; /* tl1 loop branch */ 135810576Smckusick if (tl1 == 0) 135910576Smckusick tl1 = *pc.sp++; 136010576Smckusick tcp = popaddr(); /* tcp = ptr to index var */ 136110792Smckusick tl = pop4(); /* tl upper bound */ 136210792Smckusick if (*tcp == tl) /* loop is done, fall through */ 136310576Smckusick continue; 136410792Smckusick *tcp -= 1; /* dec index var */ 136510792Smckusick pc.cp += tl1; /* return to top of loop */ 136610576Smckusick continue; 13672080Smckusick case O_FOR2D: 136810792Smckusick tl1 = *pc.cp++; /* tl1 loop branch */ 13694026Smckusic if (tl1 == 0) 13704026Smckusic tl1 = *pc.sp++; 137110576Smckusick tsp = (short *)popaddr(); /* tsp = ptr to index var */ 137210792Smckusick tl = pop4(); /* tl upper bound */ 137310792Smckusick if (*tsp == tl) /* loop is done, fall through */ 13742080Smckusick continue; 137510792Smckusick *tsp -= 1; /* dec index var */ 137610792Smckusick pc.cp += tl1; /* return to top of loop */ 13772080Smckusick continue; 13782080Smckusick case O_FOR4D: 137910792Smckusick tl1 = *pc.cp++; /* tl1 loop branch */ 13804026Smckusic if (tl1 == 0) 138110792Smckusick tl1 = *pc.sp++; 13822950Smckusic tlp = (long *)popaddr(); /* tlp = ptr to index var */ 138310792Smckusick tl = pop4(); /* tl upper bound */ 138410792Smckusick if (*tlp == tl) /* loop is done, fall through */ 13852080Smckusick continue; 138610792Smckusick *tlp -= 1; /* dec index var */ 138710792Smckusick pc.cp += tl1; /* return to top of loop */ 13882080Smckusick continue; 13892080Smckusick case O_READE: 13902080Smckusick pc.cp++; 13912950Smckusic push2((short)(READE(curfile, base + *pc.lp++))); 13922080Smckusick continue; 13932080Smckusick case O_READ4: 13942080Smckusick pc.cp++; 13952080Smckusick push4(READ4(curfile)); 13962080Smckusick continue; 13972080Smckusick case O_READC: 13982080Smckusick pc.cp++; 13992950Smckusic push2((short)(READC(curfile))); 14002080Smckusick continue; 14012080Smckusick case O_READ8: 14022080Smckusick pc.cp++; 14032080Smckusick push8(READ8(curfile)); 14042080Smckusick continue; 14052080Smckusick case O_READLN: 14062080Smckusick pc.cp++; 14072080Smckusick READLN(curfile); 14082080Smckusick continue; 14092080Smckusick case O_EOF: 14102080Smckusick pc.cp++; 14112950Smckusic push2((short)(TEOF(popaddr()))); 14122080Smckusick continue; 14132080Smckusick case O_EOLN: 14142080Smckusick pc.cp++; 14152950Smckusic push2((short)(TEOLN(popaddr()))); 14162080Smckusick continue; 14172080Smckusick case O_WRITEC: 14182191Smckusic if (_runtst) { 14192191Smckusic WRITEC(curfile); 14203166Smckusic popsp((long)(*pc.cp++)); 14212191Smckusic continue; 14222191Smckusic } 1423*24938Smckusick tl = *pc.cp++; 1424*24938Smckusick switch (tl - sizeof(FILE *)) { 1425*24938Smckusick case 2: 1426*24938Smckusick tl1 = pop2(); 1427*24938Smckusick break; 1428*24938Smckusick case 4: 1429*24938Smckusick tl1 = pop4(); 1430*24938Smckusick break; 1431*24938Smckusick default: 1432*24938Smckusick ERROR("Panic: bad size to O_WRITEC"); 1433*24938Smckusick /* NOT REACHED */ 1434*24938Smckusick } 1435*24938Smckusick tcp = popaddr(); 1436*24938Smckusick fputc(tl1, tcp); 14372080Smckusick continue; 14382080Smckusick case O_WRITES: 14392191Smckusic if (_runtst) { 14402191Smckusic WRITES(curfile); 14413166Smckusic popsp((long)(*pc.cp++)); 14422191Smckusic continue; 14432191Smckusic } 14442191Smckusic fwrite(); 14453166Smckusic popsp((long)(*pc.cp++)); 14462080Smckusick continue; 14472080Smckusick case O_WRITEF: 14482191Smckusic if (_runtst) { 14492191Smckusic WRITEF(curfile); 14503166Smckusic popsp((long)(*pc.cp++)); 14512191Smckusic continue; 14522191Smckusic } 14532191Smckusic fprintf(); 14543166Smckusic popsp((long)(*pc.cp++)); 14552080Smckusick continue; 14562080Smckusick case O_WRITLN: 14572080Smckusick pc.cp++; 14582191Smckusic if (_runtst) { 14592191Smckusic WRITLN(curfile); 14602191Smckusic continue; 14612191Smckusic } 14622191Smckusic fputc('\n', ACTFILE(curfile)); 14632080Smckusick continue; 14642080Smckusick case O_PAGE: 14652080Smckusick pc.cp++; 14662191Smckusic if (_runtst) { 14672191Smckusic PAGE(curfile); 14682191Smckusic continue; 14692191Smckusic } 14702950Smckusic fputc('', ACTFILE(curfile)); 14712080Smckusick continue; 14722080Smckusick case O_NAM: 14732080Smckusick pc.cp++; 14742080Smckusick tl = pop4(); 14752080Smckusick pushaddr(NAM(tl, base + *pc.lp++)); 14762080Smckusick continue; 14772080Smckusick case O_MAX: 14782080Smckusick tl = *pc.cp++; 14792080Smckusick if (tl == 0) 14802080Smckusick tl = *pc.usp++; 14812080Smckusick tl1 = pop4(); 14822191Smckusic if (_runtst) { 14832950Smckusic push4(MAX(tl1, tl, (long)(*pc.usp++))); 14842191Smckusic continue; 14852191Smckusic } 14862191Smckusic tl1 -= tl; 14872191Smckusic tl = *pc.usp++; 14882191Smckusic push4(tl1 > tl ? tl1 : tl); 14892080Smckusick continue; 14902080Smckusick case O_MIN: 14912080Smckusick tl = *pc.cp++; 14922080Smckusick if (tl == 0) 14932080Smckusick tl = *pc.usp++; 14942080Smckusick tl1 = pop4(); 14952080Smckusick push4(tl1 < tl ? tl1 : tl); 14962080Smckusick continue; 14972080Smckusick case O_UNIT: 14982080Smckusick pc.cp++; 14992080Smckusick curfile = UNIT(popaddr()); 15002080Smckusick continue; 15012080Smckusick case O_UNITINP: 15022080Smckusick pc.cp++; 15032080Smckusick curfile = INPUT; 15042080Smckusick continue; 15052080Smckusick case O_UNITOUT: 15062080Smckusick pc.cp++; 15072080Smckusick curfile = OUTPUT; 15082080Smckusick continue; 15092080Smckusick case O_MESSAGE: 15102080Smckusick pc.cp++; 15112080Smckusick PFLUSH(); 15122080Smckusick curfile = ERR; 15132080Smckusick continue; 15142109Smckusic case O_PUT: 15152109Smckusic pc.cp++; 15162109Smckusic PUT(curfile); 15172109Smckusic continue; 15182080Smckusick case O_GET: 15192080Smckusick pc.cp++; 15202080Smckusick GET(curfile); 15212080Smckusick continue; 15222080Smckusick case O_FNIL: 15232080Smckusick pc.cp++; 15242080Smckusick pushaddr(FNIL(popaddr())); 15252080Smckusick continue; 15262080Smckusick case O_DEFNAME: 15272080Smckusick pc.cp++; 15282080Smckusick DEFNAME(); 15292950Smckusic popsp((long)(2*sizeof(char *)+2*sizeof(long))); 15302080Smckusick continue; 15312080Smckusick case O_RESET: 15322080Smckusick pc.cp++; 15332080Smckusick RESET(); 15342950Smckusic popsp((long)(2*sizeof(char *)+2*sizeof(long))); 15352080Smckusick continue; 15362080Smckusick case O_REWRITE: 15372080Smckusick pc.cp++; 15382080Smckusick REWRITE(); 15392950Smckusic popsp((long)(2*sizeof(char *)+2*sizeof(long))); 15402080Smckusick continue; 15412080Smckusick case O_FILE: 15422080Smckusick pc.cp++; 15432080Smckusick pushaddr(ACTFILE(curfile)); 15442080Smckusick continue; 15452080Smckusick case O_REMOVE: 15462080Smckusick pc.cp++; 15472080Smckusick REMOVE(); 15482950Smckusic popsp((long)(sizeof(char *)+sizeof(long))); 15492080Smckusick continue; 15502080Smckusick case O_FLUSH: 15512080Smckusick pc.cp++; 15522080Smckusick FLUSH(); 15532950Smckusic popsp((long)(sizeof(char *))); 15542080Smckusick continue; 15552080Smckusick case O_PACK: 15562080Smckusick pc.cp++; 15572080Smckusick PACK(); 15582950Smckusic popsp((long)(5*sizeof(long)+2*sizeof(char*))); 15592080Smckusick continue; 15602080Smckusick case O_UNPACK: 15612080Smckusick pc.cp++; 15622080Smckusick UNPACK(); 15632950Smckusic popsp((long)(5*sizeof(long)+2*sizeof(char*))); 15642080Smckusick continue; 15652080Smckusick case O_ARGC: 15662080Smckusick pc.cp++; 15672950Smckusic push4((long)_argc); 15682080Smckusick continue; 15692080Smckusick case O_ARGV: 15702080Smckusick tl = *pc.cp++; /* tl = size of char array */ 15712080Smckusick if (tl == 0) 15722080Smckusick tl = *pc.usp++; 15732080Smckusick tcp = popaddr(); /* tcp = addr of char array */ 15742080Smckusick tl1 = pop4(); /* tl1 = argv subscript */ 15752080Smckusick ARGV(tl1, tcp, tl); 15762080Smckusick continue; 15772080Smckusick case O_CLCK: 15782080Smckusick pc.cp++; 15792080Smckusick push4(CLCK()); 15802080Smckusick continue; 15812080Smckusick case O_WCLCK: 15822080Smckusick pc.cp++; 15832080Smckusick push4(time(0)); 15842080Smckusick continue; 15852080Smckusick case O_SCLCK: 15862080Smckusick pc.cp++; 15872080Smckusick push4(SCLCK()); 15882080Smckusick continue; 15892080Smckusick case O_NEW: 15902080Smckusick tl = *pc.cp++; /* tl = size being new'ed */ 15912080Smckusick if (tl == 0) 15922080Smckusick tl = *pc.usp++; 15932080Smckusick tcp = popaddr(); /* ptr to ptr being new'ed */ 15949231Smckusick NEW(tcp, tl); 15952191Smckusic if (_runtst) { 15969263Smckusick blkclr(*((char **)(tcp)), tl); 15972191Smckusic } 15982080Smckusick continue; 15997961Smckusick case O_DISPOSE: 16007961Smckusick tl = *pc.cp++; /* tl = size being disposed */ 16017961Smckusick if (tl == 0) 16027961Smckusick tl = *pc.usp++; 16037961Smckusick tcp = popaddr(); /* ptr to ptr being disposed */ 16047961Smckusick DISPOSE(tcp, tl); 16057961Smckusick *(char **)tcp = (char *)0; 16067961Smckusick continue; 16077961Smckusick case O_DFDISP: 16087961Smckusick tl = *pc.cp++; /* tl = size being disposed */ 16097961Smckusick if (tl == 0) 16107961Smckusick tl = *pc.usp++; 16117961Smckusick tcp = popaddr(); /* ptr to ptr being disposed */ 16127961Smckusick DFDISPOSE(tcp, tl); 16137961Smckusick *(char **)tcp = (char *)0; 16147961Smckusick continue; 16152080Smckusick case O_DATE: 16162080Smckusick pc.cp++; 16172080Smckusick DATE(popaddr()); 16182080Smckusick continue; 16192080Smckusick case O_TIME: 16202080Smckusick pc.cp++; 16212080Smckusick TIME(popaddr()); 16222080Smckusick continue; 16232080Smckusick case O_UNDEF: 16242080Smckusick pc.cp++; 16252080Smckusick pop8(); 16262950Smckusic push2((short)(0)); 16272080Smckusick continue; 16282080Smckusick case O_ATAN: 16292080Smckusick pc.cp++; 16305723Smckusic if (_runtst) { 16315723Smckusic push8(ATAN(pop8())); 16325723Smckusic continue; 16335723Smckusic } 16342080Smckusick push8(atan(pop8())); 16352080Smckusick continue; 16362080Smckusick case O_COS: 16372080Smckusick pc.cp++; 16385723Smckusic if (_runtst) { 16395723Smckusic push8(COS(pop8())); 16405723Smckusic continue; 16415723Smckusic } 16422080Smckusick push8(cos(pop8())); 16432080Smckusick continue; 16442080Smckusick case O_EXP: 16452080Smckusick pc.cp++; 16465723Smckusic if (_runtst) { 16475723Smckusic push8(EXP(pop8())); 16485723Smckusic continue; 16495723Smckusic } 16502080Smckusick push8(exp(pop8())); 16512080Smckusick continue; 16522080Smckusick case O_LN: 16532080Smckusick pc.cp++; 16542191Smckusic if (_runtst) { 16552191Smckusic push8(LN(pop8())); 16562191Smckusic continue; 16572191Smckusic } 16582191Smckusic push8(log(pop8())); 16592080Smckusick continue; 16602080Smckusick case O_SIN: 16612080Smckusick pc.cp++; 16625723Smckusic if (_runtst) { 16635723Smckusic push8(SIN(pop8())); 16645723Smckusic continue; 16655723Smckusic } 16662080Smckusick push8(sin(pop8())); 16672080Smckusick continue; 16682080Smckusick case O_SQRT: 16692080Smckusick pc.cp++; 16702191Smckusic if (_runtst) { 16712191Smckusic push8(SQRT(pop8())); 16722191Smckusic continue; 16732191Smckusic } 16742191Smckusic push8(sqrt(pop8())); 16752080Smckusick continue; 16762080Smckusick case O_CHR2: 16772080Smckusick case O_CHR4: 16782080Smckusick pc.cp++; 16792191Smckusic if (_runtst) { 16802950Smckusic push2((short)(CHR(pop4()))); 16812191Smckusic continue; 16822191Smckusic } 16832950Smckusic push2((short)(pop4())); 16842080Smckusick continue; 16852080Smckusick case O_ODD2: 16862080Smckusick case O_ODD4: 16872080Smckusick pc.cp++; 168810576Smckusick tl = pop4(); 168910576Smckusick push2((short)(tl & 1)); 16902080Smckusick continue; 16912080Smckusick case O_SUCC2: 16922109Smckusic tl = *pc.cp++; 16932109Smckusic if (tl == 0) 16942109Smckusic tl = *pc.sp++; 16952109Smckusic tl1 = pop4(); 16962191Smckusic if (_runtst) { 16972950Smckusic push2((short)(SUCC(tl1, tl, (long)(*pc.sp++)))); 16982191Smckusic continue; 16992191Smckusic } 17002950Smckusic push2((short)(tl1 + 1)); 17012191Smckusic pc.sp++; 17022080Smckusick continue; 17032080Smckusick case O_SUCC24: 17042109Smckusic tl = *pc.cp++; 17052109Smckusic if (tl == 0) 17062109Smckusic tl = *pc.sp++; 17072109Smckusic tl1 = pop4(); 17082191Smckusic if (_runtst) { 17092950Smckusic push4(SUCC(tl1, tl, (long)(*pc.sp++))); 17102191Smckusic continue; 17112191Smckusic } 17122191Smckusic push4(tl1 + 1); 17132191Smckusic pc.sp++; 17142109Smckusic continue; 17152080Smckusick case O_SUCC4: 17162109Smckusic tl = *pc.cp++; 17172109Smckusic if (tl == 0) 17182109Smckusic tl = *pc.lp++; 17192109Smckusic tl1 = pop4(); 17202191Smckusic if (_runtst) { 17212950Smckusic push4(SUCC(tl1, tl, (long)(*pc.lp++))); 17222191Smckusic continue; 17232191Smckusic } 17242191Smckusic push4(tl1 + 1); 17252191Smckusic pc.lp++; 17262080Smckusick continue; 17272080Smckusick case O_PRED2: 17282109Smckusic tl = *pc.cp++; 17292109Smckusic if (tl == 0) 17302109Smckusic tl = *pc.sp++; 17312109Smckusic tl1 = pop4(); 17322191Smckusic if (_runtst) { 17332950Smckusic push2((short)(PRED(tl1, tl, (long)(*pc.sp++)))); 17342191Smckusic continue; 17352191Smckusic } 17362950Smckusic push2((short)(tl1 - 1)); 17372191Smckusic pc.sp++; 17382080Smckusick continue; 17392080Smckusick case O_PRED24: 17402109Smckusic tl = *pc.cp++; 17412109Smckusic if (tl == 0) 17422109Smckusic tl = *pc.sp++; 17432109Smckusic tl1 = pop4(); 17442191Smckusic if (_runtst) { 17452950Smckusic push4(PRED(tl1, tl, (long)(*pc.sp++))); 17462191Smckusic continue; 17472191Smckusic } 17482191Smckusic push4(tl1 - 1); 17492191Smckusic pc.sp++; 17502109Smckusic continue; 17512080Smckusick case O_PRED4: 17522109Smckusic tl = *pc.cp++; 17532109Smckusic if (tl == 0) 17542109Smckusic tl = *pc.lp++; 17552109Smckusic tl1 = pop4(); 17562191Smckusic if (_runtst) { 17572950Smckusic push4(PRED(tl1, tl, (long)(*pc.lp++))); 17582191Smckusic continue; 17592191Smckusic } 17602191Smckusic push4(tl1 - 1); 17612191Smckusic pc.lp++; 17622080Smckusick continue; 17632080Smckusick case O_SEED: 17642080Smckusick pc.cp++; 17652080Smckusick push4(SEED(pop4())); 17662080Smckusick continue; 17672080Smckusick case O_RANDOM: 17682080Smckusick pc.cp++; 17692080Smckusick push8(RANDOM(pop8())); 17702080Smckusick continue; 17712080Smckusick case O_EXPO: 17722080Smckusick pc.cp++; 17732080Smckusick push4(EXPO(pop8())); 17742080Smckusick continue; 17752080Smckusick case O_SQR2: 17762080Smckusick case O_SQR4: 17772080Smckusick pc.cp++; 17782080Smckusick tl = pop4(); 17792080Smckusick push4(tl * tl); 17802080Smckusick continue; 17812080Smckusick case O_SQR8: 17822080Smckusick pc.cp++; 17832080Smckusick td = pop8(); 17842080Smckusick push8(td * td); 17852080Smckusick continue; 17862080Smckusick case O_ROUND: 17872080Smckusick pc.cp++; 17882080Smckusick push4(ROUND(pop8())); 17892080Smckusick continue; 17902080Smckusick case O_TRUNC: 17912080Smckusick pc.cp++; 17922080Smckusick push4(TRUNC(pop8())); 17932080Smckusick continue; 17942950Smckusic default: 17955682Smckusic ERROR("Panic: bad op code\n"); 17962950Smckusic continue; 17972080Smckusick } 17982080Smckusick } 17992080Smckusick } 1800