Hlavní navigace

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

16. 3. 2005
Doba čtení: 10 minut

Sdílet

V dnešním pokračování seriálu o grafických čipech se budu věnovat popisu grafických subsystémů legendárních osmibitových domácích počítačů Commodore C64, Sinclair ZX81 a ZX Spectrum.

Obsah

1. Grafický čip VIC II v počítači Commodore C64
2. Ovládání grafického čipu VIC II
3. Podporované grafické a textové režimy
4. Sprity na VIC II
5. Další vlastnosti čipu VIC II
6. Grafika na počítači ZX81
7. Generování grafiky na ZX Spectru
8. Obsah dalšího pokračování

1. Grafický čip VIC II v počítači Commodore C64

Logo Commodore

Počítače Commodore C64 patřily ve své době mezi špičku mezi osmibitovými počítači, zejména díky výhodnému poměru cena/výkon a dostupnosti programového vybavení. Vzhledem k agresivní cenové válce mezi firmami Atari, Commodore a dalšími výrobci na americkém trhu se cena modelu C64 snížila z původních 1000 $ na pouhých 200 $ (osmibitová Atari však stála i 100 $). C64 proslul zejména legendárním hudebním čipem SID (Sound Interface Device), který se dodnes používá v některých hudebních syntetizérech. Dodnes nejsou známy všechny vlastnosti tohoto zvukového čipu, protože technická specifikace byla vydána před vlastním návrhem a výrobou.

V osmibitových počítačích Commodore C64 byl použit grafický čip firmyMOS Technologies, který se nazýval VIC II, což je zkratka úplného názvu Video Interface Controller II (první verze tohoto čipu VIC I se používala zejména v jednoúčelových automatech).

Grafický čip VIC II byl rozšířen ve více variantách: starší počítače C64 obsahovaly buď verzi MOS 6567 (televizní norma NTSC, tj. především USA), nebo MOS 6569 (televizní norma PAL, zejména Evropa aj.), novější počítače byly osazeny verzemi MOS 8562 (NTSC) nebo MOS 8565 (PAL). Jednotlivé verze čipu se lišily časováním některých synchronizačních signálů a vnitřní strukturou, z hlediska programování se však stále jednalo o tentýž čip.

VIC II byl zapojen na interní osmibitovou datovou a šestnáctibitovou adresovou sběrnici počítače. Vzhledem k tomu, že bylo vyvedeno pouze čtrnáct nižších adresových vodičů, mohl čip přistupovat k maximálně 16 KB operační paměti, nejvyšší bity adresy se musely nastavovat pomocí speciálních klopných obvodů. Kromě přístupu do operační paměti se prováděl i přístup do barvové (atributové) paměti, která měla kapacitu 1 K x 4 bity=0,5 KB (K=210). Barevná paleta byla neměnná a obsahovala 16 barev (obvod GTIA v osmibitových Atari měl naproti tomu barvovou paletu s celkem 128 barvami).

Počítač Commodore C64

2. Ovládání grafického čipu VIC II

Grafický čip VIC II se ovládal pomocí skupiny 47 osmibitových registrů, které byly uloženy (mapovány) na adresách0×d000 – 0×d02e. K registrům bylo možné přistupovat stejným způsobem jako do buněk operační paměti, protože celý adresový prostor čipu VIC byl mapován do adresového prostoru procesoru. Většina registrů byla určena pro zápis, pouze některé registry bylo možné číst – týkalo se to zejména registrů pro čtení polohy světelného pera nebo registru, ve kterém byly uloženy jednobitové příznaky kolize mezi sprity navzájem resp. mezi sprity a pozadím.

3. Podporované grafické a textové režimy

Grafický či textový režim se na čipu VIC II nastavoval pomocí tří bitů v jednom z řídicích registrů; teoreticky tedy bylo možné zvolit jeden z osmi režimů, ve kterých mohl pracovat vestavěný sekvencér (synchronizovaný posuvný registr). Ve skutečnosti se však používalo pouze pět režimů, při nastavení zbylých tří se totiž žádná grafika nezobrazovala (kromě spritů, které měly vlastní řízení nezávislé na použitém režimu). Jednotlivé podporované režimy si stručně popíšeme:

  • Standardní textový režim: v tomto režimu se zobrazuje 40 znaků na 25 řádcích. Každý znak je představen rastrovým obrázkem o rozměru 8×8 pixelů, tj. celkové rozlišení obrazovky je rovno 320×200 pixelům. Barva pozadí znaku zůstává neměnná, barvu popředí je možné měnit atributem uloženým v atributové paměti. Bitová mapa s definicemi znaků je uložena v operační paměti počítače, je tedy možné ji programově změnit. Originální mapa se znaky ASCII o celkové velikosti 2 KB (256×8 byte) je uložena v paměti ROM.
  • Multi-color textový režim: v tomto režimu se opět zobrazuje 40 znaků na 25 řádcích, každý znak je ovšem vytvořen v rastru 4×8 pixelů. To znamená, že celkové rozlišení obrazovky je pouze 160×200 pixelů (snižuje se horizontální rozlišení). Tento režim ovšem nabízí možnost zobrazení čtyřbarevných znaků, protože každý pixel znaku je reprezentován dvěma bity. Celková velikost paměti pro znakový generátor zůstává stejná – 2 kB.
  • Rozšířený textový režim: tento režim vychází ze standardního textového režimu, tj. zobrazují se znaky o rozměrech 8×8 pixelů ve 25 řádcích po čtyřiceti znacích na řádek. Rozšíření spočívá v tom, že pro každý znak je možné zvolit jednu ze čtyř barev pozadí (výběr barvy popředí se stále provádí čtením z atributové paměti). Barva pozadí je uložena přímo v kódu znaků pomocí dvou bitů – to znamená, že se sníží počet zobrazitelných znaků z 28=256 na 26=64. Pro některé účely je tento počet znaků dostačující, protože písmen v abecedě je 26 a při použití malých i velkých písmen s číslicemi, mezerou a tečkou stačí využít pouze 2×26+10+2=64 znaků. Tento režim lze uplatnit i ve hrách, kde je například pozadí složeno právě z 64 různých (programátorem definovaných) znaků. Oproti grafickým režimům se při změně scény přenáší mnohem menší množství údajů.
  • Grafický režim Hi-res: v tomto režimu se zobrazuje grafika v rastru 320×200 pixelů, přičemž na každý pixel je rezervován pouze jeden bit. Pro blok 8×8 pixelů je možné zvolit společnou barvu, která je přečtena z atributové paměti. Uložení pixelů v obrazové paměti je nestandardní, protože se dodržuje návaznost na textový režim – pixely jsou ukládány v blocích 8×8. Spotřeba paměti je následující:
    obrazová paměť: 320×200 = 64000 pixelů, tj. 64000/8 = 8000 bytů
    atributová paměť: 320/8×200/8 = 1­000 bytů.
  • Grafický režim Multi-color: tento režim je při práci s grafikou používaný nejčastěji. Grafika se zobrazuje v rastru 160×200 pixelů, pro každý pixel jsou vyhrazeny dva bity, pixel tedy může být nezávisle na ostatních pixelech v okolí vybarven jednou ze čtyř barev, která se kombinuje s barvou přečtenou z atributové paměti (tato barva je opět platná pro blok 8×8 pixelů). Jedná se tedy o kombinaci klasického barevného režimu známého z počítačů Atari s režimem výběru barev z atributové paměti (použito na ZX Spectru).

4. Sprity na VIC II

Grafický čip VIC II podporuje, podobně jako obvod GTIA u osmibitových Atari, práci se sprity. Spritů může být současně zobrazeno osm, každý sprite má velikost 24×21 pixelů v monochromatickém režimu nebo 12×21 pixelů v multi-color režimu. Pomocí vhodně naprogramované přerušovací rutiny je však možné zobrazit i více spritů – využívá se změna vertikální polohy některého z již vykreslených spritů.

Bitmapa se spritem má velikost 63 bitů, nezávisle na jejich rozlišení. V monochromatickém režimu (Hi-res) je pro každý pixel ve spritu vyhrazen jeden bit, v multi-color režimu jsou to bity dva. Sprity spolu sdílí dvě barvy z palety, třetí barva je pro každý sprite individuální. Čtvrtá barva odpovídá pozadí, tj. textu či grafice zobrazené pod spritem.

Ze čtyřiceti sedmi řídicích osmibitových registrů čipu VIC II je jich plných 34 určeno pro ovládání spritů. U spritů je možné nastavovat jejich horizontální i vertikální polohu, barvu, velikost (zvětšení ve směru horizontální a/nebo vertikální osy), grafický režim (hi-res, multi-color) a kolize typu sprite-sprite a sprite-bitmapa. Také je možné měnit prioritu spritů vůči pozadí, vzájemná priorita spritů je však neměnná a je určena číslem spritu (zde má Atarácké GTIA širší možnosti nastavení).

5. Další vlastnosti čipu VIC II

Ke grafickému čipu VIC II bylo možné připojit světelné pero. Při stisku tlačítka na světelném peru se zaznamenala x-ová a y-ová souřadnice pera, obě souřadnice se však ukládaly pouze do osmi bitů, to znamená, že x-ová souřadnice měla poloviční přesnost, než jaké bylo rozlišení obrazovky.

Pomocí podprogramů prováděných při přerušení zavolaném v průběhu zpětného horizontálního a vertikálního běhu elektronového paprsku obrazovky bylo možné vytvářet různé grafické efekty, například zobrazení více spritů. Pravděpodobně nejzajímavějším efektem byl takzvaný FLI – Flexible Line Interpretation, kdy se čtení barvových atributů provádělo na každém obrazovém řádku, čímž bylo možné měnit barvu nikoli v blocích 8×8 resp. 4×8 pixelů, ale v bloku 8×1 resp. 4×1 pixelů. Zvýšilo se tak barevné rozlišení rastrové grafiky.

6. Grafika na počítači ZX81

Známý osmibitový počítač ZX81 firmy Sinclair neposkytoval programátorům možnost výběru plnohodnotného grafického režimu, protože měl k dispozici pouze 1 KB operační paměti RAM, ve které musela být umístěna jak video paměť, tak i oblast paměti pro přeložený program Basicu. Z tohoto důvodu byl oficiálně podporován pouze textový režim s velikostí textového okna 24 řádků po 32 znacích, kde každý znak byl definován v rastru 8×8 pixelů.

Ve znakové sadě, konkrétně ve znakových kódech, které se nacházely mimo standardní část ASCII, byly vytvořeny různé pseudografické znaky, pomocí nichž bylo možné složit rastrové pseudoobrázky o rozlišení 64×48, přičemž každý čtverec tohoto rastru měl na obrazovce velikost 4×4 pixely. Tato grafika byla pouze černobílá bez možnosti nezávislého nastavování barev.

O generování grafického signálu pro televizní přijímač se staral čip ULA (Uncommitted Logic Array), což je ve své podstatě předchůdce dnešních čipů FPGA. Pomocí vhodně naprogramované reakce na přerušení a s pečlivým načasováním strojových instrukcí bylo možné obejít pseudografiku standardně poskytovanou tímto obvodem a s určitým omezením vytvářet rastrový černobílý obraz o rozlišení 256×192 pixelů (což rozlišením odpovídá výše zmíněnému textovému režimu).

Vzhledem k tomu, že se takto vytvářený obraz nemohl do operační paměti počítače přímo uložit (256×192/8 = 6144 bytů), musel se celý obraz dynamicky generovat programově. Možnost uložení statického obrázku bylo možné využít až při zvýšení operační paměti na 16 KB pomocí přídavného paměťového obvodu (známého „batohu“).

Počítač ZX81

7. Generování grafiky na ZX Spectru

Slavné ZX Spectrum snad není zapotřebí čtenářům Roota blíže představovat. V Evropě se jednalo o nejrozšířenější domácí osmibitový počítač se silnou programátorskou podporou. Tento počítač, který byl po hardwarové stránce velmi jednoduchý, bylo také velmi snadné „klonovat“, existuje několik desítek klonů vyráběných v různých zemích (u nás, resp. dnes v SR, se jednalo například o typovou řadu Didaktik Gama a Didaktik M).

Počítač ZX Spectrum

ZX Spectrum poskytovalo při práci s televizní obrazovkou možnost použití grafického režimu o rozlišení 256×192 pixelů, což při zobrazení textu s velikostí znaků v bloku 8×8 pixelů odpovídá textovému oknu 24 řádků po 32 znacích. Každý pixel byl reprezentován pomocí jednoho bitu, celková velikost bitmapy je tedy rovna 256×192/8 = 6144 bytům. Bitmapa byla uložena přímo v operační paměti počítače, jak je tomu ostatně u prakticky všech osmibitových počítačů.

Pixely byly v bitmapě postupně uloženy po jednotlivých řádcích, tyto řádky však nebyly uloženy v jednoduché posloupnosti, ale po osmiřádkových pruzích patrných zejména při nahrávání obrázků z magnetofonu (tento princip byl později použit i u grafického formátu GIF pro volitelné prokládání). Programátorům však samozřejmě tato organizace obrazové paměti komplikovala práci.

Kromě specifikace monochromatické bitmapy bylo možné pro blok o velikosti 8×8 pixelů vybrat dvojici barev popředí a pozadí, takzvaných atributů. Každý atribut byl uložen na jednom byte. Rozmístění atributů odpovídalo textovému oknu, tj. jednalo se o rastr 32×24 atributů (256/8 = 32, 192/8 = 24). Velikost atributové paměti je rovna 32×24 = 768 bytům, pro celý rastrový obraz (bitmapu i atributy) je tedy zapotřebí vyhradit celkem 6144+768 = 69­12 bytů.

Pro statické obrazy je kombinace bitové mapy společně s atributy výhodná, protože celý obraz je uložen na výše uvedených necelých 7 KB, přičemž je možné s omezením používat všech osm dostupných barev. Grafici samozřejmě toto omezení respektovali, a proto mnohdy velmi nápaditě tvořili celou kompozici obrazu tak, aby se objekty různé barvy střetávaly právě na hranici atributů. Pro dynamicky se měnící obrazy (hry, animace apod.) se však ukazuje značné omezení atributů, zejména nemožnost překrývání dvou objektů o různých barvách na pozadí o jiné barvě – v každém bloku o velikosti 8×8 pixelů mohly být zobrazeny pouze dvě barvy.

Bylo sice vymyšleno větší množství postupů pro výpočet barev pixelů překrývajících se objektů, ale vizuální chyby se prakticky nikdy nepodařilo zcela odstranit, proto je pro Spectrum a jeho následovníky typická grafika, ve které se vyskytují rušivé barevné „čtverečky“. Navíc se každý pohybující se objekt musel programově vypočítat a korektně zapsat do bitmapy (přepsat pozadí), protože Spectrum, resp. jeho čip ULA, nepodporovalo sprity.

Podobně jako u dalších osmibitových počítačů bylo i zde možné vhodným naprogramováním přerušovacích rutin a přesným časováním strojových instrukcí dosáhnout různých vizuálních efektů. Pokud se například rychle, tj. ideálně v každém půlsnímku, měnila barva některých pixelů, bylo možné simulovat větší počet barev, například hnědou, která nebyla ve standardní paletě dostupná.

root_podpora

Pokračování legendy - počítač ZX Spectrum 128K

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

V dalším pokračování tohoto seriálu si popíšeme grafické možnosti méně rozšířených osmibitových počítačů (včetně československých výrobků) a herních konzolí. Ihned poté se již budeme zabývat výkonnějšími šestnácti- a třicetidvoubitovými počítači, jejichž grafické schopnosti jsou nesrovnatelně větší, než tomu je u jejich osmibitových předchůdců.

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.