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
Copyright © Jiri Kosek