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