                   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
-------------------------------------------------------------------------------
