Programovací jazyk BASIC na herní konzoli Atari 2600

by Lukáš Bílek

Obsah

1. Význam BASICu pro vývoj aplikací na osmibitových mikropočítačích

2. Příklad úspěšných aplikací vytvořených v BASICu

3. Osmibitová herní konzole Atari 2600

4. Generování obrazu na herní konzoli Atari 2600

5. BASIC na herní konzoli Atari 2600

6. Ukázkový program pro Atari 2600

7. Grafická plocha a způsob jejího využití

8. Obsah následující části seriálu

9. Odkazy na Internetu

1. Význam BASICu pro vývoj aplikací na osmibitových mikropočítačích

V předchozích čtyřech částech seriálu o architekturách počítačů i o jejich programovém vybavení jsme si popsali některé interpretry a překladače programovacího jazyka BASIC, které byly vytvořeny a používány na osmibitových domácích mikropočítačích. I když by se mohlo zdát, že tento programovací jazyk byl používán pouze pro tvorbu relativně malých a jednoúčelových aplikací, které nebyly z komerčního hlediska příliš úspěšné, vzniklo ve skutečnosti v BASICu pro osmibitové mikropočítače hned několik známých aplikací (především her), které jejich tvůrcům zajistily jak nezbytný přísun financí pro další vývoj, tak i reklamu, která již v té době (myšlena jsou osmdesátá léta minulého století) byla pro softwarové společnosti velmi důležitá, už jen z toho důvodu, že aplikace vytvořené známými vývojáři či vývojářskými společnostmi byly mnohem častěji předmětem recenzí v odborných časopisech než aplikace naprogramované nováčky na trhu.

Obrázek 1: Známá herní série Ultima má počátek na osmibitových počítačích Apple II. Zde je zobrazený screenshot původní verze této hry, která byla z velké části naprogramována v BASICu. Existuje i upravená verze prvního dílu Ultimy s vylepšenou grafikou i rychlostí, která byla přepsána do assembleru (viz též obrázek číslo 3 a podrobnější popis v následující kapitole).

Programovací jazyk BASIC tak umožnil mnoha autorům rychlou a poměrně snadnou tvorbu aplikací, a to i bez toho, aby nejdříve museli ztrácet čas (a vlastně i peníze a neméně důležitou pozici na trhu) detailním studiem hardwarových možností některého osmibitového počítače a instrukční sady mikroprocesoru, který byl v tomto počítači použit. Zajímavé je, že podobný přístup k tvorbě aplikací především start-up firmami má i Paul Graham, který ovšem v současnosti doporučuje namísto BASICu používat některý vysokoúrovňový programovací jazyk, například LISP či alespoň Python. Tento postup ovšem není možné použít pro všechny typy aplikací, zejména při jejich větších nárocích na výpočetní výkon a/nebo využití operační paměti (v mnoha případech nestačí ani použití překladačů jazyka BASIC a je nutné skutečně sáhnout po assembleru, linkeru, debuggeru a dalších utilitách používaných při nízkoúrovňovém programování). Dobrým příkladem může být souboj tabulkových procesorů VisiCalc a Lotus 1–2–3, který nakonec vyhrál Lotus a to i díky tomu, že byl téměř kompletně napsaný v optimalizovaném assembleru.

Obrázek 2: Další screenshot z první verze hry Ultima naprogramované v BASICu pro osmibitové mikropočítače Apple II.

2. Příklad úspěšných aplikací vytvořených v BASICu

Jednou ze známých her, které byly naprogramovány v jazyku BASIC, je hra Ultima (přesněji řečeno její první díl), jejímž autorem není nikdo jiný než Richard Garriott, známý též pod přezdívkou Lord British. Richard začal s vývojem her poměrně brzy – již v patnácti letech naprogramoval svoji první hru (dungeon), která běžela na textovém terminálu minipočítače. Ovšem jeho první hrou určenou pro osmibitové mikropočítače se stal titul nazvaný Akalabeth vydaný v roce 1979. Tato hra sice nebyla příliš úspěšná (prodalo se pouze několik kopií), ale části jejího kódu použil Richard Garriott ve hře Ultima, jejíž původní název měl znít Ultimatum, ovšem tento název musel být zkrácen kvůli tomu, že již existovala desková hra stejného jména. První verze Ultimy byla vydána již v roce 1979 pro osmibitové mikropočítače Apple II a její velký úspěch vedl k vytvoření celé série her, jejichž děj se odehrává sice v různém čase, ale na stejném místě – fiktivním světě nazvaném Brittania.

Obrázek 3: Novější verze hry Ultima I spuštěná na osmibitovém mikropočítači Apple IIe. Tato verze byla přepsána do assembleru, což se projevilo na její vyšší rychlosti a menších paměťových nárocích. Navíc došlo k vylepšení práce s grafickým režimem počítačů Apple II, což je patrné především při pohledu na postavičky, kde již nedochází k tak velkým barvovým vadám jako v původní BASICové verzi.

Ve hře Ultima (celým názvem Ultima 1 – The First Age of Darkness) se herní svět zobrazoval s využitím možností barevného grafického režimu počítače Apple II, což byl v této herní oblasti poměrně velký skok kupředu. Graficky i způsobem pohybu po herním světě se Ultima podobala původním deskovým hrám, ovšem při pohybu v podzemí (vlastní dungeony) došlo k přepnutí na jednoduchý 3D pohled (bez skrývání hran za protivníky, což by celý algoritmus 3D zobrazení komplikovalo). Původní verze této hry byla naprogramována v AppleSoft BASICu (ostatně právě proto se o ní v tomto článku zmiňujeme), ovšem v roce 1986 došlo k jejímu přepsání do assembleru. V rámci přepisu se hra taktéž vylepšila po technické stránce, například došlo k lepšímu využívání vlastností grafického režimu počítačů Apple II (vznik různobarevných skvrn pro některé barevné kombinace pixelů díky Wozově netradiční práci s normou NTSC).

Obrázek 4: Úvodní obrazovka hry Mystery House vytvořené duem Roberta Williams a Ken Williams.

Další známou aplikací (opět hrou, což je možná příznačné), která byla v roce 1980 vytvořena s využitím programovacího jazyka BASIC, je hra Mystery House vydaná firmou On-Line Systems, jež se později přejmenovala na známější Sierra On-Line. Jedná se o první hru typu adventure, v níž se namísto textového popisu jednotlivých lokací používalo grafické zobrazení a právě z tohoto důvodu (díky Mystery House totiž vznikla zcela nová herní kategorie grafických adventur) ji někteří autoři zařadili mezi sto nejdůležitějších počítačových her všech dob. Tuto hru vytvořili manželé Roberta Williams (nápad, scénář, grafika) a Ken Williams (programování), kteří se později podíleli na známějších hrách King's Quest, Space Quest, Phantasmagoria atd. Mystery House byla určena, podobně jako výše zmíněná Ultima, pro osmibitové počítače Apple II, což není překvapivé, když si uvědomíme, že tyto počítače měly před ostatními úspěšnými osmibitovými mikropočítači několikaletý náskok.

Obrázek 5: Osobitý grafický styl hry Mystery House, v němž například není dodržena perspektiva nebo poměr velikostí jednotlivých předmětů.

Při pohledu na screenshoty hry Mystery House na první pohled zaujme grafické vyobrazení jednotlivých lokací, které se značně odlišuje od pozdějších grafických adventur firmy Sierra On-Line. Kvůli omezenému místu na disketě (médiu, na němž byla hra dodávána) byly totiž všechny obrázky uloženy ve vektorové podobě, takže jejich předlohy byly narýsovány s ohledem na to, aby celkový počet vektorů (úseček) byl co nejmenší. Navíc byly obrázky v Mystery House z více než 90% tvořeny černým pozadím, což plně korespondovalo s atmosférou hry (jedná se totiž o kombinaci detektivky a hororu). Pozdější grafické adventury již mohly využívat větších paměťových kapacit, takže se u nich začíná objevovat „pravá“ rastrová grafika. Pro manžele Williamsovy znamenala tato hra skutečnou výhru – prodalo se jí více než deset tisíc kopií, přičemž každá kopie stála 24,95 dolaru a náklady na distribuci byly v USA poměrně malé. Právě díky tomu mohl začít vývoj dalších her, tentokrát již s využitím týmu programátorů a grafiků.

Obrázek 6: Japonská verze hry Mystery House s pozměněnou grafikou, která byla vydaná pro počítače řady MSX.

3. Osmibitová herní konzole Atari 2600

Programovací jazyk BASIC se díky své jednoduchosti (myšlena je zde jak jednoduchost pro uživatele – programátory, tak i jednoduchost při implementaci samotného interpretru) nepoužíval pouze na domácích osmibitových mikropočítačích a posléze i na osobních počítačích, ale i na mnoha dalších více či méně obskurních zařízeních, které se mnohdy ani jako plnohodnotný počítač označit nedala. Příkladem mohou být některé programovatelné kalkulačky. V této kapitole se ovšem zmíníme o možná ještě zajímavějším použití BASICu – jedná se o BASIC, který byl vyvinut pro slavné osmibitové herní konzole Atari 2600 (v některých ohledech se jedná o nejzajímavější herní konzoli, která kdy byla vyrobena). Před popisem BASICu, který pro Atari 2600 vznikl, je vhodné se zmínit o některých technických parametrech této herní konzole, protože teprve při jejich znalosti nám bude jasnější, jaká omezení museli tvůrci BASICu a vlastně i programátoři všech her určených pro tento stroj překonat.

Obrázek 7: Herní konzole Atari 2600.

Po obvodové stránce je konzole Atari 2600 navržena přísně minimalisticky, aby ji bylo možné nabízet za co nejnižší cenu. Na plošném spoji můžeme kromě několika aktivních a pasivních součástek s nízkou integrací najít tři důležité čipy – mikroprocesor MOS 6507 (což je varianta již dříve popsaného mikroprocesoru MOS 6502 se zmenšenou šířkou adresové sběrnice), kombinovaný obvod MOS 6532 (obsahující paměť RAM, časovač a vstupně/výstupní porty) a především zákaznický obvod TIA, který se staral o vytváření grafiky i zvuků. Kapacita paměti RAM byla rovna pouhým 128 bajtům, do kterých se započítává i kapacita zásobníku. Paměť ROM byla umístěna v zasunovacích cartridgích s hrami a aplikacemi (kapacita této paměti se pohybovala v rozsahu 4 kB až 32 kB, ovšem vyšší kapacitu bylo nutné rozdělit do několika banků, protože adresová sběrnice mikroprocesoru byla snížena na pouhých 13 bitů). I s těmito velmi skromnými prostředky vzniklo pro tuto herní konzoli několik tisíc her, z nichž mnohé se proslavily svou kvalitou (pokračování PacMana, Frogger, Pitfall), jiné se zase řadí mezi nejhorší hry, které kdy byly vyrobeny (E.T., Caster's Reven­ge).

Obrázek 8: Schéma zapojení herní konzole Atari 2600.

4. Generování obrazu na herní konzoli Atari 2600

Zajímavý je i princip generování grafického obrazu na této herní konzoli, především z toho důvodu, že v ní nebyl implementován klasický framebuffer (a ani nemohl být kvůli již zmíněné kapacitě operační paměti pouhých 128 bajtů). Vzhledem k absenci framebufferu a tomu, že se obraz generoval na rastrové televizní obrazovce, musel být elektronový paprsek při vykreslování obrazu ovlivňován programově. Teoreticky je sice možné přímé řízení intenzity paprsku (či trojice paprsků u barevné obrazovky), to by však bylo možné pouze v případě velmi přesného časování – i malé časové odchylky při změně barvy paprsku by totiž znamenaly, že se jednotlivé obrazové řádky navzájem posunou. I z tohoto důvodu byla herní konzole Atari 2600 vybavena čipem TIA, který se mj. staral i o generování grafického obrazu, přesněji řečeno o vykreslování jednotlivých obrazových řádků s ohledem na přesné časování. Podobně jako u obrazu, i při práci se zvukem byly v TIA využívány polynomické čítače (poly counters), o nichž jsme se již zmínili při popisu (nejenom) zvukového čipu POKEY.

Obrázek 9: Hra Outlaw pro herní konzoli Atari 2600. Tato hra je určená pro dva hráče, což bylo na těchto herních konzolích obvyklé – kapacita operační paměti byla minimální a i výkon mikroprocesoru nedostačoval pro implementaci dostatečně kvalitního počítačem řízeného protihráče.

Celý obrazový řádek složený ze 160 pixelů byl pomocí čipu TIA generován na základě šestice údajů – pozice hráče 0, pozice hráče 1 (jednalo se o klasické osmipixelové sprity, jejichž horizontální šířka mohla být vynásobena dvěma, čtyřmi či osmi), pozice střely 0, pozice střely 1 (jednopixelové sprity, opět s volitelnou šířkou), pozice míče/ball (jednopixelový sprite s možností vertikálního posunu o jeden řádek) a pozadí (což je 20bitový vzorek, který mohl být v pravé polovině obrazovky horizontálně zrcadlen). Programátor přitom mohl před vykreslením každého obrazového řádku změnit horizontální pozice hráčů, střel i míče, modifikovat jejich barvu, popř. i bitový vzorek hráčů a pozadí. Výše naznačený způsob vytváření rastrové grafiky sice na první pohled vypadá složitě (minimálně kvůli nárokům na přesnost časování při zápisu do jednořádkového bufferu pozadí), na druhou stranu však programátorům kteří překonali prvotní potíže přinášel poměrně velkou flexibilitu.

Obrázek 10: Hra Frogger ve verzi pro herní konzoli Atari 2600 vypadá – samozřejmě s ohledem na schopnosti této konzole – velmi pěkně.

Zatímco jakákoli změna ve framebufferu (obrazové paměti) většinou znamenala nutnost přesunu relativně velkých bloků paměti, byla tvorba podobného efektu na systému bez framebufferu velmi jednoduchá a neznamenala větší zátěž pro mikroprocesor, než při generování statického obrázku. Proto jsou například hry určené pro herní konzoli Atari 2600 (která tímto systémem tvorby grafiky disponovala jako jeden z mála široce rozšířených systémů s mikroprocesorem) mnohdy plné pohybujících se objektů, protože mikroprocesor byl zatížen prakticky stejně jak při neustálém vytváření jedné neměnné scény, tak i při tvorbě scény, ve které se objekty pohybují. Možná by bylo zajímavé podobný grafický subsystém vytvořit s využitím soudobých komponent, protože dnešní mikroprocesory mají více než dostatečný výpočetní výkon pro programovou tvorbu grafiky a dobře navržený systém přerušení (popř. jednoduchý jednořádkový framebuffer doplněný o sprity) by mohl zajistit potřebnou kooperaci mezi podprogramem určeným pro vykreslování a zbylými aplikacemi.

Obrázek 11: Cartridge s interpretrem jazyka BASIC pro herní konzoli Atari 2600.

5. BASIC na herní konzoli Atari 2600

Kromě poměrně zásadních technických limitů, které museli tvůrci aplikací pro herní konzoli Atari 2600 překonat, bylo nutné vyřešit i způsob ovládání těchto aplikací, protože Atari 2600, podobně jako mnohé další herní konzole, neobsahovala plnohodnotnou klávesnici, která by zbytečně zvyšovala jak cenu konzole, tak i její poruchovost. Kromě různých speciálních ovladačů dodávaných většinou přímo s hrami se ustálilo použití tří typů ovládacích zařízení – paddle (potenciometry připojené na A/D převodník zabudovaný v počítači – jedná se o jedny z prvních absolutně polohovatelných vstupních zařízení vůbec), digitální osmisměrové joysticky (populární prakticky na všech osmibitových domácích počítačích i herních konzolích) a takzvané keypady, což byly jednodušší verze klávesnice obsahující pouze omezený počet kláves/tlačítek. Právě dvojice keypadů byla použita firmou Atari pro práci s jejím interpretrem programovacího jazyka BASIC.

Obrázek 12: Ovladače Atari 2600 typu keypad upravené pro práci s interpretrem jazyka BASIC.

Tyto keypady jsou zobrazené na dvanáctém obrázku, z něhož je možná patrné, že každá klávesa (či spíše tlačítko) má až čtyři různé funkce volené tlačítkem s barevnými šipkami. Způsob zadávání programu byl podobný způsobu, který znají majitelé ZX Spectra a jeho klonů, ovšem s tím rozdílem, že BASIC pro Atari 2600 byl mnohem primitivnější než jeho „konkurent“ na ZX Spectru (a vlastně i na jakémkoli jiném osmibitovém mikropočítači). Na Atari 2600 bylo možné psát jen velmi krátké programy s délkou maximálně několik programových řádků, což je ovšem pochopitelné když si uvědomíme, že jak proměnné interpretru, tak i vlastní tokenizovaný program musely být uloženy v pouhých 128 bajtech operační paměti. I přesto se však jednalo o první programovací jazyk, s nímž se mnozí uživatelé ve svém životě setkali, protože firma Atari ho vydala již v roce 1979 (zlé jazyky tvrdí, že byl tento jazyk vydán jen proto, že firma Atari svoji herní konzoli prezentovala jako programovatelný počítač, takže kdyby pro ni žádný jazyk neexistoval, hrozily by – prý – žaloby).

Obrázek 13: Velmi jednoduchý BASICový program napsaný na Atari 2600.

Vzhledem k různým technickým omezením herní konzole Atari 2600 neobsahoval BASIC plnohodnotný editor ani mnohé příkazy, které se v jiných dialektech BASICu používaly pro vylistování programu, změnu hodnot proměnných atd. Namísto toho bylo použito „vývojové prostředí“ horizontálně rozdělené na několik oblastí, které bylo možné v případě potřeby skrývat – viz též screenshoty zobrazené na obrázcích číslo 13 až 16. Program se zapisoval, jak již bylo naznačeno v předchozím textu, pomocí klíčových slov zadávaných přes dvojici keypadů, editace již jednou zapsaného programového řádku byla možná pouze na základní úrovni (nejjednodušší bylo řádek znovu přepsat). Pokud byl program spuštěn, bylo možné měnit rychlost provádění jednotlivých příkazů. Taktéž možnosti samotného BASICu byly poměrně omezené, například bylo možné použít jen celočíselné proměnné s jednoznakovými identifikátory, k dispozici byly jen základní řídicí konstrukce typu IF, GOTO atd.

Obrázek 14: Různé podoby „vývojového prostředí“ BASICu pro Atari 2600.

Celý Atari 2600 BASIC byl uložen na cartridgi s kapacitou 4 kB, takže se celkem logicky objevily spekulace, jak kvalitní by interpret byl v případě, že by se použila cartridge s kapacitou 8 kB, 16 kB či dokonce „supercartridge“ s kapacitou 32 kB. Ovšem vzhledem k neúspěchu celého projektu „BASIC pro Atari 2600“ již nedošlo k dalšímu vylepšování možností tohoto programovacího jazyka a firma Atari se v následujících letech soustředila na vývoj her a posléze i na vývoj plnohodnotných osmibitových domácích mikropočítačů (Atari 400, Atari 800, Atari 800XL, Atari 130XE atd.), kde byl použit zcela odlišný interpretr jazyka BASIC než na Atari 2600.

6. Ukázkový program pro Atari 2600

V této kapitole si ukážeme velmi jednoduchý program, který bylo možné spustit v interpretru BASICu na Atari 2600. Tento program po svém spuštění tiskne na obrazovku neustále se zvyšující hodnotu proměnné A. Povšimněte si, že i když se jedná o velmi jednoduchý (až primitivní) program, uživatelé se při jeho studiu mohli seznámit s takovými pojmy, jako je „proměnná“, „hodnota proměnné“, „řízení toku programu“ atd.:

1 Print "A" 2 Print "IS" 3 Print A 4 A!A+1 5 Clear 6 Goto 1

Obrázek 15: Další podoba vývojového prostředí BASICu na Atari 2600.

7. Grafická plocha a způsob jejího využití

Jednou ze zajímavých vlastností BASICu pro herní konzoli Atari 2600 byla i existence takzvaného grafického regionu (graphics area), v němž se nacházela dvojice „hráčů“ představovaná červeným (u PAL verze spíše oranžovým) a bílým čtverečkem. Tyto hráče bylo možné programově ovládat, tj. měnit jejich horizontální a vertikální pozici změnou hodnot speciálních proměnných nazvaných Hor 1, Hor 2, Ver 1 a Ver 2). Navíc bylo možné pomocí predikátu Hit otestovat, zda jsou oba hráči v kolizi. I s takto primitivními grafickými prostředky (stěží si můžeme představit něco ještě jednoduššího a přitom skutečně použitelného) však bylo možné vytvořit jednoduché hry, grafická dema či dokonce i simulaci náhodného pohybu nebo napodobení funkce osciloskopu (čtení a a zobrazení hodnoty paddle). Následující program ukazuje použití grafického regionu i příkazů pro ovládání obou „hráčů;“ s následným testem, zda došlo k jejich kolizi (pokud ano, je zahrán jednoduchý zvuk):

1 Hor 1!Hor 1+6 2 Ver 1!Ver 1+8 3 Hor 2!Hor 2+4 4 Ver 2!Ver 2+4 5 If Hit Then Note!2 Else Note!7 6 Goto 1

Obrázek 16: Součástí BASICu pro Atari 2600 byla i grafická plocha použitelná například pro tvorbu jednoduchých her. Při inicializaci grafiky leží oba hráči na sobě, takže je viditelný jen hráč číslo 1 (červený popř. oranžový čtvereček).

8. Obsah následující části seriálu

V následující části seriálu o architekturách počítačů a jejich programovém vybavení si popíšeme šestici dialektů programovacího jazyka BASIC používaných na šestnáctibitových mikropočítačích kompatibilních s IBM PC i na jeho následovnících. Bude se jednat o interpretr IBM Cassette BASIC (vytvořený firmou Microsoft a licencovaný IBM), IBM BASICA (základní BASIC pro počítače PC vybavené disketovou jednotkou či pevným diskem), dále o GW BASIC (rozšíření obou předchozích interpretrů), GFA BASIC (slavnější spíše na počítačích Atari ST), a taktéž o známý interpretr QBasic a překladač Quick Basic.

Obrázek 17: Původní interpretr BASICu firmy IBM pro počítače PC XT.

Obrázek 18: Překladač Turbo Basic firmy Borland.

Obrázek 19: Vývojové prostředí QBasicu.

Obrázek 20: Quick Basic byl plnohodnotný překladač BASICu, na rozdíl od QBasicu, který dokázal programy pouze interpretovat.

9. Odkazy na Internetu

Leave a Comment