Grafické karty a grafické akcelerátory (11)

11. 5. 2005
Doba čtení: 14 minut

Sdílet

V dnešním pokračování seriálu o grafických kartách a grafických akcelerátorech se budeme zabývat grafickými kartami pro počítače IBM PC, které byly dodávány jak firmou IBM, tak i dalšími firmami vyrábějícími periferie pro počítače řady PC.

Obsah

1. Grafické karty firmy IBM
2. Čip Motorola MC6845
3. Textový režim na kartě MDA
4. Grafická karta CGA – první grafický standard na PC
5. Textové režimy grafické karty CGA
6. Základní grafické režimy karty CGA
7. Rozšiřující grafické režimy karty CGA
8. Technické detaily grafické karty CGA
9. Obsah dalšího pokračování

1. Grafické karty firmy IBM

Firma IBM vytvořila a posléze na veřejnosti prezentovala počítače řady IBM PC zejména jako kancelářské počítače, u nichž se v jejich počátcích nepočítalo s tím, že na nich budou ve větší míře provozovány grafické aplikace (hry byly doménou osmibitových počítačů, náročné CAD systémy se naopak provozovaly na výkonných unixových stanicích). Pozdější vývoj aplikací i operačních systémů na PC však ke grafice neomylně směřoval a s tím se také vyvíjely grafické karty, které firma IBM vytvořila a podporovala. Pokud se zaměříme na grafické karty určené pro PC základní řady (tj. pomineme poloprofesionální a profesionální čipy PGA a 8514/A), můžeme vysledovat zajímavý tříletý cyklus nástupu nových grafických karet této firmy:

  • CGA – 1981
  • EGA – 1984
  • VGA – 1987
  • XGA – 1990

Grafickou kartou XGA končí dlouhá série grafických karet IBM, v dalších letech tuto činnost přebírají jiné firmy, což je jenom dobře, IBM v tomto směru napáchala více škody než užitku ;-). V dalších kapitolách si jednotlivé grafické karty postupně popíšeme (a nejen je), ale nejdříve se musím zmínit o jednom čipu, který měl pro další vývoj grafických karet na počítačích typu IBM PC zásadní význam. Jde o čip Motorola MC6845.

2. Čip Motorola MC6845

Čip Motorola MC6845 (viz například souhrnnou informační stránku en.wikipedia.or­g/wiki/Motoro­la_6845) byl navržen ve firmě Motorola pro řízení jednoduchých počítačových monitorů či přímo jejich obrazovek (CRT), tj. jedná se o čip obecně nazývaný CRTC – Cathode Ray Tube Controller. Řízení obrazovek spočívá, zjednodušeně řečeno, v postupném načítání barev jednotlivých pixelů či kódů znaků, převodu na výslednou grafickou informaci a následném poslání této informace na výstup společně s horizontálními a vertikálními synchronizačními signály. Tento čip byl používán už v sedmdesátých letech minulého století, zejména pro řízení obrazovek u počítačových terminálů (samozřejmě textových). Pro tento typ úloh byl vybaven možností zobrazovat data v textové podobě, ve skutečnosti však bylo možné použít i různé grafické režimy. Kromě toho bylo možné k čipu připojit světelné pero, které pomocí poměrně přesného měření hodin řídících výstup jednotlivých obrazových řádků a pixelů mohlo lokalizovat umístění aktivního hrotu světelného pera na obrazovce.

Podpora pro textový režim byla na poměrně vysoké úrovni (zejména s ohledem na dobu vzniku čipu), znaky mohly mít proměnnou výšku a dokonce byl podporován takzvaný hardwarový kurzor, což není nic jiného než ona známá blikající čárka na obrazovce. Podpora spočívá ve zmíněném blikání, které nemuselo být řízeno programově, stejně tak jako přepis znaku, který se nachází pod kurzorem (to mimo jiné znamenalo, že i když počítač „zamrzl“, textový kurzor si dál vesele blikal, což spoustu lidí zmátlo, protože si mysleli, že počítač stále pracuje :-).

Rozlišení a barevná hloubka grafických režimů nebyly omezeny přímo čipem MC6845, ale dalšími obvody, které se k tomuto čipu připojovaly. Při použití vyšších frekvencí hodinových impulsů bylo možné používat stabilní grafické režimy o rozlišení 768×384 pixelů, teoretická hranice se pohybovala u rozlišení 800×400 pixelů; při „přetaktování“ však bylo možné použít i vyšších rozlišení, samozřejmě pouze za předpokladu, že se použily dostatečně rychlé paměťové čipy tvořící obrazovou paměť. Kromě přímého výstupu grafiky byl podporován i takzvaný interlacing, tj. střídavé vykreslování lichých a sudých obrazových řádků. Z důvodu podpory jak textových, tak i grafických režimů si právě tento řadič displeje vybrala firma IBM pro návrh grafických karet určených pro vznikající IBM PC a jeho následovníky (PC XT, PC AT).

3. Textový režim na kartě MDA

První kartou pro počítače PC byla karta MDA (Monochrome Display Adapter), jež byla dodávána již od roku 1981 jako alternativa ke kartě CGA. Tato karta ještě neumožňovala vykreslování rastrové grafiky (označení termínem „grafická karta“ je tedy trošku nepřesné), jelikož podporovala pouze textový režim 80×25 znaků, který je používán například v operačním systému MS-DOS; teoreticky by však mělo být možné pracovat s graficko-textovou kartou MDA i pod systémy Linux či Free BSD (například pro řízení druhého monitoru, dnes se pro tuto činnost nejčastěji používají výprodejové karty typu Hercules). Tato karta byla určena pro šestnáctibitovou sběrnici ISA resp. PC-BUS. Ve znakové sadě byly obsaženy i symboly pro čtverce a obdélníky poloviční výšky a/nebo šířky, než měly vlastní znaky, proto bylo možné zobrazit i pseudografiku v rastru 160×50 „pixelů“.

Při zobrazování znaků v textovém režimu 80×25 znaků byl každý znak definován v masce 9×14 pixelů, což znamená, že rozlišení obrazovky bylo rovno 720×350 pixelům. Poměrně velké horizontální rozlišení bylo dále použito až u grafických karet Hercules a VGA o několik let později (grafické karty CGA a EGA byly v tomto ohledu zklamáním). Znaková sada byla na grafické kartě uložena v paměti ROM, což znamená, že se při požadavku na zobrazení textů v jazycích s nabodeníčky (tj. prakticky všechny jazyky kromě angličtiny) musela tato paměť vyměnit za EPROM (typ 2764 případně 27C64) s vypálenou národní znakovou sadou. Každý znak na obrazovce měl k dispozici i svůj atributový byte, ve kterém bylo specifikováno, zda se má tento znak zobrazit normálně, zvýrazněně (větší intenzita), s podtržením, či zda by měl blikat. Barevné atributy znaků byly použity i u dalších grafických karet na PC.

Kapacita video paměti na této kartě byla rovna 4 kB, přičemž 2000 bytů bylo zapotřebí pro uložení všech 80×25 znaků a dalších 2000 bytů pro uložení jejich atributů (z pohledu PC se ukládala vždy dvojice znak-atribut), zbylých 96 bytů bylo nevyužito. Zajímavé jsou signálové poměry, kterými se musely řídit připojené monitory. Snímková frekvence byla rovna 50 Hz, řádková frekvence 18,432 kHz. Na první pohled o údaji snímkového kmitočtu to může vypadat tak, že 50 Hz je pro práci na počítači naprosto nedostatečné, musíme si však uvědomit, že se ponejvíce používalo tmavé pozadí, na kterém není poblikávání obrazu tak patrné jako na pozadí světlém či dokonce bílém.

Jednoznačnou předností této grafické karty je způsob namapování do adresního prostoru procesoru. Karta totiž využívala segment začínající adresou b000:0000 (intelovské šestnáctibitové adresování segment:offset), který nebyl na dalších grafických kartách využit. Proto bylo možné tuto kartu kombinovat s kartou jinou a vytvořit tak vícemonitorový systém, který využívaly aplikace jako AutoCAD, Turbo Pascal, Turbo C++, Lotus 1–2–3 apod. V praxi bylo možné použít například kombinace CGA+MDA, EGA+MDA a později i VGA+MDA. Vzhledem k tomu, že firma IBM tuto kartu přestala po několika letech vyrábět, převzal úlohu sekundární grafické karty její konkurent Hercules, který kromě zobrazení textového režimu podporoval i režim grafický – viz navazující díl tohoto seriálu.

4. Grafická karta CGA – první grafický standard na PC

První dostupnou kartou s podporou grafiky na osobních počítačích typu IBM PC byla grafická karta CGA, což je označení, které vzniklo z celého názvu Color Graphics Adapter. Tato karta, jež byla jako oficiální standard uvedena v roce 1981, oficiálně podporuje celkem dva grafické režimy a dva režimy textové. Kromě toho je však pro televizní výstup použit třetí grafický režim a vhodnou manipulací s registry lze vytvořit i další textové, grafické či smíšené režimy. Firma IBM tuto grafickou kartu nabízela jako alternativu k čistě textově orientované kartě MDA; vzhledem k odlišným adresovým prostorům, do kterých se mapovaly jejich obrazové paměti, a odlišným bázovým adresám konfiguračních registrů bylo možné obě karty umístit do jednoho počítače, a vytvořit tak poměrně kvalitní (alespoň na svou dobu) dvoumonitorový systém – viz též předchozí kapitolu, v níž jsou uvedeny některé aplikace, které takto koncipovaný dvoumonitorový systém podporovaly.

Grafická karta CGA bude popsána v následujících kapitolách. V páté kapitole se budeme zabývat textovými režimy, které uživatelům tato grafická karta nabízí. Na tuto kapitolu navazuje kapitola šestá s popisem základních grafických režimů a sedmá kapitola s popisem grafických režimů, které sice nejsou oficiálně podporovány a popsány, nicméně je lze použít pro zvýšení počtu současně zobrazitelných barev. Nakonec jsou v osmé kapitole uvedeny některé zajímavé technické detaily této historicky důležité grafické karty.

5. Textové režimy grafické karty CGA

Popišme si nejprve textové režimy, které grafická karta CGA uživatelům nabízí. Vzhledem k omezení tohoto grafického adaptéru způsobenému velmi nízkou řádkovou frekvencí (pouhých 15,75 kHz) bylo možné zobrazit pouze 200 skenovacích řádků, a to i v textových režimech. Z tohoto důvodu jsou jednotlivé masky znaků definovány v rastru pouhých 8×8 pixelů, tedy stejně jako u mnohých osmibitových počítačů. První znakový režim dokázal zobrazit 40 znaků na řádků, počet řádků byl roven 25. Ve druhém textovém režimu bylo možné zobrazit 80 znaků na řádku. Každý znak mohl mít jednu ze šestnácti předdefinovaných barev, pozadí znaku bylo možné zvolit také ze šestnácti barev, nebo pouze z osmi barev v případě, že se jeden bit atributu rezervoval pro blikání. Jak barva popředí, tak i barva pozadí byly zapsány do takzvaného atributu, který měl velikost jeden byte.

Každý znak byl v obrazové paměti reprezentován dvojicí bytů. V prvním bytu se nacházel ASCII kód znaku, ve druhém bytu jeho atribut. Pomocí řídicích registrů bylo možné volit funkci jednoho bitu atributu, který buď specifikoval intenzitu barvy pozadí, nebo blikání znaku (snad z tohoto důvodu mnoho lidí porovnávalo adaptér CGA s grafickými možnostmi již dříve popsaného ZX Spectra), i když z technologického hlediska jsou tyto grafické subsystémy odlišné.

V případě textového režimu 40×25×16 (tj. 40 znaků na řádek, 25 řádků, 16 barev) se na obrazovce zobrazovalo 320×200 pixelů. Druhý textový režim 80×25×16 zobrazoval text v rastru 640×200 pixelů. Kapacita obrazové paměti byla na dnešní poměry velmi nízká – pouhých 16 kB RAM. Z tohoto důvodu bylo možné v prvním textovém režimu použít celkem osm stránek (obrazovek), protože pro jednu obrazovku bylo zapotřebí alokovat 40×25×2=2000 bytů. Ve druhém textovém režimu bylo možné použít pouhé čtyři stránky, jelikož se pro jednu stránku alokuje 80×25×2=4000 bytů. Velkou nevýhodou těchto textových režimů je fakt, že informace o maskách znaků (tj. font) se četla z paměti ROM. Proto bylo nutné při implementaci národních znaků tuto paměť vyměnit, nebo místo textových režimů použít režimy grafické (u kterých však bylo možné použít méně barev). Vzhledem k nízkému rozlišení textových režimů si poměrně značná část uživatelů pořídila počítač s grafickou kartou MDA, která sice zobrazení grafiky (tj. libovolného rastru) nepodporovala, ale její textový režim byl, s ohledem na dobu vzniku, excelentní.

6. Základní grafické režimy karty CGA

Než čistě textové režimy jsou samozřejmě mnohem zajímavější a flexibilnější režimy grafické, která grafická karta CGA také podporovala. Oficiálně jsou podle dokumentace IBM podporovány pouze dva grafické režimy. V prvním grafickém režimu bylo možné zobrazit obraz v rastru 320×200 pixelů ve čtyřech barvách, druhý režim měl rozlišení 640×200 pixelů dvoubarevně.

V grafickém režimu o rozlišení 320×200 pixelů mohl každý pixel nabývat jedné ze čtyř barev, které byly vybrány z barevné palety. Tato paleta však nemohla být libovolná (z předchozí kapitoly víme, že v textovém režimu je možné použít šestnáct barev), existovaly pouze dvě fixní barevné palety, přičemž při výběru barev se IBM skutečně „předvedla“, protože její nevkusná barevná schémata byla prakticky nepoužitelná. První paleta fixně obsahovala barvy zelenou, červenou a hnědou (red, green, brown), druhá paleta barvy azurovou, fialovou a bílou (cyan, magenta, white). Je patrné, že obě palety se liší pouze přidáním modré barvové složky. Čtvrtá barva byla při práci s BIOSem vždy nastavena na černou, ve skutečnosti se však přes registry karty dala tato barva (jako jediná) nastavit na jednu ze šestnácti předdefinovaných barev, tuto možnost však, vzhledem k nedostupnosti technických informací, mnoho aplikací nevyužívalo. Kapacita obrazové paměti byla rovna:
320×200/8*2=16000 B

V grafickém režimu o rozlišení 640×200 pixelů mohl každý pixel nabývat pouze jedné ze dvou barev, které byly při inicializaci nastaveny na černou a bílou. Pomocí služeb BIOSu tyto barvy nastavit nelze, ale pomocí změny konfiguračních registrů lze tyto barvy prakticky libovolně měnit, je tak možné generovat například zeleno-červený obraz. Kapacita obrazové paměti byla při použití tohoto režimu rovna:
640×200/8=16000 B (tj. stejně jako v předchozím grafickém režimu)

Přístup k jednotlivým pixelům při změně jejich barvy byl poměrně složitý, protože celá obrazová paměť byla rozdělena na dvě podoblasti. První podoblast byla mapována na adresy b800:0000-b900:ffff, druhá oblast na adresy ba00:0000-bb00:ffff (opět je použito adresování segment:offset). V první oblasti obrazové paměti byly umístěny sudé řádky, ve druhé oblasti řádky liché. Z této organizace obrazové paměti, která byla použita díky limitní rychlosti použitých paměťových čipů, vyplývá, že i na první pohled poměrně jednoduché operace, jako je vykreslení úsečky, se implementovaly poměrně obtížně a byly také pomalé.

7. Rozšiřující grafické režimy karty CGA

Kromě základních grafických režimů byly podporovány i rozšiřující grafické režimy. První režim je „legální“, tj. zmiňuje se o něm i dokumentace firmy IBM. V tomto režimu bylo možné zobrazit rastr 160×200 pixelů, kde každý pixel mohl nabývat jedné ze šestnácti barev. Tento režim však pracoval pouze pro kompozitní video, které bylo připojeno pomocí RCA konektoru. Vzhledem k tomu, že obrazová frekvence je rovna 60 Hz, nemá tento režim pro nás (ČR, Evropa) žádný smysl, protože pracuje pouze v normě NTSC.

Druhý režim je již možné použít na jakémkoli monitoru. Ve své podstatě se jedná o režim textový, u nějž je upravena výška znaků na pouhé dva skenovací řádky. Z toho vyplývá, že se zobrazuje 80 znaků na 100 textových řádků (u CGA je počet skenovacích řádků vždy roven 200, a to i v textových režimech). Pokud se bude zobrazovat pouze znak ve tvaru polovičního obdélníku (viz rozšířenou tabulku ASCII), zvyšuje se rozlišení tohoto pseudografického režimu na 160×100 „pixelů“, kde každý pixel může nabývat jedné z šestnácti barev. Proč se však nemůže zvýšit vertikální rozlišení na plných 200 řádků (tj. snížit výšku znaku na jeden skenovací řádek)? V tomto případě narážíme na neefektivní práci s obrazovou pamětí, protože pro každý znak se musí uložit i jeho atribut. Pro rozlišení 160×100 pixelů je zapotřebí alokovat:
80×100 znaků=8000*2 bytů=16000 bytů, tj. dostáváme se na horní mez kapacity obrazové paměti.

Tento jistě zajímavý režim lze využít i u dalších grafických karet, tam to ale postrádá smysl, protože jejich grafické režimy již nejsou omezeny malým počtem barev tak, jak je tomu u grafické karty CGA.

8. Technické detaily grafické karty CGA

Karta CGA je založena na výše popsaném čipu Motorola MC6845. Celá karta je řízena pomocí osmnácti jednobytových řídicích registrů, některé registry jsou určeny pouze pro čtení, některé naopak pouze pro zápis. Vhodnými hodnotami v registrech lze specifikovat například počet zobrazených znaků na textovém řádku, počet skenovacích řádků na jeden znak, pozice skenovacích řádků kurzoru (změna tvaru kurzoru), adresu kurzoru, počáteční adresu video paměti a posun displeje (změna časování signálů H-sync a V-sync). Čtením z registrů lze zjistit například průběh horizontálního či vertikálního zatemnění nebo pozici světelného pera, které tato karta, stejně jako čip Motorola MC6845, podporuje. Jediný problém s programováním grafické karty CGA byl v použitých monitorech, které měly fixní řádkovou a snímkovou frekvenci, což ostatně dokazuje i následující zkušenost amerického kolegy:

Sending random bytes to the video registers, by the way, was extremely dangerous. If I had known that then, I wouldn't have even tried at all; I was lucky I didn't break anything. The monitors back then (1987 and earlier) were fixed frequency monitors, and ran at low frequencies. If you told the video card to do something outside of those frequencies, you stood an excellent change of damaging the monitor. A friend of mine was trying to get the rumored CGA 16-color mode to work and destroyed his Compaq's build-in monitor, a small monochrome monitor that emulated color with different shades of gray. He went to nearest Compaq dealership to get it replaced, and when they refused to fix it, he answered with something like, „Well, I could demonstrate how easy it is to break the monitor to your customers by typing a three-line BASIC program on, oh… this machine over here,“ and pointed to their top-of-the-line machine that some customers were huddled around. They quickly replaced his monitor to shut him up. :-)

Snímková frekvence byla nastavena na 60 Hz, řádková frekvence na pouhých 15,75 kHz, což je méně než u karty MDA. Monitor se připojoval pomocí konektoru DB-9, který byl použit pro různé typy grafických karet, což opět mohlo při záměně zapříčinit zničení monitoru (CGA monitor na grafické kartě EGA apod.). Ke kartě bylo možné připojit i světelné pero. Grafická paměť byla singleportová a měla kapacitu 16 kB (viz předchozí kapitoly); souběžný přístup CPU a grafického čipu do paměti nebyl kupodivu nijak ošetřen, což způsobovalo známé „sněžení“. Jedinou možností, jak zabránit sněžení, byl zápis do obrazové paměti při vertikálním zatemnění elektronového paprsku (horizontální zatemnění má příliš krátký interval). Fonty byly umístěny v paměti ROM resp. EPROM.

bitcoin školení listopad 24

9. Obsah dalšího pokračování

V dalším pokračování tohoto seriálu budou popsány známé grafické karty Hercules (HGC) a EGA i jejich méně známé kolegyně EGC a PGC.

Autor článku

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