home *** CD-ROM | disk | FTP | other *** search
/ Emulator Universe CD / emulatoruniversecd1998.iso / CPC / Utils / DSKutil / XTI_MISC.C < prev    next >
Encoding:
C/C++ Source or Header  |  1996-12-13  |  6.4 KB  |  222 lines

  1. /* XTI 1.2 - image creation, merging, splitting, routines */
  2. /* filename: xti_misc.c */
  3.  
  4.  
  5. void doRevert(char *Name)
  6. {
  7.  char TargetName[256];
  8.  char *dotpt;
  9.  unsigned char ref;
  10.  int echec,i,S,T,s,t,Tops,refs,Tsize;
  11.  
  12.  getFormat(Name);
  13.  if (theFormat == kDSK) { fprintf(stderr, "File is already dsk !\n"); exit(17); }
  14.  if (theFormat != kEDK) { fprintf(stderr, "Can only revert edsk !\n"); exit(18); }
  15.  
  16.  sprintf (TargetName, "%s", Name);
  17.  if ((dotpt = strchr(TargetName, '.')) == NULL) dotpt = TargetName + strlen(TargetName);
  18.  sprintf (dotpt, sfODSK);
  19.  if ( !strcmp(Name, TargetName) )
  20.        {fprintf(stderr, "File naming conflict, cannot proceed\n"); exit(10); }
  21.  Target = fopen(TargetName, "w");
  22.  Source = fopen(Name, "rb");
  23.  
  24.  for(i=0; i<256; i++) { InputBuff[i] = fgetc(Source); fputc(0, Target); }
  25.  echec = 0;
  26.  ref = InputBuff[0x34];
  27.  for(i=0; i<InputBuff[kTrackNumOffset]; i++)
  28.       if (InputBuff[0x34+i] != ref) { echec = 1; break; }
  29.  if (echec)
  30.     { fprintf(stderr, "Variable track sizes, cannot revert to dsk !\n"); exit(19); }
  31.  
  32.  printf("Reverting to plain dsk...\n");
  33.  
  34.  fseek(Target, 0, SEEK_SET);
  35.  fprintf(Target, "MV - CPCEMU Disk-File\r\nDiskInfo\r\n");
  36.  fseek(Target, kTrackNumOffset, SEEK_SET);
  37.  fputc(T = InputBuff[kTrackNumOffset], Target);
  38.  fseek(Target, kSideNumOffset, SEEK_SET);
  39.  fputc(S = InputBuff[kSideNumOffset], Target);
  40.  fseek(Target, 0x33, SEEK_SET);
  41.  fputc(ref, Target);
  42.  fseek(Target, 0, SEEK_END);
  43.  Tsize = 256L*(ref-1L);
  44.  
  45.  for(t = 0; t<T; t++)
  46.   for(s = 0; s<S; s++)
  47.    {
  48.    for(i = 0; i<256; i++) InputBuff[i] = fgetc(Source);
  49.    refs = NtoSize(InputBuff[14]);
  50.    Tops = InputBuff[15];
  51.    echec = 0;
  52.    for(i = 0; i<Tops; i++)
  53.        if ( (InputBuff[0x18+6+i]+256*InputBuff[0x18+7+i]) != refs)
  54.          { echec = 1; break; }
  55.    if (echec)
  56.     { fprintf(stderr, "Variable sector sizes on track %d, cannot revert to dsk !\n", t);
  57.       exit(20); }
  58.  
  59.    for(i=0; i<Tops; i++) InputBuff[0x18+6+i] = InputBuff[0x18+7+i] = 0;
  60.    for(i=0; i<256; i++) fputc(InputBuff[i], Target);
  61.    for(i=0; i<Tsize; i++) fputc(fgetc(Source), Target);
  62.    }
  63.  
  64.  fclose(Source);
  65.  fclose(Target);
  66. }
  67.  
  68.  
  69.  
  70.  
  71. void doNew(char *Name)
  72. {
  73.  int i,j,k,m;
  74.  
  75.  Target = fopen(Name, "w");
  76.  
  77.  SetUpDSKHeader(HeaderBuff, 40, 1);
  78.  for(i=0; i<512; i++) SectorBuff[i] = 0xe5;
  79.  switch (theFormat)
  80.   { case kNEWD : k = 0xC1; m = 9; sprintf(HeaderBuff+128, "Data Disk\n");
  81.                  printf("Creating new image with Data format\n"); break;
  82.     case kNEWS : k = 0x41; m = 9; sprintf(HeaderBuff+128, "System Disk\n");
  83.                  printf("Creating new image with Vendor format\n"); break;
  84.     case kNEWI : k = 0x01; m = 8;
  85.                  printf("Creating new image with IBM format\n"); break; }
  86.  
  87.  for(i=0; i<40; i++)
  88.    {
  89.    SetUpTrackHeader(TrackBuff, i, 0, 2, m, 0x4e, 0xe5);
  90.    for(j=0; j<m; j++) AddSector(TrackBuff, SectorBuff, i, 0, j+k, 2, 0x80, 0, 512);
  91.    StoreTrack(TrackBuff);
  92.    }
  93.  StoreHeader(HeaderBuff);
  94.  
  95.  fclose(Target);
  96. }
  97.  
  98.  
  99.  
  100.  
  101.  
  102.  
  103.  
  104.  
  105.  
  106. void doMerger(char *Name1, char *Name2)
  107. {
  108.  int Nt1, Nt2, Ntf, Ns1, Ns2, i, j;
  109.  int Ts1[100];
  110.  int Ts2[100];
  111.  char TargetName[256];
  112.  char *dotpt;
  113.  
  114.  getFormat(Name1);
  115.  if (theFormat != kEDK)
  116.    { fprintf(stderr, "Improper format for file %s\n", Name1); exit(8); }
  117.  getFormat(Name2);
  118.  if (theFormat != kEDK)
  119.    { fprintf(stderr, "Improper format for file %s\n", Name2); exit(8); }
  120.  
  121.  if ((Source = fopen(Name1,"rb")) == NULL)
  122.      {
  123.      fprintf(stderr, "Unable to open %s !\n", Name1);
  124.      exit(2);
  125.      }
  126.  if ((Merger = fopen(Name2,"rb")) == NULL)
  127.      {
  128.      fprintf(stderr, "Unable to open %s !\n", Name2);
  129.      exit(2);
  130.      }
  131.  
  132.  for(i=0; i<256; i++) InputBuff[i] = fgetc(Source);
  133.  Nt1 = InputBuff[kTrackNumOffset];
  134.  Ns1 = InputBuff[kSideNumOffset];
  135.  if ((Ns1 & 1) != 1) { fprintf(stderr, "File %s is not single sided\n", Name1); exit(9); }
  136.  if (Nt1>100) { fprintf(stderr, "File %s has invalid structure\n", Name1); exit(6); }
  137.  for(i=0; i<Nt1; i++) Ts1[i] = 256*InputBuff[i+0x34];
  138.  
  139.  for(i=0; i<256; i++) InputBuff[i] = fgetc(Merger);
  140.  Nt2 = InputBuff[kTrackNumOffset];
  141.  Ns2 = InputBuff[kSideNumOffset];
  142.  if ((Ns2 & 1) != 1) { fprintf(stderr, "File %s is not single sided\n", Name2); exit(9); }
  143.  if (Nt2>100) { fprintf(stderr, "File %s has invalid structure\n", Name2); exit(6); }
  144.  for(i=0; i<Nt2; i++) Ts2[i] = 256*InputBuff[i+0x34];
  145.  
  146.  sprintf (TargetName, "%s", Name1);
  147.  if ((dotpt = strchr(TargetName, '.')) == NULL) dotpt = TargetName + strlen(TargetName);
  148.  sprintf (dotpt, sfDDSK);
  149.  if ( (!strcmp(Name1, TargetName)) || (!strcmp(Name2, TargetName)) )
  150.        {fprintf(stderr, "File naming conflict, cannot proceed\n"); exit(10); }
  151.  Target = fopen(TargetName, "w");
  152.  
  153.  Ntf = max(Nt1, Nt2);
  154.  DETrick = (Ns1 & 128) || (Ns2 & 128);
  155.  SetUpDSKHeader(HeaderBuff, Ntf, 2);
  156.  for(i=0; i<Ntf; i++)
  157.    {
  158.    if (i<Nt1)
  159.      {
  160.      SDataOffset = Ts1[i];
  161.      if (SDataOffset > k16KB)
  162.              { fprintf(stderr, "File %s has invalid structure\n", Name1); exit(6); }
  163.      for(j=0; j<SDataOffset; j++) TrackBuff[j] = fgetc(Source);
  164.      }
  165.     else SDataOffset = 0;
  166.    StoreTrack(TrackBuff);
  167.  
  168.    if (i<Nt2)
  169.      {
  170.      SDataOffset = Ts2[i];
  171.      if (SDataOffset > k16KB)
  172.              { fprintf(stderr, "File %s has invalid structure\n", Name2); exit(6); }
  173.      for(j=0; j<SDataOffset; j++) TrackBuff[j] = fgetc(Merger);
  174.      TrackBuff[0x11] = 1;
  175.      }
  176.     else SDataOffset = 0;
  177.    StoreTrack(TrackBuff);
  178.    }
  179.  
  180.  StoreHeader(HeaderBuff);
  181.  fclose(Source);
  182.  fclose(Merger);
  183.  fclose(Target);
  184. }
  185.  
  186.  
  187.  
  188.  
  189. int extFlag(char *eflag)
  190. {
  191.  if (!strcmp(eflag, fES1)) { theSide = 0; return(1); }
  192.  if (!strcmp(eflag, fES2)) { theSide = 1; return(1); }
  193.  return(0);
  194. }
  195.  
  196. void doExt(char *filename)
  197. {
  198.  char TargetName[256];
  199.  char *dotpt;
  200.  
  201.  getFormat(filename);
  202.  if (theFormat != kEDK)
  203.    { fprintf(stderr, "Improper format for file %s !\n", filename); exit(11); }
  204.  if ((Source = fopen(filename,"rb")) == NULL)
  205.      {
  206.      fprintf(stderr, "Unable to open %s !\n", filename);
  207.      exit(2);
  208.      }
  209.  sprintf (TargetName, "%s", filename);
  210.  if ((dotpt = strchr(TargetName, '.')) == NULL) dotpt = TargetName + strlen(TargetName);
  211.  sprintf (dotpt, sfXDSK);
  212.  if ( !strcmp(filename, TargetName))
  213.        {fprintf(stderr, "File naming conflict, cannot proceed\n"); exit(10); }
  214.  Target = fopen(TargetName, "w");
  215.  
  216.  extCall = 1;
  217.  edsk2edsk();
  218.  printf("Extracted side %d of image.\n", theSide+1);
  219.  fclose(Source);
  220.  fclose(Target);
  221. }
  222.