1*2080Smckusick /* Copyright (c) 1979 Regents of the University of California */ 2*2080Smckusick 3*2080Smckusick static char sccsid[] = "@(#)interp.c 1.1 01/07/81"; 4*2080Smckusick 5*2080Smckusick #include <math.h> 6*2080Smckusick #include "vars.h" 7*2080Smckusick #include "panics.h" 8*2080Smckusick #include "h02opcs.h" 9*2080Smckusick #include "machdep.h" 10*2080Smckusick #include "h01errs.h" 11*2080Smckusick #include "libpc.h" 12*2080Smckusick 13*2080Smckusick /* debugging variables */ 14*2080Smckusick char opc[10]; 15*2080Smckusick long opcptr = 9; 16*2080Smckusick 17*2080Smckusick /* 18*2080Smckusick * program variables 19*2080Smckusick */ 20*2080Smckusick struct disp _display[MAXLVL]; 21*2080Smckusick struct disp *_dp; 22*2080Smckusick long _lino = 0; 23*2080Smckusick int _argc; 24*2080Smckusick char **_argv; 25*2080Smckusick long _mode; 26*2080Smckusick long _nodump; 27*2080Smckusick long _stlim = 500000; 28*2080Smckusick long _stcnt = 0; 29*2080Smckusick char *_minptr = (char *)0x7fffffff; 30*2080Smckusick char *_maxptr = (char *)0; 31*2080Smckusick long *_pcpcount = (long *)0; 32*2080Smckusick long _cntrs = 0; 33*2080Smckusick long _rtns = 0; 34*2080Smckusick 35*2080Smckusick /* 36*2080Smckusick * file record variables 37*2080Smckusick */ 38*2080Smckusick long _filefre = PREDEF; 39*2080Smckusick struct iorechd _fchain = { 40*2080Smckusick 0, 0, 0, 0, /* only use fchain field */ 41*2080Smckusick INPUT /* fchain */ 42*2080Smckusick }; 43*2080Smckusick struct iorec *_actfile[MAXFILES] = { 44*2080Smckusick INPUT, 45*2080Smckusick OUTPUT, 46*2080Smckusick ERR 47*2080Smckusick }; 48*2080Smckusick 49*2080Smckusick /* 50*2080Smckusick * standard files 51*2080Smckusick */ 52*2080Smckusick char _inwin, _outwin, _errwin; 53*2080Smckusick struct iorechd input = { 54*2080Smckusick &_inwin, /* fileptr */ 55*2080Smckusick 0, /* lcount */ 56*2080Smckusick 0x7fffffff, /* llimit */ 57*2080Smckusick &_iob[0], /* fbuf */ 58*2080Smckusick OUTPUT, /* fchain */ 59*2080Smckusick STDLVL, /* flev */ 60*2080Smckusick "standard input", /* pfname */ 61*2080Smckusick FTEXT | FREAD | SYNC, /* funit */ 62*2080Smckusick 0, /* fblk */ 63*2080Smckusick 1 /* fsize */ 64*2080Smckusick }; 65*2080Smckusick struct iorechd output = { 66*2080Smckusick &_outwin, /* fileptr */ 67*2080Smckusick 0, /* lcount */ 68*2080Smckusick 0x7fffffff, /* llimit */ 69*2080Smckusick &_iob[1], /* fbuf */ 70*2080Smckusick ERR, /* fchain */ 71*2080Smckusick STDLVL, /* flev */ 72*2080Smckusick "standard output", /* pfname */ 73*2080Smckusick FTEXT | FWRITE | EOFF, /* funit */ 74*2080Smckusick 1, /* fblk */ 75*2080Smckusick 1 /* fsize */ 76*2080Smckusick }; 77*2080Smckusick struct iorechd _err = { 78*2080Smckusick &_errwin, /* fileptr */ 79*2080Smckusick 0, /* lcount */ 80*2080Smckusick 0x7fffffff, /* llimit */ 81*2080Smckusick &_iob[2], /* fbuf */ 82*2080Smckusick FILNIL, /* fchain */ 83*2080Smckusick STDLVL, /* flev */ 84*2080Smckusick "Message file", /* pfname */ 85*2080Smckusick FTEXT | FWRITE | EOFF, /* funit */ 86*2080Smckusick 2, /* fblk */ 87*2080Smckusick 1 /* fsize */ 88*2080Smckusick }; 89*2080Smckusick 90*2080Smckusick interpreter(base) 91*2080Smckusick char *base; 92*2080Smckusick { 93*2080Smckusick union progcntr pc; /* interpreted program cntr */ 94*2080Smckusick register char *vpc; /* register used for "pc" */ 95*2080Smckusick struct iorec *curfile; /* active file */ 96*2080Smckusick register struct stack *stp; /* active stack frame ptr */ 97*2080Smckusick /* 98*2080Smckusick * the following variables are used as scratch 99*2080Smckusick */ 100*2080Smckusick double td, td1; 101*2080Smckusick register long tl, tl1, tl2; 102*2080Smckusick long *tlp; 103*2080Smckusick short *tsp, *tsp1; 104*2080Smckusick register char *tcp; 105*2080Smckusick char *tcp1; 106*2080Smckusick struct stack *tstp; 107*2080Smckusick struct formalrtn *tfp; 108*2080Smckusick union progcntr tpc; 109*2080Smckusick struct iorec **ip; 110*2080Smckusick 111*2080Smckusick /* 112*2080Smckusick * necessary only on systems which do not initialize 113*2080Smckusick * memory to zero 114*2080Smckusick */ 115*2080Smckusick for (ip = &_actfile[3]; ip < &_actfile[MAXFILES]; *ip++ = FILNIL) 116*2080Smckusick /* void */; 117*2080Smckusick /* 118*2080Smckusick * set up global environment, then ``call'' the main program 119*2080Smckusick */ 120*2080Smckusick _display[0].locvars = pushsp(2 * sizeof(struct iorec *)); 121*2080Smckusick *(struct iorec **)(_display[0].locvars + 4) = OUTPUT; 122*2080Smckusick *(struct iorec **)(_display[0].locvars) = INPUT; 123*2080Smckusick _display[0].locvars += 8; /* >>> kludge <<< */ 124*2080Smckusick asm(" bispsw $0xe0"); /* enable overflow traps */ 125*2080Smckusick stp = (struct stack *)pushsp(sizeof(struct stack)); 126*2080Smckusick _dp = &_display[0]; 127*2080Smckusick pc.cp = base; 128*2080Smckusick for(;;) { 129*2080Smckusick if (++opcptr == 10) 130*2080Smckusick opcptr = 0; 131*2080Smckusick opc[opcptr] = *pc.ucp; 132*2080Smckusick switch (*pc.ucp++) { 133*2080Smckusick default: 134*2080Smckusick panic(PBADOP); 135*2080Smckusick continue; 136*2080Smckusick case O_NODUMP: 137*2080Smckusick _nodump++; 138*2080Smckusick asm(" bicpsw $0xe0");/* disable overflow checks */ 139*2080Smckusick /* and fall through */ 140*2080Smckusick case O_BEG: 141*2080Smckusick _dp += 1; /* enter local scope */ 142*2080Smckusick stp->odisp = *_dp; /* save old display value */ 143*2080Smckusick tl = *pc.ucp++; /* tl = name size */ 144*2080Smckusick stp->entry = pc.hdrp; /* pointer to entry info */ 145*2080Smckusick tl1 = -*pc.lp++; /* tl1 = local variable size */ 146*2080Smckusick pc.lp++; /* skip over number of args */ 147*2080Smckusick _lino = *pc.usp++; /* set new lino */ 148*2080Smckusick pc.cp += tl; /* skip over name text */ 149*2080Smckusick stp->file = curfile; /* save active file */ 150*2080Smckusick tcp = pushsp(tl1); /* tcp = new top of stack */ 151*2080Smckusick blkclr(tl1, tcp); /* zero stack frame */ 152*2080Smckusick stp->tos = pushsp(0); /* set top of stack pointer */ 153*2080Smckusick _dp->stp = stp; /* set new display pointer */ 154*2080Smckusick /* _dp->locvars = tcp; */ 155*2080Smckusick _dp->locvars = (char *)stp; /* kludge, use prev line */ 156*2080Smckusick continue; 157*2080Smckusick case O_END: 158*2080Smckusick PCLOSE(_dp->locvars); /* flush & close local files */ 159*2080Smckusick stp = _dp->stp; 160*2080Smckusick curfile = stp->file; /* restore old active file */ 161*2080Smckusick *_dp = stp->odisp; /* restore old display entry */ 162*2080Smckusick if (_dp == &_display[1]) 163*2080Smckusick return; /* exiting main proc ??? */ 164*2080Smckusick _lino = stp->lino; /* restore lino, pc, dp */ 165*2080Smckusick pc.cp = stp->pc.cp; 166*2080Smckusick _dp = stp->dp; 167*2080Smckusick popsp(-stp->entry->framesze + /* pop local vars */ 168*2080Smckusick sizeof(struct stack) + /* pop stack frame */ 169*2080Smckusick stp->entry->nargs); /* pop parms */ 170*2080Smckusick continue; 171*2080Smckusick case O_CALL: 172*2080Smckusick tl = *pc.cp++; 173*2080Smckusick tcp = base + *pc.lp++;/* calc new entry point */ 174*2080Smckusick tcp += sizeof(short); 175*2080Smckusick tcp = base + *(long *)tcp; 176*2080Smckusick stp = (struct stack *)pushsp(sizeof(struct stack)); 177*2080Smckusick stp->lino = _lino; /* save lino, pc, dp */ 178*2080Smckusick stp->pc.cp = pc.cp; 179*2080Smckusick stp->dp = _dp; 180*2080Smckusick _dp = &_display[tl]; /* set up new display ptr */ 181*2080Smckusick pc.cp = tcp; 182*2080Smckusick continue; 183*2080Smckusick case O_FCALL: 184*2080Smckusick tl = *pc.cp++; /* tl = number of args */ 185*2080Smckusick if (tl == 0) 186*2080Smckusick tl = *pc.lp++; 187*2080Smckusick tfp = (struct formalrtn *)popaddr(); 188*2080Smckusick stp = (struct stack *)pushsp(sizeof(struct stack)); 189*2080Smckusick stp->lino = _lino; /* save lino, pc, dp */ 190*2080Smckusick stp->pc.cp = pc.cp; 191*2080Smckusick stp->dp = _dp; 192*2080Smckusick pc.cp = tfp->entryaddr; /* calc new entry point */ 193*2080Smckusick tpc.sp = pc.sp + 1; 194*2080Smckusick tl -= tpc.hdrp->nargs; 195*2080Smckusick if (tl != 0) { 196*2080Smckusick if (tl > 0) 197*2080Smckusick tl += sizeof(int) - 1; 198*2080Smckusick else 199*2080Smckusick tl -= sizeof(int) - 1; 200*2080Smckusick ERROR(ENARGS, tl / sizeof(int)); 201*2080Smckusick } 202*2080Smckusick _dp = &_display[tfp->cbn];/* set up new display ptr */ 203*2080Smckusick blkcpy(sizeof(struct disp) * tfp->cbn, 204*2080Smckusick &_display[1], &tfp->disp[tfp->cbn]); 205*2080Smckusick blkcpy(sizeof(struct disp) * tfp->cbn, 206*2080Smckusick &tfp->disp[0], &_display[1]); 207*2080Smckusick continue; 208*2080Smckusick case O_FRTN: 209*2080Smckusick tl = *pc.cp++; /* tl = size of return obj */ 210*2080Smckusick if (tl == 0) 211*2080Smckusick tl = *pc.usp++; 212*2080Smckusick tcp = pushsp(0); 213*2080Smckusick tfp = *(struct formalrtn **)(tcp + tl); 214*2080Smckusick blkcpy(tl, tcp, tcp + sizeof(struct formalrtn *)); 215*2080Smckusick popsp(sizeof(struct formalrtn *)); 216*2080Smckusick blkcpy(sizeof(struct disp) * tfp->cbn, 217*2080Smckusick &tfp->disp[tfp->cbn], &_display[1]); 218*2080Smckusick continue; 219*2080Smckusick case O_FSAV: 220*2080Smckusick tfp = (struct formalrtn *)popaddr(); 221*2080Smckusick tfp->cbn = *pc.cp++; /* blk number of routine */ 222*2080Smckusick tcp = base + *pc.lp++;/* calc new entry point */ 223*2080Smckusick tcp += sizeof(short); 224*2080Smckusick tfp->entryaddr = base + *(long *)tcp; 225*2080Smckusick blkcpy(sizeof(struct disp) * tfp->cbn, 226*2080Smckusick &_display[1], &tfp->disp[0]); 227*2080Smckusick pushaddr(tfp); 228*2080Smckusick continue; 229*2080Smckusick case O_SDUP2: 230*2080Smckusick pc.cp++; 231*2080Smckusick tl = pop2(); 232*2080Smckusick push2(tl); 233*2080Smckusick push2(tl); 234*2080Smckusick continue; 235*2080Smckusick case O_SDUP4: 236*2080Smckusick pc.cp++; 237*2080Smckusick tl = pop4(); 238*2080Smckusick push4(tl); 239*2080Smckusick push4(tl); 240*2080Smckusick continue; 241*2080Smckusick case O_TRA: 242*2080Smckusick pc.cp++; 243*2080Smckusick pc.cp += *pc.sp; 244*2080Smckusick continue; 245*2080Smckusick case O_TRA4: 246*2080Smckusick pc.cp++; 247*2080Smckusick pc.cp = base + *pc.lp; 248*2080Smckusick continue; 249*2080Smckusick case O_GOTO: 250*2080Smckusick tstp = _display[*pc.cp++].stp; /* ptr to exit frame */ 251*2080Smckusick pc.cp = base + *pc.lp; 252*2080Smckusick stp = _dp->stp; 253*2080Smckusick while (tstp != stp) { 254*2080Smckusick if (_dp == &_display[1]) 255*2080Smckusick ERROR(EGOTO); /* exiting prog ??? */ 256*2080Smckusick PCLOSE(_dp->locvars); /* close local files */ 257*2080Smckusick curfile = stp->file; /* restore active file */ 258*2080Smckusick *_dp = stp->odisp; /* old display entry */ 259*2080Smckusick _dp = stp->dp; /* restore dp */ 260*2080Smckusick stp = _dp->stp; 261*2080Smckusick } 262*2080Smckusick /* pop locals, stack frame, parms, and return values */ 263*2080Smckusick popsp(stp->tos - pushsp(0)); 264*2080Smckusick continue; 265*2080Smckusick case O_LINO: 266*2080Smckusick if (_dp->stp->tos != pushsp(0)) 267*2080Smckusick panic(PSTKNEMP); 268*2080Smckusick _lino = *pc.cp++; /* set line number */ 269*2080Smckusick if (_lino == 0) 270*2080Smckusick _lino = *pc.sp++; 271*2080Smckusick LINO(); /* inc statement count */ 272*2080Smckusick continue; 273*2080Smckusick case O_PUSH: 274*2080Smckusick tl = *pc.cp++; 275*2080Smckusick if (tl == 0) 276*2080Smckusick tl = *pc.usp++; 277*2080Smckusick tl = (-tl + 1) & ~1; 278*2080Smckusick tcp = pushsp(tl); 279*2080Smckusick blkclr(tl, tcp); 280*2080Smckusick continue; 281*2080Smckusick case O_IF: 282*2080Smckusick pc.cp++; 283*2080Smckusick if (pop2()) 284*2080Smckusick pc.sp++; 285*2080Smckusick else 286*2080Smckusick pc.cp += *pc.sp; 287*2080Smckusick continue; 288*2080Smckusick case O_REL2: 289*2080Smckusick tl = pop2(); 290*2080Smckusick tl1 = pop2(); 291*2080Smckusick goto cmplong; 292*2080Smckusick case O_REL24: 293*2080Smckusick tl = pop2(); 294*2080Smckusick tl1 = pop4(); 295*2080Smckusick goto cmplong; 296*2080Smckusick case O_REL42: 297*2080Smckusick tl = pop4(); 298*2080Smckusick tl1 = pop2(); 299*2080Smckusick goto cmplong; 300*2080Smckusick case O_REL4: 301*2080Smckusick tl = pop4(); 302*2080Smckusick tl1 = pop4(); 303*2080Smckusick cmplong: 304*2080Smckusick tl2 = *pc.cp++; 305*2080Smckusick switch (tl2) { 306*2080Smckusick case releq: 307*2080Smckusick push2(tl1 == tl); 308*2080Smckusick continue; 309*2080Smckusick case relne: 310*2080Smckusick push2(tl1 != tl); 311*2080Smckusick continue; 312*2080Smckusick case rellt: 313*2080Smckusick push2(tl1 < tl); 314*2080Smckusick continue; 315*2080Smckusick case relgt: 316*2080Smckusick push2(tl1 > tl); 317*2080Smckusick continue; 318*2080Smckusick case relle: 319*2080Smckusick push2(tl1 <= tl); 320*2080Smckusick continue; 321*2080Smckusick case relge: 322*2080Smckusick push2(tl1 >= tl); 323*2080Smckusick continue; 324*2080Smckusick default: 325*2080Smckusick panic(PSYSTEM); 326*2080Smckusick continue; 327*2080Smckusick } 328*2080Smckusick case O_RELG: 329*2080Smckusick tl2 = *pc.cp++; /* tc has jump opcode */ 330*2080Smckusick tl = *pc.usp++; /* tl has comparison length */ 331*2080Smckusick tl1 = (tl + 1) & ~1; /* tl1 has arg stack length */ 332*2080Smckusick tcp = pushsp(0); /* tcp pts to first arg */ 333*2080Smckusick switch (tl2) { 334*2080Smckusick case releq: 335*2080Smckusick tl = RELEQ(tl, tcp + tl1, tcp); 336*2080Smckusick break; 337*2080Smckusick case relne: 338*2080Smckusick tl = RELNE(tl, tcp + tl1, tcp); 339*2080Smckusick break; 340*2080Smckusick case rellt: 341*2080Smckusick tl = RELSLT(tl, tcp + tl1, tcp); 342*2080Smckusick break; 343*2080Smckusick case relgt: 344*2080Smckusick tl = RELSGT(tl, tcp + tl1, tcp); 345*2080Smckusick break; 346*2080Smckusick case relle: 347*2080Smckusick tl = RELSLE(tl, tcp + tl1, tcp); 348*2080Smckusick break; 349*2080Smckusick case relge: 350*2080Smckusick tl = RELSGE(tl, tcp + tl1, tcp); 351*2080Smckusick break; 352*2080Smckusick default: 353*2080Smckusick panic(PSYSTEM); 354*2080Smckusick break; 355*2080Smckusick } 356*2080Smckusick popsp(tl1 << 1); 357*2080Smckusick push2(tl); 358*2080Smckusick continue; 359*2080Smckusick case O_RELT: 360*2080Smckusick tl2 = *pc.cp++; /* tc has jump opcode */ 361*2080Smckusick tl1 = *pc.usp++; /* tl1 has comparison length */ 362*2080Smckusick tcp = pushsp(0); /* tcp pts to first arg */ 363*2080Smckusick switch (tl2) { 364*2080Smckusick case releq: 365*2080Smckusick tl = RELEQ(tl1, tcp + tl1, tcp); 366*2080Smckusick break; 367*2080Smckusick case relne: 368*2080Smckusick tl = RELNE(tl1, tcp + tl1, tcp); 369*2080Smckusick break; 370*2080Smckusick case rellt: 371*2080Smckusick tl = RELTLT(tl1, tcp + tl1, tcp); 372*2080Smckusick break; 373*2080Smckusick case relgt: 374*2080Smckusick tl = RELTGT(tl1, tcp + tl1, tcp); 375*2080Smckusick break; 376*2080Smckusick case relle: 377*2080Smckusick tl = RELTLE(tl1, tcp + tl1, tcp); 378*2080Smckusick break; 379*2080Smckusick case relge: 380*2080Smckusick tl = RELTGE(tl1, tcp + tl1, tcp); 381*2080Smckusick break; 382*2080Smckusick default: 383*2080Smckusick panic(PSYSTEM); 384*2080Smckusick break; 385*2080Smckusick } 386*2080Smckusick popsp(tl1 << 1); 387*2080Smckusick push2(tl); 388*2080Smckusick continue; 389*2080Smckusick case O_REL28: 390*2080Smckusick td = pop2(); 391*2080Smckusick td1 = pop8(); 392*2080Smckusick goto cmpdbl; 393*2080Smckusick case O_REL48: 394*2080Smckusick td = pop4(); 395*2080Smckusick td1 = pop8(); 396*2080Smckusick goto cmpdbl; 397*2080Smckusick case O_REL82: 398*2080Smckusick td = pop8(); 399*2080Smckusick td1 = pop2(); 400*2080Smckusick goto cmpdbl; 401*2080Smckusick case O_REL84: 402*2080Smckusick td = pop8(); 403*2080Smckusick td1 = pop4(); 404*2080Smckusick goto cmpdbl; 405*2080Smckusick case O_REL8: 406*2080Smckusick td = pop8(); 407*2080Smckusick td1 = pop8(); 408*2080Smckusick cmpdbl: 409*2080Smckusick switch (*pc.cp++) { 410*2080Smckusick case releq: 411*2080Smckusick push2(td1 == td); 412*2080Smckusick continue; 413*2080Smckusick case relne: 414*2080Smckusick push2(td1 != td); 415*2080Smckusick continue; 416*2080Smckusick case rellt: 417*2080Smckusick push2(td1 < td); 418*2080Smckusick continue; 419*2080Smckusick case relgt: 420*2080Smckusick push2(td1 > td); 421*2080Smckusick continue; 422*2080Smckusick case relle: 423*2080Smckusick push2(td1 <= td); 424*2080Smckusick continue; 425*2080Smckusick case relge: 426*2080Smckusick push2(td1 >= td); 427*2080Smckusick continue; 428*2080Smckusick default: 429*2080Smckusick panic(PSYSTEM); 430*2080Smckusick continue; 431*2080Smckusick } 432*2080Smckusick case O_AND: 433*2080Smckusick pc.cp++; 434*2080Smckusick push2(pop2() & pop2()); 435*2080Smckusick continue; 436*2080Smckusick case O_OR: 437*2080Smckusick pc.cp++; 438*2080Smckusick push2(pop2() | pop2()); 439*2080Smckusick continue; 440*2080Smckusick case O_NOT: 441*2080Smckusick pc.cp++; 442*2080Smckusick push2(pop2() ^ 1); 443*2080Smckusick continue; 444*2080Smckusick case O_AS2: 445*2080Smckusick pc.cp++; 446*2080Smckusick tl = pop2(); 447*2080Smckusick *(short *)popaddr() = tl; 448*2080Smckusick continue; 449*2080Smckusick case O_AS4: 450*2080Smckusick pc.cp++; 451*2080Smckusick tl = pop4(); 452*2080Smckusick *(long *)popaddr() = tl; 453*2080Smckusick continue; 454*2080Smckusick case O_AS24: 455*2080Smckusick pc.cp++; 456*2080Smckusick tl = pop2(); 457*2080Smckusick *(long *)popaddr() = tl; 458*2080Smckusick continue; 459*2080Smckusick case O_AS42: 460*2080Smckusick pc.cp++; 461*2080Smckusick tl = pop4(); 462*2080Smckusick *(short *)popaddr() = tl; 463*2080Smckusick continue; 464*2080Smckusick case O_AS21: 465*2080Smckusick pc.cp++; 466*2080Smckusick tl = pop2(); 467*2080Smckusick *popaddr() = tl; 468*2080Smckusick continue; 469*2080Smckusick case O_AS41: 470*2080Smckusick pc.cp++; 471*2080Smckusick tl = pop4(); 472*2080Smckusick *popaddr() = tl; 473*2080Smckusick continue; 474*2080Smckusick case O_AS28: 475*2080Smckusick pc.cp++; 476*2080Smckusick tl = pop2(); 477*2080Smckusick *(double *)popaddr() = tl; 478*2080Smckusick continue; 479*2080Smckusick case O_AS48: 480*2080Smckusick pc.cp++; 481*2080Smckusick tl = pop4(); 482*2080Smckusick *(double *)popaddr() = tl; 483*2080Smckusick continue; 484*2080Smckusick case O_AS8: 485*2080Smckusick pc.cp++; 486*2080Smckusick td = pop8(); 487*2080Smckusick *(double *)popaddr() = td; 488*2080Smckusick continue; 489*2080Smckusick case O_AS: 490*2080Smckusick tl = *pc.cp++; 491*2080Smckusick if (tl == 0) 492*2080Smckusick tl = *pc.usp++; 493*2080Smckusick tl1 = (tl + 1) & ~1; 494*2080Smckusick tcp = pushsp(0); 495*2080Smckusick blkcpy(tl, tcp, *(char **)(tcp + tl1)); 496*2080Smckusick popsp(tl1 + sizeof(char *)); 497*2080Smckusick continue; 498*2080Smckusick case O_INX2P2: 499*2080Smckusick tl = *pc.cp++; /* tl has shift amount */ 500*2080Smckusick tl1 = (pop2() - *pc.sp++) << tl; 501*2080Smckusick pushaddr(popaddr() + tl1); 502*2080Smckusick continue; 503*2080Smckusick case O_INX4P2: 504*2080Smckusick tl = *pc.cp++; /* tl has shift amount */ 505*2080Smckusick tl1 = (pop4() - *pc.sp++) << tl; 506*2080Smckusick pushaddr(popaddr() + tl1); 507*2080Smckusick continue; 508*2080Smckusick case O_INX2: 509*2080Smckusick tl = *pc.cp++; /* tl has element size */ 510*2080Smckusick if (tl == 0) 511*2080Smckusick tl = *pc.usp++; 512*2080Smckusick tl1 = pop2(); /* index */ 513*2080Smckusick tl2 = *pc.sp++; 514*2080Smckusick SUBSC(tl1, tl2, tl2 + *pc.usp++); /* range check */ 515*2080Smckusick pushaddr(popaddr() + (tl1 - tl2) * tl); 516*2080Smckusick continue; 517*2080Smckusick case O_INX4: 518*2080Smckusick tl = *pc.cp++; /* tl has element size */ 519*2080Smckusick if (tl == 0) 520*2080Smckusick tl = *pc.usp++; 521*2080Smckusick tl1 = pop4(); /* index */ 522*2080Smckusick tl2 = *pc.sp++; 523*2080Smckusick SUBSC(tl1, tl2, tl2 + *pc.usp++); /* range check */ 524*2080Smckusick pushaddr(popaddr() + (tl1 - tl2) * tl); 525*2080Smckusick continue; 526*2080Smckusick case O_OFF: 527*2080Smckusick tl = *pc.cp++; 528*2080Smckusick if (tl == 0) 529*2080Smckusick tl = *pc.usp++; 530*2080Smckusick push4(pop4() + tl); 531*2080Smckusick continue; 532*2080Smckusick case O_NIL: 533*2080Smckusick pc.cp++; 534*2080Smckusick NIL(); 535*2080Smckusick continue; 536*2080Smckusick case O_ADD2: 537*2080Smckusick pc.cp++; 538*2080Smckusick push4(pop2() + pop2()); 539*2080Smckusick continue; 540*2080Smckusick case O_ADD4: 541*2080Smckusick pc.cp++; 542*2080Smckusick push4(pop4() + pop4()); 543*2080Smckusick continue; 544*2080Smckusick case O_ADD24: 545*2080Smckusick pc.cp++; 546*2080Smckusick tl = pop2(); 547*2080Smckusick push4(pop4() + tl); 548*2080Smckusick continue; 549*2080Smckusick case O_ADD42: 550*2080Smckusick pc.cp++; 551*2080Smckusick tl = pop4(); 552*2080Smckusick push4(pop2() + tl); 553*2080Smckusick continue; 554*2080Smckusick case O_ADD28: 555*2080Smckusick pc.cp++; 556*2080Smckusick tl = pop2(); 557*2080Smckusick push8(pop8() + tl); 558*2080Smckusick continue; 559*2080Smckusick case O_ADD48: 560*2080Smckusick pc.cp++; 561*2080Smckusick tl = pop4(); 562*2080Smckusick push8(pop8() + tl); 563*2080Smckusick continue; 564*2080Smckusick case O_ADD82: 565*2080Smckusick pc.cp++; 566*2080Smckusick td = pop8(); 567*2080Smckusick push8(pop2() + td); 568*2080Smckusick continue; 569*2080Smckusick case O_ADD84: 570*2080Smckusick pc.cp++; 571*2080Smckusick td = pop8(); 572*2080Smckusick push8(pop4() + td); 573*2080Smckusick continue; 574*2080Smckusick case O_SUB2: 575*2080Smckusick pc.cp++; 576*2080Smckusick tl = pop2(); 577*2080Smckusick push4(pop2() - tl); 578*2080Smckusick continue; 579*2080Smckusick case O_SUB4: 580*2080Smckusick pc.cp++; 581*2080Smckusick tl = pop4(); 582*2080Smckusick push4(pop4() - tl); 583*2080Smckusick continue; 584*2080Smckusick case O_SUB24: 585*2080Smckusick pc.cp++; 586*2080Smckusick tl = pop2(); 587*2080Smckusick push4(pop4() - tl); 588*2080Smckusick continue; 589*2080Smckusick case O_SUB42: 590*2080Smckusick pc.cp++; 591*2080Smckusick tl = pop4(); 592*2080Smckusick push4(pop2() - tl); 593*2080Smckusick continue; 594*2080Smckusick case O_SUB28: 595*2080Smckusick pc.cp++; 596*2080Smckusick tl = pop2(); 597*2080Smckusick push8(pop8() - tl); 598*2080Smckusick continue; 599*2080Smckusick case O_SUB48: 600*2080Smckusick pc.cp++; 601*2080Smckusick tl = pop4(); 602*2080Smckusick push8(pop8() - tl); 603*2080Smckusick continue; 604*2080Smckusick case O_SUB82: 605*2080Smckusick pc.cp++; 606*2080Smckusick td = pop8(); 607*2080Smckusick push8(pop2() - td); 608*2080Smckusick continue; 609*2080Smckusick case O_SUB84: 610*2080Smckusick pc.cp++; 611*2080Smckusick td = pop8(); 612*2080Smckusick push8(pop4() - td); 613*2080Smckusick continue; 614*2080Smckusick case O_MUL2: 615*2080Smckusick pc.cp++; 616*2080Smckusick push4(pop2() * pop2()); 617*2080Smckusick continue; 618*2080Smckusick case O_MUL4: 619*2080Smckusick pc.cp++; 620*2080Smckusick push4(pop4() * pop4()); 621*2080Smckusick continue; 622*2080Smckusick case O_MUL24: 623*2080Smckusick pc.cp++; 624*2080Smckusick tl = pop2(); 625*2080Smckusick push4(pop4() * tl); 626*2080Smckusick continue; 627*2080Smckusick case O_MUL42: 628*2080Smckusick pc.cp++; 629*2080Smckusick tl = pop4(); 630*2080Smckusick push4(pop2() * tl); 631*2080Smckusick continue; 632*2080Smckusick case O_MUL28: 633*2080Smckusick pc.cp++; 634*2080Smckusick tl = pop2(); 635*2080Smckusick push8(pop8() * tl); 636*2080Smckusick continue; 637*2080Smckusick case O_MUL48: 638*2080Smckusick pc.cp++; 639*2080Smckusick tl = pop4(); 640*2080Smckusick push8(pop8() * tl); 641*2080Smckusick continue; 642*2080Smckusick case O_MUL82: 643*2080Smckusick pc.cp++; 644*2080Smckusick td = pop8(); 645*2080Smckusick push8(pop2() * td); 646*2080Smckusick continue; 647*2080Smckusick case O_MUL84: 648*2080Smckusick pc.cp++; 649*2080Smckusick td = pop8(); 650*2080Smckusick push8(pop4() * td); 651*2080Smckusick continue; 652*2080Smckusick case O_ABS2: 653*2080Smckusick case O_ABS4: 654*2080Smckusick pc.cp++; 655*2080Smckusick tl = pop4(); 656*2080Smckusick push4(tl >= 0 ? tl : -tl); 657*2080Smckusick continue; 658*2080Smckusick case O_ABS8: 659*2080Smckusick pc.cp++; 660*2080Smckusick td = pop8(); 661*2080Smckusick push8(td >= 0.0 ? td : -td); 662*2080Smckusick continue; 663*2080Smckusick case O_NEG2: 664*2080Smckusick pc.cp++; 665*2080Smckusick push4(-pop2()); 666*2080Smckusick continue; 667*2080Smckusick case O_NEG4: 668*2080Smckusick pc.cp++; 669*2080Smckusick push4(-pop4()); 670*2080Smckusick continue; 671*2080Smckusick case O_NEG8: 672*2080Smckusick pc.cp++; 673*2080Smckusick push8(-pop8()); 674*2080Smckusick continue; 675*2080Smckusick case O_DIV2: 676*2080Smckusick pc.cp++; 677*2080Smckusick tl = pop2(); 678*2080Smckusick push4(pop2() / tl); 679*2080Smckusick continue; 680*2080Smckusick case O_DIV4: 681*2080Smckusick pc.cp++; 682*2080Smckusick tl = pop4(); 683*2080Smckusick push4(pop4() / tl); 684*2080Smckusick continue; 685*2080Smckusick case O_DIV24: 686*2080Smckusick pc.cp++; 687*2080Smckusick tl = pop2(); 688*2080Smckusick push4(pop4() / tl); 689*2080Smckusick continue; 690*2080Smckusick case O_DIV42: 691*2080Smckusick pc.cp++; 692*2080Smckusick tl = pop4(); 693*2080Smckusick push4(pop2() / tl); 694*2080Smckusick continue; 695*2080Smckusick case O_MOD2: 696*2080Smckusick pc.cp++; 697*2080Smckusick tl = pop2(); 698*2080Smckusick push4(pop2() % tl); 699*2080Smckusick continue; 700*2080Smckusick case O_MOD4: 701*2080Smckusick pc.cp++; 702*2080Smckusick tl = pop4(); 703*2080Smckusick push4(pop4() % tl); 704*2080Smckusick continue; 705*2080Smckusick case O_MOD24: 706*2080Smckusick pc.cp++; 707*2080Smckusick tl = pop2(); 708*2080Smckusick push4(pop4() % tl); 709*2080Smckusick continue; 710*2080Smckusick case O_MOD42: 711*2080Smckusick pc.cp++; 712*2080Smckusick tl = pop4(); 713*2080Smckusick push4(pop2() % tl); 714*2080Smckusick continue; 715*2080Smckusick case O_ADD8: 716*2080Smckusick pc.cp++; 717*2080Smckusick push8(pop8() + pop8()); 718*2080Smckusick continue; 719*2080Smckusick case O_SUB8: 720*2080Smckusick pc.cp++; 721*2080Smckusick td = pop8(); 722*2080Smckusick push8(pop8() - td); 723*2080Smckusick continue; 724*2080Smckusick case O_MUL8: 725*2080Smckusick pc.cp++; 726*2080Smckusick push8(pop8() * pop8()); 727*2080Smckusick continue; 728*2080Smckusick case O_DVD8: 729*2080Smckusick pc.cp++; 730*2080Smckusick td = pop8(); 731*2080Smckusick push8(pop8() / td); 732*2080Smckusick continue; 733*2080Smckusick case O_STOI: 734*2080Smckusick pc.cp++; 735*2080Smckusick push4(pop2()); 736*2080Smckusick continue; 737*2080Smckusick case O_STOD: 738*2080Smckusick pc.cp++; 739*2080Smckusick td = pop2(); 740*2080Smckusick push8(td); 741*2080Smckusick continue; 742*2080Smckusick case O_ITOD: 743*2080Smckusick pc.cp++; 744*2080Smckusick td = pop4(); 745*2080Smckusick push8(td); 746*2080Smckusick continue; 747*2080Smckusick case O_ITOS: 748*2080Smckusick pc.cp++; 749*2080Smckusick push2(pop4()); 750*2080Smckusick continue; 751*2080Smckusick case O_DVD2: 752*2080Smckusick pc.cp++; 753*2080Smckusick td = pop2(); 754*2080Smckusick push8(pop2() / td); 755*2080Smckusick continue; 756*2080Smckusick case O_DVD4: 757*2080Smckusick pc.cp++; 758*2080Smckusick td = pop4(); 759*2080Smckusick push8(pop4() / td); 760*2080Smckusick continue; 761*2080Smckusick case O_DVD24: 762*2080Smckusick pc.cp++; 763*2080Smckusick td = pop2(); 764*2080Smckusick push8(pop4() / td); 765*2080Smckusick continue; 766*2080Smckusick case O_DVD42: 767*2080Smckusick pc.cp++; 768*2080Smckusick td = pop4(); 769*2080Smckusick push8(pop2() / td); 770*2080Smckusick continue; 771*2080Smckusick case O_DVD28: 772*2080Smckusick pc.cp++; 773*2080Smckusick td = pop2(); 774*2080Smckusick push8(pop8() / td); 775*2080Smckusick continue; 776*2080Smckusick case O_DVD48: 777*2080Smckusick pc.cp++; 778*2080Smckusick td = pop4(); 779*2080Smckusick push8(pop8() / td); 780*2080Smckusick continue; 781*2080Smckusick case O_DVD82: 782*2080Smckusick pc.cp++; 783*2080Smckusick td = pop8(); 784*2080Smckusick push8(pop2() / td); 785*2080Smckusick continue; 786*2080Smckusick case O_DVD84: 787*2080Smckusick pc.cp++; 788*2080Smckusick td = pop8(); 789*2080Smckusick push8(pop4() / td); 790*2080Smckusick continue; 791*2080Smckusick case O_RV1: 792*2080Smckusick tcp = _display[*pc.ucp++].locvars; 793*2080Smckusick push2(*(tcp + *pc.sp++)); 794*2080Smckusick continue; 795*2080Smckusick case O_RV14: 796*2080Smckusick tcp = _display[*pc.ucp++].locvars; 797*2080Smckusick push4(*(tcp + *pc.sp++)); 798*2080Smckusick continue; 799*2080Smckusick case O_RV2: 800*2080Smckusick tcp = _display[*pc.ucp++].locvars; 801*2080Smckusick push2(*(short *)(tcp + *pc.sp++)); 802*2080Smckusick continue; 803*2080Smckusick case O_RV24: 804*2080Smckusick tcp = _display[*pc.ucp++].locvars; 805*2080Smckusick push4(*(short *)(tcp + *pc.sp++)); 806*2080Smckusick continue; 807*2080Smckusick case O_RV4: 808*2080Smckusick tcp = _display[*pc.ucp++].locvars; 809*2080Smckusick push4(*(long *)(tcp + *pc.sp++)); 810*2080Smckusick continue; 811*2080Smckusick case O_RV8: 812*2080Smckusick tcp = _display[*pc.ucp++].locvars; 813*2080Smckusick push8(*(double *)(tcp + *pc.sp++)); 814*2080Smckusick continue; 815*2080Smckusick case O_RV: 816*2080Smckusick tcp = _display[*pc.ucp++].locvars; 817*2080Smckusick tcp += *pc.sp++; 818*2080Smckusick tl = *pc.usp++; 819*2080Smckusick tcp1 = pushsp(tl); 820*2080Smckusick blkcpy(tl, tcp, tcp1); 821*2080Smckusick continue; 822*2080Smckusick case O_LV: 823*2080Smckusick tcp = _display[*pc.ucp++].locvars; 824*2080Smckusick pushaddr(tcp + *pc.sp++); 825*2080Smckusick continue; 826*2080Smckusick case O_LRV1: 827*2080Smckusick tcp = _display[*pc.ucp++].locvars; 828*2080Smckusick push2(*(tcp + *pc.lp++)); 829*2080Smckusick continue; 830*2080Smckusick case O_LRV14: 831*2080Smckusick tcp = _display[*pc.ucp++].locvars; 832*2080Smckusick push4(*(tcp + *pc.lp++)); 833*2080Smckusick continue; 834*2080Smckusick case O_LRV2: 835*2080Smckusick tcp = _display[*pc.ucp++].locvars; 836*2080Smckusick push2(*(short *)(tcp + *pc.lp++)); 837*2080Smckusick continue; 838*2080Smckusick case O_LRV24: 839*2080Smckusick tcp = _display[*pc.ucp++].locvars; 840*2080Smckusick push4(*(short *)(tcp + *pc.lp++)); 841*2080Smckusick continue; 842*2080Smckusick case O_LRV4: 843*2080Smckusick tcp = _display[*pc.ucp++].locvars; 844*2080Smckusick push4(*(long *)(tcp + *pc.lp++)); 845*2080Smckusick continue; 846*2080Smckusick case O_LRV8: 847*2080Smckusick tcp = _display[*pc.ucp++].locvars; 848*2080Smckusick push8(*(double *)(tcp + *pc.lp++)); 849*2080Smckusick continue; 850*2080Smckusick case O_LRV: 851*2080Smckusick tcp = _display[*pc.ucp++].locvars; 852*2080Smckusick tcp += *pc.lp++; 853*2080Smckusick tl = *pc.usp++; 854*2080Smckusick tcp1 = pushsp(tl); 855*2080Smckusick blkcpy(tl, tcp, tcp1); 856*2080Smckusick continue; 857*2080Smckusick case O_LLV: 858*2080Smckusick tcp = _display[*pc.ucp++].locvars; 859*2080Smckusick pushaddr(tcp + *pc.lp++); 860*2080Smckusick continue; 861*2080Smckusick case O_IND1: 862*2080Smckusick pc.cp++; 863*2080Smckusick push2(*popaddr()); 864*2080Smckusick continue; 865*2080Smckusick case O_IND14: 866*2080Smckusick pc.cp++; 867*2080Smckusick push4(*popaddr()); 868*2080Smckusick continue; 869*2080Smckusick case O_IND2: 870*2080Smckusick pc.cp++; 871*2080Smckusick push2(*(short *)(popaddr())); 872*2080Smckusick continue; 873*2080Smckusick case O_IND24: 874*2080Smckusick pc.cp++; 875*2080Smckusick push4(*(short *)(popaddr())); 876*2080Smckusick continue; 877*2080Smckusick case O_IND4: 878*2080Smckusick pc.cp++; 879*2080Smckusick push4(*(long *)(popaddr())); 880*2080Smckusick continue; 881*2080Smckusick case O_IND8: 882*2080Smckusick pc.cp++; 883*2080Smckusick push8(*(double *)(popaddr())); 884*2080Smckusick continue; 885*2080Smckusick case O_IND: 886*2080Smckusick tl = *pc.cp++; 887*2080Smckusick if (tl == 0) 888*2080Smckusick tl = *pc.usp++; 889*2080Smckusick tcp = popaddr(); 890*2080Smckusick tcp1 = pushsp((tl + 1) & ~1); 891*2080Smckusick blkcpy(tl, tcp, tcp1); 892*2080Smckusick continue; 893*2080Smckusick case O_CON1: 894*2080Smckusick push2(*pc.cp++); 895*2080Smckusick continue; 896*2080Smckusick case O_CON14: 897*2080Smckusick push4(*pc.cp++); 898*2080Smckusick continue; 899*2080Smckusick case O_CON2: 900*2080Smckusick pc.cp++; 901*2080Smckusick push2(*pc.sp++); 902*2080Smckusick continue; 903*2080Smckusick case O_CON24: 904*2080Smckusick pc.cp++; 905*2080Smckusick push4(*pc.sp++); 906*2080Smckusick continue; 907*2080Smckusick case O_CON4: 908*2080Smckusick pc.cp++; 909*2080Smckusick push4(*pc.lp++); 910*2080Smckusick continue; 911*2080Smckusick case O_CON8: 912*2080Smckusick pc.cp++; 913*2080Smckusick push8(*pc.dp++); 914*2080Smckusick continue; 915*2080Smckusick case O_CON: 916*2080Smckusick tl = *pc.cp++; 917*2080Smckusick if (tl == 0) 918*2080Smckusick tl = *pc.usp++; 919*2080Smckusick tl = (tl + 1) & ~1; 920*2080Smckusick tcp = pushsp(tl); 921*2080Smckusick blkcpy(tl, pc.cp, tcp); 922*2080Smckusick pc.cp += tl; 923*2080Smckusick continue; 924*2080Smckusick case O_LVCON: 925*2080Smckusick tl = *pc.cp++; 926*2080Smckusick if (tl == 0) 927*2080Smckusick tl = *pc.usp++; 928*2080Smckusick tl = (tl + 1) & ~1; 929*2080Smckusick pushaddr(pc.cp); 930*2080Smckusick pc.cp += tl; 931*2080Smckusick continue; 932*2080Smckusick case O_RANG2: 933*2080Smckusick tl = *pc.cp++; 934*2080Smckusick if (tl == 0) 935*2080Smckusick tl = *pc.sp++; 936*2080Smckusick tl1 = pop2(); 937*2080Smckusick push2(RANG4(tl1, tl, *pc.sp++)); 938*2080Smckusick continue; 939*2080Smckusick case O_RANG42: 940*2080Smckusick tl = *pc.cp++; 941*2080Smckusick if (tl == 0) 942*2080Smckusick tl = *pc.sp++; 943*2080Smckusick tl1 = pop4(); 944*2080Smckusick push4(RANG4(tl1, tl, *pc.sp++)); 945*2080Smckusick continue; 946*2080Smckusick case O_RSNG2: 947*2080Smckusick tl = *pc.cp++; 948*2080Smckusick if (tl == 0) 949*2080Smckusick tl = *pc.sp++; 950*2080Smckusick tl1 = pop2(); 951*2080Smckusick push2(RSNG4(tl1, tl)); 952*2080Smckusick continue; 953*2080Smckusick case O_RSNG42: 954*2080Smckusick tl = *pc.cp++; 955*2080Smckusick if (tl == 0) 956*2080Smckusick tl = *pc.sp++; 957*2080Smckusick tl1 = pop4(); 958*2080Smckusick push4(RSNG4(tl1, tl)); 959*2080Smckusick continue; 960*2080Smckusick case O_RANG4: 961*2080Smckusick pc.cp++; 962*2080Smckusick tl = *pc.lp++; 963*2080Smckusick tl1 = pop4(); 964*2080Smckusick push4(RANG4(tl1, tl, *pc.lp++)); 965*2080Smckusick continue; 966*2080Smckusick case O_RANG24: 967*2080Smckusick pc.cp++; 968*2080Smckusick tl = *pc.lp++; 969*2080Smckusick tl1 = pop2(); 970*2080Smckusick push2(RANG4(tl1, tl, *pc.lp++)); 971*2080Smckusick continue; 972*2080Smckusick case O_RSNG4: 973*2080Smckusick pc.cp++; 974*2080Smckusick tl = pop4(); 975*2080Smckusick push4(RSNG4(tl, *pc.lp++)); 976*2080Smckusick continue; 977*2080Smckusick case O_RSNG24: 978*2080Smckusick pc.cp++; 979*2080Smckusick tl = pop2(); 980*2080Smckusick push2(RSNG4(tl, *pc.lp++)); 981*2080Smckusick continue; 982*2080Smckusick case O_STLIM: 983*2080Smckusick pc.cp++; 984*2080Smckusick _stlim = pop4(); 985*2080Smckusick _stcnt--; 986*2080Smckusick LINO(); 987*2080Smckusick continue; 988*2080Smckusick case O_LLIMIT: 989*2080Smckusick pc.cp++; 990*2080Smckusick LLIMIT(); 991*2080Smckusick popargs(2); 992*2080Smckusick continue; 993*2080Smckusick case O_BUFF: 994*2080Smckusick BUFF(*pc.cp++); 995*2080Smckusick continue; 996*2080Smckusick case O_HALT: 997*2080Smckusick pc.cp++; 998*2080Smckusick panic(PHALT); 999*2080Smckusick continue; 1000*2080Smckusick case O_PXPBUF: 1001*2080Smckusick pc.cp++; 1002*2080Smckusick _cntrs = *pc.lp++; 1003*2080Smckusick _rtns = *pc.lp++; 1004*2080Smckusick _pcpcount = (long *)calloc(_cntrs + 1, sizeof(long)); 1005*2080Smckusick continue; 1006*2080Smckusick case O_COUNT: 1007*2080Smckusick pc.cp++; 1008*2080Smckusick _pcpcount[*pc.usp++]++; 1009*2080Smckusick continue; 1010*2080Smckusick case O_CASE1OP: 1011*2080Smckusick tl = *pc.cp++; /* tl = number of cases */ 1012*2080Smckusick if (tl == 0) 1013*2080Smckusick tl = *pc.usp++; 1014*2080Smckusick tsp = pc.sp + tl; /* ptr to end of jump table */ 1015*2080Smckusick tcp = (char *)tsp; /* tcp = ptr to case values */ 1016*2080Smckusick tl1 = pop2(); /* tl1 = element to find */ 1017*2080Smckusick for(; tl > 0; tl--) /* look for element */ 1018*2080Smckusick if (tl1 == *tcp++) 1019*2080Smckusick break; 1020*2080Smckusick if (tl == 0) /* default case => error */ 1021*2080Smckusick ERROR(ECASE, tl2); 1022*2080Smckusick pc.cp += *(tsp - tl); 1023*2080Smckusick continue; 1024*2080Smckusick case O_CASE2OP: 1025*2080Smckusick tl = *pc.cp++; /* tl = number of cases */ 1026*2080Smckusick if (tl == 0) 1027*2080Smckusick tl = *pc.usp++; 1028*2080Smckusick tsp = pc.sp + tl; /* ptr to end of jump table */ 1029*2080Smckusick tsp1 = tsp; /* tsp1 = ptr to case values */ 1030*2080Smckusick tl1 = (unsigned short)pop2();/* tl1 = element to find */ 1031*2080Smckusick for(; tl > 0; tl--) /* look for element */ 1032*2080Smckusick if (tl1 == *tsp1++) 1033*2080Smckusick break; 1034*2080Smckusick if (tl == 0) /* default case => error */ 1035*2080Smckusick ERROR(ECASE, tl2); 1036*2080Smckusick pc.cp += *(tsp - tl); 1037*2080Smckusick continue; 1038*2080Smckusick case O_CASE4OP: 1039*2080Smckusick tl = *pc.cp++; /* tl = number of cases */ 1040*2080Smckusick if (tl == 0) 1041*2080Smckusick tl = *pc.usp++; 1042*2080Smckusick tsp = pc.sp + tl; /* ptr to end of jump table */ 1043*2080Smckusick tlp = (long *)tsp; /* tlp = ptr to case values */ 1044*2080Smckusick tl1 = pop4(); /* tl1 = element to find */ 1045*2080Smckusick for(; tl > 0; tl--) /* look for element */ 1046*2080Smckusick if (tl1 == *tlp++) 1047*2080Smckusick break; 1048*2080Smckusick if (tl == 0) /* default case => error */ 1049*2080Smckusick ERROR(ECASE, tl2); 1050*2080Smckusick pc.cp += *(tsp - tl); 1051*2080Smckusick continue; 1052*2080Smckusick case O_ADDT: 1053*2080Smckusick tl = *pc.cp++; /* tl has comparison length */ 1054*2080Smckusick if (tl == 0) 1055*2080Smckusick tl = *pc.usp++; 1056*2080Smckusick tcp = pushsp(0); /* tcp pts to first arg */ 1057*2080Smckusick ADDT(tcp + tl, tcp + tl, tcp, tl >> 2); 1058*2080Smckusick popsp(tl); 1059*2080Smckusick continue; 1060*2080Smckusick case O_SUBT: 1061*2080Smckusick tl = *pc.cp++; /* tl has comparison length */ 1062*2080Smckusick if (tl == 0) 1063*2080Smckusick tl = *pc.usp++; 1064*2080Smckusick tcp = pushsp(0); /* tcp pts to first arg */ 1065*2080Smckusick SUBT(tcp + tl, tcp + tl, tcp, tl >> 2); 1066*2080Smckusick popsp(tl); 1067*2080Smckusick continue; 1068*2080Smckusick case O_MULT: 1069*2080Smckusick tl = *pc.cp++; /* tl has comparison length */ 1070*2080Smckusick if (tl == 0) 1071*2080Smckusick tl = *pc.usp++; 1072*2080Smckusick tcp = pushsp(0); /* tcp pts to first arg */ 1073*2080Smckusick MULT(tcp + tl, tcp + tl, tcp, tl >> 2); 1074*2080Smckusick popsp(tl); 1075*2080Smckusick continue; 1076*2080Smckusick case O_INCT: 1077*2080Smckusick tl = *pc.cp++; /* tl has number of args */ 1078*2080Smckusick if (tl == 0) 1079*2080Smckusick tl = *pc.usp++; 1080*2080Smckusick tl1 = INCT(); 1081*2080Smckusick popargs(tl); 1082*2080Smckusick push2(tl1); 1083*2080Smckusick continue; 1084*2080Smckusick case O_CTTOT: 1085*2080Smckusick tl = *pc.cp++; /* tl has number of args */ 1086*2080Smckusick if (tl == 0) 1087*2080Smckusick tl = *pc.usp++; 1088*2080Smckusick tl1 = tl * sizeof(long); 1089*2080Smckusick tcp = pushsp(0) + tl1; /* tcp pts to result space */ 1090*2080Smckusick CTTOT(tcp); 1091*2080Smckusick popargs(tl); 1092*2080Smckusick continue; 1093*2080Smckusick case O_CARD: 1094*2080Smckusick tl = *pc.cp++; /* tl has comparison length */ 1095*2080Smckusick if (tl == 0) 1096*2080Smckusick tl = *pc.usp++; 1097*2080Smckusick tcp = pushsp(0); /* tcp pts to set */ 1098*2080Smckusick tl1 = CARD(tcp, tl); 1099*2080Smckusick popsp(tl); 1100*2080Smckusick push2(tl1); 1101*2080Smckusick continue; 1102*2080Smckusick case O_IN: 1103*2080Smckusick tl = *pc.cp++; /* tl has comparison length */ 1104*2080Smckusick if (tl == 0) 1105*2080Smckusick tl = *pc.usp++; 1106*2080Smckusick tl1 = pop4(); /* tl1 is the element */ 1107*2080Smckusick tcp = pushsp(0); /* tcp pts to set */ 1108*2080Smckusick tl2 = *pc.usp++; /* lower bound */ 1109*2080Smckusick tl1 = IN(tl1, tl2, *pc.usp++, tcp); 1110*2080Smckusick popsp(tl); 1111*2080Smckusick push2(tl1); 1112*2080Smckusick continue; 1113*2080Smckusick case O_ASRT: 1114*2080Smckusick pc.cp++; 1115*2080Smckusick ASRT(pop2()); 1116*2080Smckusick continue; 1117*2080Smckusick case O_FOR1U: 1118*2080Smckusick pc.cp++; 1119*2080Smckusick tcp = (char *)pop4(); /* tcp = ptr to index var */ 1120*2080Smckusick if (*tcp < pop4()) { /* still going up */ 1121*2080Smckusick *tcp += 1; /* inc index var */ 1122*2080Smckusick pc.cp += *pc.sp;/* return to top of loop */ 1123*2080Smckusick continue; 1124*2080Smckusick } 1125*2080Smckusick pc.sp++; /* else fall through */ 1126*2080Smckusick continue; 1127*2080Smckusick case O_FOR2U: 1128*2080Smckusick pc.cp++; 1129*2080Smckusick tsp = (short *)pop4(); /* tsp = ptr to index var */ 1130*2080Smckusick if (*tsp < pop4()) { /* still going up */ 1131*2080Smckusick *tsp += 1; /* inc index var */ 1132*2080Smckusick pc.cp += *pc.sp;/* return to top of loop */ 1133*2080Smckusick continue; 1134*2080Smckusick } 1135*2080Smckusick pc.sp++; /* else fall through */ 1136*2080Smckusick continue; 1137*2080Smckusick case O_FOR4U: 1138*2080Smckusick pc.cp++; 1139*2080Smckusick tlp = (long *)pop4(); /* tlp = ptr to index var */ 1140*2080Smckusick if (*tlp < pop4()) { /* still going up */ 1141*2080Smckusick *tlp += 1; /* inc index var */ 1142*2080Smckusick pc.cp += *pc.sp;/* return to top of loop */ 1143*2080Smckusick continue; 1144*2080Smckusick } 1145*2080Smckusick pc.sp++; /* else fall through */ 1146*2080Smckusick continue; 1147*2080Smckusick case O_FOR1D: 1148*2080Smckusick pc.cp++; 1149*2080Smckusick tcp = (char *)pop4(); /* tcp = ptr to index var */ 1150*2080Smckusick if (*tcp > pop4()) { /* still going down */ 1151*2080Smckusick *tcp -= 1; /* dec index var */ 1152*2080Smckusick pc.cp += *pc.sp;/* return to top of loop */ 1153*2080Smckusick continue; 1154*2080Smckusick } 1155*2080Smckusick pc.sp++; /* else fall through */ 1156*2080Smckusick continue; 1157*2080Smckusick case O_FOR2D: 1158*2080Smckusick pc.cp++; 1159*2080Smckusick tsp = (short *)pop4(); /* tsp = ptr to index var */ 1160*2080Smckusick if (*tsp > pop4()) { /* still going down */ 1161*2080Smckusick *tsp -= 1; /* dec index var */ 1162*2080Smckusick pc.cp += *pc.sp;/* return to top of loop */ 1163*2080Smckusick continue; 1164*2080Smckusick } 1165*2080Smckusick pc.sp++; /* else fall through */ 1166*2080Smckusick continue; 1167*2080Smckusick case O_FOR4D: 1168*2080Smckusick pc.cp++; 1169*2080Smckusick tlp = (long *)pop4(); /* tlp = ptr to index var */ 1170*2080Smckusick if (*tlp > pop4()) { /* still going down */ 1171*2080Smckusick *tlp -= 1; /* dec index var */ 1172*2080Smckusick pc.cp += *pc.sp;/* return to top of loop */ 1173*2080Smckusick continue; 1174*2080Smckusick } 1175*2080Smckusick pc.sp++; /* else fall through */ 1176*2080Smckusick continue; 1177*2080Smckusick case O_READE: 1178*2080Smckusick pc.cp++; 1179*2080Smckusick push2(READE(curfile, base + *pc.lp++)); 1180*2080Smckusick continue; 1181*2080Smckusick case O_READ4: 1182*2080Smckusick pc.cp++; 1183*2080Smckusick push4(READ4(curfile)); 1184*2080Smckusick continue; 1185*2080Smckusick case O_READC: 1186*2080Smckusick pc.cp++; 1187*2080Smckusick push2(READC(curfile)); 1188*2080Smckusick continue; 1189*2080Smckusick case O_READ8: 1190*2080Smckusick pc.cp++; 1191*2080Smckusick push8(READ8(curfile)); 1192*2080Smckusick continue; 1193*2080Smckusick case O_READLN: 1194*2080Smckusick pc.cp++; 1195*2080Smckusick READLN(curfile); 1196*2080Smckusick continue; 1197*2080Smckusick case O_EOF: 1198*2080Smckusick pc.cp++; 1199*2080Smckusick push2(TEOF(popaddr())); 1200*2080Smckusick continue; 1201*2080Smckusick case O_EOLN: 1202*2080Smckusick pc.cp++; 1203*2080Smckusick push2(TEOLN(popaddr())); 1204*2080Smckusick continue; 1205*2080Smckusick case O_WRITEC: 1206*2080Smckusick pc.cp++; 1207*2080Smckusick WRITEC(curfile); 1208*2080Smckusick popargs(2); 1209*2080Smckusick continue; 1210*2080Smckusick case O_WRITES: 1211*2080Smckusick pc.cp++; 1212*2080Smckusick WRITES(curfile); 1213*2080Smckusick popargs(4); 1214*2080Smckusick continue; 1215*2080Smckusick case O_WRITEF: 1216*2080Smckusick WRITEF(curfile); 1217*2080Smckusick popargs(*pc.cp++); 1218*2080Smckusick continue; 1219*2080Smckusick case O_WRITLN: 1220*2080Smckusick pc.cp++; 1221*2080Smckusick WRITLN(curfile); 1222*2080Smckusick continue; 1223*2080Smckusick case O_PAGE: 1224*2080Smckusick pc.cp++; 1225*2080Smckusick PAGE(curfile); 1226*2080Smckusick continue; 1227*2080Smckusick case O_NAM: 1228*2080Smckusick pc.cp++; 1229*2080Smckusick tl = pop4(); 1230*2080Smckusick pushaddr(NAM(tl, base + *pc.lp++)); 1231*2080Smckusick continue; 1232*2080Smckusick case O_MAX: 1233*2080Smckusick tl = *pc.cp++; 1234*2080Smckusick if (tl == 0) 1235*2080Smckusick tl = *pc.usp++; 1236*2080Smckusick tl1 = pop4(); 1237*2080Smckusick push4(MAX(tl1, tl, *pc.usp++)); 1238*2080Smckusick continue; 1239*2080Smckusick case O_MIN: 1240*2080Smckusick tl = *pc.cp++; 1241*2080Smckusick if (tl == 0) 1242*2080Smckusick tl = *pc.usp++; 1243*2080Smckusick tl1 = pop4(); 1244*2080Smckusick push4(tl1 < tl ? tl1 : tl); 1245*2080Smckusick continue; 1246*2080Smckusick case O_UNIT: 1247*2080Smckusick pc.cp++; 1248*2080Smckusick curfile = UNIT(popaddr()); 1249*2080Smckusick continue; 1250*2080Smckusick case O_UNITINP: 1251*2080Smckusick pc.cp++; 1252*2080Smckusick curfile = INPUT; 1253*2080Smckusick continue; 1254*2080Smckusick case O_UNITOUT: 1255*2080Smckusick pc.cp++; 1256*2080Smckusick curfile = OUTPUT; 1257*2080Smckusick continue; 1258*2080Smckusick case O_MESSAGE: 1259*2080Smckusick pc.cp++; 1260*2080Smckusick PFLUSH(); 1261*2080Smckusick curfile = ERR; 1262*2080Smckusick continue; 1263*2080Smckusick case O_GET: 1264*2080Smckusick pc.cp++; 1265*2080Smckusick GET(curfile); 1266*2080Smckusick continue; 1267*2080Smckusick case O_FNIL: 1268*2080Smckusick pc.cp++; 1269*2080Smckusick pushaddr(FNIL(popaddr())); 1270*2080Smckusick continue; 1271*2080Smckusick case O_DEFNAME: 1272*2080Smckusick pc.cp++; 1273*2080Smckusick DEFNAME(); 1274*2080Smckusick popargs(4); 1275*2080Smckusick continue; 1276*2080Smckusick case O_RESET: 1277*2080Smckusick pc.cp++; 1278*2080Smckusick RESET(); 1279*2080Smckusick popargs(4); 1280*2080Smckusick continue; 1281*2080Smckusick case O_REWRITE: 1282*2080Smckusick pc.cp++; 1283*2080Smckusick REWRITE(); 1284*2080Smckusick popargs(4); 1285*2080Smckusick continue; 1286*2080Smckusick case O_FILE: 1287*2080Smckusick pc.cp++; 1288*2080Smckusick pushaddr(ACTFILE(curfile)); 1289*2080Smckusick continue; 1290*2080Smckusick case O_REMOVE: 1291*2080Smckusick pc.cp++; 1292*2080Smckusick REMOVE(); 1293*2080Smckusick popargs(2); 1294*2080Smckusick continue; 1295*2080Smckusick case O_FLUSH: 1296*2080Smckusick pc.cp++; 1297*2080Smckusick FLUSH(); 1298*2080Smckusick popargs(1); 1299*2080Smckusick continue; 1300*2080Smckusick case O_PACK: 1301*2080Smckusick pc.cp++; 1302*2080Smckusick PACK(); 1303*2080Smckusick popargs(7); 1304*2080Smckusick continue; 1305*2080Smckusick case O_UNPACK: 1306*2080Smckusick pc.cp++; 1307*2080Smckusick UNPACK(); 1308*2080Smckusick popargs(7); 1309*2080Smckusick continue; 1310*2080Smckusick case O_ARGC: 1311*2080Smckusick pc.cp++; 1312*2080Smckusick push4(_argc); 1313*2080Smckusick continue; 1314*2080Smckusick case O_ARGV: 1315*2080Smckusick tl = *pc.cp++; /* tl = size of char array */ 1316*2080Smckusick if (tl == 0) 1317*2080Smckusick tl = *pc.usp++; 1318*2080Smckusick tcp = popaddr(); /* tcp = addr of char array */ 1319*2080Smckusick tl1 = pop4(); /* tl1 = argv subscript */ 1320*2080Smckusick ARGV(tl1, tcp, tl); 1321*2080Smckusick continue; 1322*2080Smckusick case O_CLCK: 1323*2080Smckusick pc.cp++; 1324*2080Smckusick push4(CLCK()); 1325*2080Smckusick continue; 1326*2080Smckusick case O_WCLCK: 1327*2080Smckusick pc.cp++; 1328*2080Smckusick push4(time(0)); 1329*2080Smckusick continue; 1330*2080Smckusick case O_SCLCK: 1331*2080Smckusick pc.cp++; 1332*2080Smckusick push4(SCLCK()); 1333*2080Smckusick continue; 1334*2080Smckusick case O_DISPOSE: 1335*2080Smckusick tl = *pc.cp++; /* tl = size being disposed */ 1336*2080Smckusick if (tl == 0) 1337*2080Smckusick tl = *pc.usp++; 1338*2080Smckusick tcp = popaddr(); /* ptr to ptr being disposed */ 1339*2080Smckusick DISPOSE(tcp, tl); 1340*2080Smckusick *(char **)tcp = (char *)0; 1341*2080Smckusick continue; 1342*2080Smckusick case O_NEW: 1343*2080Smckusick tl = *pc.cp++; /* tl = size being new'ed */ 1344*2080Smckusick if (tl == 0) 1345*2080Smckusick tl = *pc.usp++; 1346*2080Smckusick tcp = popaddr(); /* ptr to ptr being new'ed */ 1347*2080Smckusick NEWZ(tcp, tl); 1348*2080Smckusick continue; 1349*2080Smckusick case O_DATE: 1350*2080Smckusick pc.cp++; 1351*2080Smckusick DATE(popaddr()); 1352*2080Smckusick continue; 1353*2080Smckusick case O_TIME: 1354*2080Smckusick pc.cp++; 1355*2080Smckusick TIME(popaddr()); 1356*2080Smckusick continue; 1357*2080Smckusick case O_UNDEF: 1358*2080Smckusick pc.cp++; 1359*2080Smckusick pop8(); 1360*2080Smckusick push2(0); 1361*2080Smckusick continue; 1362*2080Smckusick case O_ATAN: 1363*2080Smckusick pc.cp++; 1364*2080Smckusick push8(atan(pop8())); 1365*2080Smckusick continue; 1366*2080Smckusick case O_COS: 1367*2080Smckusick pc.cp++; 1368*2080Smckusick push8(cos(pop8())); 1369*2080Smckusick continue; 1370*2080Smckusick case O_EXP: 1371*2080Smckusick pc.cp++; 1372*2080Smckusick push8(exp(pop8())); 1373*2080Smckusick continue; 1374*2080Smckusick case O_LN: 1375*2080Smckusick pc.cp++; 1376*2080Smckusick push8(LN(pop8())); 1377*2080Smckusick continue; 1378*2080Smckusick case O_SIN: 1379*2080Smckusick pc.cp++; 1380*2080Smckusick push8(sin(pop8())); 1381*2080Smckusick continue; 1382*2080Smckusick case O_SQRT: 1383*2080Smckusick pc.cp++; 1384*2080Smckusick push8(SQRT(pop8())); 1385*2080Smckusick continue; 1386*2080Smckusick case O_CHR2: 1387*2080Smckusick case O_CHR4: 1388*2080Smckusick pc.cp++; 1389*2080Smckusick push2(CHR(pop4())); 1390*2080Smckusick continue; 1391*2080Smckusick case O_ODD2: 1392*2080Smckusick case O_ODD4: 1393*2080Smckusick pc.cp++; 1394*2080Smckusick push2(pop4() & 1); 1395*2080Smckusick continue; 1396*2080Smckusick case O_SUCC2: 1397*2080Smckusick /* Pi should be fixed to gen code for: 1398*2080Smckusick * tl = *pc.cp++; 1399*2080Smckusick * if (tl == 0) 1400*2080Smckusick * tl = *pc.sp++; 1401*2080Smckusick * tl1 = pop4(); 1402*2080Smckusick * push2(SUCC(tl1, tl, *pc.sp++)); 1403*2080Smckusick */ 1404*2080Smckusick pc.cp++; 1405*2080Smckusick push2(pop4() + 1); 1406*2080Smckusick continue; 1407*2080Smckusick case O_SUCC24: 1408*2080Smckusick /* Pi should be fixed to gen code for: 1409*2080Smckusick * tl = *pc.cp++; 1410*2080Smckusick * if (tl == 0) 1411*2080Smckusick * tl = *pc.sp++; 1412*2080Smckusick * tl1 = pop4(); 1413*2080Smckusick * push4(SUCC(tl1, tl, *pc.sp++)); 1414*2080Smckusick */ 1415*2080Smckusick case O_SUCC4: 1416*2080Smckusick /* Pi should be fixed to gen code for: 1417*2080Smckusick * tl = *pc.cp++; 1418*2080Smckusick * if (tl == 0) 1419*2080Smckusick * tl = *pc.lp++; 1420*2080Smckusick * tl1 = pop4(); 1421*2080Smckusick * push4(SUCC(tl1, tl, *pc.lp++)); 1422*2080Smckusick */ 1423*2080Smckusick pc.cp++; 1424*2080Smckusick push4(pop4() + 1); 1425*2080Smckusick continue; 1426*2080Smckusick case O_PRED2: 1427*2080Smckusick /* Pi should be fixed to gen code for: 1428*2080Smckusick * tl = *pc.cp++; 1429*2080Smckusick * if (tl == 0) 1430*2080Smckusick * tl = *pc.sp++; 1431*2080Smckusick * tl1 = pop4(); 1432*2080Smckusick * push2(PRED(tl1, tl, *pc.sp++)); 1433*2080Smckusick */ 1434*2080Smckusick pc.cp++; 1435*2080Smckusick push2(pop4() - 1); 1436*2080Smckusick continue; 1437*2080Smckusick case O_PRED24: 1438*2080Smckusick /* Pi should be fixed to gen code for: 1439*2080Smckusick * tl = *pc.cp++; 1440*2080Smckusick * if (tl == 0) 1441*2080Smckusick * tl = *pc.sp++; 1442*2080Smckusick * tl1 = pop4(); 1443*2080Smckusick * push4(PRED(tl1, tl, *pc.sp++)); 1444*2080Smckusick */ 1445*2080Smckusick case O_PRED4: 1446*2080Smckusick /* Pi should be fixed to gen code for: 1447*2080Smckusick * tl = *pc.cp++; 1448*2080Smckusick * if (tl == 0) 1449*2080Smckusick * tl = *pc.lp++; 1450*2080Smckusick * tl1 = pop4(); 1451*2080Smckusick * push4(PRED(tl1, tl, *pc.lp++)); 1452*2080Smckusick */ 1453*2080Smckusick pc.cp++; 1454*2080Smckusick push4(pop4() - 1); 1455*2080Smckusick continue; 1456*2080Smckusick case O_SEED: 1457*2080Smckusick pc.cp++; 1458*2080Smckusick push4(SEED(pop4())); 1459*2080Smckusick continue; 1460*2080Smckusick case O_RANDOM: 1461*2080Smckusick pc.cp++; 1462*2080Smckusick push8(RANDOM(pop8())); 1463*2080Smckusick continue; 1464*2080Smckusick case O_EXPO: 1465*2080Smckusick pc.cp++; 1466*2080Smckusick push4(EXPO(pop8())); 1467*2080Smckusick continue; 1468*2080Smckusick case O_SQR2: 1469*2080Smckusick case O_SQR4: 1470*2080Smckusick pc.cp++; 1471*2080Smckusick tl = pop4(); 1472*2080Smckusick push4(tl * tl); 1473*2080Smckusick continue; 1474*2080Smckusick case O_SQR8: 1475*2080Smckusick pc.cp++; 1476*2080Smckusick td = pop8(); 1477*2080Smckusick push8(td * td); 1478*2080Smckusick continue; 1479*2080Smckusick case O_ROUND: 1480*2080Smckusick pc.cp++; 1481*2080Smckusick push4(ROUND(pop8())); 1482*2080Smckusick continue; 1483*2080Smckusick case O_TRUNC: 1484*2080Smckusick pc.cp++; 1485*2080Smckusick push4(TRUNC(pop8())); 1486*2080Smckusick continue; 1487*2080Smckusick } 1488*2080Smckusick } 1489*2080Smckusick } 1490