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.
Copyright © Jiri Kosek