Hlavní navigace

Grafické čipy v osmibitových počítačích Atari

9. 7. 2009
Doba čtení: 13 minut

Sdílet

V dnešní části seriálu o architekturách počítačů budou popsány grafické schopnosti slavných osmibitových domácích počítačů vyráběných firmou Atari. Tyto počítače byly mj. vybaveny i dvojicí čipů ANTIC a GTIA (popř. CTIA), které se staraly jak o generování video signálu, tak i o práci s takzvanými sprity.

Obsah

1. Grafické čipy v osmibitových počítačích Atari
2. Čip ANTIC – Alpha-Numeric Television Interface Circuit
3. ANTIC a display-list
4. Grafické režimy podporované čipem ANTIC
5. Přístup ANTICu do operační paměti
6. Časování při generování obrazu
7. Čip GTIA – George's Television Interface Adapter
8. Vykreslování spritů a detekce kolizí
9. Odkazy na Internetu

1. Grafické možnosti osmibitových počítačů Atari

Osmibitové domácí mikropočítače vyráběné firmou Atari měly architekturu poněkud odlišnou od předminule a minule popsaného ZX Spectra a samozřejmě zcela odlišnou od minimalistického ZX80 či ZX81. Pro generování obrazu se v těchto počítačích používala dvojice relativně komplikovaných číslicových obvodů nazvaných ANTIC a GTIA, které byly vytvořeny speciálně pro potřeby firmy Atari (dnes jsou na internetu dostupné interní dokumenty se strukturou obou obvodů rozkreslenou až na úroveň jednotlivých hradel). Každý z těchto obvodů byl umístěn ve standardním pouzdře DIL se čtyřiceti vývody, podobně jako již popsaný zvukový čip POKEY i samotný osmibitový mikroprocesor MOS 6502 verze B či C (většina počítačů Atari, kromě původní řady 400/800, používala verzi C, protože ta měla vyvedený pin HALT používaný při kooperaci mikroprocesoru a ostatních čipů při generování video signálu).

pc6901

Obrázek 1: Standardní textový režim osmibitových počítačů Atari, ve kterém se na jednom textovém řádku zobrazovalo 40 znaků a počet textových řádků dosahoval hodnoty 24. Technicky se jednalo o monochromatický režim, protože barva pozadí a popředí měla vždy stejný odstín (standardně bleděmodrý), lišila se pouze úroveň (intenzita) barev. Každý znak byl zobrazen v rastru 8×8 pixelů, znaky byly programově měnitelné (jejich bitové mapy mohly být umístěny do paměti RAM). Pro textový kurzor, zde zobrazený pod slovem READY, existovala přímá podpora v čipu ANTIC.

Funkce obvodů ANTIC a GTIA se vzájemně doplňovala. První z těchto obvodů sloužil především pro generování obrazu v textovém či grafickém režimu (v terminologii firmy Atari se pro tento obraz vžil termín playfield) a taktéž pro jemný horizontální a vertikální posun obrazu. Funkce druhého obvodu spočívala v aplikaci barev (jednalo se o převod bitových vzorků posílaných čipem ANTIC na barvy na základě vybrané barvové palety) a taktéž k zobrazení spritů i detekci kolizí mezi jednotlivými sprity popř. mezi spritem a pozadím vykreslované scény. Hardwarová podpora spritů byla v době osmibitových počítačů velmi důležitá, neboť umožnila (především ve hrách) zobrazení pohybujících se objektů a detekci kolizí těchto objektů se svým okolím bez nutnosti programové implementace této funkcionality, která by zbytečně zatěžovala mikroprocesor – podporu pro sprity ostatně mají i mnohé další osmibitové počítače, zejména známý Commodore C64, jehož grafické schopnosti budou popsány příště.

pc6902

Obrázek 2: Poměrně jednoduchým způsobem je možné standardní textový režim upravit tak, aby byl každý řádek zobrazený odlišnou barvou – postačilo na začátku každého řádku (při návratu elektronového paprsku, kdy není prováděno vykreslování) změnit hodnotu jednoho barvového registru. Tento trik se na osmibitových počítačích Atari používal v mnoha podobách, asi nejznámější je logo firmy Atari vyvedené ve všech 128 dostupných barvových odstínech.

2. Čip ANTIC – Alpha-Numeric Television Interface Circuit

Pravděpodobně nejzajímavější je na osmibitových počítačích Atari právě začlenění čipu ANTIC (Alpha-Numeric Television Interface Circuit) do celého počítačového systému – tento obvod byl totiž ve skutečnosti relativně samostatně pracujícím grafickým procesorem (GPU – i když dnes dostalo toto označení poněkud odlišný význam), jelikož ho bylo možné řídit vlastní sadou instrukcí a taktéž dokázal obsluhovat přístup do operační paměti bez zásahu mikroprocesoru. Instrukce pro ANTIC byly uložené v operační paměti, stejně jako vlastní obrazová paměť (framebuffer). Umístění obou datových bloků se mohlo měnit, což znamená, že se každý programátor mohl sám rozhodnout, jak má vypadat organizace paměti počítače (na mnoha jiných osmibitových i šestnáctibitových počítačích byl paměťový rozsah obrazové paměti neměnný, což v některých případech znamenalo určité omezení, například při vertikálním posunu obrazu).

pc6903

Obrázek 3: Monochromatický grafický režim známý pod označením GRAPHICS 8 podle příkazu, kterým se v Basicu nastavoval. V tomto režimu bylo možné na jednom obrazovém řádku zobrazit 320 pixelů, u nichž se, podobně jako ve standardním textovém režimu, rozlišovala pouze intenzita barvy – barevný odstín byl pro pozadí i popředí totožný. Ve spodní části obrazovky se nachází čtyři volitelné textové řádky, ve kterých jsou vypsány příkazy pro zobrazení úsečky.

3. ANTIC a display-list

Na všech osmibitových počítačích Atari se výsledný obraz skládal ze dvou částí. První část (kterou dnes známe pod pojmem framebuffer) se nazývala pozadí, neboli hrací pole (playfield), druhá část byla složena z osmi spritů. Hlavní úloha čipu ANTIC spočívala ve vytváření pozadí na základě „programu“ nazývaného display-list, pomocí něhož bylo možné pro každý vykreslovaný obrazový řádek (scanline) nastavit jeden ze čtrnácti textových či grafických režimů, které se navzájem lišily svým rozlišením (velikostí pixelů v horizontálním i vertikálním směru), počtem současně zobrazitelných barev a samozřejmě též velikostí alokované obrazové paměti – čím menší byly rozměry pixelů na řádku a čím větší počet barev bylo možné na jednom řádku zobrazit, tím větší část operační paměti bylo nutné pro každý obrazový řádek naalokovat (standardně se počet bajtů na jeden obrazový řádek pohyboval v rozmezí 10 až 40). Některé podporované režimy byly znakové (na řádku byly umístěny znaky různé velikosti), další režimy byly bitmapové.

pc6904

Obrázek 4: Tok dat mezi operační pamětí, mikroprocesorem a čipy ANTIC i GTIA při generování video signálu.

V instrukčním souboru čipu ANTIC se nacházely také příznakové bity, pomocí kterých bylo pro každý řádek možné povolit přerušení DLI (Display-List Interrupt), které bylo automaticky vyvoláváno při horizontálním zpětném běhu elektronového paprsku na televizní obrazovce. Taktéž bylo možné pro každý obrazový řádek povolit jemný posuv o maximálně osm pixelů doleva či doprava, čímž bylo umožněno pouze s využitím několika instrukcí mikroprocesoru realizovat jednoduchý posun obrazovky (scrolling) nebo pouze posun její části. Typickým příkladem hry, která jemný scrolling ve velké míře používala, je Boulder Dash. Tato hra je zajímavá také tím, že se pro zobrazování herní scény používal speciální textový režim s polovičním horizontálním rozlišením a možností v jednom znaku rozlišit pět barev (tento textový režim byl mezi tvůrci her poměrně oblíbený, další hrou, která ho používala, je například Blue Max). Přednost použití textového režimu oproti režimu bitmapovému spočívá ve snadném a rychlém vykreslení celé scény – posun hráče, kamenu nebo drahokamu je proveden změnou jednoho či dvou bajtů namísto nutnosti vykreslení celé bitmapy.

pc6905

Obrázek 5: Hra Boulder Dash ve své verzi pro osmibitové počítače Atari do značné míry využívala možností poskytovaných čipem ANTIC i jeho display-listu.

4. Grafické režimy podporované čipem ANTIC

V následující tabulce jsou pro ilustraci některých možností čipu ANTIC uvedeny vybrané základní režimy, které je možné nastavit pro každý obrazový řádek zvlášť. V prvním sloupci je číslo (kód) instrukce pro čip ANTIC, ve sloupci druhém pak číslo, které se předává příkazu GRAPHICSBasicu při nastavování textového či grafického režimu. Povšimněte si, že textový režim číslo 3 není přímo z Basicu přístupný. Jedná se o režim s vyššími znaky, který lze s výhodou využít například v textových editorech používajících font s „nabodeníčky“. Pokud je tedy požadováno, aby se zobrazil textový režim s 40 znaky na řádek a 24 textovými řádky, musí display-list řídicí čip ANTIC obsahovat mj. i 24 instrukcí s kódem 2. Ve skutečnosti je však display-list poněkud složitější, protože obsahuje i instrukci pro vykreslení horního jednobarevného okraje, instrukci pro nastavení začátku obrazové paměti (adresu prvního znaku na obrazovce) a na samotném konci display-listu taktéž instrukci pro skok na jeho začátek.

pc6906

Obrázek 6: Grafický režim číslo 15, jehož horizontální rozlišení je 160 pixelů. Každému pixelu je možné přiřadit jednu ze čtyř barev, barevná paleta je volitelná (ony čtyři barvy jsou tedy na sobě nezávislé). V dolní části obrazovky se opět nachází čtyřřádkové textové okno, ve kterém je napsaný program, pomocí nějž se obrazec vykreslil (po všech těch letech programování v moderních programovacích jazycích byl návrat k Atari Basicu velmi osvěžující :-)

Instrukce ANTIC GRAPHICS x Režim Rozlišení Počet barev Poznámka
2 textový 40 znaků na řádek 2 standardní textový režim
3 × textový 40 znaků na řádek 2 textový režim s vyššími znaky
4 12 textový 40 znaků na řádek 5 výška znaku 8 pixelů
5 13 textový 40 znaků na řádek 5 výška znaku 16 pixelů
6 1 textový 20 znaků na řádek 5 výška znaku 8 pixelů
7 2 textový 20 znaků na řádek 5 výška znaku 16 pixelů
8 3 grafický 40 pixelů na řádek 4 neznám žádnou aplikaci, která by tento režim používala
9 4 grafický 80 pixelů na řádek 2
A 5 grafický 80 pixelů na řádek 4
B 6 grafický 160 pixelů na řádek 2 výška pixelu dva obrazové řádky, vertikální rozlišení cca 96 pixelů
C 14 grafický 160 pixelů na řádek 2 výška pixelu jeden obrazový řádek, vertikální rozlišení cca 192 pixelů
D 7 grafický 160 pixelů na řádek 4 výška pixelu dva obrazové řádky, vertikální rozlišení cca 96 pixelů
E 15 grafický 160 pixelů na řádek 4 výška pixelu jeden obrazový řádek, vertikální rozlišení cca 192 pixelů
F 8 grafický 320 pixelů na řádek 2 nejvyšší možné standardní rozlišení
pc6907

Obrázek 7: Kombinace grafických režimů ve hře International Karate.

5. Přístup ANTICu do operační paměti

O přístup k operační paměti se čip ANTIC a GTIA dělil s mikroprocesorem, což vedlo k nutnosti přebírání řízení adresové a datové sběrnice vždy pouze jedním z těchto čipů (podobně tomu ostatně bylo i u minule a předminule popsaného ZX Spectra). Převzetí řízení sběrnice se provádělo pomocí signálu HALT, kterým bylo možné mikroprocesor na blíže neurčenou dobu zastavit. Přenos hodnot jednotlivých pixelů tvořících vykreslovanou bitmapu z operační paměti do čipu ANTIC byl prováděn bez účasti mikroprocesoru pomocí přímého přístupu do paměti – DMA. Přímý přístup do paměti bylo možné vypnout, čímž se výkon celého počítače zvýšil cca o 30 % (mikroprocesor se nemusel dělit o sběrnici), v závislosti na použitém grafickém režimu (při vypnutém DMA zůstal obraz samozřejmě černý, protože ANTIC neměl povolen přístup k obrazovým datům ani ke svému vlastnímu „programu“ – display listu). Z operační paměti se v případě povolení DMA nenačítaly pouze hodnoty jednotlivých pixelů, ale také bitmapy znaků (v textových režimech) či bitmapy tvořící sprity.

pc6908

Obrázek 8: Pomocí změny barvové palety v přesně načasovaných okamžicích je možné simulovat i grafický efekt známý pod jménem „plasma“ bez nutnosti přesunů dat ve framebufferu.

6. Časování při generování obrazu

Pro vykreslování obrazu na televizi či monitoru používaly počítače Atari celkem 262 obrazových řádků, přičemž frekvence mikroprocesoru byla zvolena tak, aby byl každý pixel v nejjemnějším grafickém či textovém režimu (GRAPHICS 0, GRAPHICS 8) vykreslený přesně v jedné čtvrtině cyklu (taktu hodin) a taktéž aby bylo možné provést změnu barvy dvakrát v jednom cyklu, tj. vždy pro dvojici sousedních pixelů. Pokud vezmeme do úvahy frekvenci mikroprocesoru používanou pro počítače pracující v televizní normě NTSC (1,79 MHz), zjistíme, že počet cyklů hodin na jeden obrazový řádek je roven 114 (1,79/59,94/2­62×10 6), ovšem pro samotné vykreslování je použito pouze 88 cyklů. Zbylé cykly může mikroprocesor vhodným způsobem využít, neboť se v jejich průběhu elektronový paprsek vrací na začátek dalšího obrazového řádku; je zda například možné manipulovat s barvovou paletou. 88 cyklů pro každý obrazový řádek znamená možnost změnit na něm barvu celkem 176×, tj. vícebarevné grafické režimy mají horizontální rozlišení 176 pixelů. Toto rozlišení se snižovalo na standardních 160 pixelů, zbylé pixely tvořily okraj obrazovky.

pc6909

Obrázek 9: Textový režim se znaky, jejichž pixely mají dvojnásobnou velikost v horizontálním i vertikálním směru. Podle nejvyšších dvou bitů kódu znaku se rozlišovaly čtyři barvy (pátá barva byla vyhrazena pro pozadí), ovšem znaková sada se zmenšila na 64 znaků.

V monochromatických režimech nebylo možné měnit barvu sousedních pixelů, pouze její intenzitu. Na druhou stranu však bylo možné zdvojnásobit horizontální rozlišení. Z tohoto důvodu například nelze v grafickém režimu 8 (320×192 pixelů) zobrazovat zelené pixely na červeném pozadí, pouze světle zelené pixely na tmavě zeleném pozadí, tmavě modré pixely na světle modrém pozadí atd. V ostatních režimech, kdy je pro každý pixel k dispozici „celý“ barvový cyklus (polovina cyklu strojového), je již možné barvy nastavoval libovolně. Mezi monochromatické režimy patří již zmíněný grafický režim číslo 8 (320×192 pixelů) a taktéž i standardní textový režim s 24 textovými řádky a 40 znaky na řádek. Každý znak je v tomto režimu představován čtvercem o velikosti 8×8 pixelů, tj. výsledné rozlišení je zcela stejné jako u grafického režimu 8.

pc6910

Obrázek 10: Hra Amaroute běžící v monochromatickém režimu s nejvyšším rozlišením 320×192 pixelů. Povšimněte si korektního skrývání vzdálených objektů; pravděpodobně se používá optimalizovaná podoba malířova algoritmu.

Podobným způsobem se původních 262 obrazových řádků snižovalo vlivem vertikálního zatemnění (návratu paprsku do levého horního rohu obrazovky) i začerněných okrajů na 240 řádků, přičemž standardní grafické režimy z těchto 240 řádků využívaly pouze 192 řádků (ovšem zvýšení vertikálního rozlišení bylo snadné díky existenci display listu). Pro počítače určené pro televizní normu PAL platily obdobné vztahy, pouze se nepatrně (o cca 16 kHz) snížila frekvence mikroprocesoru, zvýšilo se vertikální rozlišení a naopak redukoval počet snímků zobrazených na televizní obrazovce za sekundu (NTSC: 59,94 snímků, PAL: 49,86 snímků). Navíc se při výstupu na televize pracující v normě PAL neobjevovaly některé vady v podání barev sousedních pixelů v režimech s 320 pixely na jednom řádku (kvůli podobným vadám, které přímo vychází z normy NTSC si někteří lidé tuto zkratku vysvětlují jako Never The Same Colors :-).

pc6911

Obrázek 11: Další screenshot ze hry Amaroute.

7. Čip GTIA – George's Television Interface Adapter

S výše popsaným obvodem ANTIC úzce spolupracoval číslicový obvod nazvaný GTIA (Graphics Television Interface Adapter nebo též George's Television Interface Adapter, podle jména svého tvůrce), který nahradil původní čip CTIA (Color Television Interface Adapter). Tento čip rozšiřoval grafické režimy počítačů Atari o další trojici – jednalo se o režimy s horizontálním rozlišením sníženým na 80 pixelů, protože každý pixel byl představován čtveřicí bitů (jeden řádek má při použití standardních režimů ve framebufferu velikost 20 nebo 40 bajtů, v rozšířeném hracím poli pak maximálně 48 bajtů). Ve skutečnosti byly všechny tři nové grafické režimy založené na monochromatickém režimu číslo 8, který umožňoval na jednom řádku standardně zobrazit 320 pixelů. Čip GTIA vždy čtveřici sousedních pixelů sloučil a výsledné čtyři bity mu sloužily buď pro výběr barvy z barvové palety (k dispozici bylo devět barev z možných šestnácti – jedná se o celkem zbytečné omezení dané počtem barvových registrů), určení odstínu barvy (úroveň, tj. světlost byla konstantní), popř. k určení úrovně barvy, zatímco odstín byl konstantní (tímto způsobem bylo možné například pracovat s černobílými fotografiemi). Čip GTIA tedy ponechával značnou část práce (časování, provádění display-listu atd., přístup do paměti) na obvodu ANTIC.

pc6912

Obrázek 12: Hra Draconus se mj. vyznačovala využitím ditheringu a hracího pole s odstínem jedné barvy, které hře dodávají zvláštní kouzlo.

8. Vykreslování spritů a detekce kolizí

Čip GTIA kromě zavedení tří nových grafických režimů umožňoval vykreslit čtyři sprity s rozlišením maximálně 8×256 pixelů (popř. 8×128 pixelů) a další čtyři sprity s rozlišením 2×256 pixelů, které bylo možno spojit do jednoho (pátého) většího spritu s rozlišením 8×256 pixelů. Sprity široké 8 pixelů se v literatuře nazývají hráči (players), úzké dvoupixelové sprity střely (missiles). Sprity byly jednobarevné, více barev bylo možno dosáhnout logickými operacemi nad překrývajícími se sprity (počítače Commodore C64 naproti tomu nabízely i sprity v režimu multicolor). Každý sprite mohl pomocí jedné instrukce měnit svoji horizontální velikost i horizontální pozici, přičemž polohy spritů byly navzájem nezávislé. Vertikální pozice spritů se měnila blokovým přesunem bitmapy spritu v operační paměti. Bylo také možné definovat priority vykreslování spritů vůči sobě navzájem i vůči pozadí, tj. zda se má sprite vykreslovat nad herním polem (popř. jiným spritem) či se naopak pod některými barvami skrývat.

pc6913

Obrázek 13: Úvodní obrazovka hry Draconus II.

Kromě toho, že se dala měnit prioria jednotlivých spritů bylo také možné detekovat kolizi spritu s jiným spritem popř. s nějakou barvou hracího pole. Při kolizi (do úvahy se samozřejmě braly pouze viditelné pixely spritu) se nastavil příslušný bit ve stavových registrech, odkud bylo možné kdykoli poté zjistit, zda ke kolizi došlo či nikoli. Díky této funkcionalitě bylo možné velmi snadno otestovat například náraz hráče do stěny, zásah hráče střelou atd. Vzhledem k tomu, že sprity byly pouze jednobarevné, museli se vícebarevní hráči sestavovat z několika spritů. Omezení počtu spritů naproti tomu nebylo kritické, neboť jeden sprite mohl být ve skutečnosti použitý pro zobrazení většího množství objektů ve scéně – jediným omezením bylo, že tyto objekty nesměly ležet na stejném obrazovém řádku.

ict ve školství 24

pc6914

Obrázek 14: Hra Zybex se pojetím grafiky blíží výše zmíněné hře Draconus.

9. Odkazy na Internetu

  1. Radek Štěrba (Raster): Svět osmibitových počítačů Atari
  2. Atari Magazines
  3. Atari Video Graphics And The New GTIA
  4. Alternate Reality – RPG pro osmibitová Atari
  5. http://faqs.cs­.uu.nl/na-dir/atari-8-bit/faq.html
  6. http://www.faq­s.org/faqs/ata­ri-8-bit/faq/pream­ble.html
  7. ftp://rtfm.mit­.edu/pub/faqs/a­tari-8-bit/welcome
  8. http://faqs.cs­.uu.nl/na-dir/atari-8-bit/welcome.html
  9. http://www.faq­s.org/faqs/ata­ri-8-bit/welcome/
  10. Fandal's Stuff

Autor článku

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