Ked som si s pomocou svojho priatela MDV postavil
svoju prvu disketovu jednotku MB-01, bolo treba este vyriesit dve dolezite veci.
Jednou z nich bolo ako ma vyzerat format diskety.
Hned prve co ma napadlo bolo vyuzit nejaky format z uz existujucich disketovych
jednotiek. Lenze zistil som jednu velmi neprijemnu vec - ziadny existujuci
format nedokazal priamo adresovat viac ako cca 1 MB dat, co je sice pre DD diskety
dostatocne, ale pre HD je to malo. A tak som chtiac-nechtiac musel vymysliet nejaky
vlastny format, pretoze s pseudorieseniami typu rozdelit disketu na dve logicke
diskety a podobne som sa nehodlal uspokojit. Okrem toho tu boli aj ine dovody preco
som musel siahnut po niecom novom. Napriklad ziadny existujuci format neumoznoval
zaznamenat k suboru datum a cas. Uvazoval som aj o MS-DOS formate, ale ten zase nebol
vhodny z inych pricin - neumoznoval uchovavat o suboroch vsetky potrebne informacie,
ktore ZX Spektrum pouziva (napriklad zaciatocna adresa, startovaci riadok, dlzka
cisteho basicu...)
A tak som si vymyslel vlastny format pre disketu. Pre istotu som ho dimenzoval pre pouzitie
az do velkosti diskiet 4 MB, keby nahodou sa casom rozsirili disketove mechaniky
s hustotou zaznamu ED (extended density). Okrem vsetkych tych klasickych veci
ktore umoznovali ostatne formaty, tento format umoznoval uchovavat o suboroch datum a cas,
na disku mohli existovat aj bezhlavickove subory. Dlzku suboru som pre istotu dimenzoval
az do 4 GB.
Jednou z nevyhod vecsiny inych formatov bolo ze mali adresar pevnej dlzky
a viac suborov ako umoznoval adresar sa na disk jednoducho nedalo umiestnit. Tuto nevyhodu
som odstranil tym, ze som do formatu zaviedol dynamicku dlzku adresara - adresar bol tak
dlhy ako to bolo potrebne a tym padom neexistovalo obmedzenie maximalneho poctu suborov.
A este navyse som umoznil na disku vytvorit viac adresarov, ktore mohli byt zorganizovane
do (nie len!) stromovej struktuty.
Casto sa stava, ze disketa, ktoru sa pokusate naformatovat ma nultu stopu vadnu.
Pritom nemusi byt vadna cela nulta stopa, obycajne je vadnu len jeden alebo dva sektory.
Co vam oznamia bezne disketove jednotky ? Alebo co vam oznami klasicky MS-DOS ?
Jednoducho taka disketa nejde naformatovat a vobec ju nemozete pouzit. Avsak toto
neplati v pripade disketovej jednotky MB-01. Format pre ne som vymyslel tak,
aby skoro vsetky potrebne systemove struktury (FAT, adresare...), ktore sa bezne umiestnuju
na pevne miesto na nultej stope, mohli byt prakticky kdekolvek na diskete. Na nultej stope
a nultej strane musi byt umiestneny len boot a zalohovaci sektor. Ale v ramci nultej stopy
mozu byt umiestnene kdekolvek, takze staci, ak na nultej stope a strane su len dva dobre
sektory, a uz je dana disketa na MB-01 v pohode pouzitelna.
Jednou z velmi dolezitych vlastnosti, ktoru som pri navrhu formatu chcel dosiahnut,
bola bezpecnost dat ulozenych na diskete. Vsetky dolezite datove struktuty su chranene
kontrolnymi suctami, samotna FATka je dokonca pre istotu zdvojena. Dalsou vecou, ktorej
cielom je zvysit bezpecnost dat, je prave vyssie spominany zalohovaci sektor. Tento sektor
ma jednoduchy ucel - ak treba na disk zapisat boot sektor alebo nejaky sektor adresara,
zapise sa najprv do zalohovacieho sektora a az potom na miesto kam patri. Je to tak navrhnute
tak preto, aby sa v pripade akehokolvek padu systemu (reset, vypnutie napajania)
v ktoromkolvek okamihu zapisu na disk neznicili data, ktore na disku su uz zapisane.
5.25/DS DD 3.5/5.25/DS DD 3.5/DS HD ---------- -------------- --------- Pocet stop ......... 40 ......... 80 .......... 80 Sektorov na stopu ... 5 .......... 5 .......... 11 Dlzka sektora .... 1024 ....... 1024 ........ 1024 bajtov Kapacita disku .... 400 ........ 800 ........ 1760 kB Cista for. kap. ... 395 ........ 793 ........ 1759 kB Dlzka fatky ......... 1 .......... 2 ........... 4 sektory
Boot sektor obsahuje zakladne informacie o diskete a v pripade, ze je disketa systemova, tak aj systemovy zavadzac. Hned za boot sektorom nasleduje zalohovaci sektor. Struktura udajov v boot sektore je nasledujuca:
0-1 ...... skok na systemovy loader 2 ........ vyssi bajt adresy systemoveho loadera (#80) 3 ........ identifikacia verzie formatu MB-01 (#01) 4-13 ..... meno disku 14 ....... pocet stop na disku 15 ....... pocet sektorov na stopu 16-19 .... datum a cas formatovania 20-23 .... adresa a dlzka systemu (pre systemovy zavadzac) 24 ....... logicke cislo prveho sektora zoznamu adresarov 25 ....... logicke cislo prveho sektora zoznamu suborov 26 ....... dlzka FATky v sektoroch 27-30 .... logicke cislo prveho sektora prvej fatky 31-34 .... logicke cislo prveho sektora druhej fatky 35-36 .... neobsadene 37-44 .... identifikacia disku (interne meno pre system) 45-1023 .. systemovy loader alebo volne miesto
FAT alebo File Alocation Table obsahuje informacie o priradeni sektorov na disku jednotlivym suborom alebo systemovym strukturam. Sklada sa zo 16-bitovych poloziek, ktorych bity maju nasledujuci vyznam:
15 ...... 0 = platny sektor 1 = zmazany sector 14 ...... vyznam bitov 0-11 12-13 ... 0=normalny sektor (used or free) 1=systemovy sektor (boot, FAT, adresare) 2=chybny sektor (chyba pri formatovani) 3=neplatna polozka (koniec FATky) 0-11 .... bit 14=0 ... dalsi sektor v retazi sektorov bit 14=1 ... pocet bajtov v poslednom sektore suboru Ak ma polozka vsetky bity nulove, potom predstavuje volny sektor.
Zoznam adresarov obsahuje linearne za sebou zoradene vsetky adresare, ktore na disku existuju. Kazdy adresar obsahuje cislo svojho nadadresara, do ktoreho patri. Tymto je definovana struktura logickeho usporadania adresarov na disku. Kazdy adresar je definovany v 16 bajtovej polozke s takouto strukturou:
0 ....... poradove cislo nadadresara 1-4 ..... datum a cas vytvorenia adresara 5 ....... 0=neplatna polozka, inak platna polozka 6-15 .... meno adresara
Zoznam suborov alebo klasicky adresar obsahuje linearne za sebou zoradene vsetky subory, ktore na disku existuju. Kazdy subor obsahuje cislo svojho adresara, do ktoreho patri. Kazdy subor je definovany v 32 bajtovej polozke s takouto strukturou:
0 ....... poradove cislo adresara 1-4 ..... datum a cas suboru 5 ....... identifikacny bajt \ 6-15 .... meno suboru \ 16-17 ... dlzka suboru (mod 65536) } as MG head 18-19 ... adresa alebo start / 20-21 ... dlzka basicu / 22-23 ... adresa tela 24-26 ... dlzka tela 27 ...... flagbajt tela 28 ...... atributy suboru 29 ...... neobsadene 30-31 ... logicke cislo prveho sektora suboru (alebo 0)
Vyznam bitov v identifikacnom bajte:
7 ....... 0=platna polozka, 1=zmazana polozka 6 ....... 1=subor ma telo 5 ....... 1=subor ma hlavicku 4 ....... neobsadene 3-0 ..... typ suboru Typ suboru: 0 ...... program (basic) 1 ...... number array 2 ...... character array 3 ...... bytes 4 ...... headerless 5 ...... 48k snapshot 6 ...... 128k snapshot 7-15 ... neobsadene
Po roku pouzivania formatu MB-01 sa nazbieralo zopar skusenosti, kde co ako vylepsit, aby sa s disketou pracovalo pohodlnejsie, bezpecnejsie a hlavne rychlejsie. Tieto skusenosti som premietol do navrhu formatu pre MB-02, s ktorym pracuju operacne systemy BS DOS verzie 199 az 308. Hlavny rozdiel oproti MB-01 spociva v tom, ze uz nie su vsetky subory zoradene v jednom zozname suborov, ale kazdy adresar ma svoj vlastny zoznam suborov. Meno adresara sa uz nenachadza v polozkach jednotlivych adresarov, ale v nultej polozke zoznamu suborov. Dalsie drobne zmeny postihli boot sektor a strukturu poloziek vo FATke a v zozname suborov.
Boot sektor aj tu obsahuje zakladne informacie o diskete a v pripade, ze je disketa systemova, tak aj systemovy zavadzac. Nachadza sa vzdy na stope 0 strane 0 a ma cislo sektora 1. Logicke cislo boot sektora je vzdy 0. Hned za boot sektorom nasleduje zalohovaci sektor (stopa 0, strana 0, sektor 2, logicke cislo 1). Struktura udajov v boot sektore je nasledujuca:
#00-#01 ... Skok na systemovy zavadzac #02 ....... nepouzite, obycajne je tu #80 #03 ....... tu musi byt #02 (znacka MB-02) #04-#05 ... pocet fyzickych stop na disku (vecsinou 80 alebo 82) #06-#07 ... pocet sektorov na stope (pocitaju sa od 1) #08-#09 ... pocet povrchov na disku (standartne 2) #0A-#0B ... pocet sektorov na cluster (standartne 1) #0C-#0D ... logicke cislo sektora DIRS #0E-#0F ... pocet sektorov FAT (1 az 4) #10-#11 ... dlzka FAT (#400 * pocet sektorov FAT) #12-#13 ... logicke cislo prveho sektora prvej FAT #14-#15 ... logicke cislo prveho sektora druhej FAT #16 ....... kontrolny sucet (XOR) systemovej identifikacie diskety #17 ....... neobsadene #18-#19 ... verzia formatovaca (Pre F02-V30 je to hodnota 30) #1A ....... logicke cislo druheho sektora prvej FAT #1B ....... logicke cislo druheho sektora druhej FAT #1C ....... logicke cislo tretieho sektora prvej FAT #1D ....... logicke cislo tretieho sektora druhej FAT #1E ....... logicke cislo stvrteho sektora prvej FAT #1F ....... logicke cislo stvrteho sektora druhej FAT #20 ....... tu musi byt #00 (znacka MB-02) #21-#24 ... datum a cas formatovania #25 ....... tu musi byt #00 (znacka MB-02) #26-#2F ... meno diskety #30-#3F ... rozsirenie mena diskety #40-#5F ... systemova identifikacia diskety
Podla bajtov oznacnych ako znacka rozpoznava BS-DOS ze sa jedna o disketu zo systemu MB-02. V boote su zapisane cisla prvych sektorov FAT. Dalsie sektory FAT sa daju najst priamo podla FAT - lebo obidve FAT su ulozene ako subory - riadne sekvencie sektorov.
DIRS sektor obsahuje zoznam adresarov na diskete. Jeho logicke cislo je zaznacene v BOOTe na offsete #0C-#0D Tento sektor obsahuje 256 stvorbajtovych poloziek, kde kazda jedna polozka znamena jeden adresar. Vyznam bajtov v tejto polozke:
#00 ....... identifikacia polozky #80 = platna polozka a adresar existuje ine = adresar neexistuje a neplatna polozka #01 ....... xor mena adresara (koli rychlejsiemu hladaniu) #02,#03 ... logicke cislo prveho sektora adresara (len bity 0-13)
Adresarove sektory obsahuju zoznam suborov v danom adresari. Logicke cislo prveho sektora kazdeho adresara je ulozene v bajtoch #02-#03 poloziek v sektore DIRS. Tieto sektory obsahuju 32 bajtove polozky. Vyznam bajtov v polozke:
#00 ....... identifikacia polozky. Vyznam bitov: 7 ....... 1=platna polozka, 0=zmazana polozka alebo volne miesto 6 ....... 1=specialny subor, 0=normalny subor 5 ....... 1=subor ma telo 4 ....... 1=subor ma hlavicku 3-0 ....... rezerva #01-#04 ... datum a cas vytvorenia suboru #05-#15 ... klasicka magnetofonova hlavicka #16-#17 ... adresa tela #18-#1B ... dlzka tela (#18=najnizsi, #1B=najvyssi bajt) #1C ....... flagbajt tela #1D ....... atributy suboru #1E-#1F ... logicke cislo prveho sektora tela (iba bity 0-13)
Tato 32-bajtova struktura sa odborne nazyva "adresarova polozka". S tymito polozkami pracuju sluzby GETSUB a OWSUB.
Nulta adresarova polozka ma specialny vyznam - je vzdy platna a obsahuje taketo bajty:
#00 ....... identifikator (vecsinou #80) #01-#04 ... datum a cas vytvorenia adresara #05 ....... cislo nad-adresara (do ktoreho patri tento adresar) #06-#0f ... meno adresara #10-#1f ... rozsirenie mena adresara
File alocation table alebo skratene FAT obsahuje 16-bitove polozky. kazda specifikuje jeden sektor na diskete. Vyznam jednotlivych bitov v polozke:
Bit 15: 0 ... neobsadeny, volny sektor pripraveny na pouzitie 1 ... obsadeny, vyuzity sektor [obsahuje udaje alebo je chybny] 14: 0 ... posledny sektor suboru 1 ... priebezny sektor, nie posledny 0-13: [bit14=0] pocet bajtov v sektore do konca suboru [bit14=1] logicke cislo nasledujuceho sektora v subore
Pozor, ak bity 8-15 obsahuju same jednotky, potom vyznam hodnoty v bitoch 0-7 je takyto:
#00 ... specialny sektor na sluzobne ucely [boot, zalohovaci sektor] #F? ... nepouzitelny sektor: #FC - chybny sektor [CRC error] #FD - chybny sektor [Rec. not found] #FE - neexistujuci sektor [druha strana jednostranneho disku] #FF - neexistujuci sektor [za fyzickym okrajom diskety]
Datum a cas formatovania disku, vytvorenia adresara a suboru su vzdy 4-bajtove hodnoty s kodovanim presne ako MSDOS:
bit 0-4 ... sekunda delena dvomi (0-29) bit 5-10 ... minuta (0-59) bit 11-15 ... hodina (0-23) bit 16-20 ... den (1-31) bit 21-24 ... mesiac (1-12) bit 25-31 ... rok zmenseny o 1980 (0-127)
Podrobnejsi popis niektorych struktur a ako mozno nacitat MB-02 disketu na inych diskovych systemoch ako MB-02 sa mozete docitat v samostatnej sekcii.