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