Annotation of researchv10no/cmd/PDP11/11as/as27.c, revision 1.1.1.1

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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.