BS DOS 308 - ovladanie zo strojoveho kodu

Tento dokument popisuje popis vsetkych modulov a sluzieb operacneho systemu BS-DOS (dos verzia 308, bios verzia 26). Sluzby su k dispozicii pre aplikacie v strojaku (assembleri), ktore chcu pracovat s MB-02.

Obsah

Ak nie je uvedene inak, vsetky sluzby operacneho systemu su popisovane v tomto formate:

  Sluzba :  cislo sluzby (hexadecimalne)
  Nazov :  mnemotechnicky nazov sluzby
  Input :  vstupne parametre v tvare register=hodnota
  Output :  vystupe parametre v tvare register=hodnota
Dalsi text obsahuje slovny popis prace danej sluzby, jej specifika a pripadne dalsie informacie, ktore je uzitocne vediet pri programovani aplikacii vyuzivajucich danu sluzbu.


ROM-BIOS

ROM-BIOS sluzi na prepinanie ramiek a povolenie alebo zakazanie zapisu do ramiek. Tiez zabezpecuje komunikaciu medzi jednotlivymi ramkami - ked treba zavolat podprogram z jednej ramky do druhej, pricom pamet nad #4000 nemozno pouzit.

 call #3C98  zapne ROM-ramku, zakaze zapis 
 call #3C9A  zapne DOS-ramku, zakaze zapis 
 call #3C9C  zapne ROM-ramku, povoli zapis 
 call #3C9E  zapne DOS-ramku, povoli zapis 

Tieto sluzby funguju nezavisle od toho, ci je prave zapnuta ROM alebo DOS ramka a ci je povoleny alebo zakazany zapis. Nemenia ziadne registre. Zasobnik sa doporucuje umiestnit nad #4000, ale v principe moze byt aj pod, ale potom v pripade prepnutia ramky moze dojst ku strate pushnuteho AF registra a navratovej adresy zo sluzby. Pokial sa niektora zo sluzieb pouzije len na zakazanie zapisu, (a zasobnik nepremaze vykonnu rutinku sluzby) nie je s polohou zasobnika ziadny problem. Zasadne sa neodporuca prepinat ramky pomocou OUT pretoze jednotlive adresy portov sa mozu na jednotlivych hardweroch menit (aj sa menia!) ale tieto sluzby su a aj budu vsade rovnake.

Sucastou ROM-biosu su aj dve sluzby urcujuce orientaciu LOAD-SAVE rutin v romke na adresach #4C6 a #562. Su to tieto sluzby:

 call #3CA2  presmeruje rutinky na kazetu 
 call #3CA4  presmeruje rutinky na disketu 

Tieto dve sluzby je potrebne volat len pri pristrankovanej ROM-ramke.


FDC-BIOS

FDC-BIOS sluzi na ovladanie vsetkych ostatnych hardwarovo zavislych zariadeni - FDC a DMA kontrolery, porty na ovladanie motorov mechanik, prepinanie HD/DD a podobne. Cielom FDC-biosu (nakoniec aj ROM-biosu) je zabezpecit hardwerovu nezavislost a plnu prenositelnost vsetkych programov od samotneho BS-dosu cez uzivatelske prostredie typu windows (napr. NS WINDOWS) az po samotne uzivatelske aplikacie. Preto vlastne sa neodporuca prepinat ramky outami alebo pouzivat priamy pristup na periferie, ale len cez tieto dva biosy.

Vsetky casovo narocne operacie pri prenose bajtov medzi pametou a diskom sa robia pomocou FDC a DMA kontrolerov, preto sa pri diskovych operaciach ani nezakazuje ani nepovoluje prerusenie. Uzivatel preto moze kludne nechat cez prerusenie IM2 vykonavat lubovolnu rutinku. Na tuto rutiku su vsak kladene urcite ohranicenia - presne take iste ako na rutinku popisovanu pri sluzbe SETMLT (#10), ale s tym rozdielom, ze rutinka v preruseni samozrejme nesmie menit ziadne registre.

Vsetky sluzby FDC-biosu sa volaju instrukciou RST #18 pri nastrankovanej DOS-ramke, pricom v registri A je vzdy cislo volanej sluzby. V ostatnych registroch mozu byt dalsie parametre pre volanu sluzbu.

  Sluzba :   00
  Nazov :   RESET
  Output :   A=status
Resetuje FDC kontroler. Tutu sluzbu je vhodne zavolat vzdy na zaciatku prace s FDC-biosom.

  Sluzba :   01
  Nazov :   STATUS
  Output :   A=status
Vracia v registri A status. Inak nic ine nerobi. Status-bajt je popisany nizsie.

  Sluzba :   02
  Nazov :   RESTORE
  Output :   A=status
Presunie hlavicku aktivovanej mechaniky na nultu stupu.

  Sluzba :   03
  Nazov :   SEEK
  Input :   D=stopa
  Output :   A=status
Presunie hlavicku aktivovanej mechaniky na danu stopu.

  Sluzba :   04
  Nazov :   RDSEC
  Input :   DE=fyzicke cislo sektora, HL=adresa
  Output :   A=status
Precitanie sektora DE z diskety na adresu HL.

  Sluzba :   05
  Nazov :   WRSEC
  Input :   DE=fyzicke cislo sektora, HL=adresa
  Output :   A=status
Zapis sektora DE na disketu z adresy HL.

  Sluzba :   06
  Nazov :   RDTRK
  Input :   D=stopa, bit 7,E=strana, HL=adresa
  Output :   A=status
Precitanie stopy z diskety na adresu HL.

  Sluzba :   07
  Nazov :   WRTRK
  Input :   D=stopa, bit 7,E=strana, HL=adresa
  Output :   A=status
Zapis stopy na disketu z adresy HL. Tato funkcia sa pouziva pri formatovani diskety.

  Sluzba :   08
  Nazov :   RDADD
  Input :   D=stopa, bit 7,E=strana, HL=adresa
  Output :   A=status
Precitanie identifikacie sektora z diskety na adresu HL.

  Sluzba :   09
  Nazov :   REZIM
  Input :   E=0 pre DD, 1 pre HD, 2 pre ED, ...
  Output :   Z=rezim nastaveny, NZ=error
Nastavenie hustoty zaznamu na aktivovanej mechanike. Ak je pri navrate priznak NZ tak mechanika dany rezim nepodporuje.

  Sluzba :   0C
  Nazov :   AKTIVE
  Input :   E=cislo mechaniky
  Output :   A=vysledok
Aktivizuje danu mechaniku (roztoci motor a povoli enable) Ak bola pred tym niektora mechanika aktivna, vypne ju volanim PASIVE. Vysledok aktivizacie danej mechaniky moze byt:
 Vysledok   Chyba   Vyznam
 0   unknown disk   taka mechanika neexistuje
 1   disk not ready   v mechanike nie je disketa (alebo otvorene dvierka)
 2   disk activated   disk aktivny, disketa nebola vymenena
 3   disk activated   disk aktivny, ale bola vymenena disketa
Po neuspesnych pripadoch 0 a 1 ostanu vsetky mechaniky vypnute.

  Sluzba :   0D
  Nazov :   PASIVE
Vypina aktivnu mechaniku (zdrusi enable). Ci povypina aj tociace sa motory, to zavisi od nastavenia SETOFF.

  Sluzba :   0E
  Nazov :   INFO
  Input :   E=cislo mechaniky
  Output :   DE=informacie o mechanike: D=pocet stop, E=podporovane rezimy
Tato sluzba vracia tieto informacie o danej mechnike. Podporovane rezimy su urcene bitmi v E takto: bit 0=DD, bit 1=HD a bit 2=ED rezim hustoty zaznamu. Ak dana mechanika neexistuje, v registri DE sa vrati nula.

  Sluzba :   0F
  Nazov :   SETMAX
  Input :   BC=maximalna prenasana dlzka
Nastavuje maximalny pocet bajtov, ktory prenesie DMA kontroler pri vykonavani sluzieb RDSEC az RDADD. Vyznam to ma vtedy, ak nie je vopred znamy pocet bajtov ktore sa maju nacitat pri volani tychto sluzieb. [napr. pri citani stopy, alebo ak nie je znama dlzka sektora] Obsluha si takto moze velmi jednoducho zabezpecit, aby citane data ani omylom nepremazali cast pamete ktora lezi nad buffrom pre citane data.

  Sluzba :   10
  Nazov :   SETMLT
  Input :   HL=adresa rutinky, alebo nula
Kedze pocas samotneho prenosu dat medzi diskom a pametou nie je potrebna ucat procesora, moze sa procesor venovat inej cinnosti. Pomocou tejto sluzby sa FDC-biosu odovzdava adresa rutinky, ktora bude zavolana prave pocas tohto prenosu dat. Rutinka moze vykonavat lubovolnu cinnost, ale kedze sa tato rutinka vola pocas DMA operacie s diskom, su na nu kladene tieto obmedzenia:

  Sluzba :   11: SETOFF
  Input :   E=mod vypinania motorov (0=vypinaj, #FF=nevypinaj)
Tu sa urcuje, ci sluzba PASIVE bude (E=#00) alebo nebude (E=#FF) vypinat aj motor pri deaktivacii mechaniky. Nevypinat motor ma vyznam napriklad vtedy, ked sa kopiruje velmi vela dat (nezmestia sa naraz do pamete) medzi dvomi mechanikami - netreba zbytocne cakat na roztacanie motorov mechanik.

Fyzicke cislo sektora v registri DE sa sklada z tychto udajov:

  bit 0-7,D ... cislo stopy
  bit   7,E ... strana
  bit 0-6,E ... cislo sektora na stope D

Mnohe sluzby vracaju v registri A strukturu zvanu status. Status je bajt, ktory specifikuje vysledok diskovej operacie - kazdy bit ma svoj vyznam. Ak je bit jednotkovy, znamena to ze nastala specifikovana chyba. V poslednom stlpci su napisane sluzby, ktorych sa tyka dana chyba a teda pri ktorych ma vyznam testovat tento bit.

Bit Chyba Vyznam chyby Sluzby
0 time out operacia trvala dlhsie, ako sa patri 04 05 06 07 08
1 disk not ready mechanika nie je pripravena 04 05 06 07 08
2 lost data chyba pri prenose dat disk-pamet 04 05 06 07 08
track 0 hlava je na stope 0 00 01 02 03
3 CRC error nesedi kontrolny sucet pri citani 04 08
4 record not found nenasiel sa sektor 04 05 08
seek error nepodarilo sa najst nultu stopu 02
5 break pri diskovej operacii bolo stlacene QW 04 05 06 07 08
6 write protect disk chraneny proti zapisu 00 01 02 03 05 07
7 disk not ready mechanika nie je pripravena 04 05 06 07 08

Track 0 vlastne ani nie je chyba, FDC radic tym oznamuje, ze hlava v disketovej v mechanike sa nachadza na nultej stope.
Disk not ready znamena ze prislusna sluzba bola zavolana bez uspesnej aktivizacie disketovej mechaniky sluzbou AKTIVE, alebo mechanika bola sice uspesne aktivovana ale uprostred operacie zahlasi ze nie je pripravena (napriklad ak uzivatel vytiahne disketu uprostred operacie). Rozdiel medzi bitmi 1 a 7 spociva v tom, ze pokym bit 1 je hlaseny FDC radicom, bit 7 je hlaseny priamo mechanikou.


BS-DOS

Jadro BS-DOSu je hardwerovo nezavisla cast operacneho systemu ktora poskytuje uzivatelovi vsetky mozne sluzby od tych nizsich ako napr. vypis jedneho znaku, nastavenie aktualnej mechaniky az po sluzby najvyssej urovne ako napr. emulacia load-save rutin na adresach #4C6 a #562 alebo interpret novych basicovych prikazov a funkcii pre pracu s diskami.

Sluzby operacneho systemu su logicky rozdelene do styroch skupin. Prvu skupinu tvoria sluzby #00-#0F a #34. Su to male pomocne podprogramy, ako napriklad vypis jedneho znaku, pipnutie alebo jednoduche prevody. Druhu skupinu tvoria sluzby #10-#1F a #30. Su to zakladne diskove operacie, ako napriklad nastavenie aktualneho disku, adresara, prepisanie adresarovej polozky, zistenie volneho miesta na diskete alebo zmazanie CACHE pameti. Tretiu skupinu tvoria sluzby #22-#2F a #33. Su to diskove operacie vyssej urovne ktore viac-menej zodpovedaju jednotlivym basicovym prikazom. Napriklad zmazanie suborov, presunutie do ineho adresara alebo katalog. Stvrtu skupinu tvoria sluzby #20,#21,#31,#32. Su to sluzby urcene na specialne ucely a pre uzivatela prakticky nepouzitelne. Sem patri emulacia romkovych load-save rutin (#4C6 a #562) a basicovy interpreter.

Niektore sluzby vracaju alebo vyzaduju zadat 32-bitovu hodnotu. Tato hodnota sa zadava vzdy v registroch DE a HL tak, ze plati: DEHL hodnota = 256^3*D + 256^2*E + 256^1*H + 256^0*L To znamena, ze v D je najvyssi bajt a v L najnizsi.

Sluzby oznacene hviezdickou vzdy vracaju v priznaku CY informaciu o tom, ako dopadli. V pripade, ze CY je pri navrate nastavene, sluzba prebehla v poriadku. Ak sa pri vykonavani sluzby vyskytne nejaka chyba, na ktoru uzivatel odpovie RETRY a sluzba potom prebehne v poriadku, tiez sa vrati s nastavenym CY. Ak vsak uzivatel odpovie ABORT, sluzba sa vrati s nulovym CY.

Vsetky sluzby BS-DOSu sa volaju instrukciou RST #20 pri nastrankovanej DOS-ramke, pricom v registri A je vzdy cislo volanej sluzby. V ostatnych registroch mozu byt dalsie parametre pre volanu sluzbu.

  Sluzba :   00
  Nazov :   GETVER
  Output :   BC=cislo verzie operacneho systemu (308)
DE=adresa 1024 bajtoveho buffera pre adresarove sektory
HL=adresa 1024 bajtoveho buffera pre vseobecne pouzitie
IX=adresa 256 bajtoveho buffera pre boot a udaje pre hlasenia
IY=adresa 4096 bajtoveho buffera pre FATku
Tato sluzba poskutuje rozne informacie o dose. Aplikacne programy si pomocou nej mozu velmi lahko zistit s akou verziou dosu spolupracuju a predist tak niektorym komplikaciam ktore by vznikli keby program volal nejaku sluzbu v starsej verzii dosu, kde tato sluzba este nie je implementovana.
Buffer pre boot sektor obsahuje prvych 128 bajtov z boot sektora. Podobne tak buffer pre FATku. Ak je FATka kratsia ako 4 kB, zvysok buffera sa zaplni hodnotami #FF. Ak teda aplikacia z nejakych dovodov potrebuje nacitat informacie o disku z boot sektora a FATku, nemusi sa sama trapit s ich citanim cez FDC bios, ale staci ak zavola sluzbu
KUKNI alebo KUINI a tato sluzba zabezpeci aktualizaciu dat pre aktualny disk. Tymto sposobom pracuje napriklad utilitka DISKINFO.
Do buffera pre boot sektor sa tiez ukladaju rozne informacie o cinnosti systemu - napriklad informacie o chybe, ak nejaka nastane. Blizsie o tomto vid v popise sluzby SDMSX.

  Sluzba :   01
  Nazov :   DISP
  Input :   E=ascii kod vypisovaneho znaku
Print-rutinka vypisujuca jeden znak. Pozicia vypisu je dana systemovymi premennymi XXX a YYY, sposob vypisovania sa urcuje sluzbou SDDX a v pripade ze vypis prebieha na obrazovke su atributy vypisu urcene systemovou premennou COLOR. Tato sluzba nevie spracuvat ziadne riadiace kody ako napr. CR,LF. Vypisuje iba platne vypisatelne znaky od kodu #1E vyssie. Znak s kodom #1E je maly podciarnik a #1F je stvorcek, presne tak, ako je to aj v BS ROM 118.

  Sluzba :   02
  Nazov :   ENTER
Presunie kurzor vypisovania na zaciatok dalsieho riadku tak, ze do zvysku riadku na ktorom je kurzor az do konca riadku vypisuje medzery. Nema ziadne vstupne alebo vystupne parametre.

  Sluzba :   03
  Nazov :   TAB
  Input :   E=cislo stlpca
Vypisuje medzery dovtedy, pokym pozicia vypisu nebude v danom stlpci.

  Sluzba :   04
  Nazov :   TXXT
  Input :   HL=adresa textu
Vypisuje text ulozeny na danej adrese. Text musi koncit bajtom nula.

  Sluzba :   05
  Nazov :   DEC8X
  Input :   E=hodnota, C=znak pre nevyznamne nuly
Vypisuje osembitove desiatkove cislo, pricom naniesto zaciatocnych nul vypise znak v registri C. Ak teda chcete mat cisla zarovnane vpravo, vlozte do C medzeru, ak chcete mat vypisane iba platne cislice, vlozte do C kod #00. Na samotny vypis znakov sa vola sluzba DISP.

  Sluzba :   06
  Nazov :   DEC16X
  Input :   HL=hodnota, C=znak pre nevyznamne nuly
Vypisuje 16-bitove cislo, inak presne tak isto ako DEC8X.

  Sluzba :   07
  Nazov :   DEC32X
  Input :   DEHL=hodnota, C=znak pre nevyznamne nuly, B=maximalna dlzka cisla (max.10 znakov)
Vypisuje 32-bitovu hodnotu ako desiatkove cislo. Ak chcete aby dlzka cisla nepresiahla napr. 8 znakov, vlozte do registra B hodnotu 8.

  Sluzba :  08   Sluzba :  09   Sluzba :  0A   Sluzba :  0B
  Nazov :  DEC32   Nazov :  INC32   Nazov :  ADD32   Nazov :  SUB32
  Input :  DEHL   Input :  DEHL   Input :  DEHL,BC   Input :  DEHL,BC
  Output :  DEHL = DEHL-1    Output :  DEHL = DEHL+1    Output :  DEHL = DEHL+BC    Output :  DEHL = DEHL-BC 
Tieto styri sluzby sluzia pre 32-bitovu aritmetiku. Je pravda, ze taketo trivialne veci si kazda aplikacia v pohode urobi sama, ale preco ich nedat do tabulky sluzieb, ked v dose uz taketo rutinky su hotove ?

  Sluzba :   0C
  Nazov :   SDDX
  Input :   E=mod vypisu
Urcenie sposobu vypisovania znakov pre sluzbu DISP.
E=0 znamena ze sluzba DISP bude vypisovat znaky normalne na obrazovku. Pozicia vypisu je dana systemovymi premennymi XXX (stlpec) a YYY (riadok). Po kazdom vypisanom znaku sa pozicia posunie doprava, alebo na zaciatok dalsieho riadku, ak je uz celkom na kraji. A je na poslednom riadku, presunie sa na prvy riadok obrazovky. E=1 sposobi vypis znakov tak, ze sa budu bude ukladat do pameti na adresu danu systemovou premennou XXX (nizsi bajt) a YYY (vyssi bajt). Toto vypisovanie "do pameti" sa da velmi vyhodne pouzit napr. ak chcete vypisat 32-bitove cislo, ale chcete pouzit nejaku vlastnu print-rutinku. Pomocou SDDX nastavite vypisovanie do pameti, do XXX ulozite adresu nejakeho buffera, zavolate sluzbu
DEC32X, no a v bufferi mate toto cislo v textovom tvare a mozete ho vypisat vlastnou print-rutinkou.

  Sluzba :   0D
  Nazov :   BEEP
Pipnutie na AY - nemeni farbu borderu. Ton sa vytvara rychlym striedanim hodnot #00 a #0F v registri #0A (hlasitost kanalu C). Ak prave na AY hraje nejaka hudba z prerusenia, potom piputie bude "modulovane" touto hudbou. Po pipnuti sa do registra #0A vrati povodna hodnoda aku mal pred zaciatkom pipnutia. Ostatne registre AY sa pri pipnuti ani nenastavuju ani nemenia.

  Sluzba :   0E
  Nazov :   PREVODX
  Input :   HL=logicke cislo sektora, E=pocet sektorov na stopu
  Output :   HL=DE=fyzicke cislo sektora
Cely BS-DOS pracuje s logickymi cislami sektorov, avsak FDC-BIOS pracuje iba s vyhradne fyzickymi cislami. Preto vzdy vtedy, ked treba v BS-dose zavolat nejaku sluzbu FDC-biosu tak sa pred tym vola tato sluzba PREVODX.

  Sluzba :   0F
  Nazov :   HOWSEC
  Input :   DEHL=dlzka suboru
  Output :   BC=pocet sektorov ak je nastavene zero, inak chyba
Tato sluzba vypocita, kolko sektorov by na disku zaberal subor s dlzkou DEHL. Ak by mal pocet sektorov presiahnut 65536, tak do BC sa ulozi iba dolnych 16 bitov tejto hodnoty a vynuluje sa priznak zero (NZ). Ak je pocet sektorov pod 65536 tak bude zero nastavene (Z).

  Sluzba :   10 *
  Nazov :   KUKNI
Aktualizacia vnutornych CACHE pameti. Skontroluje disketu v aktualnej mechanike a nastavi podla nej obsah tychto pameti.

  Sluzba :   11 *
  Nazov :   KUINI
Aktualizacia CACHE pameti ako KUKNI, ale s tym ze pred tym vymaze stary obsah pameti (interne vola KILLX. To znamena, ze vzdy dojde z znovunacitaniu vsetkych informacii z diskety.

  Sluzba :   12 *
  Nazov :   GETCST
  Output :   D=aktualny adresar, E=aktualny disk, HL=load-kurzor
Tato sluzba zistuje aktualnu cestu (disk a adresar) a na ktorom subore je pretocena virtualna kazeta. Nasledujuce tri sluzby zase naopak umoznuju tieto tri parametre nastavovat.

  Sluzba :   13
  Nazov :   SETDRV
  Input :   E=cislo mechaniky
Nastavenie aktualnej mechaniky. Ak uzivatel nastavi mechaniku, ktora fyzicky neexistuje, chyba nenastane hned ale az pri fyzickom pristupe na tuto mechaniku.

  Sluzba :   14 *
  Nazov :   SETDIR
  Input :   E=cislo adresara
Nastavenie aktualneho adresara na diskete vlozenej do aktualnej mechaniky.

  Sluzba :   15 *
  Nazov :   SETLCX
  Input :   BC=load-kurzor
Pretocenie virtualnej kazety na subor s cislom BC na diskete vlozenej do aktualnej mechaniky. Znamena to, ze pri volani load-rutinky na #562 sa bude prave tento subor ako prvy spracuvat.

  Sluzba :   16 *
  Nazov :   GETSUB
  Input :   BC=cislo suboru (load-kurzor), IX=adresa 32-bajtoveho buffera
  Output :   zero=platnost udajov v bufferi (NZ=ok, Z=chyba)
Tato sluzba vrati v bufferi 32-bajtovu adresarovu polozku daneho suboru. V pripade ze adresarova polozka s takymto cislom neexistuje, t.j. adresar je kratsi ako udaj v registri BC, tak sluzba sa vrati s nastavenym zero-priznakom. Presna specifikacia struktury adresarovej polozky je v casti popisujucej format diskety.

  Sluzba :   17
  Nazov :   (neobsadene)

  Sluzba :   18 *
  Nazov :   KOLKOX
  Output :   DE=pocet adresarovych poloziek v aktualnom adresari
Tato sluzba vracia inymi slovami povedane dlzku aktualneho adresara. Ma to vyznam vtedy, ak chcete do pameti nacitat adresar sluzbou GETSUB a potrebujete zistit ze kolko poloziek sa v adresari nachadza.

  Sluzba :   19 *
  Nazov :   SEASX
  Input :   HL=adresa 10-znakoveho mena, E=typ suboru
  Output :   zero=priznak ci sa take meno naslo
Hladanie suboru s danym menom a typom v aktualnom adresari. Meno musi byt 10 znakove. V registri E je typ suboru (0=basic;1,2=data,3=bytes;...atd) Ak je v E hodnota 255 tak typ suboru sa nekontroluje a porovnava sa iba 10 znakove meno. Tato sluzba pracuje tak, ze hlada dany subor od aktualnej pozicie load-kurzoru smerom ku koncu adresara. Ked sa dostane na koniec, pokracuje zase od zaciatku adresara. Hladanie konci vtedy, ak sa alebo dany subor najde alebo ak sa pride na vychodiskove miesto hladania. Ak sa dany subor najde, load-kurzor sa nan nastavi a sluzba sa vrati s nastavenym zerom (Z), ak sa nenajde, load-kurzor sa nemeni a bude NZ. Tato sluzba sa vyuziva napriklad vtedy, ak do basicoveho prikazu pre nastavenie load-kurzora ` (libra) zadate retazcovy parameter (meno suboru).

  Sluzba :   1A *
  Nazov :   SEADX
  Input :   HL=adresa 10-znakoveho mena
  Output :   zero=priznak ci sa take meno naslo, A=cislo adresara (ak sa nasiel)
Hladanie adresara s danym menom. Tato sluzba pracuje tak, ze hlada dany adresar smerom k adresaru 255. Ked sa tam dostane, pokracuje zase od adresara 0. Hladanie konci vtedy, ak sa alebo dany adresar najde alebo ak sa pride na vychodiskove miesto hladania. Ak sa dany adresar najde, sluzba vrati jeho cislo v registri A s nastavenym zerom (Z), ak sa nenajde, bude NZ. Tato sluzba sa vyuziva napriklad vtedy, ak do basicoveho prikazu pre nastavenie adresara $ zadate retazcovy parameter (meno adresara).

  Sluzba :   1B *
  Nazov :   OWSUB
  Input :   HL=cislo suboru, IX=adresa 32-bajtoveho buffera
Prepisanie adresarovej polozky. V bufferi sa musi nechadzat nova polozka, ktorou sa nahradi stara adresarova polozka patriaca suboru s cislom HL. Ak subor s cislom HL neexistuje, t.j. adresar je kratsi ako HL, vtedy sa nevykona ziadna cinnost.
Tuto sluzbu pouzivajte velmi opratrne, lebo jej neuvazenym pouzitim mozno velmi lahko pokazit integritu dat ulozenych na diskete. Odporucany postup pouzitia je takyto: Najpr si sluzbou GETSUB ulozte danu polozku do buffera, potom spravte v polozke ulozenej v bufferi potrebne zmeny a nakoniec sluzbou OWSUB uz modifikovanu polozku ulozte spet na disk. Menit mozete datum, cas, udaje v magnetofonovej hlavicke a adresu tela. Ostatne udaje sa neoporuca menit. V ziadnom pripade nemente zaciatocny sektor suboru !!! Tutu sluzbu vyuziva napriklad basicovy prikaz .RENAME.

  Sluzba :   1C
  Nazov :   (neobsadene)

  Sluzba :   1D
  Nazov :   (neobsadene)

  Sluzba :   1E
  Nazov :   KILLX
Zmazanie vnutornych CAHCE pameti pre disketu. Tuto sluzbu je potrebne zavolat vzdy vtedy, ked sa boli zmenene data na diskete inak ako prostrednictvom basicovych prikazov alebo standartnych sluzieb BS-dosu. Vyuziva ju napr. formatovaci program.

  Sluzba :   1F *
  Nazov :   FREEX
  Output :   DEHL=volne miesto v bajtoch, BC=volne miesto v sektoroch
Vracia velkost volneho miesta na diskete v aktualnej mechanike.

  Sluzba :   20 *
  Nazov :   EMM562
Emulacia rom-load rutinky na adrese #562, pre uzivatela inak nezaujimave. Emuluje aj load, aj verify. Vyuzivaju sa pri tom sluzby LOA1X a VERIX.

  Sluzba :   21 *
  Nazov :   EMM4C6
Emulacia rom-save rutinky na adrese #4C6, pre uzivatela inak nezaujimave. Vyuzivaju sa pri tom sluzby CREATX, SAVEX a VERIX.

  Sluzba :  22   Sluzba :  23   Sluzba :  24   Sluzba :  25
  Nazov :  LOA1X       Nazov :  LOA2X       Nazov :  VERIX       Nazov :  SAVEX    
  Input :   HL=cislo suboru, IX=adresa pameti, BC=zaciatocny sektor, E=pocet sektorov
Toto su styri komplexne sluzby, pomocou ktorych je mozne citat (LOA1X,LOA2X), zapisovat (SAVEX) alebo skontrolovat (VERIX) urcitu cast suboru. HL obsahuje cislo suboru ktore specifikuje subor, s ktorym sa bude pracovat, IX ukazuje na zaciatok pameti kam sa bude loadovat, pripadne odkial sa bude sejvovat alebo obsah ktorej sa skontroluje s obsahom suboru. BC je poradove cislo znamenajuce od ktoreho sektora zacina cast suboru s ktorou budeme pracovat. Sektory sa pocitaju od nuly, cize BC=0 je uplne prvy sektor suboru. E je pocet sektorov ktore loadujeme, sejvujeme alebo verifikujeme. Sucet BC+E nesmie byt vecsi ako celkovy pocet sektorov daneho suboru. Celkovy pocet sektorov sa najjednoduchsie da zistit pouzitim sluzby
HOWSEC.
Roziely medzi LOA1X a LOA2X su tieto: Ak dlzka suboru nie je celociselny nasobok 1024, potom LOA1X nahrava iba prislusnu cast posledneho sektora, zatial co LOA2X nahrava cely posledny sektor. Ak by sa mali nahravane data ulozit pod adresu #4000 tak LOA1X tieto data neuklada do pameti. Tym je operacny system chraneny pred prepisanim. Naproti tomu LOA2X nic nekontroluje a nahrava vzdy cele sektory. Tymto padom je LOA1X bezpecnejsie, ale LOA2X je rychlejsie a mozno tym nahravat aj pod #4000.
VERIX je normalne verify, to znamena ze fyzicky kontroluje obsah danej casti suboru s obsahom pameti. V pripade zistenej nezhody vypise chybovy oznam, v ktorom uvedie adresu prveho a posledneho nezhodneho bajtu a tiez celkovy pocet nezhodnych bajtov.

  Sluzba :   26 *
  Nazov :   CREATX
  Input :   IX=adresa 32-bajtovej adresarovej polozky
  Output :   HL=cislo vytvoreneho suboru
Alokacia miesta na disku pre dany subor. Tato sluzba pracuje tak, ze najprv najde volnu polozku v adresari, do nej presunie danu adresarovu polozku z adresy IX, podla dlzky tela v tejto polozke naalokuje prislusny pocet volnych sektorov vo FATke na disku a do adresarovej polozky nastavi cislo prveho sektora. Tymto pripravi dany subor tak, aby sluzba SAVEX do neho mohla priamo ulozit dany obsah.

  Sluzba :   27 *
  Nazov :   UTRASX
Utrasenie aktualneho adresara, presne ako basicovy prikaz .PRESS.

  Sluzba :   28 *
  Nazov :   ERASEX
  Input :   BC=cislo suboru
Zmazanie daneho suboru v aktualnom adresari. Ak BC=0 tak sa zmaze cely adresar. Ak je adresar neprazdny, t.j. (obsahuje nezmazane subory) tak sa este pred zmazanim vypise otazka ktorou je treba potvrdit zmazanie vsetkych suborov v tomoto adresari.

  Sluzba :   29 *
  Nazov :   ERASIX
  Input :   BC..HL=interval suborov
Zmazanie suborov pocnuc BC-tym az po HL-ty subor vcitane. Mazanie celeho intervalu suborov naraz ma tu velmi velku vyhodu ze je to ovela ovela ovela rychlejsie ako mazanie suboru po jednom a viac sa pri tom setri disketa - napriklad tak ze FATka sa zapisuje iba raz na konci po zmazani vsetkych suborov v intervale.

  Sluzba :   2A *
  Nazov :   MOVEXX
  Input :   BC=cislo suboru, E=cielovy adresar
Presunutie suboru BC do adresara E. Funguje presne ako basicovy prikaz .MOVE BC,E. Ak cielovy adresar a aktualny je ten isty, tak sa dany subor iba presunie na koniec tohto adresara. Toto sa da velmi dobre pouzit na usporaduvanie suborov v adresari. Ak BC=0 (presunutie celeho adresara) tak potom sa len aktualny adresar vymeni so specifikovanym.

  Sluzba :   2B *
  Nazov :   MOVEIX
  Input :   BC..HL=interval suborov, E=cielovy adresar
Presunutie intervalom specifikovanych suborov do adresara E. Funguje presne tak isto ako basicovy prikaz .MOVE E;BC TO HL. Subory sa postupne jeden po druhom pocinajuc suborom BC a konciac suborom HL presuvaju do adresara E presne tak isto ako v sluzbe MOVEXX.

  Sluzba :   2C *
  Nazov :   CATX
  Input :   BC=specifikacia adresara
Vypis katalogu specifikovaneho adresara. Ak B=1 tak sa bude vypisovat aktualny adresar, ak B=0 tak sa bude vypisovat adresar C. To, ci sa budu vypisovat aj zmazane subory je urcene nultym bitom systemovej premennej OPTIO. Ako print-rutinka sa pri vypisovani adresara pouziva sluzba DISP.

  Sluzba :   2D *
  Nazov :   SEAXXX
  Input :   BC=dlzka retazca (max 10), DE=adresa retazca
Hladanie retazca vo vsetkych menach suborov a adresarov. Je to vlastne to iste ako basicovy prikaz .SEARCH. To, ci sa budu vypisovat aj zmazane subory je urcene nultym bitom systemovej premennej OPTIO. Ako print-rutinka sa pri vypisovani adresara pouziva sluzba DISP.

  Sluzba :   2E *
  Nazov :   CATXD
  Input :   BC=specifikacia adresara, L=cislo mechaniky
Pracuje presne tak isto ako CATX ale vypisuje katalog aktualneho adresara na diskete v mechanike L. Je to vlastne basicovy prikaz CAT #L.

  Sluzba :   2D *
  Nazov :   SEAXXD
  Input :   BC=dlzka retazca (max 10), DE=adresa retazca, L=cislo mechaniky
Pracuje presne tak isto ako SEAXXX ale prehladava mena a adresare na diskete v mechanike L. Je to vlastne basicovy prikaz SEARCH #L,"retazec" .SEARCH #L.

  Sluzba :   30
  Nazov :   START
Start operacneho systemu po nabootovani zo systemovej diskety. V podstate nerobi nic ine len interne vykona prikaz NEW "autosys". Pre uzivatela nema ziadny iny prakticky vyznam.

  Sluzba :   31
  Nazov :   BASIC
Interpret novych basicovych prikazov. Pre uzivatela nema ziadny prakticky vyznam.

  Sluzba :   32
  Nazov :   FUNKC
Interpret novych basicovych funkcii. Pre uzivatela nema ziadny prakticky vyznam.

  Sluzba :   33 *
  Nazov :   FORMX
Rychly format diskety. Je to vlastne vykonna rutinka prikazu .FORMAT. Pred zmazanim celej diskety sa este vypise otazka, ktorou je treba zmazanie diskety potvrdit. Pokial na takto sformatovanu disketu neboli sejvnute nove subory, je mozne stare subory obnovit pomocou sluzieb UNERAX a UNERIX.

  Sluzba :   34 *
  Nazov :   MESSX
  Input :   HL=adresa textu
  Output :   carry=priznak reakcie uzivatela
Tato sluzba robi nasledujucu cinnost: Najpr si odpameta obrazovku, potom zobrazi standartne chybove okienko, do ktoreho napise dany text. V okienku sa tiez vypise toto: ENTER=OK/RETRY,SPACE=ABORT. Po zobrazeni okienka sa caka na stlacenie enteru alebo medzery. Ked uzivatel stlaci jednu z tychto dvoch klaves, okienko sa zmaze, na obrazovku sa vrati jej povodny obsah a sluzba v CY vrati informaciu o tom, aku klavesu stlacil uzivatel. Ak stlacil ENTER bude C, ak medzeru bude NC. Pozor ! Dolezite: Text nesmie byt dlhsi ako 28 bajtov a musi koncit bajtami #00,#C9. Napriklad musi vyzerat nejak takto: DB 'bla-bla-bla',#00,#C9

  Sluzba :   35 *
  Nazov :   SDMSX
  Input :   HL=adresa rutinky
Presmerovanie vypisov oznamov a chybovych hlaseni. BS-DOS obsahuje v sebe rutinku, ktora vsetky oznamy a chybove hlasenia vypisuje do ramika v hornej tretine obrazu. Niekedy ale ale vhodne, ak ma uzivatel moznost si napisat vlastnu rutinku, ktora mu bude vypisovat chyby a reagovat na klavesy tak ako sa to dizajnovo hodi do jeho uzivatelskeho programu. Prave na tento ucel je tu tato sluzba. V registri HL musi byt adresa obsluznej rutinky na vypis chyboveho hlasenia. Ak je v HL nula, nastavi sa vnutorne vektor vypisovej rutinky na defaultnu vnutornu rutinku.

  Sluzba :   36 *
  Nazov :   UNERAX
  Input :   BC=cislo suboru
Obnovenie daneho suboru v aktualnom adresari. Ak BC=0 tak sa obnovi zmazany adresar. Pri obnovovani adresara sa subory v nom neobnovuju automaticky. Touto sluzbou sa da do povodneho stavu obnovit disketa, ktora bola zmazana QuickFormatom (sluzbou FORMX.

  Sluzba :   36 *
  Nazov :   UNERIX
  Input :   BC..HL=interval suborov
Obnovenie suborov pocnuc BC-tym az po HL vcitane. Obnovenie celeho intervalu suborov naraz ma tu velmi velku vyhodu ze je to ovela ovela ovela rychlejsie ako obnovenie suboru po jednom a viac sa pri tom setri disketa - napriklad tak ze FAT sa zapisuje iba raz na konci po obnoveni vsetkych suborov v intervale. Poznamka: Ak nastane pri niektorom subore z intervalu chyba "Can't unerase" tak vsetky subory z tohto intervalu ostanu v povodnom stave a ani jeden nebude obnoveny.

Blizsi popis k sluzbam MESSX a SDMSX

Uzivatelska rutinka vypisujuca oznam alebo chybove hlasenie dostane potrebne informacie umiestnene v pameti - konkretne v pomocnom datovom bufferi, ktoreho bazovu adresu (zaciatok) vracia sluzba GETVER v registri IX. V tomto bufferi sa pri potrebe vypisat nejaky oznam alebo chybove hlasenie nachadzaju taketo udaje:

 Adresa   Vyznam 
 buffer+#80   text oznamu alebo chyboveho hlasenia ukonceny bajtom #00
 buffer+#C0   fyzicke cislo sektora (dva bajty), pri ktorom doslo ku chybe
 buffer+#C2   cislo sektora na stope (vypocitane z fyzickeho cisla)
 buffer+#C3   hodnota atributov pre vypis hlasenia

Ak je cislo sektora (buffer+#C2) nula, potom sa jedna o obycajny oznam (napr generovany sluzbou MESSX a vtedy udaje o cisle sektora nemaju ziadny vyznam.

Rutinka musi nielen vypisat hlasenie, ale aj spracovat uzivatelovu volbu medzi moznostami RETRY alebo ABORT. Na vystupe z rutinky musi byt v CARRY priznak pozadovanej volby: CY=1 pre retry a CY=0 pre abort.

Pri praci moze tato rutinka vyuzivat sluzby #00 az #0F operacneho systemu. Nesmie nic robit s diskom a ani volat sluzby dosu pracujuce s diskom. Moze menit vsetky registre.

Niektore systemove premenne BS-dosu:

 Adresa   Nazov  Vyznam 
 03E0XXX  stlpec alebo nizsi bajt pozicie vypisu
 03E1YYY  riadok alebo vyssi bajt pozicie vypisu
 03E2 COLOR   farba vypisu, ak vypis prebieha na obrazovku
 03E3 OPTIO   rozne priznaky prace BS-dosu (jednotlive bity)
 03EEDISK  cislo aktualnej mechaniky - nastavuje sluzba SETDRV 

Bity systemovej premennej OPTIO:

 Bit   Vyznam bitu
0   Sposob vypisu katalogu a prehladavania adresarov
 0    berie do uvahy iba platne subory
 1    berie do uvahy aj zmazane adresarove polozky
1   Sposob vypisu katalogu
 0    vypisuje od zaciatku katalogu (od suboru 1)
 1    vypisuje od aktualnej pozicie load-kurzora
2-6  neobsadene (mali by ostat nulove)
7   Nacitavanie disku pred zapisovymi operaciami
 0    vzdy nanovo nacita potrebne informacie z diskety
 1    berie informacie z CACHE pamete (ak tam su)

Nazad / back