Služby BIOS pro práci s obrazovkou

Volání BIOS
     BIOS je tady k tomu, aby vám zajistil kompatibilitu
programů na různých počítačích a grafických kartách.
Samozřejmě, že můžete grafickou kartu ovládat přímo pomocí
registrů a zapisovat přímo do videopaměti. Musíte však
všechny programy psát tolikrát, kolik je různých grafických
karet, na nichž má váš program pracovat. Můžete však použít
BIOS, tomu předáte pouze parametry a on už vše udělá za vás,
ať máte v počítači jakoukoliv grafickou kartu. Je
samozřejmé, že za tuto flexibilitu zaplatíte. Tím, že BIOS
podporuje velké množství karet, nejsou jeho rutiny tak
rychlé. Nemohou totiž využívat speciálních vlastností
jednotlivých adaptérů. Pokud tedy potřebujete něco udělat
opravdu rychle a efektivně, musíte sáhnout k programování
registrů a přímému zápisu do paměti.
     Volání videoslužeb BIOS se provádí pomocí interruptu
10h. Předtím než ho zavoláte, musíte do registru AH uložit
číslo služby a do ostatních registrů případné parametry,
které tato služba vyžaduje. K volání služeb BIOS je
samozřejmě nejvhodnější používat assembler, ale je možné je
volat i z vyšších programovacích jazyků. Některé
programovací jazyky umožňují přímo zapisovat do zdrojového
textu assembler. Nebo disponují funkcemi k volání služeb
BIOS (v Turbo Pascalu je to například procedura INTR).
Následující příklad nám ukáže, jak nastavit zobrazovací mód
3, tj. text 80 sloupců a 25 řádek.

Assembler:
           mov   AH, 00h     ;služba 00h - nastavení módu
           mov   AL, 03h     ;číslo módu
           int   10h         ;volání INT 10h

Turbo Pascal pomoci interního assembleru:
           asm
             push  DS
             push  BP
             mov   AH, 00h     ;služba 00h - nastavení módu
             mov   AL, 03h     ;číslo módu
             int   10h         ;volání INT 10h
             pop   BP
             pop   DS
           end;
pozn. Před voláním INT 10h je v interním assembleru Turbo
      Pascalu vhodné uložit obsah registrů DS, BP. Tyto
      registry nesmí být pro ostatní části programu změněny
      a služba na INT 10h by je mohla změnit.

Turbo Pascal pomocí procedury INTR:
           Var Reg: Registers;
           begin
             Reg.AH := 00;        ;služba 00h - nastavení módu
             Reg.AL := 03;        ;číslo módu
             Intr($10, Reg);      ;volání INT 10h
           end;

V případě, že některá služba vrací nějaké výsledky, jsou
opět vráceny v registrech mikroprocesoru.

Služby BIOS pro práci s obrazovkou
     V této kapitole popíšeme služby 00h-00f interruptu
10h. Ty zbývající, které jsou specifické pro karty EGA a VGA
popíšeme v následující části.

Služba 00h - Nastavení zobrazovacího módu
=========================================
Popis: Funkce se používá k nastavení zobrazovacího módu
     adaptéru. Mohou se pomocí ní nastavovat textové režimy
     a režimy grafické: 320 x 200, 640 x 200, 640 x 350
     a 640 x 480. Poté mohou být znaky na obrazovku
     zapisovány pomocí služeb 09h, 0ah, 0eh, 13h. Bod můžete
     zobrazit pomocí služby 0ch.

Vstup: AH = 00h  Číslo služby
       AL = Číslo zobrazovacího módu (podle následující
            tabulky)

     Mód  Grafika/Text       Počet barev
     -------------------------------------------------
     00h  text 40 x 25       16 barev VGA, 16 odstínů šedi EGA
     01h  text 40 x 25       16 barev EGA,VGA
     02h  text 80 x 25       16 barev VGA, 16 odstínů šedi 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 odstíny šedi EGA
     06h  grafika 640 x 200  2 barvy (jedna z nich je černá)
     07h  text 80 x 25       monochromatické zobrazení
     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
 
Poznámka: Na adaptéru EGA s monochromatickým monitorem
     používejte pouze módy 07h a 0fh.

     Pokud nejvyšší bit AL nastavíte na 1, při inicializaci
     módu se zachová původní obsah obrazovky. Nastavení
     nejvyššího bitu provede tak, že k číslu módu uloženému
     v registru AL přičtete hodnotu 80h.

Služba 01h - Nastavení tvaru textového kurzoru
==============================================
Popis: Tato funkce slouží k definování tvaru kurzoru. Můžete
     určit počáteční a koncovou řádku, mezi kterými bude
     vybarvena obdélníková část znakového boxu. Kurzor tedy
     nemusí začínat na první a končit na poslední řádce.
     Může být klidně ve středu znakového boxu. V grafických
     módech kurzor není.

     Počáteční a koncová řádka kurzoru jsou uloženy v pěti
     nejnižších bitech. Bity 7, 6 a 5 by měly vždy obsahovat
     nulu (na adaptérech EGA a VGA, na ostatních určují
     rychlost blikání kurzoru). Pokud chcete kurzor učinit
     neviditelným, nastavte jeho konec i počátek pod znakový
     box (tj. obě hodnoty budou větší než 7). Pokud na EGA
     nastavíte počáteční řádku větší než koncovou, objeví se
     kurzor jako dvě čárky nad sebou (inverze kurzoru, který
     by se objevil, pokud by počáteční a koncová řádka byly
     vyměněny). Adaptér VGA tento trik neumožňuje. Pokud je
     počáteční řádka větší než koncová, kurzor se neobjeví.

     Jelikož starší textové módy podporovaly pouze
     osmiřádkový kurzor, musel být v zájmu zachování
     kompatibility udělán kompromis na novějších textových
     módech, které podporují znaky se 14 nebo 16 řádky.
     Pokud je číslo řádku 0-3 považuje se za horní řádek
     a pokud je 4-7, považuje se za dolní (hodnota 4-7 pak
     podle adaptéru odpovídá řádkům 10-13 - EGA , případně
     12-15 - VGA). Pokud interval definice kurzoru
     obsahuje i řádky 4 a 5 (v registrech uloženo jako
     3 a 4) vyplní se i prostor mezi nimi.

Vstup: AH = 01h  Číslo služby
       CH = Počáteční řádka kurzoru (bity 0-4)
       CL = Koncová řádka kurzoru (bity 0-4)

Služba 02h - Nastavení pozice kurzoru
=====================================
Popis: Nastaví pozici kurzoru na obrazovce. Řádka 0 je horní
     řádka obrazovky a sloupec 0 je sloupec nejvíce vlevo na
     obrazovce.

Vstup: AH = 02h  Číslo služby
       DL = Číslo řádky
       DH = Číslo sloupce
       BH = Číslo stránky (vysvětlení co je stránka
            naleznete u popisu služby 05h)

Služba 03h - Čtení pozice a velikosti kurzoru
=============================================
Popis: Čte aktuální souřadnice kurzoru v dané stránce.
     Zjistí také velikost kurzoru (tak jak byl definován
     službou 01h).

Vstup: AH = 03h  Číslo služby
       BH = Číslo stránky

Výstup: Bude obsažen v registrech po zavolání služby
        DH = Aktuální řádka, na které je kurzor
        DL = Aktuální sloupec, ve kterém je kurzor
        CH = Počáteční řádka kurzoru
        CL = Koncová řádka kurzoru

Služba 04h - Čtení pozice světelného pera
=========================================
Popis: Tato služba zjišťuje souřadnice světelného pera v
     okamžiku, kdy bylo stisknuto jeho tlačítko. Pokud je
     aktuální zobrazovací režim 4-6, grafický řádek je
     vracen v registru CH. Pokud používate nové EGA módy,
     číslo grafické řádky služba uloží do registru CX.

Vstup: AH = 04h  Číslo služby

Výstup: Bude obsažen v registrech po zavolání služby
        AH = 0   Nebylo stisknuto tlačítko na světelném
                 peru, informace v ostatních registrech jsou
                 neplatné.
           = 1   Bylo stisknuto tlačítko na světelném peru,
                 informace v registrech platí.
        DH =     Znaková řádka
        DL =     Znakový sloupec
        CH =     Grafická řádka (v módech 4-6)
        CX =     Grafická řádka v nových EGA režimech
        BX =     Grafický sloupec

Poznámka: Karta VGA nepodporuje práci se světelným perem.
       Volání této služby, pokud máte VGA kartu postrádá
       jakýkoliv smysl.

Služba 05h - Výběr aktivní obrazové stránky
===========================================
Popis: Adaptér může mít v paměti najednou několik stránek
       (obsahů obrazovky). Ale pouze jedna z těchto stránek
       může být zobrazována. U většiny funkcí BIOS, které
       zapisují znaky na obrazovku, kreslí bod, přesouvají
       kurzor atd., si můžete zvolit, do které stránky se
       její výstup promítne. Využijete-li této schopnosti
       grafické karty, můžete jednu stránku zobrazovat a ve
       druhé provádět změny. Pak obě stránky přepnout a nová
       stránka se zobrazí okamžitě bez pomalého
       vykreslování. Toto se dá výhodně uplatnit například
       při animaci.

       Tato služba vám umožní zvolit stránku, která se bude
       zobrazovat. Obvykle se zobrazuje stránka 0 a do ní se
       také provádějí všechny změny.

Vstup: AH = 05h  Číslo služby
       AL = Číslo stránky, která se má zobrazit

Poznámka: Čísla stránek dostupných v různých
       zobrazovacích režimech udává následující tabulka.
       Pokud obsahuje 0 znamená to, že je dostupná jedna
       stránka s číslem 0, atd.

       Mód  64K   128K  256K - Velikost paměti videoadaptéru
       ---------------------
       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

       Všechny karty VGA mají nejméně 256K paměti, tzn.
       platí pro ně poslední sloupec tabulky.

Služba 06h - Rolování aktivní obrazové stránky nahoru
=====================================================
Popis: Tato funkce roluje obsah obrazovky zezdola nahorů. Do
       spodní části obrazovky jsou vkládány prázdné řádky.
       Můžete specifikovat levý horní a pravý dolní roh
       okénka a rolování pak bude probíhat pouze v něm a ne
       na celé ploše obrazovky. Tato funkce pracuje pouze s
       aktivní obrazovou stránkou.

       Pokud zadáte jako počet řádek k odrolování 0, smaže
       se celá obrazovka (okno).

Vstup: AH = 06h  Číslo služby
       AL = Počet řádek k odrolování (0 maže celé okno)
       BH = Atribut znaků přidaváných jako nová řádka (viz.
                 služba 08h)
       CH = Horní okraj okna (číslo řádky)
       CL = Levý okraj okna (číslo sloupce)
       DH = Dolní řádka okna (číslo řádky)
       DL = Pravý okraj okna (číslo sloupce)

Služba 07h - Rolování aktivní obrazové stránky dolů
===================================================
Popis: Tato funkce roluje obsah okénka dolů. Prázdné řádky
       jsou vkládány na horním okraji okna. Tato služba
       pracuje stejně jako služba 06h, pouze směr rolování
       textu je opačný.

Vstup: AH = 07h  Číslo služby
       AL = Počet řádek k odrolování (0 maže celé okno)
       BH = Atribut znaků přidaváných jako nová řádka (viz.
                 služba 08h)
       CH = Horní okraj okna (číslo řádky)
       CL = Levý okraj okna (číslo sloupce)
       DH = Dolní řádka okna (číslo řádky)
       DL = Pravý okraj okna (číslo sloupce)

Služba 08h - Čtení znaku a jeho atributu na pozici kurzoru
==========================================================
Popis: Tato funkce slouží k zjištění kódu a atributu znaku
       na aktuální pozici kurzoru v libovolné obrazovové
       stránce. Atribut znaku je jeden byte dlouhá informace
       o způsobu zobrazení znaku podle následující tabulky:

       /------------------------------------------------\
       |blikání|  barva pozadí  | inten- | barva znaku  |
       |       |                | zita   |              |
       |-------+----------------+--------+--------------|
  MSB  |   7   |  6  |  5  |  4 |   3    | 2  | 1 |  0  |
       \------------------------------------------------/

       Pro barevné monitory je přiřazení barev následující:
       Bity 4-6 (barva pozadí):
            000 černá        100 červená
            001 modrá        101 fialová
            010 zelená       110 hnědá
            011 tyrkysová    111 bílá

       Bity 0-3 (barva znaku):
            0000 černá       1000 tmavě šedá
            0001 modrá       1001 světle modrá
            0010 zelená      1010 světle zelená
            0011 tyrkysová   1011 světle tyrkysová
            0100 červená     1100 světle červená
            0101 fialová     1101 světle fialová
            0110 hnědá       1110 žlutá
            0111 světle šedá 1111 bílá

       Na monochromatických monitorech (není myšlen
       černobílý monitor, který se u nás často používá
       v kombinaci s VGA kartou) by barva pozadí měla být
       buď 0 (černá) nebo 111b=07h (barevná). Barva znaku
       000b odpovídá černé, 001b - znak bude podtržený a
       111b - znak bude barevný. Hodnota atributu má význam
       pouze v textových režimech.

Vstup: AH = 08h  Číslo služby
       BH = Číslo obrazové stránky

Výstup: Bude obsažen v registrech po zavolání služby
        AL = ASCII kód znaku
        AH = Atribut znaku (pouze v textovém režimu)

Poznámka: U popisu služeb 10h a 11h naleznete mnoho dalších
       informací o atributech a znakových sadách.

       Bit určující blikání může být přeprogramován tak, aby
       určoval intenzitu barvy pazadí (pro pozadí pak můžeme
       použít také 16 barev). Toto nastavení lze provést
       pomocí CRTC registrů nebo voláním služby 10h a funkce
       03h interruptu 10h.

       Bit určující intenzitu barvy znaku může být
       přeprogramován tak, aby určoval jednu ze dvou
       znakových sad, z kterých se získávají informace o
       tvaru znaku. Můžete tak v textovém režimu používat
       najednou 512 znaků.

Služba 09h - Zapsání znaku a atributu na pozici kurzoru
=======================================================
Popis: Tuto službu můžete použít k zapsání znaku (nebo
       několika stejných znaků) do libovolné z obrazových
       stránek. Znak se objeví na pozici kurzoru, kterou
       můžete nastavit pomocí služby 02h.
       Atribut znaku má následující význam (pro textové
       režimy):
       /------------------------------------------------\
       |blikání|  barva pozadí  | inten- | barva znaku  |
       |       |                | zita   |              |
       |-------+----------------+--------+--------------|
  MSB  |   7   |  6  |  5  |  4 |   3    | 2  | 1 |  0  |
       \------------------------------------------------/

       Pro barevné monitory je přiřazení barev následující:
       Bity 4-6 (barva pozadí):
            000 černá        100 červená
            001 modrá        101 fialová
            010 zelená       110 hnědá
            011 tyrkysová    111 bílá

       Bity 0-3 (barva znaku):
            0000 černá       1000 tmavě šedá
            0001 modrá       1001 světle modrá
            0010 zelená      1010 světle zelená
            0011 tyrkysová   1011 světle tyrkysová
            0100 červená     1100 světle červená
            0101 fialová     1101 světle fialová
            0110 hnědá       1110 žlutá
            0111 světle šedá 1111 bílá

       Na monochromatických monitorech (není myšlen
       černobílý monitor, který se u nás často používá
       v kombinaci s VGA kartou) by barva pozadí měla být
       buď 0 (černá) nebo 111b=07h (barevná). Barva znaku
       000b odpovídá černé, 001b - znak bude podtržený a
       111b - znak bude barevný.

       V grafickém režimu se byte atributu používá k určení
       barvy znaku. Pokud s barvou zároveň nastavíte bit 7
       na jedna, znak bude na obrazovku kreslen tak, že se s
       jejím obsahem provede operace XOR. (Body na než by se
       kreslil znak jsou zinvertovány.)

       Pokud tuto funkci použijete v textovém režimu k
       zobrazení více znaků, které by se na řádku nevešly,
       automaticky ve vypisování pokračuje na začátku
       dalšího řádku. V grafickém režimu se všechny znaky
       musí vejít na řádku. (Pokud se nevejdou, většinou se
       přesunou na další řádku, ale neposunou se dolů o 8
       pixelů, tj. výšku znaku, ale jen o jeden pixel.)

Vstup: AH = 09h  Číslo služby
       AL = ASCII kód znaku
       BH = Číslo obrazové stránky (gr. režim 13h používá
                 tento byte k určení barvy pozadí)
       BL = Atribut zobrazení
       CX = Kolikrát se má znak zobrazit

Poznámka: Pozice kurzoru po zavolání této služby zůstává
       nezměněna (i v případě výstupu několika znaků).
       Umísťování kurzoru musí program obstarávat sám.

       Řídící znaky jako CR, LF, BS (Backspace) jsou
       zobrazeny jako znaky. Jejich správná interpretace
       musí být obsažena v programu např. pomocí změny
       pozice kurzoru.

Služba 0ah - Zapsání znaku na pozici kurzoru
============================================
Popis: Tato služba je shodná se službou 09h s tím rozdílem,
       že nelze specifikovat atribut zobrazení (ponechá se
       původní).

Vstup: AH = 0ah  Číslo služby
       AL = ASCII kód znaku
       BH = Použitá obrazová stránky
       CX = Kolikrát se má znak zobrazit

Služba 0bh - Nastavení palety barev
===================================
Popis: Tato služba pracuje pouze v režimech kompatibilních s
       CGA. Pro nastavení palety v EGA/VGA režimech použijte
       službu 10h.

       Obsah registru BH určuje, co se vlastně bude
       nastavovat. Pokud obsahuje 0, nastavuje se barva
       pozadí (0-15) případně barva rámečku v textových
       režimech (0-31).  Pokud BH obsahuje 1, určuje nejméně
       významný bit registru BL jednu ze dvou palet:
       zelená, červená a hnědá nebo tyrkysová, fialová
       a bílá.

Vstup: AH = 0bh  Číslo služby
       BH = Výběr palety k nastavení
                 0 - pozadí/rámeček
                 1 - nastavení palet barev
       BL = pro BH = 0 - barva pozadí (0-15) v grafických
                       režimech; v textových režimech barva
                       rámečku (0-31)
            pro BH = 1 - výběr palety
                         0 -> zelená, červená, hnědá
                         1 -> tyrkysová, fialová, bílá

Služba 0ch - Zapiš bod
======================
Popis: Tato služba slouží k nakreslení bodu do libovolné
       obrazové stránky v grafických režimech. Pozice bodu
       se udává pomocí kartézských souřadnic. Levý horní roh
       obrazovky má souřadnice (0, 0).

       Nastavením bitu 7 v byte barvy (uložena v AL)
       zajistíte, že bod bude XORován s původním obsahem
       obrazovky.

       Na grafických adaptérech, které podporují pouze jednu
       grafickou stránku, není bráno číslo obrazové stránky
       do úvahy (např. CGA).

Vstup: AH = 0ch  Číslo služby
       AL = Barva bodu
       BH = Číslo obrazové stránky
       CX = X souřadnice bodu - sloupec (0-319 nebo 0-639)
       DX = Y souřadnice bodu - řádka (0-199, 0-349 nebo
                 0-479)

Poznámka: Tato a následující služba jsou velmi pomalé. Pokud
        tedy potřebujete používat rychlou grafiku, musíte si
        napsat vlastní vlastní rychlé rutiny, které
        využívají všech možností karet (některé z nich jsou
        na konci článku), nebo použít některou z mnoha již
        hotových grafických knihoven (nejznámější je asi BGI
        - Borland Graphics Interface).

Služba 0dh - Přečti bod
=======================
Popis: Tato služba zjistí barvu libovolnéhbo bodu na
       obrazovce. Opět pro libovolnou obrazovou stránku.
       Levý horní roh stínítka má souřadnice (0, 0).

       Na kartách CGA se číslo obrazové stránky ignoruje.

Vstup: AH = 0dh  Číslo služby
       BH = Číslo obrazové stránky
       CX = X souřadnice bodu - sloupec (0-319 nebo 0-639)
       DX = Y souřadnice bodu - řádka (0-199, 0-349 nebo
                 0-479)

Výstup: Bude obsažen v registrech po zavolání služby
        AL = Barva bodu

Poznámka: Tato funkce je dost pomalá.

Služba 0eh - Zapiš řídící znak do aktivní stránky
=================================================
Popis: Tato služba slouží k zapsání znaku na obrazovku.
       Narozdíl od předešlých podobných funkcí je po vypsání
       znaku kurzor přesunut na následující pozici a jsou
       interpretovány řídící kódy CR (0dh), LF (0ah), BS
       (08h) a bell (7) - pípnutí.

       Služba zapisuje pouze do aktuální videostránky. Barva
       znaku má význam pouze v grafických režimech.

Vstup: AH = 0eh  Číslo služby
       AL = ASCII kód znaku
       BL = Barva znaku (pouze pro grafické režimy)

Služba 0fh - Zjisti aktuální zobrazovací režim
==============================================
Popis: Tato služba zjišťuje informace o aktuálním
       zobrazovacím režimu. Zjišťuje počet zobrazovaných
       sloupců, aktuální obrazovou stránku a číslo
       zobrazovacího režimu. Pokud byl režim inicializován
       bez mazání obrazovky (bit 7 nastaven na jedna), bude
       mít i zjištěné číslo režimu nastavený bit 7.
       K zjištění skutečného čísla zobrazovacího režimu pak
       můžete použít instrukci AND AL, 7fh.

Vstup: AH = 0fh  Číslo služby

Výstup: Bude obsažen v registrech po zavolání služby
        AL = Číslo zobrazovacího módu
        AH = Počet sloupců obrazovky
        BH = Číslo aktuální obrazové stránky

Příklad na závěr
       Následující program demonstrujte použití některých ze
služeb 00h - 0fh. Nejdříve program pomocí služby 0fh zjistí
aktuální zobrazovací mód. Ten uloží pro pozdější použití při
ukončování programu. Videokartu přepne pomocí služby 00h do
módu 12h (pro EGA je možno 0fh). Poté pomocí služby 02h
nastaví pozici kurzoru. Na této pozici zobrazí nápis "Ukázka
kreslení bodů na obrazovku". Pak pod sebe postupně nakreslí
patnáct vodorovných čar napříč obrazovkou (kreslí je po
bodech pomocí služby 0ch). Jejich barvy budou postupně 15 až
1, tj. od bílé až po modrou. Pak už program čeká jen na
stisk klávesy, po kterém obnoví původní videomód a ukončí
svou činnost.
       Všimněte si, že ve smyčce na kreslení bodů je
před voláním INT 10h uložen obsah registrů a poté zase
obnoven. Je to z toho důvodu, že BIOS rutina může změnit
obsah některých registrů procesoru, na které se později
odvoláváme. Zamezíme tak situaci, že se program "kousne"
a my nevíme proč.
       Program lze do spustitelného tvaru převést sekvencí
těchto příkazů:
       TASM jméno_souboru
       TLINK jméno_souboru,
pokud předtím následující výpis uložíme do souboru
jméno_souboru.ASM.


        .286                 ; používá některé instrukce mp i80286 (pusha, popa)
        .MODEL  small        ; paměťový model
        .STACK  100h         ; zásobník

        .DATA                ; data segment
; Text vypisovaný na obrazovku + 3 pípnutí
Msg     db      'Ukázka kreslení bodů na obrazovku !!!',7,7,7
StrLen  equ     $-Msg        ; délka textu
OldMode db      00           ; místo na uložení původního videomódu

        .CODE                ; začátek kódu programu
        mov     AX, @data    ; nastaví správný data segment
        mov     DS, AX

        mov     AH, 0fh      ; služba 0fh - Zjištění grafického módu
        int     10h          ; volání služby
        and     AL, 7fh      ; smazání nejvyššího bitu
        mov     OldMode, AL  ; uložení původního zobrazovacího módu

        mov     AH, 00h      ; služba 00h - nastavení zobrazovacího módu
        mov     AL, 12h      ; mód 12h - grafika 640 x 480
                             ; pro EGA např. 0fh - 640 x 350
        int     10h          ; volání služby

        mov     AH, 02h      ; služba 02h - nastavení pozice kurzoru
        mov     BH, 00h      ; číslo obrazové stránky je 0
        mov     DL, 21       ; kurzor na sloupec 21
        mov     DH, 1        ; a řádku 1
        int     10h          ; volání služby

        mov     SI, OFFSET Msg        ; v DS:SI je adresa na Msg string
        mov     CX, StrLen            ; do CX délka řetězce
        mov     AH, 0eh               ; služba 0eh - zapsání řídícího znaku
        mov     BL, 0fh               ; barva znaku 15 - bílá

WriteLoop:
        lodsb                         ; načte znak
        int     10h                   ; vytiskne jej
        loop    WriteLoop             ; opakuje pro všechny znaky řetězce

        mov     AH, 0ch               ; služba 0ch - zobrazení bodu
        mov     BH, 00h               ; číslo obrazové stránky
        mov     DX, 100               ; Y souřadnice
        mov     CX, 639               ; X souřadnice
        mov     AL, 15                ; počáteční barva je bílá

DotLoop:
        pusha                         ; uloží registry, služba je může měnit
        int     10h                   ; zavolej službu
        popa                          ; obnovení registrů
        loop    DotLoop               ; dokud CX > 0 kresli body
                                      ; tj. nakreslí se vodorovná čára
        pusha                         ; uložení registrů
        int     10h                   ; nakresli poslední bod
        popa                          ; obnovení registrů

        inc     DX                    ; zvětši Y souřadnici
        mov     CX, 639               ; nastav X souřadnici
        dec     AL                    ; zmenši číslo barvy
        jnz     DotLoop               ; dokud barva není 0, kresli další čáru

        mov     AH, 01h               ; čeká na znak z klávesnice
        int     21h                   ; služba 01h DOS

        mov     AH, 00h               ; služba 00h - nastavení zobraz. módu
        mov     AL, OldMode           ; původní videomód
        int     10h                   ; volání služby

        mov     AH, 4ch               ; ukončení programu
        int     21h                   ; DOS služba 4ch

        END                           ; konec programu


[Pokračování] | [Obsah]


Copyright © Jiří Kosek