|
|
1.1 ! root 1: /* a7 -- pdp-11 assembler pass 1 */ ! 2: #include "as1.h" ! 3: int opfound; ! 4: ! 5: struct expr ! 6: expres(op) ! 7: OP op; ! 8: { ! 9: register int ltyp,rtyp; ! 10: register short lval,rval; ! 11: int opprev = '+'; /* previous operator */ ! 12: struct expr x; ! 13: ! 14: opfound=0; ! 15: lval=0; ltyp=T_ABS; ! 16: for (;;) { ! 17: if (!ISCHAR(op)) { ! 18: rtyp=op.xp->typ; rval=op.xp->val; ! 19: } else if (op.v>='a') { ! 20: if (op.v>=('a'+10)) {lval=0; ltyp=0;} ! 21: else { ! 22: rtyp=curfbr[op.v-'a']; ! 23: if ((lval=curfb[op.v-'a'])== -1) error('f'); ! 24: } ! 25: } else switch (op.v) { ! 26: default: ! 27: if (opfound==0) errore(); ! 28: x.typ=ltyp; x.val=lval; ! 29: return(x); ! 30: case T_ABS: ! 31: rval=numval; rtyp=T_ABS; break; ! 32: case '+': case '-': case '*': case '/': ! 33: case '&': case 037: case 035: case 036: ! 34: case '%': case '^': case '!': ! 35: if (opprev!='+') errore(); ! 36: opprev=op.v; ! 37: goto advanc; ! 38: case '[': ! 39: x=expres(readop()); ! 40: if (!LAST(']')) error(']'); ! 41: rtyp=x.typ; rval=x.val; ! 42: } ! 43: ++opfound; ! 44: switch (opprev) { ! 45: case '+': ltyp=combin(0,rtyp,ltyp); lval+=rval; break; ! 46: case '-': ltyp=combin(1,rtyp,ltyp); lval-=rval; break; ! 47: case '*': ltyp=combin(0,rtyp,ltyp); lval*=rval; break; ! 48: case '/': ltyp=combin(0,rtyp,ltyp); lval/=rval; break; ! 49: case 037: ltyp=combin(0,rtyp,ltyp); lval|=rval; break; ! 50: case '&': ltyp=combin(0,rtyp,ltyp); lval&=rval; break; ! 51: case 035: ltyp=combin(0,rtyp,ltyp); lval<<=rval; break; ! 52: case 036: ltyp=combin(0,rtyp,ltyp); lval>>=rval; break; ! 53: case '%': ltyp=combin(0,rtyp,ltyp); lval%=rval; break; ! 54: case '!': ltyp=combin(0,rtyp,ltyp); lval= ~rval; break; ! 55: case '^': ltyp=rtyp; break; ! 56: } ! 57: opprev='+'; ! 58: advanc: ! 59: op=readop(); ! 60: } ! 61: } ! 62: ! 63: combin(subtract,rtyp,ltyp) ! 64: register int rtyp,ltyp; ! 65: { ! 66: register int t; ! 67: ! 68: t=(rtyp|ltyp)&T_EXTERN; ! 69: rtyp&=037; ! 70: ltyp&=037; ! 71: if (rtyp>ltyp) {register int x=rtyp; rtyp=ltyp; ltyp=x;} ! 72: if (rtyp!=T_UNDEF) { ! 73: if (subtract) { ! 74: if (rtyp!=ltyp) return(t|ltyp); ! 75: return(T_ABS|t); ! 76: } else return(t|ltyp); ! 77: } else return(t); ! 78: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.