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