Programovßnφ grafick²ch karet EGA/VGA
Doposud popsanΘ zp∙soby ovlßdßnφ zobrazovßnφ m∞ly jednu
velkou v²hodu. Tφm, ₧e Ülo o slu₧by BIOS, bylo zajiÜt∞no, ₧e
program pou₧φvajφcφ pouze tato volßnφ, bude pracovat na
libovolnΘ grafickΘ kart∞. Program obsahoval pouze volßnφ
slu₧by BIOS a teprve ta provedla p°φsluÜnou Φinnost na
instalovanΘm adaptΘru. Nemuseli jste se tedy skoro v∙bec
zajφmat o to, jakou mßte v systΘmu instalovanou grafickou
kartu. Vypadß to a₧ p°φliÜ jednoduÜe. Je zde tedy n∞jak²
hßΦek. Za zφskanou flexibilitu musφte n∞Φφm zaplatit.
V tomto p°φpad∞ nep°ichßzφte o koruny ani dolary z ·Φtu, ale
o rychlost. Proto₧e slu₧by BIOS musφ pracovat na vÜech
mo₧n²ch grafick²ch kartßch, nemohou optimßln∞ vyu₧φvat
vÜechny schopnosti tak velkΘho poΦtu karet. Musφte se tedy
rozhodnout zda preferujete rychlost Φi p°enositelnost. Ve
druhΘm p°φpad∞ m∙₧ete pou₧φt BIOS. V tom prvnφm se musφte
podrobn∞ seznßmit z organizacφ pam∞ti videoadaptΘru
a ovlßdßnφm jeho registr∙. Pokud pak chcete, aby n∞jak² vßÜ
program pracoval na vφce r∙zn²ch zobrazovacφch kartßch,
musφte vytvo°it n∞kolik jeho verzφ. Tak, aby k jednΘ
grafickΘ kart∞ p°φsluÜela jedna verze programu.
NejΦast∞ji se programovßnφ adaptΘr∙ pou₧φvß
v grafick²ch zobrazovacφch re₧imech. Je to nutnost, proto₧e
BIOS prßci v t∞chto re₧imech tΘm∞° nepodporuje (obsahuje
pouze velice pomalΘ rutiny pro zobrazenφ bodu a pro zjiÜt∞nφ
barvy bodu). Ne₧ se vÜak pustφte do tvorby vlastnφch
program∙ pro ovlßdßnφ adaptΘru, zjist∞te, zda vaÜim
po₧adavk∙m nevyhovuje n∞jakß z mnoha b∞₧n∞ dostupn²ch
grafick²ch knihoven (BGI, TEGL, TGE ...). M∙₧ete tak uÜet°it
velkΘ mno₧stvφ prßce, kterß je ji₧ jednou hotova.
Zjistφte-li vÜak, ₧e vßm uvedenΘ knihovny n∞Φφm nevyhovujφ,
je pravß chvφle pro to, abyste zaΦali Φφst nßsledujφcφ
odstavce. M∞li byste v nich najφt vÜe pot°ebnΘ, pro psanφ
program∙ pro karty EGA a VGA.
Organizace pam∞ti
Jist∞ vφte, ₧e na grafickΘm adaptΘru je obsa₧ena pam∞¥.
ObvyklΘ jsou VGA karty s pam∞tφ 256K, 512K a 1MB (n∞kterΘ
lepÜφ majφ i 2 a vφce MB pam∞ti). I ta nejjednoduÜÜφ karta
VGA mß 256K pam∞ti. V prost°edφ MS-DOS vÜak pracujφ vÜechny
procesory Intel v reßlnΘm re₧imu, tzn. mohou adresovat pouze
1MB pam∞ti. V tomto stφsn∞nΘm pam∞¥ovΘm prostoru musφ b²t
mφsto pro MS-DOS, aplikaΦnφ programy, BIOS, Video BIOS
a takΘ samoz°ejm∞ pro pam∞¥ grafickΘho adaptΘru (viz
obr. 2). Pro pam∞t grafickΘho adaptΘru je vyhrazen pam∞¥ov²
prostor a000:0000 a₧ b000:ffff, tj. 128K. To je, ale dvakrßt
mΘn∞ ne₧ mß nejjednoduÜφ VGA karta. AdaptΘr tedy pou₧φvß
r∙znΘ metody organizece pam∞ti tak, aby s vyhrazen²m
adresnφm prostorem vystaΦil. AdaptΘr do tΘto oblasti
p°emapovßvß svojφ pam∞¥ tak, aby byla data logicky
a jednosuÜe uspo°ßdßna. SkuteΦnΘ ulo₧enφ dat v pam∞ti
videoadaptΘru b²vß mnohem slo₧it∞jÜφ, ale nemusφ nßs p°φliÜ
zajφmat, proto₧e jeho mapovßnφ je pro nßs transparentnφ.
V p°φpadech, kdy je v²hodnΘ znßt i toto vnit°nφ uspo°ßdßnφ,
bude popsßno. Organizece pam∞ti se pro textovΘ a grafickΘ
re₧imy liÜφ a bude tedy vysv∞tlena odd∞len∞.
Organizace pam∞ti v textov²ch re₧imech
V textov²ch re₧imech jsou v pam∞ti ulo₧eny ASCII k≤dy
zobrazovan²ch znak∙ spolu s jejich atributy (barvou). Prvnφ
dva byte pam∞ti p°φluÜejφ znaku v levΘm hornφm rohu.
Nßsledujφcφ slovo (2 byte) p°φsluÜφ znaku napravo od znaku
v levΘm hornφm rohu. Znaky jsou v pam∞ti tedy zaznamenßny
sekvenΦn∞ tak, ₧e nejprve jsou ulo₧eny zleva doprava znaky
a atributy prvnφho °ßdku, pak zleva doprava druhΘho °ßdku
atd. Informace o ka₧dΘm znaku je ulo₧ena ve dvou byte. Prvnφ
z nich obsahuje ASCII k≤d znaku a druh² atribut znaku (viz
obr. 3). Atribut znaku mß nßsledujφcφ strukturu:
/------------------------------------------------\
|blikßnφ| barva pozadφ | inten- | barva znaku |
| | | zita | |
|-------+----------------+--------+--------------|
MSB | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
\------------------------------------------------/
Standardnφ p°i°azenφ barev pro barevnΘ monitory je
nßsledujφcφ:
Bity 4-6 (barva pozadφ):
------------------------
000 Φernß
001 modrß
010 zelenß
011 tyrkysovß
100 Φervenß
101 fialovß
110 hn∞dß
111 bφlß
Bity 0-3 (barva znaku):
-----------------------
0000 Φernß
0001 modrß
0010 zelenß
0011 tyrkysovß
0100 Φervenß
0101 fialovß
0110 hn∞dß
0111 sv∞tle Üedß
1000 tmav∞ Üedß
1001 sv∞tle modrß
1010 sv∞tle zelenß
1011 sv∞tle tyrkysovß
1100 sv∞tle Φervenß
1101 sv∞tle fialovß
1110 ₧lutß
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².
Pro barevnΘ re₧imy (00h, 01h, 02h a 03h) zaΦφnß pam∞¥
obrazovky na adrese b800:0000. Pro monochromatickΘ re₧imy
(07h) a pro n∞kterΘ textovΘ re₧imy Super VGA (ty s v∞tÜφm
poΦtem sloupc∙ ne₧ 80) zaΦφnß pam∞t obrazovky na adrese
b000:0000. Pro zobrazenφ znaku staΦφ zapsat na p°φsluÜnΘ
adresy jeho ASCII k≤d a atribut. Pokud naopak chcete zjistit
jak² znak je n∞jakΘ pozici, p°eΦtete jeho ASCII k≤d
a atribut z p°φsluÜn²ch adres.
Ke zjiÜt∞nφ adresy znaku o sou°adnicφch X, Y slou₧φ
nßsledujφcφ vzorce:
Segment = b800 nebo b000 (podle m≤du)
Offset = Y * 2 * PoΦet_znak∙_na_°ßdce + 2 * X
Adresa atributu bude mφt offset zv∞tÜen² o jedna.
PoΦet_znak∙_na_°ßdce je konstanta zßvislß na zobrazovacφm
re₧imu. jejφ nejb∞₧n∞jÜφ velikost je 80, ale existujφ m≤dy,
kde mß hodnotu 40 Φi 132. Toto platφ pro zabrazovacφ strßnku
0. Pokud byste cht∞li pou₧φvat i jinΘ zobrazovacφ strßnky
musφte k offsetu p°iΦφst hodnoty podle nßsledujφcφ tabulky:
/-------------------------------------------------\
| | Posunutφ pro r∙znΘ m≤dy |
| |---------------------------------------|
| Strßnka | M≤dy 0,1 (40x25) | M≤dy 2,3,7 (80x25) |
| |------------------+--------------------|
| | Dec | Hex | Dec | Hex |
|---------+--------+---------+----------+---------|
| 0 | 0 | 0000 | 0 | 0000 |
| 1 | 2128 | 0850 | 4256 | 10a0 |
| 2 | 4256 | 10a0 | 8512 | 2140 |
| 3 | 6384 | 18f0 | 12768 | 31e0 |
| 4 | 8512 | 2140 | 17024 | 4280 |
| 5 | 10640 | 2990 | 21280 | 5320 |
| 6 | 12768 | 31e0 | 25536 | 63c0 |
| 7 | 14896 | 3a30 | 29792 | 7460 |
\-------------------------------------------------/
Organizace pam∞ti v grafick²ch re₧imech CGA
Zobrazovacφ re₧imy 4, 5 a 6 zachovßvajφ na kartßch
EGA/VGA komapatibilitu s p∙vodnφ kartou CGA. Stejnß jako
u CGA z∙stala v t∞chto re₧imech i organizace videopam∞ti.
Obsah pam∞ti p°φmo urΦuje v²slednou zobrazovanou barvu.
V m≤dech 4 a 5 p°φsluÜφ pro ka₧d² pixel dva bity (tj.
v²slednΘ Φty°i barvy). V m≤du 6 (640 x 200) odpovφdß pixelu
jeden bit. ZvlßÜtnostφ t∞chto re₧im∙ je, ₧e majφ proklßdanΘ
uspo°ßdßnφ obrazovΘ pam∞ti. To znamenß, ₧e sudΘ °ßdky jsou
ulo₧eny v jednΘ oblasti pam∞ti a lichΘ °ßdky v jinΘ Φßsti
pam∞ti. Bity odpovφdajφcφ jednotliv²m pixel∙m v °ßdce jsou
v pam∞ti op∞t zapsßny zleva doprava. SudΘ °ßdky jsou
v pam∞ti ulo₧eny od adresy b800:0000 a lichΘ od adresy
ba00:0000 (viz obr. 4). Pokud si na obrazovce zvolφme
sou°adn² systΘm tak, ₧e lev² hornφ roh bude mφt sou°adnice
(0,0) a sm∞rem dol∙ a doprava se budou sou°adnice bod∙
zv∞tÜovat, pak adresu a bity p°φsluÜejφcφ pixelu
o sou°adnicφch X a Y zjistφme podle nßsledujφcφho:
Segment = pro sudΘ °ßdky - b800
pro lichΘ °ßdky - ba00
Offset = Y div 2 * 80 + X div 8 (4 pro m≤dy 4 a 5)
Bit pro m≤d 6 = 7 - (X mod 7)
Bity pro m≤dy 4, 5 = (3 - (X mod 3)) * 2
a (3 - (X mod 3)) * 2 + 1
Pozn. div je oznaΦenφ operace celoΦφselnΘho d∞lenφ a mod je
oznaΦenφ operace vracejφcφ zbytek celoΦφselnΘho d∞lenφ.
Organizace pam∞ti v grafickΘm re₧imu 13h
(320 x 200, 256 barev)
Tento re₧im VGA mß asi nejjednoduÜφ organizaci pam∞ti
ze vÜech mo₧n²ch zobrazovacφch re₧im∙. Ka₧d² byte pam∞ti
odpovφdß jednomu bodu, kter² tedy m∙₧e mφt jednu z 256
barev. JednotlivΘ pixely °ßdku jsou v pam∞ti op∞t ulo₧eny
zleva doprava (viz obr. 5). V²poΦet adresy, na kterΘ je
ulo₧ena barva pixelu je opravdu jednoduch²:
Segment = a000
Offset = Y * 80 + X
Organizace pam∞ti v ostatnφch grafick²ch re₧imech EGA/VGA
Pro vÜechny tyto zobrazovacφ re₧imy zaΦφnß pam∞t na
adrese a000:0000. K ulo₧enφ grafick²ch dat je voln² tedy
jeden segment (a000). Jeden segment pojme 64K dat, ale
nejvyÜÜφ re₧im VGA 12h pot°ebuje k ulo₧enφ informace o celΘm
obrazu 150K. Jak tedy st∞snat 150K do 64K?
V tomto m≤du ka₧d² bit pam∞ti odpovφdß jednomu pixelu
na obrazovce. Jeden byte pam∞ti tedy odpovφdß 8 pixel∙m.
Pixely jsou v pam∞ti op∞t ulo₧eny po °ßdcφch od shora dol∙
a jednotlivΘ body °ßdky jsou ulo₧eny zleva doprava. Bit
s nejvyÜÜφ vßhou v byte odpovφdß pixelu, kter² je nejvφce
nalevo (viz obr. 6).
Jeden bit nßm ale k ulo₧enφ 16 barev nestaΦφ. Na jednΘ
adrese jsou tedy 4 bity mφsto jednoho. Tato technika
organizace pam∞ti se naz²vß bitovΘ roviny (viz obr. 7).
M∙₧eme si jφ toti₧ p°edstavit jako n∞kolik bank pam∞ti
polo₧en²ch na sebe. Na jednΘ adrese se pak nachßzφ Φty°i
bity (z ka₧dΘ banky/bitovΘ roviny jeden). Kombinacφ t∞chto
4 bit∙ dostßvßme pro ka₧d² pixel jednu z 16 mo₧n²ch barev.
Uspo°ßdßnφ pam∞ti do bitov²ch rovin mß n∞kolik v²hod.
Prvnφ v²hodou je to, ₧e pozice pixelu na obrazovce p°φmo
odpovφdß pozici p°φsluÜnΘho bitu v pam∞ti. V p°φpad∞
standardnφho nastavenφ barev ka₧dß bitovß rovina odpovφdß
jednΘ ze zßkladnφ barev a intenzit∞ barvy. Druhou v²hodou je
snadnΘ p°idßnφ barev. Pokud p°idßme jeÜt∞ jednu bitovou
rovinu, poΦet pou₧iteln²ch barev se zdvojnßsobφ a rutiny
poΦφtajφcφ adresy bodu ze sou°adnic z∙stanou naprosto
stejnΘ. T°etφ v²hodou je mo₧nost modifikovat pam∞t stejn∞
rychle v dvoubarevnΘm i 256barevnΘm m≤du, proto₧e obsah
vÜech rovin m∙₧e b²t zm∞n∞n jednφm zßpisem do pam∞ti.
Samoz°ejm∞, ₧e jsou k dispozici r∙znΘ metody p°φstupu
k bitov²m rovinßm. Kdyby Üla do vÜech najednou zapsat pouze
jedniΦka nebo nula, m∞li bychom k dispozici pouhΘ dv∞ barvy.
Existujφ t°i metody zßpisu do videopam∞ti a dv∞ metody
Φtenφ videopam∞ti. Ka₧dß z t∞chto metod, kterΘ nßm
umo₧≥ujφ prßci se vÜemi barvami, mß svΘ v²hody i svß
omezenφ. Jejich funkce zde podrobn∞ probereme.
Zapisovacφ m≤d 0
Tento zapisovacφ m≤d je pou₧φvßn rutinami BIOS. Pou₧φvß
registru Map mask k urΦenφ bitov²ch map, do kter²ch se bude
zapisovat. Pokud m∞nφte barvu, kterou kreslφte na obrazovku,
musφte zm∞nit i obsah Map mask registru. Je zde ale jedna
malß oÜemetnost. ╪ekn∞me, ₧e chcete na obrazovku nakreslit
n∞co urΦitou barvou. Ulo₧φte tedy tuto barvu do Map mask
registru a zapφÜete do pam∞ti jedniΦky. Tφm dosßhnete toho,
₧e se p°φsluÜnΘ bitovΘ roviny nastavφ na jedna. Pokud by ale
bitovΘ roviny neobsa₧enΘ v Map mask registru obsahovaly ji₧
odp°edtφm n∞jakΘ bity nastavenΘ na jedna, nedostali byste na
obrazovce barvu, kterou jste po₧adovali. K tomu abyste
obdr₧eli bod o pot°ebnΘ barv∞, musφte tedy zajistit
i vynulovßnφ p°φsluÜn²ch bitov²ch rovin. Existujφ dv∞ mo₧nΘ
cesty.
Tou prvnφ je nejprve zapsat do bitov²ch rovin
nep°φsluÜejφcφch zapisovanΘ barv∞ nuly a potΘ do rovin
p°φsluÜejφcφch zapisovanΘ barv∞ zapsat jedniΦky. Nejprve
tedy musφte nastavit Map mask registr na binßrnφ negaci
zapisovanΘ barvy, zapsat do pam∞ti nuly. Pak nastavφte Map
mask registr na zapisovanou barvu a zapφÜete do pam∞ti
jedniΦky. (Pozn. binßrnφ negaci n∞jakΘho Φφsla zφskßte tak,
₧e v danΘm Φφsle obrßtΘte jeniΦky na nuly a naopak. Binßrnφ
negace binßrnφho Φφsla 0011 je tedy 1100.)
Druhß cesta vede p°es pou₧itφ Set/Reset a Enable
Set/Reset registr∙. P°i vhodnΘm nastavenφ t∞chto dvou
registr∙ m∙₧ete dosßhnout toho, ₧e pot°ebnΘ bitovΘ roviny se
p°i zßpisu do pam∞ti automaticky nastavφ na nulu. Abyste
mohli pou₧φt tΘto metody, nejprve zapiÜte do registru
Set/Reset nulu. Pak do registru Enable Set/Reset zapiÜte
binßrnφ negaci barvy. Map mask registr nastavte na
po₧adovanou barvu a prove∩te zßpis do pam∞ti.
Procesor normßln∞ zapisuje jeden byte najednou. Zßpisem
do videopam∞ti zm∞nφme tedy 8 pixel∙ najednou.
V mastaven²ch bitov²ch rovinßch se bity podle zapisovanΘ
hodnoty nastavφ na jedna nebo na nula. To nßm umo₧≥uje
zobrazovat znaky, kterΘ jsou ÜirokΘ osm bod∙, ale neumo₧≥uje
nßm to zobrazit samostatn² bod. K tomu, abychom m∞nili jenom
n∞kterΘ vybranΘ body z celΘ osmice, pou₧ijeme Bit mask
registr. Pokud je n∞jak² bit Bit mask registru nastaven na
jedna, p°φsluÜnΘ bity v bitov²ch rovinßch se p°i zßpisu
zm∞nφ. Bity rovin, kterΘ majφ odpovφdajφcφ bity Bit mask
registru nastaveny na nulu, z∙stanou zßpisem nezm∞n∞ny.
P°i zßpisu se kombinujφ data posφlanß procesorem s ji₧
ulo₧en²mi daty. Aby toto bylo umo₧n∞no, musφ b²t p°ed
zßpisem naΦten p∙vodnφ obsah videopam∞ti do tzv.
latch-registr∙. K naΦtenφ latch-registr∙ m∙₧eme pou₧φt
kup°φkladu nßsledujφcφ instrukci: MOV AL, ES:[BX], kde
ES:[BX] ukazuje na po₧adovanou adresu. Latch registry jsou
osmibitovΘ a jsou Φty°i (pro ka₧dou bitovou rovinu jeden).
Teprve potΘ co sprßvn∞ nastavφme vÜechny registry a naΦteme
latch registry, m∙₧eme zapsisovat do videopam∞ti.
Nynφ si ukß₧eme, jak zobrazit na n∞jakΘ sou°adnici
barevn² bod. Cht∞jme nap°φklad nakreslit Φerven² bod na
sou°adnicφch (100, 100). Nejprve urΦφme adresu byte, ve
kterΘm le₧φ bit p°φsluÜejφcφ naÜemu bodu. Tuto adresu
zφskßme tak, ₧e sou°adnici y vynßsobφme poΦtem byte na
zobrazovacφ °ßdku (t∞ch je 80) a p°iΦteme k nφ sou°adnici x.
Dostßvßme 100 * 80 + 100 = 8100. Video pam∞¥ je v t∞chto
zobrazovacφch m≤dech mapovßna do segmentu a000h. Do registru
DS ulo₧φme hodnotu a000h a do registru BX hodnotu 8100.
DS:[BX] nynφ ukazuje na byte, ve kterΘm le₧φ bit
p°φsluÜejφcφ naÜemu bodu. ╚φslo bitu, kter² p°φsluÜφ naÜemu
bodu zjistφme jako: 7 - ( X and 7). JednoduÜφ je ale umφstit
do n∞jakΘho registru hodnotu 80h (10000000b) a posunout jφ
o (X and 7) doprava (to vypl²vß z toho, ₧e bit 7 odpovφdß
bodu na levΘm okraji byte). Tak dostaneme p°φmo bitovou
masku, kterou umφstφme do Bit mask registru. ╚ervenß barva
mß Φφslo 4, umφstφme ho tedy do Map mask registru.
Set/Reset registr nastavφme na 0 a Enable Set/Reset registr
na binßrnφ negaci 4 (4=0100b => 4'=1011b). Pak naΦteme
latch-registry a ulo₧φme masku na pat°iΦnou adresu.
V assembleru nakreslenφ bodu m∙₧e vypadat nap°φklad takto
(P°edpoklßdßme, ₧e DS:[BX] ukazuje na p°φsluÜnou adresu
a v registru AH je nastavena bitovß maska bodu. V ukßzce se
pou₧φvajφ registry grafickΘho adaptΘru. Jejich podrobn∞jÜφ
popis a popis jejich ovlßdßnφ je uveden v samostatnΘ Φßsti
o registrech.):
mov DX, 3ceh ;do DX port Graphics adress registru
mov AL, 8 ;index Bit mask registru
out DX, AL
inc DX ;datov² port Graphics controlleru
mov AL, AH ;do AL bitovß maska
out DX, AL ;nastavφ bitovou masku
dec DX ;op∞t indexov² port Adress registru
mov AL, 0 ;index Set/Reset registru
out DX, AL
inc DX
mov AL, 0 ;hodnota pro Set/Reset registr
out DX, AL
dec DX ;op∞t port Graphics adress registru
mov AL, 1 ;index Enable Set/Reset registru
out DX, AL
inc DX ;datov² port Graphics controlleru
mov AL, 1011b ;negace ΦervenΘ barvy
mov DX, 3c4h ;port Sequencer controlleru
mov AL, 2 ;index Map mask registru
out DX, AL
inc DX ;port datovΘho registru Sequenceru
mov AL, 0100b ;Φervenß barva
out DX, AL
mov AL, [BX] ;naΦte latch registry
mov [BX], AH ;zobrazφ bod, tj. zkombinuje bitovou masku s latch registry
Je to pon∞kud dlouh² program na to, ₧e zobrazuje pouze
jeden bod (a jeÜt∞ nenφ zahrnut k≤d pro v²poΦet adresy bodu
ze sou°adnic). Ale dß se zkrßtit tφm, ₧e se mφsto pou₧itφ
Set/Reset registr∙ pou₧je dvojφ zßpis do videopam∞ti.
Pon∞kud efektivn∞jÜφ zp∙sob pro kreslenφ bod∙ poskytuje
zapisovacφ m≤d 2.
V zapisovacφm m≤du 0 mohou b²t data z procesoru p°ed
kombinovßnφm s latch-registry zrotovßna a₧ o 7 bod∙. Tuto
funkci lze nastavit pomocφ Data rotate registru. Pomocφ
tohoto registru m∙₧eme takΘ urΦit zp∙sob jak²m se budou data
z CPU a latch-registr∙ kombinovat. K dispozici jsou Φty°i
mo₧nosti: p°epsßnφ a bitovΘ operace OR, XOR a AND.
Obrßzek 8b.
Zapisovacφ m≤d 2
V zapisovacφm m≤du 2 se nepou₧φvß Map mask registr (m∞l
by b²t nastaven na hodnotu 1111b). Barva bod∙ se zapisuje
p°φmo do videopam∞ti. Na tuto barvu se pak nastavφ ty bity,
kterΘ jsou pomocφ registru Bit mask odmaskovßny. Zobrazovßnφ
bod∙ v tomto m≤du je tedy jednoduÜÜφ ne₧ v zapisovacφm m≤du
0. StaΦφ nastavit p°φsluÜnou masku do Bit mask registru,
naΦφst latch-registry a ulo₧it barvu do pam∞ti adaptΘru.
Pomocφ Data rotate registru lze op∞t nastavit zp∙sob
kombinovßnφ dat s latch-registry. Nelze vÜak pou₧φt rotaci.
Pokud budete ve vaÜem programu pou₧φvat zapisovacφ m≤d
2 zßrove≥ s rutinami BIOS, musφte p°ed volßnφm BIOS rutiny
zajistit, aby byl nastaven zapisovacφ re₧im 0, proto₧e to
BIOS p°edpoklßdß. Zabrßnφte tak p°φpadn²m konflikt∙m p°i
zßpisu na obrazovku.
Zapisovacφ m≤d 1
Tento m≤d slou₧φ k p°esouvßnφ videopam∞ti. P°eΦtenφm
n∞jakΘ adresy v pam∞ti adaptΘru naΦtete do latch-registr∙
obsah tΘto adresy. P°i zßpisu do videopam∞ti (obvykle na
jinou adresu) se na toto mφsto v pam∞ti ulo₧φ obsah
latch-registr∙. Tento zapisovacφ m≤d je v²hodnΘ pou₧φt
zejmΘna pro p°enßÜenφ blok∙ obrazu. M∙₧ete si n∞jak² obraz
uschovat v neviditelnΘ Φßsti obrazovΘ pam∞ti a pak ho
p°enΘst do viditelnΘ (lze vyu₧φvat nap°. p°i animaci, nebo
·schov∞ podkladu oken).
╚tecφ m≤d 0
P°ed pou₧itφm tohoto Φtecφho m≤du musφme zvolit jakou
chceme Φφst bitovou rovinu. ╚φslo bitovΘ roviny k p°eΦtenφ
ulo₧φme do registru Read map select. (Narozdφl od Map mask
registru zde mohou b²t Φφsla od 0-3 a nikoli od 0 do 15. Je
to z°ejmΘ, kdy₧ si uv∞domφme, ₧e Φφst m∙₧eme pouze obsah
jednΘ roviny, kde₧to najednou m∙₧eme m∞nit vφce bitov²ch
rovin. Map mask registr mß pro ka₧dou bitovou rovinu
vyhrazen jeden bit, kter² urΦuje zda se do nφ bude
zapisovat. Oproti tomu Read map select registr obashuje
Φφslo bitovΘ roviny, kterß se bude Φφst.) PotΘ ji₧ staΦφ
p°eΦφst obsah pam∞ti adaptΘru a obdr₧φme p°φmo obsah jednoho
byte jednΘ bitovΘ roviny. Pokud chceme zjistit skuteΦnou
barvu n∞jakΘho bodu musφme postupn∞ naΦφtat obsahy bitov²ch
map 0, 1, 2 a 3 a v²slednou barvu urΦit slo₧enφm
jednotliv²ch p°eΦten²ch hodnot. K zjiÜt∞nφ barvy tedy
pot°ebuje 4 Φtenφ.
Obrßzek 8a.
╚tecφ m≤d 1
Tento m≤d pracuje pon∞kud odliÜn∞ od toho p°edchozφho.
Lze ho efektivn∞ uplatnit tam, kde chceme zjistit jestli mß
dan² bod n∞jakou urΦitou barvu. Tento Φtecφ m≤d toti₧
funguje tak, ₧e barvu Φten²ch osmi bod∙ porovnß s barvou
ulo₧enou v Color compare registru. V p°eΦtenΘm byte pak bit
s hodnotou 1 znamenß shodu barev p°φsluÜnΘho bodu s barvou
ulo₧enou v Color compare registru. Pokud bychom vÜak cht∞li
tento m≤d vyu₧φt pro zjiÜt∞nφ barvy bodu, hrozilo by nßm, ₧e
operace nastavenφ Color compare registru a Φtenφ pam∞ti,
budeme muset provΘst a₧ patnßctkrßt (do tΘ doby ne₧ se
"strefφme" do barvy bodu). Tento Φtecφ m≤d je v²hodnΘ pou₧φt
zejmΘna tam, kde porovnßvßme zda mß bod n∞jakou urΦitou
barvu. Tuto metodu Φasto pou₧φvajφ programy komprese
obrazov²ch dat zalo₧enΘ na algoritmu RLE (Run length
encoding) a algoritmy pro vypl≥ovßnφ ploch ohraniΦen²ch
barvou.
Pomocφ registru Color don't care m∙₧ete z porovnßvßnφ
vy°adit jakoukoli bitovou rovinu p°φpadn∞ jakoukoli
kombinaci bitov²ch rovin.
Organizace pam∞ti v re₧imech VESA
Standardnφ zobrazovacφ re₧imy karet VGA zdaleka
nevyu₧φvajφ vÜech jejich schopnostφ. Nap°φklad v m≤du
s nejvyÜÜφm rozliÜenφm (640 x 480) je vyu₧ito pouze 37.5K
adresnφho prostoru v segmentu vyhrazenΘm pro grafick²
adaptΘr a pouze 150K z celkov²ch 256K adaptΘru VGA. TakΘ
vÜechny registry jsou osmibitovΘ a vyu₧φvß se pouze jejich
polovina. Odtud tedy nebylo daleko ke zv∞tÜenφ hloubky barev
na 8 bit∙ a ke zv²Üenφ rozliÜenφ.
NejΦast∞ji pou₧φvan² m≤d rozÜi°ujφcφ mo₧nosti karet VGA
byl m≤d 800 x 600 s 16 barvami. Spot°eboval asi 235K z 256K
adaptΘru VGA a jeÜt∞ se cel² najednou veÜel do jenoho
adresnφho segmentu procesoru (zabral asi 60K). Navφc
stranov² pom∞r p°i rozliÜenφ 800 x 600 je stejn² jako p°i
rozliÜenφ 640 x 480. K pou₧itφ tohoto m≤du nebylo t°eba
mnoho m∞nit. Ve stßvajφcφch programech v∞tÜinou staΦilo
pouze zm∞nit poΦet byte na jednΘ zobrazovacφ °ßdce. Pokud
m∞l adaptΘr vφce pam∞ti a podporoval 256 barev, jedinß zm∞na
spoΦφvala v prßci s cel²mi registry a ne pouze s jejich
Φty°mi bity.
Nov∞jÜφ m≤dy 1024 x 768 p°ekroΦily hranice jednoho
segmentu. Zdßnliv∞ by zde nem∞l b²t problΘm, nebo¥
v poΦφtaΦφch IBM PC je pro videoadaptΘry vyhrazena pam∞¥ na
adesßch a0000-bffff. Pro hardware adaptΘr∙ by nebyl ₧ßdn²
problΘm mapovat videopam∞¥ do dvou segment∙. Byla by vÜak
ztracena mo₧nost pou₧φvat dva zobrazovacφ adaptΘry najednou
(doÜlo by k p°ekrytφ oblasti vyhrazenΘ pro MDA). N∞kterΘ
Super VGA drze obsadφ celΘ dva segmenty. Ty sluÜn∞jÜφ
pou₧φvajφ p°epφnanφ pam∞¥ov²ch bank a st∞snajφ se i do
jenoho segmentu. SystΘm pam∞¥ov²ch bank je velmi star²
a lze ho popsat nßsledovn∞: je vyhrazen urΦit² menÜφ adresnφ
prostor procesoru. Hardware adaptΘru pak do tohoto prostoru
m∙₧e v₧dy umφstit Φßst svΘ pam∞ti. Ve stejnΘm adresnφm
prostoru se mohou v r∙znΘm okam₧iku nachßzet r∙znΘ Φßsti
mapovanΘ pam∞ti. Tyto Φßsti pam∞ti se naz²vajφ banky
a v p°φpad∞ grafick²ch adaptΘru okna.
Norma VESA podporuje t°i r∙znΘ konfigurace oken.
JednoduchΘ okno, p°ekryvnß okna a nep°ekryvnß okna. Pokud
pou₧ijete prvnφ z nich, p°ekryvnΘ okno, budete mφt mo₧nost
Φφst i zapisovat v rßmci celΘho 64K segmentu. Konfigurace se
dv∞ma okny se liÜφ p°φstupem k Φtenφ a zßpisu do pam∞ti.
Pokud pou₧φvßte p°ekryvnß okna, Φtenφ dat z videopam∞ti
zajistφ Φtenφ z jednΘ banky a zapsßnφ dat do pam∞ti zajistφ
zßpis do jinΘ banky. Dv∞ banky jsou tedy jakoby nad sebou,
Φte se z jednΘ a p°i zßpisu je aktivnφ ta druhß. Pokud
pou₧φvate nep°ekryvnß okna, jsou v pam∞ti dv∞ banky
namapovßny za sebou. Mohou slou₧it ke Φtenφ nebo k zßpisu.
Obvykle je prvnφ okno urΦeno k zßpisu a druhΘ ke Φtenφ. Ale
nenφ to pravidlo, tuto informaci si zjist∞te pomocφ slu₧eb
VESA Super VGA BIOS.
Banka pam∞ti nem∙₧e zaΦφnat na libovolnΘm mφst∞ pam∞ti
videoadaptΘru. Offset banky musφ b²t nßsobkem granularity
(obvykle 32K nebo 64K).
[PokraΦovßnφ] |
[Obsah]
Copyright © Ji°φ Kosek