Annotation of researchv10no/cmd/PDP11/11as/as23.c, revision 1.1

1.1     ! root        1: /* a3 -- pdp-11 assembler pass 2 */
        !             2: #include "as2.h"
        !             3: #define checkeos() (LAST('\n') || LAST(';') || LAST('\004'))
        !             4: 
        !             5: int brdelt;
        !             6: struct expr *curfb[20];
        !             7: 
        !             8: assem()
        !             9: {
        !            10:        OP op1,op2;
        !            11:        struct expr x;
        !            12: 
        !            13:        for (;;) {
        !            14:        op1=readop();
        !            15:        if (op1.v==5 || op1.v=='<') {
        !            16:                opline(op1); goto dotmax;
        !            17:        } else if (!checkeos()) {
        !            18:                if (op1.v==T_ABS) {op1.v=2; numval=getw();}
        !            19:                op2=readop();
        !            20:                if (LAST('=')) {
        !            21:                        x=expres(readop());
        !            22:                        if ((&op1.xp->typ)==dotrel) {           /* as in ".=.+2" */
        !            23:                                if ((x.typ&=~T_EXTERN)!=*dotrel) error('.');
        !            24:                                else if (x.typ==T_BSS) {*dot=x.val; goto dotmax;}
        !            25:                                else {
        !            26:                                        register short t = x.val-*dot;
        !            27:                                        if (t<0) error('.');
        !            28:                                        else {while (--t>=0) outb(T_ABS,0); goto dotmax;}
        !            29:                                }
        !            30:                        } else {
        !            31:                                if (x.typ==T_EXTERN) error('r');
        !            32:                                op1.xp->typ&=~037;
        !            33:                                if ((x.typ&=037)==0) x.val=0;
        !            34:                                op1.xp->typ |= x.typ; op1.xp->val=x.val;
        !            35:                        }
        !            36:                } else if (LAST(':')) {
        !            37:                        register int t;
        !            38:                        if (ISCHAR(op1)) {
        !            39:                                if (op1.v!=2) {error('x'); continue;}
        !            40:                                t=fbadv(numval);
        !            41:                                curfb[t]->typ= (curfb[t]->typ&~037) | *dotrel;
        !            42:                                brdelt=curfb[t]->val-*dot;
        !            43:                                curfb[t]->val= *dot;
        !            44:                        } else {
        !            45:                                if (passno==0) {
        !            46:                                        if ((t=op1.xp->typ&037)!=0 && t!=T_ESTTXT && t!=T_ESTDAT) error('m');
        !            47:                                        op1.xp->typ=(op1.xp->typ&~037)|*dotrel;
        !            48:                                        brdelt=op1.xp->val-*dot;
        !            49:                                        op1.xp->val= *dot;
        !            50:                                } else if (*dot!=op1.xp->val) error('p');
        !            51:                        }
        !            52:                        continue;
        !            53:                } else {
        !            54:                        register short *psiz;
        !            55:                        savop=op2; opline(op1);
        !            56:                  dotmax:
        !            57:                        psiz=(&hdr.txtsiz)+(*dotrel-T_TEXT);
        !            58:                        if (passno==0 && *dot>*psiz) *psiz= *dot;
        !            59:                        }
        !            60:                }
        !            61:        if (LAST('\n')) ++line;
        !            62:        else if (LAST('\004')) return;  /* sole exit */
        !            63:        }
        !            64: }
        !            65: 
        !            66: fbadv(t)
        !            67: {
        !            68:        register struct expr *p;
        !            69:        extern struct expr *fbbuf;
        !            70: 
        !            71:        if (curfb[t]=p=curfb[t+10]) p++;
        !            72:        else p=fbbuf;
        !            73:        for (;;) {
        !            74:                if ((p->typ>>8)==t || p->typ<0) break;
        !            75:                p++;
        !            76:        }
        !            77:        curfb[t+10]=p;
        !            78:        return(t);
        !            79: }

unix.superglobalmegacorp.com

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