Typy a triky
aneb několik užitečných rad pro programování
grafických karet
V následujících několika odstavcích se zmíním o
několika nejčastějších problémech a otázkách, které
vyvstanou při psaní programů pracujícíh přímo s registry
a videopamětí. Zároveň se dozvíte, jaké je jejich řešení,
jaká je na ně odpověď.
Jak zvolit správný zapisovací mód ?
Při kreslení na obrazovku v grafických režimech jsme
postaveni před zásadní problém, který ze dvou nabízených
zapisovacích módů zvolit. Ve většině případů se jako
výhodnější jeví použít zapisovací režim 2, který umožňuje
nastavit barvu bodů pouze jedním zápisem. Nesmíme však
zapomenout nastavit na konci programu zpět zapisovací režim
0, který je požadován pro korektní práci služeb BIOS.
Jak co nejoptimálněni přistupovat k videopaměti ?
Procesory Intel 80x86 adresují paměť po 64K segmentech
se všemi z toho plynoucími výhodami a nevýhodami. Pokud
zapisujete do videopaměti, musí nějaký segmentový registr
obsahovat hodnotu segmentu videopaměti. Obvykle registr DS
obsahuje datový segment programu a ES obsahuje segment
videopaměti. Při přístupu k videopaměti se pak používá
explicitního určení segmentu (instrukce ve tvaru MOV
ES:[BX], AL). Instrukce v tomto tvaru zapříčiní přidání kódu
prefixu segmetu před vlastní instrukční kód. To samozřejmě
vede ke zpomalení provádění instrukce. Je tedy vždy dobré
zjistit, zda v rámci nějakého dílčího úseku programu
nepřistupujeme častěji k videopaměti než k datovému segmentu
programu a pokud tomu tak je, pak je výhodné umístit alespoň
dočasně segment obrazové paměti do registru DS.
Další zpomalení přístupu do videopaměti je zapříčiněno
hardwarovou konstrukcí adaptéru. O přístup k videopaměti se
dělí adaptér s procesorem, přístup k ní je tedy mnohem
pomalejší než ke konvenční paměti. Naší snahou by mělo být
omezení přístupu k videopaměti, které někdy lze provést,
někdy je naopak velmi obtížné. Příklad tohoto druhu
optimalizace je uveden v rutině na kreslení čáry uvedené na
konci článku. Jenotlivé body, které patří do stejného byte
videopaměti se zde shromažďují a zapíší se jako celek.
Oproti verzi, která k videopaměti přistupuje po každém bodu,
můžeme zaznamenat až osminásobné zmenšené počtu přístupů do
paměti (tento případ nastane v případě kreslení horizontální
čáry). Odpovídajícím způsobem se zvětší i rychlost rutiny,
protože vzhledem k jednoduchosti výpočtů je počet přístupů
k pomalé paměti rozhodující.
Dalším zlepšovákem (opět použitým v rutině pro kreslení
čáry) je snížení počtu instrukcí procesoru potřebných k
modifikaci videopaměti. Tímto snížením dosáhneme i zrychlení
programu. Často používanou sekvenci příkazů:
MOV AL, [BX] ; načtení latch-registrů
MOV [BX], AH ; zápis hodnoty v AH do videopaměti
můžeme nahradit mnohem kratší:
XCHG [BX], AH ; nejprve se načtou latch-registry
a poté bude do paměti zapsána
hodnota registru AL
Nesmíme zapomenout na to, že po provedení instrukce XCHG
nemůžeme říci nic určitého o obsahu registru AH (případně
nějakého jiného použitého). Před každým přístupem do paměti
musíme registr znovu naplnit číslem barvy (zapisovací režim
2) nebo bitovou maskou (zapisovací režim 0).
Detekce instalované grafické karty
Každý program by ma svém samém začátku měl zjistit zda
má dostupné všechny technické prostředky potřebné pro svojí
správnou činnost. Jedním z nich je i grafická karta. Pro
testování přítomnosti nám nabízí často postačující možnosti
sám BIOS. Pro zjištění karty VGA můžeme použít službu 1ah
funkci 00h - čtení kombinace monitorů. Pokud funkce vrátila
v registru AL hodnotu 1ah, je instalována karta VGA. Pokud
ne, můžeme se posunout o úroveň níž a testovat přítomnost
EGA funkcí 10h služby 12h. Pokud po zavolání funkce bude
nastaven registr BL na hodnotu 0-3, je v systému přítomna
EGA.
Jelikož některé grafické karty nejsou úplně
kompatibilní a nemusejí vracet správné hodnoty po volání
služeb BIOS, měl by program umožňovat překrýt automatickou
detekci. Nejlépe pomocí parametru programu nebo
konfiguračního souboru, kde by byla zapsána informace o
typu použitého adaptéru.
[Pokračování] |
[Obsah]
Copyright © Jiří Kosek