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