#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); | |
} | |