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