|
|
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.