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