Top secrets sources NedoPC 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
-------------------------------------------------------------------------------