Subversion Repositories pentevo

Rev

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

                 ╘юЁьрЄ Їрщыр UDI ( Ultra Disk Image )
                 ┬хЁёш  1.0 (Alex Makeev, ╨хфръЎш  24 ьрЁЄр 2002 у.)
                 ┬хЁёш  2 (deathsoft, ёюуырёютрэю ё Alex Makeev)

--------------------------------------------------------------------------------
                           ╘юЁьрЄ Їрщыр UDI:

Offset          Length  Comment
----------      ------  ----------------------------------------------------
0x00000000      0x0004  ╚фхэЄшЇшърЄюЁ "UDI!", хёыш шфхэЄшЇшърЄюЁ
                           чряшёрэ ьрыхэ№ъшьш сєътрьш ("udi!"), Єю 
                           яЁшьхэхэю ёцрЄшх фрээ√ї, рыуюЁшЄь ёцрЄш 
                           яюър эх юяЁхфхыхэ, эю тхЁю Єэю сєфхЄ рэрыюушўхэ 
                           TELEDISK'є
                           ╙яръют√тр■Єё  фрээ√х, эрўшэр  ё юсЁрчр яхЁтющ 
                           фюЁюцъш, Є.х. ёЁрчє яюёых юёэютэюую 
                           (ш фюяюыэшЄхы№э√ї) чруюыютър
0x00000004      0x0004  ╨рчьхЁ Їрщыр яюёых Ёрёяръютъш схч єўхЄр CRC 
                           (хёыш Їрщы эх єяръютрэ, Єю яЁюёЄю ЁрчьхЁ Їрщыр - 4)
0x00000008      0x0001  ┬хЁёш  ЇюЁьрЄр, фы  UDI 1.0 ёюфхЁцшЄ #00,
                        фы  UDI 2 ёюфхЁцшЄ #01
0x00000009      0x0001  ╠ръёшьры№эю фюёЄєяэ√щ ЎшышэфЁ (0x00...0xFF),
                           шЄюую ьръё. ўшёыю ЎшышэфЁют = 256
0x0000000A      0x0001  ╠ръёшьры№э√щ эюьхЁ яютхЁїэюёЄш фшёър:
                           0x01 - DoubleSided, 0x00 - SingleSided
                           (0x02..0xFF -reserved!)
0x0000000B      0x0001  ┬ ¤Єющ тхЁёшш эх шёяюы№чєхЄё  яю¤Єюьє тёхуфр 0x00
0x0000000C      0x0004  EXTHDL - ─ышэр фюяюыэшЄхы№эюую чруюыютър 
                           (тёхуфр 0, т яЁюЄштэюь ёыєўрх ёЄЁєъЄєЁр фрээ√ї
                           ьюцхЄ с√Є№ фЁєур ...)


─рыхх ёыхфє■Є юсЁрч√ ърцфющ шч фюЁюцхъ, т яюЁ фъх Ёрчьх∙хэш  эр фшёъх
(Trk00, Side00; Trk00, Side01; Trk01, Side00; Trk01, Side01; ...):

0x00000010      0xXXXX  ╬сЁрч фюЁюцъш ёь. эшцх...
0xXXXXXXXX      0xXXXX  ╬сЁрч ёыхфє■∙хщ фюЁюцъш
0xXXXXXXXX      0xXXXX  ╬сЁрч ёыхфє■∙хщ фюЁюцъш
...
...
0xXXXXXXXX      0x0004  CRC Їрщыр (фы  тхЁёшш 1.0 CRC_UDI, рыуюЁшЄь ёь. яЁшыюцхэшх 1)
                                  (фы  тхЁёшш 2 CRC32 (яЁртшы№э√щ), рыуюЁшЄь ёь. яЁшыюцхэшх 2)


╬сЁрч фюЁюцъш:

Offset          Length     Comment
----------      ------  ----------------------------------------------------
0x00000000      0x0001  ╬яЁхфхы хЄ ЇюЁьрЄ фюЁюцъш:
                              0x00 - Decoded MFM  (эряЁшьхЁ TR-DOS-э√щ ЇюЁьрЄ)
                              0x01 - рэрыюушўхэ 0x00 эю ё яюффхЁцъющ юсырёЄхщ чряшё№/ўЄхэшх
                                     т ъюЄюЁ√х фрхЄ ю°шсъш
                              0x02 - RAW MFM (сшЄ√ т Єюь тшфх т ъюЄюЁюь юэш ўшЄр■Єё  ё фшёъхЄ√ схч
                                     фхъюфшЁютрэш  ъюэЄЁюыыхЁюь). ─юЁюцър DD фшёъхЄ√ ёюфхЁцшЄ
                                     ~50000сшЄ
                              фЁєушх чэрўхэш  ЇюЁьрЄют яюър чряЁх∙хэ√!
                              (Є.ъ. х∙х эх шчтхёЄэю ёъюы№ъю фюя. шэЇ√
                               эєцэю їЁрэшЄ№)


***─ы  ЇюЁьрЄр фюЁюцъш 0x00 (Decoded MFM):


0x00000001      0x0002  tlen - ─ышэр фюЁюцъш т срщЄрї (Єшяшўэр  фышэр
                           фюЁюцъш 6250 срщЄ)
                           ┬═╚╠└═╚┼! ─ы  MFM DoubleDensity (┬├93) ъЁрщэх
                           эх ЁхъюьхэфєхЄё  чрфртрЄ№ фышэє
                           фюЁюцъш, ёшы№эю юЄышўр■∙є■ё  юЄ 6250 срщЄ!!!
0x00000003      tlen    ╧юсрщЄют√щ юсЁрч фюЁюцъш - тъы■ўр  яЁюсхы√,
                           ёшэїЁюяЁюсхы√, ёшэїЁюшьяєы№ё√ (ьрЁъхЁ√ MFM), 
                           рфЁхёэ√х ьрЁъхЁ√, чруюыютъш, ьрёёшт√ фрээ√ї, etc.
                           ─Ёєушьш ёыютрьш чфхё№ чряшёрэ√ Єх срщЄ√,
                           ъюЄюЁ√х сєфєЄ т√фрэ√ ┬├93 яю ъюьрэфх "ўЄхэшх фюЁюцъш"

0x0003+tlen     ёtlen   ┴шЄют√щ ьрёёшт, юяшё√тр■∙шщ Єшя CLK фы  ърцфюую
                           срщЄр юсЁрчр фюЁюцъш (ёь. яЁшыюцхэшх 1);
                           ╬фшэ сшЄ ёююЄтхЄёЄтєхЄ юфэюьє срщЄє юсЁрчр фюЁюцъш:
                              0 - чряшёрэю ё юс√ўэ√ь CLK (юс√ўэ√х фрээ√х)
                              1 - чряшёрэю ё ьрЁъхЁэ√ь CLK (ьхЄъш #A1 ш #C2)
                           ═ряЁшьхЁ шьххь яюёыхфютрЄхы№эюёЄ№ срщЄ:
                              { 0xA1,0xA1,0x00,0xA1,0xFE,0x00,0x00,0x01 }
                              уфх 0xA1 - MFM ьрЁъхЁ√
                           Єюуфр срщЄ сшЄютюую ьрёёштр сєфхЄ Ёртхэ 0x0B.

                           ─ы  Єшяшўэющ фышэ√ фюЁюцъш 6250 срщЄ:
                           ctlen = tlen/8 + ((tlen-(tlen/8)*8)? 1:0) = 782 срщЄ
                           ╦ш°эшх сшЄ√ - эхчэрўр∙шх, шї ЁхъюьхэфєхЄё 
                           чряюыэ Є№ эєы ьш.

                           ╧ЁюуЁрьь√, ёючфр■∙шх/чряшё√тр■∙шх UDI Їрщы√ юс чрэ√
                           юсхёяхўштрЄ№ яЁшёєЄёЄтшх Ёхры№э√ї CRC ъюфют фы  
                           ьрёёштют фрээ√ї ш рфЁхёэ√ї ьрёёштют яю рыуюЁшЄьє 
                           CRC ё яюышэюьюь F = X^16 + X^12 + X^5 + 1

                           ╤шьєы Ўш■ ю°шсюўэюую CRC ёшэЄхЄшўхёъшь ёяюёюсюь,
                           яЁш ъюэтхЁЄшЁютрэшш шч Їрщыют FDI, ЁхъюьхэфєхЄё 
                           яЁюшчтюфшЄ№ ё яюью∙№■ т√Ёрцхэш  C = RC^0xFFFF,
                           уфх C - crc ъюЄюЁє■ эєцэю чряшёрЄ№, RC - crc
                           ёшэЄхЄшўхёър , ъюЁЁхъЄэю т√ўшёыхээр  яю 
                           рыуюЁшЄьє CRC...   ¤Єю ўЄюс эръырфюъ эх т√їюфшыю,
                           чряш°х°№ bad CRC Ёртэ√щ эєы■ шыш х∙х ўхьє-эшсєф№,
                           уы фш°№, р юэ ш тяЁ ь№ юърцхЄё  Ёртэ√ь эєы■ -
                           яюыєўрхЄё  Ёхры№эю bad'ют√щ CRC сєфхЄ юяЁхфхы Єё 
                           ъръ схчю°шсюўэ√щ 

***─ы  ЇюЁьрЄр фюЁюцъш 0x01 (Decoded MFM ёю ёсющэ√ьш єўрёЄърьш):
(яюър эх Ёхрышчютрэю)

***─ы  ЇюЁьрЄр фюЁюцъш 0x02 (RAW MFM):
(яюър эх Ёхрышчютрэю)

***─ы  фЁєушї ЇюЁьрЄют фюЁюцъш:

#0001+tlen      4       MTIL - ─ышэр сыюър, юяшё√тр■∙хую фюЁюцъє

#0005+tlen      MTIL     ┴ыюъ юяшё√тр■∙шщ ЇюЁьрЄ фюЁюцъш

--------------------------------------------------------------------------------


╧юўхьє Єшяшўэр  фышэр фюЁюцъш 6250 срщЄ?
╚чєўшт яЁюЎхфєЁє ЇюЁьрЄшЁютрэш  є TR-DOS ш єЄшышЄ√ FUT   т√ ёэшы, ўЄю
Ёхры№эр  фышэр (юэр хёЄхёЄтхээю чртшёшЄ юЄ ряярЁрЄєЁ√) фюыцэр ыхцрЄ№ т 
фшрярчюэх 6208...6464 срщЄ, фы  фЁєушї фышэ яЁюшчющфхЄ ю°шсър. ╬фэръю, 
яЁюёўшЄрт timing, єўшЄ√тр  ўЄю эр юфшэ сшЄ шэЇюЁьрЎшш єїюфшЄ 4ьъё - яюыєўрхь 
тЁхь  32ьъё эр срщЄ; тЁхь  юфэюую яюыэюую юсюЁюЄр фшёър шчтхёЄэю - 200000 ьъё; 
фрыхх яЁюёЄю ёўшЄрхь фышэє фюЁюцъш: 200000 / 32 = 6250 срщЄ.


   ┬эшьрэш■ ЁрчЁрсюЄўшърь ¤ьєы ЄюЁют: сюы№°р  яЁюё№ср - ётюшї ъюЁЁхъЄшт т
ЇюЁьрЄ UDI схч ёюуырёютрэш  ё ртЄюЁюь эх тэюёшЄ№.

-------------------------------------------------------------------------------

                            ╧╨╚╦╬╞┼═╚┼ 1

                └ыуюЁшЄь т√ўшёыхэш  CRC_UDI фы  Їрщыр UDI(тхЁёшш 1.0)
{deathsoft, Ёхры№эю ¤Єю эх рыуюЁшЄь CRC32, р ю°шсюўэр  ЁхрышчрЎш  CRC32 фр■∙р  ёютхЁ°хээю фЁєушх Ёхчєы№ЄрЄ√ }


═рўры№эюх чэрўхэшх CRC = 0xFFFFFFFF  (-1l).

╘єэъЎш  юсэютыхэш  CRC32 фы  юфэюую срщЄр Symbol:

long CalcCRC32(long CRC, unsigned char Symbol)
{
   long temp;
   CRC ^= -1l ^ Symbol;
   for(int k = 8; k--;) 
      { temp = -(CRC & 1), CRC >>= 1, CRC ^= 0xEDB88320ul & temp; }
   CRC ^= -1l;
   return CRC;
}

▌Єє ЇєэъЎш■ эєцэю т√чтрЄ№ фы  ърцфюую срщЄр шч Їрщыр UDI (шёъы■ўр  яюёыхфэшх
4 срщЄр CRC). 

╧хЁт√щ рЁуєьхэЄ ЇєэъЎшш - Єхъє∙р  CRC, тЄюЁющ рЁуєьхэЄ - срщЄ фрээ√ї,
Ёхчєы№ЄрЄ - эютр  CRC.

-------------------------------------------------------------------------------

                            ╧╨╚╦╬╞┼═╚┼ 2

              └ыуюЁшЄь т√ўшёыхэш  CRC32 (UDI 2 ш т√°х)
static uint32_t crc32(const void *data, unsigned len)
{
   const uint8_t *d = (const uint8_t *)data;

   uint32_t crc = 0xFFFFFFFF;
   while(len--)
   {
      uint32_t byte = *d++;
      crc ^= byte;
      for(int j = 7; j >= 0; j--)
      {
         uint32_t mask = -(crc & 1);
         crc = (crc >> 1) ^ (0xEDB88320 & mask);
      }
   }
   return ~crc;
}

crc32("The quick brown fox jumps over the lazy dog") == 0x414FA339
-------------------------------------------------------------------------------