Dizzy 3.5 – nová konverze hry ze ZX Spectra

Je tu jedna nová konverze drobné hříčky ze Spectra na Ondru – Dizzy 3 and a Half: Into Magicland. Tato hra kdysi vyšla na „cover kazetě“ k časopisu Crash jako takové intro ke čtvrtému dílu – Magicland Dizzy. Je to skutečně jednohubka, která obsahuje pouhých 5 herních obrazovek, plus jednu úvodní a jednu závěrečnou (ta je shodná se startovní obrazovkou hry Dizzy 4). Dohrání je tak otázkou několika málo minut. Proč jsem tedy ke konverzi zvolil právě tento minidíl? Slouží především jako určitý test proveditelnosti, zda má smysl se pouštět do konverze nějakého „dospělého“ dílu.

Úvodní obrazovka hry
Úvodní obrazovka hry

A jaký je výsledek? Určité mouchy má, ale celkově je hra hratelná (a dohratelná) a tím pádem má do budoucna smysl zkusit i plnohodnotnou Dizzy hru.

A jaké problémy jsem během konverze řešil? Tak samozřejmě především rychlost.

Ondra je pomalý. Základní takt CPU jsou 2 MHz, oproti 3,5 Mhz u Spectra, a především – v závislosti na počtu zobrazovaných řádků je CPU zcela „zapauzován“ během generování obrazu. Proto nejjednodušším způsobem zrychlení je snížit počet zobrazovaných řádků. Jako rozumné minimum se zde po přeskládání prvků obrazovky ukázalo 153 řádků, při těch je za přerušení k dispozici přibližně 20500 T (taktů CPU), pořád tedy skoro 3,5x méně než u originálu.

Bylo tedy nutné analyzovat největší „žrouty času“ a pokusit se najít takty tam. Jako takový největší žrout se ukázalo samotné vykreslování sprajtu Dizzyho, což není překvapující – ten sprajt má pro obě základní fáze (kdy Dizzy stojí a máchá ručičkama nahoru a dolů) 24×23 pixelů, v každém z 23 řádků je tedy nutné zpracovat 6 bajtů – 3 bajty kresby a 3 bajty masky. Engine je ovšem psán vysoce efektivně a čas se mi zde najít nepovedlo. Ovšem něco jiného je, když Dizzy popojde o jednu 4-pixelovou pozici (já to nazývám „lichá pozice“) – zde již je třeba vykreslovat 8 bajtů a těchto 8 bajtů si engine připravuje opakovanými bitovými posuny z původních šesti (sekvence RR C/RR E/RR L/RRA, to vše se opakuje 4x pro masku, a pak totéž s registry B,D,H,A, zase 4x, pro kresbu). A tady se už dost dá ušetřit právě na této přípravě – za cenu vyššího využití paměti se sprajty předem zrotují a takto rovnou načítají.

To je asi to největší zrychlení, které se mi podařilo vytvořit (v řádu tisíců T), další už byly jen „stovkové“ drobnosti typu efektivnějšího načítání klávesnice/joysticku apod. Když jsem se někdy na podzim rozhodl zkusit udělat konverzi Dizzyho, neměl jsem vůbec Ondru a vlastně ani žádné zkušenosti s ním – vše jsem testoval v emulátoru JOndra, který je sice skvělý, ale reálný hardware nenahradí. Takže první  verze, kterou jsem vytvořil, fungovala v emulátoru docela dobře, ovšem na reálném železe mi testeři hlásili nepříjemné blikání sprajtu Dizzyho. Myslel jsem si, že prostě Ondra nestíhá a stále se snažil najít další možnosti ušetření času, ale nebylo to nic platné. Jak se později ukázalo, toto blikání bylo nezávislé na počtu zobrazovaných řádků, a tady už to začalo být fakt divné. Proto jsem Dizzyho odložil, dokud nebudu mít možnost to zkoušet na vlastním reálném železe a věnoval se jiným, jednodušším konverzím (výsledek snad uvidíte brzo). Poté, co jsem koupil ZX-Uno a nainstaloval tam jádro Ondry, jsem měl konečně možnost vidět to blikání na vlastní oči. Ještě o něco později jsem díky Janu Heřmanovi získal skutečného Ondru a tam se mi to jen potvrdilo. Bylo tedy jasné, že tohle je nutné pořešit.

Problikávající Dizzy (animovaný GIF)
Problikávající Dizzy (animovaný GIF) aneb „Dejte to pryč, mně se z toho dělá mdlo“ 😀

Takže jsem začal různě experimentovat s časováním vykreslování a přišel na to, že vykreslování na obrazovku nezačíná ihned po přerušení, jak jsem si původně myslel (a jak to dělá JOndra), ale až o nějakých 5000 T později. A shodou okolností je necelých 5000 T doba, kterou trvá „vymazání“ přechozí animační fáze Dizzyho a vrácení původního pozadí před tím, než se začne vykreslovat nová animační fáze. Výsledkem tedy bylo, že těsně před tím, než Ondra vykreslil obraz z video RAM na obrazovku, jsem smazal z video RAM sprajt a nahradil jej pozadím. Uff…

No a pak jsem zjistil, že kdybych si tohle pořádně přečetl dřív, mohl jsem si celou výše uvedenou anabázi ušetřit – tam bych se totiž dozvěděl, že „Po prerušení je k dispozícii 4962T do času, kým prácu procesora preruší požiadavka na DMA a začne zobrazovanie.“

Vybaven touto znalostí jsem vyřešil problém s blikáním nejprimitivnějším možným způsobem – pokud se má po daném přerušení smazat stará a nakreslit nová fáze animace, je tam smyčka, která těch necelých 5000 T dělá to, že nedělá nic. Takže vlastně po té, co jsem se snažil vše zrychlit, jsem nakonec jako řešení zvolil čekání 🙂 . Stále to není ideální, v těch „lichých“ pozicích (kdy sprajt má 4 bajty na šířku) se Dizzy nestihne plně vykreslit během těch 20500 T a problikávají mu nožičky, ale naštěstí to už nepůsobí tak otravně, jako když původně problikával vždy a celý.

Také jsem si příslušně upravil JOndru, aby i v něm nastávalo zobrazení až se zpožděním po přerušení, takže problikávání původní verze už je vidět i tam (viz obrázek výše, to je výřez právě z takto upraveného JOndry).

Co se týče zvuků, jsou. Zcela základní, znějí hůř než na Spectru, ale jsou tam a zvučí. To je asi všechno, co se k nim dá říct 🙂 .

Něco málo k ovládání – hru je možné ovládat buď šipkami (pohyb) + ENTER jako akce (sebrání/položení/použití předmětu), nebo joystickem. Ke skákání je vedle šipky nahoru též možné použít mezerník. A pokud chcete hru ukončit a vrátit se do úvodní obrazovky, stiskněte Q. Hra reaguje i na NMI, pokud jej stisknete spolu se šipkou dolů, dojde k resetu Ondry, jinak k restartu hry vč. inicializace. Ale pozor, raději se vyhněte takové reinicializaci v průběhu hry, vykreslovací rutina Dizzyho totiž funguje přes zásobník a kvůli tomu může dojít k poškození grafiky sprajtů.

Nakonec něco málo k rychlosti – většinou to není zlé. V běžných podmínkách (na obrazovce se hýbe Dizzy, hoří pochodeň a třeba se vlní hladina vody) není hra znatelně pomalejší než originál. V případě, že se toho začne hýbat více, je to už horší. Dobře je to vidět v poslední hratelné obrazovce, kde se po aktivaci teleportačního stroje začne navíc animovat daleko více prvků – stroj samotný, uvnitř kabiny teleportační paprsek a nad kabinou se točí vrtulka. Zde již Ondrovi očividně dochází dech.

Poslední herní obrazovka
Poslední herní obrazovka, teleport je spuštěn, tak vzhůru do Magiclandu!

Na závěr bych chtěl poděkovat těm, kdo mi s mojí první herní konverzí na Ondru pomohli. Především je to Jan Heřman alias 72ka, který přispěl neocenitelnými radami i testováním (a jak jsem psal výše, sehnal pro mě nyní již mého vlastního Ondru), a pak taky Solaris104, který byl prvním odvážlivcem ochotným spustit na svém Ondrovi vůbec první (spíš nultou) verzi konverze – nultou proto, že nefungovala, měla blbě inicializaci zobrazovacích čítačů.

Hra je ke stažení zde:

Stáhnout

Příspěvek byl publikován v rubrice Software se štítky , . Můžete si uložit jeho odkaz mezi své oblíbené záložky.