|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.