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

1.1     ! root        1: /* PDP-11 assembler pass 2 */
        !             2: #include "as2.h"
        !             3: #include <signal.h>
        !             4: #include <sys/types.h>
        !             5: #include <sys/stat.h>
        !             6: 
        !             7: #ifndef A_DOT_OUT
        !             8: #define A_DOT_OUT "a.out"              /*god: is tweakable*/
        !             9: #endif
        !            10: 
        !            11: struct stat statbuf;
        !            12: 
        !            13: struct {
        !            14:        char name[NCPS];
        !            15:        short dtyp;
        !            16:        short dval;
        !            17: } dsksym;
        !            18: 
        !            19: struct expr *usymtab;
        !            20: struct expr *usymend;
        !            21: struct expr *fbbuf;
        !            22: long tseek[2];
        !            23: long rseek[2];
        !            24: FILE *txtf,*relf;
        !            25: char *aoutp = A_DOT_OUT;               /*god:6/17/80 put in for porting*/
        !            26: char *atmp1,*atmp2,*atmp3;
        !            27: int outmod = 0777;
        !            28: extern int brtabp;
        !            29: 
        !            30: struct hdr hdr = {0407,0,0,0,0,0,0,0};
        !            31: 
        !            32: main(argc, argv)
        !            33: char **argv;
        !            34: {
        !            35:        extern char *sbrk();
        !            36:        extern saexit();
        !            37:        FILE *intfil,*fbfil,*symf;
        !            38:        int datbase,bssbase;
        !            39:        int nsym;
        !            40:        int defund = 0;
        !            41: 
        !            42:        if (signal(SIGINT,SIG_IGN)!=SIG_IGN) signal(SIGINT,saexit);
        !            43:        while (--argc>=0 && (++argv)[0][0]=='-') {
        !            44:                if (argv[0][1]=='g') defund=T_EXTERN;
        !            45:                if (argv[0][1]=='o' && --argc>=0) aoutp= *++argv;
        !            46:        }
        !            47:        if (argc!=3) {
        !            48:                fprintf(stderr, "as2: bad arguments\n");
        !            49:                saexit();
        !            50:        }
        !            51:        intfil=fopen(atmp1= *argv++,"r");
        !            52:           fbfil=fopen(atmp2= *argv++,"r");
        !            53:            symf=fopen(atmp3= *argv++,"r");
        !            54:        if (intfil==NULL || fbfil==NULL || symf==NULL) {
        !            55:                fprintf(stderr, "as2: can't reopen assembler temp file\n");
        !            56:                saexit();
        !            57:        }
        !            58:        if (NULL==(  txtf=fopen(  aoutp,"w"))) wrterr();
        !            59:        if (NULL==(  relf=fopen(  aoutp,"a"))) wrterr();
        !            60:        setbuf(intfil,sbrk(BUFSIZ));
        !            61:        setbuf( fbfil,sbrk(BUFSIZ));
        !            62:        setbuf(  symf,sbrk(BUFSIZ));
        !            63:        setbuf(  txtf,sbrk(BUFSIZ));
        !            64:        setbuf(  relf,sbrk(BUFSIZ));
        !            65: 
        !            66:        /* read symbol table */
        !            67:        {
        !            68:                register struct expr *sp;
        !            69:                register int n,t;
        !            70: 
        !            71:                fstat(fileno(symf),&statbuf); hdr.symsiz=statbuf.st_size;
        !            72:                nsym=n=statbuf.st_size/sizeof(dsksym);
        !            73:                if ((struct expr *)-1==(usymtab=sp=(struct expr *)sbrk(n*sizeof(*sp)))) saexit();
        !            74:                while (--n>=0) {
        !            75:                        if (1!=fread(&dsksym,sizeof(dsksym),1,symf)) wrterr();
        !            76:                        if ((t=dsksym.dtyp&037)==T_TEXT || t==T_DATA) {
        !            77:                                sp->typ=dsksym.dtyp+T_ESTTXT-T_TEXT; sp->val=dsksym.dval;
        !            78:                        } else {sp->typ=0; sp->val=0;}
        !            79:                        sp++;
        !            80:                }
        !            81:        }
        !            82: 
        !            83:        /* read f-b definitions */
        !            84:        {
        !            85:                register struct expr *fbp;
        !            86:                register int nfb;
        !            87: 
        !            88:                fstat(fileno(fbfil),&statbuf);
        !            89:                nfb=statbuf.st_size/sizeof(*fbp);
        !            90:                if ((struct expr *)-1==(fbbuf=fbp=(struct expr *)sbrk((nfb+1)*sizeof(*fbp)))) saexit();
        !            91:                if (nfb!=fread(fbp,sizeof(*fbp),nfb,fbfil)) wrterr();
        !            92:                while (--nfb>=0) fbp++->typ+=T_ESTTXT-T_TEXT;   /* mark "estimated" */
        !            93:                usymend=fbp; fbp->typ=0100000;
        !            94:        }
        !            95: 
        !            96:        setup();
        !            97:        assem();
        !            98: 
        !            99:        /* prepare for pass2 */
        !           100:        if (outmod!=0777) aexit();
        !           101:        *dot=0; *dotrel=T_TEXT; *dotdot=0; brtabp=0;
        !           102:        if (EOF==fseek(intfil,0L,0)) wrterr();
        !           103:        setup();
        !           104:        passno=1;
        !           105:        hdr.txtsiz=(hdr.txtsiz+1)&~1;
        !           106:        hdr.datsiz=(hdr.datsiz+1)&~1;
        !           107:        hdr.bsssiz=(hdr.bsssiz+1)&~1; 
        !           108:        savdot[T_DATA-T_TEXT]=datbase=hdr.txtsiz;
        !           109:        savdot[ T_BSS-T_TEXT]=bssbase=datbase+hdr.datsiz;
        !           110:        tseek[T_TEXT-T_TEXT]=sizeof(hdr);
        !           111:        tseek[T_DATA-T_TEXT]=sizeof(hdr)+hdr.txtsiz;
        !           112:        rseek[T_TEXT-T_TEXT]=sizeof(hdr)+hdr.txtsiz+hdr.datsiz;
        !           113:        rseek[T_DATA-T_TEXT]=sizeof(hdr)+hdr.txtsiz+hdr.datsiz+hdr.txtsiz;
        !           114: 
        !           115:        {/* doreloc */
        !           116:                register struct expr *sp = usymtab;
        !           117:                register int i = usymend-sp;
        !           118:                register int t;
        !           119: 
        !           120:                while (--i>=0) {
        !           121:                        if ((t=sp->typ&0377)==T_UNDEF) sp->typ |= defund;
        !           122:                        t&=037;
        !           123:                        if (t>=T_DATA && t<R_EXTERN)
        !           124:                                if (t==T_BSS) sp->val+=bssbase;
        !           125:                                else sp->val+=datbase;
        !           126:                        sp++;
        !           127:                }
        !           128:        }
        !           129: 
        !           130:        if (1!=fwrite(&hdr,sizeof(hdr),1,txtf)) wrterr();
        !           131:        fseek(txtf,tseek[T_TEXT-T_TEXT],0);
        !           132:        fseek(relf,rseek[T_TEXT-T_TEXT],0);
        !           133:        assem();
        !           134:        
        !           135:        {/* append full symbol table */
        !           136:                register struct expr *sp = usymtab;
        !           137:                register int n = nsym;
        !           138: 
        !           139:                fseek(symf,0L,0); fseek(relf,rseek[T_DATA-T_TEXT],0);
        !           140:                while (--n>=0) {
        !           141:                        if (1!=fread(&dsksym,sizeof(dsksym),1,symf)) wrterr();
        !           142:                        dsksym.dtyp=sp->typ; dsksym.dval=sp->val;
        !           143:                        if (1!=fwrite(&dsksym,sizeof(dsksym),1,relf)) wrterr();
        !           144:                        sp++;
        !           145:                }
        !           146:        }
        !           147:        aexit();
        !           148: }
        !           149: 
        !           150: aexit()
        !           151: {
        !           152:        unlink(atmp1); unlink(atmp2); unlink(atmp3);
        !           153:        if (errflg==0) chmod(aoutp,outmod&~umask(0));
        !           154:        exit(errflg);
        !           155: }
        !           156: 
        !           157: saexit()
        !           158: {
        !           159:        ++errflg; aexit();
        !           160: }
        !           161: 
        !           162: filerr(file,str)
        !           163: char *file,*str;
        !           164: {
        !           165:        fprintf(stderr,"%s%s",file,str);
        !           166: }
        !           167: 
        !           168: setup()
        !           169: {
        !           170:        register int i;
        !           171: 
        !           172:        for (i=20; --i>=0; ) curfb[i]=0;
        !           173:        for (i=10; --i>=0; ) fbadv(i);
        !           174: }

unix.superglobalmegacorp.com

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