Programovani grafickych karet EGA/VGA

     Doposud popsane zpusoby ovladani zobrazovani mely jednu
velkou vyhodu. Tim, ze slo o sluzby BIOS, bylo zajisteno, ze
program pouzivajici pouze tato volani, bude pracovat na
libovolne graficke karte. Program obsahoval pouze volani
sluzby BIOS a teprve ta provedla prislusnou cinnost na
instalovanem adapteru. Nemuseli jste se tedy skoro vubec
zajimat o to, jakou mate v systemu instalovanou grafickou
kartu. Vypada to az prilis jednoduse. Je zde tedy nejaky
hacek. Za ziskanou flexibilitu musite necim zaplatit.
V tomto pripade neprichazite o koruny ani dolary z uctu, ale
o rychlost. Protoze sluzby BIOS musi pracovat na vsech
moznych grafickych kartach, nemohou optimalne vyuzivat
vsechny schopnosti tak velkeho poctu karet. Musite se tedy
rozhodnout zda preferujete rychlost ci prenositelnost. Ve
druhem pripade muzete pouzit BIOS. V tom prvnim se musite
podrobne seznamit z organizaci pameti videoadapteru
a ovladanim jeho registru. Pokud pak chcete, aby nejaky vas
program pracoval na vice ruznych zobrazovacich kartach,
musite vytvorit nekolik jeho verzi. Tak, aby k jedne
graficke karte prislusela jedna verze programu.
     Nejcasteji se programovani adapteru pouziva
v grafickych zobrazovacich rezimech. Je to nutnost, protoze
BIOS praci v techto rezimech temer nepodporuje (obsahuje
pouze velice pomale rutiny pro zobrazeni bodu a pro zjisteni
barvy bodu). Nez se vsak pustite do tvorby vlastnich
programu pro ovladani adapteru, zjistete, zda vasim
pozadavkum nevyhovuje nejaka z mnoha bezne dostupnych
grafickych knihoven (BGI, TEGL, TGE ...). Muzete tak usetrit
velke mnozstvi prace, ktera je jiz jednou hotova.
Zjistite-li vsak, ze vam uvedene knihovny necim nevyhovuji,
je prava chvile pro to, abyste zacali cist nasledujici
odstavce. Meli byste v nich najit vse potrebne, pro psani
programu pro karty EGA a VGA.


                     Organizace pameti

     Jiste vite, ze na grafickem adapteru je obsazena pamet.
Obvykle jsou VGA karty s pameti 256K, 512K a 1MB (nektere
lepsi maji i 2 a vice MB pameti). I ta nejjednodussi karta
VGA ma 256K pameti. V prostredi MS-DOS vsak pracuji vsechny
procesory Intel v realnem rezimu, tzn. mohou adresovat pouze
1MB pameti. V tomto stisnenem pametovem prostoru musi byt
misto pro MS-DOS, aplikacni programy, BIOS, Video BIOS
a take samozrejme pro pamet grafickeho adapteru (viz
obr. 2). Pro pamet grafickeho adapteru je vyhrazen pametovy
prostor a000:0000 az b000:ffff, tj. 128K. To je, ale dvakrat
mene nez ma nejjednodusi VGA karta. Adapter tedy pouziva
ruzne metody organizece pameti tak, aby s vyhrazenym
adresnim prostorem vystacil. Adapter do teto oblasti
premapovava svoji pamet tak, aby byla data logicky
a jednosuse usporadana. Skutecne ulozeni dat v pameti
videoadapteru byva mnohem slozitejsi, ale nemusi nas prilis
zajimat, protoze jeho mapovani je pro nas transparentni.
V pripadech, kdy je vyhodne znat i toto vnitrni usporadani,
bude popsano. Organizece pameti se pro textove a graficke
rezimy lisi a bude tedy vysvetlena oddelene.


          Organizace pameti v textovych rezimech

     V textovych rezimech jsou v pameti ulozeny ASCII kody
zobrazovanych znaku spolu s jejich atributy (barvou). Prvni
dva byte pameti priluseji znaku v levem hornim rohu.
Nasledujici slovo (2 byte) prislusi znaku napravo od znaku
v levem hornim rohu. Znaky jsou v pameti tedy zaznamenany
sekvencne tak, ze nejprve jsou ulozeny zleva doprava znaky
a atributy prvniho radku, pak zleva doprava druheho radku
atd. Informace o kazdem znaku je ulozena ve dvou byte. Prvni
z nich obsahuje ASCII kod znaku a druhy atribut znaku (viz
obr. 3). Atribut znaku ma nasledujici strukturu:

       /------------------------------------------------\
       |blikani|  barva pozadi  | inten- | barva znaku  |
       |       |                | zita   |              |
       |-------+----------------+--------+--------------|
  MSB  |   7   |  6  |  5  |  4 |   3    | 2  | 1 |  0  |
       \------------------------------------------------/

Standardni prirazeni barev pro barevne monitory je
nasledujici:

       Bity 4-6 (barva pozadi):
       ------------------------
            000 cerna
            001 modra
            010 zelena
            011 tyrkysova
            100 cervena
            101 fialova
            110 hneda
            111 bila

       Bity 0-3 (barva znaku):
       -----------------------
            0000 cerna
            0001 modra
            0010 zelena
            0011 tyrkysova
            0100 cervena
            0101 fialova
            0110 hneda
            0111 svetle seda
            1000 tmave seda
            1001 svetle modra
            1010 svetle zelena
            1011 svetle tyrkysova
            1100 svetle cervena
            1101 svetle fialova
            1110 zluta
            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.
     Pro barevne rezimy (00h, 01h, 02h a 03h) zacina pamet
obrazovky na adrese b800:0000. Pro monochromaticke rezimy
(07h) a pro nektere textove rezimy Super VGA (ty s vetsim
poctem sloupcu nez 80) zacina pamet obrazovky na adrese
b000:0000. Pro zobrazeni znaku staci zapsat na prislusne
adresy jeho ASCII kod a atribut. Pokud naopak chcete zjistit
jaky znak je nejake pozici, prectete jeho ASCII kod
a atribut z prislusnych adres.
     Ke zjisteni adresy znaku o souradnicich X, Y slouzi
nasledujici vzorce:
     Segment = b800 nebo b000 (podle modu)
     Offset = Y * 2 * Pocet_znaku_na_radce + 2 * X
Adresa atributu bude mit offset zvetseny o jedna.
Pocet_znaku_na_radce je konstanta zavisla na zobrazovacim
rezimu. jeji nejbeznejsi velikost je 80, ale existuji mody,
kde ma hodnotu 40 ci 132. Toto plati pro zabrazovaci stranku
0. Pokud byste chteli pouzivat i jine zobrazovaci stranky
musite k offsetu pricist hodnoty podle nasledujici tabulky:
   /-------------------------------------------------\
   |         |       Posunuti pro ruzne mody         |
   |         |---------------------------------------|
   | Stranka | Mody 0,1 (40x25) | Mody 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 pameti v grafickych rezimech CGA

     Zobrazovaci rezimy 4, 5 a 6 zachovavaji na kartach
EGA/VGA komapatibilitu s puvodni kartou CGA. Stejna jako
u CGA zustala v techto rezimech i organizace videopameti.
Obsah pameti primo urcuje vyslednou zobrazovanou barvu.
V modech 4 a 5 prislusi pro kazdy pixel dva bity (tj.
vysledne ctyri barvy). V modu 6 (640 x 200) odpovida pixelu
jeden bit. Zvlastnosti techto rezimu je, ze maji prokladane
usporadani obrazove pameti. To znamena, ze sude radky jsou
ulozeny v jedne oblasti pameti a liche radky v jine casti
pameti. Bity odpovidajici jednotlivym pixelum v radce jsou
v pameti opet zapsany zleva doprava. Sude radky jsou
v pameti ulozeny od adresy b800:0000 a liche od adresy
ba00:0000 (viz obr. 4). Pokud si na obrazovce zvolime
souradny system tak, ze levy horni roh bude mit souradnice
(0,0) a smerem dolu a doprava se budou souradnice bodu
zvetsovat, pak adresu a bity prislusejici pixelu
o souradnicich X a Y zjistime podle nasledujiciho:
     Segment = pro sude radky - b800
               pro liche radky - ba00
     Offset = Y div 2 * 80 + X div 8 (4 pro mody 4 a 5)
     Bit pro mod 6 = 7 - (X mod 7)
     Bity pro mody 4, 5 = (3 - (X mod 3)) * 2
                        a (3 - (X mod 3)) * 2 + 1
Pozn. div je oznaceni operace celociselneho deleni a mod je
oznaceni operace vracejici zbytek celociselneho deleni.


         Organizace pameti v grafickem rezimu 13h
                  (320 x 200, 256 barev)

     Tento rezim VGA ma asi nejjednodusi organizaci pameti
ze vsech moznych zobrazovacich rezimu. Kazdy byte pameti
odpovida jednomu bodu, ktery tedy muze mit jednu z 256
barev. Jednotlive pixely radku jsou v pameti opet ulozeny
zleva doprava (viz obr. 5). Vypocet adresy, na ktere je
ulozena barva pixelu je opravdu jednoduchy:
     Segment = a000
     Offset = Y * 80 + X


 Organizace pameti v ostatnich grafickych rezimech EGA/VGA

     Pro vsechny tyto zobrazovaci rezimy zacina pamet na
adrese a000:0000. K ulozeni grafickych dat je volny tedy
jeden segment (a000). Jeden segment pojme 64K dat, ale
nejvyssi rezim VGA 12h potrebuje k ulozeni informace o celem
obrazu 150K. Jak tedy stesnat 150K do 64K?
     V tomto modu kazdy bit pameti odpovida jednomu pixelu
na obrazovce. Jeden byte pameti tedy odpovida 8 pixelum.
Pixely jsou v pameti opet ulozeny po radcich od shora dolu
a jednotlive body radky jsou ulozeny zleva doprava. Bit
s nejvyssi vahou v byte odpovida pixelu, ktery je nejvice
nalevo (viz obr. 6).
     Jeden bit nam ale k ulozeni 16 barev nestaci. Na jedne
adrese jsou tedy 4 bity misto jednoho. Tato technika
organizace pameti se nazyva bitove roviny (viz obr. 7).
Muzeme si ji totiz predstavit jako nekolik bank pameti
polozenych na sebe. Na jedne adrese se pak nachazi ctyri
bity (z kazde banky/bitove roviny jeden). Kombinaci techto
4 bitu dostavame pro kazdy pixel jednu z 16 moznych barev.
     Usporadani pameti do bitovych rovin ma nekolik vyhod.
Prvni vyhodou je to, ze pozice pixelu na obrazovce primo
odpovida pozici prislusneho bitu v pameti. V pripade
standardniho nastaveni barev kazda bitova rovina odpovida
jedne ze zakladni barev a intenzite barvy. Druhou vyhodou je
snadne pridani barev. Pokud pridame jeste jednu bitovou
rovinu, pocet pouzitelnych barev se zdvojnasobi a rutiny
pocitajici adresy bodu ze souradnic zustanou naprosto
stejne. Treti vyhodou je moznost modifikovat pamet stejne
rychle v dvoubarevnem i 256barevnem modu, protoze obsah
vsech rovin muze byt zmenen jednim zapisem do pameti.
     Samozrejme, ze jsou k dispozici ruzne metody pristupu
k bitovym rovinam. Kdyby sla do vsech najednou zapsat pouze
jednicka nebo nula, meli bychom k dispozici pouhe dve barvy.
Existuji tri metody zapisu do videopameti a dve metody
cteni videopameti. Kazda z techto metod, ktere nam
umoznuji praci se vsemi barvami, ma sve vyhody i sva
omezeni. Jejich funkce zde podrobne probereme.

Zapisovaci mod 0
     Tento zapisovaci mod je pouzivan rutinami BIOS. Pouziva
registru Map mask k urceni bitovych map, do kterych se bude
zapisovat. Pokud menite barvu, kterou kreslite na obrazovku,
musite zmenit i obsah Map mask registru. Je zde ale jedna
mala osemetnost. Rekneme, ze chcete na obrazovku nakreslit
neco urcitou barvou. Ulozite tedy tuto barvu do Map mask
registru a zapisete do pameti jednicky. Tim dosahnete toho,
ze se prislusne bitove roviny nastavi na jedna. Pokud by ale
bitove roviny neobsazene v Map mask registru obsahovaly jiz
odpredtim nejake bity nastavene na jedna, nedostali byste na
obrazovce barvu, kterou jste pozadovali. K tomu abyste
obdrzeli bod o potrebne barve, musite tedy zajistit
i vynulovani prislusnych bitovych rovin. Existuji dve mozne
cesty.
     Tou prvni je nejprve zapsat do bitovych rovin
neprislusejicich zapisovane barve nuly a pote do rovin
prislusejicich zapisovane barve zapsat jednicky. Nejprve
tedy musite nastavit Map mask registr na binarni negaci
zapisovane barvy, zapsat do pameti nuly. Pak nastavite Map
mask registr na zapisovanou barvu a zapisete do pameti
jednicky. (Pozn. binarni negaci nejakeho cisla ziskate tak,
ze v danem cisle obratete jenicky na nuly a naopak. Binarni
negace binarniho cisla 0011 je tedy 1100.)
     Druha cesta vede pres pouziti Set/Reset a Enable
Set/Reset registru. Pri vhodnem nastaveni techto dvou
registru muzete dosahnout toho, ze potrebne bitove roviny se
pri zapisu do pameti automaticky nastavi na nulu. Abyste
mohli pouzit teto metody, nejprve zapiste do registru
Set/Reset nulu. Pak do registru Enable Set/Reset zapiste
binarni negaci barvy. Map mask registr nastavte na
pozadovanou barvu a provedte zapis do pameti.
     Procesor normalne zapisuje jeden byte najednou. Zapisem
do videopameti zmenime tedy 8 pixelu najednou.
V mastavenych bitovych rovinach se bity podle zapisovane
hodnoty nastavi na jedna nebo na nula. To nam umoznuje
zobrazovat znaky, ktere jsou siroke osm bodu, ale neumoznuje
nam to zobrazit samostatny bod. K tomu, abychom menili jenom
nektere vybrane body z cele osmice, pouzijeme Bit mask
registr. Pokud je nejaky bit Bit mask registru nastaven na
jedna, prislusne bity v bitovych rovinach se pri zapisu
zmeni. Bity rovin, ktere maji odpovidajici bity Bit mask
registru nastaveny na nulu, zustanou zapisem nezmeneny.
     Pri zapisu se kombinuji data posilana procesorem s jiz
ulozenymi daty. Aby toto bylo umozneno, musi byt pred
zapisem nacten puvodni obsah videopameti do tzv.
latch-registru. K nacteni latch-registru muzeme pouzit
kuprikladu nasledujici instrukci: MOV AL, ES:[BX], kde
ES:[BX] ukazuje na pozadovanou adresu. Latch registry jsou
osmibitove a jsou ctyri (pro kazdou bitovou rovinu jeden).
Teprve pote co spravne nastavime vsechny registry a nacteme
latch registry, muzeme zapsisovat do videopameti.
     Nyni si ukazeme, jak zobrazit na nejake souradnici
barevny bod. Chtejme napriklad nakreslit cerveny bod na
souradnicich (100, 100). Nejprve urcime adresu byte, ve
kterem lezi bit prislusejici nasemu bodu. Tuto adresu
ziskame tak, ze souradnici y vynasobime poctem byte na
zobrazovaci radku (tech je 80) a pricteme k ni souradnici x.
Dostavame 100 * 80 + 100 = 8100. Video pamet je v techto
zobrazovacich modech mapovana do segmentu a000h. Do registru
DS ulozime hodnotu a000h a do registru BX hodnotu 8100.
DS:[BX] nyni ukazuje na byte, ve kterem lezi bit
prislusejici nasemu bodu. Cislo bitu, ktery prislusi nasemu
bodu zjistime jako: 7 - ( X and 7). Jednodusi je ale umistit
do nejakeho registru hodnotu 80h (10000000b) a posunout ji
o (X and 7) doprava (to vyplyva z toho, ze bit 7 odpovida
bodu na levem okraji byte). Tak dostaneme primo bitovou
masku, kterou umistime do Bit mask registru. Cervena barva
ma cislo 4, umistime ho tedy do Map mask registru.
Set/Reset registr nastavime na 0 a Enable Set/Reset registr
na binarni negaci 4 (4=0100b => 4'=1011b). Pak nacteme
latch-registry a ulozime masku na patricnou adresu.
V assembleru nakresleni bodu muze vypadat napriklad takto
(Predpokladame, ze DS:[BX] ukazuje na prislusnou adresu
a v registru AH je nastavena bitova maska bodu. V ukazce se
pouzivaji registry grafickeho adapteru. Jejich podrobnejsi
popis a popis jejich ovladani je uveden v samostatne casti
o registrech.):

     mov    DX, 3ceh         ;do DX port Graphics adress registru
     mov    AL, 8            ;index Bit mask registru
     out    DX, AL
     inc    DX               ;datovy port Graphics controlleru
     mov    AL, AH           ;do AL bitova maska
     out    DX, AL           ;nastavi bitovou masku
     dec    DX               ;opet indexovy 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               ;opet port Graphics adress registru
     mov    AL, 1            ;index Enable Set/Reset registru
     out    DX, AL
     inc    DX               ;datovy port Graphics controlleru
     mov    AL, 1011b        ;negace cervene barvy
     mov    DX, 3c4h         ;port Sequencer controlleru
     mov    AL, 2            ;index Map mask registru
     out    DX, AL
     inc    DX               ;port datoveho registru Sequenceru
     mov    AL, 0100b        ;cervena barva
     out    DX, AL
     mov    AL, [BX]         ;nacte latch registry
     mov    [BX], AH         ;zobrazi bod, tj. zkombinuje bitovou masku s latch registry

     Je to ponekud dlouhy program na to, ze zobrazuje pouze
jeden bod (a jeste neni zahrnut kod pro vypocet adresy bodu
ze souradnic). Ale da se zkratit tim, ze se misto pouziti
Set/Reset registru pouzje dvoji zapis do videopameti.
Ponekud efektivnejsi zpusob pro kresleni bodu poskytuje
zapisovaci mod 2.
     V zapisovacim modu 0 mohou byt data z procesoru pred
kombinovanim s latch-registry zrotovana az o 7 bodu. Tuto
funkci lze nastavit pomoci Data rotate registru. Pomoci
tohoto registru muzeme take urcit zpusob jakym se budou data
z CPU a latch-registru kombinovat. K dispozici jsou ctyri
moznosti: prepsani a bitove operace OR, XOR a AND.
Obrazek 8b.

Zapisovaci mod 2
     V zapisovacim modu 2 se nepouziva Map mask registr (mel
by byt nastaven na hodnotu 1111b). Barva bodu se zapisuje
primo do videopameti. Na tuto barvu se pak nastavi ty bity,
ktere jsou pomoci registru Bit mask odmaskovany. Zobrazovani
bodu v tomto modu je tedy jednodussi nez v zapisovacim modu
0. Staci nastavit prislusnou masku do Bit mask registru,
nacist latch-registry a ulozit barvu do pameti adapteru.
Pomoci Data rotate registru lze opet nastavit zpusob
kombinovani dat s latch-registry. Nelze vsak pouzit rotaci.
     Pokud budete ve vasem programu pouzivat zapisovaci mod
2 zaroven s rutinami BIOS, musite pred volanim BIOS rutiny
zajistit, aby byl nastaven zapisovaci rezim 0, protoze to
BIOS predpoklada. Zabranite tak pripadnym konfliktum pri
zapisu na obrazovku.

Zapisovaci mod 1
     Tento mod slouzi k presouvani videopameti. Prectenim
nejake adresy v pameti adapteru nactete do latch-registru
obsah teto adresy. Pri zapisu do videopameti (obvykle na
jinou adresu) se na toto misto v pameti ulozi obsah
latch-registru. Tento zapisovaci mod je vyhodne pouzit
zejmena pro prenaseni bloku obrazu. Muzete si nejaky obraz
uschovat v neviditelne casti obrazove pameti a pak ho
prenest do viditelne (lze vyuzivat napr. pri animaci, nebo
uschove podkladu oken).

Cteci mod 0
     Pred pouzitim tohoto cteciho modu musime zvolit jakou
chceme cist bitovou rovinu. Cislo bitove roviny k precteni
ulozime do registru Read map select. (Narozdil od Map mask
registru zde mohou byt cisla od 0-3 a nikoli od 0 do 15. Je
to zrejme, kdyz si uvedomime, ze cist muzeme pouze obsah
jedne roviny, kdezto najednou muzeme menit vice bitovych
rovin. Map mask registr ma pro kazdou bitovou rovinu
vyhrazen jeden bit, ktery urcuje zda se do ni bude
zapisovat. Oproti tomu Read map select registr obashuje
cislo bitove roviny, ktera se bude cist.) Pote jiz staci
precist obsah pameti adapteru a obdrzime primo obsah jednoho
byte jedne bitove roviny. Pokud chceme zjistit skutecnou
barvu nejakeho bodu musime postupne nacitat obsahy bitovych
map 0, 1, 2 a 3 a vyslednou barvu urcit slozenim
jednotlivych prectenych hodnot. K zjisteni barvy tedy
potrebuje 4 cteni.
Obrazek 8a.


Cteci mod 1
     Tento mod pracuje ponekud odlisne od toho predchoziho.
Lze ho efektivne uplatnit tam, kde chceme zjistit jestli ma
dany bod nejakou urcitou barvu. Tento cteci mod totiz
funguje tak, ze barvu ctenych osmi bodu porovna s barvou
ulozenou v Color compare registru. V prectenem byte pak bit
s hodnotou 1 znamena shodu barev prislusneho bodu s barvou
ulozenou v Color compare registru. Pokud bychom vsak chteli
tento mod vyuzit pro zjisteni barvy bodu, hrozilo by nam, ze
operace nastaveni Color compare registru a cteni pameti,
budeme muset provest az patnactkrat (do te doby nez se
"strefime" do barvy bodu). Tento cteci mod je vyhodne pouzit
zejmena tam, kde porovnavame zda ma bod nejakou urcitou
barvu. Tuto metodu casto pouzivaji programy komprese
obrazovych dat zalozene na algoritmu RLE (Run length
encoding) a algoritmy pro vyplnovani ploch ohranicenych
barvou.
     Pomoci registru Color don't care muzete z porovnavani
vyradit jakoukoli bitovou rovinu pripadne jakoukoli
kombinaci bitovych rovin.


             Organizace pameti v rezimech VESA

     Standardni zobrazovaci rezimy karet VGA zdaleka
nevyuzivaji vsech jejich schopnosti. Napriklad v modu
s nejvyssim rozlisenim (640 x 480) je vyuzito pouze 37.5K
adresniho prostoru v segmentu vyhrazenem pro graficky
adapter a pouze 150K z celkovych 256K adapteru VGA. Take
vsechny registry jsou osmibitove a vyuziva se pouze jejich
polovina. Odtud tedy nebylo daleko ke zvetseni hloubky barev
na 8 bitu a ke zvyseni rozliseni.
     Nejcasteji pouzivany mod rozsirujici moznosti karet VGA
byl mod 800 x 600 s 16 barvami. Spotreboval asi 235K z 256K
adapteru VGA a jeste se cely najednou vesel do jenoho
adresniho segmentu procesoru (zabral asi 60K). Navic
stranovy pomer pri rozliseni 800 x 600 je stejny jako pri
rozliseni 640 x 480. K pouziti tohoto modu nebylo treba
mnoho menit. Ve stavajicich programech vetsinou stacilo
pouze zmenit pocet byte na jedne zobrazovaci radce. Pokud
mel adapter vice pameti a podporoval 256 barev, jedina zmena
spocivala v praci s celymi registry a ne pouze s jejich
ctyrmi bity.
     Novejsi mody 1024 x 768 prekrocily hranice jednoho
segmentu. Zdanlive by zde nemel byt problem, nebot
v pocitacich IBM PC je pro videoadaptery vyhrazena pamet na
adesach a0000-bffff. Pro hardware adapteru by nebyl zadny
problem mapovat videopamet do dvou segmentu. Byla by vsak
ztracena moznost pouzivat dva zobrazovaci adaptery najednou
(doslo by k prekryti oblasti vyhrazene pro MDA). Nektere
Super VGA drze obsadi cele dva segmenty. Ty slusnejsi
pouzivaji prepinani pametovych bank a stesnaji se i do
jenoho segmentu. System pametovych bank je velmi stary
a lze ho popsat nasledovne: je vyhrazen urcity mensi adresni
prostor procesoru. Hardware adapteru pak do tohoto prostoru
muze vzdy umistit cast sve pameti. Ve stejnem adresnim
prostoru se mohou v ruznem okamziku nachazet ruzne casti
mapovane pameti. Tyto casti pameti se nazyvaji banky
a v pripade grafickych adapteru okna.
     Norma VESA podporuje tri ruzne konfigurace oken.
Jednoduche okno, prekryvna okna a neprekryvna okna. Pokud
pouzijete prvni z nich, prekryvne okno, budete mit moznost
cist i zapisovat v ramci celeho 64K segmentu. Konfigurace se
dvema okny se lisi pristupem k cteni a zapisu do pameti.
Pokud pouzivate prekryvna okna, cteni dat z videopameti
zajisti cteni z jedne banky a zapsani dat do pameti zajisti
zapis do jine banky. Dve banky jsou tedy jakoby nad sebou,
cte se z jedne a pri zapisu je aktivni ta druha. Pokud
pouzivate neprekryvna okna, jsou v pameti dve banky
namapovany za sebou. Mohou slouzit ke cteni nebo k zapisu.
Obvykle je prvni okno urceno k zapisu a druhe ke cteni. Ale
neni to pravidlo, tuto informaci si zjistete pomoci sluzeb
VESA Super VGA BIOS.
     Banka pameti nemuze zacinat na libovolnem miste pameti
videoadapteru. Offset banky musi byt nasobkem granularity
(obvykle 32K nebo 64K).

[Pokracovani]


Copyright © Jiri Kosek