8080 – Ahoj světe!

Konečně! Konečně jsme se dostali do bodu, kdy si vypíšeme ono známé a populární AHOJ SVĚTE, a pak už nás nic nezastaví!

Samozřejmě, s čistým assemblerem toho moc nedokážeme. Potřebujeme taky stroj, který náš program vykoná. Teď nastala ta chvíle, kdy si můžete vytáhnout své pečlivě schraňované PMI-80 a… Cože, vy nemáte PMI-80? No dobrá tedy. Použijeme PMD-85. Ten snad všichni máte. Támhle vzadu někdo přikyvuje… jo aha, to je RM-Team, to je výjimka, vy ostatní, hm… nemáte… To nevadí. Půjčte si alespoň emulátor PMD-85.

Tak. Náš první opravdový program vypíše na obrazovku „AHOJ SVETE“ a skončí. Jak to udělá?

No, zaprvé bude potřeba někde v paměti mít uložená písmenka A, H, O, J… atd. jak se mají vypsat. Jedno po druhém budeme brát a zobrazovat je na displeji. Bude tedy rozumné, když si adresu toho řetězce uložíme do nějakých registrů. Z toho, co jsme si řekli, víme, že pro podobné účely je nejvhodnější dvojice registrů HL. Znak načteme do registru A pomocí MOV A,M, na další pozici se přesuneme pomocí INX H… Základní kostra tedy bude vypadat nějak takhle:

Zbývá vyřešit pár detailů. Třeba: Jak vypíšeme ten znak? Tady nám pomůže monitor PMD-85. Monitor není, prosím pěkně, ta bedna, na kterou civíte – ve světě osmibitových počítačů se „monitor“ říkalo základnímu obslužnému programu, který umožňoval nějaké elementární operace se systémem – prohlédnout si paměť, změnit její obsah, spustit program, uložit ho na záznamové zařízení atd. Něco jako pozdější „operační systém“. Takový monitor býval uložený v pamětech typu ROM (spíš EPROM, ale to je nepodstatný detail) a krom toho, že komunikoval s obsluhou, tak většinou nabízel i nějaké podprogramy, které může využít programátor ke své práci.

Když se podíváme do výpisu monitoru PMD-85 (k dispozici je třeba na stránkách RM-teamu), co nám nabízí, najdeme následující kousek:

To je asi to, co hledáme. Podprogram vypíše znak z registru A na obrazovku. Pokud to je 1Ch, tak smaže obrazovku, 0Dh odřádkuje, 0Ah ignoruje, zbytek vypíše. Vstup očekává v registru A. Ty tři řádky pod tím – (C03EH) – kurzor – adresa ve V-RAM – teď budeme ignorovat, budeme doufat, že je to všechno nastavené, jak má být. (Pro zvídavé – C03EH v závorkách naznačuje, že se jedná o obsah paměti na adrese C03Eh… Tady půjde pravděpodobně o dva bajty na adresách C03Eh a C03Fh – ale to bych sem teď opravdu netahal.)

V popise je dále napsáno, že výstupem je obrazovka – jo, to tak nějak čekáme, a že program používá PSW. Vzpomeňte si, jak jsme si říkali, že je dobré do dokumentace napsat, které registry náš podprogram přepíše. Tento podprogram je slušný, změní jen A a F (neboli PSW), zbytek zůstane zachovaný, tudíž nemusíme hodnotu registrů HL (kde máme adresu toho řetězce) uschovávat.

Takže je jasno: Výpis si vyřídíme pomocí CALL 8500h, neboli CALL PRTOUT.

PRTOUT je symbolické jméno, abychom si nemuseli pamatovat adresu 8500h – napovídá, že půjde o nějaký výpis (PRINT OUT). Podobných programů je v monitoru velké množství – třeba KEYBD, jak už název napovídá, bude mít něco společného s klávesnicí (KEYBoarD), pravděpodobně čtení znaku z klávesnice. Každopádně se KEYBD pamatuje snáze než 84A1h, navíc když uděláte překlep a napíšete KEYDB, překladač vás upozorní, že takovou adresu nezná, zato když se uklepnete na 841Ah, nikdo vás neupozorní a program nebude fungovat. Jak používat tyto symbolické názvy se dozvíte v další lekci.

Další problém, který je třeba vyřešit: Program musí nějak poznat, že už vypsal všechny znaky a že má přestat. Kdyby to nepoznal, tak vypíše všechno až doalelujá a nikdy neskončí. Můžeme si zase zvolit nějaký registr jako počítadlo znaků, dát do něj předem délku, při každém průchodu zmenšit o 1, a když dojdeme k nule, tak skončit. To je řešení logické, ale má svoje nevýhody: Zaprvé, musíme znát délku řetězce. To by za nás dokázal pohlídat překladač. Zadruhé: nejdelší řetězec bude mít 256 znaků. I to by se dalo vyřešit, kdybychom pro počítadlo vyhradili dvojici registrů. Jenže takové řešení je delší než to, které nakonec použijeme my.

My totiž uložíme do paměti řetězec znaků AHOJ SVETE, a hned za něj uložíme nulu. Ti z vás, kteří znají céčko, teď pravděpodobně pokyvují hlavou, že jim je tohle řešení povědomé. Ano, je to přesně to. Ve smyčce pak čteme jednotlivé znaky a kontrolujeme, jestli to není náhodou 0. Pokud to je 0, tak jsme skončili.

Jak zkontrolovat, jestli je bajt 0? MOV A,M nijak nepomůže, tato instrukce neovlivňuje příznaky. Můžeme použít CPI 0, tedy instrukci pro porovnání. Nebo můžeme opět použít jednoduchý trik: Použijeme instrukci, která nezmění hodnotu, ale nastaví příznaky… Nabízí se operace OR nebo AND, tedy instrukce ORA A nebo ANA A. OR hodnoty s ní samotnou je stále ta hodnota – ale nastaví příznaky S, Z, AC, P a CY. Nás bude zajímat příznak Z, který bude 1, je-li hodnota nulová.

Nová verze vypadá tedy takto:

Krok po kroku: Připravíme si adresu textu do registrů HL (LXI H, text). Smyčka začíná tím, že přečteme znak z adresy HL do registru A (MOV A,M), porovnáme hodnotu samu se sebou (ORA A) a pokud je to nula, skáčeme na adresu STOP (JZ stop). Pokud ne, tak voláme PRTOUT, zvýšíme adresu v HL o 1 a pokračujeme v provádění smyčky.

Stop se v našem programu implementuje jako RET – tedy návrat zpátky do toho místa, odkud byl program spuštěn. V našem případě tedy zpátky do monitoru PMD-85. Je vyřešen trochu nešikovně – podívejte se sami: JZ na adresu STOP, a na té adrese je jen RET. Pokud bychom po vypsání chtěli dělat ještě něco, můžeme to napsat od návěští STOP dál. Ale jestliže nic dělat nechceme, můžeme se přímo ze smyčky vrátit – místo instrukce JZ na adresu, kde je instrukce RET, můžeme přímo použít podmíněnou instrukci RZ.

Zbývá vyřešit poslední problém, totiž jak napsat to „AHOJ SVETE“ do paměti od adresy TEXT.

K tomu slouží pseudoinstrukce DB. Podobně jako ORG říká překladači „program bude uložen od této adresy“, tak DB říká: „To, co je parametrem téhle pseudoinstrukce ulož do kódu jako jeden bajt.“ Takže kdekoli se ve zdrojovém kódu objeví třeba DB 41h, tam překladač vloží bajt 41h. Což je zároveň ASCII kód znaku A. Pokud chceme vložit ASCII kód znaku A, nemusíme hledat v tabulkách, že to je 41h – stačí zapsat DB „A“ a překladač to vyřeší za nás.

Takže můžeme napsat DB „A“, „H“, „O“, „J“ … anebo jednodušeji: DB „AHOJ SVETE“ Když překladač za DB narazí na řetězec, uloží kódy jednotlivých znaků do paměti po sobě tak jak jdou v řetězci.

Samozřejmě je dobré dát si pozor na to, aby se program nikdy na tuhle adresu nedostal, protože kdyby začal provádět „instrukce“ (ve skutečnosti nějaká data), tak by se mohlo stát cokoli.

Náš program tedy vypadá nakonec takto:

Tentokrát nám krokování v debuggeru nepomůže – u instrukce CALL 8500h debugger vykolejí, protože na takové adrese nic nemá. Musíme náš program přenést do počítače. Přeložte si ho a soustřeďte se na listing:

Na adresu 0000 je třeba zapsat hodnotu 21 (vše hexadecimálně), na 0001 hodnotu 0D, na 0002 hodnotu 00, na 0003 hodnotu 7E… na další adresy pak hodnoty B7, C8, CD, 00, 85, 23, … a konečně na adresu 0018 zapíšeme nulu.

Zapněte si svá Péemdéčka (nebo si spusťte v druhém okně emulátor PMD-85) a napište: SUB 000021 (a klávesu EOL / ENTER). Tím se do paměti na adresu 0000 uloží hodnota 21. V příkazovém řádku se teď objevilo SUB 0001 – stačí tedy dopsat 0D a EOL (ENTER)… Nebo můžete využít toho, že příkaz SUB dokáže uložit víc hodnot najednou, a napsat po sobě toto:

Monitor vám po odeslání každého řádku připraví nový příkaz SUB… Když odešlete poslední řádek, stiskněte EOL (na PC emulátoru ENTER) bez zadání dat. PMD vypíše chybu a očekává nový příkaz. Ke spuštění programu slouží v monitoru PMD-85 instrukce JUMP xxxx, kde xxxx je hexadecimálně zadaná adresa. Zkuste to:

(a EOL / Enter)

Pokud jste neudělali chybu, objeví se to, co jsme chtěli:

PMD 85prog1

 

Zvládli jsme to! Pokořili jsme kus křemíku a donutili ho udělat to, co jsme chtěli. Malý krok pro člověka… atakdál!

Tip: Můžete si ten program vyzkoušet samozřejmě i v online vývojovém prostředí ASM80. Uložte si tento soubor pod nějakým názvem s příponou .a80. Do kódu napište na prázdný řádek, třeba na samotný začátek, pseudoinstrukci „.ENGINE pmd“ (bez uvozovek, samosebou). Když pak kliknete na EMULATE, program se přeloží, spustí se emulátor PMD-85 a v něm už bude váš program nahraný od té adresy, kterou jste zadali v ORG. Ušetří vám to práci s přepisováním všech těch kódů. A od toho přeci počítače máme – aby nám ušetřili práci. Ne?

Líbil se vám článek? Podpořte autora na Patreonu
Příspěvek byl publikován v rubrice 8080. Můžete si uložit jeho odkaz mezi své oblíbené záložky.

Napsat komentář

Vaše emailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *