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 ?"
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ýstpu: 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ýstpu: 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 ; adrese 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ýstyp: 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