Subversion Repositories pentevo

Rev

Rev 798 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed | ?url?

  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.    const unsigned bitmap_len = (unsigned(MAX_TRACK_LEN + 7U)) >> 3;
  54.  
  55.    mem += (MAX_CYLS - cyls) * sides * (MAX_TRACK_LEN + bitmap_len); // ─юсртър фы  тючьюцэюёЄш ЇюЁьрЄшЁютрэш  эр MAX_CYLS фюЁюцхъ
  56.  
  57.    rawsize = align_by(mem, 4096U);
  58.    rawdata = (unsigned char*)VirtualAlloc(nullptr, rawsize, MEM_COMMIT, PAGE_READWRITE);
  59.    ptr = snbuf+0x10;
  60.    unsigned char *dst = rawdata;
  61.  
  62.    for (c = 0; c < cyls; c++)
  63.    {
  64.       for (s = 0; s < sides; s++)
  65.       {
  66.          unsigned sz = *(unsigned short*)(ptr+1);
  67.          trklen[c][s] = sz;
  68.          trkd[c][s] = dst;
  69.          trki[c][s] = dst + sz;
  70.          sz += sz/8 + ((sz & 7)? 1 : 0);
  71.          memcpy(dst, ptr+3, sz);
  72.          ptr += 3 + sz;
  73.          dst += sz;
  74.       }
  75.    }
  76.  
  77.    for(; c < MAX_CYLS; c++)
  78.    {
  79.        for(s = 0; s < sides; s++)
  80.        {
  81.            trklen[c][s] = MAX_TRACK_LEN;
  82.            trkd[c][s] = dst;
  83.            dst += MAX_TRACK_LEN;
  84.  
  85.            trki[c][s] = dst;
  86.            dst += bitmap_len;
  87.        }
  88.    }
  89.  
  90.    u32 crc1 = *((u32*)ptr);
  91.    int crc2 = -1;
  92.    udi_buggy_crc(crc2, snbuf, unsigned(ptr - snbuf));
  93.    if(crc1 != u32(crc2))
  94.    {
  95.        err_printf("udi crc mismatch: image=0x%08X, calc=0x%08X", crc1, crc2);
  96.    }
  97.    if (snbuf[11] & 1)
  98.        strcpy(dsc, (char*)ptr);
  99.    return 1;
  100. }
  101.  
  102. int FDD::write_udi(FILE *ff)
  103. {
  104.    memset(snbuf, 0, 0x10);
  105.    *(unsigned*)snbuf = WORD4('U','D','I','!');
  106.    snbuf[8] = snbuf[11] = 0;
  107.    snbuf[9] = u8(cyls-1);
  108.    snbuf[10] = u8(sides-1);
  109.    *(unsigned*)(snbuf+12) = 0;
  110.  
  111.    unsigned char *dst = snbuf+0x10;
  112.    for (unsigned c = 0; c < cyls; c++)
  113.       for (unsigned s = 0; s < sides; s++)
  114.       {
  115.          *dst++ = 0;
  116.          unsigned len = trklen[c][s];
  117.          *(unsigned short*)dst = u16(len); dst += 2;
  118.          memcpy(dst, trkd[c][s], len); dst += len;
  119.          len = (len+7)/8;
  120.          memcpy(dst, trki[c][s], len); dst += len;
  121.       }
  122.    if(*dsc)
  123.    {
  124.        strcpy((char*)dst, dsc);
  125.        dst += strlen(dsc) + 1;
  126.        snbuf[11] = 1;
  127.    }
  128.    *(unsigned*)(snbuf+4) = u32(dst-snbuf);
  129.    int crc = -1; udi_buggy_crc(crc, snbuf, unsigned(dst-snbuf));
  130.    *(unsigned*)dst = u32(crc); dst += 4;
  131.    if (fwrite(snbuf, 1, size_t(dst-snbuf), ff) != size_t(dst-snbuf)) return 0;
  132.    return 1;
  133. }
  134.