SFS-01
Spectrum File System

Úvod

V poslednom čase sa veľmi rozvírila hladina okolo pripojenia harddiskov k ZX Spektru. Dokonca už v lete na DoxyCone 98 a potom v zime na ZlinCone 98 Tritol prezentoval prvé rozhranie pre ZX Spektrum umožňujúce pripojenie a ovládanie IDE harddisku. Preto už v lete, na DoxyCone 98 sa udial historický okamih - vznikla KpSH - Komisia pre Štandardizáciu Harddisku. Členmi novovzniknutej komisie vtedy boli Tritol, Pvl, LMN of 8BC, BLS of 8BC, Glip a ja (Busy). Neskôr sa k nej pridali ešte Noro, WWW a Baze. Komisia si uložila za úlohu zaviesť akýsi štandart v používaní harddisku na ZX Spektre a tým zabezpečiť kompatibilitu medzi jednotlivými užívateľmi harddisku. Všetci iste dobre poznáte dnešnú situáciu disketových jednotiek na Spektre - existuje ich niekoľko vzájomne nekompatibil-ných typov. Hlavným cieľom tejto komisie je zabezpečiť, aby sa tento stav neopakoval aj v prípade harddiskov a aby nevzniklo niekoľko rôznych pripojení a spôsobov používania harddisku na Spektre. Prvým krokom k dosiahnu-tiu tohto cieľa je niečo, čo sa nazýva Speccy File System.

Čo je Speccy File System?

Speccy File System (ďalej len SFS) je norma, ktorej hlavným cieľom je definovanie spôsobu ukladania dát na harddisku, alebo inými slovami povedané, ako má byť harddisk naformátovaný. V tom sa skrývaju tieto dve veci:

• rozdelenie harddisku na partície
• štruktúra údajov v jednej partícii

Ďalším cieľom sú rôzne doporučenia pre operačný systém, ktoré popisujú ako sa má s takto definovaným formátom harddisku efektívne pracovať.
Samozrejme SFS definuje ukladanie dát nielen na harddisk, ale vo všeobecnosti aj na ľubovoľné iné záznamové médium (ďalej len médium) s blokovým prístupom k dátam (t. j. dáta sú uložené v sektoroch).

Rozdelenie harddisku na partície

Jedným z uznesení komisie bolo, že harddisk bude rozdelený na partície presne tak ako definuje MS-DOS 5.0 a vyšší. Prináša to so sebou niekoľko veľmi pozitívnych dôsledkov: na harddisku je možné si vytvoriť niekoľko partícií, jedna bude klasická MS-DOS, ďalšia bude napríklad Linux ext2, a čo je najhlavnejšie, jedna bude naformátovaná podľa normy SFS. Umožní to veľmi jednoduché používanie toho istého harddisku na PeCi pod MS-DOSom, pod Linuxom, ale zároveň aj na Spektre.

Nízkokapacitné médiá (diskety, ramdisky) nie sú rozdelené, t. j. ako keby celé médium vytváralo jednu partíciu. Ďalší text je už popis štruktúry údajov v jednej partícii, ktorá je naformátovaná podľa normy SFS. Mimochodom, čítali ste VIX-ovu básničku "Partícia moja krásna"? Veľmi pekná básnička!

Základné charakteristiky a ohraničenia

Aj keď komisia v kútiku duše dúfala, že sa jej podarí navrhnúť SFS ktorý by nemal absolútne žiadne ohraničenia (pod heslom "Na Spektre je všetko možné!"), predsa len sa napokon radšej rozhodla viac sa držať pri zemi a navrhnúť niečo, čo by bolo rozumným kompromisom medzi nekonečnými možnosťami adresácie diskových kapacít a medzi efektívnou a nie príliš zložitou prácou operačného systému, ktorý bude pracovať nad týmto formátom. Navrhnutý SFS má takého ohraničenia:

Parameter

FAT16

FAT32

Maximálna velkosť fyzického sektora (bytes) 2^14 2^30
Maximálna velkosť  logického sektora (bytes) 2^14 2^30
Maximálna velkosť jedného súboru (bytes) 2^32-1 2^32-1
Maximálna kapacita logického média (cluster) 2^14-256 2^30-256
Maximálny počet adresárov na médiu 2^32 2^32
Maximálny počet súborov v adresári 2^32 2^32

Všetky tieto ohraničenia, snáď až na dĺžku súboru, sú zatiaľ viacmenej teoretické, pretože v praxi je hlavným (a jediným) ohraničením fyzická kapacita média. Ale vzhľadom na dnešný rýchly vývoj kapacít harddiskov je dosť dobre možné, že bude k dispozícii za rozumnú cenu harddisk takej kapacity, ktorá spôsobí prechod nejakého vyššie uvedeného ohraničenia z roviny teoretickej do roviny praktickej...

Fyzické a logické sektory

Určite ste si v predchádzajúcej časti všimli pojmy "logický sektor", "fyzický sektor", "cluster". Čo tieto pojmy vlastne znamenajú ?
Fyzický sektor je najmenší balík dát, ktorý môžeme poslať do alebo načítať z harddisku. Obvykle má veľkosť 512 bajtov.
Logický sektor, zvaný tiež cluster, je určité množstvo informácii, s ktorým naraz pracuje operačný systém pri práci s pamäťovým médiom. Jeho veľkosť obvykle býva zhodná s fyzickým sektorom, ale v prípade, že fyzický sektor je príliš malý, logický sektor býva zložený z určitého malého množstva fyzických sektorov.
V tomto popise SFS sa logický sektor označuje priamo pojmom "sektor". V prípade, že sa v popise jedná o fyzický sektor média (v popise fyzických informácii o disku), vtedy je výslovne uvedené že ide o fyzický sektor.

Tak, a dosť bolo úvodných kecov a teraz sa už poďme naostro venovať popisu samotného SFS.

Boot sektor

Boot sektor je ako jediný uložený na pevnej pozícii - v prípade ak logické médium je priamo nejaký fyzický disk (disketa), je uložený hneď na úplne prvom sektore daného média - prvý fyzický sektor na nultej stope a nultej strane. Ak je logické médium jedna z partícií harddisku, potom boot sektor je prvý sektor tejto partície. Vo všeobecnosti je to vždy sektor, ktorý má logické číslo 0.

Boot sektor je veľmi dôležitý, pretože keď operačný systém ide pracovať s médiom, ktoré ešte nemá "nakešované", je boot sektor hneď to prvé, čo operačný systém načíta do pamäti. Slúži teda na počiatočnú identifikáciu média.

Boot sektor má ešte väčší význam pri tzv. bootovatelných médiách. To sú také média, na ktorých je uložený operačný systém, ktorý sa po zapnutí počítača loadne do pamäti, kde sa rezidentne usídli a zabezpečuje všetky operácie s médiom (a mnohé ďalšie veci). V tom prípade sa v boot sektore nachádza tzv. systémový zavádzač, to je taký malý programček ktorý loadne do pamäti operačný systém.

Nezávisle od toho, či je médium bootovatelné alebo nie, prvých 64 bajtov boot sektora obsahuje veľmi dôležité informácie o médiu ako takom:

Identifikácia média
#00-#01   skok na systémový zavádzač (#18,#3E alebo #18,#7E)
#02-#07   "SFS-01" identifikácia formátu
#08-#0F   identifikácia média (8 RND bajtov, ich xor je #55)

Fyzické informácie o médiu
#10-#11   počet stôp alebo cylindrov
#12         počet fyzických sektorov na stopu
#13         počet hláv alebo povrchov
#14         (*) veľkosť fyzického sektora v bajtoch

Logické špecifikácie
#15         (*) veľkosť logického sektora (cluste-ra) vo fyzických sektoroch
#16         (*) hraničný sektor medzi zónou adre-sárov a zónou dát
#17         maximálna dĺžka pre ukladanie súborov priamo do adresára (x30)
#18-#1B  logické číslo prvého sektora prvej fatky
#1C-#1F  logické číslo prvého sektora druhej fatky

Niečo ako adresárová položka média
#20         atribúty média systémové (napevno nastavené formátovačom)
#21         atribúty média užívateľské (voľne meniteľné užívateľom)
#22-#2B  meno logického média (label)
#2C-#2F  celkový počet sektorov na médiu
#30-#33   dĺžka fatky v sektoroch
#34-#37   dátum a čas formátovania
#38-#3B  dĺžka hlavného adresára v bajtoch
#3C-#3F  logické číslo prvého sektora hlavného adresára

Prídavné identifikácie média
(nepovinné, SFS ich len doporučuje)
#40-#5F   identifikácia formátovacej utilitky (napr. F02-V30)
#60-#7F   identifikácia systému ktorý s médiom pracuje (napr. Norix 1.0)

Systémový zavádzač
#80-END  systémový zavádzač, ak médium je bootovatelné

Identifikácia média je osem náhodných bajtov vytvorených pri formátovaní tak, aby po výpočte 1. bajt XOR 2. bajt XOR ... XOR 8. bajt vyšiel výsledok #55. Tieto bajty by mali byť pre každé médium rôzne. Preto kopírovací program, ktorý by vytváral presnú kópiu média sektor po sektore, by ich mal náhodne zmeniť. Pri práci s médiom podľa nich systém pozná, či má dané médium už "nakešované", alebo nie.

Fatka je kvôli bezpečnosti bežných magnetických médií zdvojená. V prípade, že fatku netreba zdvojovať (napr. ramdisk), začiatok druhej fatky a príslušný bit v systémových atribútoch média je nulový.

Údaje v bajtoch #14-#16 (označené hviezdič-kou) sú vyjadrené pomocou N-tej mocniny dvojky, t. j. ak číslo uložené v ľubovoľnom z týchto bajtov je N potom skutočná hodnota, ktorú bajt reprezentuje bude 2^N. Napríklad ak v bajte #15 (veľkosť logického sektora) bude číslo 4 tak potom skutočná veľkosť logického sektora bude 2^4=16 fyzických sektorov.

Pridavné identifikácie média (formátovač a systém) majú z hľadiska definície SFS len čisto informatívny charakter a sú nepovinné. Sú určené len pre užívateľa, ktorý si nechá zobraziť boot sektor v ASCII forme.

Systémové atribúty média
bit 7        použitý systém FAT: 0=FAT16, 1=FAT32
bit 6        zdvojená FAT: 0=nie, 1=áno
bit 5-0     rezervované

Užívateľské atribúty média
bit 7        podpora bitu OPEN v užívateľských atribútoch: 0=nie, 1=áno
bit 6        spôsob alokácie všetkých sektorov: 0=v poradí, 1=čo najnižší
bit 5        spôsob alokácie adresár. sektorov: 0=hneď za, 1=jeden vynechať
bit 4        spôsob ukladania adresárových a dátových sektorov: 0=pomiešané, 1=oddelené
bit 3        ukladanie krátkych súborov priamo do adresára: 0=nie, 1=áno
bit 2-0     rezervované

Spôsob alokácie všetkých sektorov určuje stratégiu alokácie nového sektora pre súbory aj adresáre. Jednotková hodnota bitu znamená, že nový alokovaný sektor by mal mať čo najnižšie logické číslo (mal by byť čo najbližšie k začiatku média). Tento spôsob alokovania zvyšuje spoľahlivosť záznamu na magnetických diskových médiách, ktoré sú známe tým, že záznam do sektorov na okraji disku je vo všeobecnosti spoľahlivejší. Nulová hodnota bitu znamená že alokovať by sa mal ten sektor, ktorý predtým ešte nebol alokovaný, alebo ak také nie sú, tak bol predtým alokovaný čo najdávnejšie a teda najdlhšie zo všetkých bol zmazaný. V praxi to znamená že sektory sa alokujú postupne od začiatku média až do konca bez ohľadu či medzitým niekde vznikli nejaké zmazané sektory. Táto stratégia je vhodná pre médiá ktoré majú rovnakú dobu prístupu ku všetkým sektorom (napríklad ramdisk). Táto stratégia tiež výrazne zvyšuje pravdepodobnosť spoľahlivého obno-venia zmazaného súboru.

Spôsob alokácie adresárových sektorov určuje kde na médiu sa má naalokovať ďalší sektor adresára. Ak je tento bit nulový, potom ďalší sektor by sa mal nachádzať hneď za posledným už existujúcim sektorom, takže sektory adresára by mali ísť bezprostredne za sebou (ak zanedbáme fragmentáciu). Ak je tento bit jednotkový, potom nový sektor sa vytvorí tak, aby medzi ním a posledným už existujúcim bol aspoň jeden voľný sektor. Tento druhý spôsob je vhodný pre urýchlenie prehľadávania adresára na disketách, pretože po loadnutí sektoru adresára do pamäti procesor potrebuje chvíľku času na prehľadanie tohto sektora a v prípade že by ďalší sektor šiel hneď za práve prehľadávaným tak by ho už procesor nestihol naloadovať v jednej otáčke diskety a musel by čakať na ďalšiu otáčku. Druhý spôsob je vhodnejší pre harddisky, ktoré už sami na sebe majú cache pamäť pre niekoľko sektorov, pretože tieto harddisky pri požiadavke o sektor X si do cache loadnú aj niekoľko ďalších sektorov, ktoré má procesor hneď k dispozícii. Na médiách s rovnakou dobou prístupu ku všetkým sektorom nastavenie tohto bitu nemá na rýchlosť žiadny vplyv, ale vtedy SFS odporúča tento bit nechať nulový aby sa minimalizovala fragmentácia adresárov.

Spôsob ukladania adresárových a dátových sektorov určuje či majú byť adresárové sektory s datovými ukladané spolu pomiešané (hodnota bitu=0) alebo oddelene (hodnota bitu=1). V bajte #17 je definovaný hraničný sektor medzi zónou adresárov a zónou dát. Zóna adresárov je časť média prednostne určená na ukladanie adresárových sektorov. Je umiestnená od začiatku média až po číslo sektora definované v bajte #17. Od tohto čísla sektora (včítane) začína zóna dát, ktorá potom pokračuje až do konca média. Ak je bit 1 v atribútoch média nastavený na jednotku, operačný systém by mal novovznikajúce adresáre umiestňovať do zóny adresárov a podobne dátové sektory súborov do zóny dát. Až v prípade, ak sa daná zóna zaplní, sa sektor určený na uloženie do tejto zóny môže uložiť do druhej zóny. Tento spôsob je veľmi vhodný pre pracovné médiá, na ktorých sa často erasuje, sejvuje a vypisujú sa katalógy. Okrem výpisu katalógu to hlavne optimalizuje aj hľadanie nejakého súboru v adresároch a vôbec prácu s adresármi, pretože adresárové sektory sú sústredene na začiatku média a nie je potrebné kvôli nim príliš veľa seekovať. Na médiách s rovnakou dobou prístupu ku všetkým sektorom tento bit neprináša žiadne zrýchlenie práce. V prípade, že bit 1 v atribútoch média je nulový, operačný systém ukladá všetky nové sektory na médium rad za radom bez ohľadu na to či je to adresár alebo dátový sektor. Tento druhý spôsob je výhodný vtedy, ak potrebujeme mať na disku menšie množstvo menších súborov. V kombinácii so spôsobom alokácie sektorov čo najbližšie k začiatku média (pozri ďalej) tento spôsob optimalizuje seekovanie diskového média pri nahrávaní súborov na najnižšiu možnú mieru.

Ukladanie krátkych súborov priamo do adresára slúži na minimalizáciu nevyužiteľného miesta na médiu, ak veľkosť súboru je oveľa nižšia ako veľkosť alokačnej jednotky - logického sektora. V prípade, že je tento bit nastavený na jednotku, a ak dĺžka práve ukladaného súboru nepresiahne číslo 30 krát hodnota z bajtu #17, tak data súboru sa neuložia do samostatného dátového sektora, ale za adresárovou položkou súboru sa do adresára ešte pridajú položky typu rozšírenie, do ktorých sa uložia data súboru. Potrebný počet týchto rozširujúcich položiek je daný dĺžkou súboru, maximálny počet je daný bajtom #17. Možnosť uchovávať krátke súbory je veľmi vhodná pre rozsiahle archivačné médiá, ktoré majú veľmi veľké sektory a kde by nejaký povedzme stobajtový zavádzací basic zbytočne zaberal celý jeden sektor média. Avšak v prípade, že sa požaduje veľká rýchlosť práce s adresárom, nie príliš komplikovaný sekvenčný zápis do súboru a kde nie je až tak kritické efektívne využitie voľného miesta na médiu, je efektívnejšie ukladať aj krátke súbory do samostatných dátových sektorov.

FAT - file alocation table

Fatka (alebo ľudovo povedané "tučná tabuľka") je pravdepodobne najdôležitejšia tabuľka na celom médiu. Definuje sa v nej, ktoré sektory sú volné a ktoré sú použité a pre ktorý súbor, v akom poradí idú sektory súboru za sebou, definujú sa tam rezervované sektory pre špeciálne účely, a tiež sú v nej zakódované aj všetky dĺžky súborov. Najdôležitejšia informácia je práve informácia o tom, ako za sebou idú sektory jednotlivých súborov.

Na médiu môže byť jedna alebo dve fatky. V prípade, že na médiu je len jedna fatka, logické číslo prvého sektora druhej fatky je nulové a ták isto je nulový aj bit 6 v identifikačnom bajte média (offset #20). Každá fatka je umiestnená na médiu kvôli efektívnemu random prístupu v sektoroch ktoré idú bezprostredne za sebou od prvého sektora, ktorého číslo je definované v boot sektore. Tento prístup umožnuje mať fatku umiestnenú kdekoľvek na médiu (hoci aj kvôli efektívnemu seekovaniu v strede média) avšak fatka musí ostať celá pokope, nemôže byť rôzne rozptýlena po médiu.

Fatka sa skladá z položiek, každá položka zodpovedá jednému sektoru média. Položky zaberajú podľa potreby 16 alebo 32 bitov. Podľa toho potom rozlišujeme či sa jedná o systém FAT16 alebo FAT32. Bajty sú v položke usporia-dané vždy od najnižšieho po najvyšší. FAT32 sa používa, ak počet sektorov na médiu je večší než umožňuje uadresovať FAT16, čo je 2^14-256 alebo 16128 sektorov, a/alebo ak veľkosť sektora (clustera) je väčšia ako 2^14 alebo 16384 bajtov.

Význam hodnôt v položkách FAT tabulka

FAT16

FAT32

hi.lo-hi.lo

hi.......lo-hi.......lo

Voľný sektor, nepoužitý

00.00

00.00.00.00

Voľný sektor, zmazaný

00.01-7F.FF

00.00.00.01-7F.FF.F7.FF

Posledný sektor súboru

80.00-BF.FF

80.00.00.00-80.00.3F.FF

80.00.40.00-BF.FF.FF.FF

Priebežný sektor súboru alebo smerník na další sektor

C0.00-FE.FF

C0.00.00.00-C0.00.3E.FF

C0.00.3F.00-FF.FF.FE.FF

Špeciálny  sektor (systém)

FF.00-FF.EF

FF.FF.FF.F0-FF.FF.FF.EF

Chybný sektor

FF.F0-FF.FE

FF.FF.FF.F0-FF.FF.FF.FE

Fyzický koniec média

FF.FF

FF.FF.FF.FF

Posledný sektor súboru obsahuje po vynulovaní najvyššieho bitu položky presný počet bajtov ktoré ešte súbor zaberá v tomto sektore. Ak je tento počet nulový, potom skutočný počet týchto bajtov je rovný veľkosti sektora, t. j. sektor je využitý celý => dĺžka súboru je delitelná veľkosťou sektora v bajtoch.

Zmazanie súboru len vynuluje najvyšší bit FAT položky. Všetky položky od 00.00.00.00 do 7F.FF.FF.FF sa chápu ako volné sektory ktoré sa pri sejve môžu použiť. Špeciálny sektor je napr. boot, prípadne na bootovatelnom médiu operačný systém, ktorý sa nenachádza v klasickom súbore. Neexistujúci sektor je keď napr. médium má len 250 sektorov, fatka je dlhá 250*4=1000 bajtov ale keďže fatka zaberá celočíselný počet sektorov tak zvyšných 24 bajtov fatky obsahuje hodnotu FF.FF.FF.FF.

Volné sektory pripravené na alokovanie sa od už obsadených alokovaných sektorov jednoznačne líšia najvyšším bitom položky. Volné sektory ho majú nulový, obsadené položky jednotkový. Preto sa pri alokácii ďalších sektorov na médiu môžu vyberať len sektory ktoré majú tento bit nulový.

Príklad: súbor zaberajúci tri sektory:

Doporučenie pre OS

Aby operačný systém nemusel riešiť dva prípady FAT systému (FAT16 a FAT32), tak v prípade dostatočnosti 16 bitovej fatky (médium pod 16128 sektorov) sa FAT16 môže pri spracovaní v OS logicky konvertovať na FAT32 nasledujúcim spôsobom: Medzi bit 13 a 14 16-bitovej hodnoty FAT16 sa vloží nových 16 bitov s hodnotu podľa vyššieho bajtu pôvodnej hodnoty: ak je vyšší bajt rovný 255, potom bity budú jednotkové, ak iný, tak nové bity budú nulové. Tým vznikne nová zodpovedajúca hodnota FAT32. Spätná konverzia je tiež veľmi jednoduchá, predtým pridané bity stačí z hodnoty vynechať.

Štruktúra adresárov a súborov

Hlavným cieľom pamäťového média je uchovávanie a archivovanie súborov. Aby však nemuseli byť všetky súbory na médiu neprehľadne pomiešané na jednom mieste, SFS definuje adresáre, ktoré umožnia mať súbory na médiu rôznym spôsobom roztriedené a tým sa zvyšuje prehľadnosť uloženia súborov a vo väčšine prípadov tiež aj rýchlosť prístupu k súborom.

Všetky adresáre sú na médiu organizované do stromovej štruktúry. Základom tejto štruktúry je hlavný adresár (root). Tento adresár sa volá presne ako logické médium (label) definované v boot sektore, a cez toto meno by malo byť možné do neho pristupovať.

Adresár je postupnosť sektorov presné taká istá ako obyčajný súbor, ale od obyčajného súboru sa líši tým, že jeho dátový obsah je interpretovaný operačným systémom ako postupnosť adresárových položiek. Adresár vždy musí ležať v samostatných sektoroch, nesmie byt umiestnený v rozširujúcich adresárových položkách aj keby jeho celková dĺžka bola menšia ako hranica definovaná v bajte #17 boot sektoru a bit v systémových atribútoch média povoľujúci ukladanie súborov kratších ako táto hranica by bol nastavený. Podobne tak adresáre na rozdiel od súborov nemôžu byť komprimo-vané a zakódované.

Adresárové položky sú vždy 32 bajtové štruktúry, z ktorých sa skladajú jednotlivé adresáre. Každá adresárová položka musí byť jeden z týchto typov:

• súbor obsahuje informácie o jednom súbore
• adresár obsahuje informácie o jednom adresári
• linka odkaz na iný súbor/adresár/linku/komentár
• komentár textový komentár uložený priamo v adresári
• rozšírenie rozšírenie predchádzajúcej položky v adresári

Jednotlivé typy položiek sa od seba odlišujú bitmi 4,5,6 v identifikácii položky (pozri ďalej).

Adresárová položka - súbor

Súbory sú vlastne to najdôležitejšie a najhlavnejšie, čo treba mať uložené na médiu. Adresárová položka súboru obsahuje všetky dôležité informácie o súbore. Sú to jednak klasické informácie nachádzajúce sa v hlavičke súboru používanej pri práci s magnetofónom, a tiež aj ostatné informácie vyplývajúce zo štruktúry ukladania dát v SFS a možností, ktoré navyše od magnetofónu poskytuje.

#00           identifikácia položky (11xxssss, systémové atribúty)
#01          informačný bajt
#02-#0B   10 znakov meno súboru
#0C-#0D   dĺžka súboru podľa hlavičky
#0E-#0F   štart riadok, premenná, začiatočná adresa
#10-#11    dĺžka čistého basicu bez premenných
#12          atribúty súboru (užívateľské atribúty)
#13          flagbajt tela
#14-#17    dátum a čas poslednej modifikácie súboru
#18-#1B    dĺžka tela (skutočná dĺžka súboru v bajtoch)
#1C-#1F   umiestnenie súboru na médiu

Štruktúra položky je navrhnutá tak, aby kvôli kompatibilite s magnetofónom mohla uchovávať aj súbory bez hlavičky. Formát uloženia dátumu a času je zhodný s formátom používaním
v MS-DOSe, detailne bude vysvetlený neskôr.

Umiestnenie súboru na médiu špecifikuje kde sú uložené dáta súboru. Ak súbor nemá telo alebo telo má nulovú dĺžku, potom sú bajty #1C-#1F nulové. Ak je súbor umiestnený vo svojich vlastných dátových sektoroch, potom v týchto bajtoch je logické číslo prvého sektora súboru. Ďalšie sektory súboru sú definované vo fatke
(v predchádzajúcej kapitole). Ak je však súbor umiestnený v nasledujúcich adresárových polož-kách, potom tieto bajty majú takúto štruktúru:

#1C-#1D    počet obsadených bajtov - koľko baj-tov zaberá súbor v položkách
#1E           počet rozširujúcich položiek použitých na uloženie súboru
#1F           rezervované pre budúce rozšírenie

Ak súbor nie je komprimovaný, potom počet obsadených bajtov je zhodný s dĺžkou tela súboru. Ak je skomprimovaný, jedná sa o počet po komprimácii. Dĺžka je len 16-bitová, pretože súbory dlhšie ako 65536 bajtov sa vždy musia ukladať do vlastných dátových sektorov. Počet rozširujúcich položiek určuje koľko nasledujúcich položiek v adresári sa použilo pre uloženie dát súboru. V každej rozširujúcej položke sa môže nachádzať až 30 bajtov dát súboru. Presná štruktúra rozširujúcej položky je popísaná ďalej.

Informačný bajt #01 okrem štandartne používaných hodnôt
0                program v basicu (program)
1                číselné pole (number array)
2                znakové pole (character array)
3                bližšie neurčený blok bajtov (bytes)

može ešte nadobúdať tieto odporúčané
(z hľadiska SFS nepovinné) hodnoty:

4                bezhlavičkový súbor (doporučuje sa kvôli prehľadnosti výpisu)
5               48K snapshot
6               128K snapshot
7                sekvenčný súbor (doporučuje sa kvôli prehľadnosti výpisu)

Ináč hodnoty vyššie ako 3 sú rezervované pre budúce použitie.

Bajt #00 identifikácia položky (systémové atribúty) má takúto štruktúru:
bit 7          platnosť položky:
                1=platná, 0=neplatná
                (napr. zmazaný súbor)
bit 6          1=značka, že adresárová položka definuje súbor
bit 5          umiestnenie súboru v:
                0=dátových sektoroch,
                1=rozš. položkách
bit 4          hlavička súboru:
                0=nie, 1=áno
                (t. j. 0=bezhlavičkový súbor)
bit 3          kompresia tela súboru: 0=nie, 1=áno
bit 2          kódovanie súboru heslom:
                0=nie, 1=áno
bit 1          rezervovaný, mal by byť nulový
bit 0          linearita (sektory súboru idú za sebou): 0=nie/neviem, 1=áno

Linearita je príznak, či dátové sektory súboru a teda aj ich logické čísla idú bezprostredne za sebou. Ak je tento bit jednotkový, potom súbor nie je fragmentovaný. Kompresia a kódovanie tela súboru sú podrobne vysvetlené neskôr v samostantných kapitolách.

Bajt #12, užívatelské atribúty súboru vyzerajú takto:
bit 7          O=Open:
                 0=všetko v poriadku,
                 1=súbor nie je uzavretý
bit 6          S=System:
                 0=normálny súbor, 1=systémový
bit 5          A=Archive:
                 0=nový súbor, 1=zaarchivovaný
bit 4          H=Hidden:
                 0=viditeľný, 1=neviditeľný
                 (CAT nevypisuje)
bit 3          D=Deletable:
                 0=nezmazateľný, 1=zmazateľný
                 (DELETE, ERASE)
bit 2          R=Readable:
                 0=nečitateľný, 1=čitatelný súbor
                 (pre LOAD)
bit 1          W=Writeable:
                 0=nemodifikovateľný,
                 1=modifikovateľný súbor
bit 0          X=eXecutable:
                 0=nespustiteľný, 1=spustiteľný
                 (NEW,LOAD...)

Nastavený bit OPEN indikuje, že súbor je otvorený pre zápis. To znamená, že v pamäti sa môžu nachádzať dáta, ktoré ešte nie sú sejvnuté na médium. Tento bit sa používa na diagnostické účely - kontrolu že súbor bol korektne uzavretý a teda dáta uložené v ňom sú platné. Vzhľadom na to, že používanie tohto bitu vyžaduje minimálne dva zápisy do položky (jeden pri otvorení súboru a jeden pri jeho uzavretí), je možné si zvoliť, či sa tento bit bude takto využívať. Určené je to bitom 3 v bajte #20 - atribútoch média v boot sektore. Tým sa užívateľ môže rozhodnúť, či chce mať istotu že zápis súboru prebehol v poriadku, alebo radšej dá prednosť pomalšiemu opotrebovávaniu média menším počtom zápisov.

Bit SYSTEM sa odporúča nastaviť pri systémo-vých súboroch na bootovatelnom médiu. Bit ARCHIVE sa odporúča nastaviť, ak k danému súboru niekde existuje záložná kópia (poznámka: v MS-DOSe je to naopak). Tieto dva bity sú len pomocné a z hľadiska SFS nemajú žiadny ďalší význam.

Bit eXecutable indikuje, že súbor je nejaký program, ktorý je možné spustiť. Môže to byť basic, nejaký stroják pre Z80 uložený ako bytes, alebo snapshot.

Ostatné bity majú svoj zvyčajný význam. Vždy hodnota 0 danú činnosť zakazuje a hodnota 1 ju povoľuje. Môže sa zdať, že bit Readable je možno zbytočný (komu by načo už len bol súbor ktorý sa nedá čítať), avšak tento bit je tu kvôli logickej úplnosti definície atribútov súboru.

Adresárová položka - adresár

Každá adresárová položka definujúca adresár obsahuje všetky dôležité informácie práve o tomto adresári na médiu. Poradové číslo položky v nadadresári, v ktorom je uložená, zároveň určuje číslo adresára, cez ktoré je možné do tohto adresára pristupovať.

#00           identifikácia položky (1011xxxx, vzor pre syst. atribúty)
#01          rezervované pre budúce použitie
#02-#0B   10 znakov meno adresára
#0C-#0F   dátum a čas vytvorenia adresára
#10-#11    rezervované pre budúce použitie
#12          atribúty adresára (užívateľské atribúty)
#13          vzor pre užívateľské atribúty vytvára-ných súborov
#14-#17    dátum a čas poslednej modifikácie
#18-#1B   dĺžka adresára v bajtoch
#1C-#1F   logické číslo prvého sektora

Položka obsahuje dve časové špecifikácie. Prvá určuje kedy bol adresár vytvorený a druhá nesie informáciu o poslednej modifikácii adresára. Modifikácia adresára je akákoľvek zmena v položkách, ktoré sa nachádzajú v adresári.

Vzor pre užívateľské atribúty vytváraných súborov je bajt, ktorý sa vloží do užívateľských atribútov súboru, ktorý bol vytvorený v tomto adresári. Ako defaultnú hodnotu, ktorá sa sem vloží pri vytvorení adresára, sa odporúča používať hodnotu #0F.

Bajt #00 identifikácia položky obsahuje okrem iného aj vzor ako majú vyzerať systémové atribúty pre súbory vytvárané v tomto adresári:

bit 7            platnosť položky:
                 1=platná, 0=neplatná
                 (napr. zmazaný adresár)
bit 6           0
bit 5           1
bit 4           1
bit 3           vzor pre súbory: komprimácia tela
                 súboru: 0=nie, 1=áno
bit 2           vzor pre súbory: kódovanie súboru
                 heslom: 0=nie, 1=áno
bit 1           vzor pre súbory: rezervovaný,
                 mal by byť nulový
bit 0           vzor pre súbory: lineárne ukladanie
                 súboru: 0=nie, 1=áno

Ak je bit 3=1 tak potom súbory sejvované do adresára by sa mali komprimovať a ak je bit 2=1 tak by sa mali ukladať na médium zakódované heslom. Ak je bit 0=0 tak sektory pre ukladaný súbor sa alokujú normálne podľa stratégie danej bitom 0 v atribútoch média, ale ak je bit 0=1 tak sa síce tiež používa daná stratégia, ale súbor by sa mal uložiť nefragmentovaný, t. j. podľa tejto stratégie sa hľadá prvá volná, dostatočne veľká medzera volných sektorov pre uloženie súboru. Ak sa na médiu takáto medzera už nenájde, v tom prípade sa súbor uloží fragmentovane a jeho bit linearity tým pádom ostane nulový.

Bajt #12 užívatelské atribúty adresára:
bit 7          O=Open:
                 0=všetko v poriadku,
                 1=adresár nie je uzavretý
bit 6          S=System:
                 1=adresár obsahuje systémové súbory
bit 5          A=Archive:
                 1=všetky súbory v adresári sú zaarchivované
bit 4          H=Hidden:
                 0=viditeľný, 1=neviditeľný
                 (nevypisuje sa)
bit 3          D=Deletable:
                 0=nezmazateľný, 1=zmazateľný
                 (DELETE, ERASE)
bit 2          R=Readable:
                 0=nečitateľný, 1=čitateľný súbor
                 (pre CAT)
bit 1          W=Writeable:
                 0=nemodifikovateľný,
                 1=modifikovateľný adresár
bit 0          X=eXecutable:
                 0=nevykonateľný,
                 1=vykonateľný (prístup k súborom)

Bit OPEN funguje podobné ako pri súboroch. Hodnota 1 znamená že sa operácia zápisu do adresára ešte neskončila a teda dáta môžu byť nekonzistentné. Bit 3 v atribútoch média (boot bajt #20) určuje či sa tento bit má alebo nemá používať.

Bit SYSTEM sa odporúča nastaviť ak adresár obsahuje systémové súbory potrebné pri bootovaní médiu. Bit ARCHIVE sa odporúča nastaviť, ak všetky súbory v adresári majú niekde vytvorenú záložnú kópiu. Podobné ako pri súbore, aj pri adresári sú tieto dva bity len pomocné a z hľadiska SFS nemajú žiadny ďalší iný význam.

Bit Hidden zakazuje zobrazenie adresára pri výpise nadadresára. Na výpis súborov v adresári nemá žiadny vplyv.

Nulový bit Deleteable chráni adresár proti zmazaniu ako celku, avšak už nie proti zmazaniu jednotlivých súborov v ňom. Proti zmazaniu súborov v adresári chráni bit Writeable - ak je nulový, nie je možné adresár akokoľvek modifikovať. Pod modifikáciou adresára sa myslia akékoľvek úpravy adresárových položiek v adresári (zmena mena, atribútov, ... jednotlivých súborov).

Bit Readable povoľuje výpis adresára (CAT). Ak je nulový, je to zhruba asi tak ako keby všetky súbory v adresári mali nastavený Hidden bit.

Bit eXecutable povoľuje daný adresár použiť v ceste k súborom uloženým v tomto adresári. Ľudsky povedané, ak tento bit je nulový, sú súbory v adresári pre datové operácie (read, write, new) neprístupné.

Adresárová položka - komentár

Textový komentár nie je operačným systémom nijak interpretovaný, systém ho iba vypisuje pri výpise adresára. Doporučené použitie je pre rôzne užívateľské poznámky o programoch
v danom adresári.

#00           identifikácia položky (1001xxxx, xxxx=rezervované)
#01          počet nasledujúcich rozširujúcich položiek
#02-#1F   30 znakový textový reťazec ako komentár

Do jednej komentárovej položky sa vojde 30 znakový text. Ak je potrebné umiestniť do adresára komentár dlhší ako 30 znakov, možno prvých 30 znakov komentáru umiestniť do tejto položky a zvyšné znaky do potrebného množstva rozširujúcich položiek, ktoré nasledujú bezprostredne za touto položkou. Ak sa komentár vojde do 30 bajtov, bajt #01 je nulový.

Adresárová položka - linka

Linka je odkaz na inú adresárovú položku nachádzajúcu sa v tom istom, alebo prípadne aj inom adresári na médiu. Odkaz na iné médium neumožňuje. Doporučené použitie linky je v prípade, ak je treba určitý súbor mať nahraný vo viacerých adresároch naraz. V tom prípade sa súbor nahrá len do jedného adresára a v ostatných adresároch bude len linka na tento súbor. Alebo v prípade, ak daný súbor má byť viditeľný pod viacerými číslami (menami) v tom istom adresári.

#00            identifikácia položky (1010tttt, tttt=typ linky)
#01           počet nasledujúcich rozširujúcich polo-žiek (ak nejaké treba)
#02-#0B    10 znakov meno súboru (meno linky)
#0C-#1F    20 bajtov špecifikácia cieľa

Bity tttt v identifikácii položky bližšie určujú akým spôsobom linka ukazuje na svoj cieľ. Ak je
bit 3=0 potom linka je prvého (jednoduchšieho) typu a vtedy bajty #0C-#1F majú takýto význam:

#0C-#15 10 znakov špecifikácia adresára kde sa nachádza súbor
#16-#1F 10 znakov špecifikácia súboru na ktorý ukazuje linka

Ostatné bity tttt majú takýto význam:

bit 2           vyhodnotenie adresára:
                 0=absolútne, 1=relatívne
bit 1          špecifikácia adresára:
                 0=číslom, 1=menom
bit 0          špecifikácia súboru:
                 0=číslom, 1=menom

Absolútne vyhodnotenie adresára znamená, že daný adresár je alebo sa hľadá medzi podadresármi hlavného adresára. Tento typ linky je možné použiť pre ukazovanie na súbor alebo adresár ktorý sa nachádza v druhej úrovni stromu alebo jeho cesta sa dá vyjadriť v tvare: Disk:\adresár\súbor.

Relatívne vyhodnotenie adresára znamená, že sa východisko cesty neberie od hlavného adresára média ale od nadadresára k aktuálnemu adresáru. Tento typ linky sa dá použiť najlepšie pre ukazovanie na súbor/adresár ktorý sa nachádza na tej istej úrovni stromu ako poloha linky, alebo inými slovami jeho cesta sa dá vyjadriť v tvare: ..\adresár\súbor.

10 znakov špecifikácia može byť 10-znakové meno súboru/adresára alebo 4-bajtové číslo súboru/adresára. V prípade čísla je ďalších 6 bajtov nevyužitých (môže slúžiť na nejakú poznámku). To, či je použité meno alebo číslo, určujú bity 0 a 1 v identifikácii položky.

Druhý (všeobecnejší) typ linky umožňuje definovať cieľ cestou ľubovoľnej dĺžky. Vtedy je tttt bit 3=1. Bajty #0C-#0D v položke vždy určujú dĺžku cesty. Cesta sa skladá z definície jednotlivých adresárov na konci ktorej je adresár alebo súbor podľa toho, na čo ukazuje linka. Počet týchto definícii je zároveň dĺžka cesty. Ak tttt bit 2=0 tak tieto definície sú uložené v osemnástich bajtoch #0E-#1F. Ak by sa cesta nevošla do týchto osemnásť bajtov, je vtedy možné za položku ešte pridať príslušný počet rozširujúcich položiek (do každej sa vojde 30 bajtov tejto cesty). Potom v bajte #01 je zapísaný počet koľko za ňou nasleduje rozširujúcich položiek. Ak stačí 18 bajtov, bajt #01 je nulový (tak isto ako v komentárovej položke).

Ak tttt bit 2=1 potom je táto cesta umiestnená do zvláštneho dátového sektora a štruktúra 20 bajtov špecifikácie cieľa majú nasledovný význam:

#0C-#0D   dĺžka cesty alebo tiež počet definícií
#0E-#13    rezervované (mali by ostať nulové)
#14-#17    dátum a čas poslednej modifikácie linky
#18-#1B    dĺžka dát v bajtoch uložených v dáto-vom sektore
#1C-#1F    logické číslo prvého dátového sektora linky

Definícia každého adresára alebo cieľového súboru môže byť vyjadrená číslom alebo menom. Číslo môže byť jedno až štvorbajtové.

Štruktúra definície jedného adresára určuje jej prvý bajt.

Špecifikácia menom:
#01..#0A=nasleduje meno, bajt znamená počet znakov mena

Špecifikácia číslom:
#11..#14=nasleduje X-bajtová hodnota

Ostatné hodnoty bajtov sú vyhradené a nemali by byť použité.

Adresárová položka - rozšírenie

Rozšírenie je špeciálny druh položky, v ktorej sa uchovávajú údaje, ktoré sa už nevošli do predchádzajúcej položky. Rozširujúcich položiek môže byť za sebou aj viac (vzniká blok rozširujúcich položiek), avšak nemôžu existovať samostatne, ale len v súčinnosti s nejakými položkami iného typu.

#00          identifikácia položky
              (1000srrr, srrr=rezervované)
#01         poradie položky v rámci bloku rozširujúcich poloziek
#02-#1F  30 bajtov dát podľa účelu položky

Bity "srrr" sú rezervované pre budúce použitie, "s" by mal byť nastavený na jednotku a "rrr" by mali ostať nulové.

Do jednej rozširujúcej položky sa vojde 30 bajtov dát. Bajt #01 vždy obsahuje poradie konkrétnej položky v rámci bloku k sebe patriacich rozširujúcich položiek. Napríklad ak nejaká položka potrebuje uložiť v rozširujúcich polož-kách 80 bajtov dát, čo znamená že je treba použiť tri rozširujúce položky, potom hodnoty bajtu #01 v týchto položkách budú: #01, #02, #03. Podľa týchto čísel operačný systém vie ktoré položky musia ísť bezprostredne za sebou, čo by mal zohľadniť pri rôznych operáciách s adresárom (napr. utrasenie, zoradenie podľa nejakého kritéria) aby nevhodným premiest-nením položiek neporušil konzistenciu dát. Pomocou tohto poradového čísla sa ošetruje situácia, keď užívateľ si dá urobiť výpis katalógu od X-tej položky, pričom operačný systém zistí, že X-tá položka je toto rozšírenie s poradovým číslom Y, tak vie, že položka využívajúca blok rozširujúcich položiek má číslo X-Y.

Formát dátumu a času

Formát času a dátumu je prevzatý z MS-DOSu. Vlastnosti formátu:

• jednoduché kódovanie a dekódovanie
• kompletná špecifikácia času zaberá len 4 bajty
• priamym porovnávaním 4-bajtovej hodnoty sa
  dá určiť čo je mladšie/staršie
• kódovanie časovej špecifikácie od 1. 1. 1980 do
  31. 12. 2107
• a pre úplnosť aj jedna nevýhoda: umožňuje
  zakódovať len párny počet sekúnd

Skutočný počet sekúnd dostaneme ak číslo z bitov 0-4 bajtu #14 vynásobíme dvomi. Preto sa tu dá zakódovať len párny počet sekúnd. Skutočný počet rokov dostaneme ak k číslu z bitov 1 až 7 z bajtu #17 pripočítame hodnotu 1980. Všetky ostatné údaje sú interpretovateľné priamo.

Ak sa vo všetkých štyroch bajtoch nachádzajú nuly, potom dátum a čas nie sú definované (napr. daný OS nepodporuje časové špecifi-kácie). Ak bajty #16 a #17 obsahujú hodnotu #FF tak to znamená že dátum súboru prekročil hodnotu 31. 12. 2107.

Komprimácia súborov

Niekedy je užitočné, aby súbor bol uložený na médiu v skomprimovanom stave, pretože tak zvyčajne zaberá menej miesta. Preto SFS definuje aj komprimáciu súborov. Avšak v prípa-de požiadavky na uloženie súboru v skomprimo-vanom tvare sa súbor uloží na médium skomprimovaný len vtedy, ak po komprimácii zaberie menej dátových sektorov ako v neskom-primovanom stave.

V prípade, že súbor je na médiu uložený ako skomprimovaný, jeho skutočná dĺžka v adresáro-vej položke stále znamená jeho skutočnú dĺžku koľko zaberal povodne neskomprimovaný. Informácia o tom, koľko bajtov súbor zaberá po komprimácii, je uložená vo FATke - je to počet alokovaných sektorov a z posledného sektora počet skutočne využitých bajtov.

Aby sa príliš nespomalilo čítanie a zapisovanie skomprimovaných súborov, pracuje komprimácia na veľmi jednoduchom princípe. Akonáhle sa v súbore nachadzajú aspoň tri rovnaké bajty bezprostredne za sebou, namiesto nich sa do skomprimovaného súboru uloží len ich počet a jeden z nich.

Napríklad máme blok bajtov:

11 22 33 33 44 55 8A 8A 8A 8A EE FF
00 00 00 00 00 00 00 00 99 88 77

Skomprimovaný blok bude vyzerať takto:

06 11 22 33 33 44 55 84 8A 02 EE FF
88 00 03 99 88 77

Skomprimovaný blok je rozdelený na úseky, každý úsek začína špeciálnym bajtom (označené bajty):

bit 7=príznak komprimácie
bit 6-0=počítadlo bajtov N, 0=128, 1=129, 2=130 bajtov.

Ak bit 7=0 tak úsek obsahuje N nekomprimo-vateľných bajtov (t. j. nejdú za sebou aspoň tri rovnaké bajty).
Ak bit 7=1 tak úsek pozostáva z N rovnakých bajtov. V tom prípade je dátový bajt uvedený len raz.

Na to, aby sa pri komprimáci začalo komprimovať, musia za sebou ísť aspoň tri rovnaké bajty. Ak sú len dva, uložia sa ako nekomprimovateľné. Ak je počet rovnakých/nerovnakých bajtov v bloku za sebou väčší ako 130, tak sa vždy po 130 bajtoch úsek uzavrie a začne sa generovať nový úsek.

Najnepriaznivejsia kombinácia bajtov sú samé nekomprimovateľné bajty. Vtedy sa skomprimo-vaný blok predĺži o 1/130 svojej dĺžky, pretože po každom 130. bajte je treba uložiť špeciálny bajt ktorý nesie informáciu že daný úsek obsahuje 130 nekomprimovaných bajtov. Vtedy sa samozrejme daný súbor uloží na médium nekomprimovaný.

Poznámka: Podobný typ komprimácie používajú aj kopírovacie programy BS COPY 06, 07, 128=, 128#.

Kódovanie súborov

Podobne ako komprimácia je tiež niekedy užitočné chrániť nejaký konkrétny súbor heslom. Napríklad užívateľ má v súbore uložené nejaké tajné zdrojáky alebo intímne informácie ktoré by sa nemali dostať na verejnosť. SFS preto definuje spôsob, ako súbor zakódovať pomocou nejakého užívateľom zadaného hesla.

Základná myšlienka kódovania je takáto: heslo jednoznačne určuje nejakú pomerne zložitú postupnosť bajtov, ktorou sa "vyxoruje" daný súbor. Dekódovanie súboru je potom analo-gické: súbor sa vyxoruje touto postupnosťou bajtov ešte raz a znovu je v pôvodnom nezakódovanom tvare.

V prípade, že heslo použité pri dekódovaní súboru nie je presne to isté ako heslo použité na zakódovanie súboru, bude dekódovacia postupnosť bajtov iná ako kódovacia a to, čo z pôvodného súboru vznikne, bude v podstate kopa nepoužiteľných bajtov.

Pri dekódovaní súboru neexistuje žiadny exaktný mechanizmus ktorý by indikoval či súbor je dekó-dovaný správne, alebo zle, pretože existencia takéhoto mechanizmu by viac či menej uľahčila hľadanie neznámeho hesla.

Algoritmus kódovania a dekódovania

Majme reťazec znakov dĺžky H a súbor dĺžky S:

char heslo[H];
char súbor[S];

a takýto generátor pseudonahodných čísel G[n]:

G[n+1]=(5 * G[n] + 7) MOD 65536

potom súbor bude zakódovaný takto:

Pre x=0 až S-1 urob:

súbor[x]=súbor[x] XOR Hi(G[x]) XOR Lo(G[x]) XOR heslo[x MOD H];
pričom začiatočná hodnota generátora G[0] sa určí takto:

high=0; low=0;
Pre i=0 až H-1 urob:
low=(low+heslo[i]) MOD 256;
high=RRCA(high) XOR heslo[i];
G[0]=256*high+low
RRCA je operácia totožná s rovnomennou inštrukciou rotácie procesora Z80.

Vzhľadom na to, že perióda generátora pseudonahodnych čísel je 65536, odporúča sa pre lepšie zakódovanie súboru zadávať heslo, ktorého dĺžka nie je súdeliteľná s číslom 65536. Napríklad akékoľvek heslo ktoré má nepárny počet znakov. Najideálnejšie sú heslá ktorých počet znakov je nejaké prvočíslo väčšie ako 7.

Záver

Možno na prvý pohľad vyzerá celá definícia. SFS-01 veľmi zložito a komplikovane, ale veľmi veľa vecí z nej sú rôzne špecialitky zabezpečujúce efektívnejšiu prácu operačného systému alebo komfort užívateľa, ktoré jedno-duchšie verzie operačných systémov nemusia využívať. Tiež v niektorých štruktúrach SFS sa nachádzajú redundantné dáta, t. j. dáta, ktoré sa nachádzajú už v iných štruktúrach alebo ktoré je možné z iných dát jednoznačne určiť. Napríklad dĺžka súboru je na médiu uložená trikrát - v hla-vičke súboru, v dĺžke tela a ešte sa aj dá určiť z FATky. Všetky redundantné dáta sú v SFS zámerne kvôli diagnostikovaniu dátovej konzis-tencie štruktúry údajov a kvôli efektívnejšej práci operačného systému.

logo-8bc.gif (1322 bytes)

-BUSY-