home *** CD-ROM | disk | FTP | other *** search
- /*
- * fix system image for I/D space
- * Move data down to 0; move text to 4K.
- * Also put the data at the start of the
- * file and the text after it.
- */
-
- int tbuf[259];
- int rbuf[259];
- int obuf[259];
- int txtsiz;
- int datsiz;
- int bsssiz;
- int symsiz;
-
- int txtrel 8192;
- int datrel;
-
-
- main(argc, argv)
- char **argv;
- {
- register word, rel, s;
-
- if (argc<3) {
- printf("Arg count\n");
- exit(1);
- }
- if ((tbuf[0] = open(argv[1], 0)) < 0) {
- printf("Input file\n");
- exit(1);
- }
- rbuf[0] = open(argv[1], 0);
- if ((fcreat(argv[2], obuf)) < 0) {
- printf("Output file\n");
- exit(1);
- }
- if (getw(tbuf) != 0407) {
- printf("Bad input format\n");
- exit(1);
- }
- putw(0407, obuf);
- txtsiz = getw(tbuf);
- datsiz = getw(tbuf);
- bsssiz = getw(tbuf);
- symsiz = getw(tbuf);
- getw(tbuf);
- getw(tbuf);
- if (getw(tbuf) != 0) {
- printf("No relocation bits\n");
- exit(1);
- }
- putw(txtsiz, obuf);
- putw(datsiz, obuf);
- putw(bsssiz, obuf);
- putw(symsiz, obuf);
- putw(0, obuf);
- putw(0, obuf);
- putw(1, obuf);
- datrel = -txtsiz;
- /*
- * Copy out data first
- */
- tbuf[1] = 0;
- seek(tbuf[0], 020+txtsiz, 0);
- seek(rbuf[0], 020+txtsiz, 0);
- seek(rbuf[0], txtsiz, 1);
- seek(rbuf[0], datsiz, 1);
- s = datsiz >> 1;
- while (s--) {
- word = getw(tbuf);
- rel = getw(rbuf);
- if (rel&01)
- word =- datrel;
- word =+ getrel(rel);
- putw(word, obuf);
- }
- /*
- * Now to the text.
- */
- rbuf[1] = 0;
- tbuf[1] = 0;
- seek(rbuf[0], 020+txtsiz, 0);
- seek(rbuf[0], datsiz, 1);
- seek(tbuf[0], 020, 0);
- s = txtsiz >> 1;
- while(s--) {
- rel = getw(rbuf);
- word = getw(tbuf);
- if (rel&01)
- word =- txtrel;
- word =+ getrel(rel);
- putw(word, obuf);
- }
- /*
- * The symbol table.
- */
- tbuf[1] = 0;
- seek(tbuf[0], 020+txtsiz, 0);
- seek(tbuf[0], txtsiz, 1);
- seek(tbuf[0], datsiz, 1);
- seek(tbuf[0], datsiz, 1);
- s = symsiz;
- while ((s =- 12) >= 0) {
- putw(getw(tbuf), obuf);
- putw(getw(tbuf), obuf);
- putw(getw(tbuf), obuf);
- putw(getw(tbuf), obuf);
- rel = getw(tbuf);
- putw(rel, obuf);
- word = getw(tbuf);
- switch(rel&07) {
- case 2:
- word =+ txtrel;
- break;
-
- case 3:
- case 4:
- word =+ datrel;
- }
- putw(word, obuf);
- }
- fflush(obuf);
- close(obuf[0]);
- exit(0);
- }
-
- getrel(r)
- {
- switch (r&016) {
-
- case 02: /* ref to text */
- return(txtrel);
-
- case 04: /* ref to data */
- case 06: /* ref to bss */
- return(datrel);
-
- case 0:
- return(0);
-
- default:
- printf("Bad relocation %o\n", r);
- return(0);
- }
- }
-