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

1.1       root        1: /* a6 -- pdp-11 assembler pass 1 */
                      2: #include "as1.h"
                      3: 
                      4: opline(op)
                      5: OP op;
                      6: {
                      7:        struct expr x;
                      8:        register int t,len;
                      9: 
                     10:        if (ISCHAR(op)) {
                     11:                if (op.v=='<') goto opl17;
                     12:        xpr:
                     13:                expres(op); *dot+=2; return;
                     14:        }
                     15:        t=op.xp->typ;
                     16:        if (t==T_REG || t<T_FLOPD || t>T_JXX) goto xpr;
                     17:        op=readop();
                     18:        switch (t) {
                     19:        case T_REG:
                     20:        case T_ESTTXT:
                     21:        case T_ESTDAT:
                     22:                goto xpr;
                     23: 
                     24:        case T_JBR: len=4; goto jxx;
                     25:        case T_JXX: len=6;
                     26:          jxx:
                     27:                x=expres(op);
                     28:                if (*dotrel==x.typ && ((t=x.val - *dot)<0 && t>=-0376)) len=2;
                     29:                *dot+=len;
                     30:                return;
                     31: 
                     32:        case T_MUL:
                     33:        case T_MOVF:
                     34:        case T_DOUBLE:
                     35:        case T_FLOPD:
                     36:        case T_FLOPF:
                     37:        case T_JSR:
                     38:                addres(); if (!LAST(',')) {errora(); return;}
                     39:                op=readop();
                     40: 
                     41:        case T_SINGLE:
                     42:                addres(); *dot+=2; return;
                     43: 
                     44:        case T_SOB:
                     45:                expres(op); if (!LAST(',')) errora();
                     46:                op=readop();
                     47: 
                     48:        case T_BRANCH:
                     49:        case T_RTS:
                     50:        case T_SYS:
                     51:                expres(op); *dot+=2; return;
                     52: 
                     53:        case T_BYTE:
                     54:                for (;;) {
                     55:                        expres(op); (*dot)++; if (!LAST(',')) break;
                     56:                        op=readop();
                     57:                }
                     58:                return;
                     59: 
                     60:        case T_STRING:
                     61:        opl17:
                     62:                *dot+=numval; readop(); return;
                     63: 
                     64:        case T_EVEN:
                     65:                (*dot)++; *dot&=~1; return;
                     66: 
                     67:        case T_IF:
                     68:                x=expres(op); if (x.typ!=T_ABS) error('U');
                     69:                if (x.val==0) ifflg++;
                     70:        case T_ENDIF:
                     71:                return;
                     72: 
                     73:        case T_GLOBL:
                     74:                for (;;) {
                     75:                        if (ISCHAR(op)) break;
                     76:                        op.xp->typ |= T_EXTERN;
                     77:                        op=readop(); if (!LAST(',')) break;
                     78:                        op=readop();
                     79:                }
                     80:                return;
                     81: 
                     82:        case T__TEXT:
                     83:        case T__DATA:
                     84:        case T__BSS:
                     85:                savdot[*dotrel-T_TEXT] = *dot;
                     86:                *dot = savdot[t-T__TEXT];
                     87:                *dotrel = t-T__TEXT+T_TEXT;
                     88:                return;
                     89: 
                     90:        case T_COMM:
                     91:                if (ISCHAR(op)) {error('x'); return;}
                     92:                op.xp->typ |= T_EXTERN;
                     93:                op=readop();
                     94:                if (!LAST(',')) {error('x'); return;}
                     95:                expres(readop());
                     96:                return;
                     97:        }
                     98: }
                     99: 
                    100: addres()
                    101: {
                    102:        register int t;
                    103:        struct expr x;
                    104: 
                    105:        if (LAST('(')) {
                    106:                x=expres(readop()); chkreg(&x); chkrp();
                    107:                if (!LAST('+')) return(2);
                    108:                readop();
                    109:                return(0);
                    110:        } else if (LAST('-')) {
                    111:                readop();
                    112:                if (!LAST('(')) {
                    113:                        savop=lastop; lastop.v='-';             /* fall through to end of else-if */
                    114:                } else {
                    115:                        x=expres(readop()); chkreg(&x); chkrp();
                    116:                        return(0);
                    117:                }
                    118:        } else if (LAST('$')) {
                    119:                expres(readop()); *dot+=2; return(0);
                    120:        } else if (LAST('*')) {
                    121:                readop(); if (LAST('*')) error('*');
                    122:                *dot+=(t=addres());
                    123:                return(t);
                    124:        }
                    125:        x=expres(lastop);
                    126:        if (LAST('(')) {
                    127:                x=expres(readop()); chkreg(&x); chkrp();
                    128:                *dot+=2; return(0);
                    129:        }
                    130:        if (x.typ==T_REG) {
                    131:                chkreg(&x); return(0);
                    132:        }
                    133:        *dot+=2;
                    134:        return(0);
                    135: }
                    136: 
                    137: errora()
                    138: {
                    139:        error('a');
                    140: }
                    141: 
                    142: chkreg(p)
                    143: register struct expr *p;
                    144: {
                    145:        if (((unsigned)p->val)>7 || (p->typ!=T_ABS && ((unsigned)p->typ)<=T_BSS))
                    146:                errora();
                    147: }
                    148: 
                    149: errore()
                    150: {
                    151:        error('e');
                    152: }
                    153: 
                    154: chkrp()
                    155: {
                    156:        if (!LAST(')')) {error(')'); return;}
                    157:        readop();
                    158: }

unix.superglobalmegacorp.com

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