|
|
1.1 ! root 1: /* a7 -- pdp-11 assembler pass 2 */ ! 2: #include "as2.h" ! 3: ! 4: #define M -1 ! 5: #define X -2 ! 6: char reltp2[6][6] = { ! 7: T_UNDEF, T_UNDEF, T_UNDEF, T_UNDEF, T_UNDEF, T_UNDEF, ! 8: T_UNDEF, M, T_TEXT, T_DATA, T_BSS, T_EXTERN, ! 9: T_UNDEF, T_TEXT, X, X, X, X, ! 10: T_UNDEF, T_DATA, X, X, X, X, ! 11: T_UNDEF, T_BSS, X, X, X, X, ! 12: T_UNDEF, T_EXTERN,X, X, X, X, ! 13: }; ! 14: char reltm2[6][6] = { ! 15: T_UNDEF, T_UNDEF, T_UNDEF, T_UNDEF, T_UNDEF, T_UNDEF, ! 16: T_UNDEF, M, T_TEXT, T_DATA, T_BSS, T_EXTERN, ! 17: T_UNDEF, X, T_ABS, X, X, X, ! 18: T_UNDEF, X, X, T_ABS, X, X, ! 19: T_UNDEF, X, X, X, T_ABS, X, ! 20: T_UNDEF, X, X, X, X, X, ! 21: }; ! 22: char relte2[6][6] = { ! 23: T_UNDEF, T_UNDEF, T_UNDEF, T_UNDEF, T_UNDEF, T_UNDEF, ! 24: T_UNDEF, M, X, X, X, X, ! 25: T_UNDEF, X, X, X, X, X, ! 26: T_UNDEF, X, X, X, X, X, ! 27: T_UNDEF, X, X, X, X, X, ! 28: T_UNDEF, X, X, X, X, X, ! 29: }; ! 30: ! 31: struct expr ! 32: expres(op) ! 33: OP op; ! 34: { ! 35: register int ltyp,rtyp; ! 36: register short lval,rval; ! 37: int opprev = '+'; /* previous operator */ ! 38: struct expr x; ! 39: struct expr *savxsym; ! 40: ! 41: xsymbol=0; ! 42: lval=0; ltyp=T_ABS; ! 43: for (;;) { ! 44: if (!ISCHAR(op)) { ! 45: if ((rtyp=op.xp->typ)==T_UNDEF && passno) error('u'); ! 46: if (rtyp==T_EXTERN) {xsymbol=op.xp; rval=0;} ! 47: else rval=op.xp->val; ! 48: } else if (op.v>='a') { ! 49: rtyp=curfb[op.v-'a']->typ; ! 50: rval=curfb[op.v-'a']->val; ! 51: } else switch (op.v) { ! 52: default: ! 53: x.typ=ltyp; x.val=lval; ! 54: return(x); ! 55: case T_ABS: ! 56: rval=getw(); rtyp=T_ABS; break; ! 57: case 2: ! 58: rval=numval; rtyp=T_ABS; break; ! 59: case '+': case '-': case '*': case '/': ! 60: case '&': case 037: case 035: case 036: ! 61: case '%': case '^': case '!': ! 62: if (opprev!='+') errore(); ! 63: opprev=op.v; ! 64: goto advanc; ! 65: case '[': ! 66: savxsym=xsymbol; x=expres(readop()); if (xsymbol==0) xsymbol=savxsym; ! 67: if (!LAST(']')) error(']'); ! 68: rtyp=x.typ; rval=x.val; ! 69: } ! 70: switch (opprev) { ! 71: case '+': ltyp=combin(reltp2,rtyp,ltyp); lval+=rval; break; ! 72: case '-': ltyp=combin(reltm2,rtyp,ltyp); lval-=rval; break; ! 73: case '*': ltyp=combin(relte2,rtyp,ltyp); lval*=rval; break; ! 74: case '/': ltyp=combin(relte2,rtyp,ltyp); lval/=rval; break; ! 75: case 037: ltyp=combin(relte2,rtyp,ltyp); lval|=rval; break; ! 76: case '&': ltyp=combin(relte2,rtyp,ltyp); lval&=rval; break; ! 77: case 035: ltyp=combin(relte2,rtyp,ltyp); lval<<=rval; break; ! 78: case 036: ltyp=combin(relte2,rtyp,ltyp); lval>>=rval; break; ! 79: case '%': ltyp=combin(relte2,rtyp,ltyp); lval%=rval; break; ! 80: case '!': ltyp=combin(relte2,rtyp,ltyp); lval= ~rval; break; ! 81: case '^': ltyp=rtyp; break; ! 82: } ! 83: opprev='+'; ! 84: advanc: ! 85: op=readop(); ! 86: } ! 87: } ! 88: ! 89: int maxtyp; ! 90: ! 91: combin(tab,rtyp,ltyp) ! 92: register int rtyp,ltyp; ! 93: char tab[6][6]; ! 94: { ! 95: register int t; ! 96: ! 97: if (passno==0) { ! 98: t=(ltyp|rtyp)&T_EXTERN; ! 99: rtyp&=037; ltyp&=037; ! 100: if (rtyp>ltyp) {register int x=rtyp; rtyp=ltyp; ltyp=x;} ! 101: if (rtyp!=T_UNDEF) { ! 102: if (tab==reltm2) { ! 103: if (rtyp!=ltyp) return(t|ltyp); ! 104: return(T_ABS|t); ! 105: } else return(t|ltyp); ! 106: } else return(t); ! 107: } else { ! 108: maxtyp=0; ! 109: if ((ltyp=tab[maprel(rtyp)][maprel(ltyp)])>=0) return(ltyp); ! 110: if (ltyp!=M) error('r'); ! 111: return(maxtyp); ! 112: } ! 113: } ! 114: ! 115: maprel(t) ! 116: register int t; ! 117: { ! 118: if (t==T_EXTERN) return(R_EXTERN); ! 119: if ((t&=037)>maxtyp) maxtyp=t; ! 120: if (t<R_EXTERN) return(t); ! 121: return(T_ABS); ! 122: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.