# /* * absolute loader format to a.out format conversion */ /* * function: * convert files in absolute loader format (paper-tape) * to unix a.out format. * usage: * absout infile outfile */ #define MEMLIM 0100000 /* 32768 - 16k */ struct ubuf { int fildes; /* file desriptor */ int nleft; /* chars left in buffer */ char *nextp; /* ptr. to next character */ char buff[512]; /* the BUFFER! */ }; struct { char lobyte, hibyte; }; struct ubuf fin; int fout_file; char mem[MEMLIM]; int hdr[] { 0407, 0, 0, 0, 0, 0, 0, 1 }; char *maxmem; int chksum; main(argc, argv) int argc; char *argv[]; { int register stat; if(argc != 3) { prints(2, "Usage: absout input-file output-file\n"); exit(1); } if(fopen(argv[1], &fin) < 0) { perror(argv[1]); exit(1); } if((fout_file = creat(argv[2], 0700)) < 0) { perror(argv[2]); exit(1); } clear(); while((stat = loadrec()) > 0); if(stat < 0) { prints(2, "bad input, end assumed\n"); } if(!maxmem) { prints(2, "no program\n"); exit(1); } aoutit(); close(fout_file); } clear() { register char *i; register int *ptr; i = (sizeof(mem)>>1)&077777; ptr = &mem[0]; do { *ptr++ = 0; } while(--i); maxmem = 0; } loadrec() { int count, adr; /* note: these must be memory locns. */ int register ct; char register *ptr; register int c; int flg; /* skip leader */ while(!(c = getbyte())) chksum = 0; if((c != 1) || getbyte()) return(-1); if(getword(&count) || getword(&adr)) return(-1); if((count =- 6) < 0) { /* bad count */ return(-1); } if(count) { /* real data record */ ct = count; ptr = &mem[adr]; if((adr =+ count) > maxmem) { maxmem = adr; if(maxmem > MEMLIM) { prints(2, "memory limit exceeded\n"); return(-1); } } do { if((c = getbyte()) < 0) return(-1); *ptr++ = c; } while(--ct); flg = 1; } else { /* start address */ if(adr >= maxmem) { prints(2, "start address outside program\n"); return(-1); } /* * room here for putting start address * in a.out file header, but unix can't cope * at moment so refrain. * hdr[5] = adr ; * */ hdr[5] = adr|1; flg = 0; } getbyte(); /* check-sum */ if(chksum&0377) return(-1); return(flg); } aoutit() { int register ct, i; int register *ptr; ct = (maxmem+1)&~1; hdr[2] = ct; write(fout_file, hdr, 16); write(fout_file, mem, ct); } getbyte() { register int c; if((c = getc(&fin)) < 0) return(-1); chksum =+ c; return(c); } getword(word) int *word; { register int c; if((c = getbyte()) < 0) return(-1); word->lobyte = c; if((c = getbyte()) < 0) return(-1); word->hibyte = c; return(0); }