mirror of
https://github.com/aap/pdp6.git
synced 2026-01-26 20:23:04 +00:00
ld6: added RIM10B loader to RIM format
This commit is contained in:
45
tools/ld6.c
45
tools/ld6.c
@@ -414,7 +414,8 @@ saverim(const char *filename)
|
||||
fclose(out);
|
||||
}
|
||||
|
||||
/* Saves in RIM10 format. Only one block is written.
|
||||
/* Saves in RIM10 format. Begins with the RIM10B loader,
|
||||
* after that only one block is written.
|
||||
* IOWD count,origin
|
||||
* word
|
||||
* ...
|
||||
@@ -423,6 +424,23 @@ saverim(const char *filename)
|
||||
* ...
|
||||
* JRST start
|
||||
*/
|
||||
word rim10b[] = {
|
||||
0777762000000,
|
||||
0710600000060,
|
||||
0541400000004,
|
||||
0710740000010,
|
||||
0254000000003,
|
||||
0710470000007,
|
||||
0256010000007,
|
||||
0256010000012,
|
||||
0364400000000,
|
||||
0312740000016,
|
||||
0270756000001,
|
||||
0331740000016,
|
||||
0254200000001,
|
||||
0253700000003,
|
||||
0254000000002,
|
||||
};
|
||||
void
|
||||
saverim10(const char *filename)
|
||||
{
|
||||
@@ -434,6 +452,10 @@ saverim10(const char *filename)
|
||||
out = mustopen(filename, "wb");
|
||||
checksum = 0;
|
||||
|
||||
/* write RIM10B loader */
|
||||
for(i = 0; i < 017; i++)
|
||||
writew(rim10b[i], out);
|
||||
|
||||
w = fw(-(locmax+1-locmin), locmin-1);
|
||||
writew(w, out); /* IOWD count,origin */
|
||||
checksum += w;
|
||||
@@ -441,23 +463,14 @@ saverim10(const char *filename)
|
||||
writew(mem[i], out);
|
||||
checksum += mem[i];
|
||||
}
|
||||
writew(-checksum, out);
|
||||
checksum &= 0777777777777;
|
||||
// writew(-checksum, out); /* this was apparently wrong? */
|
||||
writew(checksum, out);
|
||||
|
||||
writew(fw(0254000, start), out); /* JRST start */
|
||||
fclose(out);
|
||||
}
|
||||
|
||||
void
|
||||
writeww(word w, FILE *fp)
|
||||
{
|
||||
unsigned char c;
|
||||
putc((w >> 29) & 0177, fp);
|
||||
putc((w >> 22) & 0177, fp);
|
||||
putc((w >> 15) & 0177, fp);
|
||||
putc((w >> 8) & 0177, fp);
|
||||
putc((w>>1) & 0177 | (w & 1) << 7, fp);
|
||||
}
|
||||
|
||||
/* Saves in SAV format. Only one block is saved.
|
||||
* IOWD count,origin
|
||||
* word
|
||||
@@ -472,10 +485,10 @@ savesav(const char *filename)
|
||||
FILE *out;
|
||||
hword i;
|
||||
out = mustopen(filename, "wb");
|
||||
writeww(fw(-(locmax+1-locmin), locmin-1), out); /* IOWD count,origin */
|
||||
writewbak(fw(-(locmax+1-locmin), locmin-1), out); /* IOWD count,origin */
|
||||
for(i = locmin; i <= locmax; i++)
|
||||
writeww(mem[i], out);
|
||||
writeww(fw(0254000, start), out); /* JRST start */
|
||||
writewbak(mem[i], out);
|
||||
writewbak(fw(0254000, start), out); /* JRST start */
|
||||
fclose(out);
|
||||
}
|
||||
|
||||
|
||||
@@ -11,6 +11,7 @@ hword right(word w) { return w & 0777777; }
|
||||
word negw(word w) { return (~w + 1) & 0777777777777; }
|
||||
int isneg(word w) { return !!(w & 0400000000); }
|
||||
|
||||
/* write word in rim format */
|
||||
void
|
||||
writew(word w, FILE *fp)
|
||||
{
|
||||
@@ -37,6 +38,32 @@ readw(FILE *fp)
|
||||
return w;
|
||||
}
|
||||
|
||||
/* write word in backup format. This is what pdp10-ka expects. */
|
||||
void
|
||||
writewbak(word w, FILE *fp)
|
||||
{
|
||||
unsigned char c;
|
||||
putc((w >> 29) & 0177, fp);
|
||||
putc((w >> 22) & 0177, fp);
|
||||
putc((w >> 15) & 0177, fp);
|
||||
putc((w >> 8) & 0177, fp);
|
||||
putc((w>>1) & 0177 | (w & 1) << 7, fp);
|
||||
}
|
||||
|
||||
word
|
||||
readwbak(FILE *fp)
|
||||
{
|
||||
char buf[5];
|
||||
if(fread(buf, 1, 5, fp) != 5)
|
||||
return ~0;
|
||||
return (word)buf[0] << 29 |
|
||||
(word)buf[1] << 22 |
|
||||
(word)buf[2] << 15 |
|
||||
(word)buf[3] << 8 |
|
||||
((word)buf[4]&0177) << 1 |
|
||||
((word)buf[4]&0200) >> 7;
|
||||
}
|
||||
|
||||
/* decompose a double into sign, exponent and mantissa */
|
||||
void
|
||||
decompdbl(double d, int *s, word *e, uint64_t *m)
|
||||
|
||||
@@ -7,8 +7,11 @@ hword left(word w);
|
||||
hword right(word w);
|
||||
word negw(word w);
|
||||
int isneg(word w);
|
||||
|
||||
void writew(word w, FILE *fp);
|
||||
word readw(FILE *fp);
|
||||
void writewbak(word w, FILE *fp);
|
||||
word readwbak(FILE *fp);
|
||||
|
||||
void decompdbl(double d, int *s, word *e, uint64_t *m);
|
||||
word dtopdp(double d);
|
||||
|
||||
Reference in New Issue
Block a user