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