/* * prg2out - convert gemdos .prg to minix a.out * info derived from * minixcvt.c - thanks frans (meulenbr@cst.prl.philips.nl) * and (re-hacked) relmix.c provided with minix St * ++jrb (bammi@sargsun.ces.cwru.edu) */ #include "st-out.h" extern long lseek(); struct aexec head; char buff[16384]; int fi, fo; char *progname; char *chmemstr; main(argc,argv) int argc; char *argv[]; { register int part, n; register long left; progname = argv[0]; if (argc > 1) switch (argv[1][0]) { case '-': case '+': case '=': chmemstr = argv[1]; argc--; argv++; } if (argc != 3) error('f', "Usage: %s [+-= amount] infile outfile", progname); if ((fi = open(argv[1], 0)) < 0) error('f',"Couldn't open %s for input",argv[1]); if ((fo = creat(argv[2], 0666)) < 0) error('f',"Couldn't open %s for output",argv[2]); /* * read header and copy to output */ if (read(fi, &head, sizeof(struct aexec)) != sizeof(struct aexec)) error('f', "read error (magic)"); if (head.a_magic != CMAGIC) error('f', "bad magic %04x, must be %04x", head.a_magic, CMAGIC); if (head.a_isreloc != 0) error('f', "no relocation info present"); /* write out minix head */ minixhead(); /* * copy text+data */ left = head.a_text + head.a_data; part = sizeof(buff); while (left) { n = left > part ? part : left; if (read(fi, buff, n) != n) error('f', "read error (text+data)"); if (write(fo, buff, n) != n) error('f', "write error(text+data)"); left -= n; } /* * skip symbols */ if (head.a_syms > 0) if (lseek(fi, head.a_syms, 1) != (sizeof(struct aexec) + head.a_text + head.a_data + head.a_syms)) error('f', "seek error"); /* * copy relocation info */ while((n = read(fi, buff, sizeof(buff))) > 0) if(write(fo, buff, n) != n) error('f',"write error(reloc)"); if(n != 0) error('f', "read error(reloc)"); close(fi); close(fo); } minixhead() { long mh[8]; char mb[32]; long stack; long chmem(); mh[0] = 0x04100301L; mh[1] = 0x00000020L; mh[2] = head.a_text; mh[3] = head.a_data; mh[4] = head.a_bss; mh[5] = 0; stack = 0x00010000L - (mh[3] + mh[4]); if ((mh[0] & 0x00200000L) == 0) /* not SEPARATE */ stack -= mh[2]; while (stack < 0) stack += 0x00010000L; if (chmemstr) stack = chmem(chmemstr, stack); printf("%ld bytes assigned to stack+malloc area\n", stack); mh[6] = stack + (mh[3] + mh[4]); if ((mh[0] & 0x00200000L) == 0) /* not SEPARATE */ mh[6] += mh[2]; mh[7] = 0; putstruc((char *)mh, "M44444444", mb); if (write(fo, mb, sizeof(mb)) != sizeof(mb)) error('f', "write error(head)"); } long chmem(str, old) char *str; long old; { register long num, new; long atol(); num = atol(str+1); if (num == 0) error('f', "bad chmem amount %s", str+1); switch (str[0]) { case '-': new = old - num; break; case '+': new = old + num; break; case '=': new = num; break; } return(new); } /* VARARGS2 */ error(t,s,a,b,c,d,e,f,g,h,i,j) char t; char *s; { printf("%s: ",progname); printf(s,a,b,c,d,e,f,g,h,i,j); printf("\n"); switch (t) { case 'w': return; case 'f': exit(1); case 'a': abort(); default: error('w',"Illegal error type: '%c'",t); } } #include "putstruc.c"