DOSa wy(z)wód konieczny cz. 3
- Pajero / MadTeam
Tu miłego dokończenia serialu - tasiemca o dosach koniec bliski. Owa część ma formatu opis dyskietek większych od Double oraz nowy formatu propozycję!.
PS. tekst tłumaczony translatorem z qiuck assemblera na polski... ;)
Aby było jasno - większe dyski niż Double obsługuje prócz Sparty tylko My_Dos oraz plugin ATR (...ukryta kryptoreklama). Cały problem to informacje zawarte we VTOC, przypominam:
VTOC zaczyna się na sektorze 360 ($168) i cofa się ku początku dyskietki (prócz Medium dla Dos 2.5 !!!). Dla wszystkich dosów pierwsze 10 bajtów sektora 360 oznacza:
0. status (dla Dos 2.5) oraz liczba użytych sektorów na VTOC (dla reszty dosów) 1-2. maksymalna liczba wolnych sektorów 3-4. ilość obecnie wolnych sektorów (dla medium Dos 2.5 sektorów 1-719) 5. zabezpieczenie przed zapisem dysku (?) 6-9. wolne
Dalsze bajty to bitowa rozspiska wolnych sektorów, bit skasowany oznacza zajętość. Dla 720 sektorów przy single i double wystarczy 90 bajtów sektora 360 ($168). Dla medium potrzeba 130 bajtów. Więc Dos II i MyDos wykorzystuje dla kontynuacji VTOC sektor 359 ($167).
Przy Medium sektor 359 ($167) posiada rozpiskę wolnych sektorów 944-1009 dla Dos II i 944-1027 dla MyDos. Należy pamiętać, ze sektor 0 nie istnieje (we VTOC bajt 10 bit 1 zawsze skasowany).
Jak odczytywać format 360 i 720KB (oraz inne)? Wszystko znajduje się w pierwszym bajcie VTOC. Najpierw małe wzorki i tabelka...
Sektor 128b n=(f128 -2)*2 f128 =(n/2)+2 Sektor 256b m= f256 -2 f256 = m+2
Gdzie "f" jest pierwszym bajtem VTOC, "n" i "m" ilością sektorów wykorzystanych na VTOC
f | n | sektor 128 | m | sektor 256b | długość VTOC |
1 | - | - | - | - | - |
2 | 1 | Single | 1 | Double | 128 lub 256 |
3 | 2 | Medium | 1 | 260 i 360kB | 256 |
4 | 4 | 360kB | 2 | 720kB | 512 |
5 | 6 | 720kB | 3 | 1440kB | 768 |
6 | 8 | ? | 4 | ? | 1024 |
7 | 10 | ? | 5 | ? | 1280 |
8 | 12 | 1440kB | 6 | ? | 1792 |
Dodam tylko, że format 260kB to rozwinięcie Medium dla sektorów 256b.
DosII / My_Dos | sektor 128b | sektor 256b | ||||
all | free | f | all | free | f | |
260kB | - | - | - | 1023/1040 | 1010/1028 | 3 |
360kB | 2880 | 2865/2865 | 4 | 1440 | 1427/1428 | 3 |
720kB | 5760 | 5742/5743 | 5 | 2880 | 2866/2867 | 4 |
1140kB | 11520 | 11486/11497 | 8 | 5760 | 5745/5746 | 5 |
Gdzie "all" to ilość wszystkich sektorów dyskietki, "free" to oczywiście "free sectors" dla pustej dyskietki.
Bez wątpienia ww. tabele można rozwijać byle "f" nie przekroczyło wartości 255, ofkoz. Dla 16MB (wszystkich sektorów 65535) pierwszy bajt VTOC równa się f=23. A co jak przekroczymy tą barierę? Powstanie nowy format do 126,5MB i to bez utraty standardu!
I na pewno Atr utworzony pod pluginem o wielkości do 126,5 MB będzie w pełni kompatybilny z dyskietką DOS II w jego pierwszych 180KB, z partycją My DOS do 16 MB. Resztę widzi oczywiście tylko plugin...
1. BOOT SECTOR jest identyczny z DOS II
2. VTOC (sektor 360, $168) ma identyczne znaczenie, ale:
# bajtu - opis: 0. ilość sektorów przeznaczonych na VTOC minus 2 (standard My DOS!!!) 1-2. lo hi ilość wszystkich sektorów tzw. FREE SECTORS 3-4. lo hi ilość obecnie FREE SECTORS 5. zabezpiecznie dyskietki (??????) 6-7. niewykorzystane 8. Ahi ilość wszystkich sektorów tzw. FREE SECTORS 9. Fhi ilość obecnie FREE SECTORS 10. tabela bitowa VTOC
Wyjaśnienia wymaga bajt 8 i 9:
ilość wszystkich sektorów=.....lo+ 256*hi+ 65536*Ahi ilość obecnie FREE=............lo+ 256*hi+ 65536*Fhi
3. Długość sektora tylko 256b!!!!
4. DIR (katalog) główny w sektorach 360-368 ($169-$170) ma identyczne znaczenie jak w DOS II czy My DOS. Jest osiem sektorów 256b, każdy sektor wykorzystywany:
W pierwszej połówce na:
0. status wpisu 1-2. lo-hi: ilość sektorów zajętych przez plik 3-4. lo-hi: numer pierwszego sektora zajętego przez plik 5-12. osiem znaków nazwy pliku 13-15. trzy znaki rozszerzenia nazwy pliku
w drugiej połówce sektora mieszczą się dodatkowe dane o:
0. niewykorzystane 1-2. Llo-Lhi: ilość sektorów zajętych przez plik 3-4. Slo-Shi: numer pierwszego sektora zajętego przez plik 5-9. niewykorzystane 10. dzień 1-31 11. miesiąc 1-12 12. rok 0-255 (gdzie rok 2003 zapisany jest jako 103) 13. godzina 0-23 14. minuta 0-59 15. sekunda 0-59
Wyjaśnienia wymaga bajt 1-4 obydwu połówek:
ilość sektorów zajętych przez plik=...............lo+ 256*hi+ 65536*Llo numer pierwszego sektora zajętego przez plik=.....lo+ 256*hi+ 65536*Slo
5. Linki sektorów do sektora 65535 mają identyczne znaczenie jak w DOS II czy MY_DOS, czyli:
#bajtu - znaczenie 253-254 - lo -hi nr następnego sektora 255 - ilość bajtów w sektorze, może być wartość: 1-253
sektory od 65535 do końca mają linki zbudowane z:
#bajtu - znaczenie 253-254 - lo-hi nr następnego sektora 255 - ilość bajtów w sektorze, może być wartość: 1-252 252 - Nhi nr następnego sektora
gdzie nr następnego sektora: lo +256*hi +65536*Nhi
Tu wykorzystuje możliwość nie zapełniania całego sektora danymi, co jest dopuszczalne w każdej wersji DOS 2, DOS II i My DOS... Jakie miało to dotychczas zastosowanie (zabezpieczenie przed kopiowaniem plikowym dyskietki) nie wiem, ale teraz można to wykorzystać...
Oczywiście koniec pliku rozpoznawany jest po zerach w lo i hi. W bajcie 252 (czyli Nhi) może być wtedy dowolna wartość. Ponieważ sektor 65536 ($10000) nie jest wykorzystywany, ma we VTOC bit skasowany (podobnie jak sektor 720 $2D0).
6. Niewykorzystane sektory (zawsze jako zajęte) to:
0 - bo nie istnieje 1-3 - boot 368 - VTOC który biegnie w DÓŁ 369 - początek głównego katalogu 720 - zgodność z DOS II 65536 - aby ułatwić procedurę rozpoznawania końca pliku
7. Trochę statystyki dla 126,5 MB
Wszystkich sektorów: 518 063 Wolnych sektorów: 517 797 Długość ATR: 132 623 760 b
Przykład VTOC dla ATR 126,5 MB
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, b, c, d, e, f 00> ff,a5,e6,a5,e6, 0, 0, 0, 7, 7, f,ff,ff,ff,ff,ff, 10> ff,ff,ff,ff,ff,ff,ff,f0, 0, 0, 0, 0, 0, 0, 0, 0, -tu zaczyna mapa bitowa 20-2f> 0 między 108 a 360 sektorem 30> 0, 0, 0, 0, 0, 0, 0, 0, 7f,ff,ff,ff,ff,ff,ff,ff, -tu jest katalog 40-5f> ff 60> ff,ff,ff,ff,7f,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff, -sektor 720 zajęty 70-1fff> ff 2000> ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,7f,ff,ff,ff,ff,ff, -sektor 65536 zajęty 2010-fcff> ff fd00> 0
Mapa bitowa zajmuje 253 sektory (od 108 do 360) czyli:
253 * 256b = 64768 b * 8bit = (sektory po 256b) = 518144 - (10 * 8bit) = (pierwszy sektor ma 10 bajtów na dane) = 518064 - 1 = (sektor zerowy) = 518063 sektory do wykorzystania (na dane, katalogi i VTOC)
Przykład wpisu do katalogu:
plik SPARTA_PLUGIN.TXT zapisany jako SPARUGIN TXT długość 1131b sektory 5 first sector 4 czas 2003-12-17 20:37:12 42 05 00 04 00 53 50 41 52 55 47 49 4E 54 58 54 - pierwsza połówka wpisu 00 00 00 00 00 00 00 00 00 00 11 0C 67 14 25 0C - i druga