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.
Precitanie sektora DE z diskety na adresu HL.
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:
- nesmie rusit prenos dat - nesmie siahat na DMA, FDC a porty mechanik
- nemala by obsahovat presne casove slucky, lebo DMA prenos spomaluje procesor)
- nemala by trvat viac ako 5-10 ms, ale nie je to kriticke
- musi sa poctivo vratit instrukciou RET naspet do DOS-ramky
- moze menit vsetky registre
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.
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 |
03E0 | XXX |
stlpec alebo nizsi bajt pozicie vypisu
|
03E1 | YYY |
riadok alebo vyssi bajt pozicie vypisu
|
03E2 | COLOR |
farba vypisu, ak vypis prebieha na obrazovku
|
03E3 | OPTIO |
rozne priznaky prace BS-dosu (jednotlive bity)
|
03EE | DISK |
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