Tesla Ondra SPO-186: Píšeme zdrojové texty

Integrované vývojové prostředí TOOL-80.
Obsahuje assembler, disassembler, editor PEdit a tracer.
Editor PEdit lze využít i pro psaní zdrojových textů pro jiné jazyky, ale TOOL-80 na Ondrovi je primárně určen pro vývoj programů v assembleru procesoru Intel 8080.
Na SAPI-1 existovaly ale i crossassemblery, jako TOOL-48 pro tvorbu programů pro procesory řad Intel 8048, a další. Ovládání všech, vzhledem k tomu, že se lišila v podstatě jen instrukční sada a některé detaily v traceru, je navzájem podobné.

.Pokud se ptáte, proč vývojové prostředí pro Ondru, který obsahuje procesor Z80 (přesněji U880D), obsahuje assembler pro 8080, je to dáno hlavně historickými souvislostmi. SAPI-1, na kterém předchozí verze TOOLu vznikaly, bylo originálně osazeno 8080 (Z80 verze se objevila až později) a tak i assembler pro něj určený pracoval s instrukční sadou 8080 a mnemonikou Intelu (místo jednodušší mnemoniky Zilogu).
Při převodu programového vybavení ze SAPI na Ondru, které si už tak vyžádalo dost změn (vytvoření nového programu TEdit ze základů postavených na PEDITu, úprava monitoru se zcela novými rutinami pracujícími s klávesnicí, magnetofonem a obrazovkou), zřejmě nebyl čas vytvořit iassembler a ladící prostředky pracující s instrukční sadou a rozšířenou sadou registrovou procesoru U880D.
Autoři to navíc zdůvodňují i tím, že většina tehdejších počítačů, PMD-85, IQ-151, PP-01, SAPI-1 i průmyslové SM 50/40 a SAPI-80, obsahovala 8080, který byl tak u nás nejrozšířenější a znalost jehoinstrukční sady tedy didakticky výhodnější.

Vzhledem k tomu, že editor Pedit a celý prostředek TOOL je původně pro SAPI-1, drží si některá specifika programů pro tyto počítače,v době vzniku Ondry už vlastně zastaralé.
Původní klávesnice pro SAPI, ANK-1, je (Eda Smutný měl asi rád standardy) matice ze Sinclair ZX-80/81. Plus tři “speciální tlačítka” (reset, NMI a “programovatelné” tlačítko “T” čitelné na separátním portu), tedy bez kurzorových šipek. Pozdější úpravy s klávesnicemi ze Zbrojovky byly napůl neoficiální a vyžadovaly upravenou ROM (MIKRO BASIC, MIKOS nebo BIOS), a jejich speciální vymoženosti, jako různá tlačítka navíc, se moc nepoužívaly, klávesnice Consul 259.11 ani šipky neobsahovala a ty se tak objevovaly jen na klávesnici Consul 262.3 dodávané k sestavám ZPS-3. Jen některé programy, jako třeba Karel pro SAPI od Honzy Kopince, využívaly třeba čísla z numerické klávesnice místo šipek (jako když se na PC vypne NumLock).
Ondra sice šipky má, a jsou dobře využity v ROMce psané Vítem Libovickým (viz celoobrazovkový editor v ROM), při portaci software ze SAPI byly ale využity jen částečně.

Je potřeba si přiznat, že, vzhledem ke kořenům software kterým byl vybaven, byl Ondra v podobě, jak ho vyvinula Tesla, vlastně pro děti nevhodný, s velmi komplikovaným a složitým ovládáním, a přidání “zjednodušujícího” povelu L do MIKOSu tomu příliš nepomohlo.
A nutnost vypínání obrazu při tak důležité činnosti, jako je čtení a zápis na magnetofonovou kazetu, doslova zabíjí jinak dobrý nápad, který měl dát dětem levný, jednoduchý a grafický počítač na vzdělávání i hraní.

To je důvod, proč pro užíívání Ondry doporučuju ViLi (SSM) ROM, která přináší na Ondru jednoduché ovládání, větší komfort při obsluze klávesnice i magnetofonu a větší rychlost i lepší možnosti při práci s obrazovkou a jako bonus dokonce práci s počítačovou sítí (ale trpí na druhou stranu přílišnou jednoduchostí uživatelského interface a tak Ondra sám o sobě bez software nahraného zvnějšku pak vlastně “nic neumí”).

$$OBR404118$$

Základní menu TOOLu slouží vlastně k přepínání mezi jednotlivými částmi:

A – ASSEMBLY – vyvolá assembler
B – BEGIN – vynuluje tabulku symbolů, podmínky, zásobník a registry
C – CONDITION – nastaví podmínky traceru
D – DISPLAY – zobrazení obsahu paměti v zadaném rozsahu
E – EDITOR – skok do editoru PEDIT (stejně jako povel P)
F – FIND – vyhledání řetězce znaků (nebo posloupnosti bitů) v paměti, očekává zadání rozsahu oblasti vyhledávání, počet hledaných bytů (1-3) data (oddělená mezerami) a masku (logický součin) hledaných dat. Po stisku čárky při výpisu přejde do režimu SUBSTITUTE.
G – GOTO – start od zadané adresy s volbou breakpointů
H – HEXADECIMAL – vypočítá součet a rozdíl zadaných hexa čísel
K – KAZETA – slouží k zadání povelu MIKOSu (například K_C při manipulaci se soubory)
L – LINE – jednoprůchodový přímý assembler, překládá po jedné vložené instrukce
M – MOVE – přesun zadané oblasti v paměti do jiné
N – NULL – nuluje registry a podmínky (viz B)
P – PEDIT – skok do editoru PEDIT (stejně jako povel E)
Q – QUIT – návrat do monitoru
R – REGISTER – výpis obsahu registrů
S – SUBSTITUTE – změna obsahu paměti (šipka vlevo slouží k návratu o adresu zpět, čárka vypíše adresu, k zadání hodnoty znaku slouží jeho předznamenání apostrofem)
T – TRACE – tracer, chová se podobně jako příkaz G, respektuje nastavenou podmínku (viz příkaz C)
U – UNDEFINED – zobrazí obsah paměti v zadaném rozsahu jako text (32 znaků na řádek) (jméno jpříkazu e zvoleno podivně, ale je to dáno snahou namapovat příkaz na volnou klávesu)
V – VERIFY – spouští disassembler. Po stisku čárky při výpisu přejde do režimu SUBSTITUTE. (Jméno je zvoleno podivně, ale je to dáno snahou namapovat příkaz na volnou klávesu)
X – EXAMINE – zobrazení a změna obsahu registrů (příkaz X v monitoru má buffer pro uložení registrů jinde než příkaz X v TOOLu)
Y – VERIFY PUNCH – spouští disassembler, disassemblovaný text ale zaznamenává na kazetu (je nutno pak uzavřít soubor pomocí K_C)

Překladač (assembler) lze volat, jak bylo uvedeno, dvěma způsoby:

– povelem L, ktrý očekává vstup instrukcí z klávesnice, a překládá je jednu po druhé. Slouží hlavně pro opravy nebo vložení krátkých programů. Startovací adresa se zadává jako parametr povelu za písmenem L. Ukončení je zadáním prázdného řádku nebo instrukcí END.

– povelem A, který překládá text čtený z paměti (mód X) nebo na kazetě (mód R – READ, v tomto módu je při druhém průchodu potřeba soubor znovu postupně číst).
Po zadání módu očekává překladač v tomto režimu řízení průchodu:
1 – provedení prvního průchodu (provádí se i automaticky po zvolení módu)
2 – druhý průchod
C – druhý průchod a výpis programu na obrazovku
P – druhý průchod s výpisem po stránkách á 20 řádků, mezi stránkami čeká na stisk mezerníku
S – vypíše tabulku symbolů s přiřazenými hodnotami
N – NO LIST – při druhém průchodu vypíše pouze chyby
K – ukládá výpis programu do souboru na kazetu (nutno uzavřít soubor povelem K_C), pracuje v X módu
Q – QUIT z assembleru do TOOLu
enter – QUIT z assembleru do TOOLu
CTRL+P – zapne nebo odpojí tiskárnu.
Při komunikaci s tiskárnou si dávejte pozor, protože není-li připojena, Ondra se zasekne (čeká na připravenost neexistující tiskárny).
Tomu se lze vyhnout tak, že tiskárenský ovladač v systému nahradíte instrukcí RET. Pomocí CTRL + W vyskočte do monitoru, příkazem S (SUBSTITUTE) změňte na adrese 10F instrukci C3 na C9 (S_10F_C9).

Instrukční sadu procesoru Intel 8080 si tu rozebírat nebudeme.
Podíváme se ale na pseudoinstrukce a zápis některých dalších věcí, které je assembler schopen zpracovat:

Znaky se zapisují do apostrofů.
$ značí ukazatel aktuální adresy.
Čísla se zapisují dekadicky (1000), binárně s příponou B (101B) nebo hexadecimálně s příponou H tak, aby prvním znakem bylo číslo a ne písmeno (10H, 0FFH).
Tabeluje se šipkou doprava.

Známé výrazy jsou:
+ – součet
– – rozdíl
* – násobení
/ – celočíselné dělení
HIGH – horní byte
LOW – dolní byte
NOT – negace
AND – logický součin
OR – logický součet
XOR – nonekvivalence
SHR – posun o 0-15 bitů doprava
SHL – posun o 0-15 bitů doleva
Unární jsou pouze operátoryHIGH, LOW, NOT, případně ve významu znaménka i + a -.

EQU – přiřazuje hodnotu výrazu
DB – vkládá hodnoty (výsledky výrazů) nebo řetězce textu (v apostrofech) jako byty
DW – vkládá hodnoty (výsledky výrazů) jako dvoubajty, při zadání textu (v apostrofech) ukládá 2 znaky přehozeně (delší texty nebere)
Výraz a řetězec ale nemohou být na jednom řádku.
DS – přeskočí daný počet bytů
END – konec zdrojového textu
LIST – povolí výpis při překladu
XLIST – zruší výpis, budou se zobrazovat jen chyby
ORG – nastaví ukazatel adres. Pokud je na řádku návěští, přiřad semu hodnota ještě před provedením ORG.
Pokud není ORG v programu použita, dosadí se 1000H. Pokud bude ORG jiná (třeba 7000H), ukládá se kód od adresy 1000H a na správnou adresu je možné přesunout ho dodatečně (pomocí povelu M), tím se ale nejspíš přemaže zdrojový text nebo TOOL samotný.
TITLE – poznámka na začátku programu, není-li uvedena,musí text začínat prázdnou řádkou
IF, ELSE, ENDIF – po vyhodnocení výrazu podmínky,je-li nenulový, přeloží se obsah mezi instrukcemi IF a ELSE, a je-li nulový, mezi instrukcemi ELSE a ENDIF.
Podmínky nelze vnořovat.
Například:
DEBUG EQU 0

IF DEBUG
RAM EQU 4400H

ELSE
RAM EQU 0C00H

ENDIF

Assembler hlásí tyto jednopísmenné chyby:
U – UNDEFINED – nedefinovaný symbol nebo neznámá instrukce
O – OPERAND ERROR – chybný operand
M – MULTIPLE DEFINITION – vícenásobná definice
L – LABEL ERROR – chyba v návěští
F – FULL – plná tabulka návěští
W – WARNING – výsledná délka kódu je větší než 4 kB, nevejde se do volného místa v paměti (v módu X).
X – EXPRESSION ERROR – chyba ve výrazu

Je načase připomenout, že rozložení TOOLu v paměti Ondry je takovéto:
0000
monitor a MIKOS
1000
přeložený program, 4 kB
2000
TOOL-80
5800
zdrojový text
MEMTOP
CE7F
buffery MIKOSu
D000
font (+ případně nahraná čeština)
D700
VideoRAM
FFFF

Z toho vyplývá, že lze překládat pouze programy do výsledné velikosti 4 kB (což je současně velikost tehdy dostupných EPROMek).

Podíváme se teď na samotný editor PEDIT:

PEdit je hodně podobný TEditu v módu MAIN.
Kromě psaní programů v assembleru (kdy je největší povolená délka řádku 80 znaků) ho lze použít ke psaní zdrojových textů třeba Basicu (pro BASIC EXP lze používat délku řádku až do 132 znaků) a jiných programovacích jazyků (v samotném PEditu je délka řádku teoreticky neomezená).
Povely se, stejně jako v Teditu, zadávají tak, že se uvede nejprve parametr (místo čísla od -65535 do +65535 lze zadat znak #, který představuje nejvyšší přípustné číslo, tedy +65535, a znamená vlastně “vše”), pak vlastní povel, povely se oddělují znakem $ a sekvence povelů (i jednoho povelu) se ukončuje znaky $$, které ale zapisujeme stiskem šipky dolů! Oddělovat se nemusí jednopísmenné povely bez parametrů (jako třeba V).
Pro některé povely (pouze pokud jsou umístěny na začátku programového řádku!) není ukončování potřeba a provedou se hned.
Povel pro opakování se zapisuje jako < a >.

šipka dolů – oddělení příkazů
šipka vlevo – smazat znak
A – APPEND – čtení textu z kazety, zadaný počet řádků uloží za dosavadní text
B – BEGIN – kurzor na začátek textu
C – CHARACTER – posun kurzoru o daný počet znaků (nezobrazuje hned změnu)
D – DELETE – smazání daného počtu znaků
E – EXIT – ukončení editace, zápis textu na kazetu (neuloží ale zbytek textu nenačteného z kazety – neumí současně mít otevřeno pro čtení i zápis)
F – FIND – vyhledání řetězce, text se uvádí za příkazem
G – GET – označení a výpis zadaného počtu řádků textu ke kopírování na jiné místo
H – HEX -zobrazí zadaný počet řádků hexadecimálně (kontrola vložených znaků)
I – INSERT – vkládání textu, to se ukončí dvěma stisky šipky dolů, při vkládání je možné stiskem šipky doleva mazat znaky, šipka vpravo je tabelátor
J – TOOL JUMP – skok zpět do TOOLu
K – KILL – vymazání daného počtu řádků, záporná hodnota maže řádky před kurzorem
L – LINE – posun o zadaný počet řádků
M – MEMORY – výpis velikosti volné paměti pro text
O – OUTPUT – zápis zadaného počtu řádků textu na kazetu, nemaže ho z paměti
P – PRINT – tisk zadaného počtu řádek textu na tiskárnu od kurzoru (bere i záporný parametr)
Q – QUIT – návrat do monitoru
R – READ – otevření vstupního souboru na kazetě, umožní spojení více souborů spolu s příkazem A
S – SUBSTITUTE – náhrada textového řetězce jiným, parametry se uvádí za příkazem oddělené pomocí $
T – TYPE – výpis textu od kurzoru na obrazovku (bere i záporný parametr)
U – UNSAVE – přesunutí textu označeného povelem G na pozici kurzoru
V – VIEW – zobrazí text v okolí kurozru
W – WRITE – zápis zadaného počtu řádků textu na kazetu
X – EXCHANGE – zobrazení následujícího textu a posun kurzoru na novou stránku
Y – zobrazení předcházející stránky textu a posun kurzoru
Z – nastaví kurzor na konec textu
@ – smaže veškerý text
CTRL + C – přerušení činnosti
CTRL + D – vymazání znaku v místě kurzoru
CTRL + I – vložení znaku namísto označené kurzorem
CTRL + K – vymazání řádku od kurzoru do konce
CTRL + S – nahrazení znaku v místě kurzoru jiným znakem

Disassembler
Disassembler se spouští povelem V pro výpis na obrazovku, nebo Y pro zobrazení na obrazovce a současné uložení textu na kazetu.
Jako parametr příkazu lze zadat adresu, odkud se má zpětný překlad provádět.
Zobrazuje po řádcích, další řádek zobrazí po stiskumezerníku, stiskem enteru se překlad ukončí.
Stiskem čárky lze přejít do režimu SUBSTITUTE.

TRACER
TRACER slouží k ladění a krokování programu.
Patří sem v podstatě i příkaz G, který spustí program se zadáním breakpointů, kde se má běh programu zastavit (úseky mezi breakpointy probíhají v reálném čase).
Samotný tracer po spuštění příkazem T se řídí podmínkou dříve nastavenou příkazem C.

Nastavitelné podmínky jsou tyto (po startu TOOLu je nastavena podmínka N):
B – BRIEF – výpis PC a instrukce
C – CALL – trasuje pouze hlavní program, podprogramy provádí v reálném čase
L – LOOP – trasuje instrukce skoků, umožňuje sledování programu ve smyčkách
M – MASK – očekává zadání dat a masky (až tři byty), na kterých se trasování zastaví a vypíše obsah registrů (podobně jako příkaz TOOLu F – FIND)
N – NULL – zruší zadanou podmínku, vypisují se registry, adresa a instrukce
R – REGISTER – provede výpis při shodě dat v zadaném registru se zadanou hodnotou
S – STACK – provede výpis při přetečení zásobníku ze zadané oblasti
W – WINDOW – vypisuje při běhu programu v zadané oblasti paměti

Parametry pro povel T jsou tyto:
T=xxxx_=xxxx_=xxxx – adresy startu programu a případně přerušení
T= – pokračuj od adresy v PC
T=_=xxxx – pokračuj od adresy v PC, ale od xxxx zobrazuj adresy
T=xxxx – startovací adresa je stejná jako breakpoint
T=xxxx=xxxx=xxxx – běží v reálném čase, trasuje teprve od dosažení breakpointu
Stiskem mezery se provádí další krok, stiskem enteru trasování končí.
Po stisku čárky lze zadat novou podmínku (jako v povelu C).
CTRL+C trasování přeruší.

Programy v EPROM trasovat nelze.