Hlavní navigace

Co mají společného Commodore PET/4000, BBC Micro, Amstrad CPC i grafické karty MDA, CGA a Hercules?

23. 12. 2021
Doba čtení: 46 minut

Sdílet

 Autor: Pavel Tišnovský
Osmibitové domácí mikropočítače Commodore PET/4000, BBC Micro a Amstrad CPC sice byly vyráběny v různých dobách, ovšem mají jednu věc společnou. Je jím čip Motorola 6845, jenž byl použit i v grafických kartách MDA, CGA a Hercules.

Obsah

1. Co mají společného Commodore PET/4000, BBC Micro, Amstrad CPC i grafické karty MDA, CGA a Hercules?

2. Způsoby generování obrazu v dobách domácích a osobních mikropočítačů

3. Grafický řadič Motorola MC6845

4. Generování obrazu s podporou čipu MC6845

5. Typická konfigurace grafického subsystému

6. Podpora pro zobrazení textového kurzoru

7. Triky použité pro grafické režimy

8. Řídicí registry čipu MC6845

9. Grafická karta MDA – Monochrome Display Adapter

10. Standardní textový režim karty MDA

11. Grafická karta CGA – Color Graphics Adapter

12. Oficiální grafické režimy karty CGA

13. Organizace paměti v monochromatickém režimu (hi-res)

14. Standardní čtyřbarevný grafický režim karty CGA: 320×200

15. Cílená modifikace řídicích registrů karty CGA a nestandardní režimy zobrazování

16. Grafická karta Hercules – první vážnější konkurence IBM postavený opět na čipu 6845

17. Základní technické parametry karty Hercules

18. Textový režim karty Hercules

19. Grafický režim karty Hercules

20. Odkazy na Internetu

1. Co mají společného Commodore PET/4000, BBC Micro, Amstrad CPC i grafické karty MDA, CGA a Hercules?

V dnešním článku si představíme čip, nad nímž bylo postaveno relativně velké množství různých mikropočítačů, například Commodore PET/4000, BBC Micro či Amstrad CPC. Tento čip byl použit i v osobních mikropočítačích IBM PC vybavených grafickými kartami MDA, CGA či Hercules popř. jejich kombinacemi. Jedná se o čip pojmenovaný Motorola 6845, jenž ve všech zmíněných typech počítačů a grafických karet sloužil ke generování video signálu (pro monitory či televize) a podporoval přitom jak textové režimy, tak i (i když s několika omezeními) režimy grafické.

Obrázek 1: Hra Overkill, která používá grafický režim 320×200 se čtyřmi barvami grafické karty CGA.

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), což je poněkud paradoxní, protože se jedná o čip navržený především pro použití s mikroprocesorovou řadou Motorola M68×x a firma IBM se při návrhu PC schválně orientovala především na obvody kompatibilní se stavebnicemi 8080 a 8085 (důvodů bylo více, některé si ještě řekneme).

Obrázek 2: Další snímek ze hry Overkill.

Poznámka: mimochodem – s tímto čipem si lze vyhrát i dnes, viz například tento článeček.

2. Způsoby generování obrazu v dobách domácích a osobních mikropočítačů

Tématem grafických systémů mikropočítačů jsme se již na stránkách Roota zabývali, takže si jen shrňme, že původním rozhraním (tehdejších) minipočítačů byl textový terminál, jehož grafické schopnosti byly prakticky nulové (až na pseudografiku, tedy použití znaků pro tvorbu obrazu). Výjimkou tvořilo několik terminálů s podporou vektorové grafiky. Poměrně překotný vývoj v oblasti grafického výstupu začal až s příchodem herních konzolí druhé generace, především s konzolí VCS (Atari 2600) a taktéž s „1977 Trinity“, což byla trojice domácích mikropočítačů Apple II, Commodore PET 2001 a TRS-80. Z hlediska vývoje počítačové grafiky je nejzajímavější právě herní konzole Atari 2600, protože se celý její grafický systém skládal z několika čítačů (nebinárních!) a posuvných registrů integrovaných do čipu nazvaného TIA, jehož účelem bylo generovat obraz po jednotlivých řádcích, a to navíc bez nutnosti použití framebufferu.

Obrázek 3: Dosti primitivní hra Turbo, opět určená pro grafickou kartu CGA.

Každý obrazový řádek složený ze 160 viditelných pixelů byl s využitím čipu TIA generován na základě šestice údajů – horizontální pozice takzvaného hráče 0, pozice hráče 1 (jednalo se o klasické osmipixelové sprity, jejichž horizontální šířka mohla být vynásobena dvěma či čtyřmi), pozice střely 0, pozice střely 1 (jednopixelové sprity, opět s volitelnou šířkou a barvou příslušného hráče), pozice míče/ball (jednopixelový sprite s možností vertikálního posunu o jeden řádek) a konečně herního pole/playfield. Herní pole bylo reprezentováno 20bitovým vzorkem, který mohl být v pravé polovině obrazovky horizontálně zrcadlen nebo pouze zopakován – horizontální rozlišení pozadí je tedy jen 40 pixelů, tj. jeho pixely mají oproti hráčům čtyřnásobnou šířku. Programátor přitom mohl před vykreslením každého obrazového řádku změnit horizontální pozice hráčů, střel i míče, modifikovat jejich barvu, popř. i bitový vzorek hráčů a herního pole. Všechny změny byly prováděny zápisem do řídicích registrů čipu TIA, například herní pole bylo uloženo ve třech osmibitových registrech.

Vývoj grafických subsystémů ovšem směřoval nezadržitelně k využití skutečného a plnohodnotného framebufferu, tj. obrazové paměti (video paměti), ve které je uložena kopie rastrového obrázku zobrazovaného na monitoru. Do framebufferu, založeného většinou na běžné dynamické paměti, má buď přímo či nepřímo přístup i mikroprocesor, který může na základě programu měnit jeho obsah. Navíc jsou z framebufferu pravidelně čteny informace elektronickým obvodem (většinou jedním čipem), který se – z velké části nezávisle na mikroprocesoru – stará o zobrazování grafiky. Tento čip musel umět odpojit mikroprocesor od vstupů framebufferu (aby nedošlo při kolizi během čtení a současného zápisu do obrazové paměti), generovat potřebné adresy a posléze přečtené informace posílat do řadiče displeje. Takto pojatým framebufferem byla vybavena podstatná část domácích osmibitových mikropočítačů i počítačů osobních. A část těchto operací mohl provádět dále popisovaný čip 6845.

Jeden z nejjednodušších grafických subsystémů najdeme na původním Macintoshi. K dispozici totiž byl pouze jediný grafický režim, ve kterém bylo možné zobrazit rastr o rozlišení 512×342 pixelů monochromaticky. Na první pohled netypické rozlišení má výhodu v tom, že zachovává poměr stran 3:2. Fyzické rozlišení přitom bylo v obou směrech (vertikálním i horizontálním) rovno cca 72 DPI, což je výhodné zejména pro přesnou typografii. Zvolené rozlišení navíc na interním devítipalcovém monitoru vypadalo velmi pěkně a dodávalo grafickému uživatelskému rozhraní zdání velké profesionality (dodnes si pamatuji ten zvláštní pocit, dělat na „skutečném“ Macintoshi v době, kdy jich bylo v ČR pouze několik desítek a ostatní znali pouze PCčka s MS DOSem a textový režim). Samotná grafika není na Macintoshi žádným zvláštním způsobem podporovaná. Grafická paměť je tvořena kontinuálním blokem paměti o velikosti 21 kB, ze které se postupně čtou hodnoty jednotlivých pixelů tak, jak se vykreslují na obrazovku. Přesněji řečeno – hodnoty sousedních pixelů čte samotný procesor a ukládá je do posuvného registru, z něhož se postupně přenáší na obrazovku. Celý grafický subsystém je tedy založen na spolupráci CPU a primitivního posuvného registru.

Poněkud odlišnou cestou se vydali tvůrci osobních mikropočítačů Atari ST, který obsahuje čip nazvaný Shifter, což navozuje dojem, že se opět jedná o primitivní posuvný registr. Ve skutečnosti si dokázal Shifter řídit přístup do paměti automaticky s využitím DMA a navíc nebyla adresa video paměti pevně nastavená, ale mohla se měnit podle požadavků daného software. Samozřejmě ale existovaly i mnohem sofistikovanější systémy. Příkladem může být Amiga, která již v původním (originálním) čipsetu obsahovala čipy specializované pro práci s planární rastrovou grafikou: Agnus (obsahuje Blitter a Copper) + Denise.

Obrázek 4: Hra Monuments of Mars určená opět pro kartu CGA.

3. Grafický řadič Motorola MC6845

Konečně se dostáváme k čipu, kterému je věnován dnešní článek. Jedná se o grafický řadič Motorola MC6845. Tento čip byl primárně navržen pro řízení jednoduchých počítačových monitorů či přímo jejich obrazovek (CRT – Cathode Ray Tube), tj. jedná se o čip obecně nazývaný CRTC neboli Cathode Ray Tube Controller. Řízení obrazovek spočívá, poněkud zjednodušeně řečeno, v postupném načítání barev jednotlivých pixelů či kódů znaků (serializaci) z obrazové paměti, dále o převod načtených dat na výslednou grafickou informaci a následném poslání této informace na výstup ve formě signálu či signálů – tedy buď přímo na monitor nebo do VF modulátoru v případě použití televizoru namísto monitoru. K vlastní obrazové informaci jsou navíc přidány i nezbytné horizontální a vertikální synchronizační signály, o jejichž generování se taktéž do značné míry stará grafický řadič.

pc83

Obrázek 5: Textový režim adaptéru MDA, kterému se budeme podrobněji věnovat v dalším textu.

Čip MC6845 začal být 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, i když existovaly i terminály s podporou grafiky). Pro tento typ úloh byl řadič MC6845 vybaven možností zobrazovat data v textové podobě (jinými slovy – byl podporován programovatelný textový režim), ve skutečnosti však bylo při vhodném nastavení řídicích registrů možné použít i různé více či méně komplikované grafické režimy, čehož bylo využito již u některých domácích osmibitových počítačů vybavených tímto čipem; později byl tento čip použit i u výkonnějších osobních mikropočítačů, kde se ovšem začaly projevovat jeho limity.

Poznámka: ve skutečnosti provádí Motorola MC6845 pouze některé výše zmíněné operace. Například přímo neřeší způsob načítání pixelů či znaků z obrazové paměti; vlastně je do značné míry nezávislý na struktuře této paměti. Nejdůležitější prováděnou operací je časování všech signálů důležitých pro tvorbu video signálů, generování adres do obrazové paměti (ať již s textem či pixely) a podpora pro textový kurzor. Podrobnosti si ukážeme níže.

Kromě toho bylo možné k čipu MC6845 připojit světelné pero, které mohlo s využitím poměrně přesného měření hodin řídicích výstup jednotlivých obrazových řádků a pixelů, lokalizovat umístění aktivního hrotu světelného pera na obrazovce (samozřejmě za předpokladu, že výrobce počítače vyvedl příslušné piny čipu MC6845 přes zesilovač na konektor). Zastavme se však na chvíli u textového režimu. Podpora pro textový režim byla u tohoto grafického řadiče na poměrně vysoké úrovni, zejména s ohledem na dobu vzniku čipu: znaky totiž 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 či obdélník (většinou o šířce jednoho znaku) 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í dokonale zmátlo, protože si mysleli, že počítač stále pracuje :-).

Celkem byly vyráběny tři základní verze tohoto čipu (MC6845 – 1 MHz, MC68A45 – 1,5 MHz, MC68B45 – 2 MHz), ovšem kromě původního výrobce (Motorola) se tento čip vyráběl v modifikované podobě i v několika dalších firmách. Mezi jednotlivými čipy existovaly větší i menší rozdíly, a to jak v časování signálů, tak i ve významu některých bitů řídicích registrů. Co se ovšem nezměnilo a později způsobilo odklon od tohoto čipu, bylo omezení na adresaci 16 kB textové paměti či obrazové paměti v grafickém (bitmapovém) režimu, což například dostačovalo pro potřeby karet CGA či Hercules, ovšem nikoli již pro grafické režimy karty EGA apod.

Poznámka: jak uvidíme dále, dal se tento problém minimálně obejít, ovšem za cenu toho, že struktura obrazové paměti byla „nestandardní“ – například byla paměť rozdělena na oblast se sudými a lichými řádky, existovaly čtyři oblasti (Hercules) atd.
pc83

Obrázek 6: Grafický řadič Motorola MC6845.

4. Generování obrazu s podporou čipu MC6845

Podívejme se nyní to, jakým způsobem se čip 6845 používá pro zobrazení textů na obrazovce – protože jeho primární použití je právě pro práci s textovým režimem. Zjednodušené schéma zapojení 6845 je ukázáno na tomto obrázku:

Obrázek 7: Zjednodušené schéma zapojení 6845.

Ze schématu je patrné, že pro komunikaci s počítačem se používá klasická osmibitová datová sběrnice (tj. je kompatibilní i s osmibitovými čipy) a jednobitová adresová sběrnice – 6845 totiž má pouze dva osmibitové I/O porty – první pro výběr jednoho z osmnácti řídicích a stavových registrů, druhý pro zápis dat do vybraného řídicího registru nebo pro čtení dat z vybraného stavového registru. Čip 6845 generuje na základě své konfigurace několik signálů:

  • Adresu znaku ve video RAM (teoreticky až 14 bitů, typicky ovšem méně)
  • Číslo obrazového řádku (mikrořádku) v daném textovém řádku. Typicky hodnoty 0–7, 0–13 či 0–15.
  • Signály HSYNC a VSYNC pro řízení horizontálního a vertikálního synchronizačního signálu pro monitor či televizor.
  • Signál CURSOR, který je nastaven na logickou jedničku ve chvíli, kdy se má zobrazit kurzor (co se s tímto signálem stane, již závisí na konkrétním grafickém subsystému, typicky se mohou všechny barvy tímto signálem ORovat).

Předpokládejme nyní, že se má zobrazovat textový režim 80×25 znaků, přičemž znaky budou vysoké 16 obrazových řádků (mikrořádků). Celý grafický subsystém se bude chovat takto (poněkud zjednodušeno):

  1. 6845 generuje přes sběrnici MA adresy znaků ve video RAM. Pro první textový řádek to tedy budou adresy 0 až 79. Současně je RA nastaveno na nulu.
  2. Z video RAM jsou tedy postupně vybrány ASCII kódy znaků na prvním textovém řádku. Ty jsou poslány na adresovou sběrnici paměti ROM, která obsahuje font (bitmapy 8×16 pixelů). Sloupec je vybrán právě ASCII kódem, řádek pak signály RA (na prvním mikrořádku je nastaven na nulu, tedy se vybírá i první osmice bitů v bitmapách 8×16).
  3. Hodnota všech osmi (někdy devíti) pixelů tvořících jeden mikrořádek znaku je poslána do posuvného registru. Z něho se postupně jednotlivé bity (od nejvyššího) vybírají a posílají do výstupní logiky. Posuvný registr je řízen hodinovým signálem typicky označeným DOTCLK, který by měl mít osmkrát větší frekvenci, než je frekvence výběru znaků.
  4. Výstupní logika, což může být několik IO s malou integrací, pouze připraví signály pro monitor, popř. provede výše zmíněný OR hodnoty pixelu a hodnoty CURSOR.
  5. Až se dojde na konec textu (adresa 79), tak 6845 chvíli počká (na monitoru bude černý okraj) a poté vygeneruje HSYNC o naprogramované délce. Tím se přejde na další řádek.
  6. Čítač znaků se vynuluje, hodnota na RA zvýší o jedničku a vše se bude opakovat pro další mikrořádek.
  7. Po dosažení šestnácti mikrořádků se čítač znaků již NEnuluje, ovšemRA se nastaví na nulu – pokračuje se dalším obrazovým řádkem. Zvýší se čítač textových řádků.
  8. Pokud se dosáhne maximálního počtu textových řádků, opět se bude generovat několik prázdných řádků (BLANK) a následuje VSYNC pro začátek vykreslování dalšího snímku.

Obrázek 8: Aktivní plocha, černé okraje a horizontální i vertikální synchronizační pulsy.

Poznámka: vidíme, že samotný 6845 je interně pravděpodobně relativně jednoduchý, protože obsahuje tři čítače (řádků, mikrořádků, znaků na řádku) a sadu komparátorů (konec řádku, konec snímku, pozice kurzoru, pozice světelného pera). Zbylá část logiky grafického subsystému je ponechána na dalších IO, ovšem v tom nejjednodušším případě se skutečně může použít pouze Video RAM, ROM s fontem, posuvný registr (původně byl použit standardní registr z řady 7400, tedy žádný exotický čip) a několik hradel.

5. Typická konfigurace grafického subsystému

Typická konfigurace grafického subsystému založeného na čipu 6845 je ukázána na devátém obrázku:

Obrázek 9: Typická konfigurace grafického subsystému

Od zjednodušeného schématu zapojení z obrázku 7 se toto reálné schéma karty MDA nepatrně odlišuje. Především je kromě textového bufferu použita i paměť pro uložení atributů (vysoká intenzita písma, podtržení, inverze atd.). Tato paměť je adresována stejně jako paměť s textem – a z pohledu programátora jsou obě paměti proloženy tak, že dvojice znak+atribut jsou uloženy vedle sebe (výběr nejnižším bitem adresy). Dále zde vidíme pouze přidání „oddělovacích“ obvodů, a to jak mezi CPU, 6845 a pamětí, tak i ve formě záchytných registrů. Mimochodem – blok Character generator je ve skutečnosti obyčejná EPROM.

6. Podpora pro zobrazení textového kurzoru

V předchozím textu jsme si řekli, že čip 6845 dokáže posílat signál o tom, že se má zobrazit textový kurzor. Toto je velmi zajímavá a možná i unikátní funkce, která je ovšem interně řešena velmi jednoduše. Adresu znaku, na kterém je textový kurzor, je nutné zapsat do dvou řídicích registrů, konkrétně do registrů R14 a R15. Dále se v registrech R10 a R11 nachází číslo mikrořádku (v rámci textového řádku), kde se má kurzor zobrazit – ten je totiž tvořen obdélníkem, který začíná (v rámci znaku) právě na řádku v R10 a končí na řádku uloženého v R11 (řekneme, že se jedná o hodnoty 12 a 14 pro znaky vysoké šestnáct mikrořádků).

Činnost 6845 je v tomto ohledu poměrně triviální – v případě, že je adresa právě vybíraného znaku totožná s adresou kurzoru, tak se provede porovnání interního počitadla mikrořádků s hodnotami v registrech R10 a R11. V případě, že počitadlo leží mezi těmito hodnotami (včetně obou mezí), je signál CURSOR nastaven na logickou jedničku – a to je prakticky vše. Další operace s tímto signálem může ale nemusí provést další (typicky diskrétní) logika. Ta typicky pro textové režimy provede OR hodnoty pixelu posílaného na monitor se signálem CURSOR a pro grafické režimy je hodnota zcela ignorována.

Poznámka: blikání kurzoru, pokud je podporováno, je taktéž řízeno další logikou.

7. Triky použité pro grafické režimy

V předchozích kapitolách jsme si popsali, jakým způsobem dokáže čip 6845 spolupracovat s dalšími čipy tvořícími grafický subsystém počítače. Jeho primární úlohou je generování adres do paměti RAM se znaky a paměti (EP)ROM s bitovými maskami znaků. Údaje z této paměti jsou posléze načteny do posuvného registru a postupně posílány do monitoru společně s dalšími důležitými signály.

Jak se však pracuje s rastrovou grafikou?

Pro tento účel sice nebyl čip 6845 navržen, ovšem s rastrovou grafikou do určité míry pracovat může. Podívejme se například na způsob generováni monochromatického obrazu o rozlišení 640×100 pixelů. Čip 6845 může být naprogramován tak, jakoby pracoval s textovou obrazovkou s 80 znaky na řádku a 100 textovými řádky (což je možné). Výška textových řádků bude rovna přesně jednomu mikrořádku – což znamená, že adresy RA lze zcela ignorovat. A adresy, které 6845 generuje na sběrnici MA mohou být převedeny přímo na adresovou sběrnici paměti RAM. Čip postupně projde všemi 100 „textovými“ řádky a vzhledem k tomu, že každý obsahuje 80 „znaků“ (tedy 640) pixelů, je vše v pořádku a vlastní framebuffer bude striktně lineární.

Pokud je nutné pracovat s více barvami pixelů, zkomplikuje se pouze logika s posuvným registrem, protože bude například nutné generovat čtyři barvy na základě dvou bitů. Nejedná se o součást 6845, který tedy vůbec nedokáže rozlišit (například) mezi grafickými režimy karty CGA – se všemi pracuje naprosto stejným způsobem.

Velké omezení spočívá v tom, že celková výška obrazu je omezena na 127 obrazových řádků a to včetně několika řádků pro vertikální synchronizační puls (takže reálně ještě méně). Toto omezení se obchází například tím, že se použije textový režim s písmem vysokým dva mikrořádky, čtyřmi mikrořádky atd. To je technika použitá jak i karty CGA, tak i u grafické karty Hercules.

Na tomto místě je nutno zdůraznit, že rozlišení a barevná hloubka grafických režimů nebyly prakticky vůbec omezeny přímo čipem MC6845, ale dalšími obvody, které se k tomuto integrovanému obvodu 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í“ čipu však bylo možné použít i vyšších rozlišení, samozřejmě pouze za předpokladu, že se využily dostatečně rychlé paměťové čipy tvořící obrazovou paměť (a to nebylo, jak uvidíme dále, vůbec jednoduché nebo levné). Kromě přímého výstupu grafiky byl podporován i takzvaný prokládaný (interlace) režim, tj. střídavé vykreslování lichých a sudých obrazových řádků, používaný zejména při zobrazování na televizorech (ovšem tento režim nebyl v kartách popsaných níže použit). Čip MC6845 dokázal adresovat až 214 textových řádků, přičemž každý řádek mohl mít výšku 25 obrazových řádků. Celková adresovatelná kapacita paměti byla rovna 2(14+5)=512 adres, čehož však žádná grafická karta nevyužívala. Pokud se šířka textového řádku snížila na jeden obrazový řádek či na dva obrazové řádky (častěji), simuloval se grafický režim, ovšem velikost obrazové paměti byla pouhých 214=16 kB (viz například dále popsaná karta CGA).

Poznámka: stále je nutné mít na paměti, že se nejedná o plnohodnotný grafický subsystém, ale pouze o podporu pro přístup do obrazové paměti, generování synchronizačních signálů a další maličkosti – generování textového kurzoru apod.

8. Řídicí registry čipu MC6845

Nastavení resp. přesněji řečeno konfigurace grafického řadiče MC6845 se provádělo přes celkem osmnáct osmibitových řídicích registrů. Některé z těchto registrů byly určeny pro zápis (například registr s počtem znaků na řádek atd.), jiné zase pro čtení (pozice světelného pera). Číselné hodnoty, které mohly být větší než 28 (což je počáteční adresa obrazové paměti, adresa kurzoru a adresa světelného pera), se musely ukládat do dvou sousedních osmibitových registrů. Registry byly programátorům přístupné nepřímo, konkrétně přes dvojici adres – zápis do první adresy vybíral příslušný řídicí registr, čtení či zápis do druhé adresy (o jedničku vyšší) již vedl ke čtení či zápisu do příslušného řídicího registru. Díky tomu bylo možné MC6845 použít v prakticky jakémkoli počítačovém systému, a to i v případě, kdy je počet I/O portů zásadně omezen (teoreticky lze tak zkombinovat MC6845 například s osmibitovým mikrořadičem 8051). O které adresy oněch dvou registrů se konkrétně jedná záleželo na zapojení konkrétní grafické karty. Například u dále popsané grafické karty CGA (tedy karty určené pro IBM PC) se jedná o I/O porty na adresách 0×3d4 a 0×3d5 a u grafické karty Hercules (taktéž IBM PC) se naopak jednalo o I/O porty 0×3b4 a 0×3b5.

Význam jednotlivých řídicích registrů čipu 6845 je uveden v následující tabulce. Povšimněte si, že jednotkami při udávání horizontálních velikostí jsou vždy znaky a nikoli pixely – přesné časování je odvozeno od externího hodinového signálu řízeného krystalem:

Číslo registru Šířka (b) Význam
0 8 celkový počet znaků horizontálně – 1, včetně okrajů (tedy nezobrazených znaků)
1 8 počet horizontálně zobrazených znaků (typicky 40 či 80)
2 8 horizontální pozice synchronizačního signálu (lze tedy posouvat obrazem na monitoru, ovšem omezeně)
3 8 šířka horizontálního synchronizačního signálu (záleží na konkrétním monitoru, řádkové frekvenci atd.)
     
4 7 celkový počet textových řádků, včetně okrajů (například 27, maximálně však 128)
5 5 mikroposun textových řádků po jednotlivých obrazových řádcích
6 7 zobrazený počet textových řádků (například 25)
7 7 vertikální pozice synchronizačního signálu (lze posouvat obrazem, opět omezeně)
     
8 8 režim prokládání (interlace) a posunutí
     
9 5 počet obrazových řádků pro jeden textový řádek – 1 – výška znaku (většinou 8 či 14)
     
10 5+2 začátek hardwarového kurzoru (většinou výška_znaku-3)
11 5 konec hardwarového kurzoru (kurzor může mít například výšku dvou obrazových řádků)
     
12 6 počáteční adresa obrazové paměti (vyšší bajt)
13 8 počáteční adresa obrazové paměti (nižší bajt)
14 6 adresa kurzoru – vyšší bajt (klasický posun hardwarového kurzoru)
15 8 adresa kurzoru – nižší bajt
16 6 adresa světelného pera – vyšší bajt
17 8 adresa světelného pera – nižší bajt
Poznámka: povšimněte si některých omezení vyplývajících ze skutečné bitové šířky registrů, která je mnohdy menší, než by odpovídalo maximální osmibitové šířce:
Vlastnost Omezení
celkový počet textových řádků 128
počet obrazových řádků pro řádek textový (výška textu) 32
výška kurzoru 32
adresa obrazové paměti 214
adresa kurzoru 214
adresa světelného pera 214

Význam prvních čtyř registrů:

          1         2         3         4         5
 12345678901234567890123456789012345678901234567890123456  ← čítač znaků
|                                       |    |         | |
|     běžný viditelný textový řádek     | -- |  sync   |-|
|                                       |    |         | |
                                        ↑    ↑         ↑ ↑
                                        R1   R2    R2+R3 R0

Pro zajímavost se ještě podívejme, jaký je typický obsah řídicích registrů pro textové režimy označované CO40 a CO80, tedy režimy pro grafické karty CGA se čtyřiceti resp. osmdesáti znaky na řádku:

Číslo registru CO40 CO80 Význam
0 56 113 celkový počet znaků horizontálně – 1, včetně okrajů (tedy nezobrazených znaků)
1 40 80 počet horizontálně zobrazených znaků
2 45 90 horizontální pozice synchronizačního signálu
3 10 10 šířka horizontálního synchronizačního signálu
       
4 31 31 celkový počet textových řádků (včetně okrajů)
5 6 6 mikroposun textových řádků po jednotlivých obrazových řádcích
6 25 25 zobrazený počet textových řádků
7 28 28 vertikální pozice synchronizačního signálu
       
8 2 2 režim prokládání (interlace) a posunutí
       
9 7 7 počet obrazových řádků pro jeden textový řádek – 1 – výška znaku
       
10 6 6 začátek hardwarového kurzoru
11 7 7 konec hardwarového kurzoru
       
12 0 0 počáteční adresa obrazové paměti (vyšší bajt)
13 0 0 počáteční adresa obrazové paměti (nižší bajt)
14 0 0 adresa kurzoru – vyšší bajt
15 0 0 adresa kurzoru – nižší bajt
16 0 0 adresa světelného pera – vyšší bajt
17 0 0 adresa světelného pera – nižší bajt
Poznámka: vidíme, že grafická karta CGA zobrazuje znaky o výšce osmi obrazových řádků, přičemž kurzor je (na vybraném znaku) zobrazen na obrazových řádcích 6 a 7. Počet viditelných textových řádků je roven 25, což znamená, že se zobrazuje 25×8=200 obrazových řádků z celkem 31×8=248 obrazových řádků (zbylých (28–25)×8=24 obrazových řádků tvoří okraj, zbytek je vyhrazen pro vertikální synchronizaci.

9. Grafická karta MDA – Monochrome Display Adapter

Jak jsme si již řekli v úvodní kapitole, nabízela společnost IBM do svých prvních osobních počítačů (IBM) PC buď grafickou kartu MDA (Monochrome Display Adapter), nebo grafickou kartu CGA (Color Graphics Adapter). Dokonce bylo možné, aby byly v jednom počítači současně nainstalovány obě zmíněné karty, protože ani adresy jejich řídicích registrů – portů, ani adresní rozsah video paměti, se nepřekrývaly – což ovšem byla v tehdejší době konfigurace z říše snů vyžadující dva odlišné monitory. Počátek výroby obou zmíněných typů karet se datuje do roku 1981, na což je důležité myslet především při snaze o porovnání s počítači, které vyšly v roce 1984 a 1985: Atari ST, Amiga a Macintosh a které tedy musely nabídnout mnohem lepší grafické možnosti (je ostatně typické, že jen IBM PC mělo skutečný textový režim).

pc83

Obrázek 10: Grafická karta MDA s čipem MC6845.

Grafická karta MDA se od prakticky všech dalších grafických adaptérů vyráběných pro počítače IBM PC odlišovala především v tom, že neumožňovala vykreslování rastrové grafiky (označení termínem „grafická karta“ je tedy poněkud nepřesné nebo minimálně zavádějící), jelikož podporovala pouze textový režim 80×25 znaků, který je používán například při startu počítače či 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 Open/Free BSD, například pro řízení zobrazování na druhém monitoru u starších systémů vybavených sběrnicí ISA (v moderních PC se pro zobrazení na více monitorech využívá poněkud odlišná technologie, takže se dnes již jedná jen o teorii). V minulosti se – zejména právě v dobách kralování DOSu – pro tuto činnost nejčastěji používaly výprodejové karty typu Hercules, protože i ty byly navrženy takovým způsobem, aby jejich řídicí porty ani adresy video paměti nekolidovaly s primární grafickou kartou.

Obrázek 11: Fotografie obrazovky počítače IBM PC se spuštěným interpretrem BASICu, v němž je napsán velmi jednoduchý program.

Jednoznačnou (a kromě slušného rozlišení vlastně i jedinou) 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 (používám zde známé Intelovské šestnáctibitové adresování typu 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 (grafická plocha a terminál s příkazovým řádkem), Turbo Pascal (vývojové prostředí zobrazené spolu s laděnou aplikací), Turbo C++, Lotus 1–2–3 apod. V praxi bylo možné použít například kombinace grafických karet 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 (viz další kapitoly), který kromě zobrazení textového režimu podporoval i režim grafický.

Obrázek 12: Úvodní obrazovka GW-BASICu po jeho spuštění v emulátoru PC (zde se konkrétně jedná o DOSBOX).

10. Standardní textový režim karty MDA

Při zobrazování znaků v textovém režimu 80×25 znaků byl každý znak definovaný v×masce 9×14 pixelů, což znamená, že rozlišení obrazovky bylo rovno 720×350 pixelům (samozřejmě ovšem nebylo možné pixely přímo adresovat). Poměrně velké horizontální rozlišení (a tím i velmi dobře čitelný text) 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, zejména pro uživatele pracující převážně v textovém režimu). 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 (jedná se o 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 (původní znaková sada dodávaná firmou IBM odpovídá kódové stránce 437, tj. jedná se o „rozšířenou“ ASCII tabulku). 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, inverzně či zda by měl blikat; dokonce bylo možné nastavit i některé kombinace těchto atributů. Barevné atributy znaků byly použity (i když s poněkud jiným významem) i u dalších grafických karet na PC.

Obrázek 13: Tabulkový procesor VisiCalc spuštěný v DOSu (resp. přesněji řečeno v jeho emulátoru). Jednalo se o jednu z takzvaných „killer application“ pro PC, která plně podporovala i kartu MDA.

Kapacita video paměti (tedy vlastně „textové“ paměti) na této kartě byla rovna čtyřem kilobajtům, přičemž přesně 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 programátora se ukládala vždy dvojice znak-atribut, tj. jednalo se o souvislou oblast paměti, i když fyzicky byly použity dva oddělené paměťové čipy), 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 (tj. tato frekvence byla poněkud vyšší než u dále popisované grafické karty CGA). Při prvním pohledu na údaj o snímkovém 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.

Obrázek 14: Textový editor SpeedScript pro IBM PC (DOS).

Nastavení řídicích registrů karty MDA pro k tomu určený monitor:

Číslo registru Hodnota Význam
0 97 celkový počet znaků horizontálně – 1, včetně okrajů (tedy nezobrazených znaků)
1 80 počet horizontálně zobrazených znaků
2 82 horizontální pozice synchronizačního signálu
3 15 šířka horizontálního synchronizačního signálu
     
4 25 celkový počet textových řádků (včetně okrajů)
5 6 mikroposun textových řádků po jednotlivých obrazových řádcích
6 25 zobrazený počet textových řádků
7 25 vertikální pozice synchronizačního signálu
     
8 2 režim prokládání (interlace) a posunutí
     
9 13 počet obrazových řádků pro jeden textový řádek – 1 – výška znaku
     
10 11 začátek hardwarového kurzoru
11 12 konec hardwarového kurzoru
     
12 0 počáteční adresa obrazové paměti (vyšší bajt)
13 0 počáteční adresa obrazové paměti (nižší bajt)
14 0 adresa kurzoru – vyšší bajt
15 0 adresa kurzoru – nižší bajt
16 0 adresa světelného pera – vyšší bajt
17 0 adresa světelného pera – nižší bajt
Poznámka: vidíme, že výška znaků je skutečně rovna 14 (v registru R9 je hodnota o jedničku snížena) a zajímavé je, že není určen žádný čas pro horní a dolní okraj, což plyne z vlastností originálního monitoru IBM.

Na I/O portu 3B8 lze řídit způsob zobrazení:

|7|6|5|4|3|2|1|0|
 | | | | | | | `---- 1 = 80x25 text
 | | | | | `------- nepoužito
 | | | | `-------- 1 = povolení video signálu
 | | | `--------- nepoužito
 | | `---------- 1 = blikání kurzoru
 `------------- nepoužito

11. Grafická karta CGA – Color Graphics Adapter

První dostupnou grafickou kartou s oficiální podporou zobrazování rastrové 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 druhý standard uvedena (spolu s výše popsanou kartou MDA) 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 řídicími registry lze vytvořit i další textové, grafické či smíšené režimy (v nichž je modifikovaný textový režim použitý pro zobrazení rastrového obrazu, pochopitelně se sníženým horizontálním i vertikálním rozlišením.

pc83

Obrázek 15: Grafický režim 320×200 se čtyřmi barvami (známá hra King's Quest). Jak je z tohoto obrázku patrné, je malý počet barev kompenzován ditheringem, který ovšem při relativně malém rozlišení situaci snad ještě více zhoršuje. Poněkud paradoxní je, že většina rozšířených osmibitových počítačů dokáže – a to dokonce s poloviční velikostí obrazové paměti – tento obrázek zobrazit mnohem lépe.

Vzhledem k omezení tohoto grafického adaptéru, který byl způsobem velmi nízkou řádkovou frekvencí (pouhých 15,75 kHz), bylo možné zobrazit pouze 200 obrazový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 podobně jako u mnohých osmibitových počítačů (Atari, C64 atd.). První znakový režim dokázal zobrazit 40 znaků na textovém řádku, počet textových řá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 přiřazenou 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í (to bylo řešeno mimo 6845). Jak barva popředí, tak i barva pozadí byly zapsány do takzvaného atributu, který měl velikost jeden byte.

pc83

Obrázek 16: Pro porovnání – tentýž obrázek, ovšem zobrazený v grafickém režimu 320×200 s barvami šestnácti na modernější grafické kartě (EGA, VGA).

Zajímavá je barvová paleta karty CGA. Ta obsahuje šestnáct barev, přičemž ze základních osmi barev jsou odvozeny barvy s 2/3 intenzitou složek (tedy tmavší barvy). To však znamenalo, že existovaly dvě černé barvy (2/3 z černé je stále černá) a tmavě žlutá barva, která vypadala škaredě. Z tohoto důvodu byla provedena úprava v zapojení monitoru tak, že namísto druhé černé barvy je světle šedá a namísto tmavé žluté hnědá barva. Tato úprava se (nyní již přímo na grafických kartách) dochovala dodnes.

Poznámka: podobné patche, které provází celou historii IBM PC, mě fascinují.

12. Oficiální grafické režimy karty CGA

Mnohem zajímavější a flexibilnější než textové režimy jsou (alespoň zdánlivě) 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 barvové palety. Tato paleta však nemohla být libovolná (z předchozího textu víme, že v textovém režimu je možné použít šestnáct barev), protože 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 – ovšem již víme, že hnědá byla tvořena speciálním obvodem v monitoru z tmavě žluté), 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.

Obrázek 17: Slavná hra Lemmings v režimu 320×200 se čtyřmi barvami.

Čtvrtá barva byla při práci s BIOSem (přesněji řečeno při používání služeb BIOSu, například přechodu do grafického režimu) vždy nastavena na černou; ve skutečnosti se však přes řídicí registry grafické karty dala tato barva (jako jediná) nastavit na jednu ze šestnácti předdefinovaných barev. Tuto poměrně zajímavou možnost však, vzhledem k nedostupnosti technických informací, mnoho aplikací nevyužívalo. Kapacita obrazové paměti v tomto režimu byla rovna 320×200/8×2=16000 bytům, což znamenalo, že adresovací schopnosti čipu Motorola MC6845 byly využity jen částečně – ve skutečnosti se v grafických režimech používalo pouze třináct bitů adresy textových řádků (viz předchozí kapitoly s popisem tohoto čipu), přičemž výška textových řádků musela být nastavena na dva obrazové řádky. Ve druhém grafickém režimu o rozlišení 640×200 pixelů mohl každý pixel nabývat pouze jedné ze dvou barev, které jsou při inicializaci tohoto režimu pomocí BIOSu nastaveny na černou a bílou. S využitím služeb BIOSu tyto barvy nastavit nelze, ale pomocí změny konfiguračních registrů je to možné – lze tak generovat například zeleno-červený obraz či libovolnou jinou kombinaci šestnácti základních barev (což opět nebylo využíváno). Kapacita obrazové paměti byla při použití tohoto režimu rovna 640×200/8=16000 bytům, tj. naprosto stejně, jako v předchozím grafickém režimu. Kapacita obrazové paměti byla z tohoto důvodu 16kB, přičemž posledních 384 bajtů nebylo grafickým systémem využíváno.

p83_

Obrázek 18: Známá hra Arcade Voleyball pro dva hráče taktéž využívá čtyřbarevný grafický režim karty CGA.

Nastavení řídicích registrů karty CGA pro oba grafické režimy (ty jsou totiž z pohledu 6845 totožné):

Číslo registru Hodnota Význam
0 56 celkový počet znaků horizontálně – 1, včetně okrajů (tedy nezobrazených znaků)
1 40 počet horizontálně zobrazených znaků
2 45 horizontální pozice synchronizačního signálu
3 10 šířka horizontálního synchronizačního signálu
     
4 127 celkový počet textových řádků (včetně okrajů)
5 6 mikroposun textových řádků po jednotlivých obrazových řádcích
6 100 zobrazený počet textových řádků
7 112 vertikální pozice synchronizačního signálu
     
8 2 režim prokládání (interlace) a posunutí
     
9 1 počet obrazových řádků pro jeden textový řádek – 1 – výška znaku
     
10 6 začátek hardwarového kurzoru
11 7 konec hardwarového kurzoru
     
12 0 počáteční adresa obrazové paměti (vyšší bajt)
13 0 počáteční adresa obrazové paměti (nižší bajt)
14 0 adresa kurzoru – vyšší bajt
15 0 adresa kurzoru – nižší bajt
16 0 adresa světelného pera – vyšší bajt
17 0 adresa světelného pera – nižší bajt
Poznámka: z tabulky je patrné, že grafické režimy jsou vlastně z pohledu 6845 režimy textovými se 100 textovými řádky a znaky s výškou dvou mikrořádků.

Na I/O portu 3D8 lze řídit způsob zobrazení:

|7|6|5|4|3|2|1|0|  3D8 Mode Select Register
 | | | | | | | `---- 1 = 80x25 text, 0 = 40x25 text
 | | | | | | `----- 1 = 320x200 grafika, 0 = text
 | | | | | `------ 1 = monochrom, 0 = barevný výstup
 | | | | `------- 1 = povolení video signálu
 | | | `-------- 1 = 640x200 B/W grafika
 | | `--------- 1 = blikání kurzoru
 `------------ nepoužito

Další port slouží pro modifikaci barvové palety:

Text:
 
|7|6|5|4|3|2|1|0|
 | | | | | `-------- okraj obrazovky (RGB)
 | | | | `--------- vyšší/nižší intenzita
 | | | `---------- intenzita pozadí
 `--------------- nepoužito
 
Grafika:
 
|7|6|5|4|3|2|1|0|
 | | | | | `-------- RGB for background
 | | | | | `-------- okraj obrazovky (RGB)
 | | | `---------- nepoužito
 | | `----------- 1 = paleta číslo 1, 0=paleta číslo 0
 `-------------- nepoužito
 
Paleta číslo 0 = green, red, brown
Paleta číslo 1 = cyan, magenta, white

Vzhledem k tomu, že přímá změna hodnot konfiguračních registrů při nastavování grafického režimu je poměrně složitá a některé hodnoty dokonce mohly vést ke zničení připojeného monitoru (elektronika tehdejších monitorů byla velmi jednoduchá a především – nejednalo se o multifrekvenční monitory, které jsou vůči nekorektnímu nastavení již odolnější), byly do BIOSu zavedeny služby určené jak pro nastavení grafických či textových režimů, tak i služby umožňující provádění základních grafických operací – výpis znaku, vykreslení pixelu, posun kurzoru, přečtení hodnoty pixelu atd. V případě grafické karty CGA byly pomocí služeb BIOSu dostupné dva grafické režimy – monochromatický režim s rozlišením 640×200 pixelů a čtyřbarevný režim, který nabízel rozlišení 320×200 pixelů.

p83_

Obrázek 19: Další známá CGA hra – Paratroopers.

13. Organizace paměti v monochromatickém režimu (hi-res)

Nejprve si popíšeme práci v monochromatickém režimu, která nebyla zcela jednoduchá, ač by se na první pohled mohlo znát, že v tomto případě bude situace triviální – ostatně co může být jednoduššího, než obyčejná pravidelná bitmapa? (v původním významu tohoto slova).

Obrázek 20: V hi-res režimu karty CGA mohla běžet například hra Simcity.

V monochromatickém režimu grafické karty CGA s rozlišením 640×200 pixelů se na obrazovce pracovalo s celkem 128000 pixely, pro jejichž uložení ve video paměti bylo nutné v grafické paměti alokovat 16000 bajtů. Ovšem přístup k jednotlivým pixelům nebyl zcela přímočarý, protože celá obrazová paměť byla rozdělena na dvě podoblasti. První podoblast byla (z hlediska mikroprocesoru) mapována na adresy 0×b800:0×0000–0×b900:0×ffff, druhá oblast na adresy 0×ba00:0×0000–0×bb00:0×ffff (opět je použito adresování segment:offset). V první oblasti obrazové paměti byly umístěny sudé obrazové řádky, ve druhé oblasti řádky liché; vždy osmdesát bajtů na řádek (80×8=640). Z této organizace obrazové paměti, která byla použita kvůli omezeným možnostem Motoroly 6845, vyplývá, že i na první pohled poměrně jednoduché operace, jako je vykreslení úsečky, se implementovaly poměrně obtížně a byly z tohoto důvodu také pomalé.

Obrázek 21: Jedna z variant hry Simcity – Moonbase (naprogramovaná v Turbo Pascalu).

Proč však byla organizace paměti tak složitá? Teoreticky by mělo být možné čip 6845 naprogramovat tak, aby pracoval s 200 textovými řádky, přičemž každý textový řádek by byl vysoký přesně jeden obrazový řádek (mikrořádek). Adresovací možnosti (šířka sběrnice) to umožňují, ovšem čip 6845 dokáže pracovat jen se 127 textovými řádky, což je značné omezení. Proto bylo nutné použít triku – použije se jen 100 textových řádků, ale každý bude vysoký dva mikrořádky. A pro adresaci pixelů (jejich osmic) se použije jak adresovací sběrnice MA0 až MA12, tak i první bit z pětice RA0 až RA4 – a právě bit v RA0 vybíral horní či spodní oblast obrazové paměti.

Poznámka: lépe to udělat asi nešlo kvůli nutnosti udržení kompatibility textového režimu.

14. Standardní čtyřbarevný grafický režim karty CGA: 320×200

Druhým standardním grafickým režimem podporovaným grafickou kartou CGA, který bylo možné nastavit s využitím služeb BIOSu, byl čtyřbarevný režim nabízející rozlišení 320×200 pixelů. V tomto režimu je každý pixel v obrazové paměti uložen ve dvou bitech (čtyři pixely v každém bajtu), což znamená, že je opět využito celkem 16000 bajtů video paměti z dostupných 16 kB. Obrazová paměť je rozdělena podobným způsobem (sudé/liché řádky) jako u režimu monochromatického, což je pochopitelné, protože z hlediska čipu MC6845 se jedná o naprosto stejný mód, liší se jen způsob interpretace načtených dat (a ten je prováděn v jiných obvodech).

pc84

Obrázek 22: Úvodní obrazovka hry Golden Axe spuštěná v grafickém režimu karty CGA. Jedná se o čtyřbarevný režim s rozlišením 320×200 pixelů.

U všech režimů karty CGA se však vyskytuje ještě jeden fenomén, který uživatelé jiných počítačů neznali – souběžný přístup mikroprocesoru a grafického řadiče do obrazové paměti nebyl kupodivu nijak ošetřen, což způsobovalo nechvalně známé „sněžení“. Jediná 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). A to byl další problém, protože karta CGA negenerovala přerušení před vertikálním zatemněním – tedy něco, co uměly již osmibitové mikropočítače. Takže čekání na zatemnění muselo probíhat tím nejhorším možným způsobem – kontinuálním čtením příslušného bitu ze stavového registru karty CGA.

pc84

Obrázek 23: Pro porovnání – tentýž obrázek, ovšem spuštěný v šestnáctibarevném režimu karty EGA. Rozlišení sice zůstalo zachováno, ale větší počet barev je na první pohled patrný.

Poznámka: v počítači BBC Micro, který taktéž používal čip 6845, se situace řešila jinak – paměti byly dostatečně rychlé na to, aby se o přístup k nim spravedlivě dělil mikroprocesor i 6845. Díky tomu mohla být obrazová paměť alokována přímo v hlavní RAM.
pc84

Obrázek 24: Teprve s 256 barvami (grafická karta VGA) bylo možné odstranit dithering.

15. Cílená modifikace řídicích registrů karty CGA a nestandardní režimy zobrazování

Kromě základních (z pohledu programátorů standardních) grafických režimů, které se nastavovaly s využitím služeb BIOSu, byly díky poměrně širokým možnostem čipu MC6845 podporovány i mnohé další grafické módy. První z těchto módů je „legální“ tj. zmiňuje se o něm i oficiální dokumentace firmy IBM (ale například náš SYSMAN již nikoli, což je však pochopitelné – viz další text). V tomto režimu bylo možné zobrazit rastrový obraz o rozměrech 160×200 pixelů, přičemž každý pixel mohl nabývat jedné ze šestnácti barev, podobně jako tomu v textovém režimu (včetně výše zmíněných hacků hnědé a světle šedé barvy). Potřebná kapacita video paměti je stejná, jako v případě režimu monochromatického – tedy přesně 16000 bajtů. Tento režim však byl použitelný pouze pro kompozitní video, tj. například pro televizory připojené ke grafické kartě pomocí konektoru RCA. Vzhledem k tomu, že obrazová frekvence je rovna 60Hz, neměl tento režim pro naši oblast (ČR, Evropa) velký smysl, protože tento kmitočet je určen pro televizory podporující normu NTSC.

Poznámka: originální karta CGA skutečně kromě konektoru pro připojení digitálního monitoru obsahovala i RCA konektor.
pc84

Obrázek 25: Další porovnání – screenshot ze hry Golden Axe spuštěné ve čtyřbarevném režimu grafické karty CGA.

Druhý nestandardní mód je již možné použít na jakémkoli monitoru, tedy i na originálním digitálním monitoru IBM i na jeho klonech. Ve své podstatě se jedná o režim textový, u nějž je pomocí řídicích registrů čipu MC6845 upravena výška znaků na pouhé dva skenovací řádky (což již ostatně známe). 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šířená tabulka ASCII), zvyšuje se rozlišení tohoto pseudografického režimu na 160×100 „pixelů“, přičemž každý pixel může nabývat jedné z šestnácti barev (programátor tedy mění pouze barvové atributy znaků, tj. každý lichý bajt). Z jakého důvodu 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ě totiž narážíme na neefektivní práci s obrazovou pamětí, protože pro každý znak se musí uložit i jeho barvový atribut (dva bajty). 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.

pc84

Obrázek 26: Táž scéna, ovšem zobrazená kartou EGA v šestnácti barvách.

Tento poměrně zajímavý režim, použitý například i v několika hrách, je možné nastavit i u dalších grafických karet, přesněji řečeno u všech karet, které emulují funkce čipu MC6845, tj. například u karty EGAVGA. Ve většině případů 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. Programátoři se v minulosti pokoušeli nastavovat i další grafické režimy. Teoreticky to není problematické, protože čip MC6845 je velmi flexibilní, ale mnohé monitory nedokázaly korektně pracovat v těch případech, kdy se změnilo časování horizontálních a vertikálních synchronizačních signálů – grafická karta CGA měla pouze jeden krystal sloužící ke generování hodinového signálu (vstup do čipu MC6845), takže například při změně horizontálního rozlišení (počtu pixelů na obrazovém řádku) se buď musel snížit počet obrazových řádků, nebo muselo dojít ke změně obrazové frekvence.

pc84

Obrázek 27: Stejná scéna zobrazená kartou VGA (256 barev).

Pro doplnění přidávám vzpomínky jednoho uživatele grafické karty CGA:

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. :-)

16. Grafická karta Hercules – první vážnější konkurence IBM postavený opět na čipu 6845

Obě výše zmíněné grafické karty, tj. jak MDA, tak i CGA, mají i přes mnohé rozdíly několik společných vlastností. Jedná se totiž v obou případech o karty navržené a prodávané (od roku 1981) firmou IBM, které jsou vybavené rozhraním pro osmibitovou variantu universální interní sběrnice ISA (Industry Standard Architecture). Obě karty jsou taktéž založeny na již popsaném grafickém řadiči Motorola MC6845, což by sice na první pohled mohlo znamenat určitou míru kompatibility, ale přesný opak byl pravdou – firma IBM u obou karet zvolila odlišné řádkové frekvence (18,432 kHz u karty MDA a 15,75 kHz u karty CGA) i jiný typ videosignálů, což ve výsledku vedlo k tomu, že pro každou kartu musel být použitý odlišný monitor. Zatímco grafická karta CGA nabízela možnost barevného zobrazení (viz předchozí kapitoly) na úkor menšího – pro mnohé uživatele neakceptovatelného – horizontálního i vertikálního zobrazení, umožňovala sice karta MDA zobrazení velmi dobře čitelného textu, ovšem bez možnosti použití jakéhokoli grafického režimu (pochopitelně až ne pseudorežim založený na znacích z rozšířené ASCII).

pc84

Obrázek 28: Slavný textový editor T602 spuštěný na počítači s grafickou kartou Hercules.

V této situaci se, pravděpodobně vůbec poprvé (z hlediska koncového uživatele), projevila jedna z největších předností architektury IBM PC – modularita. Zatímco firma IBM nereagovala na oprávněné výtky, které od uživatelů přicházely především kvůli vlastnostem grafické karty CGA (i mnohé osmibitové počítače totiž měly grafický subsystém vyřešený mnohem elegantněji), objevil se v roce 1982 konkurenční výrobek – grafická karta Hercules Graphics Card (HGC) firmy Hercules Computer Technology. Výrobce tuto grafickou kartu navrhl tak, aby ji bylo možné použít s monitorem určeným pro kartu MDA, ovšem včetně možnosti přepnutí do monochromatického grafického režimu s relativně vysokým rozlišením 720×348 pixelů (což je na dobu vzniku velmi slušné a dosti to konkurovalo například Atari ST s monochromatickým monitorem a rozlišením 640×400 pixelů). Dodržení zpětné kompatibility s kartou MDA nebylo složité – v textovém i grafickém režimu (viz další text) byly použity takové frekvence synchronizačních signálů (řádková a snímková frekvence), která odpovídaly signálům generovaným kartou MDA.

pc84

Obrázek 29: T602 zobrazený kartou CGA (skutečný obraz má ve skutečnosti jen 200 řádků, nikoli 400, ty byly uměle zvětšeny emulátorem).

I způsob práce v textovém režimu se od karty MDA téměř nelišil, což znamenalo, že na této kartě bylo možné provozovat všechny aplikace pracující v textovém režimu (navíc bylo možné s využitím rezidentních programů simulovat i grafické režimy karty CGA, přičemž se jednotlivé barevné odstíny nahrazovaly ditheringem). Především z těchto důvodů byla grafická karta Hercules v první polovině osmdesátých let minulého století velmi oblíbená a do svých sestav ji instalovali i tehdejší přední výrobci osobních počítačů. K velké oblíbenosti přispěla i poměrně nízká cena, takže se karta Hercules používala i v době nástupu grafické karty EGA, jejímž popisem se ovšem dnes zabývat nebudeme (i když čip 6845 velmi zdárně emulovala!). Firma Hercules Computer Technology vytvořila i následníka této grafické karty – Hercules Plus – jenž se odlišoval především v tom, že bylo možné programově měnit znakovou sadu v textovém režimu a docílit tak například zobrazení českých znaků (u původního Herculesu či MDA se znaková sada měnila přeprogramováním paměti EPROM).

pc84

Obrázek 30: T602 zobrazený kartou EGA v rozlišení 640×350 v šestnácti barvách.

17. Základní technické parametry karty Hercules

Grafická karta Hercules je založena, podobně jako oba již popsané grafické adaptéry firmy IBM, na čipu Motorola MC6845, nebo (konkrétně v případě různých klonů) na VLSI obvodu se stejnými vlastnostmi i významem řídicích portů. Jak bude z dalšího popisu patrné, je čip MC6845 v této kartě zapojen a naprogramován poněkud odlišným způsobem než tomu bylo u grafické karty CGAMDA. Kartu Hercules lze připojit do standardní osmibitové sběrnice ISA (v dokumentaci firmy IBM také označované termínem PC-BUS), přičemž se předpokládalo, že frekvence hodinových signálů této sběrnice bude rovna 4,77 MHz (frekvence základního oscilátoru 14,285 MHz je při generování hodinových signálů dělená třemi). Modernější osobní počítače měly frekvenci hodinových signálů sběrnice ISA zvýšenou na 8, 8.33, 10 či 12 MHz, ovšem při takto vysokých frekvencích mohlo na kartě Hercules docházet k výpadkům dat při zápisu do video paměti. Na grafické kartě byl kromě řadiče, podpůrných obvodů a video paměti přítomný i jeden paralelní port, což také přispívalo k oblíbenosti Herculesu mezi zákazníky, protože první personální počítače typu IBM PC tyto porty neměly nainstalovány přímo na základní desce a bylo je zapotřebí zvlášť dokupovat (a tím mimo jiné přicházet o jednu pozici na ISA sběrnici, nehledě na relativně vysokou cenu jakýchkoli PC komponent).

pc84

Obrázek 31: Textový editor T602 zobrazený poměrně neznámou kartou MCGA, která v režimu nejvyššího rozlišení 640×480 měla jen jednu bitovou rovinu a tím pádem podporovala pouze dvě barvy.

Kapacita obrazové paměti byla oproti kartě CGA zvýšena na dvojnásobek, tj. na celých 32 kB. Kromě paměťových modulů tvořících obrazovou paměť byla na kartě nainstalována i paměť typu ROM popř. EPROM, ve které byla uložena znaková sada, konkrétně bitové podoby znaků (viz další kapitolu). Ovládání grafického čipu bylo prováděno s využitím parametrů ukládaných přes vstupně/výstupní porty umístěné na adresách 0×3b00×3bf, přičemž na adresy 0×3b4 a 0×3b5 byly namapovány řídicí registry čipu MC6845 (těchto registrů je, jak již víme z předchozích kapitol, celkem osmnáct, ovšem poslední dva registry týkající se světelného pera lze ignorovat). Vhodnou změnou parametrů docházelo k přepínání mezi textovým a grafickým režimem, bylo však možné také měnit parametry zobrazení grafiky (rozlišení, zpoždění synchronizačních signálů, pozice hardwarového textového kurzoru, mikroposun textových řádků apod.), čehož se často používalo při emulaci grafických režimů karty CGA.

pc84

Obrázek 32: Nejlepší rozlišení i největší počet barev pro textový editor T602 nabízela grafická karta VGA – 640×480 pixelů v šestnácti barvách (editor však využil jen podmnožinu barvové palety, navíc obrazová frekvence nebyla nijak ohromující).

Čtením stavových bitů z portu 0×3ba bylo možné testovat průběh horizontálního i vertikálního zatemnění (synchronizace používaná například ve hrách) a číst polohu hrotu světelného pera. Vzhledem k tomu, že grafická paměť byla z hlediska mikroprocesoru mapována od adresy b000:0000 do adresy b000:7fff (opět je použit způsob adresování segment:offset), nedocházelo k překryvu s obrazovou pamětí grafické karty CGA a proto lze tyto dvě karty provozovat současně i na jednom počítači. Taktéž nedochází k překryvům vstupně/výstupních portů, neboť ty jsou v případě karty CGA umístěny o 16 bajtů výše. Hercules je v případě použití této kombinace využit pro kvalitní zobrazování textu a monochromatické grafiky, CGA pro zobrazení barevné (ehm :-) grafiky. Další poměrně oblíbenou kombinací z pozdější doby byla VGA+Hercules, ovšem v tomto případě Hercules většinou sloužil pro práci v textovém režimu (čehož dokázaly využít IDE firmy Borland, AutoCAD atd.).

18. Textový režim karty Hercules

V×textovém režimu je grafická karta Hercules prakticky stoprocentně kompatibilní s kartou MDA, tj. pracuje se s textem o 80 sloupcích a 25 řádcích, včetně stejného způsobu práce s atributy jednotlivých znaků (podtržení apod.). Text je zobrazován v rozlišení 720 350 pixelů, což umožňuje na jeden znak použít masku o velikosti 9×14 pixelů. Textovou obrazovku lze mapovat buď od adresy b000:0000 nebo od adresy b800:0000. Jedinou nevýhodou textového režimu grafické karty Hercules je fakt, že znaková sada je uložena v paměti EPROM typu 27C64 a nelze ji tedy programově změnit, pouze „přepálit“ (pro zajímavost – všechny Herculesy s „přepálenou“ znakovou sadou, které jsem viděl, používaly kódování Kamenických, viz další odstavec). Tvary znaků jsou v paměti EPROM uloženy tak, jakoby jejich maska měla velikost 8×16 pixelů, avšak pro každý znak se při jeho vykreslování dva řádky ignorují a podle pozice znaku v ASCII tabulce se doplňuje devátý sloupec pixelů, čímž se dostáváme k výsledné masce 9×14 pixelů (devátý sloupec vzniká kopií osmého sloupce u znaků představujících rámečky, jinak je tento sloupec vždy prázdný).

Obrázek 33: Volkov Commander v režimu karty Hercules.

Z výše uvedených informací vyplývá, že pro uložení celé znakové sady by měly dostačovat pouhé čtyři kilobajty, neboť 16 řádků×1 bajt×256 znaků=4096 bajtů. Ovšem vzhledem k tomu, že paměť EPROM 27C64 má kapacitu 8 kB, jsou horní 4 kB nevyužity. Vhodnou hardwarovou úpravou je však možné implementovat dvě znakové sady – u nás se většinou používala originální sada US-ASCII a již zmíněné české znaky v kódu Kamenických. Kromě původní karty Hercules se vyráběla taktéž již zmíněná karta Hercules Plus, která se od původního modelu odlišuje především v tom, že znakovou sadu ukládá do paměti typu (D)RAM a umožňuje tak programově měnit používanou znakovou sadu. U této karty je dokonce možné rozšířit počet znaků ve znakové sadě až na teoretickou hodnotu 212=4096 tím způsobem, že se čtyři bity v atributovém bajtu použijí na definici atributů znaků a zbylé čtyři bity se připojí k osmibitovému ASCII kódu znaku. Ne všechny kódy však mohou být skutečně využity, protože velikost paměti vyhrazené pro znakovou sadu dosahuje 48 kB a ne 64 kB.

Obrázek 34: QBasic v režimu karty Hercules.

19. Grafický režim karty Hercules

Grafický režim karty Hercules je, ostatně jako téměř ve všech obdobných případech, mnohem zajímavější a flexibilnější, než režim textový. Hercules podporoval na svou dobu poměrně vysoké rozlišení 720×348 obrazových bodů zobrazovaných černobíle nebo dvoubarevně. Konkrétní barvy použité při zobrazování byly závislé na typu obrazovky monitoru; kromě obligátní kombinace černá+zelená byla mezi výrobci obrazovek oblíbená například kombinace tmavě modrá a světle červená nebo tmavě modrá a žlutá (je to možná zvláštní kombinace, ovšem právě s tou jsme se mohli v tuzemsku setkat poměrně často). Horizontální rozlišení grafického režimu je stejné, jako v případě režimu textového, protože platí 80 znaků na řádku × 9 horizontálních pixelů na znak = 720 pixelů. Vertikální rozlišení se však liší o dva skenovací řádky. V textovém režimu je vertikální rozlišení, tj. počet obrazových řádků, rovno 350 pixelům, protože platí vztah: 25 textových řádků × 14 skenovacích/obrazových řádků na výšku znaku=350 skenovacích řádků celkem. V grafickém režimu je zvolena hodnota 348 skenovacích řádků především z toho důvodu, že je toto číslo dělitelné čtyřmi, což souvisí s režimem přístupu do obrazové paměti, jehož princip bude popsán v následujícím odstavci (ostatně změnou řídicích registrů čipu MC6845 lze počet obrazových řádků v určitém rozsahu měnit, takže lze dosáhnout i 350 řádků – pokud vůbec někdo pozná vizuální rozdíl).

Obrázek 35: Hra Simcity v režimu grafické karty Hercules. Z předchozího odstavce je patrné, že konkrétní barvové schéma se liší podle typu monitoru (a mnohé monitory navíc měly tlačítko pro inverzní zobrazení).

V případě, že porovnáme signálové poměry obou podporovaných režimů, zjistíme, že grafický režim je prakticky totožný s režimem textovým. Snížení počtu skenovacích řádků se projeví pouze delším časovým okamžikem BLANK před vertikálním zpětným během elektronového paprsku. Obrazová paměť je při zapnutí grafického režimu rozdělena do čtyřech oblastí. V paměťové oblasti b000:0000-b000:1fff se nachází skenovací řádky 0, 4, 8,…, v oblasti b000:2000-b000:3fff řádky 1, 5, 9,…, na adresách b000:4000-b000:5fff řádky 2, 6, 10, … a konečně v paměťové oblasti b000:6000-b000:7fff skenovací řádky 3, 7, 11, … . Přístup k jednotlivým pixelům je tak poměrně komplikovaný, což umocňuje také fakt, že v jednom bytu je uložena vždy osmice pixelů (proč tomu tak je již tušíme – omezení čipu 6845 v počtu „textových“ řádků – 348 je větší než 127, takže je zapotřebí použít 348/4 textových řádků, každý s „výškou“ čtyři mikrořádky). Celková spotřeba paměti pro grafický režim karty Hercules se dá vypočítat snadno. Na jeden řádek je zapotřebí alokovat 720/8=90 bytů, na celý snímek pak 90×348 = 31320 bajtů. Zbylých 1440 bajtů obrazové paměti, která má, jak již víme z předchozího textu kapacitu 32 kB, zůstává nevyužito.

Nastavení řídicích registrů 6845:

skolení ELK

Číslo registru Hodnota Význam
0 53 celkový počet znaků horizontálně – 1, včetně okrajů (tedy nezobrazených znaků)
1 45 počet horizontálně zobrazených znaků
2 46 horizontální pozice synchronizačního signálu
3 7 šířka horizontálního synchronizačního signálu
     
4 91 celkový počet textových řádků (včetně okrajů)
5 2 mikroposun textových řádků po jednotlivých obrazových řádcích
6 87 zobrazený počet textových řádků (87*4=348 obrazových řádků celkem)
7 87 vertikální pozice synchronizačního signálu
     
8 2 režim prokládání (interlace) a posunutí
     
9 3 počet obrazových řádků pro jeden textový řádek – 1 – výška znaku (tedy 4 mikrořádky)
     
10 0 začátek hardwarového kurzoru
11 0 konec hardwarového kurzoru
     
12 0 počáteční adresa obrazové paměti (vyšší bajt)
13 0 počáteční adresa obrazové paměti (nižší bajt)
14 0 adresa kurzoru – vyšší bajt
15 0 adresa kurzoru – nižší bajt
16 0 adresa světelného pera – vyšší bajt
17 0 adresa světelného pera – nižší bajt

Adresa pro operaci zápisu či čtení pixelu zadaného souřadnicemi x, y se vypočte následovně:

offset = 0x2000 * (y % 4) + 90 * (y >> 2) + (x >> 3)

Index bitu, který se má zapsat či přečíst na výše vypočtené adrese, lze vyjádřit takto:

offset bit = 7 - (x % 8)

20. Odkazy na Internetu

  1. Support/peripheral/other chips – 6800 family
    http://www.cpu-world.com/Support/6800.html
  2. Motorola 6845
    http://en.wikipedia.org/wi­ki/Motorola_6845
  3. The 6845 Cathode Ray Tube Controller (CRTC)
    http://www.tinyvga.com/6845
  4. CRTC operation
    http://www.6502.org/users/an­dre/hwinfo/crtc/crtc.html
  5. 6845 – Motorola CRT Controller
    https://stanislavs.org/hel­ppc/6845.html
  6. The 6845 Cathode Ray Tube Controller (CRTC)
    http://www.tinyvga.com/6845
  7. Motorola 6845 and bitwise graphics
    https://retrocomputing.stac­kexchange.com/questions/10996/mo­torola-6845-and-bitwise-graphics
  8. IBM Monochrome Display Adapter
    http://en.wikipedia.org/wi­ki/Monochrome_Display_Adap­ter
  9. Color Graphics Adapter
    http://en.wikipedia.org/wi­ki/Color_Graphics_Adapter
  10. Wikipedia CZ: Sběrnice:
    http://cs.wikipedia.org/wi­ki/Sb%C4%9Brnice
  11. Wikipedia EN: Industry Standard Architecture:
    http://en.wikipedia.org/wi­ki/Industry_Standard_Archi­tecture
  12. Macintosh 128K/512K technical details
    https://en.wikipedia.org/wi­ki/Macintosh_128K/512K_techni­cal_details
  13. MOS Technology 6522
    https://en.wikipedia.org/wi­ki/MOS_Technology_6522
  14. Color Graphics Adapter and the Brown color in IBM 5153 Color Display
    https://www.aceinnova.com/en/e­lectronics/cga-and-the-brown-color-in-ibm-5153-color-display/
  15. The Modern Retrocomputer: An Arduino Driven 6845 CRT Controller
    https://hackaday.com/2017/05/14/the-modern-retrocomputer-an-arduino-driven-6845-crt-controller/

Autor článku

Pavel Tišnovský vystudoval VUT FIT a v současné době pracuje ve společnosti Red Hat, kde vyvíjí nástroje pro OpenShift.io.