Toto chce byt taky strucny popis formatu MB-02 na diskete
s naznacenym algoritmom pre nacitanie adresara alebo suboru
z tejto diskety na inych operacnych systemoch ako BS-DOS.
Uplny popis formatov pouzivanych na MB-01 a MB-02 najdete
v samostatnej sekcii.
BS-DOS pouziva dlzku sektora 1 kilobajt (1024 bajtov).
Vsetky dvojbajtove udaje v systemovych strukturach diskety
su ulozene na diskete v klasickom Z80-formate, t.j. vzdy je
ulozeny najprv nizsi bajt, a za nim ide vyssi bajt hodnoty.
V popise sa nachadzaju pojmy "logicke" a "fyzicke" cislo sektora.
Fyzicke cislo sektora je ciselne vyjadrena fyzicka poloha
sektora na diskete. Je to vlastne cislo stopy, cislo strany kde sektor
lezi a poradove cislo sektora na stope. Cislo strany je 0 alebo 1,
cislo stopy sa pocita od nuly a poradove cislo sektora na stope
zacina od jednotky. Maximalne hodnoty stopy a sektora zavisia
od konkrentej mechaniky a naformatovania, a mozu sa pri rozne
naformatovanych disketach menit.
Logicke cislo sektora je poloha sektora na diskete vyjadrena len
jednym cislom. Toto logicke cislo sa da vypocitat z fyzickeho takto:
logicke_cislo = 2 * XX * cislo_stopy + XX * cislo_strany + poradove_cislo_sektora - 1
Ta -1 je tam preto, lebo poradove cislo sektora sa pocita
od jednotky, a logicke cislo sektora sa pocita uz od nuly.
XX znamena pocet sektorov na stopu. Kolko sektorov na stopu
ma dana disketa, je zaznamenane v jej BOOT sektore.
Ked teda mame presne specifikovane znacenie
sektorov, mozeme sa pozriet, co pekneho obsahuju.
System ukladania dat na MB-02 disketu je zalozeny na principe
vyuzitia FAT. FAT znamena File Allocation Table a specifikuje
sa v nej, ktory sektor prislucha ktoremu suboru, ktory sektor
je dalsi v poradi v subore a kolko bajtov z posledneho sektora
suboru je vyznamnych.
Vsetky viacsektorove struktury na diskete maju takto vo FATke
priradene sektory. Viacsektorove struktury su samotne subory,
podadresare, aj hlavny adresar (!) a dokonca aj samotna FATka.
Adresare a FATka teda nemaju pevne pridelene miesto na disku
ako je to vo vecsine ostatnych systemov (MS-DOS, D80, Sin-dos),
ale ich umiestnenie na diskete je flexibilne a variabilne.
Na jednej diskete moze byt vytvorenych az 256 adresarov,
kazdy lubovolnej dlzky (obmedzenej len volnym miesto na diskete).
Kazdy adresar ma cislo (0-255), adresar 0 sa berie ako korenovy.
Pocet adresarov je z hladiska formatu teoreticky neobmedzeny, avsak
BS-DOS vie pracovat len s prvymi 256 adresarmi.
Najdolezitejsi sektor na diskete je uz spominany BOOT sektor.
Obsahuje velmi dolezite udaje o diskete, a v pripade,
ze disketa je systemova, tak obsahuje aj loader systemu.
BOOT sektor ma tieto parametre:
fyzicke cislo: stopa 0 strana 0 sektor 1,
logicke cislo: 0.
Tiez aj operacny system testovanim BOOT sektora
indentifikuje ci sa jedna o disketu systemu BS-DOS.
Identifikacne bajty, pomocou ktorych sa to robi, su tieto:
Offset hodnota #00 ... #18 #03 ... #02 #20 ... #00 #25 ... #00
Offset znamena relativnu adresu vzhladom k zaciatku sektora. Teraz nasleduje popis niektorych dolezitych udajov v boot sektore:
Offset vyznam #04-#05 ... celkovy pocet stop na diskete * #06-#07 ... pocet sektorov na stopu #08-#09 ... pocet povrchov na diskete (tu je vzdy 2) #0A-#0B ... pocet sektorov na cluster (tu je vzdy 1) * #0C-#0D ... logicke cislo sektora DIRS #0E-#0F ... pocet sektorov FAT (1 az 4) #10-#11 ... dlzka FAT (#400 krat pocet sektorov FAT) * #12-#13 ... logicke cislo prveho sektora prvej FAT #14-#16 ... logicke cislo prveho sektora druhej FAT #26-#3F ... meno diskety
Vsetky ciselne udaje su 16-bitove,
ulozene v Z80 notacii (nizsi bajt na nizsom offsete).
Udaje oznacene hviezdickou budete potrebovat na vytvorenie loadera.
Na disku sa kvoli spolahlivosti nachadzaju dve identicke kopie fatky.
Pre loader vam staci nacitat jednu z nich. Vsimnine si, ze vobec
nepotrebujete poznat dlzku FATky, a ani celkovy pocet stop na disku.
To preto, lebo cisla dalsich a specifikacia posledneho sektora FATky
su zapisane priamo vo FATke. A pocet stop preto, lebo nikde na diskete
[pokial nie je porusena datova konzistencia] nie je odkaz na sektory,
ktore by sa nachadzali mimo dany rozsah stop.
Pocet sektorov na stopu je prave ta hodnota XX, ktoru budete
potrebovat na prepocet logickych cisel sektorov na fyzicke, aby
ste mohli presne definovat ktory sektor z ktorej stopy treba loadnut.
Dalsi velmi dolezity sektor na diskete je DIRS sektor.
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 bit 7 = 1 ... dany adresar existuje bit 7 = 0 ... dany adresar neexistuje #01 ....... kontrolny CRC sucet mena adresara #02,#03 ... (len bity 0-13) logicke cislo prveho sektora adresara (ak existuje)
Poradove cislo (pocitane od nuly) danej polozky presne zodpoveda
cislu adresara. Kontrolny sucet mena adresara je vyuzivany systemom
pre kontrolu datovej konzistentnosti diskety a pre rychlejsie vyhladanie
daneho adresara podla mena. Pri tvorbe loadera ho nemusite pouzit.
Ak je v prvom bajte polozky bit 7 = 0 potom dany adresar neexistuje,
alebo lepsie povedane, jeho dlzka je presne nula suborov a teda na
svoje ulozenie na disk nepotrebuje ani jeden sektor. Preto vtedy
cislo v bajtoch #02 a #03 nema vyznam. Ak je bit 7 = 1 potom toto
cislo ukazuje na prvy sektor daneho adresara. Dalsie sektory daneho
adresara mozno najst pomocou udajov z FATky.
Kazdy adresarovy sektor obsahuje 32 poloziek dlhych 32 bajtov.
Nulta polozka (lebo polozky sa pocitaju od nuly) v uplne prvom
sektore adresara ma specialny vyznam. Ostatne polozky obsahuju
informacie o jednotlivych suboroch na disku.
Nulta adresarova polozka ma specialny vyznam - v bajtoch #06-#1f
obsahuje meno adresara a v bajte #05 sa nachadza cislo adresara,
do ktoreho patri tento adresar (cislo nad-adresara). Toto cislo
vlastne definuje adresarovu strukturu na diskete.
Vyznam bajtov v ostatnych adresarovych polozkach:
#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 #05-#15 ... klasicka magnetofonova hlavicka #18-#1B ... dlzka suboru (#18=najnizsi, #1B=najvyssi bajt) #1C ....... flagbajt tela (zvycajne #FF) #1E-#1F ... logicke cislo prveho datoveho sektora suboru (iba bity 0-13)
System BS-DOS musi vediet emulovat magnetofonovu kazetu.
Tym padom sa musi vysporiadat aj s bezhlavickovym suborom,
pripadne so samostatnou hlavickou bez tela. Preto je v polozke
ten identifikacny bajt a flagbajt tela (ktore sa v inych diskovych
systemoch nevyskytuju). Ak polozka obsahuje bezhlavickovy subor,
vtedy na obsahu bajtov #05-#15 nezalezi. Ak sa v polozke uchovava
len hlavicka, alebo subor ma nulovu dlzku, potom zase nezalezi na
obsahu bajtov #1E-#1F, pretoze na ulozenie dat nie je potrebny ziadny
datovy sektor. Regulerne hlavickove subory (zvycajne) maju flagbajt #FF.
Dlzka suboru sa sice uz raz nachadza v hlavicke, ale kedze BS-DOS
podporuje aj subory dlhsie ako 64kB a v hlavicke je dlzka definovana
iba ako 16-bitove cislo, je tato dlzka este raz ulozena v bajtoch #18-#1B.
Samozrejme, ze so subormi dlhsimi ako 64kB sa uz neda pracovat pomocou
magnetofonovych volani #04C6 a #0562 v romke.
Pre tvorbu loadera je podstatne zistit ci subor ma aj hlavicku a aj telo
(identifikacny bajt), ak ma hlavicku, mozno z nej vziat informacie ako
typ suboru (basic,bytes,array), meno suboru, adresa suboru (startovaci
riadok basicu), potom z bajtov #18-#1B sa vezme dlzka suboru a z bajtov
#1E-#1F cislo prveho datoveho sektora, kde subor zacina. Cisla dalsich
datovych sektorov mozno zistit z FATky.
Dlzka suboru definovana v bajtoch #18-#1B je presne zhodna s dlzkou
suboru danou postupnostou sektorov vo FATke. (Toto je tiez jeden z
kontrolnych suctov pomocou ktorych BS-DOS kontroluje datovu integritu.)
File Alocation Table
FAT je tabulka v ktorej kazdy sektor na diskete ma svoju vlastnu polozku.
V tejto polozke su rozne informacie - napriklad ci je dany sektor volny,
ci je obsadeny, alebo nebodaj chybny, pripadne ak sektor patri do nejakej
sekvencie sektorov viacsektorovej struktury, tak definuje ktory sektor je
nasledujuci v danej strukture, a ak je dany sektor na konci takejto
struktury, tak zase ze kolko bajtov z daneho sektora je skutocne vyuzitych
(lebo napr. subor nemusi byt vzdy presne dlhy nejaky nasobok 1024 bajtov).
Kazda polozka FATky ma dva bajty a su zoradene presne v takom istom poradi,
ako logicke cislovanie sektorov. Teda napriklad polozka pre sektor s logickym
cislom 324 je ulozena presne 2*324 bajtov od zaciatku FATky.
A teraz si ukazme presne ake informacie su vo FAT polozke.
Zacnime vynimkami (potvrdzujucimi pravidlo?).
Akonahle je vyssi bajt polozky #FF, potom sa jedna o specialny sektor,
ktory nie je pouzity pre ukladanie viacsektorovych struktuk. Moze to byt
napr. chybny sektor alebo sektor so specialnym vyznamom (napr. BOOT sektor).
Vyznam ostatnych sektorov je dany bitmi 14 a 15.
volny sektor, ktory prave nepatri ziadnej viacadresarovej strukture, pripraveny na pouzitie a ktory je tym padom pre nas nezaujimavy, lebo neobsahuje ziadne pre nas uzitocne data. | |
sektor je sucastou retaze sektorov v ktorych su ulozene data viacadresarovej struktury, a jeho konkrenty vyznam urcuje bit 14. | |
ostatne bity (0-13) obsahuju logicke cislo dalsieho sektora ktory nasleduje za dotycnym sektorom vo viacadresarovej strukture. | |
posledny sektor viacadresarovej struktury. Tym padom uz nie je potrebne definovat nasledujuci sektor a ostatne bity (0-13) obsahuju informaciu o tom, kolko bajtov z tohto sektora je skutocne vyuzitych. |
Priklad: Majme na disku subor dlhy presne 1500 bajtov. Tento subor
zabera na disku dva sektory. Bajty #1E-#1F v adresarovej polozke
tohto suboru obsahuju logicke cislo prveho datoveho sektora.
FAT polozka tohto prveho datoveho sektora je akymsi "smernikom"
na druhy datovy sektor, lebo bity 0-13 v nej obsahuju logicke cislo
druheho datoveho sektora. Bity 14 a 15 v tejto polozke maju hodnotu 1.
No a nakoniec bity 0-13 vo FAT polozke prisluchajucej druhemu datovemu
sektoru obsahuju cislo 476, lebo prave tolko bajtov zo suboru sa muselo
vlozit do tohto druheho sektora (prvych 1024 bajtov suboru je v prvom
sektore). V tejto druhej adresarovej polozke su bity 14 a 15 nastavene
takto: bit 14 = 0, bit 15 = 1.
V uvode sa pisalo, ze aj samotna FATka je na disku ulozena ako
viacsektorova struktura, a teda postupnost sektorov FATky je
tiez riadne definovana v samotnej FATke. To je sice velmi pekne,
ale ako zistit, ktore sektory patria FATke, ked samotnu FATku
este nemame loadnutu v pameti ???
Tento velmi poeticky problem sa da riesit uplne prozaicky.
Cislo prveho sektora kazdej FATky vieme - je napisane v BOOT sektore.
Loadneme do pameti tento sektor, a v nom uz lahko najdeme aj cisla
vsetkych ostatnych FAT sektorov. Totizto formatovaci program, ktory
urcuje kde a na ktorych sektoroch budu obe FATky umiestnene, alokuje
FAT sektory zasadne len medzi prvymi 512 sektormi. A tym padom zabezpeci,
ze informacia o rozlozeni FATiek na diskete je vzdy dostupna.
Priklad loadnutia suboru
Tak, a tym padom mame vysvetlene vsetko, co je dolezite pre tvorbu
loadera suborov z diskety systemu MB-02. A na zaver si este hodme jeden
malicky, velmi konkretny prikladik:
Dajme tomu, ze chceme nacitat z diskety subor, ktory je v adresari 3
ulozeny pod cislom 50. K dispozicii mame len funkciu pre nacitanie
jedneho sektora do pameti. Takze podme na to.
Zo vsetkeho najprv musime nacitat BOOT sektor (a pripadne skontrolovat ci sa vobec jedna o disketu MB-02) | |
2. | Na offsete #12-#13 je logicke cislo prveho FAT sektora, ktory tiez nacitame do pameti. Precitame polozku z FATky, ktora zodpoveda tomuto sektoru. Tym padom sa dozvieme ktory sektor FATky je dalsi - nacitame ho. Takto postupujeme, az pokym nenarazime na polozku vo FATke, ktora oznacuje posledny sektor v tejto viacsektorovej strukture. Tym padom mame celu FATku v pameti a mozeme sa vrhnut na dalsie veci. |
3. | Na offsete #0C-#0D je logicke cislo DIRS sektora. Nacitame ho do pameti. |
4. | Teraz v DIRS sektore vyhladame polozku pre adresar 4. Kedze polozky su dlhe 4 bajty, bude tato polozka na relativnej adrese 12 vzhladom na zaciatok sektora. |
5. | Pozrieme sa na bit 7 prveho bajtu polozky. Ak je nula - zle je, lebo adresar 3 sa na diskete proste nenachaza. Ak je to jednotka, pozrieme sa na bity 0-13 bajtov #02 a #03 tejto polozky. |
6. | Tieto bajty nam urcuju, na ktorom sektore zacina adresar. Kedze my chceme 50. polozku, a v jednom adresarovom sektore ich je len 32, musime si loadnut do pameti az druhy adresarovy sektor. Tento najdeme pomocou FATky - pozrieme sa kam nam ukazuje polozka patriaca k tomu prvemu adresarovemu sektoru. Ak bol prvy sektor zaroven aj poslendym, zle je, lebo adresar neobsahuje 50 suborov... |
7. | Ale ak obsahuje, loadneme si do pameti tento druhy sektor a najdeme v nom polozku na relativnej adrese 32*18, lebo prave tu sa nachadza nasa hladana adresarova polozka. Z polozky nacitame potrebne udaje o subore. Ak je nahodou identifikacny bajt polozky iny ako tie 4 moznosti, potom polozka neobsahuje ziadny subor... a doloadovali sme. |
8. | Ale ak je napr. #B0, potom polozka definuje riadny hlavickovy subor a bity 0-13 v bajtoch polozky #1E-#1F obsahuju logicke cislo prveho sektora suboru. |
9. | A posledny krok - nacitavame postupne jeden sektor suboru za druhym, ktory sektor ma nasledovat po aktualnom sektore, vzdy zistime z FATky. Nacitavame, az pokym nedorazime na koniec retaze sektorov. Polozka prisluchajuca poslednemu sektoru neobsahuje cislo dalsieho v retazi, ale informaciu o tom, kolko bajtov nam staci z tohto sektora zobrat, aby subor bol cely loadnuty. |
A tym padom mame nas subor cely nacitany a mozeme ho sejvnut na disketu v danom operacom systeme, v ktorom pracujeme, alebo vyuzit na ine ucely...