Malíř, co nikdy nespí

Už jste o něm patrně slyšeli. GTIA je čip, jenž u strojů Atari XL/XE (mimo jiné) obstarává zobrazování PMG objektů a tří speciálních grafických režimů, a spolu s procesorem Antic je tedy zodpovědný za generování obrazu. Jeho tvůrcem je George McLeod a po něm je také pojmenován (George's Television Interface Adapter).

Osmibitové počítače Atari, jejichž prvním představitelem byl model 400, byly prapůvodně vyvíjeny jako herní konzole, nástupce legendární mašinky VCS (později Atari 2600). Ta, jako jedna z vůbec prvních na trhu, měla ve výbavě jednoduché HW sprity, a tuto koncepci její uvažovaný nástupce pochopitelně též dostal do výbavy.

Podobnost Atárek XL/XE s konzolí VCS je přitom z tohoto pohledu podstatně větší než by se na první pohled mohlo zdát. Asi každý osmibiťák ví, že "péemgéček" je celkem osm: čtyři hráči a k nim čtyři střely. Tyto mají v paměti vyhrazené určité místo, kam se nasypou příslušná data, zadá se pár POKE příkazů a šup, přes běžný text nebo grafiku se zobrazí požadovaný objekt.

Při této metodě vykreslování PMG grafiky si GTIA sahá na sběrnici v tzv. DMA režimu pro potřebná data, která tam musí připravit kolega Antic, což pochopitelně stojí určitý čas, kterého pak zbývá méně pro práci procesoru 6502. To je však pouze jeden možný přístup, jak s HW sprity na osmibitovém Atari zacházet.

Stejně jako u konzole VCS, která žádnou obrazovou paměť nemá, je možno GTIA natvrdo přikázat, co má v daný okamžik zobrazit. K tomu slouží registry GRAFP0, GRAFP1, GRAFP2, GRAFP3 a GRAFM na adresách $D00D až $D011 (53261 až 53265 decimálně). GTIA pak již nemusí při kreslení PMG objektů používat DMA a ani žádnou RAM pro úschovu grafických dat.

Přesvědčete se sami. Například v BASICu vám k tomu postačí pouhé dva příkazy:

POKE 53248,128
POKE 53261,255

Prvním "poukem" nastavíte horizontální pozici PMG hráče 0 cca doprostřed obrazovky a tím druhým sdělíte Atárku, že chcete kreslit osm pixelů vedle sebe. No a protože tuto hodnotu již dál neměníme, GTIA na každém mikrořádku otrocky zobrazí znovu to samé. Výsledkem je svislý pruh, jehož barvu lze měnit zápisem na adresu 704.

Pravdou nicméně je, že tato metoda se v praxi příliš nepoužívá. A když už, tak především pro statické objekty. Pro dynamičtější aplikace je totiž pro kreslení obrazu třeba kód s velmi precizním časováním. Což je přesně to, co dělá každá hra na Atari 2600, kde si programátor vše kolem obrazu musí pohlídat sám. Proto je také kódování čehokoliv pro tento systém skutečný hardcore.

Přiznám se, že já sám jsem reálně nikdy k ničemu užitečnému PMG přes přímé adresování GTIA nepoužil, ačkoliv mne to vždy - kdo ví proč - dosti lákalo. Šance se konečně naskytla až při tvorbě hry Tajemný amulet, kterou jsem exkluzivně pro toto číslo Flopu začal s boží pomocí páchat na podzim minulého roku.

Tajemný amulet je česká textovka, což se logicky neobejde bez češtiny, a to včetně háčků, čárek a kroužků. A nacpat znaky s diakritikou do matrice 8x8 bodů, to už je poměrně fuška. Respektive spousta písmen je natolik vysoká, že se pak dotýká znaků nad nimi, což vůbec neprospívá čitelnosti a přehlednosti textu.

Proto jsem se rozhodl mezi řádky Anticu 2 (BASIC grafika 0) vložit jeden "mrtvý" mikrořádek (Antic mód $00). Plus vše ještě vylepšit barevným rozlišením okna, kam se zadávají příkazy, od okna, kam se vypisují reakce na hráčovy aktivity. A aby to hezky vypadalo, chtěl jsem mít obě tato okna hezky obdélníková, ohraničená černým pozadím.

Problém je, že tzv. mrtvé řádky mají barvu definovanou jiným registrem než je pozadí textu, takže černé pozadí oken bylo nutno vykouzlit jinak. Horní a dolní strany oken nejsou problém, na to stačí přerušení a změna jednoho barvového registru. Na bocích se ale pozadí musí maskovat pomocí PMG objektů, a to byla přesně ta příležitost, na kterou jsem čekal.

Pomocí prostého nastavení horizontálních pozic dvou hráčů, jejich černé barvy, čtyřnásobné velikosti a plné šířky osm pixelů jsem si při nulové spotřebě paměti a žádného strojového času krásně vymaskoval levou a pravou stranu obou oken. Paráda! Dočkal jsem se! Po tolika letech jsem do nějaké své produkce dokázal zabudovat péemgéčka v ne-DMA režimu, i když to bylo pravděpodobně poprvé a také naposled. :)

Buď jak buď. Je myslím velmi zajímavé, že osmibitové Atari může s HW sprity zacházet i tímto low-level způsobem zděděným po předcích, což mne přivádí k finálnímu postřehu tohoto krátkého pojednání. Jelikož GTIA nelze, narozdíl od svého souputníka procesoru Antic, nijak softwarově vypnout, je třeba si uvědomit jednu zásadní věc: vaše Atárko zobrazuje HW sprity neustále, aniž byste to věděli, a to ihned od svého zapnutí. Jenom nejsou vidět.

Je to dáno tím, že GTIA po bootu defaultně jede v ne-DMA módu a všechny registry horizontálních poloh všech PMG objektů má nastavené na hodnotu 0, stejně jako již zmiňované registry GRAP. To jinými slovy znamená, že kdesi úplně vlevo, zcela mimo obraz, GTIA pořád dokola poctivě maluje své čtyři hráče a čtyři střely.

Všechna tato péemgéčka jsou sice složena jenom ze samých nul, ale to GTIA neví. A dokud Atari nevypnete nebo si nepustíte nějaký SW, který nahodí DMA a vynutí si zobrazování PMG jiným způsobem, GTIA si bude bez fanfár a ohňostrojů dál bez reptání dělat to svoje. Tak jak to George před pětatřiceti lety svoje děťátko naučil.

A proto je to čip-malíř, který nikdy nespí.