MONITOR PMD-85-1

Přehled programů umístěných v monitoru PMD 85 a jejich stručný popis.

MAIN 8016H - základní smyčka monitoru
    Program hledá v tabulce příkazů příkaz, jehož znění je v paměti na adrese,
    která je uložena v ukazateli na adrese (C072H). Po vyhledání správného pří-
    kazu předá řízení na adresu, která je v tabulce příkazů uvedena. Nenajde-li
    příkaz, vrací se přes PRTEXT s hláškou "** NO COMMAND **".
    vstup:   (C070H) - adresa začátku tabulky příkazů

HEX 80E0H - převod ASCII na číslo
    Převod ASCII znaku na číslo 00H-0FH v registru A.
    vstup:   znak ASCII v A
    výstup:  A - číslo 00H-0FH
             CY=1 při chybě
    používá: PSW

PAIRIN 80F7H - převod 2 krát ASCII na číslo
    Převod 2 HEX znaků z bufferu na binární v registru A (00H-FFH)
    vstup:   HL - adresa do bufferu
    výstup:  A - výsledek (číslo 00H-FFH)
             HL - zvýšeno o 1 (na 2. HEX znak)
             CY=1 při chybě
    používá: B, HL, PSW

ADRIN 8109H - převod 4 krát ASCII na číslo
    Převod 4 HEX znaků z bufferu na 16-ti bitové binární číslo v DE (0000H-FFFFH)
    vstup:   HL - adresa do bufferu
    výstup:  DE - výsledek (číslo 0000H-FFFFH)
		HL - zvýšeno o 4 (za poslední HEX znak)
		CY=1 při chybě
    používá: B, DE, HL, PSW

TRADR 8115H - převod 4 znaků na binární číslo + příprava hlášky
    vstup:   (C072H) dialogový řádek
    výstup:  DE - výsledek (číslo 0000H-FFFFH)
             HL - ukazuje za poslední HEX znak
             ukazatel (C074H) nastaven na "** ERROR IN ADDRES **"
    používá: B, DE, HL, PSW

PREVO1 8125H - výpis bytu z A jako HEX
    Převod a HEX výpis bytu z A (dvěma ASCII znaky)
    vstup:   A - binární hodnota
    výstup:  2 znaky na obrazovce
    používá: B, PSW

PREVO2 813BH - převod A na HEX do bufferu
    Převod binární hodnoty z A na dva znaky do bufferu
    vstup:   A - binární hodnota
             HL - adresa do bufferu
    výstup:  HL - zvětšeno o 1 (na 2. znak v bufferu)
    používá: B, HL, PSW

BINHEX 814FH - převod A na 1 HEX znak
    Převod binární hodnoty (dolní půlbyte) na HEX znak
    vstup:   A - binární hodnota 00H-0FH (nekontroluje!)
    výstup:  A - ASCII znak "0" až "F"
    používá: PSW

CMDSUB 8159H - příkaz SUB
    Ukládá do paměti data a znaky napsané v ASCII v editačním bufferu na adresu,
    která je udána prvními čtyřmi znaky, na které ukazuje ukazatel (C072H). Ře-
    tězec znaků musí být oddělený apostrofem. Program končí tím, že v editačním
    řádku zobrazí "SUB" a následující ukládací adresu.
    vstup:   (C072H) - ukazatel do bufferu
    používá: vše

CMDJUM 81C5H - příkaz JUMP
    Vyšle do dialogového řádku "** EXECUTIVE **" a předá řízení na adresu, která
    je uložena v ASCII znacích v bufferu, do kterého ukazuje (C072H).
    vstup:   (C072H) - adresa skoku v ASCII znacích
    používá: vše

CMDMEM 81DFH - příkaz MEM
    Do dialogového řádku se vypíše stav 16 bytů od adresy uvedené v ASCII zna-
    cích, na které ukazuje ukazatel (C072H) nebo v DE - potom je třeba volat
    adresu 81E5H.
    vstup:   (C072H) - adresa odkud vypisovat zapsaná v ASCII
             nebo DE - adresa odkud vypisovat (v případě volání 81E5H)
    používá: vše

CMDDUM 8200H - příkaz DUMP
    Vypisuje na obrazovku stav bytů paměti od adresy napsané v ASCII (C072H) ne-
    bo binárně v HL - potom volat adresu 8209H.
    vstup:   (C072H) - adresa, odkud vypisovat zapsaná v ASCII
             nebo HL - adresa, odkud vypisovat (v případě volání 8209H)
    používá: vše

VYMAZ 8276H - nulování oblasti klíčů 7000H-7EFFH
    Program nekompromisně nuluje paměť v již zmíněném rozsahu.
    používá: HL, PSW

L8283 8283H - test, zda je v seznamu ještě 80 bytů volných
    Program slouží pro ukládání klíčů. V paměti musí být vynulováno 80 bytů pro
    uložení klíče. Jinak vypisuje "** MEMORY OVERFLOW **".
    používá: vše

CLDINY 82A3H - inicializace při studeném startu monitoru
    Program nastavuje zápisník, maže obrazovku a nastavuje USART.
    používá: vše

TABPR 8300H - tabulka příkazů monitoru
    V této tabulce jsou ASCII znaky napsány příkazy s mezerou a dvěma byty ur-
    čujícími adresu příslušného příkazu. POZOR! První byte znamená vyšších
    8 bytů adresy a druhý nižších 8. Tabulka končí za poslední adresou bytem
    o hodnotě FFH. Ukazatel na tuto tabulku je  v (C070H).

TABKBD 8400H - tabulka kódů klávesnice
    Tato tabulka obsahuje kódy, které přiřadí program KEYBD stisknuté klávese.
    První byte označuje řádek a stisknuté tlačítko SHIFT, dalších 15 bytů jsou
    kódy kláves v příslušném pořadí. Každý řádek má tedy 16 bytů. Tabulka končí
    prázdným bytem.

KEYBD 84A1H - vstup znaku z klávesnice
    Program přiřazuje stisknuté klávese kód, který má uložený v tabulce 8400H a
    končí teprve po uvolnění stisknuté klávesy.
    vstup:   stisknutá klávesa
    výstup:  A a (C134H) - kód znaku
    používá: PSW

BREAD 84F3H - přečtení obsahu bytu z obrazovky
    vstup:   (C17AH) - adresa bytu
    výstup:  A - byte bez barevných atributů
    používá: HL, PSW

PRTOUT 8500H - výstup znaku na obrazovku
    Program se snaží zobrazit všechny znaky kromě 0AH, který ignoruje, na 1CH
    smaže kompletně celou obrazovku (ale zápisník nechá) a znak 0DH odřádkuje a
    nastaví kurzor na začátek řádku (FB00H). Ignoruje mód kreslení bodu!!!
    vstup:   A - kód znaku
             (C03EH) - kurzor - adresa ve V-RAM
             (C03CH) - ukazatel tabulky znaků
             (C03AH) - barevné atributy
    výstup:  obrazovka
    používá: PSW

ECHO 8584H - zobrazení ASCII znaku
    vstup:   HL - kurzor
             A - kód znaku
             (C03CH) - ukazatel tabulky znaků
             (C03AH) - barevné atributy
    výstup:  obrazovka
    používá: BC, PSW

L85E6 85E6H - test bodu (souřádnice 0, 0 je vlevo nahoře)
    vstup:   (C170H) - souřadnice X
             (C172H) - souřadnice Y
    výstup:  A=0/1 - bod nesvítí / svítí
    používá: PSW

TABZN 8600H - tabulka pro generování znaků
    Tabulka pro generování znaků se skladá z 64 8-bitových slov. Každé toto
    slovo patří jednomu ASCII znaku. Ukazatel na tuto tabulku snížený o 0100H
    se ukládá na adresu (C03CH).

EDIT 8800H - zpracování znaků při vstupu dialogového řádku
    vstup:   (C134H) - znak z klávesnice
             (C130H) - nejnižší řídící znak
             (C131H) - nejvyšší řídící znak
             (C132H) - adresa tabulky řídících znaků
    výstup:  rutina dle řídícího znaku nebo při tisknutelném znaku zpracování
             v dialogovém řádku
    používá: vše

CTRDIL 884AH - řídící znak 86H |<-- posunutí řádku doleva
    používá: vše

ZOBRED 8855H - echování dialogového řádku na displeji (48 znaků)
    používá: vše

ZOBRBU 8858H - zobrazí 48 znaků umístěných v paměti od adresy v HL
    používá: DE, HL, PSW

CUROFF 887FH - smazání kurzoru v dialogovém řádku na TV
    výstup:  HL - adresa kurzoru na TV
    používá: DE, HL, PSW

RIGHT 888CH - posun kurzoru doprava
    používá: DE, HL, PSW

CURON 8890H - zobrazení kurzoru na TV
    vstup:   HL - adresa kurzoru na TV
    výstup:  HL - pozice kurzoru v bufferu
    používá: D, HL, PSW

LEFT 889CH - posun kurzoru doleva
    používá: vše

PIIP 88A3H - standardní zapípání
    používá: DE, HL, PSW

BELL 88A6H - zapípání podle tabulky
    Tabulka se skládá z dvojic bytů. 1 byte označuje výšku tónu a může nabývat
    hodnoty 0, 1, 2 a 3. 2. byte je délka tónu.
        tón 0 - nic
        tón 1 - nižší tón
        tón 2 - vyšší tón
        tón 3 - oba tóny
    Konec tabulky je označen hodnotou FFH.
    vstup:   HL - adresa tabulky
    výstup:  pípnutí
             HL - konec tabulky
    používá: DE, HL, PSW

DELAY 88B5H - čekací smyčka - dekrementace DE na nulu
    Nejmenší zdržení je při předvolbě DE=0101H, největší zdržení je při před-
    volbě DE=0000H (=FFFFH+1).
    vstup:   DE - délka čekání
    používá: DE (nuluje), PSW

TABBEP 88BEH - tabulka pro PIIP

CTRCEL 88C3H - řídící znak 82H (SHIFT + CLR) výmaz do konce řádku
    používá: vše

CTRHOM 88D2H - řídící znak 84H (<^- Šipka doleva nahoru) kurzor na začátek řádku
    používá: vše

CTRCLR 88E8H - řídící znak 8DH (CLR) vymaže dialogový řádek
    používá: vše

LENEDI 88EEH - určení délky textu v editačním bufferu
    výstup:  (C13CH) - délka dialogového řádku
    používá: DE, HL, PSW

TABBEL 8920H - tabulka pro akustické návěští

COPMSG 892DH - kopírování textu hlášky do výstupního bufferu
    vstup:   (C13AH) - adresa výstupního bufferu
             (C074H) - adresa platné hlášky
    používá: vše

COPWRK 8937H - přesun úseku paměti ukončeného 0DH (CR)
    vstup:   HL - adresa co přesouvat
             DE - adresa kam přesouvat
    výstup:  (C13CH), HL - délka přesunutého úseku
    používá: C, DE, HL, PSW

OUTMSG 894AH - zobrazení hlášky
    Program končí vstupem znaku, to znamená, že se zastaví a čeká na znak z klá-
    vesnice. Teprve pak se ukončí.
    používá: vše

CTRCUR 896CH - řídící znak 85H --> kurzor o pozici doprava
    používá: vše

CTRCUL 897DH - řídící znak 83H <-- kurzor o pozici doleva
    používá: vše

CTRDIR 898CH - řídící znak 88H -->| řádek o pozici doprava
    používá: vše

CTRPTL 8996H - řídící znak 8BH PTL zapnutí / vypnutí opisu
    používá: vše

CTRCD 899EH - řídící znak 8AH C-D přivolání textu hlášky
    používá: vše

CTRDEL 89A5H - řídící znak 81H DEL vymaže znak nad kurzorem
    používá: vše

CTRINS 89C6H - řídící znak 80H INS vložení mezery
    používá: vše

CTREND 89EEH - řídící znak 87H END kurzor na konec řádku
    používá: vše

WRKINY 8A47H - inicializace zápisníkových oblastí ve V-RAM
    Program inicializuje oblasti C030H, CO70H, C130H jako při studeném startu.
    používá: vše

CLDCLS 8A62H - část inicializace při studeném startu
    Vymaže obrazovku, zapípá, zobrazí hlášku v dial. řádku a nastaví prompt znak
    do editačního bufferu.
    používá: vše

PRTEXT 8A89H - výpis textu připravené hlášky
    vstup:   (C074H) - adresa hlášky
    používá: vše

TABCTR 8AEDH - tabulka adres příkazů při vstupu řádku
        1. byte ... řídící znak
        2. a 3. byte ... adresa rutiny

CTRKEY 8B40H - řídící znaky D0H-FFH klíče
    používá: vše

SAVKEY 8B76H - uložení klíče
    používá: vše

CTRRCL 8B87H - řídící znak A0H RCL - přivolání předešlého řádku
    používá: vše

CTRWRK 8B8DH - řídící znak A2H WRK - zápis textu do klíče
    používá: vše

LINECH 8BDAH - opis příkazu na oprazovku při zapnutém PTL
    používá: vše

ENTER 8BEEH - vstup dialogového řádku
    Tato rutina si nastavuje svůj vlastní ukazatel zásobníku (7FFFH) a po výstu-
    pu jej obnovuje na původní. Výstup z této rutiny je obsah dialogového řádku
    umístěný od adresy, která je uvedena v (C074H) a končí znakem CR (0DH).
    V zápisníku na adrese (C13CH) je délka tohoto řádku.
    vstup:   (C078H) - adresa, kam dial. řádek uložit
    výstup:  (C13CH) - délka dial. řádku
    používá: vše

TRANSF 8C00H - natažení bloku paměti z ROM modulu
    volání:  CALL TRANSF
             DW - adresa v ROM modulu
             DW - délka přenášeného úseku + FFH
             DW - adresa, kam uložit do RAM
    používá: BC, DE, PSW

MONIT 8C40H - vstup do monitoru s výpisem "OS READY" a písknutím
    Nastavuje zásobník na 7FFFH, prompt znak na "?", pískne, vypíše "OS READY" a
    udělá teplý start (8016H). Jinak nedělá nic.
    používá: vše

CMDJOB 8C54H - příkaz JOB
    používá: vše

CMDBAS 8C60H - příkaz BASIC G
    používá: vše

STOP 8C74H - test stisknutí klávesy STOP
    výstup:  A=03H, Z=1 (nastaven) ... STOP je stisknuto
             A=40H, Z=0 (vynulován) ... STOP není stisknuto
    používá: PSW

POINT 8C7DH - vykreslení bodu na obrazovce
    Tento program vypočítá ze souřadnic adresu bytu ve V-RAM a příslušný bit
    v tomto bytu. Přidá barevné atributy a bod vykreslí podle módu kreslení.
    vstup:   XOLD (C170H) - souřadnice X
             YOLD (C172H) - souřadnice Y
             (C1FAH) - mód kreslení bodu
             (C03AH) - barevný atribut výstupu
    používá: vše

INPOL 8CD0H - interpolátor
    Interpolátor spojuje dva zadané body nejkratší cestou podle módu kreslení a
    barevného atributu. Využívá program POINT a pracuje tak dlouho, dokud nejsou
    souřadnice výchozího bodu stejné jako souřadnice koncového bodu.
    vstup:   XOLD (C170H) - souřadnice X výchozího bodu
             YOLD (C172H) - souřadnice Y výchozího bodu
             XNEW (C173H) - souřadnice X koncového bodu
             YNEW (C174H) - souřadnice Y koncového bodu
             (C1FAH) - mód kreslení bodu
             (C03AH) - barevný atribut výstupu
    používá: vše

MGOBLK 8D6CH - výstup bloku z paměti na USART
    Program posílá postupně obsah paměti na USART a provádí kontrolní součet. Po
    odvysílání následuje 1 byte - kontrolní součet a konec.
    vstup:   HL - začátek bloku
             DE - délka bloku - 1
    používá: B, DE, HL, PSW

WAIMGO 8DB1H - čekání na volný vysílač USARTu
    Z tohoto programu se vystoupí, až když je vysílač uvolněn a připraven
    k přijmutí dalšího znaku.
    používá: PSW

INIMGF 8DB9H - inicializace USARTu pro výstup na magnetofon
    Nastaví asynchronní režim pro 8 bitů, 2 stop bity, bez parity, f=1x.
    používá: A

MGIBL1 8DC2H - vstup bloku dat z USARTu a kontrola součtu
    Nebo MGIBLK 8DC4H - C=00/XX ... jen kontrola / i do paměti
    Program přenese blok dat do paměti. Pokud chceme kontrolovat součet, vynulu-
    jeme reg. C a program voláme od adresy 8DC4H (MGIBLK).
    vstup:   HL - ukládací adresa pro čtená data
             DE - délka - 1 (požadovaný počet bytů - 1)
    výstup:  příznak Z=0/1 ... chyba kontrolního součtu / OK
    používá: vše

MGIREC 8DE2H - vyhledání synchronizace a načtení hlavičky
    Pokud program najde hlavičku souboru, tak ji přečte a uloží od adr. C1B2H.
    POZOR! Při stisknutí klávesy STOP se vrací na adresu v zásobníku o úroveň
    výše!!!
    výstup:  (C1B2H) - číslo souboru
             (C1B3H) - typ souboru
             (C1B4H, C1B5H) - počáteční adresa
             (C1B6H, C1B7H) - délka - 1
             (C1B8H-C1BFH) - 8 znaků jméno souboru (domezerovat!)
    používá: vše

WAIMGI 8E0EH - čekání na přijatý znak z USARTu
    Z tohoto podprogramu se vystoupí, jakmile je v USARTu připraven znak k pře-
    vzetí.
    používá: PSW

MGLD 8E19H - výkonná část příkazu MGLD a MGEND
    Načte hlavičku, zobrazí ji v dial. řádku, zkontroluje číslo souboru, pokud
    je typ souboru (C1B1H) nulový a číslo souboru souhlasí, dělá se jen kontrola.
    Pokud nesouhlasí číslo souboru (C1B0H) nebo typ souboru, pískne a hledá dal-
    ší hlavičku.
    vstup:   (C1B0H) - požadované číslo souboru
             (C1B1H) - požadovaný typ souboru (pokud je 00H, povádí se MGEND)
    používá: vše

BINBCD 8E73H - převod A registru z binárního na BCD tvar
    vstup:   A - binární hodnota
    výstup:  A - BCD číslo
    používá: B, H, PSW

L8E7F 8E7FH - převod ze vstupu BCD na binární číslo s kontrolou rozsahu 00-63
    Pokud máme číslo BCD v reg. A, voláme L8E91 (8E91H) nebo bez kontroly rozsa-
    hu 00-63 voláme BCDBIN (8E95H). V těchto případech používá BC a PSW.
    vstup:   dva znaky v bufferu (ukazatel (C072H))
    výstup:  ukazatel chybové hlášky nastaven na "** FILE ERROR **", ukazatel do
             bufferu nastaven o 3 znaky dále než byl, od adr. C0F0H se zapíše
             toto: NOP
                   JMP L8DE1 (RET)
             CY=1 při chybě
    používá: BC, HL, PSW

BCDBIN 8E95H - převod A registru z BCD na binárního tvar
    vstup:   A - BCD číslo
    výstup:  A - binární číslo
    používá: B, H, PSW

CMDMGI 8EA9H - příkaz MGLD
    vstup:   dva znaky - číslo souboru - v bufferu, na který ukazuje (C072H)
    používá: vše

MGSV 8ECAH - výkonný blok příkazu MGSV
    vstup:   číslo souboru, poč. adresa, konc. adresa, jméno - to vše v bufferu
             (ukazatel C072H), prompt znak na (C136H)
    používá: vše

CMDMGO 8F47H - příkaz MGSV
    Udělá MGSV, vypíše "** MG STOP! **" a zapípá
    používá: vše

CMDMGE 8F53H - příkaz MGEND
    používá: vše

MGOREC 8F60H - zápis synchronizace a hlavičky dat
    Po nahrání hlavičky a po časové prodlevě se skočí do podprogramu přes adresu
    C0F0H. V tomto místě se tedy může modifikovat.
    vstup:   (C1B2H) - číslo souboru
             (C1B3H) - typ souboru
             (C1B4H, C1B5H) - počáteční adresa bloku dat
             (C1B6H, C1B7H) - délka bloku dat
             (C1B8H-C1BFH) - jméno souboru (8 znaků ASCII)
    používá: vše

L8F7E 8F7EH - inicializace zápisníkové oblasti C0F0H
    Tento program nuluje příznak CY a od adr. C0F0H zapíše toto:
        NOP
        JMP L8DE1 (RET)
    používá: vše

BSDSAV 8F95H - podpora MGF operací v Basicu
    používá: vše

BS1BYT 8FCFH - výstup bytu z paměti na MGF s úpravou kontr. součtu
    vstup:   HL - adresa na odesílaný byte (odesílá se reg. M)
             B - dosavadní kotrolní součet
    výstup:  HL - zvýšeno o 1 (na další byte)
             B - upravený kontrolní součet
    používá: B, HL, PSW

BSCBLK 8FD9H - vstup bloku dat do paměti s úpravou kontr. součtu
    vstup:   HL - adresa, kam blok uložit
             B - dosavadní kotrolní součet
			 C - požadovaná délka bloku
    výstup:  HL - zvýšeno na následující adresu
             B - upravený kontrolní součet
			 C - vynulováno
    používá: BC, HL, PSW

L8FE7 8FE7H - nulovat zvuk a poslat nový
    Zruší oba tóny a skočí do BELL. Nutno proto v HL připravit adr. tab. tónů.
    používá: DE, HL, PSW

L8FF0 8FF0H - inicializace grafiky
    Program přepne inverzi bodu, nuluje barevné atributy a nastaví standardní
    tabulku znaků (8600H).
    používá: HL, PSW


MONITOR PMD-85-1

Komentáře a zejména použitá symbolická jména vycházejí z příručky "Popis základ-
ního programového vybavení mikropočítače PMD-85" vydané Centrem pro mládež, vědu
a techniku ÚVSSM.

Pracovní oblasti ve V-RAM (zápisník monitoru)

Oblasti na adresách C030-C03F, inicializace na adresách 8AAF-8ABE

C030            BUFEDI  EQU  C030H       ; adresa editačního bufferu
C032            ADRDIA  EQU  C032H       ; adresa začátku dial. ř. na TV
C034            EDLENG  EQU  C034H       ; délka editačního bufferu
C036            DCURS   EQU  C036H       ; pozice kurzoru v editačním řádku
C038            DPOS    EQU  C038H       ; pozice dial. řádku v editačním buf.
C03A            CPOINT  EQU  C03AH       ; atribut výstupu (00H, 40H, 80H, C0H)
C03C            TASCII  EQU  C03CH       ; ukazatel na tabulku znaků (- 100H)
C03E            CURSOR  EQU  C03EH       ; adresa kurzoru na TV

Oblasti na adresách C070-C07F, inicializace na adresách 8AC0-8ACF

C070            ADRCMD  EQU  C070H       ; adresa tabulky příkazů monitoru
C072            INPUT   EQU  C072H       ; ukazatel do výstupního bufferu
C074            MESAGE  EQU  C074H       ; adresa hlášení
C076            SAVRET  EQU  C076H       ; uložení návratu při INLINE
C078            BUFOUT  EQU  C078H       ; adresa vstupního bufferu
C07A            SAVESP  EQU  C07AH       ; pro uložení SP při INLINE

Oblasti na adresách C0F0-C0F4, inicializace funkcí L8F7E

C0F0            LC0F0   EQU  C0F0H       ; sem se uloží NOP
C0F1            LC0F1   EQU  C0F1H       ; sem se uloží JMP L8DE1 (RET)
C0F6            LC0F0   EQU  C0F6H       ; používáno Basicem

Oblasti na adresách C130-C13F, inicializace na adresách 8AD1-8AE0

C130            MINCTR  EQU  C130H       ; dolní hranice řídících znaků
C131            MAXCTR  EQU  C131H       ; horní hranice řídících znaků
C132            ADRCTR  EQU  C132H       ; adresa tabulky řídících znaků
C134            CHAR    EQU  C134H       ; znak z klávesnice
C135            FWRK    EQU  C135H       ; příznak WRK (FFH=ON, 00H=OFF)
C136            PROMPT  EQU  C136H       ; nápovědný znak
C137            FPTL    EQU  C137H       ; příznak PTL (FFH=ON, 00H=OFF)
C13A            BUFMSG  EQU  C13AH       ; adresa bufferu pro hlášky
C13C            DIALEN  EQU  C13CH       ; délka editačního bufferu

Oblasti na adresách C170-C17F

C170            XOLD    EQU  C170H       ; X-souř. bodu, odkud interpolovat
C172            YOLD    EQU  C172H       ; Y-souř. bodu, odkud interpolovat
C173            XNEW    EQU  C173H       ; X-souř. bodu, kam interpolovat
C174            YNEW    EQU  C174H       ; Y-souř. bodu, kam interpolovat
C175            DELTAX  EQU  C175H       ; velikosti interpolovaných úseků
C176            DELTAY  EQU  C176H       ; velikosti interpolovaných úseků
C17A            BREAIN  EQU  C17AH       ; vstup pro BREAD (adresa V-RAM)

Oblasti na adresách C1B0-C1BF

C1B0            FINDNR  EQU  C1B0H       ; požadované číslo souboru
C1B1            FINDTP  EQU  C1B1H       ; požadovaný typ souboru
C1B2            NUMFIL  EQU  C1B2H       ; číslo souboru
C1B3            TYPFIL  EQU  C1B3H       ; typ souboru
C1B4            ADRFIL  EQU  C1B4H       ; ukládací adresa souboru
C1B6            LENFIL  EQU  C1B6H       ; délka souboru
C1B8            NAMFIL  EQU  C1B8H       ; jméno souboru

Oblasti na adresách C1F0-C1FF, inicializace na adresách 82B5-82C4

C1F0            CODJOB  EQU  C1F0H       ; výkonný kód pro JOB
C1F3            POSJOB  EQU  C1F3H       ;     1. argument
C1F5            LENJOB  EQU  C1F5H       ;     2. argument
C1F7            ADRJOB  EQU  C1F7H       ;     3. argument
C1FA            CODSET  EQU  C1FAH       ; mód kreslení bodu
                                         ;     AND B - zhasnutí  = A0H
                                         ;     OR B  - nastavení = B0H
                                         ;     XOR B - inverze   = A8H

000D            CR      EQU  0DH         ; kód znaku CR


Studený start monitoru (po RESETu)

8000   C30380   RESET:  JMP  COLD        ; nastaví PC na příští instrukci
8003   3E8A     COLD:   MVI  A, 8AH      ; řídící slovo pro port klávesnice
8005   D3F7             OUT  F7H         ; odešle se a uvolní A15
8007   31FF7F           LXI  SP, 7FFFH   ; nastavit ukazatel zásobníku
800A   CD7682           CALL VYMAZ       ; nulovat oblast 7000H-7EFFH
800D   CDA382           CALL CLDINY      ; další inicializace
8010   2A30C0           LHLD BUFEDI      ; seznam klíčů označit jako
8013   2B               DCX  H           ; prázdný - nulovat adresu 7EFFH
8014   3600             MVI  M, 00H

Základní smyčka monitoru - vyhledávání příkazu

8016   31FF7F   MAIN:   LXI  SP, 7FFFH   ; nastavit ukazatel zásobníku
8019   CDEE8B           CALL ENTER       ; vstup dialogového řádku
801C   2A78C0           LHLD BUFOUT
801F   2272C0           SHLD INPUT       ; ukazatel do dialogového řádku
8022   210083           LXI  H, TABPR    ; adresu začátku tabulky příkazů
8025   2270C0           SHLD ADRCMD      ; uložit do ukazatele
8028   211680           LXI  H, MAIN     ; návratouvou adresu do monitoru
802B   E5               PUSH H           ; uložit do zásobníku

802C   215F80           LXI  H, MSGCMD   ; hlášku "** NO COMMAND **"
802F   2274C0           SHLD MESAGE      ; připravit do PRTEXT
8032   2A70C0           LHLD ADRCMD      ; adresa začátku tabulky příkazů
8035   EB               XCHG             ; do DE reg. (vzor)
8036   2A72C0   HLADR:  LHLD INPUT       ; do HL adresu příkazu (v dial. ř.)
8039   1A       HLADR1: LDAX  D
803A   BE               CMP  M           ; znak příkazu = znak v bufferu?
803B   C24E80           JNZ  NENI        ; NE - zkusit další možnost
803E   23               INX  H
803F   13               INX  D           ; ANO - jde na další písmeno
8040   FE20             CPI  " "         ; konec příkazu (mezera)?
8042   C23980           JNZ  HLADR1      ; NE - porovnávat dál
8045   2272C0           SHLD INPUT       ; ANO - schovat ukazatel
8048   EB               XCHG             ; do HL adresu za příkaz
8049   5E               MOV  E, M        ; do E MSB cílové adresy
804A   23               INX  H
804B   6E               MOV  L, M        ; do L LSB cílové adresy
804C   63               MOV  H, E        ; do H dáme MSB a můžeme složit
804D   E9               PCHL             ; adresu příkazu

Zpracování dalšího ze seznamu příkazů

804E   1A       NENI:   LDAX D           ; do A dáme vzor
804F   FEFF             CPI  FFH         ; a jestliže už je konec tabulky
8051   CA898A           JZ   PRTEXT      ; napsat hlášku
8054   FE20             CPI  " "         ; a písknout, jinak ignorovat
8056   13               INX  D           ; zbytek příkazu
8057   C24E80           JNZ  NENI        ; vyhledat nejbližší mezeru
805A   13               INX  D           ; a ignorovat i příslušnou
805B   13               INX  D           ; adresu a zkusit další
805C   C33680           JMP  HLADR       ; příkaz

Tabulka hlášení monitoru

805F   2A2A204E MSGCMD: DB   "** NO COMMAND **", CR
8063   4F20434F
8067   4D4D414E
806B   44202A2A
806F   0D
8070   2A2A204E MSGNOD: DB   "** NO DATA **", CR
8074   4F204441
8078   5441202A
807C   2A0D
807E   2A2A2045 MSGDAT: DB   "** ERROR IN DATA **", CR
8082   52524F52
8086   20494E20
808A   44415441
808E   202A2A0D
8092   2A2A2045 MSGADR: DB   "** ERROR IN ADDRES **", CR
8096   52524F52
809A   20494E20
809E   41444452
80A2   4553202A
80A6   2A0D
80A8   2A2A2045 MSGEXE: DB   "** EXECUTIVE **", CR
80AC   58454355
80B0   54495645
80B4   202A2A0D
80B8   434F4E54 MSGCON: DB   "CONTINUE ?", CR
80BC   494E5545
80C0   203F0D
80C3   2A2A204D MSGMEM: DB   "** MEMORY OVERFLOW **", CR
80C7   454D4F52
80CB   59204F56
80CF   4552464C
80D3   4F57202A
80D7   2A0D

80D9   FF               DB   FFH         ; díra 7 bytů
80DA   FFFF             DW   FFFFH
80DC   FFFFFFFF         DW   FFFFH, FFFFH

Konverzní podprogramy

       Převod ASCII znaku na číslo 00H-0FH v reg. A
       vstup:   A - ASCII kód
       výstup:  A - 00-0F
                CY=1 při chybě (není "0" až "F")
       používá: PSW

80E0   FE30     HEX:    CPI  30H         ; < "0"?
80E2   D8               RC               ; ano, chyba
80E3   FE3A             CPI  3AH         ; > "9"?
80E5   D2EB80           JNC  HEX1
80E8   E60F             ANI  0FH         ; ne, upravit
80EA   C9               RET              ; a hotovo
80EB   E61F     HEX1:   ANI  1FH         ; úprava
80ED   FE01             CPI  01H         ; < "A"?
80EF   D8               RC               ; ano, chyba
80F0   FE07             CPI  07H         ; > "F"?
80F2   3F               CMC
80F3   D8               RC               ; ano, chyba
80F4   C609             ADI  09H         ; ne, upravit
80F6   C9               RET              ; a hotovo

       Převod 2 HEX znaků z bufferu na binární A (00H-FFH)
       vstup:   HL - adresa do bufferu
       výstup:  HL - zvýšeno o 1 (na 2. hex. znak)
                A - výsledek (00H-FFH)
                CY=1 při chybě (znak mimo "0" až "F")
       používá: B, PSW

80F7   7E       PAIRIN: MOV  A, M
80F8   CDE080           CALL HEX         ; první znak
80FB   D8               RC               ; CHYBA
80FC   07               RLC
80FD   07               RLC
80FE   07               RLC
80FF   07               RLC
8100   47               MOV  B, A        ; zapamatuj v B
8101   23               INX  H
8102   7E               MOV  A, M        ; druhý znak
8103   CDE080           CALL HEX
8106   D8               RC               ; CHYBA
8107   B0               ORA  B           ; spojit
8108   C9               RET              ; a hotovo

       Převod 4 HEX znaků z bufferu na 16-ti bitové číslo v DE
       vstup:   HL - adresa do bufferu
       výstup:  HL - zvýšeno o 4 (za poslední hex. znak)
                DE - výsledná binární hodnota
                CY=1 při chybě (znak mimo "0" až "F")
       používá: B, DE, HL, PSW

8109   CDF780   ADRIN:  CALL PAIRIN      ; horní byte
810C   D8               RC               ; CHYBA
810D   57               MOV  D, A        ; uložit do D
810E   23               INX  H
810F   CDF780           CALL PAIRIN      ; dolní byte
8112   5F               MOV  E, A        ; uložit do E
8113   23               INX  H           ; a hotovo
8114   C9               RET              ; (CY=1 při chybě)

       Převod 4 HEX znaků na binární číslo + příprava hlášky
       vstup:   z dialogového řádku
       výstup:  HL - zvýšeno o 4 (za poslední hex. znak)
                DE - výsledná binární hodnota
                CY=1 při chybě (znak mimo "0" až "F")
       používá: B, DE, HL, PSW

8115   219280   TRADR:  LXI  H, MSGADR   ; adresu "** ERROR IN ADDRESS"
8118   2274C0           SHLD MESAGE      ; do zápisníku MESAGE (C074H)
811B   2A72C0           LHLD INPUT       ; ukazatel do dial. řádku
811E   CD0981   L811E:  CALL ADRIN       ; vstup adresy (4 hex. znaky)
8121   2272C0           SHLD INPUT       ; uložit ukazatel
8124   C9               RET

       Převod a výpis bytu z A hexadecimálně (dvěma znaky)
       vstup:   A - binární hodnota
       výstup:  TV obrazovka (2 znaky)
       používá: B, PSW

8125   47       PREVO1: MOV  B, A        ; schovat A
8126   0F               RRC
8127   0F               RRC
8128   0F               RRC
8129   0F               RRC
812A   E60F             ANI  0FH
812C   CD4F81           CALL BINHEX      ; převod a výpis horního půlbytu
812F   CD0085           CALL PRTOUT
8132   78               MOV  A, B
8133   E60F             ANI  0FH
8135   CD4F81           CALL BINHEX      ; převod a výpis dolního půlbytu
8138   C30085           JMP  PRTOUT

       Převod binární hodnoty z A na 2 znaky do bufferu
       vstup:   A - binární hodnota
                HL - adresa do bufferu
       výstup:  HL - zvětšeno o 1 (na 2. hex. znak)
                ASCII hex. znaky v bufferu
       používá: B, PSW

813B   47       PREVO2: MOV  B, A        ; zapamatovat A
813C   0F               RRC
813D   0F               RRC
813E   0F               RRC
813F   0F               RRC
8140   E60F             ANI  0FH
8142   CD4F81           CALL BINHEX      ; převod a uložení znaku
8145   77               MOV  M, A
8146   23               INX  H
8147   78               MOV  A, B
8148   E60F             ANI  0FH
814A   CD4F81           CALL BINHEX      ; převod a uložení znaku
814D   77               MOV  M, A
814E   C9               RET

       Převod binární hodnoty (dolní půlbyte) na hex. znak
       vstup:   A - binární hodnota 00H-0FH (nekontroluje!)
       výstup:  A - ASCII znak  "0" až "F"
       používá: PSW

814F   C690     BINHEX: ADI  90H
8151   27               DAA
8152   CE40             ACI  40H
8154   27               DAA
8155   00               NOP
8156   00               NOP
8157   00               NOP
8158   C9               RET

Příkazy

       Příkaz SUB

8159   CD1581   CMDSUB: CALL TRADR       ; ukládací adresu do DE
815C   DA898A           JC   PRTEXT      ; CHYBA "** ERROR IN ADDRES **"
815F   217080           LXI  H, MSGNOD
8162   2274C0           SHLD MESAGE      ; připravit ** NO DATA **
8165   2A72C0           LHLD INPUT       ; ukazatel do bufferu
8168   7E               MOV  A, M
8169   FE0D             CPI  CR          ; konec řádku?
816B   CA898A           JZ   PRTEXT      ; ano, ** NO DATA **
816E   E5               PUSH H
816F   217E80           LXI  H, MSGDAT   ; připravit "** ERROR IN DATA **"
8172   2274C0           SHLD MESAGE
8175   E1               POP  H
8176   7E       L8176:  MOV  A, M
8177   FE20             CPI  " "         ; mezera mezi hex. znaky?
8179   23               INX  H           ; ano, ignorovat
817A   CA7681           JZ   L8176
817D   FE27             CPI  27H         ; apostrof?
817F   CAB481           JZ   L81B4       ; ano, vstup ASCII řetězce
8182   2B               DCX  H           ; vrátit se na testovaný znak
8183   CDF780           CALL PAIRIN      ; vstup 2 hex. znaků
8186   DA898A           JC   PRTEXT      ; chyba "** ERROR IN DATA **"
8189   12               STAX D           ; OK, byte uložit
818A   13               INX  D           ; zvýšit ukládací adresu
818B   23       L818B:  INX  H           ; další znak
818C   7E               MOV  A, M
818D   FE0D             CPI  CR          ; konec?
818F   C27681           JNZ  L8176       ; ne, pokračuj

       Ukončení příkazu SUB

8192   2A30C0   L8192:  LHLD BUFEDI
8195   3653             MVI  M, "S"      ; připravit text "SUB" do bufferu
8197   23               INX  H
8198   3655             MVI  M, "U"
819A   23               INX  H
819B   3642             MVI  M, "B"
819D   23               INX  H
819E   23               INX  H
819F   7A               MOV  A, D        ; a přidat následující adresu
81A0   CD3B81           CALL PREVO2
81A3   23               INX  H
81A4   7B               MOV  A, E
81A5   CD3B81           CALL PREVO2
81A8   CDEE89           CALL CTREND      ; řídící znak END
81AB   CD6C89           CALL CTRCUR      ; -->
81AE   CD6C89           CALL CTRCUR      ; -->
81B1   C35588           JMP  ZOBRED      ; a vypsat příští příkaz SUB

       Zpracování řetězce znaků

81B4   7E       L81B4:  MOV  A, M
81B5   FE0D             CPI  CR          ; konec příkazového řádku?
81B7   CA9281           JZ   L8192       ; ano, příkaz SUB zpracovat
81BA   FE27             CPI  27H         ; apostrof, konec řetězce?
81BC   CA8B81           JZ   L818B       ; ano, další zpracování
81BF   12               STAX D           ; ne, znak do paměti
81C0   23               INX  H           ; další znak
81C1   13               INX  D           ; další adresa
81C2   C3B481           JMP  L81B4       ; a pokračuj

       Příkaz JUMP

81C5   CD1581   CMDJUM: CALL TRADR       ; adresu do DE
81C8   DA898A           JC   PRTEXT      ; CHYBA "** ERROR IN ADDRES **"
81CB   EB               XCHG             ; adresu do HL
81CC   E5               PUSH H           ; a schovat
81CD   21A880           LXI  H, MSGEXE   ; připravit "** EXECUTIVE **"
81D0   2274C0           SHLD MESAGE      ; do výstupního bufferu
81D3   CD2D89           CALL COPMSG
81D6   2A3AC1           LHLD BUFMSG
81D9   CD5888           CALL ZOBRBU      ; a vypsat
81DC   E1               POP  H           ; vyzvednout cílovou adresu
81DD   FB               EI               ; povolit přerušení
81DE   E9               PCHL             ; a předat řízení (skok)

       Příkaz MEM

81DF   CD1581   CMDMEM: CALL TRADR       ; adresu do DE
81E2   DA898A           JC   PRTEXT      ; chyba "** ERROR IN ADDRES **"
81E5   2A30C0   L81E5:  LHLD BUFEDI      ; v bufferu nechat místo
81E8   010700           LXI  B, 7        ; pro SUB
81EB   09               DAD  B
81EC   0610             MVI  B, 16       ; čítač opakování
81EE   C5       L81EE:  PUSH B           ; uložit ho
81EF   23               INX  H
81F0   3620             MVI  M, " "      ; byty oddělit mezerou
81F2   23               INX  H
81F3   1A               LDAX D           ; byte vyzvednout z paměti
81F4   CD3B81           CALL PREVO2      ; převést na ASCII znak
81F7   C1               POP  B
81F8   05               DCR  B           ; už je 16 bytů?
81F9   13               INX  D           ; ne, připravit další
81FA   C2EE81           JNZ  L81EE       ; ano, hotovo - vypsat
81FD   C35588           JMP  ZOBRED      ; dialogový řádek

       Příkaz DUMP

8200   CD1581   CMDDUM: CALL TRADR       ; adresu do DE
8203   DA898A           JC   PRTEXT      ; chyba "** ERROR IN ADDRES **"
8206   EB               XCHG             ; adresa paměti do HL
8207   0617             MVI  B, 23       ; počet řádků výpisu na TV
8209   C5       L8209:  PUSH B           ; schovat čítač
820A   E5               PUSH H           ; a adresu
820B   3E0D             MVI  A, CR
820D   CD0085           CALL PRTOUT      ; odřádkovat
8210   7C               MOV  A, H
8211   CD2581           CALL PREVO1      ; vypsat horní a dolní část adresy
8214   7D               MOV  A, L
8215   CD2581           CALL PREVO1
8218   3E20             MVI  A, " "      ; oddělit mezerou
821A   CD0085           CALL PRTOUT
821D   0E08             MVI  C, 8        ; čítač bytů na řádku
821F   7E       L821F:  MOV  A, M        ; vypsat byte hexadecimálně
8220   CD2581           CALL PREVO1
8223   3E20             MVI  A, " "      ; a oddělit mezerou
8225   CD0085           CALL PRTOUT
8228   23               INX  H
8229   0D               DCR  C           ; už je 8 bytů?
822A   C21F82           JNZ  L821F       ; ne, další
822D   0E05             MVI  C, 5        ; přidat 5 teček
822F   3E2E     L822F:  MVI  A, "."
8231   CD0085           CALL PRTOUT
8234   0D               DCR  C
8235   C22F82           JNZ  L822F
8238   0E08             MVI  C, 8        ; a 8x ASCII znak
823A   E1               POP  H           ; od původní adresy
823B   7E       L823B:  MOV  A, M
823C   FE20             CPI  " "         ; je menší než " "?
823E   DA7182           JC   L8271       ; ano, nezobrazitelný znak
8241   FE80             CPI  80H         ; je větší než 7FH
8243   D27182           JNC  L8271       ; ano, nezobrazitelný znak
8246   CD0085   L8246:  CALL PRTOUT      ; běžný znak, zobrazit
8249   23               INX  H
824A   0D               DCR  C           ; už 8 znaků?
824B   C23B82           JNZ  L823B       ; ne, další znak
824E   C1               POP  B           ; ano, zpět čítač řádků
824F   05               DCR  B           ; už všechny řádky?
8250   C20982           JNZ  L8209       ; ne, další řádek
8253   E5               PUSH H           ; hotovo, schovat adresu
8254   21B880           LXI  H, MSGCON   ; připravit "CONTINUE ?"
8257   2274C0           SHLD MESAGE      ; do výstupního bufferu
825A   CD2D89           CALL COPMSG
825D   CD4A89           CALL OUTMSG      ; vypsat a počkat na znak
8260   E1               POP  H           ; obnovit adresu
8261   FE89             CPI  89H         ; odpověď je EOL?
8263   0601             MVI  B, 1        ; jen jeden řádek
8265   CA0982           JZ   L8209       ; EOL - vypsat řádek
8268   3E0D             MVI  A, CR       ; není EOL - odřádkovat
826A   CD0085           CALL PRTOUT
826D   C35588           JMP  ZOBRED      ; a vypsat buffer (nový příkaz)
8270   00               NOP
8271   3E2E     L8271:  MVI  A, "."      ; místo netisknutelných
8273   C34682           JMP  L8246       ; znaků "."

Zpracování klíčů a část inicializace

       Nulování oblasti klíčů 7000H-7EFFH
       používá: HL, PSW

8276   210070   VYMAZ:  LXI  H, 7000H    ; poč. adr.
8279   3600     L8279:  MVI  M, 0        ; nulovat byte paměti
827B   23               INX  H           ; zvýšit adresu
827C   7C               MOV  A, H
827D   FE7F             CPI  7FH         ; už je 7F00?
827F   C27982           JNZ  L8279       ; jestli ne, pokraču
8282   C9               RET              ; hotovo

       Test, zda je v seznamu ještě 80 bytů volných
		
8283   21C380   L8283:  LXI  H, MSGMEM   ; připrav "** MEMORY OVERFLOW **"
8286   2274C0   L8286:  SHLD MESAGE
8289   0651             MVI  B, 81       ; délka požadované paměti
828B   2A30C0   L828B:  LHLD BUFEDI      ; počáteční adresu seznamu
828E   2B       L828E:  DCX  H
828F   7E               MOV  A, M
8090   FEFF             CPI  FF          ; vyhledat konec seznamu
8292   C28E82   L8292:  JNZ  L828E
8295   05       L8295:  DCR  B           ; již nalezeno 80 volných bytů?
8296   CA768B           JZ   SAVKEY      ; ano, uložit klíč
8299   2B               DCX  H           ; ne, testuj, zda je i další
829A   7E               MOV  A, M        ; byte volný
829B   FE00             CPI  0
829D   CA9582   L829D:  JZ   L8295       ; je
82A0   C3898A           JMP  PRTEXT      ; není, "** MEMORY OVERFLOW **"

       Inicializace při studeném startu monitoru
       Protože oblast od adresy 82B5H má první byte 0DH až na adrese 84C0H,
       přepíše se od C1F0H až do C453H.

82A3   21B582   CLDINY: LXI  H, L82B5    ; inicializace pracovní oblasti
82A6   11F0C1           LXI  D, CODJOB   ; na adrese C1F0H-C1FFH
82A9   CD3789           CALL COPWRK
82AC   CD478A           CALL WRKINY      ; inicializace ostatních oblastí
82AF   CD628A   L82AF:  CALL CLDCLS      ; výmaz obrazovky
82B2   C3B98D           JMP  INIMGF      ; a inicializace USARTu (8251)

       Následujícím obsahem se inicializuje oblast C1F0H-C1FFH

82B5   CD008C   L82B5:  CALL TRANSF      ; výkonný kód pro příkaz JOB
82B8   0000             DW   0
82BA   0025             DW   2500H
82BC   0000             DW   0
82BE   C9               RET

82BF   A8               XRA  B           ; kód pro vykreslení bodu na TV
82C0   77               MOV  M, A
82C1   C1               POP  B
82C2   D1               POP  D
82C3   E1               POP  H
82C4   C9               RET

82C5   FF               DB   FFH         ; díra 59 bytů
82C6   FFFF             DW   FFFFH
82C8   FFFFFFFF         DW   FFFFH, FFFFH
82CC   FFFFFFFF         DW   FFFFH, FFFFH
82D0   FFFFFFFF         DW   FFFFH, FFFFH
82D4   FFFFFFFF         DW   FFFFH, FFFFH
82D8   FFFFFFFF         DW   FFFFH, FFFFH
82DC   FFFFFFFF         DW   FFFFH, FFFFH
82E0   FFFFFFFF         DW   FFFFH, FFFFH
82E4   FFFFFFFF         DW   FFFFH, FFFFH
82E8   FFFFFFFF         DW   FFFFH, FFFFH
82EC   FFFFFFFF         DW   FFFFH, FFFFH
82F0   FFFFFFFF         DW   FFFFH, FFFFH
82F4   FFFFFFFF         DW   FFFFH, FFFFH
82F8   FFFFFFFF         DW   FFFFH, FFFFH
82FC   FFFFFFFF         DW   FFFFH, FFFFH

Tabulka příkazů monitoru a adres výkonných částí

       Pozor! Adresy jsou uloženy v pořadí LSB, MSB.

8300   53554220 TABPR:  DB   "SUB "      ; 8159H
8304   8159             DB   81H, 59H
8306   4A554D50         DB   "JUMP "     ; 81C5H
830A   20
830B   81C5             DB   81H, C5H
830D   4D454D20         DB   "MEM "      ; 81DFH
8311   81DF             DB   81H, DFH
8313   2320             DB   "# "        ; 6000H
8315   6000             DB   60H, 00H
8317   44554D50         DB   "DUMP "     ; 8200H
831B   20
831C   8200             DB   82H, 00H
831E   42415349         DB   "BASIC "    ; 8C60H
8322   4320
8324   8C60             DB   8CH, 60H
8326   4D474C44         DB   "MGLD "     ; 8EA9H
832A   20
832B   8EA9             DB   8EH, A9H
832D   4D475356         DB   "MGSV "     ; 8F47H
8331   20
8332   8F47             DB   8FH, 47H
8334   4D47454E         DB   "MGEND "    ; 8F53H
8338   4420
833A   8F53             DB   8FH, 53H
833C   4A4F4220         DB   "JOB "      ; 8C54H
8340   8C54             DB   8CH, 54H

8342   FFFF             DW   FFFFH       ; díra 190 bytů
8344   FFFFFFFF         DW   FFFFH, FFFFH
8348   FFFFFFFF         DW   FFFFH, FFFFH
834C   FFFFFFFF         DW   FFFFH, FFFFH
8350   FFFFFFFF         DW   FFFFH, FFFFH
8354   FFFFFFFF         DW   FFFFH, FFFFH
8358   FFFFFFFF         DW   FFFFH, FFFFH
835C   FFFFFFFF         DW   FFFFH, FFFFH
8360   FFFFFFFF         DW   FFFFH, FFFFH
8364   FFFFFFFF         DW   FFFFH, FFFFH
8368   FFFFFFFF         DW   FFFFH, FFFFH
836C   FFFFFFFF         DW   FFFFH, FFFFH
8370   FFFFFFFF         DW   FFFFH, FFFFH
8374   FFFFFFFF         DW   FFFFH, FFFFH
8378   FFFFFFFF         DW   FFFFH, FFFFH
837C   FFFFFFFF         DW   FFFFH, FFFFH
8380   FFFFFFFF         DW   FFFFH, FFFFH
8384   FFFFFFFF         DW   FFFFH, FFFFH
8388   FFFFFFFF         DW   FFFFH, FFFFH
838C   FFFFFFFF         DW   FFFFH, FFFFH
8390   FFFFFFFF         DW   FFFFH, FFFFH
8394   FFFFFFFF         DW   FFFFH, FFFFH
8398   FFFFFFFF         DW   FFFFH, FFFFH
839C   FFFFFFFF         DW   FFFFH, FFFFH
83A0   FFFFFFFF         DW   FFFFH, FFFFH
83A4   FFFFFFFF         DW   FFFFH, FFFFH
83A8   FFFFFFFF         DW   FFFFH, FFFFH
83AC   FFFFFFFF         DW   FFFFH, FFFFH
83B0   FFFFFFFF         DW   FFFFH, FFFFH
83B4   FFFFFFFF         DW   FFFFH, FFFFH
83B8   FFFFFFFF         DW   FFFFH, FFFFH
83BC   FFFFFFFF         DW   FFFFH, FFFFH
83C0   FFFFFFFF         DW   FFFFH, FFFFH
83C4   FFFFFFFF         DW   FFFFH, FFFFH
83C8   FFFFFFFF         DW   FFFFH, FFFFH
83CC   FFFFFFFF         DW   FFFFH, FFFFH
83D0   FFFFFFFF         DW   FFFFH, FFFFH
83D4   FFFFFFFF         DW   FFFFH, FFFFH
83D8   FFFFFFFF         DW   FFFFH, FFFFH
83DC   FFFFFFFF         DW   FFFFH, FFFFH
83E0   FFFFFFFF         DW   FFFFH, FFFFH
83E4   FFFFFFFF         DW   FFFFH, FFFFH
83E8   FFFFFFFF         DW   FFFFH, FFFFH
83EC   FFFFFFFF         DW   FFFFH, FFFFH
83F0   FFFFFFFF         DW   FFFFH, FFFFH
83F4   FFFFFFFF         DW   FFFFH, FFFFH
83F8   FFFFFFFF         DW   FFFFH, FFFFH
83FC   FFFFFFFF         DW   FFFFH, FFFFH

Tabulka kódů klávesnice - přiřazení klávesám

       Základní znaky

8400   3E       TABKBD: DB   00111110B   ; K0  K1  K2  K3  K4   K5  K6  K7
                                         ; K8  K9  K10 K11 WRK  C-D RCL
8401   D0D1D2D3         DB   D0H, D1H, D2H, D3H
8405   D4D5D6D7         DB   D4H, D5H, D6H, D7H
8409   D8D9DADB         DB   D8H, D9H, DAH, DBH
840D   A08AA2           DB   A0H, 8AH, A2H

8410   3D               DB   00111101B   ; 1   2   3   4   5    6   7   8
                                         ; 9   0   _       INS  DEL CLR
8411   31323334         DB   "1234"
8415   35363738         DB   "5678"
8419   39305FFF         DB   "90_", FFH
841D   80818D           DB   80H, 81H, 8DH

8420   3B               DB   00111011B   ; Q   W   E   R   T    Z   U   I
                                         ; O   P   @   \   <--  <^- -->
8421   51574552         DB   "QWER"
8425   545A5549         DB   "TZUI"
8429   4F50405C         DB   "OP@\"
842D   838485           DB   83H, 84H, 85H

8430   37               DB   00110111B   ; A   S   D   F   G    H   J   K
                                         ; L   ;   :   [   |<-- END -->|
8431   41534446         DB   "ASDF"
8435   47484A4B         DB   "GHJK"
8439   4C3B3A5B         DB   "L;:["
843D   868788           DB   86H, 87H, 88H

8440   2F               DB   00101111B   ; SPC Y   X   C   V    B   N   M
                                         ; ,   .   /       STOP EOL EOL
8441   20595843         DB   " YXC"
8445   56424E4D         DB   "VBNM"
8449   2C2E2FFF         DB   ",./", FFH
844D   A18989           DB   A1H, 89H, 89H

       Znaky + SHIFT

8450   1E               DB   00011110B   ; K0  K1  K2  K3  K4   K5  K6  K7
                                         ; K8  K9  K10 K11 WRK  C-D RCL
8451   E0E1E2E3         DB   E0H, E1H, E2H, E3H
8455   E4E5E6E7         DB   E4H, E5H, E6H, E7H
8459   E8E9EAEB         DB   E8H, E9H, EAH, EBH
845D   A393A5           DB   A3H, 93H, A5H

8460   1D               DB   00011101B   ; !   "   #   $   %    &   '   (
                                         ; )   -   =       INS  DEL CLR
8461   21222324         DB   21H, 22H, 23H, 24H
8465   25262728         DB   25H, 26H, 27H, 28H
8469   292D3DFF         DB   29H, 2DH, 3DH, FFH
846D   8B8C82           DB   8BH, 8CH, 82H

8470   1B               DB   00011011B   ; q   w   e   r   t    z   u   i
                                         ; o   p   CR  ^   8E   8F  94
8471   71776572         DB   71H, 77H, 65H, 72H
8475   747A7569         DB   74H, 7AH, 75H, 69H
8479   6F700D5E         DB   6FH, 70H, 0DH, 5EH
847D   8E8F94           DB   8EH, 8FH, 94H

8480   17               DB   00010111B   ; a   s   d   f   g    h   j   k
                                         ; l   +   *   ]   90   91  92
8481   61736466         DB   61H, 73H, 64H, 66H
8485   67686A6B         DB   67H, 68H, 6AH, 6BH
8489   6C2B2A5D         DB   6CH, 2BH, 2AH, 5DH
848D   909192           DB   90H, 91H, 92H

8490   0F               DB   00001111B   ;     y   x   c   v    b   n   m
                                         ; <   >   ?       A4   89  89
8491   20797863         DB   20H, 79H, 78H, 63H
8495   76626E6D         DB   76H, 62H, 6EH, 6DH
8499   3C3E3FFF         DB   3CH, 3EH, 3FH, FFH
849D   A48989           DB   A4H, 89H, 89H

84A0   00               DB   00H         ; indikace konce tabulky

Vstup znaku z klávesnice

       vstup:   stisknutá klávesa
       výstup:  A - kód znaku z klávesnice
                (C134H) - kód znaku z klávesnice
       používá: PSW

84A1   C5       KEYBD:  PUSH B           ; úklid registrů
84A2   D5               PUSH D
84A3   E5               PUSH H
84A4   1C       L84A4:  INR  E           ; další sloupec klávesnice (na začát-
84A5   7B               MOV  A, E        ; ku libovolný)
84A6   E60F             ANI  0F          ; v rozsahu 0H-0FH
84A8   5F               MOV  E, A        ; schovat do E
84A9   D3F4             OUT  F4H         ; a nahodit
84AB   DBF5             IN   F5H         ; odezvu
84AD   E63F             ANI  3FH         ; oříznout
84AF   57               MOV  D, A        ; a schovat do D
84B0   2F               CMA
84B1   E61F             ANI  1FH         ; je některý řádek aktivní
84B3   CAA484           JZ   L84A4       ; ne, testuj dál

84B6   0E00     L84B6:  MVI  C, 00       ; připravit zpoždění
84B8   DBF5     L84B8:  IN   F5H
84BA   2F               CMA
84BB   E61F             ANI  1FH
84BD   CAB684           JZ   L84B6       ; čekej na ustálení klávesy
84C0   0D               DCR  C           ; ustálená dostatečně dlouho
84C1   C2B884           JNZ  L84B8       ; ne, ještě čekej
84C4   011000           LXI  B, 16       ; délka položky v tabulce
84C7   21F083           LXI  H, TABKBD-16; adresa tabulky mínus 16
84CA   09       L84CA:  DAD  B           ; další položka tabulky
84CB   7E               MOV  A, M
84CC   FE00             CPI  0           ; konec tabulky?
84CE   CAD984           JZ   L84D9       ; ano, ven
84D1   BA               CMP  D           ; odpovídá řádku?
84D2   C2CA84           JNZ  L84CA       ; ne, další položku
84D5   23               INX  H           ; ano, spočítat
84D6   1600             MVI  D, 0        ; podle sloupce v E
84D8   19               DAD  D           ; adresu znaku

84D9   0E00     L84D9:  MVI  C, 0        ; počkat na uvolnění klávesy
84DB   DBF5     L84DB:  IN   F5H
84DD   2F               CMA
84DE   E61F             ANI  1FH
84E0   C2D984           JNZ  L84D9
84E3   0D               DCR  C
84E4   C2DB84           JNZ  L84DB

84E7   7E               MOV  A, M        ; ASCII kód z tabulky do A
84E8   3234C1           STA  CHAR        ; a do zápisníku CHAR (C134H)
84EB   E1               POP  H
84EC   D1               POP  D
84ED   C1               POP  B           ; a obnovit registry
84EE   C9               RET              ; a hotovo

84EF   FF               DB   FFH         ; díra 1 byte

       Skok na vstup znaku z klávesnice - sem se odvolává Basic-G

84F0   C3A184   L84F0:  JMP  KEYBD

       Přečtení obsahu bytu z obrazovky
       vstup:   (C17AH) - adresa na obrazovce
       výstup:  A - bez barevných atributů
       používá: HL, PSW

84F3   2A7AC1   BREAD:  LHLD BREAIN      ; adresa do V-RAM
84F6   7E               MOV  A, M
84F7   E63F             ANI  3FH         ; jen dolních 6 bitů
84F9   C9               RET

84FA   FFFF             DW   FFFFH       ; díra 6 bytů
84FC   FFFFFFFF         DW   FFFFH, FFFFH

Výstup znaku na obrazovku

       Program ignoruje mód kreslení bodu!!
       vstup:   A - kód znaku: tisknutelné zobrazit
                               0DH (CR) - scroll
                               1CH - výmaz obrazovky
                               ostatní ignorovat
                               (C03EH) - kurzor - adresa ve V-RAM
                               (C03CH) - ukazatel tabulky znaků
                               (C03AH) - barevné atributy
       používá: PSW

8500   D5       PRTOUT: PUSH D           ; úklid registrů
8501   E5               PUSH H
8502   C5               PUSH B
8503   47               MOV  B, A        ; znak schovat
8504   FE0D             CPI  CR          ; CR?
8506   CA2A85           JZ   L852A       ; ano, odřádkovat
8509   FE0A             CPI  0AH         ; LF?
850B   CA2685   L850B:  JZ   L8526       ; ano, ignorovat
850E   FE1C             CPI  1CH         ; CLS?
8510   CA7C85           JZ   L857C       ; ano, smazat obraz
8513   2A3EC0           LHLD CURSOR
8516   7D               MOV  A, L        ; pozice na řádku
8517   E63F             ANI  3FH
8519   FE30             CPI  48          ; dosáhla 48?
851B   CA2685           JZ   L8526       ; ano, znak ignorovat
851E   78               MOV  A, B        ; ne, znak vrátit do A
851F   CD8485           CALL ECHO        ; a zobrazit
8522   23               INX  H           ; zvýšit pozici na řádku?
8523   223EC0   L8523:  SHLD CURSOR      ; a schovat
8526   C1       L8526:  POP  B           ; obnovit registry
8527   E1               POP  H
8528   D1               POP  D
8529   C9               RET              ; a hotovo

       Zpracovat CR (přechod na nový řádek)

852A   00       L852A:  NOP
852B   00               NOP
852C   00               NOP
852D   2100C0           LXI  H, C000H    ; začátek V-RAM
8530   0EF0             MVI  C, 10*24    ; rolovat přes 240 TV řádků
8532   E5       L8532:  PUSH H
8533   114002           LXI  D, 9*64     ; rozdíl adres
8536   19               DAD  D           ; adresa 1. přesouvaného bytu do DE
8537   EB               XCHG
8538   E1               POP  H           ; začátek V-RAM do HL

       Přesunout jeden TV řádek

8539   1A       L8539:  LDAX D           ; přesun jednoho bytu
853A   77               MOV  M, A
853B   23               INX  H           ; zvýšení adres
853C   13               INX  D
853D   7D               MOV  A, L        ; již přesunuto 48 znaků?
853E   2F               CMA
853F   E630             ANI  30H
8541   C23985           JNZ  L8539       ; ne, další byte
8544   0D               DCR  C           ; ano, už všechny TV řádky?
8545   CA5385           JZ   L8553       ; ano, rolování hotovo, nuluj
8548   114000           LXI  D, 64       ; ne, spočítat adresu dalšího
854B   19               DAD  D           ; přesouvaného TV řádku
854C   7D               MOV  A, L
854D   E6C0             ANI  C0H
854F   6F               MOV  L, A
8550   C33285           JMP  L8532       ; a pokračuj

       Smaže dialogový řádek

8553   2180F9   L8553:  LXI  H, F980H    ; adresa začátku dolního řádku
8556   0E0B             MVI  C, 11       ; počet TV řádků

       Nulování části displeje podle nastavených atributů
       vstup:   HL - adresa prvního TV řádku
                C - počet TV řádků
       používá: C, DE, HL, PSW

8558   3A3AC0   L8558:  LDA  CPOINT      ; atributy
855B   57               MOV  D, A
855C   AF               XRA  A
855D   B2               ORA  D
855E   77               MOV  M, A        ; doplnit do V-RAM
855F   23               INX  H
8560   7D               MOV  A, L
8561   2F               CMA
8562   E630             ANI  30H         ; již 48 znaků?
8564   C25885           JNZ  L8558       ; ne, nuluj dál
8567   0D               DCR  C           ; už všechny TV řádky?
8568   CA7685           JZ   L8576       ; ano, ven
856B   114000           LXI  D, 64       ; ne, spočítat adresu
856E   19               DAD  D
856F   7D               MOV  A, L
8570   E6C0             ANI  C0H
8572   6F               MOV  L, A
8573   C35885           JMP  L8558       ; a pokračovat

       Výstup znaku do dialogového řádku

8576   2100FB   L8576:  LXI  H, FB00H    ; adresa do V-RAM
8579   C32385           JMP  L8523       ; a dokončit PRTOUT

       Výmaz celé obrazovky - CLS

857C   2100C0   L857C:  LXI  H, C000H    ; adresa začátku V-RAM
857F   0E00             MVI  C, 0        ; čítač - 256 TV řádků
8581   C35885           JMP  L8558       ; nulování obrazovky

       Zobrazení ASCII znaku
       vstup:   HL - pozice kurzoru
                A - kód znaku
       používá: BC, PSW

8584   D5       ECHO:   PUSH D           ; uklidit registry
8585   E5               PUSH H
8586   E5               PUSH H
8587   2600     L8587:  MVI  H, 0        ; do DE ASCII znak * 8
8589   6F               MOV  L, A
858A   29               DAD  H
858B   29               DAD  H
858C   29               DAD  H
858D   EB               XCHG
858E   2A3CC0           LHLD TASCII      ; tabulka znaků
8591   19               DAD  D           ; spočítat adresu znaku
8592   E5               PUSH H           ; přesunout ji
8593   C1               POP  B           ; do BC
8594   E1               POP  H           ; vyzvednout pozici kurzoru
8595   1180FD           LXI  D, -(64*10)
8598   19               DAD  D           ; spočítat adresu ve V-RAM
8599   3A3AC0   L8599:  LDA  CPOINT
859C   57               MOV  D, A        ; atributy schovat do D
859D   0A               LDAX B           ; byte z tabulky znaků
859E   AA               XRA  D           ; doplnit o atributy
859F   77               MOV  M, A        ; a uložit do V-RAM
85A0   114000           LXI  D, 64
85A3   19               DAD  D           ; adresa dalšího bytu ve V-RAM
85A4   03               INX  B           ; další byte tabulky
85A5   79               MOV  A, C
85A6   E607             ANI  7           ; již přesunuto 8 bytů?
85A8   C29985           JNZ  L8599       ; ne, pokračuj
85AB   E1               POP  H           ; hotovo, obnov HL a DE
85AC   D1               POP  D
85AD   C9               RET

85AE   FFFF             DW   FFFFH       ; díra 2 byty

       Řídící znak 89H EOL - odeslání příkazu

85B0   CDEE88   CTREOL: CALL LENEDI
85B3   4D               MOV  C, L        ; délku dialogového řádku do C
85B4   C5               PUSH B           ; a schovat
85B5   3A37C1           LDA  FPTL        ; je aktivní PTL?
85B8   B7               ORA  A
85B9   CCDA8B           CZ   LINECH      ; ano, řádek echovat
85BC   2A78C0           LHLD BUFOUT
85BF   EB               XCHG             ; DE - adresa vyrovnávacího bufferu
85C0   2A30C0           LHLD BUFEDI      ; HL - adresa edit. bufferu
85C3   C1               POP  B           ; C - délka dialog. řádku
85C4   7E       L85C4:  MOV  A, M
85C5   12               STAX D
85C6   7D               MOV  A, L
85C7   B9               CMP  C           ; překopírovat editační buffer
85C8   23               INX  H           ; do vyrovnávacího
85C9   13               INX  D
85CA   C2C485           JNZ  L85C4
85CD   3E0D             MVI  A, CR       ; ukončit znakem CR
85CF   12               STAX D

85D0   3EEE             MVI  A, EEH      ; uložit řádek do klíče EEH
85D2   3234C1           STA  CHAR        ; tj. RCL
85D5   CD768B           CALL SAVKEY

85D8   2A7AC0           LHLD SAVESP      ; obnovit zásobník
85DB   F9               SPHL
85DC   2A76C0           LHLD SAVRET      ; a návratovou adresu
85DF   00               NOP

85E0   3E83             MVI  A, 83H      ; jako znak z klávesnice vzít
85E2   3234C1           STA  CHAR        ; znak <--
85E5   E9               PCHL             ; a skok na návratovou adresu

       Test bodu
       vstup:   (C170H) - X
                (C172H) - Y
       výstup:  A=0/1 - bod svítí / nesvítí
       používá: HL, PSW

85E6   2AFAC1   L85E6:  LHLD CODSET
85E9   E5               PUSH H           ; schovat mód zobrazení
85EA   21A000           LXI  H, 00A0H
85ED   22FAC1           SHLD CODSET      ; a nahradit režimem XOR
85F0   CD7D8C           CALL POINT       ; vynést bod
85F3   E1               POP  H
85F4   22FAC1           SHLD CODSET      ; obnovit mód zobrazení
85F7   B7               ORA  A           ; nastavit reg. A
85F8   C8               RZ               ; podle výsledku
85F9   3E01             MVI  A, 01H
85FB   C9               RET

85FC   FFFFFFFF         DW   FFFFH, FFFFH ; díra 4 byty

Tabulka pro generování znaků

8600   00000000 TABZN:  DB   00H, 00H, 00H, 00H ; SPC
8604   00000000         DB   00H, 00H, 00H, 00H
8608   04040404         DB   04H, 04H, 04H, 04H ; !
860C   04000400         DB   04H, 00H, 04H, 00H
8610   0A0A0000         DB   0AH, 0AH, 00H, 00H ; "
8614   00000000         DB   00H, 00H, 00H, 00H
8618   0A0A1F0A         DB   0AH, 0AH, 1FH, 0AH ; #
861C   1F0A0A00         DB   1FH, 0AH, 0AH, 00H
8620   0E15150E         DB   0EH, 15H, 15H, 0EH ; $
8624   14150E00         DB   14H, 15H, 0EH, 00H
8628   03130804         DB   03H, 13H, 08H, 04H ; %
862C   02191800         DB   02H, 19H, 18H, 00H
8630   040A0A06         DB   04H, 0AH, 0AH, 06H ; &
8634   15091600         DB   15H, 09H, 16H, 00H
8638   04040200         DB   04H, 04H, 02H, 00H ; '
863C   00000000         DB   00H, 00H, 00H, 00H
8640   08040202         DB   08H, 04H, 02H, 02H ; (
8644   02040800         DB   02H, 04H, 08H, 00H
8648   02040808         DB   02H, 04H, 08H, 08H ; )
864C   08040200         DB   08H, 04H, 02H, 00H
8650   0004150E         DB   00H, 04H, 15H, 0EH ; *
8654   15040000         DB   15H, 04H, 00H, 00H
8658   0004041F         DB   00H, 04H, 04H, 1FH ; +
865C   04040000         DB   04H, 04H, 00H, 00H
8660   00000000         DB   00H, 00H, 00H, 00H ; ,
8664   02020100         DB   02H, 02H, 01H, 00H
8668   0000001F         DB   00H, 00H, 00H, 1FH ; -
866C   00000000         DB   00H, 00H, 00H, 00H
8670   00000000         DB   00H, 00H, 00H, 00H ; .
8674   00000200         DB   00H, 00H, 02H, 00H
8678   00100804         DB   00H, 10H, 08H, 04H ; /
867C   02010000         DB   02H, 01H, 00H, 00H
8680   0E111915         DB   0EH, 11H, 19H, 15H ; 0
8684   13110E00         DB   13H, 11H, 0EH, 00H
8688   04060404         DB   04H, 06H, 04H, 04H ; 1
868C   04040E00         DB   04H, 04H, 0EH, 00H
8690   0E11100C         DB   0EH, 11H, 10H, 0CH ; 2
8694   02011F00         DB   02H, 01H, 1FH, 00H
8698   1F10081C         DB   1FH, 10H, 08H, 1CH ; 3
869C   10110E00         DB   10H, 11H, 0EH, 00H
86A0   080C0A09         DB   08H, 0CH, 0AH, 09H ; 4
86A4   1F080800         DB   1FH, 08H, 08H, 00H
86A8   1F010F10         DB   1FH, 01H, 0FH, 10H ; 5
86AC   10110E00         DB   10H, 11H, 0EH, 00H
86B0   1C02010F         DB   1CH, 02H, 01H, 0FH ; 6
86B4   11110E00         DB   11H, 11H, 0EH, 00H
86B8   1F100804         DB   1FH, 10H, 08H, 04H ; 7
86BC   02020200         DB   02H, 02H, 02H, 00H
86C0   0E11110E         DB   0EH, 11H, 11H, 0EH ; 8
86C4   11110E00         DB   11H, 11H, 0EH, 00H
86C8   0E11111E         DB   0EH, 11H, 11H, 1EH ; 9
86CC   10080700         DB   10H, 08H, 07H, 00H
86D0   00000000         DB   00H, 00H, 00H, 00H ; :
86D4   02000200         DB   02H, 00H, 02H, 00H
86D8   00000400         DB   00H, 00H, 04H, 00H ; ;
86DC   04040200         DB   04H, 04H, 02H, 00H
86E0   08040201         DB   08H, 04H, 02H, 01H ; <
86E4   02040800         DB   02H, 04H, 08H, 00H
86E8   00001F00         DB   00H, 00H, 1FH, 00H ; =
86EC   1F000000         DB   1FH, 00H, 00H, 00H
86F0   02040810         DB   02H, 04H, 08H, 10H ; >
86F4   08040200         DB   08H, 04H, 02H, 00H
86F8   0E111008         DB   0EH, 11H, 10H, 08H ; ?
86FC   04000400         DB   04H, 00H, 04H, 00H
8700   06111915         DB   06H, 11H, 19H, 15H ; @
8704   1D010E00         DB   1DH, 01H, 0EH, 00H
8708   040A1111         DB   04H, 0AH, 11H, 11H ; A
870C   1F111100         DB   1FH, 11H, 11H, 00H
8710   0F11110F         DB   0FH, 11H, 11H, 0FH ; B
8714   11110F00         DB   11H, 11H, 0FH, 00H
8718   0E110101         DB   0EH, 11H, 01H, 01H ; C
871C   01110E00         DB   01H, 11H, 0EH, 00H
8720   0F121212         DB   0FH, 12H, 12H, 12H ; D
8724   12120F00         DB   12H, 12H, 0FH, 00H
8728   1F01010F         DB   1FH, 01H, 01H, 0FH ; E
872C   01011F00         DB   01H, 01H, 1FH, 00H
8730   1F01010F         DB   1FH, 01H, 01H, 0FH ; F
8734   01010100         DB   01H, 01H, 01H, 00H
8738   0E010101         DB   0EH, 11H, 01H, 01H ; G
873C   19111E00         DB   19H, 11H, 1EH, 00H
8740   1111111F         DB   11H, 11H, 11H, 1FH ; H
8744   11111100         DB   11H, 11H, 11H, 00H
8748   0E040404         DB   0EH, 04H, 04H, 04H ; I
874C   04040E00         DB   04H, 04H, 0EH, 00H
8750   10101010         DB   10H, 10H, 10H, 10H ; J
8754   11110E00         DB   11H, 11H, 0EH, 00H
8758   11090503         DB   11H, 09H, 05H, 03H ; K
875C   05091100         DB   05H, 09H, 11H, 00H
8760   01010101         DB   01H, 01H, 01H, 01H ; L
8764   01010F00         DB   01H, 01H, 0FH, 00H
8768   111B1515         DB   11H, 1BH, 15H, 15H ; M
876C   11111100         DB   11H, 11H, 11H, 00H
8770   11111315         DB   11H, 11H, 13H, 15H ; N
8774   19111100         DB   19H, 11H, 11H, 00H
8778   0E111111         DB   0EH, 11H, 11H, 11H ; O
877C   11110E00         DB   11H, 11H, 0EH, 00H
8780   0F11110F         DB   0FH, 11H, 11H, 0FH ; P
8784   01010100         DB   01H, 01H, 01H, 00H
8788   0E111111         DB   0EH, 11H, 11H, 11H ; Q
878C   15091600         DB   15H, 09H, 16H, 00H
8790   0F11110F         DB   0FH, 11H, 11H, 0FH ; R
8794   05091100         DB   05H, 09H, 11H, 00H
8798   0E11010E         DB   0EH, 11H, 01H, 0EH ; S
879C   10110E00         DB   10H, 11H, 0EH, 00H
87A0   1F040404         DB   1FH, 04H, 04H, 04H ; T
87A4   04040400         DB   04H, 04H, 04H, 00H
87A8   11111111         DB   11H, 11H, 11H, 11H ; U
87AC   11110E00         DB   11H, 11H, 0EH, 00H
87B0   1111110A         DB   11H, 11H, 11H, 0AH ; V
87B4   0A040400         DB   0AH, 04H, 04H, 00H
87B8   11111115         DB   11H, 11H, 11H, 15H ; W
87BC   15150A00         DB   15H, 15H, 0AH, 00H
87C0   11110A04         DB   11H, 11H, 0AH, 04H ; X
87C4   0A111100         DB   0AH, 11H, 11H, 00H
87C8   11110A04         DB   11H, 11H, 0AH, 04H ; Y
87CC   04040400         DB   04H, 04H, 04H, 00H
87D0   1F100804         DB   1FH, 10H, 08H, 04H ; Z
87D4   02011F00         DB   02H, 01H, 1FH, 00H
87D8   07010101         DB   07H, 01H, 01H, 01H ; [
87DC   01010700         DB   01H, 01H, 07H, 00H
87E0   00010204         DB   00H, 01H, 02H, 04H ; \
87E4   08100000         DB   08H, 10H, 00H, 00H
87E8   1C101010         DB   1CH, 10H, 10H, 10H ; ]
87EC   10101C00         DB   10H, 10H, 1CH, 00H
87F0   0E110000         DB   0EH, 11H, 00H, 00H ; ^
87F4   00000000         DB   00H, 00H, 00H, 00H
87F8   00000000         DB   00H, 00H, 00H, 00H ; _
87FC   00001F00         DB   00H, 00H, 1FH, 00H

       Zpracování znaků při vstupu dialogového řádku
       vstup:   (C134H) - kód znaku z klávesnice
                (C130H) - nejvyšší řídící znak
                (C131H) - nejnižší řídící znak
                (C132H) - tabulka řídících znaků
       používá: vše

8800   D5       EDIT:   PUSH D
8801   E5               PUSH H
8802   C5               PUSH B
8803   3A34C1           LDA  CHAR        ; znak z klávesnice
8806   47               MOV  B, A        ; znak schovat
8807   212685           LXI  H, L8526    ; obnoví registry
880A   E5               PUSH H           ; a RET, uložit návratovou adresu
880B   2A30C1   L880B:  LHLD MINCTR      ; do HL rozsah řídících znaků
880E   BC               CMP  H           ; znak > MAX?
880F   D2408B           JNC  CTRKEY      ; ano, ošetřit klíč
8812   CD798B           CALL WRKOFF      ; ne, reaktivovat (WRK)
8815   BD               CMP  L           ; znak < MIN?
8816   DA2D88           JC   L882D       ; ano, nejde o řídící znak
8819   2A32C1           LHLD ADRCTR      ; adresa tabulky řídících znaků
881C   23       L881C:  INX  H
881D   23               INX  H
881E   7E               MOV  A, M        ; znak z tabulky
881F   FEFF             CPI  FFH         ; konec tabulky?
8821   C8               RZ               ; ano, ven
8822   B8               CMP  B           ; je to přijatý znak?
8823   23               INX  H
8824   C21C88           JNZ  L881C       ; ne, další položku
8827   46               MOV  B, M        ; ano, vyzvednout adresu ošetření
8828   23               INX  H           ; znaku
8829   66               MOV  H, M
882A   68               MOV  L, B
882B   E9               PCHL             ; a skok

882C   FF               DB   FFH         ; díra 1 byte

       Ošetření tisknutelného znaku

882D   CD7488   L882D:  CALL L8874       ; HL - adresa v editačním bufferu
8830   77               MOV  M, A        ; znak do bufferu
8831   3E45             MVI  A, 69
8833   BD               CMP  L           ; už 69 pozice?
8834   CCA388           CZ   PIIP        ; ano - signál
8837   2A36C0           LHLD DCURS
883A   3E2F             MVI  A, 47
883C   BD               CMP  L           ; kurzor na konci řádku?
883D   CA4A88           JZ   CTRDIL      ; ano, provést |<--
8840   CD8C88           CALL RIGHT       ; posunout kurzor
8843   2C               INR  L
8844   2236C0           SHLD DCURS
8847   C35588           JMP  ZOBRED      ; a aktualizovat dialogový řádek

       Řídící znak 86H |<-- posunutí řádku doleva

884A   2A38C0   CTRDIL: LHLD DPOS        ; vzdálenost dialogového řádku
884D   3E20             MVI  A, 32
884F   BD               CMP  L           ; jde ještě posunout?
8850   C8               RZ               ; ne - ven
8851   23               INX  H           ; ano - posunout
8852   2238C0   L8852:  SHLD DPOS        ; a schovat

       Echování dialogového řádku na displeji

8855   CD6B88   ZOBRED: CALL L886B       ; do DE adresu prvního
8858   EB       ZOBRBU: XCHG             ; zobrazovaného znaku
8859   2A32C0           LHLD ADRDIA      ; do HL adresu dial. řádku na TV
885C   1A       L885C:  LDAX D
885D   CD8485           CALL ECHO        ; zobrazit znak
8860   13               INX  D
8861   23               INX  H
8862   7D               MOV  A, L
8863   E63F             ANI  3FH
8865   FE2F             CPI  47          ; zobrazeny všechny znaky?
8867   C25C88           JNZ  L885C       ; ne, další znak
886A   C9               RET              ; ano

       Výpočet adresy začátku dialogového řádku v editačním bufferu
       výstup:  HL - adresa
       používá: DE, HL

886B   2A30C0   L886B:  LHLD BUFEDI      ; adresa editačního bufferu
886E   EB               XCHG             ; poznačit pozici
886F   2A38C0           LHLD DPOS
8872   19               DAD  D
8873   C9               RET

       Výpočet adresy kurzoru v editačním bufferu
       výstup:  HL - adresa
       používá: DE, HL

8874   CD6B88   L8874:  CALL L886B       ; adresuj počátek dialogového řádku
8877   E5               PUSH H
8878   2A36C0           LHLD DCURS       ; a pozici kurzoru v dial. řádku
887B   EB               XCHG
887C   E1               POP  H
887D   19               DAD  D           ; přičti
887E   C9               RET

       Smazání kurzoru v dialogovém řádku na TV
       výstup:  HL - adresa kurzoru na TV
       používá: DE, HL, PSW

887F   2A36C0   CUROFF: LHLD DCURS
8882   EB               XCHG
8883   2A32C0           LHLD ADRDIA
8886   19               DAD  D           ; HL - adresa kurzoru
8887   7E               MOV  A, M
8888   E6C0             ANI  C0H         ; ponechat tam jen atributy
888A   77               MOV  M, A
888B   C9               RET

       Posun kurzoru doprava

888C   CD7F88   RIGHT:  CALL CUROFF      ; smazat kurzor
888F   23               INX  H

       Zobrazení kurzoru na TV
       vstup:   HL - adresa kurzoru na TV
       výstup:  HL - pozice kurzoru v bufferu

8890   3A3AC0   CURON:  LDA  CPOINT
8893   57               MOV  D, A        ; atributy schovat do D
8894   3E3F             MVI  A, 3FH      ; ke kurzoru (čárka) je přidat
8896   B2               ORA  D
8897   77               MOV  M, A        ; kurzor uložit do V-RAM a do HL
8898   2A36C0           LHLD DCURS       ; jeho pozici v bufferu
889B   C9               RET

       Posun kurzoru doleva

889C   CD7F88   LEFT:   CALL CUROFF      ; kurzor smazat
889F   2B               DCX  H           ; posunout doleva
88A0   C39088           JMP  CURON       ; a zobrazit

       Standardní zapípání
       používá: DE, HL, PSW

88A3   21BE88   PIIP:   LXI  H, TABBEP

       Zapípání podle tabulky
       vstup:   HL - adresa tabulky
       používá: DE, HL, PSW

88A6   7E       BELL:   MOV  A, M        ; výška tónu
88A7   FEFF             CPI  FFH         ; konec tabulky?
88A9   C8               RZ               ; ano
88AA   CD368C           CALL L8C36       ; nahodit tón
88AD   56               MOV  D, M        ; pauza
88AE   CDB588           CALL DELAY
88B1   23               INX  H           ; další tón
88B2   C3E78F           JMP  L8FE7H      ; opakovat

       Čekací smyčka - dekrementace DE na nulu
       vstup:   DE - délka čekání (přednastavený čítač)
       používá: DE (nuluje) a PSW

88B5   1D       DELAY:  DCR  E
88B6   C2B588           JNZ  DELAY
88B9   15               DCR  D
88BA   C2B588           JNZ  DELAY
88BD   C9               RET

       Tabulka pro BEEP

88BE   0240     TABBEP: DB   2, 64       ; výška 1, délka 1 (výška jen 0 - 3)
88C0   0001             DB   0, 1        ; výška 2, délka 2
88C2   FF               DB   FFH         ; konec tabulky

       Řídící znak 82H SHIFT/CLR výmaz do konce řádku

88C3   CD7488   CTRCEL: CALL L8874       ; HL - adresa kurzoru v bufferu
88C6   3620     L88C6:  MVI  M, " "      ; do bufferu mezeru
88C8   7D               MOV  A, L
88C9   FE50             CPI  80D         ; konec bufferu?
88CB   23               INX  H
88CC   C2C688           JNZ  L88C6       ; ne
88CF   C35588           JMP  ZOBRED      ; ano, aktualizovat dialogový řádek

       Řídící znak 84H (<^- Šipka doleva nahoru) kurzor na začátek řádku

88D2   210000   CTRHOM: LXI  H, 0
88D5   2238C0           SHLD DPOS        ; pozice okna na začátek
88D8   CD7F88           CALL CUROFF      ; smazat kurzor
88DB   AF               XRA  A
88DC   3236C0           STA  DCURS       ; kurzor na začátek
88DF   CD7F88           CALL CUROFF      ; smazat
88E2   CD9088           CALL CURON       ; a zobrazit
88E5   C35588           JMP  ZOBRED      ; aktualizovat dialogový řádek

       Řídící znak 8DH CLR výmaz řádku

88E8   CDD288   CTRCLR: CALL CTRHOM      ; kurzor na začátek
88EB   C3C388           JMP  CTRCEL      ; smazat do konce

       Určení délky textu v editačním bufferu

88EE   2A34C0   LENEDI: LHLD EDLENG
88F1   EB               XCHG
88F2   2A30C0           LHLD BUFEDI      ; začátek bufferu
88F5   19               DAD  D           ; adresa konce dialogového řádku
88F6   3E20     L88F6:  MVI  A, " "      ; je tam mezera?
88F8   BE               CMP  M
88F9   C20289           JNZ  L8902       ; ne, uložit délku
88FC   2B               DCX  H           ; ano, předchozí znak
88FD   7D               MOV  A, L
88FE   B7               ORA  A           ; začátek řádku?
88FF   C2F688           JNZ  L88F6       ; ne, hledej dál
8902   2600     L8902:  MVI  H, 0
8904   223CC1           SHLD DIALEN      ; uložit délku řádku
8907   C9               RET

8908   2A2A204E MSGKEY: DB   "** NO KEY **", CR
890C   4F204B45
8910   59202A2A
8914   0D

8915   FF               DB   FFH         ;  díra 11 bytů
8916   FFFF             DW   FFFFH
8918   FFFFFFFF         DW   FFFFH, FFFFH
891C   FFFFFFFF         DW   FFFFH, FFFFH

       Tabulka pro akustické návěští

8920   0240     TABBEL: DB   2, 64       ; výška (jen 0-3) a délka tónu
8922   0030             DB   0, 48
8924   0120             DB   1, 32
8926   0020             DB   0, 32
8928   0310             DB   3, 16
892A   0001             DB   0, 1
892C   FF               DB   FFH         ; koncový znak

       Kopírování textu hlášky do výstupního bufferu

892D   2A3AC1   COPMSG: LHLD BUFMSG
8930   EB               XCHG             ; DE - adresa výstupního bufferu
8931   010000           LXI  B, 0
8934   2A74C0           LHLD MESAGE      ; HL - adresa platné hlášky

       Přesun úseku paměti ukončeného 0DH (CR)
       vstup:   HL - odkud
                DE - kam
       používá: C, DE, HL, PSW

8937   7E       COPWRK: MOV  A, M
8938   FE0D             CPI  0DH         ; konec?
893A   CA4489           JZ   L8944       ; ano
893D   12       L893D:  STAX D           ; ne, znak uložit
893E   23               INX  H           ; zvýšit ukazatele
893F   13               INX  D
8940   0C               INR  C           ; a čítač
8941   C33789           JMP  COPWRK

8944   C5       L8944:  PUSH B           ; přenese délku do HL a do DIALEN
8945   E1               POP  H
8946   223CC1           SHLD DIALEN      ; (C13CH)
8949   C9               RET

       Zobrazení hlášky

894A   3A3CC1   OUTMSG: LDA  DIALEN
894D   5F               MOV  E, A        ; do DE připravit délku
894E   00               NOP
894F   1600             MVI  D, 0        ; spočítat koncovou adresu bufferu
8951   2A3AC1           LHLD BUFMSG      ; pro hlášku a zbytek bufferu
8954   19               DAD  D
8955   3620     L8955:  MVI  M, " "      ; a vymezerovat
8957   23               INX  H
8958   3E30             MVI  A, 48
895A   1C       L895A:  INR  E
895B   BB               CMP  E
895C   C25589           JNZ  L8955

895F   2A3AC1   L895F:  LHLD BUFMSG
8962   CD5888           CALL ZOBRBU      ; hlášku vypsat
8965   AF               XRA  A
8966   323CC1           STA  DIALEN      ; vynulovat
8969   C3F084           JMP  L84F0       ; délku textu a vstup z klávesnice

       Řídící znak 85H --> kurzor o pozici doprava

896C   2A36C0   CTRCUR: LHLD DCURS
896F   3E2F             MVI  A, 47
8971   BD               CMP  L           ; kurzor je na konci řádku?
8972   CA4A88           JZ   CTRDIL      ; ano, provést |<--
8975   CD8C88           CALL RIGHT       ; ne, posunout doprava
8978   2C               INR  L           ; zvýšit ukazatel
8979   2236C0   L8979:  SHLD DCURS       ; a uložit do DCURS
897C   C9               RET              ; (C036H)

       Řídící znak 83H <-- kurzor o pozici doleva

897D   2A36C0   CTRCUL: LHLD DCURS
8980   7D               MOV  A, L
8981   B7               ORA  A           ; je kurzor na začátku řádku?
8982   CA8C89           JZ   CTRDIR      ; ano, provést -->|
8985   CD9C88           CALL LEFT        ; ne, posunout doleva
8988   2D               DCR  L           ; snížit ukazatel
8989   C37989           JMP  L8979       ; uložit do DCURS

       Řídící znak 88H -->| řádek o pozici doprava

898C   2A38C0   CTRDIR: LHLD DPOS        ; vzdálenost dialogového řádku
898F   7D               MOV  A, L
8990   B7               ORA  A           ; lze ještě posunout?
8991   C8               RZ               ; ne, návrat
8992   2D               DCR  L           ; ano, posunout
8993   C35288           JMP  L8852       ; schovat a zobrazit

       Řídící znak 8BH zapnutí / vypnutí opisu

8996   3A37C1   CTRPTL: LDA  FPTL
8999   2F               CMA
899A   3237C1           STA  FPTL
899D   C9               RET

       Řídící znak 8AH C-D přivolání textu hlášky

899E   CD5F89   CTRCD:  CALL L895F       ; vypsat hlášku a čekat na klávesu
89A1   C35588           JMP  ZOBRED      ; a obnovit původní stav

89A4   FF               DB   FFH         ; díra 1 byte

       Řídící znak 81H DEL výmaz znaku na kurzoru

89A5   CDEE88   CTRDEL: CALL LENEDI      ; zjistit délku textu
89A8   E5               PUSH H
89A9   C1               POP  B           ; do BC
89AA   CD7488           CALL L8874H      ; adresu kurzoru do DE
89AD   E5               PUSH H
89AE   D1               POP  D
89AF   13               INX  D
89B0   79               MOV  A, C
89B1   BD               CMP  L           ; kurzor je na konci?
89B2   CAC189           JZ   L89C1       ; ano, nic nepřesouvat
89B5   DAC189           JC   L89C1
89B8   1A       L89B8:  LDAX D           ; ne, zbytek řádku posunout o znak
89B9   77               MOV  M, A        ; doleva
89BA   79               MOV  A, C
89BB   BB               CMP  E
89BC   23               INX  H
89BD   13               INX  D
89BE   C2B889           JNZ  L89B8
89C1   3620     L89C1:  MVI  M, " "      ; poslední znak přemazat
89C3   C35588           JMP  ZOBRED      ; a aktualizovat

       Řídící znak 80H INS vložení mezery

89C6   CD7488   CTRINS: CALL L8874       ; adresa
89C9   4D               MOV  C, L
89CA   00               NOP
89CB   CDEE88           CALL LENEDI      ; délka textu
89CE   3E4E             MVI  A, 78
89D0   BD               CMP  L           ; je již 78?
89D1   C8               RZ               ; ano, nic nevkládat
89D2   79               MOV  A, C
89D3   BD               CMP  L           ; ne, kurzor na konci?
89D4   CAD889           JZ   L89D8       ; ano, ještě vložit
89D7   D0               RNC              ; za koncem - ignorovat
89D8   3A31C0   L89D8:  LDA  BUFEDI+1    ; v řádku - vložit mezeru
89DB   67               MOV  H, A
89DC   E5               PUSH H
89DD   D1               POP  D
89DE   13               INX  D           ; do DE pozici za koncem
89DF   7E       L89DF:  MOV  A, M        ; posunout zbytek řádku o znak
89E0   12               STAX D
89E1   79               MOV  A, C
89E2   BD               CMP  L
89E3   2B               DCX  H
89E4   1B               DCX  D
89E5   C2DF89           JNZ  L89DF
89E8   CD7488           CALL L8874       ; adresa kurzoru v bufferu
89EB   C3C189           JMP  L89C1       ; mezeru na kurzor a editovat

       Řídící znak 87H END kurzor na konec řádku

89EE   CDEE88   CTREND: CALL LENEDI      ; délku textu
89F1   2A3CC1           LHLD DIALEN
89F4   E5               PUSH H
89F5   C1               POP  B           ; do BC
89F6   CD7488           CALL L8874       ; do HL adresu kurzoru
89F9   7D               MOV  A, L
89FA   B9               CMP  C           ; je na konci textu?
89FB   C8               RZ               ; ano
89FC   CD7F88           CALL CUROFF      ; ne, smazat kurzor
89FF   3E30             MVI  A, 48
8A01   B9               CMP  C           ; text delší než dialogový řádek
8A02   DA188A           JC   L8A18       ; ano, upravit pozici
8A05   210000           LXI  H, 0        ; dialogového řádku
8A08   2238C0           SHLD DPOS        ; ne, dialogový řádek na začátek
8A0B   79               MOV  A, C        ; bufferu
8A0C   3236C0   L8A0C:  STA  DCURS       ; pozici kurzoru na konec textu
8A0F   CD7F88           CALL CUROFF      ; kurzor smazat a
8A12   CD9088           CALL CURON       ; zobrazit a
8A15   C35588           JMP  ZOBRED      ; aktualizovat
8A18   3E20     L8A18:  MVI  A, 20H
8A1A   3238C0           STA  DPOS        ; pozici kurzoru
8A1D   79               MOV  A, C        ; na konec bufferu
8A1E   D620             SUI  20H         ; spočítat pozici dialogového řádku
8A20   C30C8A           JMP  L8A0C       ; v bufferu, dokončit zobrazování

       Pokračování ošetření klíčů z adresy 8BD1H

8A23   B7       L8A23:  ORA  A
8A24   CAD18B           JZ   L8BD1
8A27   B7       L8A27:  ORA  A
8A28   21C380           LXI  H, MSGMEM   ; připravit hlášku
8A2B   2274C0           SHLD MESAGE      ; ** MEMORY OVERFLOW **
8A2E   2A30C0           LHLD BUFEDI      ; DE - začátek vstupního bufferu
8A31   EB               XCHG
8A32   E1               POP  H           ; HL - konec klíčů
8A33   C1               POP  B           ; BC - délka vstupního bufferu + typ
8A34   C2898A           JNZ  PRTEXT      ; klávesy, chyba, není místo
8A37   71               MOV  M, C        ; uložit typ klíče
8A38   1A       L8A38:  LDAX D           ; zkopírovat obsah
8A39   13               INX  D           ; vstupního bufferu
8A3A   2B               DCX  H           ; do klíče
8A3B   77               MOV  M, A
8A3C   05               DCR  B
8A3D   C2388A           JNZ  L8A38
8A40   C3738A           JMP  L8A73       ; a návrat do editoru

8A43   FF               DB   FFH         ; díra 4 byty
8A44   FFFF             DW   FFFFH
8A46   FF               DB   FFH

       Inicializace zápisníkových oblastí ve V-RAM

8A47   21AF8A   WRKINI: LXI  H, L8AAF
8A4A   1130C0           LXI  D, BUFEDI
8A4D   CD3789           CALL COPWRK      ; oblast od C030H
8A50   21C08A           LXI  H, L8AC0
8A53   1170C0           LXI  D, ADRCMD
8A56   CD3789           CALL COPWRK      ; oblast od C070H
8A59   21D18A           LXI  H, L8AD1
8A5C   1130C1           LXI  D, MINCTR
8A5F   C33789           JMP  COPWRK      ; oblast od C130H

       Část inicializace při studeném startu

8A62   3E1C     CLDCLS: MVI  A, 1CH      ; smazat obrazovku
8A64   CD0085           CALL PRTOUT
8A67   212089   L8A67:  LXI  H, TABBEL
8A6A   CDA688           CALL BELL        ; zapípat
8A6D   CD2D89   L8A6D:  CALL COPMSG      ; hlášku do bufferu
8A70   CD4A89           CALL OUTMSG      ; a zobrazit
8A73   CDE888   L8A73:  CALL CTRCLR      ; řídící znak CLR
8A76   2A30C0           LHLD BUFEDI      ; adresa editačního bufferu
8A79   3A36C1           LDA  PROMPT      ; prompt znak do editačního bufferu
8A7C   77               MOV  M, A
8A7D   C35588           JMP  ZOBRED      ; a editační buffer zobrazit

       Hlavní smyčka vstupu dialogového řádku

8A80   CDF084   EDLOOP: CALL L84F0       ; vstup znaku
8A83   CD0088   L8A83:  CALL EDIT        ; ošetření
8A86   C3808A           JMP  EDLOOP      ; a znovu

       Výpis textu připravené hlášky
       vstup:   (C074H) - adresa textu

8A89   CDA388   PRTEXT: CALL PIIP        ; pípnout
8A8C   CD2D89   L8A8C:  CALL COPMSG      ; hlášku do výstupního bufferu
8A8F   CD4A89           CALL OUTMSG
8A92   C35588           JMP  ZOBRED      ; a zobrazit

       Startovací text monitoru PMD-85

8A95   2A2A2050 MSGPMD: DB   "** PMD-85 READY /1.0 **", CR
8A99   4D442D38
8A9D   35205245
8AA1   41445920
89A5   2F312E30
8AA9   202A2A0D

8AAD   FF               DB   FFH         ; díra 2 byty
8AAE   FF               DB   FFH

       Hodnoty pro inicializaci oblasti C030H-C03FH

8AAF   007F     L8AAF:  DW   7F00H       ; adresa editačního bufferu
8AB1   C0FF             DW   FFC0H       ; adresa posledního TV řádku
8AB3   5000             DW   80          ; délka editačního bufferu
8AB5   0000             DW   0           ; pozice kurzoru v dialogovém řádku
8AB7   0000             DW   0           ; pozice dialogového řádku v bufferu
8AB9   0000             DW   0           ; atribut výstupu
8ABB   0085             DW   TABZN-100H  ; adresa tabulky znaků
8ABD   00FB             DW   FB00H       ; adresa kurzoru ve V-RAM
8ABF   0D               DB   CR

       Hodnoty pro inicializaci oblastí C070H-C07FH

8AC0   FFFF     L8AC0:  DW   FFFFH
8AC2   FFFF             DW   FFFFH
8AC4   958A             DW   MSGPMD      ; adresa inicializační hlášky
8AC6   FFFF             DW   FFFFH
8AC8   827F             DW   7F82H       ; vstupní buffer
8ACA   FFFF             DW   FFFFH
8ACC   FFFF             DW   FFFFH
8ACE   FFFF             DW   FFFFH
8AD0   0D               DB   CR

       Hodnoty pro inicializaci oblastí C130H-C13FH

8AD1   80       L8AD1:  DB   80H         ; minimum a maximum rozsahu
8AD2   D0               DB   D0H         ; řídících znaků
8AD3   EB8A             DW   TABCTR-2    ; tabulka řídících znaků
8AD5   0000             DW   0
8AD7   3F               DB   "?"         ; prompt znak
8AD8   FF               DB   FFH         ; příznak PTL
8AD9   FFFF             DW   FFFFH
8ADB   517F             DW   7F51H       ; výstupní buffer
8ADD   0000             DW   0           ; délka dialogového řádku
8ADF   FFFF             DW   FFFFH
8AE1   0D               DB   CR

       Řídící znaky 91H-94H

8AE2   3A34C1   CTRATR: LDA  CHAR        ; znak z klávesnice
8AE5   0F               RRC              ; posunout atribut na správné místo
8AE6   0F               RRC
8AE7   E6C0             ANI  C0H         ; zamaskovat pouze atributy
8AE9   323AC0           STA  CPOINT
8AEC   C9               RET

       Tabulka adres příkazů při vstupu řádku

8AED   80       TABCTR: DB   80H         ; INS
8AEE   C689             DW   CTRINS
8AF0   81               DB   81H         ; DEL
8AF1   A589             DW   CTRDEL
8AF3   82               DB   82H         ; SHIFT/CLR
8AF4   C388             DW   CTRCEL
8AF6   83               DB   83H         ; <--
8AF7   7D89             DW   CTRCUL
8AF9   84               DB   84H         ; <^- (Šipka doleva nahoru)
8AFA   D288             DW   CTRHOM
8AFC   85               DB   85H         ; -->
8AFD   6C89             DW   CTRCUR
8AFF   88               DB   88H         ; -->|
8B00   8C89             DW   CTRDIR
8B02   87               DB   87H         ; END
8B03   EE89             DW   CTREND
8B05   86               DB   86H         ; |<--
8B06   4A88             DW   CTRDIL
8B08   89               DB   89H         ; EOL
8B09   B085             DW   CTREOL
8B0B   8A               DB   8AH         ; C-D
8B0C   9E89             DW   CTRCD
8B0E   8B               DB   8BH         ; PTL
8B0F   9689             DW   CTRPTL
8B11   8C               DB   8CH         ; SHIFT/DEL
8B12   FFFF             DW   FFFFH
8B14   8D               DB   8DH         ; CLR
8B15   E888             DW   CTRCLR
8B17   91               DB   91H         ; SHIFT/END
8B18   E28A             DW   CTRATR
8B1A   92               DB   92H         ; SHIFT/-->|
8B1B   E28A             DW   CTRATR
8B1D   93               DB   93H         ; SHIFT/C-D
8B1E   E28A             DW   CTRATR
8B20   94               DB   94H         ; SHIFT/-->
8B21   E28A             DW   CTRATR
8B23   A0               DB   A0H         ; WRK
8B24   8D8B             DW   CTRWRK
8B26   A2               DB   A2H         ; RCL
8B27   878B             DW   CTRRCL
8B29   FF               DB   FFH         ; konec tabulky

8B2A   FFFF             DW   FFFFH       ; díra 22 bytů
8B2C   FFFFFFFF         DW   FFFFH, FFFFH
8B30   FFFFFFFF         DW   FFFFH, FFFFH
8B34   FFFFFFFF         DW   FFFFH, FFFFH
8B38   FFFFFFFF         DW   FFFFH, FFFFH
8B3C   FFFFFFFF         DW   FFFFH, FFFFH

       Řídící znaky D0H-FFH klíče

8B40   3A35C1   CTRKEY: LDA  FWRK
8B43   B7               ORA  A           ; je WRK aktivní?
8B44   C2768B           JNZ  SAVKEY      ; ano, zpracovat uložení

       Vyvolání klíče

8B47   3A34C1           LDA  CHAR
8B4A   4F               MOV  C, A        ; do C uložit kód klíče
8B4B   210889   L8B4B:  LXI  H, MSGKEY
8B4E   2274C0           SHLD MESAGE      ; připravit hlášku "** NO KEY **"
8B51   2A30C0           LHLD BUFEDI      ; adresa začátku seznamu klíčů
8B54   2B       L8B54:  DCX  H
8B55   7E               MOV  A, M        ; byte z tabulky
8B56   FE00             CPI  0           ; konec seznamu?
8B58   CA898A           JZ   PRTEXT      ; ano, klíč nenalezen
8B5B   B9               CMP  C           ; ne, je nalezen zadaný klíč?
8B5C   C2548B           JNZ  L8B54       ; ne, zkusit další byte
8B5F   2B       L8B5F:  DCX  H           ; klíč je v seznamu nalezen
8B60   7E               MOV  A, M        ; znak řetězce v klíči?
8B61   B7               ORA  A           ; klíč je prázdný?
8B62   CA5588           JZ   ZOBRED      ; ano, zpět do editace
8B65   FE80             CPI  80H         ; začátek dalšího klíče?
8B67   D25588           JNC  ZOBRED      ; ano, zpět do editace
8B6A   3234C1           STA  CHAR        ; znak z klíče zpracovat
8B6D   CD0088           CALL EDIT        ; jako znak z klávesnice
8B70   C35F8B           JMP  L8B5F       ; a zkusit další znak z klíče

8B73   FF               DB   FFH         ; díra 3 byty
8B74   FFFF             DW   FFFFH

       Uložení klíče

8B76   CD938B   SAVKEY: CALL L8B93       ; zkopírovat
8B79   F5       WRKOFF: PUSH PSW         ; text do klíče
8B7A   AF               XRA  A
8B7B   3235C1           STA  FWRK        ; a WRK deaktivovat
8B7E   F1               POP  PSW
8B7F   C9               RET

       Obsazovaný klíč není v seznamu

8B80   C5       L8B80:  PUSH B
8B81   04               INR  B
8B82   04               INR  B
8B83   E5               PUSH H
8B84   C3D18B           JMP  L8BD1

       Řídící znak A0H RCL přivolání příkazu

8B87   0EEE     CTRRCL: MVI  C, EEH      ; ošetřit jako klíč
8B89   C34B8B           JMP  L8B4B       ; s kódem EEH

8B8C   FF               DB   FFH         ; díra 1 byte

       Řídící znak A2H WRK zápis textu do klíče

8B8D   3EFF     CTRWRK: MVI  A, FFH
8B8F   3235C1           STA  FWRK        ; aktivovat WRK
8B92   C9               RET

       Uložení textu z editačního bufferu do klíče

8B93   CDEE88   L8B93:  CALL LENEDI      ; délku textu v bufferu
8B96   45               MOV  B, L        ; uložit do B
8B97   04               INR  B
8B98   3A34C1           LDA  CHAR        ; kód znaku (klíče)
8B9B   4F               MOV  C, A        ; uložit do C
8B9C   2A30C0           LHLD BUFEDI      ; do HL začátek seznamu klíčů
8B9F   2B       L8B9F:  DCX  H
8BA0   7E               MOV  A, M
8BA1   B7               ORA  A           ; konec seznamu?
8BA2   CA808B           JZ   L8B80       ; ano, klíč není v seznamu
8BA5   B9               CMP  C           ; ne, je klíč v seznamu?
8BA6   C29F8B           JNZ  L8B9F       ; ne, zkusit další klíč

       Obsazovaný klíč je již v seznamu (obsazen)

8BA9   E5               PUSH H
8BAA   D1               POP  D           ; do DE začátek klíče
8BAB   2B       L8BAB:  DCX  H
8BAC   7E               MOV  A, M
8BAD   B7               ORA  A           ; je klíč prázdný?
8BAE   CAC18B           JZ   L8BC1       ; ano, přeskočit výmaz klíče
8BB1   FE80             CPI  80B         ; konec klíče?
8BB3   DAAB8B           JC   L8BAB       ; ano, je prázdný

8BB6   7E       L8BB6:  MOV  A, M        ; vymazání obsazeného klíče
8BB7   12               STAX D
8BB8   B7               ORA  A
8BB9   CAC18B           JZ   L8BC1
8BBC   2B               DCX  H
8BBD   1B               DCX  D
8BBE   C3B68B           JMP  L8BB6

8BC1   D5       L8BC1:  PUSH D           ; obsazovaný klíč je v seznamu
8BC2   E1               POP  H           ; a je prázdný
8BC3   C5               PUSH B           ; kód klíče a délka textu
8BC4   04               INR  B
8BC5   04               INR  B           ; schovat konec seznamu
8BC6   E5               PUSH H
8BC7   3600     L8BC7:  MVI  M, 0        ; smazat zbytky starého seznamu
8BC9   2B               DCX  H           ; po vymazání obsazovaného klíče
8BCA   7E               MOV  A, M
8BCB   B7               ORA  A
8BCC   C2C78B           JNZ  L8BC7
8BCF   E1               POP  H           ; obnovit konec seznamu
8BD0   E5               PUSH H           ; a nechat ho uložený
8BD1   05       L8BD1:  DCR  B
8BD2   2B               DCX  H
8BD3   7E               MOV  A, M
8BD4   CA278A           JZ   L8A27
8BD7   C3238A           JMP  L8A23

       Opis příkazu na obrazovku při zapnutém PTL
       vstup:   C - délka textu

8BDA   2A30C0   LINECH: LHLD BUFEDI      ; adresa editačního bufferu
8BDD   7E       L8BDD:  MOV  A, M
8BDE   C5               PUSH B
8BDF   CD0085           CALL PRTOUT      ; vypsat znak bufferu
8BE2   C1               POP  B
8BE3   7D               MOV  A, L
8BE4   B9               CMP  C           ; už celý řádek
8BE5   23               INX  H
8BE6   C2DD8B           JNZ  L8BDD       ; ne, další znak
8BE9   3E0D             MVI  A, CR       ; ano, ještě odřádkovat
8BEB   C30085           JMP  PRTOUT

       Vstup dialogového řádku - rutina ENTER

8BEE   E1       ENTER:  POP  H
8BEF   2276C0           SHLD SAVRET      ; schovat návratovou adresu
8BF2   210000           LXI  H, 0
8BF5   39               DAD  SP
8BF6   227AC0           SHLD SAVESP      ; schovat zásobník
8BF9   31FF7F           LXI  SP, 7FFFH   ; nastavit vlastní
8BFC   C3838A           JMP  L8A83       ; hlavní smyčka vstupu

8BFF   FF               DB   FFH         ; díra 1 byte

       Natažení bloku paměti z modulu ROM - TRANSF
       volání:  CALL TRANSF
                DW - adresa v ROM-modulu
                DW - délka přeneseného úseku + FFH
                DW - adresa, kam uložit do RAM
       používá: BC, DE, PSW

8C00   3E90     TRANSF: MVI  A, 90H
8C02   D3FB             OUT  FBH         ; inicializace 8255 v ROM-modulu
8C04   E3               XTHL             ; do HL adresu
8C05   7E               MOV  A, M
8C06   D3F9             OUT  F9H         ; nastavit nižsí
8C08   23               INX  H
8C09   7E               MOV  A, M
8C0A   D3FA             OUT  FAH         ; a vyšší byte adresy
8C0C   23               INX  H
8C0D   4E               MOV  C, M
8C0E   23               INX  H
8C0F   46               MOV  B, M        ; do BC délku zvětšenou o FFH
8C10   23               INX  H
8C11   5E               MOV  E, M
8C12   23               INX  H           ; do DE adresu RAM
8C13   56               MOV  D, M
8C14   23               INX  H
8C15   DBF8     L8C15:  IN   F8H         ; byte z ROM
8C17   12               STAX D           ; přesunout do RAM
8C18   13               INX  D
8C19   0B               DCX  B
8C1A   78               MOV  A, B        ; ŠPATNÝ TEST (chyba autora)
8C1B   B7               ORA  A           ; správně mělo být: ORA C, proto
8C1C   CA308C           JZ   L8C30       ; nutná délka + FFH
8C1F   DBF9             IN   F9H
8C21   3C               INR  A           ; zvýšit dolní byte adresy ROM
8C22   D3F9             OUT  F9H
8C24   CC2A8C           CZ   L8C2A       ; při přetečení i vyšší a další byte
8C27   C3158C           JMP  L8C15
8C2A   DBFA     L8C2A:  IN   FAH         ; zvýšit horní byte adresy ROM
8C2C   3C               INR  A
8C2D   D3FA             OUT  FAH
8C2F   C9               RET
8C30   3EFF     L8C30:  MVI  A, FFH      ; konec přesunu - vypnout
8C32   D3FA             OUT  FAH         ; napájení +12V
8C34   E3               XTHL             ; obnovit návratovou adresu
8C35   C9               RET              ; a hotovo

       Přidání jednoho ze čtyř hardwareových zvuků
       vstup:   HL - adresa na číslo zvuku

8C36   DBF6     L8C36:  IN   F6H         ; sejmout stav portu
8C38   B6               ORA  M           ; přidat zvuk
8C39   D3F6             OUT  F6H         ; odeslat
8C3B   23               INX  H           ; připravit další
8C3C   C9               RET

8C3D   FF               DB   FFH         ; díra 3 byty
8C3E   FFFF             DW   FFFFH

       Vstup do monitoru (s výpisem OS READY a písknutím)

8C40   3E3F     MONIT:  MVI  A, "?"
8C42   3236C1           STA  PROMPT      ; připravit prompt "?"
8C45   216A8C           LXI  H, MSGOS    ; a text "OS READY"
8C48   2274C0           SHLD MESAGE
8C4B   CDA388           CALL PIIP        ; pípnout
8C4E   CD6D8A           CALL L8A6D
8C51   C31680           JMP  MAIN        ; a teplý start monitoru

       Příkaz JOB

8C54   CD1581   CMDJOB: CALL TRADR       ; první argument
8C57   EB               XCHG
8C58   22F3C1           SHLD POSJOB
8C5B   C3BC8C           JMP  CONJOB      ; pokračování jinde

8C5E   FFFF             DW   FFFFH       ; díra 2 byty

       Příkaz BASIC G

8C60   CD008C   CMDBAS: CALL TRANSF      ; natáhnout Basic z ROM-modulu
8C63   0000             DW   0000H       ; od 0000H
8C65   0025             DW   2500H       ; 2500H bytů (- FFH)
8C67   0000             DW   0000H       ; na 0000H
8C69   C7               RST  0           ; a spustit od 0000H (zbytečné?)

       Text hlášení při vstupu do monitoru na adresu 8C40H (MONIT)

8C6A   4F532052 MSGOS:  DB   "OS READY", CR
8C6E   45414459
8C72   0D

8C73   FF               DB   FFH         ; díra 1 byte

       Test na stisknutí klávesy STOP
       výstup:  STOP je stisknuto:   A=03H, Z=1 (nastaven)
                STOP není stisknuto: A=40H, Z=0
       používá: PSW

8C74   DBFE     STOP:   IN   F5H
8C76   E640             ANI  40H         ; otestovat 6. bit
8C78   B7               ORA  A
8C79   C0               RNZ
8C7A   3E03             MVI  A, 03H
8C7C   C9               RET

       Vykreslení bodu na obrazovce
       vstup:   XOLD (C170H) - souřádnice X
                YOLD (C172H) - souřadnice Y
                (C1FAH) - mód kreslení bodu
                (C03AH) - barevný atribut

8C7D   E5       POINT:  PUSH H
8C7E   D5               PUSH D
8C7F   C5               PUSH B
8C80   2A70C1           LHLD XOLD
8C83   0608             MVI  B, 08H
8C85   29       L8C85:  DAD  H
8C86   7C               MOV  A, H
8C87   D606             SUI  06H
8C89   DA8E8C           JC   L8C8E
8C8C   67               MOV  H, A
8C8D   2C               INR  L
8C8E   05       L8C8E:  DCR  B
8C8F   C2858C           JNZ  L8C85
8C92   4C               MOV  C, H        ; C=X MOD 6
8C93   5D               MOV  E, L        ; E=X DIV 6
8C94   21B68C           LXI  H, TABMOC
8C97   09               DAD  B           ; váha bitu
8C98   46               MOV  B, M
8C99   16C0             MVI  D, C0H      ; k X DIV 6 přidat adresu obrazovky
8C9B   1C               INR  E
8C9C   1C               INR  E
8C9D   2A72C1           LHLD YOLD        ; Y
9CA0   2600             MVI  H, 00H
8CA2   29               DAD  H
8CA3   29               DAD  H
8CA4   29               DAD  H
8CA5   29               DAD  H
8CA6   29               DAD  H
8CA7   29               DAD  H           ; HL=Y*64
8CA8   19               DAD  D           ; HL=Y*64+X DIV 6+C000H
8CA9   3A3AC0           LDA  CPOINT      ; atribut výstupu
8CAC   4F               MOV  C, A        ; přidat k hodnotě na obrazovce
8CAD   7E               MOV  A, M
8CAE   E63F             ANI  3FH
8CB0   B1               ORA  C           ; a provést operaci s bodem
8CB1   C3FAC1           JMP  CODSET

8CB4   FFFF             DW   FFFFH       ; díra 2 byty

8CB6   01020408 TABMOC: DB   1, 2, 4, 8  ; tabulka mocnin dvojky
8CBA   1020

       Pokračování příkazu JOB

8CBC   CD1581   CONJOB: CALL TRADR       ; druhý argument
8CBF   EB               XCHG
8CC0   22F5C1   L8CC0:  SHLD LENJOB      ; uložit do LENJOB
8CC3   CD1581           CALL TRADR       ; třetí argument
8CC6   EB               XCHG
8CC7   E5               PUSH H           ; uložit jako startovací adresu
8CC8   22F7C1           SHLD ADRJOB      ; a do ADRJOB
8CCB   CDF0C1           CALL CODJOB      ; pak provést připravený TRANSF
8CCE   E1               POP  H           ; (viz L82B5)
8CCF   E9               PCHL             ; a skok na startovací adresu

       Interpolátor (propojení dvou bodů na obrazovce)
       vstup:   XOLD (C170H), YOLD (C172H) - výchozího bod
                XNEW (C173H), YNEW (C174H) - koncový bod
       používá: vše

8CD0   2A73C1   INPOL:  LHLD XNEW        ; L=XNEW, H=YNEW
8CD3   3A70C1           LDA  XOLD        ; A=XOLD
8CD6   BD               CMP  L
8CD7   CA478D           JZ   L8D47       ; XNEW=XOLD - svislá úsečka
8CDA   DA538D   L8CDA:  JC   L8D53       ; XOLD<XNEW

       XOLD>XNEW

8CDD   95               SUB  L
8CDE   5F               MOV  E, A        ; E=XOLD-XNEW
8CDF   0EFF             MVI  C, FFH      ; C - směr interpolace
8CE1   3A72C1   L8CE1:  LDA  YOLD
8CE4   BC               CMP  H           ; A=YOLD
8CE5   CA4D8D           JZ   L8D4D       ; YOLD=YNEW - vodorovná úsečka
8CE8   DA5C8D           JC   L8D5C       ; YOLD<YNEW

       YOLD>YNEW

8CEB   94               SUB  H
8CEC   57               MOV  D, A        ; D=YOLD-YNEW
8CED   06FF             MVI  B, FFH      ; B - směr interpolace
8CEF   7B       L8CEF:  MOV  A, E
8CF0   3275C1           STA  DELTAX      ; uložit DELTAX
8CF3   7A               MOV  A, D
8CF4   3276C1           STA  DELTAY      ; uložit DELTAY
8CF7   BB               CMP  E
8CF8   DA658D           JC   L8D65       ; DELTAX<DELTAY

       DELTAX>DELTAY

8CFB   63               MOV  H, E
8CFC   5A               MOV  E, D
8CFD   54               MOV  D, H
8CFE   A7               ANA  A           ; D=DELTAX
8CFF   1F               RAR              ; H=Y/2
8D00   67               MOV  H, A        ; E=DELTAY

       Interpolace

8D01   2E00     L8D01:  MVI  L, 0        ; nulovat čítač
8D03   7D       L8D03:  MOV  A, L
8D04   BB               CMP  E           ; konec interpolace?
8D05   C8               RZ               ; ano, hotovo
8D06   2C               INR  L           ; ne, zvětšit čítač
8D07   7C               MOV  A, H        ; zvětšit
8D08   82               ADD  D           ; rozdíl
8D09   67               MOV  H, A        ; ploch
8D0A   DA368D           JC   L8D36
8D0D   BB               CMP  E
8D0E   CA3B8D           JZ   L8D3B
8D11   D23B8D           JNC  L8D3B
8D14   3A75C1           LDA  DELTAX
8D17   BB               CMP  E           ; je posun v X?
8D18   C2228D           JNZ  L8D22       ; ne, dál
8D1B   3A70C1           LDA  XOLD        ; ano, posunout XOLD
8D1E   81               ADD  C           ; o krok
8D1F   3270C1           STA  XOLD
8D22   3A76C1   L8D22:  LDA  DELTAY      ; je posun v Y?
8D25   BB               CMP  E
8D26   C2308D           JNZ  L8D30       ; ne, dál
8D29   3A72C1   L8D29:  LDA  YOLD        ; ano, posunout
8D2C   80               ADD  B           ; YOLD o krok
8D2D   3272C1           STA  YOLD        ; bod na obrazovku
8D30   CD7D8C   L8D30:  CALL POINT
8D33   C3038D           JMP  L8D03       ; opakovat interpolaci

8D36   7B       L8D36:  MOV  A, E
8D37   2F               CMA
8D38   84               ADD  H
8D39   67               MOV  H, A
8D3A   3A               DB   3AH         ; (LDA 6793H) ingorovat další
8D3B   93       L8D3B:  SUB  E           ; dvě instrukce
8D3C   67               MOV  H, A
8D3D   3A70C1           LDA  XOLD
8D40   81               ADD  C
8D41   3270C1           STA  XOLD
8D44   C3298D           JMP  L8D29

       XOLD=XNEW

8D47   AF       L8D47:  XRA  A
8D48   5F               MOV  E, A
8D49   4F               MOV  C, A
8D4A   C3E18C           JMP  L8CE1

       YOLD=YNEW

8D4D   AF       L8D4D:  XRA  A
8D4E   57               MOV  D, A
8D4F   47               MOV  B, A
8D50   C3EF8C           JMP  L8CEF

       XOLD<XNEW

8D53   5F       L8D53:  MOV  E, A
8D54   7D               MOV  A, L
8D55   93               SUB  E
8D56   5F               MOV  E, A
8D57   0E01             MVI  C, 1
8D59   C3E18C           JMP  L8CE1

       YOLD<YNEW

8D5C   57       L8D5C:  MOV  D, A
8D5D   7C               MOV  A, H
8D5E   92               SUB  D
8D5F   57               MOV  D, A
8D60   0601             MVI  B, 1
8D62   C3EF8C           JMP  L8CEF

       DELTAX<DELTAY

8D65   A7       L8D65:  ANA  A
8D66   7B               MOV  A, E
8D67   1F               RAR
8D68   67               MOV  H, A
8D69   C3018D           JMP  L8D01

       Výstup bloku z paměti na magnetofon
       vstup:   HL - začátek bufferu
                DE - délka - 1

8D6C   0600     MGOBLK: MVI  B, 0        ; nulovat kontrolní součet
8D6E   CDB18D   L8D6E:  CALL WAIMGO      ; čekej na volný vysílač USARTu
8D71   7E               MOV  A, M
8D72   D31E             OUT  1EH         ; odeslat byte dat
8D74   80               ADD  B           ; upravit kontrolní součet
8D75   47               MOV  B, A
8D76   23               INX  H
8D77   1B               DCX  D
8D78   7A               MOV  A, D
8D79   FEFF             CPI  FFH         ; hotovo?
8D7B   C26E8D           JNZ  L8D6E       ; ne, další byte
8D7E   CDB18D   L8D7E:  CALL WAIMGO
8D81   78               MOV  A, B        ; ano, ještě kontrolní součet
8D82   D31E             OUT  1EH
8D84   C9               RET

       Pokračování zápisu synchronizace, hlavičky a dat

8D85   2E10     MGORE1: MVI  L, 16       ; počet "00"
8D87   CDB18D   L8D87:  CALL WAIMGO
8D8A   AF               XRA  A
8D8B   D31E             OUT  1EH         ; zápis
8D8D   2D               DCR  L
8D8E   C2878D           JNZ  L8D87

8D91   2E10             MVI  L, 16       ; počet "55"
8D93   CDB18D   L8D93:  CALL WAIMGO
8D96   3E55             MVI  A, 55H
8D98   D31E             OUT  1EH         ; zápis
8D9A   2D               DCR  L
8D9B   C2938D           JNZ  L8D93

8D9E   21B2C1           LXI  H, NUMFIL   ; buffer pro hlavičku
8DA1   110D00           LXI  D, 13       ; délka hlavičky - 1
8DA4   CD6C8D           CALL MGOBLK      ; zápis bloku hlavičky
8DA7   2AB6C1           LHLD LENFIL      ; délku bloku dat
8DAA   EB               XCHG             ; připravit do DE
8DAB   2AB4C1           LHLD ADRFIL      ; adresu do HL
8DAE   C3708F           JMP  L8F70       ; pauza a zápis bloku dat

       Čekání na volný vysílač USARTu

8DB1   DB1F     WAIMGO: IN   1FH
8DB3   E601             ANI  01H         ; vysílač volný?
8DB5   CAB18D           JZ   WAIMGO      ; ne, čekej
8DB8   C9               RET

       Inicializace USARTu pro výstup na magnetofon

8DB9   3EED     INIMGF: MVI  A, EDH
8DBB   D31F             OUT  1FH
8DBD   3E25             MVI  A, 25H
8DBF   D31F             OUT  1FH
8DC1   C9               RET

       Vstup bloku dat z magnetofonu a kontrola součtu
       vstup:   HL - ukládací adresa pro čtená data
                DE - délka - 1 (požadovaný počet bytů)
       výstup:  příznak Z=0/1 - chyba kontrolního součtu / OK
                entry MGIBL1 - C=00/XX - jen kontrola / i čtení do paměti

8DC2   0EFF     MGIBL1: MVI  C, FFH      ; příznak nastavit na čtení
8DC4   0600     MGIBLK: MVI  B, 0        ; nulovat kontrolní součet
8DC6   CD0E8E   L8DC6:  CALL WAIMGI      ; počkat na byte z magnetofonu
8DC9   DB1E             IN   1EH         ; a přečíst
8DCB   0D               DCR  C
8DCC   0C               INR  C           ; ukládat?
8DCD   CAD18D           JZ   L8DD1       ; ne, jen kontrola
8DD0   77               MOV  M, A        ; ano, uložit do paměti
8DD1   80       L8DD1:  ADD  B           ; modifikovat kontrolní součet
8DD2   47               MOV  B, A
8DD3   23               INX  H           ; adresa
8DD4   1B               DCX  D           ; čítač
8DD5   7A               MOV  A, D
8DD6   FEFF             CPI  FFH         ; hotovo?
8DD8   C2C68D           JNZ  L8DC6       ; ne, další byte
8DDB   CD0E8E           CALL WAIMGI      ; ano, ještě načíst
8DDE   DB1E             IN   1EH         ; kontrolní součet
8DE0   BB               CMP  B           ; souhlasí?
8DE1   C9       L8DE1:  RET

       Vyhledání synchronizace a načtení hlavičky

8DE2   2E10     MGIREC: MVI  L, 16       ; požadovaný počet 00H bytů
8DE4   CD0E8E   L8DE4:  CALL WAIMGI
8DE7   DB1E             IN   1EH         ; načíst byte
8DE9   B7               ORA  A           ; 00H?
8DEA   C2578F           JNZ  L8F57       ; ne, testnout STOP
8DED   2D               DCR  L           ; už je 16 krát 00H?
8DEE   C2E48D           JNZ  L8DE4       ; ne, pokračuj

8DF1   2E10             MVI  L, 16       ; požadovaný počet 55H bytů
8DF3   CD0E8E   L8DF3:  CALL WAIMGI
8DF6   DB1E             IN   1EH         ; načíst byte
8DF8   FE55             CPI  55H         ; 55H?
8DFA   C2E28D           JNZ  MGIREC      ; ne, čekej na synchronizaci
8DFD   2D               DCR  L           ; ano, už je 16 krát 55H
8DFE   C2F38D           JNZ  L8DF3       ; ne, další byte

8E01   21B2C1           LXI  H, NUMFIL   ; synchronizováno, do HL adresu
8E04   110D00           LXI  D, 13       ; do DE délku hlavičky - 1
8E07   CDC28D           CALL MGIBL1      ; a načíst blok hlavičky
8E0A   C8               RZ               ; hlavička OK
8E0B   C3E28D           JMP  MGIREC      ; chyba, čekej dál

       Čekání na přijatý znak z USARTu

8E0E   DB1F     WAIMGI: IN   1FH
8E10   E602             ANI  02H         ; přijatý nějaký znak?
8E12   CA0E8E           JZ   WAIMGI      ; ne, čekej
8E15   C9               RET

       Výkonná část příkazu MGLD a MGEND

8E16   CDA388   L8E16:  CALL PIIP        ; písknout
8E19   CDE28D   MGLD:   CALL MGIREC      ; vyhledat nejbliží hlavičku
8E1C   11B2C1           LXI  D, NUMFIL
8E1F   1A               LDAX D           ; vypsat jméno a typ - číslo souboru
8E20   CD738E           CALL BINBCD      ; v BCD do výstupního souboru
8E23   2A30C0           LHLD BUFEDI
8E26   00               NOP
8E27   4F               MOV  C, A
8E28   1F               RAR
8E29   1F               RAR
8E2A   1F               RAR
8E2B   1F               RAR
8E2C   E60F             ANI  0FH
8E2E   F630             ORI  "0"
8E30   77               MOV  M, A
8E31   23               INX  H
8E32   79               MOV  A, C
8E33   E60F             ANI  0FH
8E35   F630             ORI  30H
8E37   77               MOV  M, A
8E38   23               INX  H
8E39   362F             MVI  M, "/"      ; oddělit číslo a typ souboru
8E3B   13               INX  D
8E3C   23               INX  H
8E3D   1A               LDAX D
8E3E   77               MOV  M, A        ; typ souboru do výstupního bufferu
8E3F   23               INX  H
8E40   3620             MVI  M, " "
8E42   11B8C1           LXI  D, NAMFIL
8E45   0608             MVI  B, 8
8E47   23       L8E47:  INX  H
8E48   1A               LDAX D
8E49   77               MOV  M, A        ; jméno souboru
8E4A   13               INX  D
8E4B   05               DCR  B
8E4C   C2478E           JNZ  L8E47
8E4F   CD5588           CALL ZOBRED      ; zobrazení výstupního bufferu

8E52   2AB0C1           LHLD FINDNR      ; L = hledané číslo, typ souboru
8E55   3AB2C1           LDA  NUMFIL
8E58   BD               CMP  L           ; shodná čísla souboru?
8E59   C2168E           JNZ  L8E16
8E5C   3AB3C1           LDA  TYPFIL
8E5F   25               DCR  H
8E60   24               INR  H           ; požadovaný typ souboru je 0?
8E61   4C               MOV  C, H        ; pokud ano (MGEND), jen test
8E62   CA698E           JZ   L8E69       ; ano, jen test, ignorovat typ
8E65   BC               CMP  H           ; shodné typy souboru?
8E66   C2168E           JNZ  L8E16       ; ne, čekej na další hlavičku
8E69   2AB6C1   L8E69:  LHLD LENFIL      ; ano, požadovaný typ souboru nalezen
8E6C   EB               XCHG             ; délku - 1 do DE
8E6D   2AB4C1           LHLD ADRFIL      ; ukládací adresu do HL
8E70   C38F8F           JMP  L8F8F       ; a načíst blok dat

       Převod A registru z binárního tvaru na BCD číslo
       vstup:   A - binární číslo
       výstup:  A - BCD číslo
       používá: B, H, PSW

8E73   67       BINBCD: MOV  H, A
8E74   0608             MVI  B, 8
8E76   AF               XRA  A
8E77   29       L8E77:  DAD  H
8E78   8F               ADC  A
8E79   27               DAA
8E7A   05               DCR  B
8E7B   C2778E           JNZ  L8E77
8E7E   C9               RET

       Převod z BCD vstupu na binární s kontrolou rozsahu 00-63

8E7F   21228F   L8E7F:  LXI  H, MSGFIL
8E82   2274C0           SHLD MESAGE      ; připravit "** FILE ERROR **"
8E85   2A72C0           LHLD INPUT       ; ukazatel do výstupního bufferu
8E88   CDF780           CALL PAIRIN      ; načíst dva znaky
8E8B   23               INX  H
8E8C   23               INX  H
8E8D   2272C0           SHLD INPUT       ; a schovat ukazatel do bufferu
8E90   D8               RC               ; chyba při převodu (ani hexa)
8E91   FE64     L8E91:  CPI  64H         ; číslo > 100?
8E93   3F               CMC
8E94   D8               RC               ; ano, chyba

       vstup:   A v BCD
       výstup:  A binární
       používá: BC, PSW

8E95   4F       BCDBIN: MOV  C, A       ; schovat
8E96   1F               RAR
8E97   1F               RAR
8E98   1F               RAR
8E99   1F               RAR
8E9A   E60F             ANI  0FH         ; horní cifru
8E9C   87               ADD  A
8E9D   47               MOV  B, A
8E9E   87               ADD  A
8E9F   87               ADD  A
8EA0   80               ADD  B           ; vynásobit desíti
8EA1   47               MOV  B, A
8EA2   79               MOV  A, C
8EA3   E60F             ANI  0FH
8EA5   80               ADD  B           ; a připočítat dolní cifru
8EA6   C37E8F           JMP  L8F7E       ; a ještě inicializovat oblast C0F0H

       Příkaz MGLD

       vstup:   číslo souboru (2 x ASCII - ukazatel C072H)
                prompt znak (na adrese C136H)

8EA9   3A36C1   CMDMGI: LDA  PROMPT      ; připravit typ souboru
8EAC   32B1C1   L8EAC:  STA  FINDTP      ; do pracovní oblasti
8EAF   CD7F8E           CALL L8E7F       ; převést číslo souboru
8EB2   DA898A           JC   PRTEXT      ; je-li chyba hlásit
8EB5   32B0C1           STA  FINDNR      ; jinak číslo souboru
8EB8   21228F           LXI  H, MSGFIL   ; uložit
8EBB   2274C0           SHLD MESAGE      ; připravit "** FILE ERROR **"
8EBE   CD198E           CALL MGLD
8EC1   C2898A           JNZ  PRTEXT      ; načíst synchronizaci, hlavičku,
8EC4   CDA388           CALL PIIP        ; data, při chybě hlásit jinak
8EC7   C3738A           JMP  L8A73       ; signalizovat konec a zpět
                                         ; do monitoru

       Výkonný blok příkazu MGSV
       vstup:   číslo souboru, počáteční adresa, koncová adresa, jméno - uka-
                zatel do bufferu (C072H), prompt znak na adrese (C136H)

8ECA   CD7F8E   MGSV:   CALL L8E7F       ; převést číslo souboru
8ECD   DA438F           JC   L8F43       ; a při chybě hlásit
8ED0   32B2C1           STA  NUMFIL      ; jinak číslo uložit
8ED3   3A36C1           LDA  PROMPT
8ED6   32B3C1           STA  TYPFIL      ; připravit typ souboru
8ED9   CD1581           CALL TRADR       ; načíst, odkud ukládat
8EDC   DA438F           JC   L8F43       ; chybu převodu hlásit
8EDF   EB               XCHG
8EE0   22B4C1           SHLD ADRFIL      ; počáteční adresu uložit
8EE3   E5               PUSH H           ; do pracovní oblasti i do zásobníku
8EE4   2A72C0           LHLD INPUT
8EE7   23               INX  H
8EE8   CD1E81           CALL L811E       ; do DE koncovou adresu
8EEB   E1               POP  H           ; do HL počáteční adresu
8EEC   DA438F           JC   L8F43       ; při chybě převodu ohlásit
8EEF   0E0D             MVI  C, CR       ; ukončovací znak jména
8EF1   7C               MOV  A, H
8EF2   2F               CMA
8EF3   67               MOV  H, A
8EF4   7D               MOV  A, L
8EF5   2F               CMA
8EF6   6F               MOV  L, A
8EF7   19               DAD  D
8EF8   23               INX  H           ; HL - délka souboru
8EF9   D2438F           JNC  L8F43       ; chyba - konec < začátek
8EFC   22B6C1           SHLD LENFIL      ; uložit délku
8EFF   2A72C0           LHLD INPUT
8F02   23               INX  H           ; posunout ukazatel do bufferu
8F03   11B8C1           LXI  D, NAMFIL   ; adresa jména v pracovní oblasti
8F06   0608             MVI  B, 8        ; maximální možná délka jména
8F08   7E       L8F08:  MOV  A, M        ; přesunout
8F09   B9               CMP  C           ; konec jména (CR)?
8F0A   CA178F           JZ   L8F17       ; ano
8F0D   12               STAX D
8F0E   23               INX  H
8F0F   13               INX  D
8F10   05               DCR  B           ; už 8 znaků?
8F11   C2088F           JNZ  L8F08       ; ne, pokračuj
8F14   C31F8F           JMP  L8F1F       ; ano, přenos jména ukončen
8F17   3E20     L8F17:  MVI  A, " "      ; jméno kratší než 8 znaků
8F19   12               STAX D           ; domezerovat
8F1A   13               INX  D
8F1B   05               DCR  B
8F1C   C2178F           JNZ  L8F17
8F1F   C3608F   L8F1F:  JMP  MGOREC      ; a zápis na magnetofon

       Texty hlášení pro operace s magnetofonoem

8F22   2A2A2046 MSGFIL: DB   "** FILE ERROR **", CR
8F26   494C4520
8F2A   4552524F
8F2E   52202A2A
8F32   0D
8F33   2A2A204D MSGSTP: DB   "** MG STOP! **", CR
8F37   47205354
8F3B   4F502021
8F3F   202A2A0D

8F43   F1       L8F43:  POP  PSW
8F44   C3898A           JMP  PRTEXT

       Příkaz MGSV

8F47   CDCA8E   CMDMGO: CALL MGSV        ; uložit soubor na MGF
8F4A   21338F           LXI  H, MSGSTP
8F4D   2274C0           SHLD MESAGE      ; připravit "** MG STOP! **"
8F50   C3678A           JMP  L8A67       ; vypsat a PIIP

       Příkaz MGEND

8F53   AF       CMDMGE: XRA  A           ; nulovat typ souboru - bude jen
8F54   C3AC8E           JMP  L8EAC       ; kontrola souboru z MGF

       Možnost přerušení příkazu MGLD při hledání hlavičky

8F57   CD748C   L8F57:  CALL STOP        ; stisknuto STOP?
8F5A   C2E28D   L8F5A:  JNZ  MGIREC      ; ne, pokračuj v hledání
8F5D   B7               ORA  A           ; ano, nastavit Z=0
8F5E   C1               POP  B           ; zvýšit úroveň zásobníku
8F5F   C9               RET              ; a návrat o úroveň výše

       Zápis synchronizace a hlavičky a dat z (C1B2H)
       vstup:   (C1B2H) - číslo souboru
                (C1B3H) - typ souboru
                (C1B4H, C1B5H) - ukládací adresa souboru
                (C1B6H, C1B7H) - délka souboru - 1
                (C1B8H-C1BFH) - jméno souboru (8 znaků ASCII)
       používá: vše

8F60   2E10     MGOREC: MVI  L, 16       ; 16 znaků
8F62   CDB18D   L8F62:  CALL WAIMGO      ; čekej na volný vysílač USARTu
8F65   3EFF             MVI  A, FFH
8F67   D31E             OUT  1EH         ; odeslat znak FFH
8F69   2D               DCR  L           ; už 16 znaků?
8F6A   C2628F           JNZ  L8F62       ; ještě ne, opakuj
8F6D   C3858D           JMP  MGORE1      ; ano, pokračuj dál

       Prodleva po zápisu hlavičky a zápis bloku dat
       vstup:   HL - adresa bloku dat
                DE - délka - 1

8F70   D5       L8F70:  PUSH D           ; schovej délku bloku dat
8F71   110000           LXI  D, 0        ; maximální prodleva (asi 600ms)
8F74   CDB588           CALL DELAY
8F77   D1               POP  D
8F78   CDF0C0           CALL LC0F0       ; tam je jen skok na RET
8F7B   C36C8D           JMP  MGOBLK      ; a zapsat blok dat na mgf

       Inicializace zápisníkové oblasti C0F0H

8F7E   37       L8F7E:  STC
8F7F   3F               CMC
8F80   E5               PUSH H
8F81   2100C3           LXI  H, C300H    ; C0F0H NOP
8F84   22F0C0           SHLD LC0F0       ; C0F1H JMP 8DE1H
8F87   21E18D           LXI  H, L8DE1    ; adresa instrukce RET
8F8A   22F2C0           SHLD LC0F1+1
8F8D   E1               POP  H
8F8E   C9               RET

8F8F   CDF0C0   L8F8F:  CALL LC0F0       ; skočit jen na RET
8F92   C3C48D           JMP  MGIBLK      ; a načíst blok dat

       Podpora MGF operací v Basicu

8F95   CDB98F   BSDSAV: CALL L8FB9
8F98   4E       L8F98:  MOV  C, M
8F99   CDCF8F           CALL BS1BYT      ; zapíše byte
8F9C   23               INX  H
8F9D   7E               MOV  A, M
8F9E   23               INX  H
8F9F   E5               PUSH H
8FA0   66               MOV  H, M
8FA1   6F               MOV  L, A
8FA2   0C               INR  C
8FA3   0D       L8FA3:  DCR  C
8FA4   CAAD8F           JZ   L8FAD
8FA7   CDCF8F           CALL BS1BYT      ; zapíše byte
8FAA   C3A38F           JMP  L8FA3
8FAD   E1       L8FAD:  POP  H
8FAE   23               INX  H
8FAF   CD7D00           CALL CMPHD       ; HL a DE se rovnají?
8FB2   C2988F           JNZ  L8F98       ; ne, pokračovat
8FB5   E1               POP  H
8FB6   C37E8D           JMP  L8D7E       ; ještě zapíše kontrolní součet

8FB9   2AF4C0   L8FB9:  LHLD C0F4H       ; proměnnou C0F4H
8FBC   23               INX  H           ; inkrementovat a uložit jako
8FBD   22B4C1           SHLD ADRFIL      ; jako počáteční adresu bloku dat
8FC0   EB               XCHG             ; a do de DE
8FC1   2AF6C0           LHLD LC0F6       ; do HL C0F6H
8FC4   E5               PUSH H           ; schovat
8FC5   19               DAD  D           ; přičíst k tomu počáteční adresu
8FC6   EB               XCHG             ; schovat do DE (konec uklád. bloku)
8FC7   E1               POP  H           ; obnovit co bylo v C0F6H
8FC8   4E               MOV  C, M        ; vybrat byte z adresy (C0F6H)
8FC9   0600             MVI  B, 00H
8FCB   23               INX  H           ; inkrementovat co bylo v C0F6H
8FCC   09               DAD  B           ; a přičíst dvojnásobek (C0F6H)
8FCD   09               DAD  B
8FCE   C9               RET

       Výstup bytu z paměti na magnetofon s úpravou kontrolního součtu
       vstup:   HL - adresa na odesílaný byte
                B - dosavadní kontrolní součet
       výstup:  HL - zvýšeno o 1 (na další byte)
                B - upravený kontrolní součet
       používá: B, HL, PSW

8FCF   CDB18D   BS1BYT: CALL WAIMGO      ; čekej na volný vysílač USARTu
8FD2   7E               MOV  A, M
8FD3   D31E             OUT  1EH         ; odeslat byte z paměti
8FD5   80               ADD  B           ; zkorigovat kontrolní součet
8FD6   47               MOV  B, A        ; v registru B
8FD7   23               INX  H           ; zvýšit adresu pro příště
8FD8   C9               RET

       Vstup bytů do paměti z magnetofonu s úpravou kontrolního součtu
       vstup:   HL - adresa, kam byte uložit
                B - dosavadní kontrolní součet
                C - požadovaný počet bytů
       výstup:  HL - zvýšeno na následující volnou adresu
                B - upravený kontrolní součet
                C - vynulováno

8FD9   CD0E8E   BSCBLK: CALL WAIMGI      ; čekej na znak z přijímače USARTu
8FDC   DB1E             IN   1EH         ; a načti ho
8FDE   77               MOV  M, A        ; a ulož ho
8FDF   80               ADD  B
8FE0   47               MOV  B, A        ; korekce kontrolního součtu
8FE1   23               INX  H           ; příprava adresy pro příště
8FE2   0D               DCR  C
8FE3   C2D98F           JNZ  BSCBLK
8FE6   C9               RET

       Nulovat zvuk a poslat nový (viz BELL)

8FE7   DBF6     L8FE7:  IN   F6H         ; sejmout stav portu
8FE9   E6FC             ANI  FCH         ; nulovat dolní dva bity
8FEB   D3F6             OUT  F6H         ; a vrátit na port (zvuk)
8FED   C3A688           JMP  BELL        ; pokračuj v tvorbě signálu

       Inicializace grafiky
       používá: HL, PSW

8FF0   3EA8     L8FF0:  MVI  A, A8H
8FF2   32FAC1           STA  CODSET      ; nastavit inverzi bodu
8FF5   AF               XRA  A
8FF6   323AC0           STA  CPOINT      ; nulovat barevné atributy
8FF9   210085           LXI  H, TABZN-100H
8FFC   223CC0           SHLD TASCII      ; nastavit standardní tabulku znaků
8FFF   C9               RET              ; a návrat

       Součást BASICu G, porovná obsah registrů DE a HL
       vstup:   DE - první porovnávané číslo
                HL - druhé porovnávané číslo
       výstup:  Z=0 - registry se nerovnají
                Z=1 - registry se rovnají
       používá: PSW

007D   7C       CMPHD:  MOV  A, H
007E   92               SUB  D
007F   C0               RNZ
0080   7D               MOV  A, L
0081   93               SUB  E
0082   C9               RET