/* 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 */
}