Recenze - Navigátor

12 Assembler
41 Encyklopedie
30 Hardware
15 Hra
12 Párty
7 Programování
12 Sofware

HRA

Realm!
Herní styl Collect'em Up
Multiplayer Bez multiplayeru
Rok vydání 1987
Programátor Paul Johnson
Grafik (Unknown)

INTRO

Grafické módy na C64

Tento článek jsem kdysi psal pro časopis Splash!, bohužel 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 možno 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 možnostmi C64 je o něco složitě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 každé raster řádce (adresou $D018), z čehož vyplývá, že na každé 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 každý 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 každé raster řádce. Zároveň musí zajistit, že toto přepínání přijde až poté, co předchozí řádka skončila. A vhodný okamžik 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 nepoužitelné, 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í možné 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 možné 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 možné 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, použití 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é možnosti 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é možnosti zvyšují a je v něm možné 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, potažmo ESHI. Tyto umožňují obrázek o šířce 192 bodů, ztrácejí ale možnosti 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. Použití spritů a FLI v tomto případě nekoliduje, protože 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 možnosti, ovšem pokud se pamatuji, nebyl použit 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 každé řá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 každé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 možnosti C64), ve kterém je možné programovat vcelku rychlé efekty s dostatečným barevným rozlišením. Touto technikou docílíte totiž toho, že každá "pixela" 4x4 bude mít svojí vlastní barvu. Ale i zde platí, že první tři znaky jsou těžko využitelné.
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 možné i používat více videobanků). Navíc použití spritů je také možné - 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 možné 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 možnost např. otevřít sideborder a zároveň udělat spritestretch, nebo máte čas na každé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

Nový příspěvek k článku

podpis :
První znak podpisu musí být vykřičník, jinak se příspěvek neodešle (ochrana proti spamu)

Advert

Programmed by PCH of UNREAL, Hardware support by RAY of UNREAL. Beta test and bugs guru SILLICON
Unreal 2014 - Czech republic