|
|
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 saexit();
36: FILE *intfil,*fbfil,*symf;
37: int datbase,bssbase;
38: int nsym;
39: int defund = 0;
40:
41: if (signal(SIGINT,SIG_IGN)!=SIG_IGN) signal(SIGINT,saexit);
42: while (--argc>=0 && (++argv)[0][0]=='-') {
43: if (argv[0][1]=='g') defund=T_EXTERN;
44: if (argv[0][1]=='o' && --argc>=0) aoutp= *++argv;
45: }
46: if (argc!=3) aexit();
47: intfil=freopen(atmp1= *argv++,"r",stdin);
48: fbfil=fopen(atmp2= *argv++,"r");
49: symf=fopen(atmp3= *argv++,"r");
50: if (NULL==( txtf=fopen( aoutp,"w"))) wrterr();
51: if (NULL==( relf=fopen( aoutp,"a"))) wrterr();
52: setbuf(intfil,sbrk(BUFSIZ));
53: setbuf( fbfil,sbrk(BUFSIZ));
54: setbuf( symf,sbrk(BUFSIZ));
55: setbuf( txtf,sbrk(BUFSIZ));
56: setbuf( relf,sbrk(BUFSIZ));
57:
58: /* read symbol table */
59: {
60: register struct expr *sp;
61: register int n,t;
62:
63: fstat(fileno(symf),&statbuf); hdr.symsiz=statbuf.st_size;
64: nsym=n=statbuf.st_size/sizeof(dsksym);
65: if (-1==(usymtab=sp=sbrk(n*sizeof(*sp)))) saexit();
66: while (--n>=0) {
67: if (1!=fread(&dsksym,sizeof(dsksym),1,symf)) wrterr();
68: if ((t=dsksym.dtyp&037)==T_TEXT || t==T_DATA) {
69: sp->typ=dsksym.dtyp+T_ESTTXT-T_TEXT; sp->val=dsksym.dval;
70: } else {sp->typ=0; sp->val=0;}
71: sp++;
72: }
73: }
74:
75: /* read f-b definitions */
76: {
77: register struct expr *fbp;
78: register int nfb;
79:
80: fstat(fileno(fbfil),&statbuf);
81: nfb=statbuf.st_size/sizeof(*fbp);
82: if (-1==(fbbuf=fbp=sbrk((nfb+1)*sizeof(*fbp)))) saexit();
83: if (nfb!=fread(fbp,sizeof(*fbp),nfb,fbfil)) wrterr();
84: while (--nfb>=0) fbp++->typ+=T_ESTTXT-T_TEXT; /* mark "estimated" */
85: usymend=fbp; fbp->typ=0100000;
86: }
87:
88: setup();
89: assem();
90:
91: /* prepare for pass2 */
92: if (outmod!=0777) aexit();
93: *dot=0; *dotrel=T_TEXT; *dotdot=0; brtabp=0;
94: if (EOF==fseek(intfil,0L,0)) wrterr();
95: setup();
96: passno=1;
97: hdr.txtsiz=(hdr.txtsiz+1)&~1;
98: hdr.datsiz=(hdr.datsiz+1)&~1;
99: hdr.bsssiz=(hdr.bsssiz+1)&~1;
100: savdot[T_DATA-T_TEXT]=datbase=hdr.txtsiz;
101: savdot[ T_BSS-T_TEXT]=bssbase=datbase+hdr.datsiz;
102: tseek[T_TEXT-T_TEXT]=sizeof(hdr);
103: tseek[T_DATA-T_TEXT]=sizeof(hdr)+hdr.txtsiz;
104: rseek[T_TEXT-T_TEXT]=sizeof(hdr)+hdr.txtsiz+hdr.datsiz;
105: rseek[T_DATA-T_TEXT]=sizeof(hdr)+hdr.txtsiz+hdr.datsiz+hdr.txtsiz;
106:
107: {/* doreloc */
108: register struct expr *sp = usymtab;
109: register int i = usymend-sp;
110: register int t;
111:
112: while (--i>=0) {
113: if ((t=sp->typ&0377)==T_UNDEF) sp->typ |= defund;
114: t&=037;
115: if (t>=T_DATA && t<R_EXTERN)
116: if (t==T_BSS) sp->val+=bssbase;
117: else sp->val+=datbase;
118: sp++;
119: }
120: }
121:
122: if (1!=fwrite(&hdr,sizeof(hdr),1,txtf)) wrterr();
123: fseek(txtf,tseek[T_TEXT-T_TEXT],0);
124: fseek(relf,rseek[T_TEXT-T_TEXT],0);
125: assem();
126:
127: {/* append full symbol table */
128: register struct expr *sp = usymtab;
129: register int n = nsym;
130:
131: fseek(symf,0L,0); fseek(relf,rseek[T_DATA-T_TEXT],0);
132: while (--n>=0) {
133: if (1!=fread(&dsksym,sizeof(dsksym),1,symf)) wrterr();
134: dsksym.dtyp=sp->typ; dsksym.dval=sp->val;
135: if (1!=fwrite(&dsksym,sizeof(dsksym),1,relf)) wrterr();
136: sp++;
137: }
138: }
139: aexit();
140: }
141:
142: aexit()
143: {
144: unlink(atmp1); unlink(atmp2); unlink(atmp3);
145: if (errflg==0) chmod(aoutp,outmod&~umask(0));
146: exit(errflg);
147: }
148:
149: saexit()
150: {
151: ++errflg; aexit();
152: }
153:
154: filerr(file,str)
155: char *file,*str;
156: {
157: fprintf(stderr,"%s%s",file,str);
158: }
159:
160: setup()
161: {
162: register int i;
163:
164: for (i=20; --i>=0; ) curfb[i]=0;
165: for (i=10; --i>=0; ) fbadv(i);
166: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.