Ako nacitat MB-02 diskety mimo MB-02

   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
              #90 = subor obsahuje iba hlavicku
              #A0 = subor obsahuje iba telo
              #B0 = subor obsahuje aj hlavu aj telo
              #80 = subor neobsahuje hlavu ani telo (nestava sa casto)
              Ine hodnoty znamenaju neplatnu adresarovu polozku.
  #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.
   bit 15 = 0   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.
bit 15 = 1   sektor je sucastou retaze sektorov v ktorych su ulozene data viacadresarovej struktury, a jeho konkrenty vyznam urcuje bit 14.
bit 14 = 1   ostatne bity (0-13) obsahuju logicke cislo dalsieho sektora ktory nasleduje za dotycnym sektorom vo viacadresarovej strukture.
bit 14 = 0   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.

   1.

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

Nazad / back