Sluzby BIOS pro praci s obrazovkou

Volani BIOS
     BIOS je tady k tomu, aby vam zajistil kompatibilitu
programu na ruznych pocitacich a grafickych kartach.
Samozrejme, ze muzete grafickou kartu ovladat primo pomoci
registru a zapisovat primo do videopameti. Musite vsak
vsechny programy psat tolikrat, kolik je ruznych grafickych
karet, na nichz ma vas program pracovat. Muzete vsak pouzit
BIOS, tomu predate pouze parametry a on uz vse udela za vas,
at mate v pocitaci jakoukoliv grafickou kartu. Je
samozrejme, ze za tuto flexibilitu zaplatite. Tim, ze BIOS
podporuje velke mnozstvi karet, nejsou jeho rutiny tak
rychle. Nemohou totiz vyuzivat specialnich vlastnosti
jednotlivych adapteru. Pokud tedy potrebujete neco udelat
opravdu rychle a efektivne, musite sahnout k programovani
registru a primemu zapisu do pameti.
     Volani videosluzeb BIOS se provadi pomoci interruptu
10h. Predtim nez ho zavolate, musite do registru AH ulozit
cislo sluzby a do ostatnich registru pripadne parametry,
ktere tato sluzba vyzaduje. K volani sluzeb BIOS je
samozrejme nejvhodnejsi pouzivat assembler, ale je mozne je
volat i z vyssich programovacich jazyku. Nektere
programovaci jazyky umoznuji primo zapisovat do zdrojoveho
textu assembler. Nebo disponuji funkcemi k volani sluzeb
BIOS (v Turbo Pascalu je to napriklad procedura INTR).
Nasledujici priklad nam ukaze, jak nastavit zobrazovaci mod
3, tj. text 80 sloupcu a 25 radek.

Assembler:
           mov   AH, 00h     ;sluzba 00h - nastaveni modu
           mov   AL, 03h     ;cislo modu
           int   10h         ;volani INT 10h

Turbo Pascal pomoci interniho assembleru:
           asm
             push  DS
             push  BP
             mov   AH, 00h     ;sluzba 00h - nastaveni modu
             mov   AL, 03h     ;cislo modu
             int   10h         ;volani INT 10h
             pop   BP
             pop   DS
           end;
pozn. Pred volanim INT 10h je v internim assembleru Turbo
      Pascalu vhodne ulozit obsah registru DS, BP. Tyto
      registry nesmi byt pro ostatni casti programu zmeneny
      a sluzba na INT 10h by je mohla zmenit.

Turbo Pascal pomoci procedury INTR:
           Var Reg: Registers;
           begin
             Reg.AH := 00;        ;sluzba 00h - nastaveni modu
             Reg.AL := 03;        ;cislo modu
             Intr($10, Reg);      ;volani INT 10h
           end;

V pripade, ze nektera sluzba vraci nejake vysledky, jsou
opet vraceny v registrech mikroprocesoru.

Sluzby BIOS pro praci s obrazovkou
     V teto kapitole popiseme sluzby 00h-00f interruptu
10h. Ty zbyvajici, ktere jsou specificke pro karty EGA a VGA
popiseme v nasledujici casti.

Sluzba 00h - Nastaveni zobrazovaciho modu
=========================================
Popis: Funkce se pouziva k nastaveni zobrazovaciho modu
     adapteru. Mohou se pomoci ni nastavovat textove rezimy
     a rezimy graficke: 320 x 200, 640 x 200, 640 x 350
     a 640 x 480. Pote mohou byt znaky na obrazovku
     zapisovany pomoci sluzeb 09h, 0ah, 0eh, 13h. Bod muzete
     zobrazit pomoci sluzby 0ch.

Vstup: AH = 00h  Cislo sluzby
       AL = Cislo zobrazovaciho modu (podle nasledujici
            tabulky)

     Mod  Grafika/Text       Pocet barev
     -------------------------------------------------
     00h  text 40 x 25       16 barev VGA, 16 odstinu sedi EGA
     01h  text 40 x 25       16 barev EGA,VGA
     02h  text 80 x 25       16 barev VGA, 16 odstinu sedi EGA
     03h  text 80 x 25       16 barev EGA/VGA
     04h  grafika 320 x 200  4 barvy
     05h  grafika 320 x 200  4 barvy VGA, 4 odstiny sedi EGA
     06h  grafika 640 x 200  2 barvy (jedna z nich je cerna)
     07h  text 80 x 25       monochromaticke zobrazeni
     0dh  grafika 320 x 200  16 barev EGA, VGA
     0eh  grafika 640 x 200  16 barev EGA, VGA
     0fh  grafika 640 x 350  monochrom. zobr. EGA, VGA
     10h  grafika 640 x 350  4 barvy (EGA 64K), 16 barev EGA, VGA
     11h  grafika 640 x 480  monochrom. zobr. VGA
     12h  grafika 640 x 480  16 barev VGA
     13h  grafika 320 x 200  256 barev VGA
     6ah  grafika 800 x 600  16 barev, pouze pokud karta podporuje VESA
 
Poznamka: Na adapteru EGA s monochromatickym monitorem
     pouzivejte pouze mody 07h a 0fh.

     Pokud nejvyssi bit AL nastavite na 1, pri inicializaci
     modu se zachova puvodni obsah obrazovky. Nastaveni
     nejvyssiho bitu provede tak, ze k cislu modu ulozenemu
     v registru AL prictete hodnotu 80h.

Sluzba 01h - Nastaveni tvaru textoveho kurzoru
==============================================
Popis: Tato funkce slouzi k definovani tvaru kurzoru. Muzete
     urcit pocatecni a koncovou radku, mezi kterymi bude
     vybarvena obdelnikova cast znakoveho boxu. Kurzor tedy
     nemusi zacinat na prvni a koncit na posledni radce.
     Muze byt klidne ve stredu znakoveho boxu. V grafickych
     modech kurzor neni.

     Pocatecni a koncova radka kurzoru jsou ulozeny v peti
     nejnizsich bitech. Bity 7, 6 a 5 by mely vzdy obsahovat
     nulu (na adapterech EGA a VGA, na ostatnich urcuji
     rychlost blikani kurzoru). Pokud chcete kurzor ucinit
     neviditelnym, nastavte jeho konec i pocatek pod znakovy
     box (tj. obe hodnoty budou vetsi nez 7). Pokud na EGA
     nastavite pocatecni radku vetsi nez koncovou, objevi se
     kurzor jako dve carky nad sebou (inverze kurzoru, ktery
     by se objevil, pokud by pocatecni a koncova radka byly
     vymeneny). Adapter VGA tento trik neumoznuje. Pokud je
     pocatecni radka vetsi nez koncova, kurzor se neobjevi.

     Jelikoz starsi textove mody podporovaly pouze
     osmiradkovy kurzor, musel byt v zajmu zachovani
     kompatibility udelan kompromis na novejsich textovych
     modech, ktere podporuji znaky se 14 nebo 16 radky.
     Pokud je cislo radku 0-3 povazuje se za horni radek
     a pokud je 4-7, povazuje se za dolni (hodnota 4-7 pak
     podle adapteru odpovida radkum 10-13 - EGA , pripadne
     12-15 - VGA). Pokud interval definice kurzoru
     obsahuje i radky 4 a 5 (v registrech ulozeno jako
     3 a 4) vyplni se i prostor mezi nimi.

Vstup: AH = 01h  Cislo sluzby
       CH = Pocatecni radka kurzoru (bity 0-4)
       CL = Koncova radka kurzoru (bity 0-4)

Sluzba 02h - Nastaveni pozice kurzoru
=====================================
Popis: Nastavi pozici kurzoru na obrazovce. Radka 0 je horni
     radka obrazovky a sloupec 0 je sloupec nejvice vlevo na
     obrazovce.

Vstup: AH = 02h  Cislo sluzby
       DL = Cislo radky
       DH = Cislo sloupce
       BH = Cislo stranky (vysvetleni co je stranka
            naleznete u popisu sluzby 05h)

Sluzba 03h - Cteni pozice a velikosti kurzoru
=============================================
Popis: Cte aktualni souradnice kurzoru v dane strance.
     Zjisti take velikost kurzoru (tak jak byl definovan
     sluzbou 01h).

Vstup: AH = 03h  Cislo sluzby
       BH = Cislo stranky

Vystup: Bude obsazen v registrech po zavolani sluzby
        DH = Aktualni radka, na ktere je kurzor
        DL = Aktualni sloupec, ve kterem je kurzor
        CH = Pocatecni radka kurzoru
        CL = Koncova radka kurzoru

Sluzba 04h - Cteni pozice svetelneho pera
=========================================
Popis: Tato sluzba zjistuje souradnice svetelneho pera v
     okamziku, kdy bylo stisknuto jeho tlacitko. Pokud je
     aktualni zobrazovaci rezim 4-6, graficky radek je
     vracen v registru CH. Pokud pouzivate nove EGA mody,
     cislo graficke radky sluzba ulozi do registru CX.

Vstup: AH = 04h  Cislo sluzby

Vystup: Bude obsazen v registrech po zavolani sluzby
        AH = 0   Nebylo stisknuto tlacitko na svetelnem
                 peru, informace v ostatnich registrech jsou
                 neplatne.
           = 1   Bylo stisknuto tlacitko na svetelnem peru,
                 informace v registrech plati.
        DH =     Znakova radka
        DL =     Znakovy sloupec
        CH =     Graficka radka (v modech 4-6)
        CX =     Graficka radka v novych EGA rezimech
        BX =     Graficky sloupec

Poznamka: Karta VGA nepodporuje praci se svetelnym perem.
       Volani teto sluzby, pokud mate VGA kartu postrada
       jakykoliv smysl.

Sluzba 05h - Vyber aktivni obrazove stranky
===========================================
Popis: Adapter muze mit v pameti najednou nekolik stranek
       (obsahu obrazovky). Ale pouze jedna z techto stranek
       muze byt zobrazovana. U vetsiny funkci BIOS, ktere
       zapisuji znaky na obrazovku, kresli bod, presouvaji
       kurzor atd., si muzete zvolit, do ktere stranky se
       jeji vystup promitne. Vyuzijete-li teto schopnosti
       graficke karty, muzete jednu stranku zobrazovat a ve
       druhe provadet zmeny. Pak obe stranky prepnout a nova
       stranka se zobrazi okamzite bez pomaleho
       vykreslovani. Toto se da vyhodne uplatnit napriklad
       pri animaci.

       Tato sluzba vam umozni zvolit stranku, ktera se bude
       zobrazovat. Obvykle se zobrazuje stranka 0 a do ni se
       take provadeji vsechny zmeny.

Vstup: AH = 05h  Cislo sluzby
       AL = Cislo stranky, ktera se ma zobrazit

Poznamka: Cisla stranek dostupnych v ruznych
       zobrazovacich rezimech udava nasledujici tabulka.
       Pokud obsahuje 0 znamena to, ze je dostupna jedna
       stranka s cislem 0, atd.

       Mod  64K   128K  256K - Velikost pameti videoadapteru
       ---------------------
       00h  0-7   0-7   0-7
       01h  0-7   0-7   0-7
       02h  0-3   0-7   0-7
       03h  0-3   0-7   0-7
       04h  0     0     0
       05h  0     0     0
       06h  0     0     0
       07h  0-3   0-7   0-7
       0dh  0-1   0-3   0-7
       0eh  0     0-1   0-3
       0fh  0     0-1   0-1
       10h  0     0     0-1
       11h  -     -     0      Pouze VGA
       12h  -     -     0      Pouze VGA
       13h  -     -     0      Pouze VGA

       Vsechny karty VGA maji nejmene 256K pameti, tzn.
       plati pro ne posledni sloupec tabulky.

Sluzba 06h - Rolovani aktivni obrazove stranky nahoru
=====================================================
Popis: Tato funkce roluje obsah obrazovky zezdola nahoru. Do
       spodni casti obrazovky jsou vkladany prazdne radky.
       Muzete specifikovat levy horni a pravy dolni roh
       okenka a rolovani pak bude probihat pouze v nem a ne
       na cele plose obrazovky. Tato funkce pracuje pouze s
       aktivni obrazovou strankou.

       Pokud zadate jako pocet radek k odrolovani 0, smaze
       se cela obrazovka (okno).

Vstup: AH = 06h  Cislo sluzby
       AL = Pocet radek k odrolovani (0 maze cele okno)
       BH = Atribut znaku pridavanych jako nova radka (viz.
                 sluzba 08h)
       CH = Horni okraj okna (cislo radky)
       CL = Levy okraj okna (cislo sloupce)
       DH = Dolni radka okna (cislo radky)
       DL = Pravy okraj okna (cislo sloupce)

Sluzba 07h - Rolovani aktivni obrazove stranky dolu
===================================================
Popis: Tato funkce roluje obsah okenka dolu. Prazdne radky
       jsou vkladany na hornim okraji okna. Tato sluzba
       pracuje stejne jako sluzba 06h, pouze smer rolovani
       textu je opacny.

Vstup: AH = 07h  Cislo sluzby
       AL = Pocet radek k odrolovani (0 maze cele okno)
       BH = Atribut znaku pridavanych jako nova radka (viz.
                 sluzba 08h)
       CH = Horni okraj okna (cislo radky)
       CL = Levy okraj okna (cislo sloupce)
       DH = Dolni radka okna (cislo radky)
       DL = Pravy okraj okna (cislo sloupce)

Sluzba 08h - Cteni znaku a jeho atributu na pozici kurzoru
==========================================================
Popis: Tato funkce slouzi k zjisteni kodu a atributu znaku
       na aktualni pozici kurzoru v libovolne obrazovove
       strance. Atribut znaku je jeden byte dlouha informace
       o zpusobu zobrazeni znaku podle nasledujici tabulky:

       /------------------------------------------------\
       |blikani|  barva pozadi  | inten- | barva znaku  |
       |       |                | zita   |              |
       |-------+----------------+--------+--------------|
  MSB  |   7   |  6  |  5  |  4 |   3    | 2  | 1 |  0  |
       \------------------------------------------------/

       Pro barevne monitory je prirazeni barev nasledujici:
       Bity 4-6 (barva pozadi):
            000 cerna        100 cervena
            001 modra        101 fialova
            010 zelena       110 hneda
            011 tyrkysova    111 bila

       Bity 0-3 (barva znaku):
            0000 cerna       1000 tmave seda
            0001 modra       1001 svetle modra
            0010 zelena      1010 svetle zelena
            0011 tyrkysova   1011 svetle tyrkysova
            0100 cervena     1100 svetle cervena
            0101 fialova     1101 svetle fialova
            0110 hneda       1110 zluta
            0111 svetle seda 1111 bila

       Na monochromatickych monitorech (neni myslen
       cernobily monitor, ktery se u nas casto pouziva
       v kombinaci s VGA kartou) by barva pozadi mela byt
       bud 0 (cerna) nebo 111b=07h (barevna). Barva znaku
       000b odpovida cerne, 001b - znak bude podtrzeny a
       111b - znak bude barevny. Hodnota atributu ma vyznam
       pouze v textovych rezimech.

Vstup: AH = 08h  Cislo sluzby
       BH = Cislo obrazove stranky

Vystup: Bude obsazen v registrech po zavolani sluzby
        AL = ASCII kod znaku
        AH = Atribut znaku (pouze v textovem rezimu)

Poznamka: U popisu sluzeb 10h a 11h naleznete mnoho dalsich
       informaci o atributech a znakovych sadach.

       Bit urcujici blikani muze byt preprogramovan tak, aby
       urcoval intenzitu barvy pazadi (pro pozadi pak muzeme
       pouzit take 16 barev). Toto nastaveni lze provest
       pomoci CRTC registru nebo volanim sluzby 10h a funkce
       03h interruptu 10h.

       Bit urcujici intenzitu barvy znaku muze byt
       preprogramovan tak, aby urcoval jednu ze dvou
       znakovych sad, z kterych se ziskavaji informace o
       tvaru znaku. Muzete tak v textovem rezimu pouzivat
       najednou 512 znaku.

Sluzba 09h - Zapsani znaku a atributu na pozici kurzoru
=======================================================
Popis: Tuto sluzbu muzete pouzit k zapsani znaku (nebo
       nekolika stejnych znaku) do libovolne z obrazovych
       stranek. Znak se objevi na pozici kurzoru, kterou
       muzete nastavit pomoci sluzby 02h.
       Atribut znaku ma nasledujici vyznam (pro textove
       rezimy):
       /------------------------------------------------\
       |blikani|  barva pozadi  | inten- | barva znaku  |
       |       |                | zita   |              |
       |-------+----------------+--------+--------------|
  MSB  |   7   |  6  |  5  |  4 |   3    | 2  | 1 |  0  |
       \------------------------------------------------/

       Pro barevne monitory je prirazeni barev nasledujici:
       Bity 4-6 (barva pozadi):
            000 cerna        100 cervena
            001 modra        101 fialova
            010 zelena       110 hneda
            011 tyrkysova    111 bila

       Bity 0-3 (barva znaku):
            0000 cerna       1000 tmave seda
            0001 modra       1001 svetle modra
            0010 zelena      1010 svetle zelena
            0011 tyrkysova   1011 svetle tyrkysova
            0100 cervena     1100 svetle cervena
            0101 fialova     1101 svetle fialova
            0110 hneda       1110 zluta
            0111 svetle seda 1111 bila

       Na monochromatickych monitorech (neni myslen
       cernobily monitor, ktery se u nas casto pouziva
       v kombinaci s VGA kartou) by barva pozadi mela byt
       bud 0 (cerna) nebo 111b=07h (barevna). Barva znaku
       000b odpovida cerne, 001b - znak bude podtrzeny a
       111b - znak bude barevny.

       V grafickem rezimu se byte atributu pouziva k urceni
       barvy znaku. Pokud s barvou zaroven nastavite bit 7
       na jedna, znak bude na obrazovku kreslen tak, ze se s
       jejim obsahem provede operace XOR. (Body na nez by se
       kreslil znak jsou zinvertovany.)

       Pokud tuto funkci pouzijete v textovem rezimu k
       zobrazeni vice znaku, ktere by se na radku nevesly,
       automaticky ve vypisovani pokracuje na zacatku
       dalsiho radku. V grafickem rezimu se vsechny znaky
       musi vejit na radku. (Pokud se nevejdou, vetsinou se
       presunou na dalsi radku, ale neposunou se dolu o 8
       pixelu, tj. vysku znaku, ale jen o jeden pixel.)

Vstup: AH = 09h  Cislo sluzby
       AL = ASCII kod znaku
       BH = Cislo obrazove stranky (gr. rezim 13h pouziva
                 tento byte k urceni barvy pozadi)
       BL = Atribut zobrazeni
       CX = Kolikrat se ma znak zobrazit

Poznamka: Pozice kurzoru po zavolani teto sluzby zustava
       nezmenena (i v pripade vystupu nekolika znaku).
       Umistovani kurzoru musi program obstaravat sam.

       Ridici znaky jako CR, LF, BS (Backspace) jsou
       zobrazeny jako znaky. Jejich spravna interpretace
       musi byt obsazena v programu napr. pomoci zmeny
       pozice kurzoru.

Sluzba 0ah - Zapsani znaku na pozici kurzoru
============================================
Popis: Tato sluzba je shodna se sluzbou 09h s tim rozdilem,
       ze nelze specifikovat atribut zobrazeni (ponecha se
       puvodni).

Vstup: AH = 0ah  Cislo sluzby
       AL = ASCII kod znaku
       BH = Pouzita obrazova stranky
       CX = Kolikrat se ma znak zobrazit

Sluzba 0bh - Nastaveni palety barev
===================================
Popis: Tato sluzba pracuje pouze v rezimech kompatibilnich s
       CGA. Pro nastaveni palety v EGA/VGA rezimech pouzijte
       sluzbu 10h.

       Obsah registru BH urcuje, co se vlastne bude
       nastavovat. Pokud obsahuje 0, nastavuje se barva
       pozadi (0-15) pripadne barva ramecku v textovych
       rezimech (0-31).  Pokud BH obsahuje 1, urcuje nejmene
       vyznamny bit registru BL jednu ze dvou palet:
       zelena, cervena a hneda nebo tyrkysova, fialova
       a bila.

Vstup: AH = 0bh  Cislo sluzby
       BH = Vyber palety k nastaveni
                 0 - pozadi/ramecek
                 1 - nastaveni palet barev
       BL = pro BH = 0 - barva pozadi (0-15) v grafickych
                       rezimech; v textovych rezimech barva
                       ramecku (0-31)
            pro BH = 1 - vyber palety
                         0 -> zelena, cervena, hneda
                         1 -> tyrkysova, fialova, bila

Sluzba 0ch - Zapis bod
======================
Popis: Tato sluzba slouzi k nakresleni bodu do libovolne
       obrazove stranky v grafickych rezimech. Pozice bodu
       se udava pomoci kartezskych souradnic. Levy horni roh
       obrazovky ma souradnice (0, 0).

       Nastavenim bitu 7 v byte barvy (ulozena v AL)
       zajistite, ze bod bude XORovan s puvodnim obsahem
       obrazovky.

       Na grafickych adapterech, ktere podporuji pouze jednu
       grafickou stranku, neni brano cislo obrazove stranky
       do uvahy (napr. CGA).

Vstup: AH = 0ch  Cislo sluzby
       AL = Barva bodu
       BH = Cislo obrazove stranky
       CX = X souradnice bodu - sloupec (0-319 nebo 0-639)
       DX = Y souradnice bodu - radka (0-199, 0-349 nebo
                 0-479)

Poznamka: Tato a nasledujici sluzba jsou velmi pomale. Pokud
        tedy potrebujete pouzivat rychlou grafiku, musite si
        napsat vlastni vlastni rychle rutiny, ktere
        vyuzivaji vsech moznosti karet (nektere z nich jsou
        na konci clanku), nebo pouzit nekterou z mnoha jiz
        hotovych grafickych knihoven (nejznamejsi je asi BGI
        - Borland Graphics Interface).

Sluzba 0dh - Precti bod
=======================
Popis: Tato sluzba zjisti barvu libovolnehbo bodu na
       obrazovce. Opet pro libovolnou obrazovou stranku.
       Levy horni roh stinitka ma souradnice (0, 0).

       Na kartach CGA se cislo obrazove stranky ignoruje.

Vstup: AH = 0dh  Cislo sluzby
       BH = Cislo obrazove stranky
       CX = X souradnice bodu - sloupec (0-319 nebo 0-639)
       DX = Y souradnice bodu - radka (0-199, 0-349 nebo
                 0-479)

Vystup: Bude obsazen v registrech po zavolani sluzby
        AL = Barva bodu

Poznamka: Tato funkce je dost pomala.

Sluzba 0eh - Zapis ridici znak do aktivni stranky
=================================================
Popis: Tato sluzba slouzi k zapsani znaku na obrazovku.
       Narozdil od predeslych podobnych funkci je po vypsani
       znaku kurzor presunut na nasledujici pozici a jsou
       interpretovany ridici kody CR (0dh), LF (0ah), BS
       (08h) a bell (7) - pipnuti.

       Sluzba zapisuje pouze do aktualni videostranky. Barva
       znaku ma vyznam pouze v grafickych rezimech.

Vstup: AH = 0eh  Cislo sluzby
       AL = ASCII kod znaku
       BL = Barva znaku (pouze pro graficke rezimy)

Sluzba 0fh - Zjisti aktualni zobrazovaci rezim
==============================================
Popis: Tato sluzba zjistuje informace o aktualnim
       zobrazovacim rezimu. Zjistuje pocet zobrazovanych
       sloupcu, aktualni obrazovou stranku a cislo
       zobrazovaciho rezimu. Pokud byl rezim inicializovan
       bez mazani obrazovky (bit 7 nastaven na jedna), bude
       mit i zjistene cislo rezimu nastaveny bit 7.
       K zjisteni skutecneho cisla zobrazovaciho rezimu pak
       muzete pouzit instrukci AND AL, 7fh.

Vstup: AH = 0fh  Cislo sluzby

Vystup: Bude obsazen v registrech po zavolani sluzby
        AL = Cislo zobrazovaciho modu
        AH = Pocet sloupcu obrazovky
        BH = Cislo aktualni obrazove stranky

Priklad na zaver
       Nasledujici program demonstrujte pouziti nekterych ze
sluzeb 00h - 0fh. Nejdrive program pomoci sluzby 0fh zjisti
aktualni zobrazovaci mod. Ten ulozi pro pozdejsi pouziti pri
ukoncovani programu. Videokartu prepne pomoci sluzby 00h do
modu 12h (pro EGA je mozno 0fh). Pote pomoci sluzby 02h
nastavi pozici kurzoru. Na teto pozici zobrazi napis "Ukazka
kresleni bodu na obrazovku". Pak pod sebe postupne nakresli
patnact vodorovnych car napric obrazovkou (kresli je po
bodech pomoci sluzby 0ch). Jejich barvy budou postupne 15 az
1, tj. od bile az po modrou. Pak uz program ceka jen na
stisk klavesy, po kterem obnovi puvodni videomod a ukonci
svou cinnost.
       Vsimnete si, ze ve smycce na kresleni bodu je
pred volanim INT 10h ulozen obsah registru a pote zase
obnoven. Je to z toho duvodu, ze BIOS rutina muze zmenit
obsah nekterych registru procesoru, na ktere se pozdeji
odvolavame. Zamezime tak situaci, ze se program "kousne"
a my nevime proc.
       Program lze do spustitelneho tvaru prevest sekvenci
techto prikazu:
       TASM jmeno_souboru
       TLINK jmeno_souboru,
pokud predtim nasledujici vypis ulozime do souboru
jmeno_souboru.ASM.


        .286                 ; pouziva nektere instrukce mp i80286 (pusha, popa)
        .MODEL  small        ; pametovy model
        .STACK  100h         ; zasobnik

        .DATA                ; data segment
; Text vypisovany na obrazovku + 3 pipnuti
Msg     db      'Ukazka kresleni bodu na obrazovku !!!',7,7,7
StrLen  equ     $-Msg        ; delka textu
OldMode db      00           ; misto na ulozeni puvodniho videomodu

        .CODE                ; zacatek kodu programu
        mov     AX, @data    ; nastavi spravny data segment
        mov     DS, AX

        mov     AH, 0fh      ; sluzba 0fh - Zjisteni grafickeho modu
        int     10h          ; volani sluzby
        and     AL, 7fh      ; smazani nejvyssiho bitu
        mov     OldMode, AL  ; ulozeni puvodniho zobrazovaciho modu

        mov     AH, 00h      ; sluzba 00h - nastaveni zobrazovaciho modu
        mov     AL, 12h      ; mod 12h - grafika 640 x 480
                             ; pro EGA napr. 0fh - 640 x 350
        int     10h          ; volani sluzby

        mov     AH, 02h      ; sluzba 02h - nastaveni pozice kurzoru
        mov     BH, 00h      ; cislo obrazove stranky je 0
        mov     DL, 21       ; kurzor na sloupec 21
        mov     DH, 1        ; a radku 1
        int     10h          ; volani sluzby

        mov     SI, OFFSET Msg        ; v DS:SI je adresa na Msg string
        mov     CX, StrLen            ; do CX delka retezce
        mov     AH, 0eh               ; sluzba 0eh - zapsani ridiciho znaku
        mov     BL, 0fh               ; barva znaku 15 - bila

WriteLoop:
        lodsb                         ; nacte znak
        int     10h                   ; vytiskne jej
        loop    WriteLoop             ; opakuje pro vsechny znaky retezce

        mov     AH, 0ch               ; sluzba 0ch - zobrazeni bodu
        mov     BH, 00h               ; cislo obrazove stranky
        mov     DX, 100               ; Y souradnice
        mov     CX, 639               ; X souradnice
        mov     AL, 15                ; pocatecni barva je bila

DotLoop:
        pusha                         ; ulozi registry, sluzba je muze menit
        int     10h                   ; zavolej sluzbu
        popa                          ; obnoveni registru
        loop    DotLoop               ; dokud CX > 0 kresli body
                                      ; tj. nakresli se vodorovna cara
        pusha                         ; ulozeni registru
        int     10h                   ; nakresli posledni bod
        popa                          ; obnoveni registru

        inc     DX                    ; zvetsi Y souradnici
        mov     CX, 639               ; nastav X souradnici
        dec     AL                    ; zmensi cislo barvy
        jnz     DotLoop               ; dokud barva neni 0, kresli dalsi caru

        mov     AH, 01h               ; ceka na znak z klavesnice
        int     21h                   ; sluzba 01h DOS

        mov     AH, 00h               ; sluzba 00h - nastaveni zobraz. modu
        mov     AL, OldMode           ; puvodni videomod
        int     10h                   ; volani sluzby

        mov     AH, 4ch               ; ukonceni programu
        int     21h                   ; DOS sluzba 4ch

        END                           ; konec programu


[Pokracovani]


Copyright © Jiri Kosek