95 lines
2 KiB
Text
95 lines
2 KiB
Text
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include <stdio.h>
|
|
|
|
#define CRLF "\r\n"
|
|
|
|
#define BASE 0xfe0000
|
|
#define RECLEN 32
|
|
|
|
void putS0(FILE* out, const char* header)
|
|
{
|
|
int i, csum, c;
|
|
int len = strlen(header);
|
|
fprintf(out, "S0%02X0000", 2 + len + 1);
|
|
csum = 0;
|
|
for (i=0; i<len; i++) {
|
|
c = ((int)header[i]) & 0xff;
|
|
csum += c;
|
|
fprintf(out, "%02X", c);
|
|
}
|
|
fprintf(out, "%02X" CRLF, (~csum) & 0xff);
|
|
}
|
|
|
|
void putS8(FILE* out,int start)
|
|
{
|
|
int csum = 4 + ((BASE>>16) & 0xff) + ((BASE>>8) & 0xff) + (BASE & 0xff);
|
|
fprintf(out, "S804%06X%02X" CRLF, BASE & 0xffffff, (~csum) &0xff);
|
|
}
|
|
|
|
void putS2(FILE* out, int addr, unsigned char* data, int n)
|
|
{
|
|
int i, csum, c;
|
|
|
|
fprintf(out, "S2%02X%06X", 3 + n + 1, addr & 0xffffff);
|
|
csum = 3 + n + 1 + ((addr>>16) & 0xff) + ((addr>>8) & 0xff) + (addr & 0xff);
|
|
|
|
for (i=0; i<n; i++) {
|
|
c = data[i] & 0xff;
|
|
fprintf(out, "%02X", c);
|
|
csum += c;
|
|
}
|
|
fprintf(out, "%02X" CRLF, (~csum) & 0xff);
|
|
}
|
|
|
|
int main(int argc, char* argv[])
|
|
{
|
|
FILE *e,*out;
|
|
int c,i;
|
|
unsigned char eprombuf[65536];
|
|
int size;
|
|
|
|
|
|
if (argc != 3) {
|
|
fprintf(stderr,
|
|
"Convert a 16bit EPROM file into EXORMACS format, compatible to SIMH SAGE.\n"
|
|
"Usage: %s eprom.dat output.dat\n\n", argv[0]);
|
|
exit(1);
|
|
}
|
|
|
|
e = fopen(argv[1], "rb");
|
|
out = fopen(argv[2], "wb");
|
|
|
|
if (!e) {
|
|
fprintf(stderr, "Could not open %s\n", argv[1]);
|
|
exit(1);
|
|
}
|
|
if (!out) {
|
|
fprintf(stderr, "Could not open %s\n", argv[2]);
|
|
exit(1);
|
|
}
|
|
|
|
size = 0;
|
|
do {
|
|
if ((c = fgetc(e)) == EOF) break;
|
|
eprombuf[size++] = c;
|
|
} while (!feof(e));
|
|
printf("%s: Size = %d\n", argv[2], size);
|
|
fclose(e);
|
|
|
|
for (i=0; i<size; i+=2) {
|
|
c = eprombuf[i+1];
|
|
eprombuf[i+1] = eprombuf[i];
|
|
eprombuf[i] = c;
|
|
}
|
|
|
|
putS0(out, argv[2]);
|
|
i = 0;
|
|
for (i=0; i<size; i += RECLEN) {
|
|
putS2(out, BASE+i, eprombuf+i, RECLEN);
|
|
}
|
|
putS8(out, BASE);
|
|
fclose(out);
|
|
exit(0);
|
|
}
|
|
|