X-Git-Url: https://git.subgeniuskitty.com/unix-history/.git/blobdiff_plain/d669c3b3108011be7560f7eb6d06db32636774a9..79029c32280d78322b4fb003d1cf99489dda7f1c:/usr/src/usr.bin/pascal/px/interp.c diff --git a/usr/src/usr.bin/pascal/px/interp.c b/usr/src/usr.bin/pascal/px/interp.c index 406afb0e86..8a24aba5a2 100644 --- a/usr/src/usr.bin/pascal/px/interp.c +++ b/usr/src/usr.bin/pascal/px/interp.c @@ -1,6 +1,6 @@ /* Copyright (c) 1979 Regents of the University of California */ -static char sccsid[] = "@(#)interp.c 1.15 %G%"; +static char sccsid[] = "@(#)interp.c 1.17 %G%"; #include #include "whoami.h" @@ -90,6 +90,13 @@ struct iorec *_actfile[MAXFILES] = { ERR }; +/* + * stuff for pdx + */ + +union progcntr *pcaddrp; +asm(".globl _loopaddr"); + /* * Px profile array */ @@ -128,6 +135,8 @@ interpreter(base) union progcntr tpc; struct iorec **ip; + pcaddrp = &pc; + /* * Setup sets up any hardware specific parameters before * starting the interpreter. Typically this is inline replaced @@ -150,6 +159,8 @@ interpreter(base) stp = (struct stack *)pushsp((long)(sizeof(struct stack))); _dp = &_display.frame[0]; pc.cp = base; + + asm("_loopaddr:"); for(;;) { # ifdef DEBUG if (++opcptr == 10) @@ -160,6 +171,10 @@ interpreter(base) _profcnts[*pc.ucp]++; # endif PROFILE switch (*pc.ucp++) { + case O_BPT: /* breakpoint trap */ + asm(".byte 0"); + pc.ucp--; + continue; case O_NODUMP: _nodump = TRUE; /* and fall through */ @@ -986,14 +1001,14 @@ interpreter(base) if (tl == 0) tl = *pc.sp++; tl1 = pop2(); - push2((short)(RANG4(tl1, tl, *pc.sp++))); + push2((short)(RANG4(tl1, tl, (long)(*pc.sp++)))); continue; case O_RANG42: tl = *pc.cp++; if (tl == 0) tl = *pc.sp++; tl1 = pop4(); - push4(RANG4(tl1, tl, *pc.sp++)); + push4(RANG4(tl1, tl, (long)(*pc.sp++))); continue; case O_RSNG2: tl = *pc.cp++; @@ -1010,26 +1025,32 @@ interpreter(base) push4(RSNG4(tl1, tl)); continue; case O_RANG4: - pc.cp++; - tl = *pc.lp++; + tl = *pc.cp++; + if (tl == 0) + tl = *pc.lp++; tl1 = pop4(); push4(RANG4(tl1, tl, *pc.lp++)); continue; case O_RANG24: - pc.cp++; - tl = *pc.lp++; + tl = *pc.cp++; + if (tl == 0) + tl = *pc.lp++; tl1 = pop2(); push2((short)(RANG4(tl1, tl, *pc.lp++))); continue; case O_RSNG4: - pc.cp++; - tl = pop4(); - push4(RSNG4(tl, *pc.lp++)); + tl = *pc.cp++; + if (tl == 0) + tl = *pc.lp++; + tl1 = pop4(); + push4(RSNG4(tl1, tl)); continue; case O_RSNG24: - pc.cp++; - tl = pop2(); - push2((short)(RSNG4(tl, *pc.lp++))); + tl = *pc.cp++; + if (tl == 0) + tl = *pc.lp++; + tl1 = pop2(); + push2((short)(RSNG4(tl1, tl))); continue; case O_STLIM: pc.cp++; @@ -1156,7 +1177,7 @@ interpreter(base) tl = *pc.usp++; tl1 = pop4(); /* tl1 is the element */ tcp = pushsp((long)(0));/* tcp pts to set */ - tl2 = *pc.usp++; /* lower bound */ + tl2 = *pc.sp++; /* lower bound */ tb = IN(tl1, tl2, (long)(*pc.usp++), tcp); popsp(tl); push2((short)(tb)); @@ -1167,41 +1188,35 @@ interpreter(base) ASRT(ts, ""); continue; case O_FOR1U: - pc.cp++; - tcp = popaddr(); /* tcp = ptr to index var */ - if (*tcp < pop4()) { /* still going up */ - tl = *tcp + 1; /* inc index var */ - tl1 = *pc.sp++; /* index lower bound */ - tl2 = *pc.sp++; /* index upper bound */ - if (_runtst) - RANG4(tl, tl1, tl2); - *tcp = tl; /* update index var */ - pc.cp += *pc.sp;/* return to top of loop */ - continue; - } - pc.sp += 3; /* else fall through */ - continue; + /* + * with the shadowing of for loop variables + * the variable is always sizeof(long) hence + * nullifying the need for shorter length + * assignments + */ case O_FOR2U: - pc.cp++; - tsp = (short *)popaddr(); /* tsp = ptr to index var */ - if (*tsp < pop4()) { /* still going up */ - tl = *tsp + 1; /* inc index var */ - tl1 = *pc.sp++; /* index lower bound */ + tl1 = *pc.cp++; /* tl1 index lower bound */ + if (tl1 == 0) + tl1 = *pc.sp++; + tlp = (long *)popaddr(); /* tlp = ptr to index var */ + if (*tlp < pop4()) { /* still going up */ + tl = *tlp + 1; /* inc index var */ tl2 = *pc.sp++; /* index upper bound */ if (_runtst) RANG4(tl, tl1, tl2); - *tsp = tl; /* update index var */ + *tlp = tl; /* update index var */ pc.cp += *pc.sp;/* return to top of loop */ continue; } - pc.sp += 3; /* else fall through */ + pc.sp += 2; /* else fall through */ continue; case O_FOR4U: - pc.cp++; + tl1 = *pc.cp++; /* tl1 index lower bound */ + if (tl1 == 0) + tl1 = *pc.lp++; tlp = (long *)popaddr(); /* tlp = ptr to index var */ if (*tlp < pop4()) { /* still going up */ tl = *tlp + 1; /* inc index var */ - tl1 = *pc.lp++; /* index lower bound */ tl2 = *pc.lp++; /* index upper bound */ if (_runtst) RANG4(tl, tl1, tl2); @@ -1209,44 +1224,38 @@ interpreter(base) pc.cp += *pc.sp;/* return to top of loop */ continue; } - pc.sp += 5; /* else fall through */ - continue; - case O_FOR1D: - pc.cp++; - tcp = popaddr(); /* tcp = ptr to index var */ - if (*tcp > pop4()) { /* still going down */ - tl = *tcp - 1; /* inc index var */ - tl1 = *pc.sp++; /* index lower bound */ - tl2 = *pc.sp++; /* index upper bound */ - if (_runtst) - RANG4(tl, tl1, tl2); - *tcp = tl; /* update index var */ - pc.cp += *pc.sp;/* return to top of loop */ - continue; - } pc.sp += 3; /* else fall through */ continue; + case O_FOR1D: + /* + * with the shadowing of for loop variables + * the variable is always sizeof(long) hence + * nullifying the need for shorter length + * assignments + */ case O_FOR2D: - pc.cp++; - tsp = (short *)popaddr(); /* tsp = ptr to index var */ - if (*tsp > pop4()) { /* still going down */ - tl = *tsp - 1; /* inc index var */ - tl1 = *pc.sp++; /* index lower bound */ + tl1 = *pc.cp++; /* tl1 index lower bound */ + if (tl1 == 0) + tl1 = *pc.sp++; + tlp = (long *)popaddr(); /* tlp = ptr to index var */ + if (*tlp > pop4()) { /* still going down */ + tl = *tlp - 1; /* inc index var */ tl2 = *pc.sp++; /* index upper bound */ if (_runtst) RANG4(tl, tl1, tl2); - *tsp = tl; /* update index var */ + *tlp = tl; /* update index var */ pc.cp += *pc.sp;/* return to top of loop */ continue; } - pc.sp += 3; /* else fall through */ + pc.sp += 2; /* else fall through */ continue; case O_FOR4D: - pc.cp++; + tl1 = *pc.cp++; /* tl1 index lower bound */ + if (tl1 == 0) + tl1 = *pc.lp++; tlp = (long *)popaddr(); /* tlp = ptr to index var */ if (*tlp > pop4()) { /* still going down */ tl = *tlp - 1; /* inc index var */ - tl1 = *pc.lp++; /* index lower bound */ tl2 = *pc.lp++; /* index upper bound */ if (_runtst) RANG4(tl, tl1, tl2); @@ -1254,7 +1263,7 @@ interpreter(base) pc.cp += *pc.sp;/* return to top of loop */ continue; } - pc.sp += 5; /* else fall through */ + pc.sp += 3; /* else fall through */ continue; case O_READE: pc.cp++;