Subversion Repositories pentevo

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
716 lvd 1
                 ╘юЁьрЄ Їрщыр UDI ( Ultra Disk Image )
2
                 ┬хЁёш  1.0 (Alex Makeev, ╨хфръЎш  24 ьрЁЄр 2002 у.)
3
                 ┬хЁёш  2 (deathsoft, ёюуырёютрэю ё Alex Makeev)
4
 
5
--------------------------------------------------------------------------------
6
                           ╘юЁьрЄ Їрщыр UDI:
7
 
8
Offset          Length  Comment
9
----------      ------  ----------------------------------------------------
10
0x00000000      0x0004  ╚фхэЄшЇшърЄюЁ "UDI!", хёыш шфхэЄшЇшърЄюЁ
11
                           чряшёрэ ьрыхэ№ъшьш сєътрьш ("udi!"), Єю 
12
                           яЁшьхэхэю ёцрЄшх фрээ√ї, рыуюЁшЄь ёцрЄш 
13
                           яюър эх юяЁхфхыхэ, эю тхЁю Єэю сєфхЄ рэрыюушўхэ 
14
                           TELEDISK'є
15
                           ╙яръют√тр■Єё  фрээ√х, эрўшэр  ё юсЁрчр яхЁтющ 
16
                           фюЁюцъш, Є.х. ёЁрчє яюёых юёэютэюую 
17
                           (ш фюяюыэшЄхы№э√ї) чруюыютър
18
0x00000004      0x0004  ╨рчьхЁ Їрщыр яюёых Ёрёяръютъш схч єўхЄр CRC 
19
                           (хёыш Їрщы эх єяръютрэ, Єю яЁюёЄю ЁрчьхЁ Їрщыр - 4)
20
0x00000008      0x0001  ┬хЁёш  ЇюЁьрЄр, фы  UDI 1.0 ёюфхЁцшЄ #00,
21
                        фы  UDI 2 ёюфхЁцшЄ #01
22
0x00000009      0x0001  ╠ръёшьры№эю фюёЄєяэ√щ ЎшышэфЁ (0x00...0xFF),
23
                           шЄюую ьръё. ўшёыю ЎшышэфЁют = 256
24
0x0000000A      0x0001  ╠ръёшьры№э√щ эюьхЁ яютхЁїэюёЄш фшёър:
25
                           0x01 - DoubleSided, 0x00 - SingleSided
26
                           (0x02..0xFF -reserved!)
27
0x0000000B      0x0001  ┬ ¤Єющ тхЁёшш эх шёяюы№чєхЄё  яю¤Єюьє тёхуфр 0x00
28
0x0000000C      0x0004  EXTHDL - ─ышэр фюяюыэшЄхы№эюую чруюыютър 
29
                           (тёхуфр 0, т яЁюЄштэюь ёыєўрх ёЄЁєъЄєЁр фрээ√ї
30
                           ьюцхЄ с√Є№ фЁєур ...)
31
 
32
 
33
─рыхх ёыхфє■Є юсЁрч√ ърцфющ шч фюЁюцхъ, т яюЁ фъх Ёрчьх∙хэш  эр фшёъх
34
(Trk00, Side00; Trk00, Side01; Trk01, Side00; Trk01, Side01; ...):
35
 
36
0x00000010      0xXXXX  ╬сЁрч фюЁюцъш ёь. эшцх...
37
0xXXXXXXXX      0xXXXX  ╬сЁрч ёыхфє■∙хщ фюЁюцъш
38
0xXXXXXXXX      0xXXXX  ╬сЁрч ёыхфє■∙хщ фюЁюцъш
39
...
40
...
41
0xXXXXXXXX      0x0004  CRC Їрщыр (фы  тхЁёшш 1.0 CRC_UDI, рыуюЁшЄь ёь. яЁшыюцхэшх 1)
42
                                  (фы  тхЁёшш 2 CRC32 (яЁртшы№э√щ), рыуюЁшЄь ёь. яЁшыюцхэшх 2)
43
 
44
 
45
╬сЁрч фюЁюцъш:
46
 
47
Offset          Length     Comment
48
----------      ------  ----------------------------------------------------
49
0x00000000      0x0001  ╬яЁхфхы хЄ ЇюЁьрЄ фюЁюцъш:
50
                              0x00 - Decoded MFM  (эряЁшьхЁ TR-DOS-э√щ ЇюЁьрЄ)
51
                              0x01 - рэрыюушўхэ 0x00 эю ё яюффхЁцъющ юсырёЄхщ чряшё№/ўЄхэшх
52
                                     т ъюЄюЁ√х фрхЄ ю°шсъш
53
                              0x02 - RAW MFM (сшЄ√ т Єюь тшфх т ъюЄюЁюь юэш ўшЄр■Єё  ё фшёъхЄ√ схч
54
                                     фхъюфшЁютрэш  ъюэЄЁюыыхЁюь). ─юЁюцър DD фшёъхЄ√ ёюфхЁцшЄ
55
                                     ~50000сшЄ
56
                              фЁєушх чэрўхэш  ЇюЁьрЄют яюър чряЁх∙хэ√!
57
                              (Є.ъ. х∙х эх шчтхёЄэю ёъюы№ъю фюя. шэЇ√
58
                               эєцэю їЁрэшЄ№)
59
 
60
 
61
***─ы  ЇюЁьрЄр фюЁюцъш 0x00 (Decoded MFM):
62
 
63
 
64
0x00000001      0x0002  tlen - ─ышэр фюЁюцъш т срщЄрї (Єшяшўэр  фышэр
65
                           фюЁюцъш 6250 срщЄ)
66
                           ┬═╚╠└═╚┼! ─ы  MFM DoubleDensity (┬├93) ъЁрщэх
67
                           эх ЁхъюьхэфєхЄё  чрфртрЄ№ фышэє
68
                           фюЁюцъш, ёшы№эю юЄышўр■∙є■ё  юЄ 6250 срщЄ!!!
69
0x00000003      tlen    ╧юсрщЄют√щ юсЁрч фюЁюцъш - тъы■ўр  яЁюсхы√,
70
                           ёшэїЁюяЁюсхы√, ёшэїЁюшьяєы№ё√ (ьрЁъхЁ√ MFM), 
71
                           рфЁхёэ√х ьрЁъхЁ√, чруюыютъш, ьрёёшт√ фрээ√ї, etc.
72
                           ─Ёєушьш ёыютрьш чфхё№ чряшёрэ√ Єх срщЄ√,
73
                           ъюЄюЁ√х сєфєЄ т√фрэ√ ┬├93 яю ъюьрэфх "ўЄхэшх фюЁюцъш"
74
 
75
0x0003+tlen     ёtlen   ┴шЄют√щ ьрёёшт, юяшё√тр■∙шщ Єшя CLK фы  ърцфюую
76
                           срщЄр юсЁрчр фюЁюцъш (ёь. яЁшыюцхэшх 1);
77
                           ╬фшэ сшЄ ёююЄтхЄёЄтєхЄ юфэюьє срщЄє юсЁрчр фюЁюцъш:
78
 
79
                              1 - чряшёрэю ё ьрЁъхЁэ√ь CLK (ьхЄъш #A1 ш #C2)
80
                           ═ряЁшьхЁ шьххь яюёыхфютрЄхы№эюёЄ№ срщЄ:
81
                              { 0xA1,0xA1,0x00,0xA1,0xFE,0x00,0x00,0x01 }
82
                              уфх 0xA1 - MFM ьрЁъхЁ√
83
                           Єюуфр срщЄ сшЄютюую ьрёёштр сєфхЄ Ёртхэ 0x0B.
84
 
85
                           ─ы  Єшяшўэющ фышэ√ фюЁюцъш 6250 срщЄ:
86
                           ctlen = tlen/8 + ((tlen-(tlen/8)*8)? 1:0) = 782 срщЄ
87
                           ╦ш°эшх сшЄ√ - эхчэрўр∙шх, шї ЁхъюьхэфєхЄё 
88
                           чряюыэ Є№ эєы ьш.
89
 
90
                           ╧ЁюуЁрьь√, ёючфр■∙шх/чряшё√тр■∙шх UDI Їрщы√ юс чрэ√
91
                           юсхёяхўштрЄ№ яЁшёєЄёЄтшх Ёхры№э√ї CRC ъюфют фы  
92
                           ьрёёштют фрээ√ї ш рфЁхёэ√ї ьрёёштют яю рыуюЁшЄьє 
93
                           CRC ё яюышэюьюь F = X^16 + X^12 + X^5 + 1
94
 
95
                           ╤шьєы Ўш■ ю°шсюўэюую CRC ёшэЄхЄшўхёъшь ёяюёюсюь,
96
                           яЁш ъюэтхЁЄшЁютрэшш шч Їрщыют FDI, ЁхъюьхэфєхЄё 
97
                           яЁюшчтюфшЄ№ ё яюью∙№■ т√Ёрцхэш  C = RC^0xFFFF,
98
                           уфх C - crc ъюЄюЁє■ эєцэю чряшёрЄ№, RC - crc
99
                           ёшэЄхЄшўхёър , ъюЁЁхъЄэю т√ўшёыхээр  яю 
100
                           рыуюЁшЄьє CRC...   ¤Єю ўЄюс эръырфюъ эх т√їюфшыю,
101
                           чряш°х°№ bad CRC Ёртэ√щ эєы■ шыш х∙х ўхьє-эшсєф№,
102
                           уы фш°№, р юэ ш тяЁ ь№ юърцхЄё  Ёртэ√ь эєы■ -
103
                           яюыєўрхЄё  Ёхры№эю bad'ют√щ CRC сєфхЄ юяЁхфхы Єё 
104
                           ъръ схчю°шсюўэ√щ 
105
 
106
***─ы  ЇюЁьрЄр фюЁюцъш 0x01 (Decoded MFM ёю ёсющэ√ьш єўрёЄърьш):
107
(яюър эх Ёхрышчютрэю)
108
 
109
***─ы  ЇюЁьрЄр фюЁюцъш 0x02 (RAW MFM):
110
(яюър эх Ёхрышчютрэю)
111
 
112
***─ы  фЁєушї ЇюЁьрЄют фюЁюцъш:
113
 
114
#0001+tlen      4       MTIL - ─ышэр сыюър, юяшё√тр■∙хую фюЁюцъє
115
 
116
#0005+tlen      MTIL     ┴ыюъ юяшё√тр■∙шщ ЇюЁьрЄ фюЁюцъш
117
 
118
--------------------------------------------------------------------------------
119
 
120
 
121
╧юўхьє Єшяшўэр  фышэр фюЁюцъш 6250 срщЄ?
122
╚чєўшт яЁюЎхфєЁє ЇюЁьрЄшЁютрэш  є TR-DOS ш єЄшышЄ√ FUT   т√ ёэшы, ўЄю
123
Ёхры№эр  фышэр (юэр хёЄхёЄтхээю чртшёшЄ юЄ ряярЁрЄєЁ√) фюыцэр ыхцрЄ№ т 
124
фшрярчюэх 6208...6464 срщЄ, фы  фЁєушї фышэ яЁюшчющфхЄ ю°шсър. ╬фэръю, 
125
яЁюёўшЄрт timing, єўшЄ√тр  ўЄю эр юфшэ сшЄ шэЇюЁьрЎшш єїюфшЄ 4ьъё - яюыєўрхь 
126
тЁхь  32ьъё эр срщЄ; тЁхь  юфэюую яюыэюую юсюЁюЄр фшёър шчтхёЄэю - 200000 ьъё; 
127
фрыхх яЁюёЄю ёўшЄрхь фышэє фюЁюцъш: 200000 / 32 = 6250 срщЄ.
128
 
129
 
130
   ┬эшьрэш■ ЁрчЁрсюЄўшърь ¤ьєы ЄюЁют: сюы№°р  яЁюё№ср - ётюшї ъюЁЁхъЄшт т
131
ЇюЁьрЄ UDI схч ёюуырёютрэш  ё ртЄюЁюь эх тэюёшЄ№.
132
 
133
-------------------------------------------------------------------------------
134
 
135
                            ╧╨╚╦╬╞┼═╚┼ 1
136
 
137
                └ыуюЁшЄь т√ўшёыхэш  CRC_UDI фы  Їрщыр UDI(тхЁёшш 1.0)
138
{deathsoft, Ёхры№эю ¤Єю эх рыуюЁшЄь CRC32, р ю°шсюўэр  ЁхрышчрЎш  CRC32 фр■∙р  ёютхЁ°хээю фЁєушх Ёхчєы№ЄрЄ√ }
139
 
140
 
141
═рўры№эюх чэрўхэшх CRC = 0xFFFFFFFF  (-1l).
142
 
143
╘єэъЎш  юсэютыхэш  CRC32 фы  юфэюую срщЄр Symbol:
144
 
145
long CalcCRC32(long CRC, unsigned char Symbol)
146
{
147
   long temp;
148
   CRC ^= -1l ^ Symbol;
149
   for(int k = 8; k--;) 
150
      { temp = -(CRC & 1), CRC >>= 1, CRC ^= 0xEDB88320ul & temp; }
151
   CRC ^= -1l;
152
   return CRC;
153
}
154
 
155
▌Єє ЇєэъЎш■ эєцэю т√чтрЄ№ фы  ърцфюую срщЄр шч Їрщыр UDI (шёъы■ўр  яюёыхфэшх
156
4 срщЄр CRC). 
157
 
158
╧хЁт√щ рЁуєьхэЄ ЇєэъЎшш - Єхъє∙р  CRC, тЄюЁющ рЁуєьхэЄ - срщЄ фрээ√ї,
159
Ёхчєы№ЄрЄ - эютр  CRC.
160
 
161
-------------------------------------------------------------------------------
162
 
163
                            ╧╨╚╦╬╞┼═╚┼ 2
164
 
165
              └ыуюЁшЄь т√ўшёыхэш  CRC32 (UDI 2 ш т√°х)
166
static uint32_t crc32(const void *data, unsigned len)
167
{
168
   const uint8_t *d = (const uint8_t *)data;
169
 
170
   uint32_t crc = 0xFFFFFFFF;
171
   while(len--)
172
   {
173
      uint32_t byte = *d++;
174
      crc ^= byte;
175
      for(int j = 7; j >= 0; j--)
176
      {
177
         uint32_t mask = -(crc & 1);
178
         crc = (crc >> 1) ^ (0xEDB88320 & mask);
179
      }
180
   }
181
   return ~crc;
182
}
183
 
184
crc32("The quick brown fox jumps over the lazy dog") == 0x414FA339
185
-------------------------------------------------------------------------------