|
|
1.1 ! root 1: /* a3 -- pdp-11 assembler pass 1 */ ! 2: #include "as1.h" ! 3: #define checkeos() (LAST('\n') || LAST(';') || LAST('\004')) ! 4: ! 5: assem() ! 6: { ! 7: OP op1,op2; ! 8: ! 9: for (;;) { ! 10: op1=readop(); ! 11: if (!checkeos()) { ! 12: if (ifflg) { ! 13: if (ISCHAR(op1)) continue; ! 14: if (op1.xp->typ==T_IF) ++ifflg; ! 15: if (op1.xp->typ==T_ENDIF) --ifflg; ! 16: continue; ! 17: } ! 18: op2=readop(); ! 19: if (LAST('=')) { ! 20: struct expr x; ! 21: x=expres(readop()); ! 22: if (ISCHAR(op1)) error('x'); ! 23: else if ((&op1.xp->typ)==dotrel /* as in ".=.+2" */ ! 24: && (x.typ&=~T_EXTERN)!=*dotrel) { ! 25: error('.'); *dotrel=T_TEXT; ! 26: } else { ! 27: op1.xp->typ&=~037; ! 28: if ((x.typ&=037)==0) x.val=0; ! 29: op1.xp->typ |= x.typ; op1.xp->val=x.val; ! 30: } ! 31: } else if (LAST(':')) { ! 32: register int t; ! 33: if (ISCHAR(op1)) { ! 34: if (op1.v!=T_ABS) {error('x'); continue;} ! 35: t=fbcheck(numval); ! 36: curfbr[t]= *dotrel; curfb[t]= *dot; ! 37: nxtfb.c0= *dotrel; nxtfb.c1=t; nxtfb.val= *dot; ! 38: if (1!=fwrite(&nxtfb,sizeof(nxtfb),1,fbfil)) wrterr(); ! 39: } else { ! 40: if (op1.xp->typ&037) error('m'); ! 41: op1.xp->typ |= *dotrel; op1.xp->val = *dot; ! 42: } ! 43: continue; ! 44: } else { ! 45: savop=op2; opline(op1); ! 46: } ! 47: } ! 48: if (LAST('\n')) ++line; ! 49: else if (LAST(';')) ; ! 50: else if (LAST('\004')) { ! 51: if (ifflg) error('x'); ! 52: return; /* sole exit */ ! 53: } else { ! 54: error('x'); while (!checkeos()) readop(); ! 55: } ! 56: } ! 57: } ! 58: ! 59: fbcheck(t) ! 60: { ! 61: if (((unsigned)t)>9) {error('f'); t=0;} ! 62: return(t); ! 63: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.