Annotation of researchv10no/cmd/PDP11/11as/as21.c, revision 1.1.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.