Subversion Repositories pentevo

Rev

Rev 716 | Blame | Last modification | View Log | Download | RSS feed

  1. #include "std.h"
  2.  
  3. #include "emul.h"
  4. #include "vars.h"
  5. #include "wd93crc.h"
  6.  
  7. #include "util.h"
  8.  
  9. struct UDI
  10. {
  11.    char label[3];
  12.    unsigned char cyls;
  13.    unsigned char sides;
  14. };
  15.  
  16. int FDD::read_udi()
  17. {
  18.    free();
  19.    unsigned c,s;
  20.    unsigned mem = 0;
  21.    unsigned char *ptr = snbuf + 0x10;
  22.  
  23.    for (c = 0; c <= snbuf[9]; c++)
  24.    {
  25.       for (s = 0; s <= snbuf[10]; s++)
  26.       {
  27.          if (*ptr)
  28.              return 0;
  29.          unsigned sz = *(unsigned short*)(ptr+1);
  30.          sz += sz/8 + ((sz & 7)? 1 : 0);
  31.          mem += sz;
  32.          ptr += 3 + sz;
  33.          if (ptr > snbuf + snapsize)
  34.              return 0;
  35.       }
  36.    }
  37.  
  38.    cyls = snbuf[9]+1;
  39.    sides = snbuf[10]+1;
  40.  
  41.    if(cyls > MAX_CYLS)
  42.    {
  43.        err_printf("cylinders (%u) > MAX_CYLS(%d)", cyls, MAX_CYLS);
  44.        return 0;
  45.    }
  46.  
  47.    if(sides > 2)
  48.    {
  49.        err_printf("sides (%u) > 2", sides);
  50.        return 0;
  51.    }
  52.  
  53.    rawsize = align_by(mem, 4096);
  54.    rawdata = (unsigned char*)VirtualAlloc(0, rawsize, MEM_COMMIT, PAGE_READWRITE);
  55.    ptr = snbuf+0x10;
  56.    unsigned char *dst = rawdata;
  57.  
  58.    for (c = 0; c < cyls; c++)
  59.    {
  60.       for (s = 0; s < sides; s++)
  61.       {
  62.          unsigned sz = *(unsigned short*)(ptr+1);
  63.          trklen[c][s] = sz;
  64.          trkd[c][s] = dst;
  65.          trki[c][s] = dst + sz;
  66.          sz += sz/8 + ((sz & 7)? 1 : 0);
  67.          memcpy(dst, ptr+3, sz);
  68.          ptr += 3 + sz;
  69.          dst += sz;
  70.       }
  71.    }
  72.    u32 crc1 = *((u32*)ptr);
  73.    int crc2 = -1;
  74.    udi_buggy_crc(crc2, snbuf, ptr - snbuf);
  75.    if(crc1 != crc2)
  76.    {
  77.        err_printf("udi crc mismatch: image=0x%08X, calc=0x%08X", crc1, crc2);
  78.    }
  79.    if (snbuf[11] & 1)
  80.        strcpy(dsc, (char*)ptr);
  81.    return 1;
  82. }
  83.  
  84. int FDD::write_udi(FILE *ff)
  85. {
  86.    memset(snbuf, 0, 0x10);
  87.    *(unsigned*)snbuf = WORD4('U','D','I','!');
  88.    snbuf[8] = snbuf[11] = 0;
  89.    snbuf[9] = cyls-1;
  90.    snbuf[10] = sides-1;
  91.    *(unsigned*)(snbuf+12) = 0;
  92.  
  93.    unsigned char *dst = snbuf+0x10;
  94.    for (unsigned c = 0; c < cyls; c++)
  95.       for (unsigned s = 0; s < sides; s++)
  96.       {
  97.          *dst++ = 0;
  98.          unsigned len = trklen[c][s];
  99.          *(unsigned short*)dst = len; dst += 2;
  100.          memcpy(dst, trkd[c][s], len); dst += len;
  101.          len = (len+7)/8;
  102.          memcpy(dst, trki[c][s], len); dst += len;
  103.       }
  104.    if (*dsc) strcpy((char*)dst, dsc), dst += strlen(dsc)+1, snbuf[11] = 1;
  105.    *(unsigned*)(snbuf+4) = dst-snbuf;
  106.    int crc = -1; udi_buggy_crc(crc, snbuf, dst-snbuf);
  107.    *(unsigned*)dst = crc; dst += 4;
  108.    if (fwrite(snbuf, 1, dst-snbuf, ff) != (unsigned)(dst-snbuf)) return 0;
  109.    return 1;
  110. }
  111.