Recenze - Navigátor

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

HRA

Prince Clumsy
Herní styl Platformer (Multi Screen)
Multiplayer Bez multiplayeru
Rok vydání 1990
Programátor Robert Toone
Grafik Terry Lloyd

INTRO

GRAFIKA A GRAFICKÉ EFEKTY (MÓDY) NA ZX SPECTRU

Pozn.: Blikající obrázky na této stránce (interlace) na skutečném Spectru blikají o poznání rychleji (1/25s), toto je jen omezení animovaného GIFu.

Spectrum má pouze jeden jediný hardwarový grafický režim. Nemá ani znakový režim jako např. C64. Grafické rozlišení Spectra je 256x192 pixelů. Obrazovka má svoji pevnou adresu, kde začíná, a tou je adresa 16384. Její délka je 6144 bajtů. Její zvláštností je to, že se nevyplňuje lineárně, ale je rozdělena na třetiny, přičemž v každé třetině se plní vždy každý osmý mikrořádek. Pro názornost si zkuste tento prográmek, který lineárně vypnlí obrazovku (tedy začne na 16384 a skončí na 22527), ovšem je vidět, že se toto provádí jaksi chaoticky. Je to typická vlastnost obrazovky Spectra. Kdo si pamatuje, jakým způsobem se vykresloval úvodní obrázek při nahrávání hry z kazety, tak to nebylo kvůli tomu, aby to vypadalo efektněji, ale prostě protože posloupnost bajtů ve VRAM je takhle navržena. Jednoduše laicky řečeno, mikrořádky jsou takto zdánlivě chaoticky uspořádané proto, aby vždy nižší bajt adresy pixelového bajtu odpovídal nižšímu bajtu adresy jeho attributu. To proto, že dynamické ramky (Speccy má dynamické RAM narozdíl od C64, kde jsou statické) vyžadují zadat adresu na 2x - vyšší a nižší bajt se posílají zvlášť. A přávě díky tomuto rozvržení v paměti stačí poslat nižší bajt jen jednou pro pixely i attributy, což šetří čas přístupu Uly (ULA - Uncommited Logic Array - obvod zajišťující mimo jiné zobrazování obrazu ZX) a poskytne víc času procesoru.
[autor článku děkuje Zilogovi a Busymu za objasnění]
Jen doplním jednu zajímavost, že skoro stejně mají videopaměť uspořádanou i počítače Amstrad řady CPC (které běhají také na Z80, mají AY, ale jinak nemají se Spectrem nic společného)

Takže tady je slibovaný program:

10 CLS
20 FOR f=16384 TO 22527
30 POKE f,255
40 NEXT f

Nejdřív se začne plnit horní třetina, pěkně každý 8mý mikrořádek. Pak prostřední a nakonec spodní.

Druhá část VRAM se nazývá attributová část a ta má za úkol vybarvovat normální pixelovou VRAM (ona jí spíš podbarvuje, obsah pixelové VRAM nijak nemění). Ta začíná tam, kde končí pixel VRAM a to na adrese 22528 a je dlouhá 768 bajtů. Její rozlišení je 32x24 barevných kostiček. Proč kostiček? Protože každý její 'bod' je ve skutečnosti na pixelové VRAM vidět jako 8x8 pixelů, tedy zabere přesně místo např. na jeden znak. Klasický Spectrum obrázek tedy zabírá 6912 batů (6144+768). Uspořádání této části VRAM v paměti už není tak chotické, jako u pixel VRAM, ale je pěkně lineární a vše jde popořadě. Pro názornost si uvedeme jednoduchý program v BASICu.

Nejdřív vyplníme obrazovku nějakou grafikou:


10 CLS
20 FOR f=0 TO 767
30 PRINT 'A';
40 NEXT f

Teď máme obrazovku plnou písmen A (je jedno čeho, prostě potřebujeme, aby tam něco bylo), černobíle. Resp. Momentální attributová VRAM vypadá tak, že její attributy jsou nastaveny na černý inkoust a bílé pozadí ve všech 768mi 'čtverečcích'.


A teď abychom obrázek trochu vybarvili, můžeme použít takovýto program:


50 FOR f=22528 TO 22528+768
60 LET barva=INT(RND*255)
70 POKE f,barva
80 NEXT f

...obarví se nám každý čtvereček (bajt ATTR VRAM) náhodnou barvou.

Spectrum dokáže zobrazit jen 8 základních barev. Černou, tmavě modrou, červenou, fialovou, zelenou, světle modrou, žlutou a bílou, tak proč 256 hodnot? Jednoduše. Speccy umí také kromě základních 8mi barev ještě tyto barvy zesvětlit (BRIGHT), čímž dosáhneme 7mi dalších barev (černá zesvětlit nejde, resp. jde, ale není to vidět) a také nechat blikat (FLASH). Kombinací všech těchto jevů dojdeme k číslu 256. Např. attribut s nastavením INK 5 (světle modré popředí) a PAPER 2 (červené pozadí) může navíc ještě zároveň i blikat a být jasnější. Nejde ovšem udělat to, aby byl např. v jednom attributu jenom INK s jasem a zároveň PAPER bez jasu.

Ve hrách je tato nevýhoda samozřejmě dost znatelná a na první pohled (někdy i na druhý) odradí některé C64 člověky. Většinou se to řešilo všelijakými kompromisy, jako třeba tím, že pozadí bylo pěkně vybarvené attributy, ale postavičky (sprity, btw. pouze softwarové, Spectrum nemá hw sprity) se samy přebarvovaly podle toho, před jakým pozadím chodily. V některých hrách šlo i přepínat, jestli bude postavička přebarvována pozadím nebo naopak pozadí bude přebarvováno bílou postavičkou. Hráč si sám vybral, co je pro něj menší zlo. Problém s attributy zbaběle obešli ti, kteří hru vůbec neobarvili (ROBOCOP, RENEGADE 3, SLAP FIGHT, TERRA CRESTA a desítky dalších). Skvěle vybarvená hra je také např. TOWDIE, BOOVIE, ADDAMS FAMILY, GRELL AND FELLA, atd.

Bohužel, attributovým kolizím se vyhnout téměř nelze. Buď je hra monochromatická, nebo barevná, ale s nebezpečím kolizí (kromě příkladů, které teď uvedu...)

Pro vyhlášení války attributům se rozodli programátoři fy Probe, Dave Perry a Nick Bruty (SAVAGE, EXTREME, DAN DARE 3, atd...), jejichž hry mají pěknou pestrobarevnou grafiku a attributy nikde nekolidují s pozadím apod. Sprity se v nich totiž posouvají o celých 8 bodů (tedy ne moc plynule) a tím je dosaženo kýženého efektu. Podobná technika je použita ve hrách R-TYPE, LIGHTFORCE a v několika dalších.

Taková grafika, jaká je třeba v Mayhem in Monsterland na Spectru není technicky možná, zejména detailní vybarvení spritů atd.

Spectrum má také okraj, čili BORDER. Okraj může mít jen jednu z 8mi zálkadních barev, nedokáže blikat ani být světlejší. Do této oblasti nejde normálně zapisovat, ale různými fígly v assembleru (i v BASICu) však ano. Zkuste si tento prográmek:

10 BORDER 0: BORDER 1: BORDER 2: BORDER 3: BORDER 4: BORDER 5: BORDER 6: BORDER 7: PAUSE 1: GO TO 10



Jak vidno, program je vlastně nekonečná smyčka, měnící rychle za sebou barvu okraje, která je sesynchronizovaná příkazem PAUSE 1, který zde slouží jako vyrovnání paprsku (rasteru s 1/50s). Takovýto efekt se je tedy náročný na vyčasování a vyžaduje dost velkou synchronizaci, což není vůbec snadné např. v demech při kombinaci ještě jiných efektů.

A tím jsme nakousli jeden z nejvíce využívaných barevných efektů, normálně na Spectru nemožných a tím je MULTICOLOR.

Jak jsmě viděli z BASICovské ukázky, oblast BORDER není omezena políčky 8x8 pixelů, ale každý mikrořádek tam může mít jinou barvu. Stejně tak je to i s ostatní částí obrazovky, pixelové VRAM (mezi Spectristy je pro toto zažitý výraz PAPER, pro okraj BORDER.. podle odpovídajících BASICovských příkazů). Multicolor jde udělat i v PAPERu a to tím samým způsobem jako v borderu s tou předností, že pole 8x1 pixelů může mít jakoukoliv barvu (vodorovná čárka dlouhá 8 bodů a široká 1 bod). Teoreticky to znamená, že na každém mikrořádku (v ose Y) celého PAPERu můžeme mít jinou barvu. V ose X zůstává 8 pixelů na barvu.

Nejnázornější příklad je asi na demo SHOCK, kde je v pixel VRAM (PAPER) nakreslené logo, které potom podbarvuje správně vyčasovaný Multicolor.


I BORDER však můžeme měnit i v ose X. Tak, jako v PAPERu máme na každý barevný čtvereček 8 pixelů široký, v BORDERU toto jde taky, ale šířka jednoho možného 'pixelu' v BORDERu je poněkud větší. Viz např. demo NMI3 od Dynamite Dynastie. Takovýto efekt je však ale opravdu programátorským oříškem.


(NMI3. viz. Horní část obrazovky, můžeme napočítat 13 a kousek borderových 'pixelů' v ose X)


(PSG WINS. Vykreslením attributů v kombinaci s vhodným vyčasováním BORDERu lze udělat třeba fullscreen nápis)

Do Borderu jde i takto psát, pěkně to je vidět třeba ve hře SENTINEL nebo demu LSD. Asi první takovýto Borderový efekt jsem viděl ve hře STARION (1984).

Psal jsem, že Multicolor v PAPERu je omezen na matici 8x1? Vlastně ne tak docela. Speciálním vyčasováním lze dosáhnout třeba toho, že můžou být v jednom 8x8 attributu (čtverečku) 4 barvy, např. demo NMI2, EYE ACHE nebo POWER UP jsou toho důkazem.


(NMI2. v BORDERu je vidět klasický rasterový multicolor, v PAPERu pak mezi ním loga NMI, podbarvená 8x1 (nahoře) a 4x1 (dole) multicolorem. Nápis 'THIS' je scroller a jeho nezvyklé barvy jsou způsobené podkreslením attributů mřížkou %10101010 a %01010101)









(zde - vlevo dole - je použitý i mírný dithering pro zmenšení přechodů mezi barvami)


(NMI3. Tady je možno zvolit si stiskem klávesy, jaké Spectrum máme a jaká se má přepnout časovací rutinka).





(POWER UP. Multicolor - 4 barvy v jednom atributu)

Normální Spectrum 48K má jen jednu VRAM, tu, kterou jsem popisoval. Ale kdo to myslí se ZXkem vážně, používá výhradně Spectrum se 128kB RAM. To se liší tím, že má víc paměti (překvapivě), rozdělenou do tzv. stránek, mezi kterými programátor přepíná. Větší je i ROM, kde je navíc nový, nepříliš povedený interpret BASICu (ten starý je ale také zachován, kvůli kompatibilitě), umožňující zadávání příkazů písmeno po písmenu. Navíc má i zvukový generátor AY (ten lze ale připojit i k 48K ZX pomocí externího modulu (interface)). Původní 48K Spectra měly jen 1bitový speaker, podobný jako mají PC, který když hraje, tak CPU nemůže dělat nic jiného. Přes jeho primitivitu pro něj bylo vytvořeno několik geniálních až 5ti pseudo-kanálových hudeb zejména ve hrách. Mezi ty nejznámější patří CHRONOS, FUTURE GAMES, COMBAT SCHOOL a AGENT-X 1 a 2 od Tima Follina. Pro pípák existuje i desetikanálová rutinka, najdete ji v hudebním programu ZX-10.

Ale zpátky k paměti. Jedna z paměťových stránek, konkrétně č.7, plní funkci druhé VRAM. Její struktura je identická s normální VRAM, jen začíná na adrese 49152 (a je viditelná na obrazovce po přepnutí na portu 32765). Programátor ji může použít třeba jako doublebuffer pro plynulejší animaci apod. nebo se používá např. pro interlace, tj střídání sudých a lichých mikrořádků (nebo mikrosloupců), čímž se dá dosáhnout rolišení 512x192 nebo 256x384 bodů.


(YES. Typický interlace - rychlé přepínání mezi dvěma VRAM)

Myslím, že princip není třeba moc popisovat, protože podobné věci mají i Commodoristé. Daleko zajímavější je však (aspoň pro mě) tzv. mód INTERCHROME.

Jde v principu o to samé, co interlace, ale s barvami. Vhodným střídáním barev tak lze dosáhnout až 256 různých odstínů na obrazovce. Interchrom jde také kombinovat např. s Interlace. Následuje asi to nejlepší co se týče synchronizace okraje plus interlace - intro PSG WINS / Prestige.


(PSG WINS - interlace ani animovaný sprite do GIFu nacpat bohužel nešel)

Šachovnice je (nepochopitelně) i v BORDERu a dokonce se plynule pohybuje po sínusovce a je skvěle sesynchronizovaná s oblastí PAPERu, navíc se zde vypisuje interlace text, napravo od něj je tečkový sin-efekt (také lacovaný), nahoře a dole jsou borderové rasterbary a ještě k tomu tam poletuje malý sprite. Toto je opravdu na hranicích možností Spectra.

Nutno dodat, že toto intro funguje správně pouze na ruském klonu Pentagon 128. Různých druhů Specter bylo totiž moc a téměř každé bylo uděláno z jiných součástek, mělo různě velkou paměť, různě adresované porty atd. Většina dem je časovaných buď pro originální ZX 48, ZX 128, ta ruská ve většině případů pro Pentagon. Je v tom dost zmatek, asi jako u diskových systémů Spectra, kde platí pořekadlo Každý pes jiná ves a bylo by to na samostatný článek.

GIGASCREEN

Gigascreen je pravý grafický mód, protože jej zajišťuje speciální hardware. Používá se na některých ruských ZX klonech. Princip je v tom, že při zobrazení obrázku, používajícího obě VRAM, tj. Rychle se přepíná 1. a 2. VRAM, vzniká nepříjemné blikání. Velmi zjednodušeně řečeno, gigascreen toto blikání ostraňuje a obrázek pak vypadá, jak by měl skutěčně více barev, než je zdrávo. Jako příklad uvedu demo STELLAR CONTOUR.







MULTITECH

I pro Multitech je nutný speciální hardware, a to procesor Z80 DMA. Tento mód vymysleli zlínští 8BitCompany a uvidíte ho jen na Spectrech s diskovým řadičem MB02+ nebo přídavným Z80 DMA interfacem (vše taktéž od 8BC). Princip spočívá v tom, že Speccy s DMA dokáže zobrazit fullscreen multicolor. Pokud máte černobílý monitor nebo TV, jeví se barvy jako odstíny šedi a právě tohoto zneužívá Multitech tím, že obrázek zobrazí v DMA Multicoloru tak, že na čb monitoru vypadá téměř jako černobílá fotografie. V barvách je to ale pochopitelně barevný chaos.

Obrázky Multitechu s využitím Z80 DMA si můžete prohlédnout tady. Schválně jsem nechal původní velikost fotek 1024x768, aby byly vidět detaily. Screenshoty jsou foceny z obyčejné TV, monitor jsem zrovna neměl k dispozici, takže ty barvy vypadají trochu rozplzle, za což se omlouvám. Pro názornost jsem přidal i barevné varianty screenů, aby bylo vidět, že Multitech je koncipován jen pro čb zobrazení.

Kočka - Multitech B/W Kočka - Multitech color

Šachy - Multitech B/W Šachy - Multitech color

Poušť - Multitech B/W Poušť - Multitech color

Žena - pouze B/W
Z80 DMA také krom lepšího multicoloru dokáže i bleskové přenosy dat v paměti, což jde využít k plynulému scrollingu libovolně velkých kusů obrazovek apod. Např. demo NaPiCu od K3L nebo

Busysoftovo demo "level03" využívající DMA. Nahoře v Borderu je vidět to, co by normálně možné nebylo.

DITHVIDE

Tuto zobrazovací techniku vymyslel Zilog (ten scener, ne ta firma) a poprvé prezentoval na Foreveru 2003. Není k ní nutný žádný speciální hardware, funguje na všech Spectrech a jejich klonech se 128K pamětí. Dokáže zobrazovat a Spectru zbyde ještě poměrně dost CPU času. Funguje také na principu dvou VRAM, ve kterých je uložený požadovaný obrázek i s attributy, předpočítaný speciálním softwarem (Linux) tak, že aby obrázek vypadal po převedení co nejvěrněji. Pixely obrázku se zditherují a do attributových oblastí obou VRAM se vypočítají barvy, které po spojení obou obrázků (rychlé střídání obou VRAM) dá multicolor, pasující přesně na požadovaný obrázek. V podstatě je to něco jako softwarově vyřešený Gigascreen, který bliká, ale propočítaný programem napsaným jen pro tento účel. Dithvide bylo primárně navrženo pro zobrazování konvertovaných obrázků. Bohužel, tato technika nebyla skoro vůbec použitá, i když vlastně není nijak hw náročná. Btw. dithvide dokáže generovat obrázky i pro C64 hires, takže je tu možnost přijít s něčím novým.





Pro klasický Multicolor existuje editor COLOR DRAW, kterým se dají dělat téměř celoobrazovkové obrázky v rozlišení attributu 8x1. Druhou VRAM zase využívá BURIAL GFX EDITOR. Jinak pro ostatní jmenované techniky neexistuje editor přímo pro Spectrum, vše se musí zaonačit za pomocí nějakého vícebitu nebo prostě naprogramovat. Takový komfort C64 grafických editorů (zejména těch pro speciální módy) na ZX není a nikdy nebude. Víceméně existuje jen pár základních, jako např. ART STUDIO, ARTIST 2, SCREEN MACHINE, COLOR DRAW, BURIAL, a ještě možná pár dalších, ne tak dobrých, a toť vše.

Na závěr bych chtěl dodat, že narodzíl od C64 nemá ZX Spectrum žádný speciální grafický čip (ULA grafický čip není). Vše má na starosti CPU Z80 (3,5MHz), takže nejde jednoduše např. nechat pracovat grafický čip s tím, že to uvolní veškerý čas CPU. Jediné, co ve Spectru dokáže pracovat (hrát) samostatně je AY (ještě aby ne).

Pro www.c64.cz objektivně sepsal Factor6 (call me lamer :)

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)

22.01.2016 - manex

Jde někde stáhnout utilita na převod do dithvide?

27.06.2015 - bildo

Super článek, respekt !!!! Faktor 6, jsi borec !

Advert

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