|
|
1.1 root 1: /* a2 -- pdp-11 assembler pass 2 */
2: #include "as2.h"
3:
4: struct expr *xsymbol;
5:
6: outw(typ,val)
7: register int typ;
8: {
9: register int pcrel;
10:
11: if (*dotrel==T_BSS) {error('x'); return;}
12: if (*dot&1) {error('o'); outb(0,val); return;}
13: *dot+=2;
14: if (passno==0) return;
15: pcrel=typ&PCREL; typ&=~PCREL;
16: if (typ==T_EXTERN) {/* external references */
17: outmod=0666; /* non executable */
18: typ=((xsymbol-usymtab)<<3)|4; /* external relocation */
19: } else {
20: if ((typ&=~T_EXTERN)>=R_EXTERN) {
21: if (typ==T_ESTTXT || typ==T_ESTDAT) error('r');
22: typ=T_ABS;
23: }
24: if (typ>=T_TEXT && typ<=T_BSS) {
25: if (pcrel==0) val+= *dotdot;
26: } else if (pcrel) val-= *dotdot;
27: if (--typ<0) typ=0;
28: }
29: typ<<=1;
30: if (pcrel) typ|=1;
31: putw(val,txtf); tseek[*dotrel-T_TEXT]+=2;
32: putw(typ,relf); rseek[*dotrel-T_TEXT]+=2;
33: }
34:
35: outb(typ,val)
36: {
37: if (*dotrel==T_BSS) {error('x'); return;}
38: if ((unsigned)typ>T_ABS) error('r');
39: if (passno!=0) {
40: if (1!=fwrite(&val,1,1,txtf)) wrterr();
41: tseek[*dotrel-T_TEXT]++;
42: if (!(*dot&1)) {/* relocate immediately, so we don't forget */
43: val=0; if (1!=fwrite(&val,2,1,relf)) wrterr();
44: rseek[*dotrel-T_TEXT]+=2;
45: }
46: }
47: (*dot)++;
48: }
49:
50: char argb[20];
51:
52: error(t)
53: {
54: ++errflg; outmod=0666;
55: fprintf(stderr,"%s%c %.4d\n",argb,t,line);
56: argb[0]='\0';
57: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.