blob: 1480f80b8a44c0c1ffe2ce4b915c24be88442cb3 [file] [log] [blame] [raw]
#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);
}