#################################################### ## 03 Busy soft: Techman operačného systému MB-02 ## #################################################### Index: 960331163326 Prísne tajné !!! Obsah 1. ROM-BIOS - popis - volania -- stránkovanie -- presmerovanie load-save 2. FDC-BIOS 26 - popis - služby - štruktúry dát -- fyzické číslo -- status 3. BS-DOS 306 - popis - služby - systémové premenné 4. Formát disku - BOOT sektor - DIRS sektor - adresárové sektory a položky - File alocation table --------------------------------------------------------------------------- *** ROM-BIOS *** ROM-BIOS slúži na prepínanie ramiek a povolenie alebo zakázanie zápisu do ramiek. Tiež zabezpečuje komunikáciu medzi jednotlivými ramkami - keď treba zavolať podprogram z jednej ramky do druhej, pričom pamäť nad #4000 nemožno použiť. Volania: call #3C98 ... zapne ROM-ramku, zakáže zápis call #3C9A ... zapne DOS-ramku, zakáže zápis call #3C9C ... zapne ROM-ramku, povolí zápis call #3C9E ... zapne DOS-ramku, povolí zápis Tieto volania fungujú nezávisle od toho, ktorá ramka je práve zapnutá (pristránkovaná) a či je povolený alebo zakázaný zápis. Zásadne sa neodporúča prepínať ramky pomocou OUT pretože jednotlivé adresy portov sa môžu na jednotlivých hardweroch meniť (aj sa menia!) ale tieto volania sú všade rovnaké (sú štandardizované). Súčasťou ROM-biosu sú aj volania určujúce orientáciu LOAD-SAVE rutín v romke na adresách #4C6 a #562. Sú to tieto volania: call #3CA2 ... presmeruje rutinky na kazetu call #3CA4 ... presmeruje rutinky na disketu Ale tieto volania treba volať pri pristránkovanej ROM-ramke. ----------------------------------------------------------------------------- *** FDC-BIOS *** FDC-BIOS slúži na ovládanie všetkých ostatných hardwarovo závislých zariadení - FDC a DMA kontroléry, porty na ovládanie motorov mechaník, prepínanie HD/DD a podobne. Cieľom FDC-biosu (nakoniec aj ROM-biosu) je zabezpečiť hardwerovú nezávislosť a plnú prenositeľnosť všetkých programov od samotného BS-dosu cez užívateľské prostredie typu windows (napr. NS WINDOWS) až po samotné užívateľské aplikácie. Preto vlastne sa neodporúča prepínať ramky outami alebo používať priamy prístup na periférie, ale len cez tieto dva biosy. Všetky časovo náročné operácie pri prenose bajtov medzi pameťou a diskom sa robia pomocou FDC a DMA kontrolérov, preto sa pri diskových operáciách ani nezakazuje ani nepovoľuje prerušenie. Užívateľ preto môže kľudne nechať cez prerušenie IM2 vykonávať ľubovoľnú rutinku. Na túto rutiku sú však kladené určité ohraničenia - presne také isté ako na rutinku popisovanú pri službe SETMLT (#10), ale s tým rozdielom, že rutinka v prerušení samozrejme nesmie meniť žiadne registre. Všetky služby FDC-biosu sa volajú inštrukciou RST #18 pri nastránkovanej DOS-ramke, pričom v registri A je vždy číslo volanej služby. V ostatných registroch sú potom ďalšie parametre pre volanú službu. Číslo služby: Mnemotechnický názov služby I: register=hodnota [vstupné parametre v registroch] O: register=hodnota [výstupé parametre v registroch] ...stručný slovný popis danej služby... #00: RESET O: A=status Resetuje FDC kontrolér. Tútu službu je vhodné zavolať vždy na začiatku práce s FDC-biosom. #01: STATUS O: A=status Vracia v registri A status. Inak nič iné nerobí. Status-bajt je popísaný nižšie. #02: RESTORE O: A=status Presunie hlavičku aktivovanej mechaniky na nultú stupu. #03: SEEK I: D=stopa O: A=status Presunie hlavičku aktivovanej mechaniky na danú stopu. #04: RDSEC I: DE=fyzické číslo sektora, HL=adresa O: A=status Prečítanie sektora DE z diskety na adresu HL. #05: WRSEC I: DE=fyzické číslo sektora, HL=adresa O: A=status Zápis sektora DE na disketu z adresy HL. #06: RDTRK I: D=stopa, bit7,E=strana, HL=adresa O: A=status Prečítanie stopy z diskety na adresu HL. #07: WRTRK I: D=stopa, bit7,E=strana, HL=adresa O: A=status Zápis stopy na disketu z adresy HL. Táto funkcia sa používa pri formátovaní diskety. #08: RDADD I: D=stopa, bit7,E=strana, HL=adresa O: A=status Prečítanie identifikácie sektora z diskety na adresu HL. #09: REŽIM I: E=0 pre DD, 1 pre HD, 2 pre ED, ... O: Z=režim nastavený, NZ=error Nastavenie hustoty záznamu na aktivovanej mechanike. Ak je pri návrate príznak NZ tak mechanika daný režim nepodporuje. #0C: AKTIVE I: E=číslo mechaniky O: A=výsledok Aktivizuje danú mechaniku (roztočí motor a povolí enable) Ak bola pred tým niektorá mechanika aktívna, vypne ju volaním PASIVE. Výsledok aktivizácie danej mechaniky môže byť: 0 ... unknown disk ... taká mechanika neexistuje 1 ... disk not ready ... v mechanike nie je disketa (alebo otvorené dvierka) 2 ... disk activated ... disk aktivny, disketa nebola vymenena 3 ... disk activated ... disk aktivny, ale bola vymenena disketa Po neúspešných prípadoch 0 a 1 ostanú všetky mechaniky vypnuté. #0D: PASIVE Vypína aktívnu mechaniku (zdruší enable). Či povypína aj točiace sa motory, to závisí od nastavenia SETOFF. #0E: INFO I: E=číslo mechaniky O: DE=informácie o mechanike Táto služba vracia tieto informácie o danej mechnike: D = počet stôp E = podporované režimy (bit 0=DD, bit 1=HD, bit 2=ED, ...) Ak daná mechanika neexistuje, v registri DE sa vráti nula. #0F: SETMAX I: BC=maximálna prenášaná dľžka Nastavuje maximálny počet bajtov, ktorý prenesie DMA kontrolér pri vykonávaní služieb RDSEC až RDADD. Význam to má vtedy, ak nie je vopred známy počet bajtov ktoré sa majú načítať pri volaní týchto služieb. [napr. pri čítaní stopy, alebo ak nie je známa dľžka sektora] Obsluha si takto môže veľmi jednoducho zabezpečiť, aby čítané data ani omylom nepremazali časť pamete ktorá leží nad buffrom pre čítané data. #10: SETMLT I: HL=adresa rutinky, alebo nula Keďže počas samotného prenosu dát medzi diskom a pameťou nie je potrebná účať procesora, môže sa procesor venovať inej činnosti. Pomocou tejto služby sa FDC-biosu odovzdáva adresa rutinky, ktorá bude zavolaná práve počas tohto prenosu dát. Rutinka môže vykonávať ľubovoľnú činnosť, ale keďže sa táto rutinka volá počas DMA operácie s diskom, sú na ňu kladené tieto obmedzenia: - nesmie rušiť prenos dát !!! [nesmie siahať na DMA, FDC a porty mechaník] - nemala by obsahovať presné časové slučky [lebo DMA vtedy zdržuje pameť] - nemala by trvať viac ako 5-10 ms [ale toto nie je kritické] - musí sa poctivo vrátiť inštrukciou RET naspäť do DOS-ramky - môže meniť všetky registre #11: SETOFF I: E=mód vypínania motorov Tu sa určuje, či služba PASIVE bude (E=#00) alebo nebude (E=#ff) vypínať aj motor pri deaktivácii mechaniky. Nevypínať motor má význam napr. vtedy, keď sa kopíruje veľmi veľa dát [že sa nemestia naraz do pamete] medzi dvomi mechanikami - netreba zbytočne čakať na roztáčanie motorov mechaník. Fyzické číslo sektora v registri DE sa skladá z týchto údajov: bit 0-7,D ... číslo stopy bit 7,E ... strana bit 0-6,E ... číslo sektora na stope D Mnohé služby vracajú v registri A štruktúru zvanú "status". Status je bajt, ktorý špecifikuje výsledok diskovej operácie - každý bit má svoj význam. Ak je bit jednotkový, znamená to že nastala špecifikovaná chyba. V zátvorkách sú napísané služby, ktorých sa týka daná chyba a teda pri ktorých má význam testovať tento bit. bit 0 ... time out ... operácia by trvala dlhšie, ako sa patrí [#04-#08] bit 1 ... disk not ready ... mechanika nie je pripravená [#04-#08] bit 2 ... lost data .... chyba pri prenose dát disk-pameť [#04-#08] bit 2 ... track 0 ... hlava je na stope 0 [#00-#03] bit 3 ... CRC error ... pri čítaní nesedí kontrolný súčet [#04,#06,#08] bit 4 ... record not found ... nenašiel sa sektor [#04,#05,#08] bit 4 ... seek error ... mechanika nemá nultú stopu (?!) [#02] bit 5 ... break ... pri diskovej operácii bol stlačené QW [#04-#08] bit 6 ... write protect ... disk chránený pred zápisom [#00-#02,#03,#05,#07] bit 7 ... not ready ... chyba aktivizácie mechaniky [#04-#08] ------------------------------------------------------------------------------ *** BS-DOS *** BS-DOS je už hardwerovo nezávislá časť operačného systému ktorá poskytuje užívateľovi všetky možné služby od tých nižších ako napr. výpis jedného znaku, nastavenie aktuálnej mechaniky až po služby najvyššej úrovne ako napr. emulácia load-save rutín na adresách #4C6 a #562 alebo interpret basicových príkazov a funkcií ovládájúcich disketové jednutky. Služby operačného systému sú logicky rozdelené do štyroch skupín. Prvú skupinu tvoria služby #00-#0F a #34. Sú to malé pomocné podprogramy, ako napríklad výpis jedného znaku, pípnutie alebo jednoduché prevody. Druhú skupinu tvoria služby #10-#1F a #30. Sú to základné diskové operácie, ako napríklad nastavenie aktuálneho disku, adresára, prepísanie adresárovej položky, zistenie voľného miesta na diskete alebo zmazanie CACHE pametí. Tretiu skupinu tvoria služby #22-#2F a #33. Sú to diskové operácie vyššej úrovne ktoré viac-menej zodpovedajú jednotlivým basicovým príkazom. Napríklad zmazanie súborov, presunutie do iného adresára alebo katalóg. Štvrtú skupinu tvoria služby #20,#21,#31,#32. Sú to služby určené na špeciálne účely a pre užívateľa prakticky nepoužiťeľné. Sem patrí emulácia romkových load-save rutín (#4C6 a #562) a basicový interpreter. Niektoré služby vracajú alebo vyžadujú zadať 32-bitovú hodnotu. Táto hodnota sa zadáva vždy v registroch DE a HL tak, že platí: DEHL hodnota = 256^3*D + 256^2*E + 256^1*H + 256^0*L [Teda v D je najvyšší bajt a v L najnižší.] Služby označené hviezdičkou vždy vracajú v príznaku CY informáciu o tom, ako dopadli. V prípade, že CY je pri návrate nastavené, služba prebehla v poriadku. Ak sa pri vykonávaní služby vyskytne nejaká chyba, na ktorú užívateľ odpovie RETRY a služba potom prebehne v poriadku, tiež sa vráti s nastaveným CY. Ak však užívateľ odpovie ABORT, služba sa vráti s nulovým CY. Všetky služby BS-DOSu sa volajú inštrukciou RST #20 pri nastránkovanej DOS-ramke, pričom v registri A je vždy číslo volanej služby. V ostatných registroch sú potom ďalšie parametre pre volanú službu. Číslo služby: Mnemotechnický názov služby [hviezdička] I: register=hodnota [vstupné parametre v registroch] O: register=hodnota [výstupé parametre v registroch] ...stručný slovný popis danej služby... #00: GETVER O: BC=verzia operačného systému, IX=adresa pomocného dátového buffera Podľa tejto služby si aplikačné programy môžu veľmi ľahko zistiť s akou verziou dosu spolupracujú a predísť tak niektorým komplikáciám ktoré by vznikli keby program volal nejakú službu v staršej verzii dosu, kde táto služba ešte nie je implementovaná. Do pomocného dátového buffera sa ukladajú rôzne informácie o činnosti systému - napríklad informácie o chybe, ak nejaká nastane. Bližšie o tomto viď v popise služby #35:SDMSX. #01: DISP I: E=ascii kód znaku Toto je print-rutinka vypidujúca jeden znak. Pozícia výpisu je daná systémovou premennou XXX a YYY, spôsob vypisovania sa určuje službou SDDX [#0C] a v prípade že výpis prebieha na obrazovke je farba výpisu určená systémovou premennou COLOR. Táto služba nevie spracúvať žiadne riadiace kódy ako napr. CR,LF. Vypisuje iba platné vypísateľné znaky od kódu #1E vyššie. #02: ENTER Presunie kurzor vypisovania na začiatok ďalšieho riadku tak, že do zvyšku riadku na ktorom je kurzor až do konca riadku vypisuje medzery. #03: TAB I: E=číslo stĺpca Vypisuje medzery dovtedy, pokým pozícia výpisu nebude v danom stľpci. #04: TXXT I: HL=adresa textu Vypisuje text uložený na danej adrese. Text musí končiť bajtom nula. #05: DEC8X I: E=hodnota, C=znak pre nevýznamné nuly Vypisuje osembitové desiatkové číslo, pričom naniesto začiatočných núl vypíše znak v registri C. Ak teda chcete mať čísla zarovnané vpravo, vložte do C medzeru, ak chcete mat vypísané iba platné číslice, vložte do C kód #00. Na samotný výpis znakov sa volá služba DISP. #06: DEC16X I: HL=hodnota, C=znak pre nevýznamné nuly Vypisuje 16-bitové čislo, inak presne tak isto ako DEC8X. #07: DEC32X I: DEHL=hodnota I: C=znak pre nevýznamné nuly, B=maximálna dĺžka čísla [max 10 znakov!] Vypisuje 32-bitovú hodnotu ako desiatkové číslo. Ak chcete aby dĺžka čísla nepresiahla napr. 8 znakov, vložte do B hodnotu 8. #08: DEC32 I: DEHL O: DEHL = DEHL-1 #09: INC32 I: DEHL O: DEHO = DEHL+1 #0A: ADD32 I: DEHL,BC O: DEHL = DEHL+BC #0B: SUB32 I: DEHL,BC O: DEHL = DEHL-BC Tieto štyri služby XXX32 slúžia pre 32-bitovú aritmetiku. #0C: SDDX I: E=mód výpisu Určenie spôsobu vypisovania znakov pre službu DISP. E=0...služba DISP bude vypisovať znaky normálne na obrazovku. Pozícia výpisu je daná systémovými premennými XXX (stĺpec) a YYY (riadok). Po každom vypísanom znaku sa pozícia posunie doprava, alebo na začiatok ďalšieho riadku, ak je už celkom na kraji. A je na poslednom riadku, presunie sa na prvý riadok obrazovky. E=1...služba DISP bude vypisovať znaky tak, že ich bude ukladať do pameti na adresu danú systémovou premennou XXX (nižší bajt) a YYY (vyšší bajt). Toto vypisovanie "do pameti" sa dá veľmi výhodne použiť napr. ak chcete vypísať 32-bitové číslo, ale chcete použiť nejakú vlastnú print-rutinku. Pomocou SDDX nastavíte vypisovanie do pameti, do XXX uložíte adresu nejakého buffera, zavoláte službu DEC32X, no a v bufferi máte toto číslo v textovom tvare a môžete ho vypísať vlastnou print-rutinkou. #0D: BEEP Pípnutie na AY - nemení farbu borderu. Tón sa vytvára rýchlym striedaním hodnôt #00 a #0F v registri #0A [hlasitosť kanálu C]. Ak práve na AY hraje nejaká hudba z prerušenia, potom píputie bude "modulované" touto hudbou. Po pípnutí sa do registra #0A vráti pôvodná hodnoda akú mal pred začiatkom pípnutia. Ostatné registre AY sa pri pípnutí ani nenastavujú ani nemenia. #0E: PREVODX I: HL=logické číslo sektora, E=pocet sektorov na stopu O: HL=DE=fyzické číslo sektora Celý BS-DOS pracuje s logickými číslami sektorov, avšak FDC-BIOS pracuje iba s výhradne fyzickými číslami. Preto vždy vtedy, keď treba v BS-dose zavolať nejakú službu FDC-biosu tak sa pred tým volá táto služba PREVODX. Definícia fyzického čísla sektoru je v popise FDC-biosu. #0F: HOWSEC I: DEHL=dĺžka súboru O: BC=počet sektorov ak Z, error ak NZ Táto služba vypočíta, koľko sektorov by na disku zaberal súbor s dĺžkou DEHL. Ak by mal počet sektorov presiahnuť 65536, tak do BC sa uloží iba dolných 16 bitov tejto hodnoty a vynuluje sa priznak zero (NZ). Ak je počet sektorov pod 65536 tak bude zero nastavene (Z). #10: KUKNI * Aktualizácia vnútorných CACHE pametí. Skontroluje disketu v aktuálnej mechanike a nastaví podľa nej obsah týchto pametí. #11: KUINI * Aktualizácia CACHE pametí ako #10 KUKNI, ale s tým že pred tým vymaže starý obsah pametí. To znamená, že vždy dôjde z znovunačítaniu všetkých informácií z diskety. #12: GETCST * O: D=aktuálny adresár, E=aktuálny disk, HL=load-kurzor Táto služba zisťuje aktuálnu cestu [disk a adresár] a na ktorom súbore je pretočená virtuálna kazeta. #13: SETDRV I: E=číslo mechaniky Nastavenie aktuálnej mechaniky. Ak užívateľ nastaví mechaniku, ktorá fyzicky neexistuje, chyba nenastane hneď ale až pri fyzickom prístupe na túto mechaniku. #14: SETDIR * I: E=číslo adresára Nastavenie aktuálneho adresára na diskete vloženej do aktuálnej mechaniky. #15: SETLCX * I: BC=load-kurzor Pretočenie virtuálnej kazety na súbor s číslom BC na diskete vloženej do aktuálnej mechaniky. Znamená to, že pri volaní load-rutinky na #562 sa bude práve tento súbor ako prvý spracúvať. #16: GETSUB * I: BC=číslo súboru (load-kurzor), IX=adresa 32-bajtového buffera O: zero=platnosť údajov v bufferi Táto služba vráti v bufferi 32-bajtovú adresárovú položku daného súboru. V prípade že adresárová položka s takýmto číslom neexistuje [adresár je kratší ako údaj v BC] tak služba sa vráti s nastaveným zero-príznakom. Presná špecifikácia štruktúry adresárovej položky je v časti popisujúcej formát diskety. #18: KOLKOX * O: DE=počet adresárových položiek v aktuálnom adresári. Táto služba vracia inými slovami povedané dĺžku aktuálneho adresára. Má to význam vtedy, ak chcete do pameti načítať adresár službou GETSUB a potrebujete zistit že koľko položiek sa v adresári nachádza. #19: SEASX * I: HL=adresa 10-znakového mena, E=typ súboru O: zero=príznak či sa také meno našlo Hľadanie súboru s daným menom a typom v aktuálnom adresári. Meno musí byť 10 znakové. V registri E je typ súboru (0=basic;1,2=data,3=bytes;...atd) Ak je v E hodnota 255 tak typ súboru sa nekontroluje a porovnáva sa iba 10 znakové meno. Táto služba pracuje tak, že hľadá daný súbor od aktuálnej pozície load-kurzoru smerom ku koncu adresára. Keď sa dostane na koniec, pokračuje zase od začiatku adresára. Hľadanie končí vtedy, ak sa alebo daný súbor nájde alebo ak sa príde na východiskové miesto hľadania. Ak sa daný súbor nájde, load-kurzor sa naň nastaví a služba sa vráti s nastaveným zerom (Z), ak sa nenájde, load-kurzor sa nemení a bude NZ. Táto služba sa využíva napriklad vtedy, ak do basicového príkazu pre nastavenie load-kurzora zadáte reťazcový parameter [meno súboru]. #1A: SEADX * I: HL=adresa 10-znakového mena O: zero=príznak či sa také meno našlo, A=číslo adresára (ak sa našiel) Hľadanie adresára s daným menom. Táto služba pracuje tak, že hľadá daný adresár smerom k adresáru 255. Keď sa tam dostane, pokračuje zase od adresára 0. Hľadanie končí vtedy, ak sa alebo daný adresár nájde alebo ak sa príde na východiskové miesto hľadania. Ak sa daný adresár nájde, služba vráti jeho číslo v registri A s nastaveným zerom (Z), ak sa nenájde, bude NZ. Táto služba sa využíva napríklad vtedy, ak do basicového príkazu pre nastavenie adresára zadáte reťazcový parameter [meno adresára]. #1B: OWSUB * I: HL=číslo súboru, IX=adresa 32-bajtového buffera Prepísanie adresárovej položky. V bufferi sa musí nechádzať nová položka, ktorou sa nahradí stará adresárová položka patriaca súboru s číslom HL. Ak súbor s číslom HL neexistuje [adresár je kratší ako HL] vtedy sa nevykoná žiadna činnosť. Túto službu používajte veľmi opratrne, lebo jej neuváženým použitím možno veľmi ľahko pokaziť integritu dát uložených na diskete. Odporúčaný postup použitia je takýto: Najpr si službou GETSUB uložte danú položku do buffera, potom spravte v položke uloženej v bufferi potrebné zmeny a nakoniec službou OWSUB už modifikovanú položku uložte späť na disk. Meniť môžete dátum, čas, údaje v magnetofónovej hlavičke a adresu tela. Ostatné údaje sa neoporúča meniť. V žiadnom prípade nemente začiatočný sektor súboru !!! Tútu službu využíva napríklad basicový príkaz RENAME. #1E: KILLX Zrušenie vnútorných CAHCE pametí pre disketu. Túto službu je potrebné zavolať vždy vtedym, keď sa boli zmenené data na diskete inak ako prostredníctvom basicových príkazov alebo štandartných služieb BS-dosu. Využíva ju napr. formátovací program. #1F: FREEX * O: DEHL=voľné miesto v bajtoch, BC=voľné miesto v sektoroch Vracia veľkosť voľného miesta na diskete v aktuálnej mechanike. #20: EMM562 * Emulácia rom-load rutinky na adrese #562, pre užívateľa inak nezaujímavé Emuluje aj load, aj verify. Využívajú sa pri tom služby #22 LOA1X a #24 VERIX. #21: EMM4C6 * Emulácia rom-save rutinky na adrese #4C6, pre užívateľa inak nezaujímavé Využívajú sa pri tom služby #26 CREATX, #25 SAVEX a #24 VERIX. #22: LOA1X * #23: LOA2X * #24: VERIX * #25: SAVEX * I: HL=číslo súboru, IX=adresa pameti, BC=začiatočný sektor, E=počet sektorov Toto sú štyri komplexné služby, pomocou ktorých je možné čítať (LOA1X,LOA2X), zapisovať (SAVEX) alebo skontrolovať (VERIX) určitú časť súboru. HL obsahuje číslo súboru ktoré špecifikuje súbor, s ktorým sa bude pracovať, IX ukazuje na začiatok pameti kam sa bude loadovať, prípadne odkiaľ sa bude sejvovať alebo obsah ktorej sa skontroluje s obsahom súboru. BC je číslo znamenajúce od ktorého sektora začína časť súboru s ktorou budeme pracovať. Sektory sa počítaju od nuly, čiže BC=0 je úplne prvý sektor súboru. E je počet sektorov ktoré loadujeme, sejvujeme alebo verifikujeme. Súčet BC+E nesmie byť večší ako celkový počet sektorov daného súboru. Celkový počet sektorov sa najjednoduchšie dá zistiť použitím služby HOWSEC. Roziely medzi LOA1X a LOA2X sú tieto: Ak dĺžka súboru nie je celočíselný násobok 1024, potom LOA1X nahráva iba príslušnú časť posledného sektora, zatiaľ čo LOA2X nahráva celý posledný sektor. Ak by sa mali nahrávané data uložiť pod adresu #4000 tak LOA1X tieto data neukladá do pameti. Tým je operačný systém chránený pred prepísaním. Naproti tomu LOA2X nič nekontroluje a nahráva vždy celé sektory. Týmto pádom je LOA1X bezpečnejšie, ale LOA2X je rýchlejšie a možno tým nahrávať aj pod #4000. VERIX je normálne verify, to znamená že fyzicky kontroluje obsah danej časti súboru s obsahom pameti. V prípade zistenej nezhody vypíše chybový oznam, v ktorom uvedie adresu prvého a posledného nezhodného bajtu a tiež celkový počet nezhodných bajtov. #26: CREATX * I: IX=adresa 32-bajtovej adresárovej položky O: HL=číslo vytvoreného súboru Alokácia miesta na disku pre daný súbor. Táto služba pracuje tak, že najprv nájde voľnú položku v adresári, do nej presunie danú adresárovú položku z adresy IX, podľa dĺžky tela v tejto položke naalokuje príslušný počet voľných sektorov vo FATke na disku a do adresárovej položky nastaví číslo prvého sektora. Týmto vlastne pripraví daný súbor tak, aby služba SAVEX do neho mohla bez problémov uložiť daný obsah. Služby #23-#26 využíva napr. kopírovací program CDD takto: Najprv pomocou LOA2X načíta do pameti súbor, ktorý potom sejvne pomocou CREATX a SAVEX. #27: UTRASX * Utrasenie aktuálneho adresára - presne ako basicový príkaz PRESS. #28: ERASEX * I: BC=číslo súboru Zmazanie daného súboru v aktuálnom adresári. Ak BC=0 tak sa zmaže celý adresár. Ak je adresár neprázdny [obsahuje nezmazané súbory] tak sa ešte pred zmazaním vypíše otázka ktorou je treba potvrdiť zmazanie všetkých súborov v tomoto adresári. #29: ERASIX * I: BC..HL=interval súborov Zmazanie súborov počnúc BC-tym až po HL-ty včítane. Mazanie celého intervalu súborov naraz má tu veľmi veľkú výhodu že je to oveľa oveľa oveľa rýchlejšie ako mazanie súboru po jednom a viac sa pri tom šetrí disketa - napríklad tak že FATka sa zapisuje iba raz na konci po zmazaní všetkých súborov v intervale. #2A: MOVEXX * I: BC=číslo súboru, E=cieľový adresár Presunutie súboru do adresára E. Funguje presne ako basicový príkaz MOVE BC,E Ak je BC=0 [presúva sa celý adresár] tak potom sa len aktuálny adresár vymení so špecifikovaným. Ak cieľový adresár a aktuálny je ten istý, tak sa daný súbor iba presunie na koniec tohto adresára. Toto sa dá veľmi dobre použiť na usporadúvanie súborov v adresári. #2B: MOVEIX * I: BC..HL=interval súborov, E=cieľový adresár Presunutie intervalom špecifikovaných súborov do adresára E. Funguje presne tak isto ako basicový príkaz MOVE E;BC TO HL. Súbory sa postupne jeden po druhom počínajúc súborom BC a končiac súborom HL presúvajú do adresára E presne tak isto ako v službe MOVEXX. #2C: CATX * I: BC=špecifikácia adresára Výpis katalógu špecifikovaného adresára. Ak B=1 tak sa bude vypisovať aktuálny adresár, ak B=0 tak sa bude vypisovať adresár C. To, či sa budú vypisovať aj zmazané súbory (CAT!) je určené nultým bitom systémovej premennej OPTIO. Ako print-rutinka sa pri vypisovaní adresára používa služba DISP. #2D: SEAXXX * I: DE=adresa reťazca, BC=dĺžka reťazca (max 10) Hľadanie reťazca vo všetkých menách súborov a adresárov. Je to vlastne to isté ako basicový príkaz SEARCH "reťazec". To, či sa budú prehľadávať aj zmazané súbory (SEARCH!) je určené nultým bitom systémovej premennej OPTIO. Ako print-rutinka sa pri vypisovaní používa služba DISP. #2E: CATXD * I: BC=špecifikácia adresára, L=číslo mechaniky Pracuje presne tak isto ako CATX ale vypisuje katalóg aktuálneho adresára na diskete v mechanike L. Je to vlastne basicový príkaz CAT #L #2F: SEAXXD * I: DE=adresa reťazca, BC=dĺžka reťazca (max 10), L=číslo mechaniky Pracuje presne takisto ako SEAXXX ale prehľadáva mená a adresáre na diskete v mechanike L. Je to vlastne basicový príkaz SEARCH #L,"reťazec" #30: START Start operačného systému po nabootovaní zo systémovej diskety. Pre užívateľa nemá žiadny praktický význam. #31: BASIC Interpret basicových príkazov. Pre užívateľa nemá žiadny praktický význam. #32: FUNKC Interpret basicových funkcií. Pre užívateľa nemá žiadny praktický význam. #33: FORMX * Rýchly formát diskety. Je to vlastne výkonná rutinka príkazu FORMAT. Pred zmazaním celej diskety sa ešte vypíše otázka, ktorou je treba zmazanie diskety potvrdiť. #34: MESSX I: HL=adresa textu O: CY=príznak reakcie užívateľa Táto služba robí nasledujúcu činnosť: Najpr si odpametá obrazovku, potom zobrazí štandartné chybové okienko, do ktorého napíše daný text. V okienku sa tiež vypíše toto: ENTER=OK/RTR,SPACE=ABORT. Po zobrazení okienka sa čaká na stlačenie enteru alebo medzery. Keď užívateľ stlačí jednu z týchto dvoch kláves, okienko sa zmaže, na obrazovku sa vráti jej pôvodný obsah a služba v CY vráti informáciu o tom, akú klávesu stlačil užívateľ. Ak stlačil ENTER bude C, ak medzeru bude NC. Pozor ! Dôležité: Text nesmie byť dlhší ako 28 bajtov a musí končiť bajtami #00,#C9. Teda napríklad musí vyzerať nejak takto: DB 'bla-bla-bla',#00,#C9 #35: SDMSX I: HL=adresa rutinky, alebo nula. Presmerovanie výpisov oznamov a chybových hlasení. BS-DOS obsahuje v sebe rutinku, ktorá všetky oznamy a chybové hlásenia vypisuje do rámika v hornej tretine obrazu. Niekedy ale ale vhodné, ak má užívateľ možnosť si napísať vlastnú rutinku, ktorá mu bude vypisovat chyby a reagovať na klávesy tak ako sa to dizajnovo hodí do jeho užívateľského programu. Práve na tento účel je tu táto služba. V registri HL musí byť adresa obslužnej rutinky na výpis chybového hlásenia, alebo nula. Ak je v HL nula, nastaví sa vnútorne vektor výpisovej rutinky na defaultnú vnútornú rutinku. #36: UNERAX * I: BC=číslo súboru Obnovenie daného súboru v aktuálnom adresári. Ak BC=0 tak sa obnoví zmazaný adresár. Pri obnovovaní adresára sa súbory v ňom neobnovujú automaticky. Službami #36 a #37 sa dá do pôvodného stavu obnoviť disketa, ktorá bola zmazaná QuickFormátom (#33). #37: UNERIX * I: BC..HL=interval súborov Obnovenie súborov počnúc BC-tym až po HL včítane. Obnovenie celého intervalu súborov naraz má tu veľmi veľkú výhodu že je to oveľa oveľa oveľa rýchlejšie ako obnovenie súboru po jednom a viac sa pri tom šetrí disketa - napríklad tak že FAT sa zapisuje iba raz na konci po obnoveni všetkých súborov v intervale. Poznámka: Ak nastane pri niektorom súbore z intervalu chyba "Can't unerase" tak všetky súbory z tohto intervalu ostanú v pôvodnom stave a ani jeden nebude obnovený. Bližší popis k službám #34:MESSX a #35:SDMSX Užívateľská rutinka vypisujúca oznam alebo chybové hlásenie dostane potrebné informácie umiestnené v pamäti - konkrétne v pomocnom dátovom bufferi, ktorého bázovú adresu [začiatok] vracia služba #00:GETVER v registri IX. V tomto bufferi sa pri potrebe vypísať nejaký oznam alebo chybové hlásenie nachadzajú takéto údaje: Buffer + #80 ... text oznamu alebo chybového hlásenia ukončený bajtom #00 + #C0 ... (dva bajty) fyzické číslo sektora, pri ktorom došlo ku chybe + #C2 ... číslo sektora na stope [vypočítané z fyzického čísla] + #C3 ... farba, akou by sa malo vypisovať hlásenie Ak je číslo sektora (#C2) nula, potom sa jedná o obyčajný oznam (napr generovaný službou #34:MESSX) a vtedy údaje o čísle sektora nemajú žiadny význam. Rutinka musí nielen vypísať hlásenie, ale aj spracovať užívateľovu voľbu medzi možnosťami RETRY alebo ABORT. Na výstupe z rutinky musí byť v CARRY príznak požadovanej voľby: CY=1 pre retry a CY=0 pre abort. Pri práci môže táto rutinka využívať služby #00 až #0F operačného systému. Nesmie nič robiť s diskom a ani volať služby dosu pracujúce s diskom. Zo služieb dosu môže využívať len služby #00 až #0F. Môže meniť všetky registre. Niektoré systémové premenné BS-dosu: #03E0 XXX ....... stĺpec alebo nižší bajt pozície výpisu #03E1 YYY ....... riadok alebo vyšší bajt pozície výpisu #03E2 COLOR ..... farba výpisu, ak výpis prebieha na obrazovku #03E3 OPTIO ..... rôzne príznaky práce BS-dosu (jednotlivé bity) #03EE DISK ...... číslo aktuálnej mechaniky [toto nastavuje služba SETDRV] Bity systémovej premennej OPTIO: bit 0 .... spôsob výpisu katalógu a prehľadávania adresárov 0 = berie do úvahy iba platné súbory 1 = berie do úvahy aj zmazané adresárové položky bit 1 .... spôsob výpisu katalógu 0 = vypisuje od začiatku katalógu (od súboru 1) 1 = vypisuje od aktuálnej pozície load-kurzora bit 7 .... načítavanie disku pred zápisovými operáciami 0 = vždy nanovo načíta potrebné informácie z diskety 1 = berie informácie z CACHE pamete (ak tam sú) Iné bity sú nepoužité, ale z dôvodu kompatibility ich treba nechať nulové. ------------------------------------------------------------------------------- *** Stručné info o formáte diskety *** BOOT sektor: fyzické číslo: stopa 0 strana 0 sektor 1 logické číslo: 0 Tento sektor obsahuje: #00-#01 ... Skok na systémový zavádzač #02 ....... nepoužité, obyčajne je tu #80 #03 ....... tu musí byť #02 (značka MB-02) #04-#05 ... počet fyzických stôp na disku (väčšinou 80 alebo 82) #06-#07 ... počet sektorov na stope (počítajú sa od 1) #08-#09 ... počet povrchov na disku (štandartne 2) #0A-#0B ... počet sektorov na cluster (štandartne 1) #0C-#0D ... logické číslo sektora DIRS #0E-#0F ... počet sektorov FAT (1 až 4) #10-#11 ... dĺžka FAT (#400 * počet sektorov FAT) #12-#13 ... logické číslo prvého sektora prvej FAT #14-#16 ... logické číslo prvého sektora druhej FAT #20 ....... tu musí byť #00 (značka MB-02) #21-#24 ... dátum a čas formátovania (kódovanie ako PC) #25 ....... tu musí byť #00 (značka MB-02) #26-#2F ... meno diskety #30-#3F ... rozšírenie mena diskety #40-#5F ... systémová identifikácia diskety Podľa bajtov označných ako "značka" rozpoznáva BS-DOS že sa jedná o disketu zo systému MB-02. V boote sú zapísané čísla prvých sektorov FAT. Ďalšie sektory FAT sa dajú najsť priamo podľa FAT - lebo obidve FAT sú uložené ako súbory - riadne sekvencie sektorov. DIRS sektor Jeho logické číslo je zaznačené v BOOTe na offsete #0C-#0D Tento sektor obsahuje 256 štvorbajtových položiek, kde každá jedna položka znamená jeden adresár. Význam bajtov v tejto položke: #00 ....... identifikácia položky #80 = platná položka a adresár existuje iné = adresár neexistuje a neplatná položka #01 ....... xor mena adresára (kôli rýchlejšiemu hľadaniu) #02,#03 ... logické číslo prvého sektora adresára (len bity 0-13) Adresárové sektory Logické číslo prvého sektora každého adresára je uložené v bajtoch #02-#03 položiek v sektore DIRS. Obsahujú 32 bajtové položky. Význam bajtov v položke: #00 ....... identifikácia položky #90 = súbor obsahuje iba hlavičku #A0 = súbor obsahuje iba telo #B0 = súbor obsahuje aj hlavu aj telo #80 = súbor neobsahuje hlavu ani telo (nestáva sa často) Iné hodnoty znamenajú neplatnú adresárovú položku. #01-#04 ... dátum a čas vytvorenia súboru #05-#15 ... klasická magnetofónová hlavička #16-#17 ... adresa tela #18-#1B ... dĺžka tela (#18=najnižší, #1B=najvyšší bajt) #1C ....... flagbajt tela #1D ....... atribúty súboru #1E-#1F ... logické číslo prvého sektora tela (iba bity 0-13) Táto 32-bajtová štruktúra sa odborne nazýva "adresárová položka". S týmito položkami pracujú služby GETSUB a OWSUB. Nultá adresárová položka má špeciálny význam - je vždy platná a obsahuje takéto bajty: #00 ....... identifikátor (väčšinou #80) #01-#04 ... dátum a čas vytvorenia adresára #05 ....... číslo nad-adresára (do ktorého patrí tento adresár) #06-#0f ... meno adresára #10-#1f ... rozšírenie mena adresára File alocation table FAT obsahuje 16-bitové položky. každá špecifikuje jeden sektor na diskete. Význam jednotlivých bitov v položke: Bit 15: 0 ... neobsadený, voľný sektor pripravený na použitie 1 ... obsadený, využitý sektor [obsahuje údaje alebo je chybný] 14: 0 ... posledný sektor súboru 1 ... priebežný sektor, nie posledný 0-13: [bit14=0] počet bajtov v sektore do konca súboru [bit14=1] logické číslo nasledujúceho sektora v súbore Pozor, ak bity 8-15 obsahujú samé jednotky, potom význam hodnoty v bitoch 0-7 je takýto: #00 ... špeciálny sektor na služobné úcely [boot, zalohovací sektor] #F? ... nepoužitelný sektor: #FC - chybný sektor [CRC error] #FD - chybný sektor [Rec. mot found] #FE - neexistujúci sektor [druhá strana jednostranného disku] #FF - neexistujúci sektor [za fyzickým okrajom diskety] -------------------------------------------------------------------------------