|
|
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.