G8C

Radek Štěrba, Raster/C.P.U., 2003

G8C je pomocný Turbobasicový nástroj na vytváření obrázků v rozlišení 320x160 při až 128 barvách.

Jak je Vám jistě známo, nejjemnější grafický mód na 8bitovém Atari je grafika 8, která při rozlišení 320x192 nabízí pouze 2 odstíny jedné barvy. Použitím klasických technik (DLI) lze tuto barvu shora dolů měnit, přičemž v jednom grafickém řádku budou opět vždy jen 2 odstíny této barvy.

Program G8C rozšiřuje výše popsanou techniku o podkládání grafiky PMG objekty, čímž lze dosáhnout značně vyšší barevnosti - samozřejmě s omezením daným počtem a velikostí Atari PMG objektů.

Hned na začátku musím upozornit, že G320C pouze pomáhá zjednodušit provádění změn v jednotlivých řádcích a nic sám nepropočítává - veškerá plánování kde a jak barvy měnit a jak rozmístit PMG objekty je tedy ponecháno zcela na uživateli. Vytvářet pomocí G8C multibarevné obrázky je tím pádem velmi náročná a zdlouhavá práce, ale pokud se zadaří, výsledky jsou překvapivé.


Způsob ovládání:

Po prvním spuštění programu, případně při volbě "Reset all parameters", se program zeptá, zda má provést promazání paměti:

DLI source memory - to je paměť obsahující zdrojový text, na jehož základě se generuje DLI strojová rutina.

PMG memory - to je paměť pro PMG objekty.

DLI lines - počet obrazových řádků. Standardně ponechejte rovno 160.


Nyní se zobrazil grafický mód 8 (PICTURE) s blikajícím kurzorem (tečka) a vy máte tyto možnosti:

ESC - přechod do levého horního rohu.

JOYSTICK nebo kurzorové klávesy - pohyb kurzoru příslušným směrem.
Poznámka: Během pohybu kurzoru se v dolní části textového řádku vypisuje aktuální obsah příslušného řádku s DLI zdrojovým kódem (pokud již nějaký obsahuje). Toto slouží k přehledu změn, které se v tomto řádku provádějí.

FIRE tlačítko nebo Return - zapsání bodu předvolenou barvou.

Backspace - smazání bodu na pozici kurzoru.

0 - předvolena barva 0 (pozadí).

1 - předvolena barva 1 (plná barva).

J - rychlost posuvu joysticku.

Mezera - smazání dolního textového řádku.

Control+F - vybarvení uzavřené oblasti.

R - restart programu s opětovným nastavením všech parametrů.

Shift+Clear - smazání grafické obrazovky.

Control+S - ukládání dat.
Volba P: ukládání grafických dat obrazu i všech PMG objektů spolu se zdrojovým textem pro DLI.
Volba D: export DLI strojové rutiny.

Control+L - načtení grafických dat obrazu i všech PMG objektů a zdrojového textu pro DLI.

I - vypíše aktuální souřadnice kurzoru.

B - přesun kurzoru na hranici videopaměťového byte.

M - zobrazení plných PMG objektů / normální PMG zobrazení.

P - přepínání módu PICTURE / PMG.

Shift+kurzorové klávesy - vykreslení čáry z pozice kurzoru příslušným směrem až po první plný grafický bod.

U - editace zdrojového DLI kódu pro aktuální řádek. Syntaxe je popsána dále v samostatném oddíle. Ukončení editace se provádí klávesou Return, čímž se vždy současně provede překlad zdrojového DLI kódu na skutečnou DLI strojovou rutinu a její aktivace.
Zrušení či změna údajů v příslušném řádku se provádí jejich odmazáním či přepsáním na zdrojovém řádku a následným Returnem. (Poznámka: Return je možno odklepnout kdekoliv a platný je obsah celého řádku -není nutné přejíždět na konec řádku. Pro překlad a aktivaci DLI rutiny tedy stačí vždy jen na libovolném řádku stlačit "U" a Return.)

X - vypnutí DLI rutiny a odklizení PMG objektů mimo obraz. (Nezasahuje však nijak do zdrojového DLI kódu. Poznámka: "U" a "Return" provede opětovnou aktivaci.)

E - ukončení programu.


V módu PMG (přepínání módů PICTURE/PMG se provádí klávesou P) máte tyto možnosti:

JOYSTICK - pohyb kurzoru daným směrem v rámci aktivně zvoleného PMG objektu.

FIRE tlačítko - zapsání bodu předvolenou barvou.

1,2,3,4,5 - volba PMG objektu. (Objekt 1 až 4 jsou PMG hráči, objekt 5 jsou všechny PMG střely.)

9 - předvolba barvy 1 (plná barva).

0 - předvolba barvy 0 (prázdná barva).

Backspace - smazání bodu na pozici kurzoru.

I - informace o aktuální pozici kurzoru.

P - přepínání módu PMG/PICTURE.

X - přepnutí do zobrazení pouze PMG objektů (bez grafických dat obrazu) / návrat do normálního zobrazení PMG i grafických dat.


Syntaxe zdrojového DLI kódu:

Po stisku klávesy U se dostanete do módu pro zadávání zdrojového DLI kódu. Vlevo na začátku řádku se vypíše pomocný údaj ve tvaru
$XX#YYY?
kde
$XX - x-ová souřadnice aktuální pozice kurzoru v HEXa soustavě, přepočtená pro PMG objekty (tj. nejlevější sloupec má hodnotu $30 a za každé 2 grafické obrazové body se zvyšuje o 1).
#YYY - číslo řádku (decimálně)

Na řádek můžeme připisovat či upravovat již dříve zapsané povely v této syntaxi:

$NN
Číslo v HEXa soustavě. Nutno psát vždy 3 znaky (tj. například nulu jako $00). Poznámka: Číslo se udává jako první a bude použito pro všechny následující povely.

PX1 .. PX4
(Player X-pos)
Nastavení x-ové pozice PMG hráče 1 až 4.

MX1 .. MX4
(Missile X-pos)
Nastavení x-ové pozice PMG střely 1 až 4.

PS1 .. PS4
(Player Size)
Nastavení šířky PMG hráče 1 až 4. ($00 normální šířka, $01 dvojnásobná, $03 čtyřnásobná)

PS5
(Player Size)
Všechny čtyři střely mají jeden společný registr pro nastavování šířky (jakoby hráč 5). PS5 tedy nastavuje šířku všech PMG střel, kde každé 2 bity definují šířku pro PMG střelu 1 až 4.

PC1 .. PC4
(Player Color)
Nastavení barvy PMG hráče 1 až 4. Standardně mají jednotlivé PMG střely stejné barvy jako jim příslušející PMG hráči.

CL0 .. CL4
(Color)
Nastavení barvového registru COLPF0 až COLPF4. Pro grafický mód 8 mají význam tyto registry:
CL1 - jas plných bodů (v barvě pozadí)
CL2 - barva/jas pozadí
CL4 - barva/jas okolí (rámeček)

PRI
(Priority)
Nastavení prioritního registru PRIOR. Stanovuje, které grafické prvky budou při překrytí v popředí (dolní 4 bity, tj. $00 až $0F). Dále též umožňuje přepnout 4 střely do režimu, kdy nemají barvy dle jim odpovídajících PMG hráčů, ale mají všechny společně jednu barvu, definovanou registrem CL3 (COLPF3) - toto se provede nastavením bitu $10. Další možností je bit $20, který způsobí zobrazení další barvy v místě, kde se překrývají hráči 1 a 2 nebo 3 a 4 (tato barva vznikne logickou funkcí OR mezi obsahy barvových registrů příslušných hráčů).


Příklad 1:
Chceme-li na řádku nastavit x-pozici PMG hráče 2 na hodnotu $80 a jeho barvu na $6A, zapíšeme do řádku toto:
$80 PX2 $6A PC2

Příklad 2:
Chceme-li nastavit barvu všech PMG hráčů na hodnotu $74, zapíšeme toto:
$74 PC1 PC2 PC3 PC4

Příklad 3:
Chceme-li změnit barvu pozadí na $08, zapíšeme toto:
$08 CL2

Poznámka: Jednotlivé 3-znakové povely můžeme pro přehlednost oddělovat mezerou, ale není to povinné.


Technické údaje:

Výsledkem překladu zdrojového DLI kódu je strojová DLI rutina obsahující kombinace instrukcí LDA#hodnota, STA registr a STA WSYNC, která se vyvolá DLI přerušením nahoře na prvním řádku grafiky (respektive ještě o řádek nad ním, aby se změny projevily již v nejhornějším řádku). Celá rutina pak probíhá najednou s využitím synchronizačních zápisů do WSYNC a ukončuje se teprve na posledním spodním řádku. To má za následek, že procesor je po celou dobu vykreslování obrazu blokován a nemůže zpracovávat žádné jiné úlohy. Z tohoto důvodu je výsledná DLI rutina použitelná spíše jen pro statické multibarevné obrázky bez dalších efektů.

Uložená data obsahují obrazová videodata grafiky (40*160=6400bytů), za nimi jsou PMG data (data všech PMG střel a data jednotlivých PMG hráčů, tj. 256+4*256=1280bytů) a nakonec zdrojový DLI kód (160 textových řádků po 32 znacích, tj. 160*32=5120bytů). Celkově tedy vždy všech 6400+1280+5120=12800bytů.

Délka exportované DLI rutiny je závislá na počtu požadovaných změn, ale kromě nich obsahuje pro synchronizaci vždy 160x instrukci STA WSYNC.

Poznámka: Pokud nemá být používána celá obrazovka, je možné zadat v úvodu jiný údaj pro "DLI lines". Pak se odpovídajícím způsobem sníží i celková délka vytvářené a exportované DLI rutiny.


Poznámka na závěr:
Chápu, pokud se Vám zdá práce s tímto programem poměrně obtížná a nepohodlná. Ovšem vězte, že žádný jiný způsob jak snadněji vytvářet multibarevné obrázky v nejjemnějším Atárkovém grafickém módu, jsem nenašel. A oproti mnou dříve používanému způsobu s odděleným kreslením obrazových dat a PMG dat, a psaním DLI rutiny samostatně přímo v Assembleru, je to přeci jen značný pokrok. :-)