Basic pro Tesla Ondra SPO-186: (1) Počátek

První díl: Vraťme se k Basicu pro Ondru.

Ano, citoval bych sám sebe, kdybych uvedl, že pro mikropočítač Tesla Ondra SPO-186 byl sice při jeho uvedení vydán interpret programovacího jazyka Basic, ale Basic EXP v 5.0/G byl určen pro operační systém MIKOS.
Ovšem z aktivity různých institucí, jako Komenium a Zenitcentrum, vyšel nový systém Centrum 1000 (ViLi ROM, SSM ROM ’87) a Ondra se tak ocitl bez Basicu.
Ze slibovaných programovacích jazyků pro SSM ROM ’87 byl uskutečněn Pascal a assembler.

Na Lisp, Prolog a Basic jsme čekali dosud.

Vyjmenujem si některé výhody a nevýhodu jazyka Basic EXP:
Jedná se o Microsoft Basic. Klíčová slova příkazů tokenizuje už při odeslání napsaného řádku a tím nejen zkracuje zápis zdrojového textu, ale i urychluje provádění. Analýza klíčových slov probíhá při psaní programu, kdy počítač čeká na člověka, a programátor si ani nevšimne, že po odeslání řádku nějaká tokenizace proběhla. Při provádění programu pak už nemusí počítač zkoumat, o jaký zápis klíčového slova se jedná – prostě podle kódu tokenu skočí na adresu v připravené rozeskokové tabulce.
Pokud není příkaz uvozen klíčovým slovem, jedná se o přiřazení bez uvedeného klíčového slova LET. Tento test se provede ještě předtím, než se rozklíčuje hodnota očekávaného tokenu, provedení přiřazení bez uvedeného LET je tedy nepatrně rychlejší, než s uvedeným LET (jak zjistil Factor 6).
Klíčová slova jsou zastoupena tokeny s kódem větším než 127 a bohužel tak kolidují s českými znaky. Při výpisu programu je pak potřeba rozeznávat, zda se jedná o token (a je třeba jej rozepsat) nebo o český diakritický znak.
Basic EXP to řeší tím, že před znaky češtiny je “detokenizující token”, který počítači říká, že následující token není token a že má místo rozepisování jen vypsat znak dané hodnoty. Tento “detokenizující token” musí ale uživatel zadávat ručně z klávesnice před každým zadaným českým znakem (zkuste tak napsat PRINT “Příšerná příšera příšerně vřeštila”. Přesněji PRINT “P_ř_í_šerná p_ř_í_šera p_ř_í_šern_ě v_ře_štila”. Je to nezvyk).
Ondra je za běhu zpomalován svým “videoprocesorem” a procesor není bržděn jen tehdy, kdy videoprocesor sestavený z čipů 8253 nepřistupuje do VideoRAM (prakticky při zpětném běhu paprsku a při “nezobrazování” některých mikrořádek – Ondra jich umí zobrazit až 255, přičemž ViLi ROM jich defaultně ukazuje 252 a MIKOS 240 – tedy teoreticky by měl být program běžící pod MIKOSem o těch 12 “nezobrazovaných řádek” rychlejší).
Kromě mírné redukce zobrazovaných mikrořádek, která je přednastavena v systému, nepoužívá Basic EXP žádná zvláštní urychlení.
Zvláště scroll obrazu je velmi pomalý, Basic nezná režimy FAST (s vypnutým zobrazováním) a SLOW, ty by si musel zařídit uživatel podprogramem ve strojovém kódu nebo zásahy do nastavení videoobvodů.
Ostatně to ukazuje i Logoutův retrobenchmark, kde Ondra s Basicem EXP patří k nejpomalejším strojům.

To samozřejmě neznamená, že by Basic EXP v5.0/G byl špatný Basic, naopak si někdo dal sakra velkou práci s převodem Microsoft Basicu včetně úpravy grafických příkazů pro neobvyklý hardware Ondry. A výhodou je shoda s některými a podobnost zas s jinými verzemi Microsoft Basicu.
Koneckonců i Basic-6 na IQ-151 a Basic G na IQ-151, PMD-85 a PP-01 jsou 8080 varianty Microsoft Basicu (konkrétně NASCOM Basicu).

Ale co teď, s ViLi ROM?

ViLi ROM je psána tak, že systém zůstává v ROM, která je odstránkována, v RAM má natahány jen krátké rutiny na začátku paměti (obsluha systémových volání pomocí RST instrukcí) a před VideoRAM (stránkovací rutiny, systémové proměnné a buffery). ROM se přistránkuje jen při volání systémových služeb.
MIKOS naopak po zapnutí počítače zkopíruje obsah své ROM do RAM a běží pak už jen v RAM.
To umožnilo vytvořit pro ViLi ROM program MIKOS, který nahraje do RAM MIKOS a spustí jej, jako by se MIKOS zkopíroval normálně z ROM. A je tedy možné do něj nahrávat programy pro MIKOS určené, třeba Basic EXP.
To by ale znamenalo, pokud chci nahrát program v Basicu, nahrát nejdřív MIKOS, potom nahrát interpret Basicu a potom nahrát samotný program v Basicu.
Takovou prudu asi neskousne každý (pamatuju se, jak jsem nadával u SAPI-1, že musím nahrávat Basic, tehdy Basic EX 4.0, z pásky, a pak převíjet kazetu ke svým programům, které chci nahrát, zatímco MikroBasic je k dispozici v ROM hned při zapnutí).

Navíc proramy pro ViLi ROM jsou trochu více optimalizované. Scroll obrazu je rychlejší, než v MIKOSu, navíc některé programy při posunu obrazu o řádek zobrazování vypínají, takže sice obraz trochu problikne, ale posun je hotov mnohem rychleji.
Pokud tedy Basic pro ViLi ROM (systém Centrum 1000), tak pořádně, aby využíval vymoženosti, které systém nabízí: možnost použití češtiny, systémové služby včetně obsluhy oken, celoobrazovkový nebo řádkový editor se standardními editačními klávesovými zkratkami, které využívá většina programů pro Ondru shodně.
Ondra je navíc český počítač, takže by měl umožňovat psát jednoduše češtinu tak, jak je to implementováno v systému a dalších programech (Ondra navíc podporuje i z klávesnice nedostupné znaky, jako přehlásky a další paznaky; nezkoumal jsem, zda podporuje kompletní slovenštinu, ale je to pravděpodobné).

Zde tedy bylo několik možností, jak zoufalou situaci a hlad po Basicu na Ondrovi vyřešit:

1) převést Basic EXP z MIKOSu do ViLi ROM.
Znamená to projít si systémové služby MIKOSu, jejich alternativy ze SSM ROM ’87, srovnat parametry, které se těmto službám mají předávat, upravit v programu “meziplatformní” rozdíly (třeba rozsah grafických souřadnic) a na více než 13kilové binárce Basicu to všechno upravovat.

2) Na pomoc si můžeme vzít zdroják NASCOM Basicu, což je asi jediný dochovaný zdroják Z80 verze Microsoft Basicu.
S ním se bude Basic EXP upravovat snáze.
Bohužel jiný zdroják Z80 verze Microsoft Basicu není k dispozici (ani “standardního” MSX Basicu).

3) Bylo by možné i udělat to naopak, neohlížet se na starou implementaci Basicu EXP 5.0/G, vzít NASCOM Basic jako základ a upravit jej pro Ondru.
Znamená to řešit stejné potíže, jako autor původní konverze Basicu EXP (například problém s tokeny versus českými znaky), ovšem s tou výhodou, že se dá přihlédnout k řešení použitému v Basicu EXP.
Znamená to vyznat se ve zdrojáku dlouhém přes 220 kB!
Převodem vznikne víceméně standardní Microsoft Basic.
O “kvalitě” práce Billa Gatese (i když dal dohromady úctyhodný a promyšlený kousek software) hovoří mnou dokola omílaná historka o vytvoření emulátoru MSX pro Sord m5:
Vezmete ROM s MSX Basicem, potřebujete v ní volné místo pro přidání rutin emulátoru, které místo hardware MSX budou používat hardware Sordu.
Místo získáte tak, že si vyberete libovolnou rutinu, napíšete ji po svém tak, aby dělala to samé, co předtím. Většinou zjistíte, že má proti původní asi jen poloviční délku.
Takhle upravíte několik rutin a máme dost volného místa pro vytvoření emulátoru.

4) Vzít zdroják jiného Z80 Basicu a použít ten místo Microsoft Basicu s jeho neduhy.
Bohužel, třeba BBC Basic, který je neuvěřitelně dobrý a rychlý, a opět se jedná o standardní a multiplatformní Basic, v Z80 verzi nemá dostupný zdroják. To je ta komerce.
Je sice k dispozici binárka pro CP/M, kde si můžete upravit hardwarově závislé rutiny, al eznamenalo by to napsat si vrstvu, která bude emulovat CP/M a převádět CP/M volání na volání služeb ROM Ondry.
Existuje disassembling Basicu pro Sord m5, který s Microsoftem nemá nic společného a firma Sord si jej vytvořila sama.
Zde máme na výběr: celočíselný Basic-I pro začátečníky (v originále 8 kB), Basic-G pro tvorbu her s podporou grafiky a zvuků (16 kB) a Basic-F s plovoucí desetinnou čárkou určený na vědecké výpočty (v originále úctyhodných 20 kB).
Bohužel, zdrojáky jsou spíš nekomentované než komentované, a jsou vázané na osmikilovou Monitor ROM Sordu, jejíž rutiny Basic využívá (takže softwarová základna Basicu F je vlastně celkem 28 kB kódu!).

5) taky je možné se na to úplně vysrat.
Nebo rezignovat na Basic a převést na Ondru raději třeba FOCAL (což je velmi jednoduchý jazyk podobný hodně okleštěnému Basicu – pro ukázku, takový Lunar Lander ve Focalu).

Vraťme se k bodu 4.
Je tu ještě jedna skupina Basiců, podobných trochu tomu Focalu.
Vzpomeňme si na MikroBasic pro SAPI-1.
Je to varianta Tiny Basicu – takových vznikla celá řada (časopis “Dr. dobb’s journal of Tiny BASIC Calisthenics & Orthodontia”, vycházející od roku 1976, byl různých implementací těchto Tiny Basiců, jak název napovídá, plný).

Prostě v té době byl člověk rád za procesor a starý terminál, RAMka byla drahá (hlavně SRAM, kterou si amatéři snáze osadili ve své konstrukci, narozdíl od DRAM s trochu dost složitější obsluhou) a dvoukilová EPROM stála Meiland (jak se tak hezky česky dí).
Takže Basic se musel vejít nejlépe do ničeho, nejlépe když nevyužíval ani žádnou RAM, stačilo, že uměl aspoň něco a kdo toho něčeho do něj dokázal nacpat víc, byl větší borec.

Specifikace Tiny Basicu vznikla v roce 1975 (bohužel příslušný článek je dodnes placený).

Většinou takový Basic pracuje jen s celými čísly signed integer word (-32767..32767) a neumí pracovat s textovými řetězci (kromě příkazu PRINT a použití textového promptu pro INPUT čísla).
Čím víc Basic zabírá v paměti, tím víc toho umí – 4kB implementace (Apple-I Integer Basic od Woze nebo 4kB Altair Basic od Microsoftu) toho umí i víc – řetězce nebo plovoucí desetinná čísla.
Trochu specifická je implementace řetězců v MikroBasicu na SAPI – je tam použita pointerová “řetězcová” funkce I$ a O$.
I$ funguje jako INPUT, od zadané adresy ikládá vkládaný text. O$ zase vypíše text uložený v paměti na zadané adrese.

Takže, co si budeme nalhávat:
Pořádný Basic pro Ondru s ViLi ROM žádný nemáme.

Pokud ho chceme, musíme co?
MUSÍME SI HO SAMI NAPSAT.

A to je přesně to, co jsem udělal.
Začal jsem si psát Basic pro Ondru.
(Copyright Zenitcentra ve videu byl jen taková legrácka, abych vás zmátl.)

Pro implementaci se Tiny Basic jako základ hodí.
Zdroják, ze kterého lze vycházet, je krátký a tudíž obsáhnutelný, přehledný.
Po převedení základu je možné přidávat si vlastní příkazy, i ty pro Ondru specifické, podle potřeby.
Převedením Tiny Basicu na Ondru demonstrujeme, že je něco takového vůbec možné, a kdo má chuť, může se pak inspirovat a pustit se do implementace něčeho složitějšího a náročnějšího.

Navíc jednoduchý základ programovacího jazyka, který nezabírá moc tolik potřebné paměti, usnadní vytváření samostatného kódu, který by mohl existovat nezávisle na samotném interpretu Basicu.
Vytvořený program nebo hru by si uživatel rovnou po zapnutí počítače nahrál jako soubor typu KÓD a ten by se mu spustil.

Jednotlivé myšlenkové kroky, jak postupně přicházejí, lze shrnout takto:

1) uděláme aspoň něco jednoduchého, ale ne zas moc jednoduchého, žádný FOCAL, ale opravdu Basic.
Ať se někdo inspiruje a udělá pak pořádný Basic.

2) když už to děláme, ať je to použitelné i na tvorbu her, protože co jiného bude kdy kdo psát v Basicu na Ondrovi?
Takže příkazový aparát musí umožňovat aspoň tvorbu textovek, a měl by být v tom lepším případě schopen aj pracovat s grafikou včetně spritů a číst klávesnici a joystick tak, aby se to dalo ve hře využít.

3) A když už je to jen jednoduchý základ, a ne plnotučný Basic s řetězci a plovoucí desetinnou čárkou, tak ať je to tedy aspoň výhledově schopné toho vytváření samospustitelného kódu.

Tak, a pokračování příště…