Typy a triky
       aneb nekolik uzitecnych rad pro programovani
                     grafickych karet

     V nasledujicich nekolika odstavcich se zminim o
nekolika nejcastejsich problemech a otazkach, ktere
vyvstanou pri psani programu pracujicih primo s registry
a videopameti. Zaroven se dozvite, jake je jejich reseni,
jaka je na ne odpoved.

Jak zvolit spravny zapisovaci mod ?
     Pri kresleni na obrazovku v grafickych rezimech jsme
postaveni pred zasadni problem, ktery ze dvou nabizenych
zapisovacich modu zvolit. Ve vetsine pripadu se jako
vyhodnejsi jevi pouzit zapisovaci rezim 2, ktery umoznuje
nastavit barvu bodu pouze jednim zapisem. Nesmime vsak
zapomenout nastavit na konci programu zpet zapisovaci rezim
0, ktery je pozadovan pro korektni praci sluzeb BIOS.

Jak co nejoptimalneni pristupovat k videopameti ?
     Procesory Intel 80x86 adresuji pamet po 64K segmentech
se vsemi z toho plynoucimi vyhodami a nevyhodami. Pokud
zapisujete do videopameti, musi nejaky segmentovy registr
obsahovat hodnotu segmentu videopameti. Obvykle registr DS
obsahuje datovy segment programu a ES obsahuje segment
videopameti. Pri pristupu k videopameti se pak pouziva
explicitniho urceni segmentu (instrukce ve tvaru MOV
ES:[BX], AL). Instrukce v tomto tvaru zapricini pridani kodu
prefixu segmetu pred vlastni instrukcni kod. To samozrejme
vede ke zpomaleni provadeni instrukce. Je tedy vzdy dobre
zjistit, zda v ramci nejakeho dilciho useku programu
nepristupujeme casteji k videopameti nez k datovemu segmentu
programu a pokud tomu tak je, pak je vyhodne umistit alespon
docasne segment obrazove pameti do registru DS.
     Dalsi zpomaleni pristupu do videopameti je zapricineno
hardwarovou konstrukci adapteru. O pristup k videopameti se
deli adapter s procesorem, pristup k ni je tedy mnohem
pomalejsi nez ke konvencni pameti. Nasi snahou by melo byt
omezeni pristupu k videopameti, ktere nekdy lze provest,
nekdy je naopak velmi obtizne. Priklad tohoto druhu
optimalizace je uveden v rutine na kresleni cary uvedene na
konci clanku. Jenotlive body, ktere patri do stejneho byte
videopameti se zde shromazduji a zapisi se jako celek.
Oproti verzi, ktera k videopameti pristupuje po kazdem bodu,
muzeme zaznamenat az osminasobne zmensene poctu pristupu do
pameti (tento pripad nastane v pripade kresleni horizontalni
cary). Odpovidajicim zpusobem se zvetsi i rychlost rutiny,
protoze vzhledem k jednoduchosti vypoctu je pocet pristupu
k pomale pameti rozhodujici.
     Dalsim zlepsovakem (opet pouzitym v rutine pro kresleni
cary) je snizeni poctu instrukci procesoru potrebnych k
modifikaci videopameti. Timto snizenim dosahneme i zrychleni
programu. Casto pouzivanou sekvenci prikazu:
     MOV   AL, [BX]    ; nacteni latch-registru
     MOV   [BX], AH    ; zapis hodnoty v AH do videopameti
muzeme nahradit mnohem kratsi:
     XCHG  [BX], AH    ; nejprve se nactou latch-registry
                         a pote bude do pameti zapsana
                         hodnota registru AL
Nesmime zapomenout na to, ze po provedeni instrukce XCHG
nemuzeme rici nic urciteho o obsahu registru AH (pripadne
nejakeho jineho pouziteho). Pred kazdym pristupem do pameti
musime registr znovu naplnit cislem barvy (zapisovaci rezim
2) nebo bitovou maskou (zapisovaci rezim 0).

Detekce instalovane graficke karty
     Kazdy program by ma svem samem zacatku mel zjistit zda
ma dostupne vsechny technicke prostredky potrebne pro svoji
spravnou cinnost. Jednim z nich je i graficka karta. Pro
testovani pritomnosti nam nabizi casto postacujici moznosti
sam BIOS. Pro zjisteni karty VGA muzeme pouzit sluzbu 1ah
funkci 00h - cteni kombinace monitoru. Pokud funkce vratila
v registru AL hodnotu 1ah, je instalovana karta VGA. Pokud
ne, muzeme se posunout o uroven niz a testovat pritomnost
EGA funkci 10h sluzby 12h. Pokud po zavolani funkce bude
nastaven registr BL na hodnotu 0-3, je v systemu pritomna
EGA.
     Jelikoz nektere graficke karty nejsou uplne
kompatibilni a nemuseji vracet spravne hodnoty po volani
sluzeb BIOS, mel by program umoznovat prekryt automatickou
detekci. Nejlepe pomoci parametru programu nebo
konfiguracniho souboru, kde by byla zapsana informace o
typu pouziteho adapteru.

[Pokracovani]


Copyright © Jiri Kosek