Subversion Repositories pentevo

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
716 lvd 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
}