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