Sen se plní aneb Atari do kapsy

Jiří Svoboda, 2002

Když jsem v roce 1986 poprvé viděl Atari a vlastně i počítač vůbec, a když se tento osmibitový stroj v roce následujícím objevil i u nás doma, netušil jsem, kam se v následujících letech pohnou hranice technologie, netušil jsem, jaké místo v tomto rychle rostoucím světě počítačů zaujmu já.

Atari jsem měl více než pět let a již během té doby mě občas napadaly myšlenky na nějaký kapesní počítač, nejlépe Atari XL/XE kompatibilní. Jedinou možností tehdy bylo drahé a nekompatibilní Atari Portfolio, takže tyto myšlenky zůstávaly jen snem...

Jakkoliv se během let následujících měnily sféry mých zájmů v oblasti počítačů, zájem o Atari, ač v míře omezené, zůstával. Většinou se však vše již točilo jen kolem emulátorů. Zprvu velmi špatná emulace ve více různých emulátorech byla postupně v emulátoru s prostým názvem 'Atari800' přivedena k dokonalosti. Dokonalé emulace se podařilo dosáhnout také díky dostupnosti dostatečně výkonného hardware pro emulaci tak sofistikovaného systému, jakým Atari bezesporu je.

Technologie se dnes již dostala na úroveň, že dostatečným výkonem pro emulaci Atari již disponují nejen desktopy, ale i některé kapesní počítače (handheldy). A protože jsem velkým příznivcem těchto zařízení a po ne příliš dobré zkušenosti s Palmem se konečně objevily stroje s možností provozu mého oblíbeného operačního systému Linux, neváhal jsem, a pořídil si Compaq iPAQ H3660, na který jsem vzápětí nainstaloval zmíněný operační systém.

Pokud si myslíte, že jednou z prvních aplikací, kterou jsem se na svém novém handheldu pokoušel rozjet, byl právě emulátor Atari800, máte naprostou pravdu.

Moje první pokusy se odehrávaly s emulátorem pro prostředí X window. Prvním objevivším se problémem byl zvuk. Emulátor totiž používá 8-mi bitový mono výstup, iPAQ však umí pouze 16-bitů stereo. Provést příslušné úpravy zdrojového kódu nebylo složité a reproduktorek iPAQa se vzápětí rozezněl typickými zvuky osmibitového Atari.

X11 verze tedy běžela, ale především díky specifickému hardware byla prakticky nepoužitelná. Okno emulátoru se totiž ani nevešlo na displej iPAQu (240x320 bodů, v případě Atari emulace je však výhodnější používat ho otočený na šířku), navíc tu nebyla klávesnice (pouze virtuální, ale kam s ní na už tak přeplněném displeji) a emulace joysticku myší (u iPAQa stylusem - dotykovým perem) je nepoužitelná i ve standardním portu. Dalším vážným problémem byla nedostatečná snímková frekvence. Aby emulace běžela na 100% rychlosti skutečného Atari, bylo možné/nutné vykreslovat pouze každý třetí až čtvrtý snímek.

Použitím X11-shm verze (zjednodušeně řečeno, povolením toho, aby emulátor kreslil přímo do paměti grafického rozhraní) se sice podařilo zvýšit frekvenci vykreslování na každý druhý snímek (což už bylo použitelné), avšak nezmizel žádný z dalších, výše zmíněných, problémů.

Profilerem jsem dodatečně zjistil, že hlavní výkonnostní ztráty způsobuje ne vlastní emulace, ale až vykreslování hotové obrazovky Atari na displej, z čehož jsem podezříval X window system. Ztrátou výkonu obecně navíc trpěla i kvalita zvuku.

Po těchto a pár dalších pokusech jsem dospěl k závěru, že nastoupená cesta není ta pravá a rozhodl se naprogramovat vlastní port, který by zohledňoval všechny vlastnosti PDA zařízení. Znamenalo to doprogramovat do emulátoru jeho vlastní virtuální klávesnici, doprogramovat emulaci joysticku. Především to však znamenalo realizovat zcela nový grafický subsystém.

Protože Linux pro přístup k displeji iPAQu používá na nejnižší úrovni standardní framebuffer device, byla volba jasná. Jaké však bylo mé překvapení, když jsem po prvním spuštění nezjistil žádný viditelný nárůst výkonu. X window system tedy za onu "pomalost" nemohl. Po mnoha dalších pokusech jsem zjistil, že pomalý je obecně jakýkoliv přístup k displeji, přestože videopamět je součástí standardní RAM (úvahy nad možnými příčinami by přesáhly rámec tohoto článku). Interně jsem tedy do emulátoru zavedl další virtuální obrazovku, jejíž obsah odráží aktuální stav displeje. Každý bod každého nového snímku je vždy porovnán s příslušným bodem této virtuální obrazovky a pouze při zjištěném rozdílu je realizován skutečný zápis na displej a současně i do této virtuální obrazovky. Ačkoliv se tím nezanedbatelně zvýšil počet přístupů do paměti a množství porovnávacích operací, efekt na výkon emulátoru je dramatický. Plné snímky. Odhaduji, že k viditelnému zpomalení by došlo až tehdy, pokud by se v po sobě následujících snímcích měnilo více než 50% bodů. Ojedinělý výskyt této situace však navíc podle mého názoru nelze postřehnout. Pokud se chystáte argumentovat, že hodně her přece "roluje" celou obrazovkou, zamyslete se: Kolik bodů opravdu změní svou barvu?

A jak jsem vyřešil problém klávesnice a joysticku? Protože vykreslování obrazovky provádím svým vlastním kódem, nebyl problém do něj vsunout pár řádků, které přes Atari obrazovku vykreslují průhlednou on-screen klávesnici a joystickový "kříž" (obojí tlačítkem vypínatelné, joystick je pak v celoobrazovkovém režimu). Joystick je sice emulován i na "joypadu", iPAQ však neumí vyhodnotit šikmé směry (hardwareové omezení), a tak bylo nutné udělat i jeho on-screen variantu.

Port sice ještě není zdaleka hotov, již dnes je však velmi dobře použitelný. Plná snímková frekvence, perfektní zvuk, ovládání bez vážných problémů. Jeden z mých dávných snů se splnil. Nosím své Atari v kapse. Co víc si přát?

Poznámka:
Pokud snad nejste příznivci operačního systému Linux a ve vašem handheldu (nejen iPAQu) používáte operační systém Pocket PC (Windows CE), nezoufejte. Port pro tento operační systém existuje také, podle mých informací však zatím nedosahuje kvalit portu linuxového (trpí nedostatečnou snímkovou frekvencí a horší kvalitou zvuku, typickými známkami nedostatečného výkonu systému).

Odkazy:

http://atari800.atari.org
- stránka emulátoru Atari800 http://jirkas.atari.org
- stránka mého linuxového iPAQ portu

http://pocketatari.retrogames.com
- stránka Windows CE portu