/* med.c - make eprom disk image from ramdisk image */ #include <stdio.h> #include <string.h> #define DISK_SIZE (6291456) #define NUM_SECT (DISK_SIZE/512) void write_eprom_image(FILE *fi, FILE *fo); int main(int ac, char **av) { FILE *fi, *fo; char fin[44], fon[44]; if (ac > 1) { strcpy(fin,av[1]); } else { strcpy(fin,"hda3.ram"); } if (ac > 2) { strcpy(fon,av[2]); } else { strcpy(fon,"hda3.eprom"); } fi = fopen(fin,"r"); fo = fopen(fon,"w"); if (fi == 0 || fo == 0) { printf("Can't open files\n"); exit(0); } write_eprom_image(fi,fo); fclose(fi); fclose(fo); } void write_eprom_image(FILE *fi, FILE *fo) { char *ini; char *outi; /* In and out images */ short *smap; /* Sector map */ char *sp; char c = 0; struct { unsigned short version; unsigned short blocks; unsigned short sect_ofs; } hdr; int ns, s, i, fs; ini = (char *)malloc(DISK_SIZE); /* Max size currently 6M */ outi = (char *)malloc(DISK_SIZE); /* Max size currently 6M */ smap = (short *)malloc(NUM_SECT*sizeof(short)); if (ini == NULL || outi == NULL || smap == NULL) { printf("Can't allocate memory :(\n"); exit(0); } if (DISK_SIZE != fread(ini,1,DISK_SIZE,fi)) { printf("Can't read input file :(\n"); exit(0); } memcpy(outi,ini,512); /* Copy in first sector */ smap[0] = 0; ns = 1; /* Number of sectors in outi */ for(i=1;i<NUM_SECT;i++) { /* Map each sector into outi */ sp = ini+i*512; for(s=0;s<ns;s++) { /* Found = sector */ if (0 == memcmp(sp,outi+s*512,512)) { break; } } if (s==ns) { memcpy(outi+ns*512,sp,512); /* Copy in new sector */ ns += 1; } smap[i] = s; } /* Filler - make sectors start on 512 byte boundry */ fs = 512 - ((sizeof(hdr) + sizeof(short)*NUM_SECT) % 512); hdr.version = 2; hdr.blocks = NUM_SECT; hdr.sect_ofs = sizeof(hdr) + sizeof(short)*NUM_SECT + fs; fwrite(&hdr,sizeof(hdr),1,fo); /* header info */ fwrite(smap,sizeof(short),NUM_SECT,fo); /* Sector Map */ for(i=0;i<fs;i++) { fwrite(&c,1,1,fo);/* Filler - sectors start on */ } /* 512 byte boundary */ fwrite(outi,512,ns,fo); /* Output Sectors */ }