Add original unix v6
This commit is contained in:
@@ -0,0 +1,146 @@
|
||||
/*
|
||||
* 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);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user