Grafické módy na C64
Tento článek jsem kdysi psal pro časopis Splash!, bohuel ale v době, kdy u
tento časopis končil a i přes nějaké náznaky občasného vycházení ádné další
číslo nevyšlo. Dnes, s hlubšími znalostmi grafiky C64, píšu tento článek zcela
znovu, jako památku na výše zmíněný časopis.
Během historie C64 na něm vznikla spousta postupů, jak zobrazit grafiku, kterou
C64 "neumí", některé z těch nejznámějších se zde pokusím popsat.
První nemůe být ádný jiný mód, ne FLI. Tuto zkratku je mono chápat v širších
souvislostech, zde se ovšem budeme zabývat pouze "obrázkem" FLI. Princip
tohoto módu je v podstatě jednoduchý, jeho realizace s monostmi C64 je o něco
sloitější. Jeho základní definice zní: "umoňuje na prostoru 8x8 pixelů
zobrazit všech 16 barev". Všichni, kdo C64 alespoň trochu znají, vědí e
obyčejný grafický mód multicolor-bitmap zobrazí na jednom znaku (8x8) pixelů
4 barvy. Tyto barvy jsou pozadí ($D021), colorram ($D800) a videoram (např.
$0400). FLI vychází z tohoto základního grafického módu a vyuívá prostého přepínání
videoram na kadé raster řádce (adresou $D018), z čeho vyplývá, e na kadé
raster řádce je jiná videoram, co je přesně ten způsob, jak do prostoru jednoho
znaku (8x8 pixelů) dostat 16 barev (někteří extremisté ještě k tomu mění barvu
pozadí, není to ovšem často uívaný způsob). Jakkoli tento postup zní jednoduše,
není triviální ho realizovat. Problém je v tom, e C64 videoram načítá jen kadý
osmý raster řádek, tudí programátor musí tuto osmou řádku (ve skutečnosti je
to první raster řádka textového řádku a říká se jí badscan line či badline)
nechat načíst na kadé raster řádce. Zároveň musí zajistit, e toto přepínání
přijde a poté, co předchozí řádka skončila. A vhodný okamik přichází nejdříve
těsně před skončením levého okraje (raster "jede" zleva doprava).
Při manipulaci s badline se v místě, kde je s ním manipulováno, do video ram
načtou 3 znaky s hodnotou $FF, co je prostě hardwarový fakt, s kterým nikdo
nic nenadělá. Kdy si dva předešlé fakty dáme dohromady, vychází nám, e těsně
vlevo obrazovky je nutné přepnout badline a po jejím přepnutí se načtou 3 neádoucí
znaky $FF. A máme z toho fli-bug oblast, tedy důvod, proč fli grafika nepouívá
první tři znaky. Není tak úplně pravda, e jsou nepouitelné, ale grafika v
nich můe nabývat buď barvu pozadí, nebo světle šedou (případně světle červenou,
tak se zase načte do colorram). Stejně tak není pravda (jak bylo psáno v časopisech
Fun a C64magazin, dej jim pán Bůh věčnou slávu), e při FLI není moné pouívat
sprity. Sprite se svojí šířkou přesně hodí do flibug prostoru. Čtyři tam zobrazíte
docela v pohodě, dá se i pět při plnohodnotném fli obrázku, při více u nastávají
problémy s časováním, zvětšuje se flibug prostor atd. A to zatím pomíjím fakt,
e sprite se při své výšce 21 pixelů musí neustále přesouvat níe, ale tak,
aby "nerozhodil" FLI časování (a u úplně pomíjím fakt, e FLI se
dá zobrazit pouze se stabilizovaným rasterem). Výsledek je takový, e přidání
spritů do fli grafiky není a takový visuální efekt, aby stál za tu práci :-)
. Ale existují dema, kde je tento efekt moné vidět. Mód IFLI je potom pouze
(jak název napovídá) interlace FLI, dva FLI obrázky rychle střídané doplněné
o horizontální scrollování o 1 pixel (adresa $D016). Tímto způsobem dosáhnete
ještě lepšího barevného rozlišení.
Jak bylo ze začátku zmíněno, techniku FLI je moné pouít i v dalších případech.
Např. AFLI je FLI v hiresové grafice, UFLI je FLI vyuívající sprity, další
techniky jsou BFLI, XFLI, HFLI... Takovýchto zkratek bychom našli vícero, jejich
interpretace občas bývá jasná jen samotnému autorovi nebo různí programátoři
mohou různé zkratky chápat jinak.
Další (a mému srdci nejbliší) mód je MLC - multicolor interlace. U z názvu
je patrné, e se jedná o dva prosté multicolor obrázky, střídané stejným způsobem,
jako FLI obrázky v IFLI. Tento mód není omezen v prvních třech znacích, pouití
spritů je také mnohokrát flexibilnější a jeho zobrazování je velmi jednoduché
(stačí prostě někde mimo obrazovku přepínat mezi dvěma obrázky). Tento mód má
také dvě trochu odlišné interpretace. S jednou videoram a s dvěma videoram.
Ten první způsob je pouívanější, ovšem z programátorského hlediska je ten druhý
"výkonější".
Poměrně často uívaný je také SH mód, super hires. Jeho šířka je omezena na
96 pixelů a to proto, e jsou to dvě řady čtyř hires spritů na sobě, doplněné
o hires grafiku v podkladu. Tento mód nemá a tak velké monosti práce s barvami
jako výše popisované, ale zato umoňuje hires o více barvách, ne jsou klasické
dvě. I tento mód má svojí interlace formu - SHI. Tím se jeho barevné monosti
zvyšují a je v něm moné kreslit (konvertovat) velmi hezkou grafiku, ovšem stále
širokou "pouze" 96 pixelů. Pokud budete SH pouívat tak, e nedáte
dvě řady čtyř spritů na sebe, ale osm do jedné řady, vznikne mód ESH, potamo
ESHI. Tyto umoňují obrázek o šířce 192 bodů, ztrácejí ale monosti pouívání
barev. U všech těchto SH módů je třeba řešit problém s vertikálním přesouváním
spritů, aby byl obrázek velký alespoň na délku - obrázek o rozměru 96x21 určitě
nikoho nenadchne. Není zde třeba speciálních technik, SH jde zobrazit i bez
stabilizovaného rasteru, přesto bych jednu fintu zmínil. Kromě pozice spritů
musíte měnit i jejich grafiku - přepisovat místo, odkud se načítají. Co znamená
na velmi malém prostoru přepsat osm adres. To můe být někdy kámen úrazu. Pomoc
je jednoduchá, pouíváte dvě video ram, sprity si definujete u před místem
přepínání grafiky a v kritickém momentě přepnete pouze adresu $D018. Stejně
jako u FLI, i zde existuje několik kombinací a odnoí. Známý mág přes programování
grafiky Crossbow udělal editory (krom jiných) SH-FLI a SHI-FLI. Pouití spritů
a FLI v tomto případě nekoliduje, protoe celá grafika je uprostřed obrazovky
a ani zvětšený flibug prostor do ní nezasahuje (místo, kde se flibug vyskytuje,
je prázdné). Obzvláště SHI-FLI je velice efektivní mód s velkými barevnými monosti,
ovšem pokud se pamatuji, nebyl pouit jinde ne v demech, která právě Crossbow
osobně programoval.
V druhé polovině článku bych zmínil několik programátorských technik, které
v původním článku nebyly, a které se sice pouívají spíše pro demo efekty, se
zde popisovanými tématy ovšem úzce souvisí. Jak ji bylo zmíněno, FLI se netýká
pouze obrázků, ale je to technika, jak zobrazit na kadé řádce jinou videoram.
Také samozřejmě nemusí nutně pouívat bitmapu, můe být i ve znakové sadě. Z
tohoto se potom odvozují různé efekty jako FLI scrolltext, FLI plasma atd. Zvláštní
technikou je pak 4x4FLI, které přepíná video ram pouze na kadém čtvrtém řádku
a tím pouívá jen dvě videoram (narozdíl od FLI obrázku, který jich potřebuje
osm). Pokud pak máte v bitmapě všude zapsán znak dělený na půl, aby se v jedné
půlce zobrazovala barva dolního nibble videoram a v druhé půlce barva horního
nibble videoram, dostáváte docela slušné grafické rozlišení (na monosti C64),
ve kterém je moné programovat vcelku rychlé efekty s dostatečným barevným rozlišením.
Touto technikou docílíte toti toho, e kadá "pixela" 4x4 bude mít
svojí vlastní barvu. Ale i zde platí, e první tři znaky jsou těko vyuitelné.
Co by se stalo, kdyby se FLI grafika přepnula dříve, ne skončí předchozí řádka?
Odpověď je jednoduchá, předchozí řádka by se načetla znovu. Respektive načetla
by se ta stejná řádka bitmapy a znovu by se načetla videoram. Ale co kdybychom
změnili videoram (adresou $D018) ještě předtím, ne by se znovu načetla? Načetla
by se stejná bitmapa, ale u jiná videoram - jiné barvy. Tato technika je známa
jako ECI a ikdy její síla nemusí být při definici principu zřejmá, docílí se
jí velmi zajímavé efekty. Kdy s tímto časováním začnete hned na první řádce
a obětujete mu celý videobank, máte patnáct různých videoram (ten šestnáctý
nelze pouít, tam musí být definována bitmapa), které můete měnit. Znamená
to, e sice máte jen jeden řádek bitmapy, ale zato v patnácti různých barvách,
navíc ECI je zobrazováno v celé šířce obrazovky (i na prvních třech znacích).
Nejznámějším efektem je ECI plasma. Technika FPP vyuívá na vlas stejného raster
časovače, odlišnost je pouze v tom, e nepouívá bitmapu, ale znaky. A pokud
je FPP efektu zase vyhrazen celý videobank, můeme dělat efekty jako FPP plasma
nebo FPP logo (pokud rozumně pouíváme paměť, můeme operovat s logem 320x48,
je moné i pouívat více videobanků). Navíc pouití spritů je také moné - nejznámější
efekt FPP se sprity je Graham plasma (pojmenované po svém autorovi). Z popisu
je patrné, e technika FPP (i ECI) operuje na badline, pokud ovšem s časováním
nezačnete na první, ale a na sedmé řádce, získáte efekt, který vypadá stejně,
ale jste na tom lépe s časováním. Badline má toti tu nepříjemnou vlastnost,
e načtení nové videoram trvá většinu času raster řádky. Tudí v tuto dobu je
plně vytíena paměť grafickým čipem a procesor v tu samou dobu nemůe mít přístup,
aby vykonával instrukce. Tento výše zmiňovaný efekt se jmenuje FPP, je moné
ho pouít pouze ve znakovém módu a operuje těsně před badline, máte proto v
přerušení více času na samotný efekt. Tím dostanete monost např. otevřít sideborder
a zároveň udělat spritestretch, nebo máte čas na kadém řádku přepisovat grafiku
(a udělat tak třeba vertical raster bars) a podobné.
Závěrem asi toto: nedělám si iluze, e by v dnešní době tento článek oslovil
více lidí, ne aby se dali spočítat na prstech jedné ruky, nebo e by se snad
z něj někdo dozvěděl něco nového a prakticky to dokázal vyuít. Hlavní důvod,
proč tento článek vznikl je tedy ten, který byl zmíněn hned v úvodní větě.
LHS