Annotation of 42BSD/ucb/pascal/px/interp.c, revision 1.1.1.1

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

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.