Hlavní navigace

Nestandardní textové a grafické režimy karty VGA

12. 11. 2009
Doba čtení: 10 minut

Sdílet

V dnešní části seriálu o architekturách počítačů si popíšeme některé nestandardní textové a grafické režimy, které je možné nastavit na grafické kartě VGA. Tyto režimy jsou pojmenované „nestandardní“ z toho důvodu, že je nelze vybrat přímo pomocí služeb BIOSu. Na druhou stranu právě využití těchto režimů způsobilo poměrně velkou oblibu karty VGA jak mezi programátory, tak i uživateli.

1. Nestandardní textové režimy grafické karty VGA

V předchozí části tohoto seriálu jsme si řekli základní informace o grafické kartě VGA, včetně popisu standardních textových i grafických režimů, které tato karta svým uživatelům i programátorům nabízí. Víme již, že standardní textový režim této karty zobrazuje znaky v rastru 720×400 pixelů se šířkou znaků 9 pixelů. Toto rozlišení je však možné poměrně jednoduše měnit manipulací s registry řídicími časování přístupu do obrazové paměti. Další dva poměrně často používané textové režimy lze získat tak, že se sníží vertikální rozlišení na 200 či 350 obrazových řádků, nebo lze provést naopak i zvýšení vertikálního rozlišení na 480 obrazových řádků. Výsledkem jsou textové režimy s rozlišením 720×200, 720×350 a 720×480 pixelů. Tyto režimy mají samozřejmě (v případě 200 či 350 obrazových řádků) horší prokreslování znaků (snižuje se jejich čitelnost, zejména při použití českých fontů obsahujících znaky s „nabodeníčky“), než režim původní a jejich použití je tak omezeno pro speciální aplikace, například starší notebooky, průmyslové LCD panely (pokladny atd.), prokládaný výstup na video (350 řádků) apod.

pc87

Obrázek 1: Standardní textový režim, ve kterém se znaky vykreslují v rozlišení 720×400 pixelů. Šířka znaků je rovna devíti pixelům a jejich výška je (v tomto případě) nastavena na šestnáct obrazových řádků.

Textový režim s rozlišením 720×480 pixelů nabízí vyšší vertikální rozlišení, ovšem na úkor nižší obrazové frekvence – z 70 Hz se snižuje kmitočet obnovování obrazu na 60 Hz, což může být v případě delší práce s počítačem nepříjemné (podobně je frekvence snížena u všech režimů s 480 řádky resp. 240 řádky dvojnásobné výšky). U všech zmiňovaných textových režimů je šířka znaků rovna devíti pixelům (80×9=720, popř. lze pracovat i s 90 znaky na řádek, ovšem znaky budou mít v tomto případě šířku 8 pixelů, protože 90×8=720) a jejich výška může být programově nastavena v rozsahu dvou až 32 obrazových řádků, takže například v režimu s vertikálním rozlišením 480 obrazových řádků lze vykreslit 30 textových řádků se znaky vysokými 16 pixelů, 34 textových řádků při použití znaků o výšce 14 pixelů a 60 textových řádků pro znaky zobrazované v rastru 9×8 pixelů. V Linuxu lze pro tyto účely použít utilitu setconsolefont. Tyto nestandardní textové režimy (nestandardní se jim říká proto, že nejsou přímo podporovány službou BIOSu číslo 10h) využívá například poměrně známé vývojové prostředí Rhide, několik e-zinů atd.

pc87

Obrázek 2: Šestnáctibarevné textové režimy se používaly (a v některých případech i dosud používají) pro tvorbu takzvaného ANSI artu, což je „barevná“ obdoba ASCII artu, tj. více či méně kvalitních a originálních obrázků vykreslovaných pomocí znaků rozšířené ASCII a barvových atributů.

2. Seznam standardních i nestandardních textových režimů

Na grafické kartě VGA se nachází dva oscilátory řízené pomocí krystalů, které slouží k časování přístupu do obrazové paměti i pro synchronizaci obrazu na monitoru – generování horizontálního a vertikálního synchronizačního signálu. Volbou druhého oscilátoru s nižší frekvencí hodinových signálů a úpravou řídicích registrů grafické karty VGA je možné snížit horizontální rozlišení ze 720 pixelů na 640 pixelů, v němž se znaky vykreslují pouze se šířkou osmi pixelů. Kombinací obou metod (změna oscilátoru, změna počtu obrazových řádků) se tak dají vytvořit následující textové režimy:

Horizontální rozlišení Vertikální rozlišení Poznámka
640 200 pro podporu některých starších LCD panelů
640 350
640 400 použit u některých starších notebooků
640 480 časování odpovídá hi-res grafickému režimu
720 200 šířka znaků 9 pixelů
720 350
720 400 standardní režim se snímkovou frekvencí 70 Hz
720 480 režim s třiceti zobrazenými řádky textu
pc87

Obrázek 3: Další ukázka ANSI artu, tentokrát v textovém režimu o rozlišení 640×400 pixelů, ve kterém mají znaky šířku 8 pixelů a výšku 8 obrazových řád­ků.

3. Seznam standardních grafických režimů podporovaných kartou VGA

Již v předchozí části tohoto seriálu jsme si řekli, že grafická karta VGA podporuje mnoho standardních grafických režimů. Některé z těchto režimů jsou vytvořeny tak, aby se do co největší míry zachovala kompatibilita se staršími grafickými adaptéry (ovšem obrazové frekvence jsou odlišné), další grafické režimy jsou zcela nové. Mezi podporované standardní grafické režimy, tj. režimy, jež lze nastavit pomocí služby BIOSu číslo 10h, patří:

Horizontální rozlišení Vertikální rozlišení Počet barev Poznámka
320 200 4 kompatibilita s barevným režimem karty CGA
640 200 2 kompatibilita s hi-res (dvoubarevným) režimem karty CGA
320 200 16 kompatibilita s low-res režimem karty EGA
640 200 16 kompatibilita s mid-res režimem karty EGA
640 350 4 kompatibilita s hi-res režimem karty EGA s 64kB grafické paměti
640 350 16 kompatibilita s hi-res režimem karty EGA s 256kB grafické paměti
640 480 2 nový dvoubarevný hi-res režim se čtvercovými pixely
640 480 16 nový šestnáctibarevný hi-res režim se čtvercovými pixely
320 200 256 nový 256 barevný low-res režim, ve kterém dochází ke zřetězení bitových rovin

Většina z režimů vypsaných v předchozí tabulce byla dostupná již na grafické kartě EGA. Nové jsou pouze tři poslední režimy – dvoubarevný režim s rozlišením 640×480 pixelů, který využívá pouze jednu bitovou rovinu, šestnáctibarevný režim s tímtéž rozlišením pracující se všemi čtyřmi bitovými rovinami a konečně známý 256barevný režim s rozlišením 320×200 pixelů, v němž jsou všechny čtyři bitové roviny zřetězeny tak, že se programátorům jeví jako souvislé pole 320×200=64000 bajtů, kde každý bajt odpovídá jednomu pixelu. Kvůli zřetězení bitových rovin je však celých 3/4 obrazové paměti nevyužito, protože ji nelze adresovat.

pc87

Obrázek 4: Demo Palikka využívá šestnáctibarevný textový režim s 80 znaky na řádku a 25 či 50 textovými řádky (v závislosti na právě probíhajícím efektu se počet řádků mění). V textovém režimu je využito pouze 5 znaků rozšířené ASCII (mezera a obdélníky s různým vzorkem vyplnění). O tom, že se stále nacházíme v textovém režimu, nás může přesvědčit viditelný hardwarový textový kurzor.

4. Slavný grafický režim Mode-X

Pravděpodobně nejznámějším rozšiřujícím grafickým režimem je takzvaný Mód X (X-mode). Tento grafický režim se vytvoří tak, že se grafický adaptér VGA nejprve přepne do standardního grafického režimu 320×200×256 se zřetězenými bitovými rovinami a posléze se provedou dvě operace: vypnutí zřetězení (chaining) bitových rovin a posléze nastavení 240 obrazových řádků namísto řádků 200. Vypnutím zřetězení se dosáhne toho, že je k dispozici celých 256kB grafické paměti nainstalované na kartě VGA, na druhou stranu se však ztrácí jednoduchá možnost adresace jednotlivých pixelů, protože se musí provádět výběr bitových rovin pro každou čtveřici pixelů (viz následující obrázek).

Vhodným výběrem bitových rovin lze zápisem jednoho bytu nastavovat barvy buď jednoho, dvou, tří nebo čtyř sousedních pixelů, což může urychlit některé grafické operace, například vyplňování ploch (tento způsob „snížení rozlišení“ byl volitelně použit například i ve hře Doom pro urychlení vykreslování na pomalejších počítačích).

pc87

Obrázek 5: Organizace obrazové paměti ve standardním grafickém režimu 13h, ve kterém jsou všechny čtyři bitové roviny zřetězeny, takže zápis sousedních čtyř pixelů je ve skutečnosti prováděn do čtveřice bitových rovin (jak správně poznamenal Ondra Novák, je možné, že jsou „sousední“ pixely uloženy v bitových rovinách pod sebou, tj. na stejnou adresu, ale pokaždé do jiné bitové roviny, ovšem bez vypnutí zřetězení není skutečná struktura obrazové paměti programátorům přístupná).

Zvýšení počtu zobrazených obrazových řádků z 200 na 240 přináší jednu dobrou a jednu špatnou vlastnost. Dobrou vlastností je, že pixely v tomto režimu jsou čtvercové, což se projevuje například u algoritmů pro kresbu kružnice nebo při zobrazování fotografií. Nevýhodou však je, že se sníží obnovovací frekvence obrazu ze 70 Hz na pouhých 60 Hz, což může při nevhodně zvoleném pozadí (světlé odstíny barev) způsobovat nežádoucí poblikávání obrazu.

pc87

Obrázek 6: Organizace obrazové paměti v režimu Mode-X. Bitové roviny již nejsou zřetězeny, což se projevuje tak, že se sousední pixely musí ukládat do odlišných bitových rovin (jejich výběr se provádí zápisem do jednoho z řídicích registrů). Výhodou je dostupnost celé obrazové paměti, čehož lze použít například pro double či triple buffering, scrolling obrazu atd.

5. Modifikace Modu-X

Mód X se dá různým způsobem dále modifikovat. Jednou z modifikací je změna vertikálního rozlišení. Poměrně jednoduše lze nastavit 200, 240, 400 a 480 zobrazitelných obrazových řádků. Při 200 a 400 řádcích se používá obnovovací frekvence obrazu 70 Hz, při 240 a 480 řádcích obrazová frekvence 60 Hz. Celkový počet řádků, které se do kapacity bitových rovin vměstnají, je stále roven 819, což znamená, že i v režimu 320×400×256 je možné použít plnohodnotný double buffering, který se velmi jednoduše provádí pouhou změnou počátku zobrazované grafické paměti (jedná se o údaj, který lze měnit kdykoli, ideálně však při probíhajícím vertikálním zatemnění). Další modifikace spočívá ve výběru druhého oscilátoru (generátoru hodinového signálu), čímž se zvýší horizontální rozlišení z 320 pixelů na 360 pixelů.

Nejvyšší grafické rozlišení v 256 barvách, které by mělo pracovat na všech typech monitorů, tak narůstá na hodnotu 360×480 pixelů. Přeprogramováním registrů CRTC lze zvýšit (či snížit) jak vertikální rozlišení, tak i rozlišení horizontální, některé režimy však nepracují korektně na všech monitorech (zejména na LCD displejích starších notebooků). Jednu dobu byl například populární režim 256×480 pixelů, kde se operace putpixel značným způsobem zjednodušila. Naopak byly k dispozici i rozlišení 400×500×256 a dokonce i 400×600×256, ty však již nebyly na tehdejších monitorech stabilní.

pc87

Obrázek 7: Hra využívající Mode-X.

6. Scrolling obrazu

Asi nejzajímavější funkcí dostupnou v grafických režimech karty VGA je podpora horizontálního a vertikálního scrollingu (posuvu) obrazovky. Vertikální scrolling je jednoduchý – změní se počátek vykreslované obrazové paměti. V 256barevných grafických režimech s 320 pixely na řádku (kromě standardního režimu 320×200×256) je k dispozici 819 obrazových řádků, takže scrolling je možné provádět přes více než dvě obrazovky. Pro nastavení horizontálního scrollingu je zapotřebí změnit řídicí registry karty tak, aby se na jeden obrazový řádek alokovalo více bajtů, než odpovídá počtu zobrazených pixelů – například v režimu Mode-X 320×240×256 se pro jeden obrazový řádek alokuje 512 či 1024 bajtů. Potom je možné horizontální scrolling provádět kombinací změny počátku obrazové paměti a změny registru pro scrolling, který způsobí posun po jednotlivých pixelech.

pc87

Obrázek 8: Hra Pinball Dreams využívala vertikálního scrollingu obrazovky.

7. Režim rozdělené obrazovky

Další zajímavou funkcí, která je však méně známa, je podpora rozdělení obrazovky (screen split) na dvě části. Princip je takový, že v jednom řídicím registru je obsaženo číslo „rozdělujícího“ obrazového řádku. Pokud čítač řádků dosáhne této hodnoty, nastaví se počátek obrazové paměti (odkud se vykresluje) na nulovou hodnotu. To znamená, že další obrazový řádek na obrazovce je vykreslován od počátku bitových rovin.

Pro efektivní použití rozdělené obrazovky se musí pomocí řídicích registrů nastavit počátek obrazové paměti na hodnotu jinou než nulovou, aby nedocházelo k dvojímu zobrazení obrazu (první obrazový řádek se tak ve skutečnosti nečte z počátku bitových rovin, ale z relativně vzdálených adresových oblastí). Rozdělená obrazovka se typicky používá ve hrách, kdy se horní část obrazovky mění (scrolluje atd.), zatímco v dolní části je zobrazeno skóre a další relativně neměnné údaje.

8. Obsah následující části seriálu – PGC neboli Professional Graphics Controller

V následující části seriálu o architekturách počítačů si popíšeme velmi zajímavé a přitom poměrně neznámé grafické zařízení. Jedná se o první grafický akcelerátor PGC – Professional Graphics Controller určený pro počítače PC, který firma IBM začala vyrábět a prodávat již v roce 1984, tedy ještě před vznikem dnes popisované grafické karty VGA. Tento grafický akcelerátor podporoval 256barevný grafický režim o rozlišení 640×480 pixelů, do něhož bylo možné vykreslovat části dvourozměrné či trojrozměrné scény (drátové modely – wireframe) s využitím příkazů typu „vykresli kružnici“, „vykresli prostorovou úsečku“ či dokonce „vytvoř vykreslovací smyčku“. Při práci v trojrozměrném prostoru bylo možné na vykreslované objekty (resp. na souřadnice jejich vrcholů) aplikovat lineární transformaci i perspektivní projekci, podobně jako je tomu například u moderních grafických knihoven OpenGL či Direct 3D.

pc87

Obrázek 9: Grafický akcelerátor PGC (Professional Graphics Controller).

Ve skutečnosti nebyl Professional Graphics Controller pouze grafickým akcelerátorem, ale jednalo se o celý počítač (resp. relativně samostatně pracující výpočetní subsystém), který byl přes ISA sloty zapojen do počítače PC. Již samotné připojení PGC do počítače je zajímavé, neboť PGC je vytvořen na třech deskách plošných spojů. Dvě desky byly představovány „dlouhými“ ISA kartami, prostřední deska byla kratší a jako jediná nebyla do PC zapojena. Všechny tři desky se mezi sebou propojovaly kabelem, který tvořil interní sběrnici grafického akcelerátoru. Celá sestava trojice plošných spojů i se zapájenými součástkami vážila přibližně 0,5 kg. Více podrobností o funkci tohoto zajímavého grafického akcelerátoru, i o tom, jakým způsobem s ním mohl programátor komunikovat, si uvedeme příště.

CS24_early

pc87

Obrázek 10: Detail zadní části PGC s konektorem pro monitor.

9. Odkazy na Internetu

  1. Support/perip­heral/other chips – 6800 family
    http://www.cpu-world.com/…rt/6800.html
  2. Motorola 6845
    http://en.wikipedia.org/…otorola_6845
  3. The 6845 Cathode Ray Tube Controller (CRTC)
    http://www.tinyvga.com/6845
  4. IBM Monochrome Display Adapter
    http://en.wikipedia.org/…play_Adapter
  5. Color Graphics Adapter
    http://en.wikipedia.org/…hics_Adapter
  6. Wikipedia CZ: Sběrnice:
    http://cs.wikipedia.org/…b%C4%9Brnice
  7. Wikipedia EN: Industry Standard Architecture:
     http://en.wikipedia.org/…Architecture
  8. Enhanced Graphics Adapter
    http://en.wikipedia.org/…hics_Adapter
  9. IBM Multicolor Graphics Adapter
    http://en.wikipedia.org/wiki/MCGA
  10. Professional Graphics Controller
    http://en.wikipedia.org/…s_Controller
  11. The IBM PGA Graphics Adapter
    http://incolor.inebraska.com/…_adapter.htm
  12. Professional Graphics Controller: Notes
    http://www.seasip.info/…ePC/pgc.html

Byl pro vás článek přínosný?

Autor článku

Vystudoval VUT FIT a v současné době pracuje na projektech vytvářených v jazycích Python a Go.