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