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