ÚVOD | Novinky | 8 Bitů | Příslušenství | Drobnosti | TTL | Kontakt


SAPI-1 | ONDRA | PMI-80 | PMD-85 | klony PMD-85 | PP01 | PETR | PLAN-80A | IQ151


ZPS | Technické prostředky | Programové vybavení | Dokumentace


8 bity / SAPI-1 / Programové vybavení / Dokumentace programů


OCR dokumentace "Dokumentace k programům TESLA ELTOS oranžová"











TESLA
ELTOS
OBOROVÝ
PODNIK
DIZ
SAPI 1


1.
NÁVOD K PROGRAMU
GENCODE
 
2.
PRINTER-
program pro tisk souborů
 
3.
COPIER-
program pro kopírování souborů
 
4.
OVLADAČ DÁLNOPISU
T-100
 
5.
ARITMETIKA V POHYBLIVÉ
ŘÁDOVÉ ČÁRCE
 
6.
ARITMETIKA V PEVNÉ
ŘÁDOVÉ ČÁRCE










OBSAH

  1. NÁVOD K PROGRAMU GENCODE
  2. PRINTER - program pro tisk souborů
  3. COPIER - program pro kopírování souborů
  4. OVLADAČ DÁLNOPISU T-100
  5. ARITMETIKA V POHYBLIVÉ ŘÁDOVÉ ČÁRCE
  6. ARITMETIKA V PEVNÉ ŘÁDOVÉ ČÁRCE


NÁVOD K PROGRAMU GENCODE


Program GENCODE usnadňuje komunikaci programu v jazyku BASIC s podprogramy v ASSEMBLERU. GENCODE vytvoří přikaž Code (popř. soubor příkazů Code pro delší podprogram v ASSEMBLERu), který právě výše uvedenou komunikaci zajišťuje.

Máme-li podprogram napsaný v ASSEMBLERU přeložený již v paměti, známe tím jeho adresu začátku i konce. Program GENCODE na základě těchto údajů (počáteční, a koncové adresy) vytvoří příkaz Code nebo soubor příkazů Code (dle délky programu v ASSEMBLERu). Příkazy Code jsou již připraveny pro zařazení do programu napsaného v BASICu. To znamená, že obsahují čísla řádku, jak to vyžaduje BASIC. Číslo řádku pro první příkaz Code a krok řádku pro případné další Code je možné si volit.

Takto vzniklý příkaz Code či soubor příkazů Code pak k programu v BASICu připojíme v PEDITu (příkazem R # A) nebo přímo v BASICu (příkazem LOAD).

Počet vytvořených Code záleží na délce podprogramu v ASSEMBLERu. Jeden příkaz Code zpracuje 16 bytů přeloženého podprogramu v ASSEMBLERu.

Pro zvýšeni přehlednosti příkaz "CODE" popíšeme. Příkaz je určený pro komunikaci programu v BASICu ASSEMBLERu. Provede uložení dat od zadané adresy do paměti.

Má následující tvar:

CODE ADR;HEX DATA, ... DATA

Příklad použití:

CODE HEX(4300) ;3E, 20, 21 , 0, 0, C9;

Tento zápis odpovídá podprogramu v ASSEMBLERU, který je uložen od adresy 4300H a má tvar:

        MVI     A,' '
        LXI     H,0
        RET             ;Povinné!

Interpret BASIC EX má vyhrazený prostor pro uživatelské podprogramy v ASSEMBLERU Qd adresy 4300H po adresu 43FFH. Umístěni podprogramu mimo tuto oblast si musí uživatel zabezpečit sám (např. umístěním na konec paměti a snížením MEMTOPu - oboji je nutno provést před odstartováním interpretu BASICu) . Zdrojový tvar podprogramu by měl obsahovat direktivu ORG, jejíž operand udává vlastně adresu, od které se podprogram překládá. V opačném případě se automaticky překládá od adresy 7000H (pro BASIC nevhodné!).

Poznámka:

Každý podprogram v ASSEMBLERU volaný programem v BASICu musí končit instrukci RET (C9). Povinné!



Stručný popis programu GENCODE

GENCODE se načitá do paměti příkazem MONITORu "K_L" a je uložen do adresy E000H. Může být spuštěn příkazy MONITORu "J" nebo příkazem "G=E000".

Program GENCODE má prakticky dva vstupy. Implicitní, který GENCODE bere automaticky z určitého místa paměti. Zadávaný, kterým uživatel upřesňuje tvar výstupu. Oba si nyní vysvětlíme podrobněji.

  1. IMPLICITNÍ - GENCODE si data pro vytvářeni výstupního souboru bere vždy od adresy 7000H. Tento postup je zvolen z následujícího důvodu: složitější, podprogram není vhodné psát přímo ve strojovém kódu, ale převést ho do něj programy souboru TOOL (PEDIT, ASSEMBLER). A právě ASSEMBLER ukládá strojový kód vždy od adresy 7000H, kde ho očekává GENCODE. (Umístěni strojového kódu podprogramu od adresy 7000H je tedy nutné pro správnou činnost programu GENCODE!)

  2. Zadávané - po textu "číslo, krok řádku, start, stop adr. uloženi" vyžaduje GENCODE zadat:

    • číslo řádku prvního příkazu "CODE" (tj. číslo příkazového řádku BASICu)

    • krok řádku pro určeni čísla dalších řádků dalších příkazů "CODE"

    • start adr. uloženi je adresa, od které se uloží podprogram do paměti (tj. adresa uvedená v prvním příkazu "CODE"); tato adresa by měla souhlasit s operandem direktivy ORG. podprogramu

    • stop adr. uloženi udává konec podprogramu; (rozdíl stop - start adr. uloženi určuje počet bytů, které GENCODE zpracuje).

      Vstup čísla a kroku řádku je desítkový. Vstup start a stop adr. uloženi je hexadecimální. Vstupy jsou odděleny mezerou a ukončeny znakem "CR". Pro vstupy (stejně jako v MONITORu) platí poslední čtyři zadané číslice.

Výstupem, jak již bylo uvedeno, je soubor příkazů "CODE", připravených pro program v jazyku BASIC. Výstup se provádí automaticky na kazetový magnetofon s běžnou obsluhou pro zápis na kazetu.

Ukončeni činnosti programu GENCODE je ohlášeno na obrazovku textem "** na pásce je BASIC program **" a následným skokem do monitoru.

Následující, přiklad ukazuje možné použití programu GENCODE.

Příklad:



PRIKLAD:
--------

ZDROJOVY TVAR PODPROGRAMU:



        TITLE   UKAZKA PODPROGRAMU V ASSEMBLERU
;               PRO PROGRAM V BASICU


;       PREPNUTI TISKARNY C-2111 NA CERVENOU BARVU

        ORG     4300H
        MVI     C,11H
        CALL    10FH    ;LO
        RET

;       PREPNUTI TISKARNY C-2111 NA CERNOU BARVU

        ORG     4310H
        MVI     C,12H
        CALL    10FH    ;LO
        RET


;       PREPINANI BAREV NA TISKÁRNĚ C-2111

        ORG     4320H
RUDA:   MVI     C,11H
        JMP     $+5
CERNA:  MVI     C,12H
        CALL    10FH    ;LO"
        RET

.
.
PRELOZENI ZDROJOVE FORMY ASSEMBLERU OD ADRESY ZADANÉ
V DIREKTIVE ORG (4300H,4310H,4320H). PO UK0NCENI PŘEKLADU
JE STROJOVÝ KOD UMISTEN OD ADRESY 7000H.
.
.

.K_L
NAME:
GENCODE.SAV     - NAČTENI "GENCODE" DO PAMĚTI
.
.
.J              - (NEBO "G=E000")

CISLO,KROK RADKU,START,STOP ADR.ULOŽENI
=10 =10 =4300 =432F

LAST NAME
XXX.YY
PLAY DONE:Y

NEW NAME:
CODE.DAT
RECORD DONE:Y


** NA PASCE JE BASIC PROGRAM **-

.
.
NATAŽENI BASICU
.
.
READY:
LOAD

NAME:
CODE.DAT
.
.
READY:
LIST
10 CODE HEX(4300);0E,11,CD,0F,01,C9,21,40,21,40,21,40,21,40,21,40
20 CODE HEX(4310);0E,12,CD,0F,01,C9,21,40,21,40,21,40,21,40,21,40
30 CODE HEX(4320);0E,11,C3,27,43,0E,12,CD,0F,01,C9,40,21,40,21,40

READY:

NAPSANI HLAVNÍHO PROGRAMU (NEBO SPOJENI DALSIM "LOAD").
.
.
READY:
LIST


10 CODE HEX(4300);0E,11,CD,0F,01,C9,21,40,21,40,21,40,21,40,21,40
20 CODE HEX(4310);0E,12,CD,0F,01,C9,21,40,21,40,21,40,21,40,21,40
30 CODE HEX(4320);0E,11,C3,27,43,0E,12,CD,0F,01,C9,40,21,40,21,40
100 PRINT #L "UKAZKA PODPROGRAMU V ASSEMBLERU"
120 PRINT #L "PODPROGRAM PREPINA BARVY NA TISKÁRNĚ C-2111"
130 PRINT #L
150 PRINT #L "PREPNUTI NA ";
160 X=USR(HEX(4300))          ! NEBO X=USR(HEX(4320))
170 PRINT #L "CERVENOU BARVU"
180 PRINT #L
190 PRINT #L "PREPNUTI NA ";
200 X=USR(HEX(4310))          ! NEBO X=USR(HEX(4325))
210 PRINT #L "CERNOU BARVU"
220 END

READY:




PRINTER - PROGRAM PRO TISK SOUBORU


Program PRINTER je doplňkovým programem kazetopáskového programového vybavení. V. 4, určeného pro mikropočítač SAPI-1 v sestavě ZPS-2. Printer čte vstupní znakový (ASCII) soubor z mg. pásky a dle volby tento soubor současně zobrazuje na displeji nebo na tiskárně. Pro svoji činnost vyžaduje z programového vybavení V.4 MONITOR a MIKOS, jejichž standardní služby používá.

Význam programu PRINTER je především ve dvou oblastech:

  1. K mnoha systémům SAPI-1 je připojena tiskárna bez formátovacího zařízení. Při výpisech souborů potom schází nastránkování textů. To není ideální ani v případě použití papíru na roli, ani při použití skládaného papíru (v tomto případě tiskne tiskárna i přes přehyb papíru). Jednou z funkcí PRINTERu je simulace činnosti formátovacího zařízení, kdy program provádí stránkování. Tuto funkci PRINTERu je možno potlačit v případě, že tiskárna formátovacím zařízením vybavena je.

  2. V případě tisku souboru příkazem programu PEDIT je na konci každého řádku CR zobrazen jako "^" Především u textových souborů to působí rušivě. Program PRINTER toto neprovádí. Podobně.jako program PEDIT i PRINTER rozvíjí tabulátor.

    Není-li k systému SAPI-1 připojena systémová tiskárna, ale tiskárna uživatelská, je značným problémem tisk textového souboru. Ze systémových programů pracuje s uživatelskou tiskárnou jen BASIC, program TOOL uživatelskou tiskárnu nepřipouští. Není tedy možný tisk příkazem "P" v PEDITu. Program PRINTER umožňuje tisk na systémovou i uživatelskou tiskárnu i zobrazení souboru na displeji.

    Program má pevně nastavený formát tisku. Změnou konstant na určených adresách je možno formát změnit a vytvořit si tak svoji "uživatelskou" modifikaci PRINTERu. Formát tisku není vstupním parametrem programu z toho důvodu, že se předpokládá dlouhodobé používáni stejné tiskárny a opakované zadáváni parametru při každém spouštěni printeru je zbytečné.



Spuštěni programu

Natažení programu PRINTER do paměti se provádí z MONITORu příkazem K_L. Program je přeložen a umístěn od adresy 4300H a na toto místo paměti ho příkaz K_L také uloží.

Délka PRINTERu je necelých 250 B, vejde se tedy do adresnýho prostoru 4300H - 4400H. Znamená to, že svým natažením ani svou činností neporuší systémové programy BASIC a TOOL, ani uživatelské programy, umístěné dále v paměti. Pouze je třeba si uvědomit, že v případě BASICu je prostor 4300H - 4400H vyhrazen pro assemblerovské podprogramy, PRINTER je tedy přepíše!

Spuštěni PRINTERu se provede příkazem J, případně příkazem G = 4300. Program se ohlásí:

'PRINTER V4.0'

a očekává určení výstupního zařízení.



Výstupní možnosti PRINTERu

Program kopíruje vstupní soubor na výstupní zařízení typu L-list (logická tiskárna). Tomuto zařízení mohou v systému SAPI-1 odpovídat tato fyzická zařízení:

        LPR    - tiskárna
        CRT    - displej
        USER 1 - uživatelské zařízeni typu L

Přiřazeni fyzických zařízeni logické tiskárně je dáno hodnotou IOBYTU a dává tyto možnosti (označeni je stejné jako v povelech "A" a "Q" MONITORu):

        L = T   LIST = tiskárna + displej (LPR + CRT)
        L = C   LIST = displej (CRT)
        L = L   LIST = tiskárna (LPR)
        L = 1   LIST = uživatelská tiskárna (USER 1)

PRINTER umožňuje výstup na všechna výše uvedená zařízeni. Typ výstupu se zadá po dotazu:

"Výstup (T;C;L;1;M)?"

Odpovědi je jedno písmeno (ze znaků uvedených v dotazu v závorce) , kde znamená:

T-výstupní soubor se bude zobrazovat na displeji (CRT) a současně tisknout na tiskárně (LPR)
C-výstupní soubor se bude pouze zobrazovat na displeji (CRT)
L-výstupní soubor se bude pouze tisknout na tiskárně (LPR)
1-výstupní soubor vystoupl na uživatelském zařízeni typu L (USER 1)
M-znamená ukončeni činnosti PRINTERu a návrat do MONITORu.

(Návrat do MONITORu způsobí také každý další výše neuvedený znak.)

Poznámka:
Podle zadaného výstupního zařízeni si PRINTER nastavuje IQBYT. Vždy po ukončeni kopírováni souboru však nastaví původní hodnotu IOBYTu, jaká byla při vyvoláni PRINTERu. Po ukončení činnosti PRINTERu zůstává tedy IOBYT nezměněn.



Vstup PRINTERu

Vstup programu je implicitní a je jim znakový (ASCII) soubor z magnetofonu. Po zadáni typu výstupu z klávesnice očekává program zadáni jména souboru, proto vypíše:

NAME

Zadáváni jména a obsluha magnetofonu odpovídá programovému vybavení V4.0, nebude zde tedy popsáno.

Po nalezeni zadaného souboru probíhá kopírováni na příslušné výstupní zařízení. Kopírováni jde blok po bloku, tj. načte se jeden blok vstupního souboru a vytiskne se na výstupní zařízeni. Potom se načítá další blok atd., až do konce souboru. Po zkopírování celého souboru PRINTER obnoví IOBYT na původní hodnotu a vypíše opět dotaz:

"VYSTUP (T;C;L;1;M)?"

Je tedy možno tisknout další soubor. Pokud nechceme, zadáním "M" (nebo jiného, neuvedeného znaku) ukončíme činnost programu a předáme řízení MONTTORu.



Formát tisku

Jak již bylo uvedeno, PRINTER nahrazuje formátovací zařízení na tiskárně, kde není použito.

Předpokládaný formát tisku je:

72 znaků na řádku
72 znaků na stránce - tj. však celá kapacita stránky tiskne se 65 řádků na stránce.

To znamená, že mezera mezi tištěnými stránkami je 7 řádků. Při použiti skládaného papíru je třeba papír nastavit tak, aby řádky oddělující stránky vyšly na přehyb. To je zajištěno tehdy, když při zahájeni tisku bude horní okraj papíru 1,5 - 2 cm nad hlavičkou tiskárny. (Hlavička je na úrovni druhé vodici dírky v papíru). Tisk má potom následující formát:

3 řádky vynechány
.
.
.
65 řádků textu 1. stránky
.
.
.
4 řádky vynechány
--------------------------------- přehyb papíru
.
.
.
3 řádky vynechány
.
.
.
65 řádků textu
atd.

Na jeden řádek se tiskne maximálně uvedený počet znaků. Je-li řádek delší, jsou přebývající znaky vynechány (netisknou se, řádek je oříznut)!



Modifikace formátu tisku

Ne každém uživateli a každé tiskárně vyhovuje použitý formát tisku 72 znaků a 72 řádků. Tyto hodnoty je možno modifikovat a vytvořit si tak PRINTER "šitý na míru". Konstanty určující formát tisku Jsou uloženy na počátku PRINTERu.

ADRESA   OBSAH   VÝZNAM
4303H48Hhexadecimálně počet znaků na jeden řádek (48H = 72DEC)
4304H48Hhexadecimálně počet řádků (celkem) na stránku
4305H4EH= 'N' - na tiskárně není použito formátovací zařízení

Změnou těchto hodnot změníme i formát tisku. V případě, že použitá tiskárna má formátovací zařízení, potom lze stránkování v PRINTERu potlačit tím, že na adresu 4305H uložíme kód znaku 'A' (41H). Modifikovaný program si uložíme na kazetu pro další používání.

Příklad:

Chceme formát tisku 60 znaků na řádek a 40 řádků na stránku. Formátovací zařízení na tiskárně není. Dodaný PRINTER má paramétry:

- 72 znaků na řádek
- 72 znaků na stránku
- formátovací zařízení nepoužito

  1. PRINTER natáhne do paměti příkazem K_L
  2. Změníme parametry v paměti na uvedených adresách příkazem "S" MONITORu:
  3. .S=4303<SP> 48-3C<SP> 48-28<SP> 4E-<CR>
    

    kde zadáme:
    3CH = 60DEC je nový počet znaků na řádek
    28H = 40DEC je nový počet řádků na stránce
    - znak 4EH = 'N' ponecháme

  4. Uložíme takto upravený program na pásku příkazem:
  5. .K_S
    =4300 <SP> =43FF<CR>
    

    Tím máme PRINTER modifikovaný pro další používání pro stejný formát tisku.



Příklad použití PRINTERu

Na pásce je soubor POPIS.TXT. Chceme si jej zobrazit na displej a případně vytisknout na tiskárně (systémové).

.K_L
 NAME
:PRINTER <CR>
.. Natažení programu do paměti
:.J     (nebo G=4300)
PRINTER V4.0
VYSTUP (T;C;L;1;M);C - Výstup na displej
 NAME
:POPIS.TXT <CR>
.
.
.
Nalezení a zobrazení souboru POPIS.TXT na displej.
Výstup (T;C;L;1;M)?L - Výstup na tiskárnu
 NAME
:POPIS.TXT
.
.
Nalezení a tisk souboru POPIS.TXT na tiskárně
.
VYSTUP (T;C;L;1;M)?M - Ukončení PRINTERu a návrat do MONITORu




COPIER - program pro kopírování souborů

Program COPIER slouží ke snadnému a rychlému kopírováni souborů. Umožňuje načíst jeden nebo.několik souborů z kazety do paměti a potom je v celku, ve skupinách nebo jednotlivě nahrát na kazetu. V rámci jednoho celku nahrávaného naráz nelze pořadí jednotlivých souborů měnit. Při kopírování je možno jednotlivé soubory přejmenovat, případně pod stejným jménem nahrát několikrát (max. 9 krát) za sebou.

Dále umožňuje dokončit kopírování souboru, který se při načítání do paměti již nevešel a zůstal tedy "rozpracovaný". Součásti COPIERu je též možnost kontroly souboru zaznamenaného na pásku s jeho vzorem v paměti, tedy s originálem.

Pro práci s kazetovým magnetofonem se používají stejné konvence jako v MIKOSu (v příkazech K_S, K_L, L_A, K_I); pracuje se i s hvězdičkovou konvencí.

Program COPIER je určen pro počítače SAPI-1 v sestavě ZPS-2. Pro svou činnost vyžaduje pouze monitor programového vybavení verze 4.0 a paměť typu RAM od adresy 4000(HEX) .



Mapa paměti při práci s programem COPIER

Program se ukládá do paměti od adresy 4400(HEX), tedy na stejné místo jako BASIC nebo TOOL.

Jedná se tedy o systémový program, který je při své činnosti jediným programem v paměti.

0000H   I----------------------I
        I        MONITOR       I
0800H   I----------------------I
        I  (MONITOR+, MIKOS)   I
        I     NENÍ NUTNÉ       I
1000H   I----------------------I
        I STANDARDNÍ ROZDĚLENÍ I
        I PAMĚTI SAPI-1 ZPS 2  I
        I (VOLNÉ EPROM, PORTY, I
        I VIDEOGRAM)           I
4000H   I----------------------I
        I  PRACOVNÍ OBLAST     I
        I MONITORU A COPIERU   I
4400H   I----------------------I
        I       COPIER         I
5130H   I----------------------I
        I    DATOVÁ OBLAST     I
        I        COPIERU       I
        I           -          I
        I KOPÍROVANÉ SOUBORY   I
FFFFH   I----------------------I
(MEMTOP)

COPIER tedy nevyžaduje přítomnost MIKOSu. Všechny rutiny pro práci s kazetovým magnetofonem má v sobě obsaženy. Protože však COPIER používá pro svou činnost stejnou pracovní oblast jako MIKOS, je vhodné po ukončení činnosti programu COPIER vykonat v monitoru příkaz "C", který nastaví příznaky pro vstupní a výstupní soubory do počátečního stavu.

"Kapacita" COPIERu, tedy kolik souborů naráz je program schopen kopírovat, je dána velikostí použité paměti typu RAM. Program COPIER si sám zjistí nastavení horního konce paměti (MEMTOP).



Struktura bloku na pásce a v paměti

OS MIKOS při zápisu souboru na kazetový magnetofon rozčleňuje soubor na bloky, které maji následující formát:

I--------------------I----I----I----I-----I---------------I-------I---------
I MEZIBLOKOVÁ MEZERA I 10 I 10 I 10 I KÓD I 255 BYTŮ DATA I NÁZEV I
I--------------------I----I----I----I-----I---------------I-------I--------

--I----------I------------I------------I----I----I---------------------I--------
  I Č. BLOKU I Č. SOUBORU I KONT. SUMA I 10 I 00 I MEZ IBLOKOVÁ MEZERA I ...
--I----------I------------I------------I----I----I---------------------I-------


10            - jsou synchronizační znaky

kód           - určuje typ bloku:
                01  - první blok souboru
                04  - poslední blok souboru
                A   - datový blok znakového souboru
                B   - datový blok binárního souboru
                :   - blok tvořící záhlaví pásky, vytváří
                      se inicializací kazety

DATA          - 255 BYTŮ DAT, která jsou specifikována
                kódem:
                01  - blok obsahuje pouze název souboru
                      a poznámku do celkové délky 64 bytů
                A   - ASCII DATA
                B   - binární data; tento blok navíc obsa-
                      huje i počáteční a koncovou adresu
                      uložení dat a další kontrolní součty
                      (vše i s daty má délku 255 bytů)
                04  - blok obsahuje zbytek dat typu "A"
                      nebo "B"
                :   - blok obsahuje název kazety do délky
                      64 bytů

název         - 11 bytů názvu souborní

č. bloku      - hexadecimální pořadové číslo bloku
                v souboru

č. souboru    - pořadové číslo souboru na pásce

kont. suma    - kontrolní součet celého bloku

10,00         - ukončení bloku

Z bloku souboru, který je vybrán pro kopírování, se do paměti načitá pouze kód bloku a vlastní data. Jeden blok souboru má potom v paměti délku 256 bytů a do jednoho volného kilobytu paměti se tedy vejdou čtyři bloky kopírovaného souboru. Pro snazší odhad volné paměti program COPIER vypisuje velikost volné paměti, a to v počtu bloků, které se do paměti ještě vejdou (hexadecimálně).



Zavedení programu a jeho spouštění

COPIER se zavede do paměti z monitoru příkazem "K_L" a odstartuje se příkazem "J" nebo "G=4400".

Po startu programu se provede počáteční inicializace, datová oblast COPIERu se "vymaže" a program se ohlásí. "COPIER V 4.0C". Současně s hlavičkou se také vypíše rozsah volné paměti (hexadecimálně - pro kolik bloků z pásky je v paměti místo). COPIER je připraven k práci a očekává vstup příkazu po znaku ">".

Spuštění programu bez inicializace a "výmazu" paměti je možné na adrese tzv. "teplého startu" - 4403(HEX).

Příkazy jsou tvořeny jednotlivými znaky (příkaz = jedno písmeno). Vždy, když je možnost volby vstupního příkazu, jsou všechny možnosti zobrazeny i se stručným popisem.

                        COPIER V4.0C

Počet volných bloků: AF

 F - načtení souboru do paměti
 C - zápis souboru z paměti na magnetofon
 B - restart COPIERu
 M - převíjení pásky
 Q - návrat do monitoru
 V - kontrola souboru páska/paměti
*U - uložení rozpracovaného souboru
*R - dočtení souboru do paměti 
*W - dokončení rozpracovaného souboru

 > - očekává příkaz COPIER

Poznámka:

Hvězdičkou "*" jsou označeny příkazy pro rozpracovaný soubor, který vyžaduje speciální ošetření (viz dále). Zadání jiných příkazů, než které COPIER připouští, nevyvolá žádnou činnost. Tato možnost je ošetřena a nevede k chybě.



Popis příkazu COPIERu


>F

Příkaz "F" načte zadaný počet souborů z pásky a uloží je do paměti. Vyžaduje zadat počet načítaných souborů:

"Počet vstupních souborů ="

Dále se zadá jméno prvního vstupního souboru, další soubory se načítají automaticky v pořadí, jak jsou zapsány na pásce.

Pozor!

Zadání většího počtu souborů, než na pásce od zadaného jména, vede k chybě. Zadáním nuly se přeruší přikaž "F" a program se vrací na vstup nového příkazu.

Při zápisu do paměti se hlídá její konec (MEMTOP). Nevejde-li se určitý soubor už do paměti, je hlášena chyba :

Soubor XXX.YY nedokončen!
konec paměti!

Program ukonči přikaž "F", vrací se na vstup nového příkazu a nedokončený soubor se bere jako rozpracovaný.

Příkaz "F" nahrávané soubory přidává (!) za soubory již v paměti umístěné případnými předchozími příkazy "F". Neprovádí tedy přepisování souborů v paměti.

Přiklad:

>F
Počet vstupních souborů=<3>
NAME:
<XXX.YY>
PLAY DONE: <Y>
   - v paměti jsou nyní načteny tři soubory počínaje souborem XXX.YY


>V

Provádí:

Po spuštění magnetofonu se s výpisem první hlavičky (názvu) vypíše současně dotaz "(Y/N)":

"N"-pro tento soubor se provede pouze porovnání kontrolních součtů; s nalezením a vypsáním hlavičky dalšího souboru se opět vypíše dotaz ("Y/N")
"Y"-

se vypíše

"Počet kontrolovaných souborů="

a zadá se počet souborů (včetně již vypsaného), u kterých se provede i kontrola s jejich vzory v paměti; je-li zadána hodnota = 0, přeruší se provádění příkazu "V" a program se vrací na vstup dalšího příkazu; v případě, že některý ze souborů v paměti není, vypíše se pod hlavičku souboru zpráva:

"-- soubor není v paměti"

a pro tento soubor se provede pouze porovnání kontrolních součtů.

Po kontrole zadaného počtu souborů se provádí návrat a vstup dalšího příkazu bez zobrazení volby možnosti, protože výsledkem příkazu "V" je zpráva na obrazovce a není vhodné si ji hned přepsat.

Poznámka:

Při indikaci chyby (znak "#") není rozlišeno, zda se jedná o chybu kontrolního součtu nebo o ohybu při porovnávání přečteného bloku s jeho vzorem v paměti.

Příklad:

>V
PLAY DONE: <Y>

XXX. YY     (Y/N) <N>
03-15                     - provedeno pouze "K_D"
XXX.ZZ      (Y/N) <Y>
Počet kontrolovaných souborů = <3>
XXX.ZZ                    - znovu hlavička souborů
04-11
XXX. WW
-- soubor není v paměti
05-10                     - provedeno pouze "K_D"
XXX.QQ                    - indikace chyb ve třech blocích
06-05
>

U souboru č. 03 byla odpověd "<N>", proto byly porovnány pouze kontrolní součty jeho jednotlivých bloků. Dotaz "(Y/N)" tedy následoval opět s výpisem hlavičky dalšího souboru. Nyní byla odpověď "<Y>" a požadovaná kontrola tří souborů. Soubor č. 05 nebyl nalezen v paměti, proto byly porovnány jen kontrolní součty bloků. Soubory č. (04 a 06 byly navíc porovnány se svými vzory v paměti.



>B

Je restart COPIERu. Po jeho provedení jsou soubory v paměti "vymazány". Proto je vykonání příkazu "B" vázáno ještě na kladnou odpověď na dotaz:

"Chceš opravdu vymazat paměť? (Y/N)"



>M

Je převíjeni pásky, naprosto totožné s příkazem "K_M" MIKOSu.



>O

Je návrat do MONITORu. Tedy ukončeni činnosti programu COPIER. Zpětný návrat do COPIERu bez ztráty souboru v paměti (tedy bez inicializace) je možný tzv. "teplým startem" na adrese 4403 (HEX), tj. příkazem "G=4403".



>C

Přikaz umožňuje přejmenovat jednotlivé soubory a nahrát soubory na pásku. Pro bližší specifikaci požadované činnosti je nutno zadat další parametr po znaku ":", přičemž je opět zobrazena nabídka všech možnosti.

COPY
  L  -  uloženi typu "LAST NAME"
A-uloženi typu "APPEND"
I-uloženi s inicializaci kazety
S-výběr souboru pro uloženi
J-návrat do COPIERu
:-očekává parametr příkazu "C"

Parametry příkazu "C"

:S

Příkaz "S" umožňuje přejmenovat jednotlivé soubory a zadat, kolikrát se který soubor při kopírováni na pásku zopakuje.

Na obrazovce se vypíše hlavička:

     SOUBOR         :POČET      PŘEJMENOVAT
                     OPAKOVÁNÍ  (Y/N)

Program postupně vypisuje názvy souborů, které jsou v paměti a čeká hodnotu, kolikrát má daný soubor při zápisu na pásku zopakovat (povoleno 0 až 9 krát). Dále se ptá, zda se má daný soubor přejmenovat. Jestliže ano, vypíše se na nový řádek

"NEV NAME:"

a je možno zadat nové jméno (max. 64 znaků), které se uloží do paměti do prvního bloku přejmenovávaného souboru. Po projití všech souborů v paměti se program vrací na vstup dalšího parametru příkazu "C", tedy na ":"

V případě chybně zadaného počtu opakování či nového jména některého souboru je možno opětovným zadáním parametru "S" příslušné údaje opravit. Přejmenované soubory jsou nyní již zobrazeny pod svým novým jménem (původní název se nikde neuchovává).

Soubor s počtem opakování = 0 se na pásku nezapíše.

Ihned po zadání příkazu "C" jsou implicitně počty opakování pro všechny soubory v paměti nastaveny na jedenkrát. Nechceme-li žádný soubor přejmenovat a chceme všechny načtené soubory nahrát jednou ve stejném pořadí na pásku, není třeba parametr "S" zadávat a je možno soubory přímo kopírovat.

Rozpracovaný soubor se kopíruje zvláštním postupem a ve volbě "S" se proto neuvažuje.

Příklad;

:S
SOUBOR        POČET        PŘEJMENOVAT
              OPAKOVÁNÍ    (Y/N)
XXX.YY        <3>          <N>
XXX.ZZ        <1>          <Y>
NEW NAME      ZZZ.XX       COMMENT
XXX.WW        <0>          <N>

Soubor XXX.YY je připraven pro nahráni na pásku třikrát za sebou. Soubor XXX.ZZ byl přejmenován na ZZZ.XX a je připraven pro jedno nahráni. Soubor XXX.WW na pásku nahrán nebude

Příkaz "S" tedy slouží pouze pro definování posloupnosti souboru pro zápis na pásku. Vlastní záznam je vyvolán zadáním příkazu "L,A" nebo "I".

Program pak prochází pamětí a kopíruje jednotlivé soubory v tom pořadí, jak byly nahrány do paměti. Každý soubor navíc zapisuje tolikrát, jak bylo nastaveno příkazem "S" (byl-li použit, jinak zapíše každý soubor jednou). První soubor se zapisuje podle zvoleného způsobu zápisu (L, A nebi I). Další soubory se za první soubor nahrávají již automaticky.


:L

Zápis na pásku za zadaný poslední soubor, tedy uložení způsobem "LAST NAME" (podrobný popis viz MIKOS) .


:A

Zápis na pásku tam, kde je právě nastavena.


:I

Inicializace kazety a poté zápis souboru na pásku. První soubor se začne automat nahrávat ihned po záznamu bloku s názvem kazety.


:J

Návrat do hlavního cyklu COPIERu bez jakékoliv činnosti.

Poznámka:

U parametru L, A, I se nezadává "NEV NAME" jako v MIKOSu. Soubory se zapisuji na pásku pod stejným jménem, jak byly načteny do paměti nebo v ni přejmenovány. Zápis se tedy začne provádět ihned po odpovědi <Y> na dotaz "RECORD DONE?" COPIER při nahráváni na kazetu zobrazuje na první řádek obrazovky název souboru a číslo bloku (na rozdíl od MIKOSu, který zobrazuje jen číslo bloku).



Příkazy pro rozpracovaný soubor

>U

Příkaz provede zápis první části rozpracovaného souboru, načtené příkazem "F" na pásku. I tento soubor je možno přejmenovat po kladné odpovědi (<Y>) na dotaz, který COPIER vypíše

"PŘEJMENOVAT (Y/N)"

a po vypsáni "NEW NAME" je možno zadat nové jméno (celková délka jména i s poznámkou je opět 64 znaků).

V příkazu "U" je zápis implicitně typu "LAST NAME", tedy za zadaný poslední soubor. Tímto příkazem zapsaný soubor však zůstává otevřený!



>R

Dočteni zbylé části rozpracovaného souboru do paměti. Pásku je nutno nastavit před začátek "rozpracovaného" souboru, jehož jméno COPIER sám vypíše na obrazovku, po spuštěni přehráváni se zbytek rozpracovaného souboru uloží do paměti. (Vždy od začátku - je to nyní jediný soubor v paměti!)

I v případě přejmenováni příkazem "U" se soubor dočítá pod starým jménem.



>W

Uložení zbylé části rozpracovaného souboru na pásku. Pásku je nutno nastavit před začátek uloženého rozpracovaného souboru, jehož jméno COPIER opět sám vypíše na obrazovku (v případě přejmenování v "U" pochopitelně nové jméno). Po spuštění přehráváni COPIER "přejede" již nahrané bloky první části souboru, zastaví se a vyžádá si nahrávání. Potom přidá zbylou část rozpracovaného souboru.

Poznámka:

Z důvodu synchronizace je mezi dvěma částmi rozpracovaného souboru dlouhá mezisouborová mezera. COPIER umožňuje rozpracování jen jednoho souboru, ale s možnosti vícenásobného rozpracování.

Příklad kopírování "rozpracovaného" souboru:

V paměti je několik souborů a první část "rozpracovaného" souboru, COPIER v příkazu "F" ohlásil konec paměti:

soubor XXX.YY nedokončen!
konec paměti !

Předchozí "celé" soubory je nutno uložit pomocí příkazu "C". Provedením posloupnosti příkazů pro "rozpracovaný" soubor (přesněji příkazem "W") by tyto soubory byly v paměti přepsány a ztraceny.

Uložení rozpracovaného souboru vyžaduje následující postup:

>U
Přejmenovat (Y/N)<N>
LAST NAME: <"poslední soubor">
PLAY DONE: <Y>
RECORD DONE:<Y> - nahraje první část souboru

>R
NAME
XXX.YY          - toto jméno vypíše COPIER sám!
PLAY DONE:<Y>   - přečte zbylou část souboru do paměti

>W
NAME:
XXX.YY          - opět COPIER vypíše sám (v případě pře-
                  jmenování vypíše nové jméno zadané 
                  v příkazu "U")
PLAY DONE:<Y>
RECORD DONE:<Y>

Pro správný zápis rozpracovaného souboru nelze uvedenou posloupnost příkazu zaměnit (nebo narušit jiným příkazem)!



Zadávání vstupu v programu COPIER

  1. Vstup číselné hodnoty pro:
  2. se provádí pomocí služby EXPR MONITORu. Tato rutina bere jako vstup poslední čtyři zadané cifry ukončené znakem <CR> nebo <SP> . Program COPIER v obou případech vyžaduje jako vstup pouze dvě cifry. Zbylé dvě "levé" cifry musí být nulové, což je implicitně dáno při zadání čísla <100.

    Zjistíme-li při zadávání ještě před zmáčknutím < CR>, že jsme zadali špatnou cifru, je možno chybu opravit takto:

    Zadáme další čtyři cifry tak, aby poslední dvojice měla správnou hodnotu a obě "levé" cifry byly nulové. Potom teprve zadáme <CR>.

    Např. místo "3" bylo zadáno "4".

    Počet vstupních souborů = <40003><CR>"

    Služba EXPR umožňuje vstup pouze hexadecimálních cifer, tj. znaku 0 - 9, A - F. Zadáni jiného znaku způsobí chybu a okamžitý skok do monitoru! Náprava vzniklé situace je možná "teplým startem" programu na adrese 4403(HEX)

  3. Všechny ostatní vstupy jsou znakové a nevyžaduji potvrzení znakem <CR>. Zadáni špatného znaku v těchto případech je ošetřeno programem COPIER a nezpůsobí žádnou chybu.

Poznámka k příkladům:

V příkladech komunikace programu COPIER s obsluhou jsou odpovědi obsluhy (tedy vstupy programu) uzavřeny v "<,>". Ostatní uvedené texty COPIER vypisuje na obrazovce.



Schéma činnosti programu COPIER






OVLADAČ DÁLNOPISU T-100

"Ovladač dálnopisu T-100" je knihovna podprogramů, které umožňuji připojit dálnopis T-100 k systému SAPI-1 ZPS 2 jako "další" přídavné zařízeni.

Podprogramy knihovny je však možno s výhodou využit i pro připojeni dálnopisu T-100 jako "systémového" zařízeni, především jako "USER LO" - ve funkci tiskárny. I tato možnost zde bude ukázána.

V úvodu si ještě připomeňme skutečnost, že dálnopis T-100 používá pro výměnu informaci kód MTA-2, zatímco SAPI-1 kód ASCII. Je nezbytné zajistit převod znaku z kódu ASCII systému SAPI-1 na kód MTA-2 dálnopisu (před výstupem na dálnopis) a převod z kódu MTA-2 na kód ASCII (po vstupu z dálnopisu). Dálnopis T-100 se připojuje k systému SAPI-1 k desce DSM-1 přes dálnopisný konvertor DPK-1. Konvertor odbytuje TESLA ELTOS DIZ. Způsob jeho připojeni k SAPI-1 a možné varianty jsou popsány v příslušné technické dokumentaci.

Vlastní ovladač pro připojeni dálnopisu T-100 jako přídavného zařízení je knihovna podprogramů. Podprogramy umožňuji :

Knihovna je přeložena od adresy 7000H, Použitím jiného operandu v direktivě ORG ji lze přeložit a umístit na libovolné místo paměti (omezeno pouze rozsahem paměti RAM a umístěním případných jiných programů).

Knihovnu není nutné používat celou. Při použití jen některých podprogramů je však nutné dát pozor na jejich vzájemné volání!


Způsob použiti knihovny podprogramů:

  1. Knihovnu je možno přeložit samostatně a umístit na předem zvolené mís to do paměti. Zde je ji možno ochránit proti přepsáni (např. umístit na konec paměti a snížit MEMTOP - vrchol paměti). Volání jednotlivých podprogramů je pak nejlépe provádět přes tabulku skoku.

  2. Podprogramy knihovny lze zařadit přímo do uživatelského programu. Spojení lze provést například programem PEDIT a překlad je potom společný. V tomto případě je ale nutno překontrolovat, zda v uživatelském programu nejsou použita stejná návěsti jako v podprogramech knihovny!

Nyní popíšeme připojeni dálnopisu k systému SAPI-1 tak, jak je předpokládá ovladač. Samozřejmě toto připojeni není jediné a jsou i zde nabídnuty další možnosti.


Připojení dálnopisu:

Ovladač předpokládá připojeni dálnopisu na "první" desku DSM-1 systému SAPI-1 (tj. adresy 10-13(HEX)). V případě připojeni dálnopisu na další desku DSM-1 je nutné změnit adresy v tabulce portů!

Porty pro dálnopis maji stejnou adresu jako porty pro magnetofon. Z toho vyplývá, že dálnopis a magnetofon nemohou pracovat "současně" na jedné desce. . Po zapnuti systému (nebo po RESET) je automaticky připojen magnetofon. Dálnopis se připojuje (a magnetofon odpojuje) podprogramem AKTIV knihovny.

Opětovné připojeni magnetofonu se provede:

  1. RESET
  2. Nastavením řídicích slov:   URESna88H
    UMODE00H
    USTAT0DH

(V případě připojeni magnetofonu a dálnopisu na stejnou desku DSM-1. Přepínáni lze provádět pouze až po uzavřeni souboru, který vstupoval či vystupoval na/z magnetofon).

Pro správnou funkci vstupu z dálnopisu je třeba:

  1. Před prvním znakem vstupu vidy zadat odpovídající změnu.

  2. Jestliže následuje vstup z dálnopisu po výstupu na dálnopis, je třeba před vstupem vyvolat podprogram PID, který bude popsán později.

V následující části bude popsána stručně činnost jednotlivých podprogramů.


TRAN

Provádí převod znaku z kódu ASCII do kódu MTA2. Vstupní údaj je očekáván ve střadači. Výstup (kód MTA2) je opět ve střadači. Nepřeveditelný kód ASCII je na výstupu nahrazen znakem "?" . Pro převod používá tabulku "TABAM", nastavuje proměnnou "ZMENA", vyvolává podprogramy "NENI" a "PIŠ".


TRAN 1

Provádí převod z kódu MTA2 do kódu ASCII. Vstupní údaj (kód MTA2) je očekáván ve střadači. Výstupní údaj (kód ASCII) je dán opět do střadače. Nepřeveditelný kód, číslicová a písmenová změna dávají na výstup ASCII znak nul (00H).

Pro převod používá tabulku "TABAM", nastavuje proměnnou "ZMĚNA".


NENI

Ošetřuje vznik ohyby v podprogramu "TRAN" - nepřeveditelný kód ASCII. Na výstup podprogramu "TRAN" vnucuje znak "?" (v kódu MTA2). Vypisuje varovnou zprávu na obrazovku:

"Kód ASCII'XY' nelze převést do MTA2 !!"
"Místo něho je zobrazen "?"

Podprogram používá některé služby MONITORU.


PIS

Provede výstup jednoho znaku na dálnopis. Znak v kódu MTA2 je očekáván ve střadači.


CTI

Podprogram čte jeden znak z dálnopisu. Přečtený znak je v kódu MTA2 umístěn do střadače.


AKTIV

Provádí nastaveni a start dálnopisu:

Používá podprogram "PIS". Proměnnou "ZMENA" nastaví na nulu (písmenová změna).


PID

Je součástí podprogramu "AKTIV". Zajišťuje nastavení stavového registru pro vstup z dálnopisu po předcházejícím zápisu na dálnopis. Používá podprogram "PIS".


TTEXT

Provádí výstup řetězce znaku v kódu ASCII na dálnopis. Řetězec musí být ukončen kódem 0FF (HEX). Podprogram očekává v registrovém páru HL. adresu řetězce. Používá podprogram "PASC".


CRLF

Podprogram zajistí na dálnopisu přechod na nový řádek. Používá podprogram "TTEXT".


SPACE

Vytiskne jednu mezeru na dálnopis. Používá podprogram "TTEXT".


LTEXT

Provádí tisk řetězce znaku a přechod na nový řádek. Adresu řetězce očekává v registrovém páru HL a řetězec musí být ukončen kódem 0FF (HEX). Používá podprogramy "TTEXT" a "CRLF"


CASC

Podprogram čte jeden znak z dálnopisu a převede jej do kódu ASCII. Přečteni znaku NUL (ASCII po převodu) je ignorováno (čte se další znak). Znak vystupuje do střadače. Používá podprogramy "TRAN1" a "CTI".


PASC

Převede jeden ASCII znak do kódu MTA2 a vytiskne jej na dálnopis. Vstupní znak je očekáván ve střadači. Používá podprogramy "TRAN" a "PIS".


PHEX

Vytiskne hexadecimálně obsah střadače na dálnopis. Používá podprogram "PASC".



Možnost připojeni dálnopisu T-100 jako syst. zařízení

V úvodu popisu programu "ovladač dálnopisu T-100" jsme se zmínili o této možnosti připojeni dálnopisu, jeho přiřazeni systému.

Pro lepši názornost nejprve uvedeme strukturu povelu MONITORU A = ASSIGN DEVICE - přiřazeni periferii systému.

   Logická zařízeni systému SAPI-1:
C   -   CONSQLE (např. terminál a klávesnicí, teletype ...)
R-READER (čtení - např. snímač děrné pásky, kazetový magnetofon ...)
P-PUNCH (zápis - např. děrovač děrné pásky, kazetový magnetofon ...)
L-LIST (LISTING - tiskový protokol např. CONSUL 2111)


   Použité zkratky pro označeni fyzických zařízeni:
CRT-displej s klávesnicí
LPR-tiskárna
PTP-děrovač děrné pásky
PTR-snímač děrné pásky
USER1-   uživatelské zařízení
USER2   -uživatelské zařízení


Povel   Přiřazení fyzických zařízeni   Číslo služby pro IODEF
C=TCRT+LPR
C=CCRT
C=BBATCH(TN:PTR)
(OUT:LPR)
C=1USER(IN:1)0
(OUT: 1)1
R=TCRT
R=PPTR
R=1USER12
R=2USER23
P=TCRT
P=PPTP
P=1USER14
P=2USER25
L=TCRT+LPR
L=CCTR
L=LLPR
L=1USER16
console user status7
memtop8


Nastavení uživatelských, periferii se provádí pomoci rutiny IODEF. V registru <C> je číslo služby <0-8> , v reg. páru <DE> je adresa příslušné rutiny.

Vrátíme se nyní k našemu problému. Z popisu příkazu ASSIGN' je vidět, že by se dálnopis dal připojit teoreticky jako C, R, P, L. Zřejmě nejzajímavější je jeho připojení jako uživatelské periferie "LO" - ve funkci tiskárny. Naznačili jsme v úvodu, že je možno s výhodou pro realizaci tohoto připojeni použít knihovnu podprogramů. Jeden z možných způsobů provedení, kdy dálnopis bude pracovat jako tiskárna a bude reagovat v BASICu na příkazy pro tisk (# L), nyní ukážeme. Je ale třeba si uvědomit, že soubor znaků kódu MTA2 není totožný se souborem znaků kódu ASCII!

Ukážeme nejprve postup a potom popíšeme jednotlivé kroky.

.K-L
NAME
:BASIC<CR>             ; Natažení programu BASIC do adresy 4400H
PLAY DONE? <Y>
.A_L=1                 ; Přiřazení uživatelského zařízení systému
.K_L
NAME
:OVLADAC.ASM
PLAY DONE?<Y> 
.G=F9E0                ; Adresa programu ovladač.ASM
*BASIC-EX V4.0         ; Přihlášeni BASICu

Přihlásil se BASIC a můžeme provádět zadané operace.


Vrátíme se nyní k programu OVLADAČ.ASM, který je jádrem celého připojeni. Je nutné ho umístit do horní části paměti. Jeho součásti je nastaveni MEMTOP - horní hranice paměti. Za tuto hranici nemá BASIC přistup a nemůže ji využívat. V této části jsou uschovány podprogramy knihovny, které využijeme pro řízeni dálnopisu. Pro funkci dálnopisu jako tiskárny nám plně postačí tyto podprogramy: TRAN, NENI, PIS, AKTIV, PSC.

     Samotný OVLADAC.ASM potom může vypadat následovně:

Adresa        Instrukce

V PAM.        PROGR.
F9E0          LXI     D,F9FF
              MVI     C,8
              CALL    IODEF       ; nastaveni MEMTOP
              LXI     D,FA00
              MVI     C,6
              CALL    IODEF       ; ovladač pro dálnopis
              JMP     4400        ; skok do BASICu
FA00          CALL    AKTIV
              CALL    PASC
              RET
FA10          ; Podprogramy knihovny
              .
              .
              AKTIV
              TRAN
              PASC
              NENI
              PIS
              + definice proměnné ZMĚNA
              .
              .

V tomto případě se při každém tisku jednoho znaku vyvolává rovněž podprogram AKTIV. Vlastní tisk se tímto značně zpomaluje. Určité zrychlení můžeme dosáhnout snížením počtu psaní písmenových změn v podprogramu AKTIV (nejmenší počet pro správnou funkci je 3).

Nabízí se jiné, méně pohodlné řešení, které však urychlí ještě více tisk na dálnopis.

Posloupnost úvodních příkazů programu OVLADAČ.ASM bude stejná. Na adrese FA00 však bude tabulka skoků:

FA00          JMP     PASC
FA03          JMP     AKTIV
FA06          JMP     TRAN
FA09          JMP     PIS
FA0C          JMP     NENI
              .
              .
              Dále již opět stejné podprogramy knihovny
              .
              .

Rozdíl v obou zápisech je v tom, že aktivaci dálnopisu si musíme ošetřovat sami v programu v jazyku BASIC. Po aktivování je dálnopis připraven pro příjem znaku. Pokud se toto nestane, je ještě po dobu asi 1 minuty v provozu. Potom se automaticky vypíná. S příchodem znaku po uplynutí této doby by se sice sám aktivoval, ale znak by vystoupil ve změněné podobě - chybné. V programu v BASICu by bylo nutné na tento fakt pamatovat a vždy před tisky, s přihlédnutím na dobu mezi nimi (více než 1 minuta), provést aktivaci. K tomu lze využit instrukci pro spolupráci BASICu a ASSEMBLERU. Např. instrukci CALL. Využila by se tabulka skoků a jako adresa volného podprogramu by se dala FA03H (JMP AKTIV).

Příkaz by mohl vypadat:

       .
       .
       .
60 X=CALL(HEX(FA03))
70 PRINT L "TESLA ELTOS DIZ"
       .
       .

Poznámka:

Jak již bylo uvedeno, soubor znaků v kódu ASCII není totožný se souborem znaků v kódu MTA2. Zde popsaný ovladač tuto skutečnost řeší tak, že znaky, které při převodu z ASCII do MTA2 v tabulce kódu MTA2 nenašel, nahrazuje znakem "?" a vypisuje o tom zprávu na displej.

Upozorněni:

Výše uvedená pravidla pro připojeni dálnopisu jako systémové periferie, resp. jeho využiti jako tiskárny, platí pouze pro BASIC (příkazy PRINT#L a LLIST). Tento způsob nelze použít pro tisk v PEDITu (příkaz #P, ani pro tisk po zadáni ^A <SHIFT A> (HARAD COPY tiskárny). Je to dáno tim, že tyto příkazy se na tiskárnu neobracejí přes IOBYTE.



;       KNIHOVNA PODPROGRAMU PRO OVLADANI
;       DALNOPISU T-100

;       ========================================

        TITLE   OVLADAC DALNOPISU T-100

;       ========================================


        ORG     7000H

;       ----------------------------------------

;       TABULKA SKOKU

        JMP     TRAN    ;PREVOD ASCII/MTA2
        JMP     TRAN1   ;PREVOD MTA2/ASCII
        JMP     NENI    ;CHYBA PREVODU ASCII/MTA2
        JMP     PIS     ;TISK 1 ZNAKU
        JMP     CTI     ;CTENI 1 ZNAKU
        JMP     AKTIV   ;START DALNOPISU
        JMP     PID     ;AKTIV PRO CTENI PO ZAPISU
        JMP     TTEXT   ;TISK RETEZCE ZNAKU
        JMP     CRLF    ;CR,LF NA DALNOPIS
        JMP     SPACE   ;MEZERA
        JMP     LTEXT   ;TTEXT+CRLF
        JMP     CASC    ;CTI+TRAN1
        JMP     PASC    ;TRAN+PIS
        JMP     PHEX    ;BYTE NA DALNOPIS

;       ----------------------------------------

;       TABULKA PORTU

URES    EQU     13H     ;NULOVANI
UDATA   EQU     12H     ;DATA
USTAT   EQU     11H     ;STAVOVE SLOVO UARTU
UMODE   EQU     10H     ;STAVOVE SLOVO MODEMU

;       ----------------------------------------

        TITLE   PREVOD Z ASCII NA MTA2

TRAN:   PUSH    B       ;V/V UDAJ JE
        PUSH    H       ; VE STRADACI
        CPI     5EH     ;MAX. ASCII
        JNC     P17     ;A> =NELZE
        CPI     10H     ;UMIRA?
        JZ      P17
        MVI     C,64    ;POCITADLO V TABAM
        MVI     B,0     ;PRO KOD MTA2
        LXI     H,TABAM
P2:     CMP     M
        JZ      P1      ;"ASCII"=<TABAM>
        INX     H
        INR     B
        DCR     C
        JNZ     P2      ;HLEDEJ DAL
P17:    CALL    NENI    ;ASCII NELZE NA MTA2!!
P1:     MOV     A,B     ;A="MTA2"
        ANI     20H
        MOV     C,A     ;<C>=AKTUALNI ZMENA
        LDA     ZMENA   ;<A>=NASTAVENA ZMENA
        CMP     C       ;JEJICH POROVNANI
        JZ      P8      ;JSOU STEJNE
        MOV     A,C
        STA     ZMENA   ;NASTAVENI NOVE ZMENY
        CPI     0
        JZ      P5      ;PRO PISMENOVOU ZMENU
        MVI     A,1BH   ;CISLICOVA ZMENA
        JMP     P6
P5:     MVI     A,1FH   ;PISMENOVA ZMENA
P6:     CALL    PIS     ;NA DALNOPIS
P8:     MOV     A,B     ;A="MTA2",
        ANI     1FH     ;ALE JEN 5 BITU
        POP     H
        POP     B
        RET


        TITLE   PREVOD Z MTA2 DO ASCII

TRAN1:  PUSH    B       ;V/V UDAJ JE
        PUSH    H       ; VE STRADACI
        MVI     B,0     ;NEPREVEDITELNY ZNAK A
        LXI     H,TABAM ;ZMENA DAJI 00H (NUL)
        MOV     C,A
        CPI     1FH     ;PISMENOVA ZMENA?
        JZ      P10     ;ANO
        CPI     1BH     ;CISLICOVA ZMENA?
        JZ      P12     ;ANO
        CPI     0FFH    ;NEPREVEDITELNY KOD?
        JZ      P11     ;ANO
        LDA     ZMENA   ;PRO PREVOD ZNAKU
        ADD     C       ;MODIFIKACE DLE PLATNE ZMENY
        MOV     C,A
        DAD     B       ;ZISKANI ADRESY ASCII
        MOV     A,M     ;A="ASCII"
        JMP     P14
P10:    MVI     A,0     ;PRO PISMENOVOU ZMENU
        JMP     P13
P12:    MVI     A,20H   ;PRO CISLICOVOU ZMENU
P13:    STA     ZMENA
P11:    MVI     A,0     ;NUL NA VYSTUP
P14:    POP     H
        POP     B
        RET

ZMENA:  DS      1


        TITLE   CHYBA PREVODU ASCII NA MTA2

NENI:   PUSH    H
        PUSH    D
        PUSH    B
        MOV     E,A     ;NEPREVEDITELNY KOD
        LXI     H,TNENI
        MVI     D,10    ;VYPIS VAROVANI
        CALL    142H    ;NA TERMINAL
        MOV     A,E
        CALL    133H    ;KOD NA 'CO'
        CALL    13CH    ;MEZERA NA 'CO'
        MOV     C,E
        CALL    109H    ;ZNAK NA 'CO'
        MVI     D,25
        LXI     H,TN1
        CALL    142H
        CALL    124H
        LXI     H,TNENY
        MVI     D,26
        CALL    142H
        CALL    124H
        CALL    124H
        POP     B
        MVI     B,39H   ;VNUCENI "?"
        POP     D
        POP     H
        RET             ;NAVRAT DO TRAN"
TNENI:  DB      'KOD ASCII '
TN1:    DB      ' NELZE PREVEST DO MTA2 !!'
TNENY:  DB      'MISTO NEHO JE ZOBRAZEN "?"'


;PREVODNI TABULKA ASCII-MTA2 OBSAHUJE 64 PRVKU
;INDEXY PRVKU V TABULCE(PRVEK=ASCII ZNAK) ODPOVIDAJI KODU MTA2
;FFH...PRAZDNY NEBO NEODPOVIDAJICI ZNAK PRO ASCII
;A0H...CISLICOVA ZMENA, 80H...PISMENOVA ZMENA

TABAM:  DB 0FFH,'E',0AH,'A',20H,'S','I','U',0DH,'D'
TABA1:  DB 52H,'J','N','F','C','K','T','Z','L','W'
TABA2:  DB 48H,'Y','P','Q','O','B','G',0A0H,'M','X'
TABA3:  DB 56H,80H,0FFH,'3',0AH,'-',20H,27H,'8','7'
TABA4:  DB 0DH,'#','4','$',',','[',':','(','5','+'
TABA5:  DB 29H,'2',0FFH,'6','0','1','9','?',']',0A0H
TABA6:  DB 2EH,'/','=',80H


        TITLE   TISK 1 ZNAKU NA DALNOPISU

PIS:    PUSH    B       ;ZNAK JE VE STRADACI
        MOV     B,A
P3:     IN      USTAT   ;CTE STAVOVY REG.
        ANI     40H     ;JEHO TEST
        JZ      P3      ;JESTE NEPRIPRAVEN
        MOV     A,B
        OUT     UDATA   ;VYSTUP NA DALNOPIS
        POP     B
        RET


        TITLE   CTENI 1 ZNAKU Z DALNOPISU

CTI:    IN      USTAT   ;CTE STAVOVY REG.
        ANI     80H     ;JEHO TEST
        JZ      CTI     ;JESTE ZNAK NENI
        IN      UDATA   ;CTENI Z DALNOPISU
        RET             ;ZNAK JE VE STRADACI


        TITLE   AKTIVOVANI DALNOPISU

AKTIV:  PUSH    B
        MVI     A,3
        OUT     USTAT   ;ZRIDICI SLOVO UARTU
        MVI     A,0
        OUT     UMODE   ;RIDICI SLOVO MODEMU
        STA     ZMENA   ;=PISMENOVA ZMENA
        MVI     A,1FH
        MVI     B,6
P7:     CALL    PIS     ;A.. NA DALNOPIS
        DCR     B
        JNZ     P7
        POP     B
PID:    MVI     A,0     ;NUTNO PRO CTENI
        CALL    PIS     ;PO VYSTUPU
        CALL    PIS
        OUT     URES    ;NASTAVI STAVOVY REG.
        IN      UDATA   ;"PRVNI" CTENI
        RET


        TITLE   TISK RETEZCE ZNAKU NA DALNOPIS
;               PREDPOKLADA V HL ADRESU RETEZCE
;               UKONCENEHO 0FFH

TTEXT:  MOV     A,M     ;NATAZENI ZNAKU DO <A>
        CPI     0FFH    ;TEST KONCOVEHO ZNAKU
        JZ      P4
        CALL    PASC    ;PREVOD A TISK
        INX     H       ;DALSI ZNAK
        JMP     TTEXT
P4:     RET


        TITLE NOVY RADEK NEBO MEZERA NA DALNOPISU

CRLF:   PUSH    H
        LXI     H,TCRLF
        JMP     P9
SPACE:  PUSH    H
        LXI     H,TSPACE
P9:     CALL    TTEXT
        POP     H
        RET
TCRLF:  DB      0DH/0AH/0FFH
TSPACE: DB      20H/0FFH


        TITLE   TISK RETEZCE ZNAKU A NOVY RADEK

LTEXT:  CALL    TTEXT   ;V HL ADRESA RETEZCE
        CALL    CRLF    ;UKONCENEHO 0FFH
        RET


        TITLE   CTENI 1 ZNAKU A PREVOD DO ASCII,
;               ZNAK NUL IGNORUJE

CASC:   CALL    CTI     ;ZNAK JE PRECTEN DO <A>
        CALL    TRAN1
        CPI     0       ;PRECTEN NUL?
        JNZ     P16     ;HOTOVO
        JMP     CASC
P16:    RET


        TITLE   PREVOD 1 ZNAKU DO MTA2 A TISK

PASC:   CALL    TRAN    ;VSTUPNI UDAJ V <A>
        CALL    PIS
        RET


        TITLE   PREVOD 1 BYTU (HEX) NA 2 MTA2 A TISK

PHEX:   PUSH    B       ;VSTUPNI UDAJ V <A>
        MVI     B,2
        MOV     C,A
        RRC
        RRC
        RRC
        RRC
P15:    ANI     0FH     ;JEN PULBYTE
        PUSH    B
        CALL    148H    ;PREVOD NA ASCII
        POP     B
        CALL    PASC    ;PREVOD NA MAT2 A TISK
        MOV     A,C
        DCR     B
        JNZ     P15     ;NA DRUHY PULBYTE
        POP     B
        RET


;       ========================================

;       PRIKLAD VYSTUPU OBSAHU PAMETI NA DALNOPIS.
;       ADRESY SE ZADAVAJI Z KLAVESNICE.


        TITLE   ZKOUSKA VYSTUPU NA DALNOPIS

        ORG     7200H
ODLPS:  LXI     H,WUVOD
        MVI     D,33
        CALL    142H    ;TEXT NA 'CO'
        CALL    124H    ;NOVY RADEK
        MVI     C,2     ;POCET VSTUPU
        CALL    127H    ;VSTUP DO STAKU
        POP     D       ;KONC.ADRESA
        CALL    AKTIV
        CALL    CRLF
        CALL    CRLF
        LXI     H,DUMP
        CALL    TTEXT   ;NADPIS NA DLPS
        POP     H       ;START.ADRESA
        MOV     A,H
        CALL    PHEX
        MOV     A,L
        CALL    PHEX    ;VYSTUP START.ADRESY
        PUSH    H
        LXI     H,DUMP
        CALL    TTEXT   ;POKRACOVANI NADPISU
        MOV     A,D
        CALL    PHEX
        MOV     A,E
        CALL    PHEX    ;VYSTUP KONC.ADRESY
        CALL    CRLF
        CALL    CRLF
        POP     H       ;START.ADRESA
XX6:    PUSH    H
        MVI     B,8     ;POCITADLO NA RADKU
        MOV     A,H
        CALL    PHEX
        MOV     A,L
        CALL    PHEX    ;ADRESA VYPISU
        CALL    SPACE
        CALL    SPACE
XX2:    MOV     A,M
        CALL    PHEX    ;VYSTUP BYTU(HEX)
        CALL    SPACE
        CALL    136H    ;HILO
        JC      XX1     ;START.=KONC.
        DCR     B
        JNZ     XX2
XX1:    POP     H       ;OBNOVA HL
        MVI     B,8
XX5:    MOV     A,M
        CALL    PASC    ;VYSTUP BYTU(ZNAK)
        CALL    136H    ;HILO
        JC      XX4
        DCR     B
        JNZ     XX5
        CALL    CRLF
        JMP     XX6     ;NA DALSI RADEK
XX4:    CALL    139H    ;DO MONITORU

WUVOD:  DB      'ZADEJ POCATECNI A KONCOVOU ADRESU'
DUMP:   DB      'VYPIS PAMETI OD ADRESY '
WUV1:   DB      0FFH
DUMPl:  DB      ' PO ADRESU '
ZP1:    DB      0FFH


;       =========================================

;       PRIKLAD SOUCTU DVOU CISEL:
;       OBA SCITANCI MAJI VZDY DVE CIFRY,
;       SOUCET MUSI BYT MENSI NEZ 100.
;       VSTUP I VYSTUP JSOU NA DALNOPIS.

        TITLE   ZKOUSKA V/V NA DALNOPIS

        ORG     7300H   ;SOUCET DVOU CISEL
        CALL    AKTIV
        LXI     H,UVOD
        CALL    LTEXT   ;TISK NADPISU
        LXI     H,SC1
        CALL    TTEXT
        MVI     B,2     ;POCET SCITANCU
X2:     CALL    PID
        CALL    CASC    ;VSTUP 1.CIFRY
        ANI     0FH     ;1.PULBYTE NA BCD
        RRC
        RRC
        RRC
        RRC
        MOV     D,A
        CALL    CASC    ;VSTUP 2.CIFRY
        ANI     0FH     ;NA BCD
        ORA     D       ;CELY CSITANEC
        MOV     D,A
        DCR     B
        JZ      X1
        MOV     E,D
        CALL    CRLF
        LXI     H,SC2
        CALL    TTEXT
        JMP     X2
X1:     CALL    CRLF
        LXI     H,VYSL
        CALL    TTEXT
        MOV     A,D
        ADD     E
        DAA             ;KOREKCE NA BCD
        MOV     D,A
        JNC     X5      ;PRO SOUCET<100
        MVI     A,31H   ;"1" ASCII
        CALL    PASC    ;NA DALNOPIS
X5:     MVI     B,2     ;POCET CIFER
        MOV     A,D
        RRC
        RRC
        RRC
        RRC
X6:     ANI     0FH     ;JEN PULBYTE
        ORI     30H     ;NA ASCII
        CALL    PASC    ;NA DALNOPIS
        MOV     A,D
        DCR     B
        JNZ     X6      ;NA 2.PULBYTE
        CALL    CRLF
        CALL    139H    ;DO MONITORU

UVOD:   DB 'SOUCET DVOU CISEL MENSICH NEZ 100'
UV1:    DB 0FFH
SC1:    DB '1.SCITANEC:  '
SC11:   DB 0FFH
SC2:    DB '2.SCITANEC:  '
SC21:   DB 0FFH
VYSL:   DB 'SOUCET:      '
VY1:    DB 0FFH

        END




ARITMETIKA V POHYBLIVÉ ŘÁDOVÉ ČÁRCE

Aritmetika v pohyblivé čárce je knihovna podprogramů, které provádějí základní aritmetické operace a standardní funkce, včetně funkcí trigonometrických v pohyblivé řádové čárce. Nejde tedy o samostatně spustitelný program. Aritmetika je použitelná jako součást dalšího (nadřazeného) programu. Přitom je nutno definovaným způsobem nastavit vstupní hodnoty jednotlivých podprogramů aritmetiky, jak bude uvedeno dále.

Kromě jednotlivých podprogramů obsahuje i úvodní tabulku skoků, která usnadňuje práci s knihovnou. Celková délka programu je 2 kilobyty.


Formát čísla v pohyblivé řádové čárce

Čísla (proměnné) v pohyblivé řádové čárce jsou uložena na čtyřech bytech a maji tvar:

                         - znaménko mantisy
                          |
                          V
    I--------I--------I--------I--------I
    I...........mantisa........I..exp...I

     nižší                vyšší
                          bity

Na pozici 7. bitu nejvyššího bytu mantisy je uloženo její znaménko. Exponent je uložen v modifikovaném tvaru - MODULO 80H (80 hexadecimálně), tj. 0 jako 80H. Čísla menší než 0 mají exponent menší než 80H a naopak. Čísla mantisy mají tzv. "skrytý bit" - tj. vychází se z toho, že čísla jsou v rozsahu (0.5,1) a tudíž nejvyšší bit je vždy roven jedné. Tento nejvyšší bit potom vlastně není třeba v mantise uchovávat! Aritmetika s takto zobrazenými čísly (4 byte = jednoduchá přesnost) pracuje s přesností 6 platných dekadických číslic, sedmá číslice je již zaokrouhlována. Čísla mohou být v rozsahu:

1.70141E-38 až 1.70141E+38

Příklady zobrazení některých hodnot:

    00 00 00 81 =  1                      (EXP. = 2**1)
    00 00 00 80 =  0.5                    (EXP. = 2**0)
    00 00 80 81 = -1
    XX XX XX 00 =  0                      (obsah mantisy je
                                           nevýznamný)
    FF FF 7F FF =  1 .70141*10*38
    FF FF FF FF = -1 .70141*10*38

Operace prováděné aritmetikou

Pro vstup jednotlivých číslic, připravení operandů pro jednotlivé operace, pro uložení výsledku a jeho výstup má aritmetika v pohyblivé řádové čárce definována pracovní pole.


Pracovní pole a tvar operandu

FACC- střadač v délce 5 bytů:slouží pro vstup operandu i uložení výsledku operace
ASCBF   - vstupní pole, v němž je znakově (ASCII) uložena vstupní hodnota (operand)
VRBF- výstupní pole - do něho je znakově (ASCII) uložen výsledek
FCON- proměnná obsahující adresu konstanty; využívá se v případě, že se vyžaduje operace mezi střadačem a konstantou uloženou v parně ti
FMD- pracovní pole

Všechny operace a funkce, jež aritmetika provádí, předpokládají umístění vstupního operandu ve střadači FACC. Jestliže některá operace vyžaduje operandy dva, může být druhý operand určen následujícím způsobem:

  1. Druhým operandem je konstanta, jejíž adresa je předpokládána v proměnné FCON.
  2. Adresa druhého operandu je uložena v REG. páru HL.
  3. Druhý operand je uložen v zásobníku. Je tedy adresován obsahem ukazatele na vrchol zásobníku SP.
  4. Druhý operand je uložen přímo v registrech B, C, D, E.

Všechny operandy musí být ve formátu pohyblivé řádové čárky. Způsob uložení operandu:

ad a), b)    (FCON), (HL)       +0     +1     +2     +3
ad c)                         SP+2   SP+3   SP     SP+1
ad d)                           E      D      C      B
                             I-----I------I------I------I
                             I.....MANTISA........ EXP. I
                             nižší........vyšší

Takto umístěné a zapsané operandy předpokládají jednotlivé výkonné podprogramy, které provádějí požadované operace. Aritmetika ovšem umožňuje zápis jednotlivých operandů znakově a stejným způsobem může vystupovat i výsledek. Rozsah takto zadaných hodnot je omezen rozsahem aritmetiky, který byl uveden výše.


Aritmetické operace

Tyto operace vyžadují dva operandy. Jeden je uložen ve střadači, (FACC) , druhý může být určen libovolným ze čtyř uvedených způsobů.

Porovnává obsah střadače (FACC) s operandem určeným adresou v reg. páru HL nebo přímo uloženým v registrech B, C, D, E.

Porovnání obsahu střadače s nulou.


Trigonometrické funkce

Všechny trigonometrické funkce pracují s jediným operandem, který je předpokládán ve střadači (FACC).

Operand může být vyjádřen ve stupních nebo v radiánech.

Operand pouze v radiánech.


Standardní funkce

Všechny výše uvedené funkce pracuji s jediným operandem umístěným ve střadači (FACC).

Druhý operand je umístěn v registrech B, C, D, E.


Popis jednotlivých podprogramů

Použité označeni:
 
FACC- střadač aritmetiky
(FCON)   - konstanta určená adresou v proměnné FCON
(HL)- operand v paměti určený adresou v reg. páru HL
(SP)- operand uložený v zásobníku
BCDE- registry B, C, D, E obsahující operand

Výsledek všech operací (mimo porovnáni) se ukládá do střadače (FACC). U jednotlivých podprogramů je popsána jejich funkce, vstupy a výstupy, nikoliv algoritmus výpočtu.

Způsob uložení operandu pro daný podprogram vyplývá z jeho popisu.

Tvar popisu

      NÁZEV           stručný popis funkce
PODPROGRAMU ......... a uloženi operandu i výsledku

V názvu programu znamená:

1. písmeno:F- podprogram aritmetiky
M- pomocný podprogram (přesuny)
 
A) U podprogramů aritmetických operací:
 
2. písmeno:A- sečítání
S- odčítání
M- násobení
D- dělení
C- porovnávání
 
3. písmeno:C- druhý operand je konstanta
X, M- druhý operand je určen adresou v reg. páru HL
S- druhý operand je uložen v zásobníku
R- druhý operand je v registrech B, C, D, E
 
4. písmeno:   A- výsledek uložen do střadače (FACC)
 
B) u pomocných podprogramů přesunu:
 
2. písmeno:A- zdroj je střadač (FACC)
S- zdroj je zásobník
X- zdroj je paměť adresována obsahem reg. páru HL
R- jsou registry B, D, D, E
 
3. písmeno:A- cíl je střadač
S- cíl je zásobník
X- cil je paměť adresována obsahem reg. páru HL
R- cil jsou registry B, C, D, E
E- jde o záměnu obsahu (podprogramy MAER a MXER)
 
C) U ostatních podprogramů je zbytek názvu tvořen zkratkou funkce, jíž provádějí.



  1. Aritmetické operace
  2. SEČÍTÁNÍ

    K obsahu střadače se přičte obsah druhého operandu

         FACA....................FACC = (FCON) + FACC
         FAXA....................FACC = (HL)+ FACC
         FASA....................FACC = (SP) + FACC
         FARA....................FACC = BCDE + FACC
    

    ODEČÍTANÍ

    Od operandu odečte obsah střadače a výsledek uloží do střadače

        FSCA....................FACC = (FCON) - FACC
        FSXA....................FACC = (HL) - FACC
        FSSA....................FACC = (SP) - FACC
        FSRA....................FACC = BCDE - FACC
    

    NÁSOBENÍ

    Obsah střadače se vynásobí obsahem druhého operandu

        FMCA....................FACC = (FCON) * FACC
        FMXA....................FACC = (HL) * FACC
        FMSA....................FACC = (SP) * FACC
        FMRA....................FACC = BCDE * FACC
    

    DĚLENÍ

    Zadaný operand se vydělí obsahem střadače a výsledek se. uloží do střadače

        FDCA....................FACC = (FCON) / FACC
        FDXA....................FACC = (HL) / FACC
        FDSA....................FACC = (SP) / FACC
        FDRA....................FACC = BCDE / FACC
    

    POROVNÁNÍ

    Porovnává obsah střadače se zadaným operandem. Výsledkem operace je nastaveni příznaku a obsahu střadače mikroprocesoru (!), tedy stavového slova programu (PSW). Obsah střadače aritmetiky (FACC) a operandu se nemění.

        FCM .......... FACC ? (HL)
        FCR .......... FACC ? BCDE
    

    Tyto podprogramy nastavují PSW takto:

                                      S
                                    Z C P
         FACC<X   PSW = 0102        0 0 0
         FACC=X   PSV = 0056        1 0 1
         FACC>X   PSV = FF87        0 1 1
         Kde X je (HL) nebo BCDE.
         FSAF .......... FACC ? 0
    

    Tento podprogram porovnává obsah střadače (FACC) s nulou a pr,o opačnou relaci nastavuje stejně

    Hodnoty PSW

                                      S
                                    Z C P
         FACC<X   PSW = 0102        0 0 0
         FACC=X   PSV = 0056        1 0 1
         FACC>X   PSV = FF87        0 1 1
    

    V případě použiti aritmetiky na počítačích a mikroprocesorem ZILOG je porovnáním nastavena hodnota PSW takto:

         FACC<X   PSW = 0100
         FACC=X   PSW = 0042
         FACC>X   PSW = FFBF
    

  3. Trigonometrické funkce
  4. Aritmetika umožňuje výpočet funkcí SINUS, COSINUS, TANGENS a ARCUS TANGENS. Parametr funkce může být ve stupních nebo v radiánech (mimo funkce ARCUS TANGENS, která má parametr pouze v radiánech) a je předpokládán ve střadači (FACC).

         FSID.......... FACC = SIN(FACC) parametr v DEG.
         FSIN.......... FACC = SIN(FACC)            RAD.
         PCOD.......... FACC = COS(FACC)            DEG.
         FCOS.......... FACC = COS(FACC)            RAD.
         FTAD.......... FACC = TG(FACC)             DEG.
         FTAN.......... FACC = TG(FACC)             RAD.
         FATN.......... FACC = ARCTC(FACC)          RAD.
    

  5. Standardní funkce
  6. Výpočet obecné mocniny - obsah střadače je umocněn hodnotou v registrech B, C, D, E.

         FPXY.......... FACC = FACC**BCDE
    

    Výpočet přirozeného logaritmu (FACC>0):

         FLN.......... FACC = LN(FACC)
    

    Výpočet desítkového logaritmu (FACC>0):

         FLOG.......... FACC = LOG(FACC)
    

    Výpočet odmocniny (FACC>0):

         FSQR.......... FACC = SQR(FACC)
    

    Výpočet exponenciální funkce, tj. E umocněno obsahem střadače:

         FEXP.......... FACC = E**FACC
    

    Nastavení hodnoty dle znaménka střadače:

         FSGN.......... FACC = -1 pro FACC < 0
                        FACC =  0     FACC =0
                        FACC =  1     FACC > 0
    

    Celočíselná část čísla (oříznutí desetinných míst):

         FINT.......... FACC = celá část (FACC)
    

    Výpočet absolutní hodnoty:

         FABS.......... FACC =  FACC pro FACC>= 0
                        FACC = -FACC     FACC < 0
    

    Negace obsahu střadače (změna znaménka):

         FNEG.......... FACC = - FACC
    

  7. Podprogramy vstupu a výstupu
  8. VSTUP

    Znakový obsah vstupního pole ASCBF převede do formátu v pohyblivé řádové čárce a hodnotu uloží do střadače (FACC).

         FRD.......... FACC = FLOAT(ASCBF)
    

    Pole ASCBF má délku 14 bytů. Znakový řetězec vstupního údaje může být tvořen číslicemi a znaky " . ", " + ", "-" a "E". Mezery se mohou zadávat, ale při převodu jsou ignorovány. Pouze "zabírají" místo ve vstupním poli a je tedy nevhodné je zadávat. Délka znakového řetězce může být 13 bytů, 14. byte je určen pro ukončovací znak. Obecně může být ukončovacím znakem libovolný znak mimo číslic a znaku "." (tečka) a "E". Pro zadání čísla v rozsahu aritmetiky stačí 12 znaků, jako ukončovací znaky je potom vhodné použit znaků "CR" a "LF" (ASCII kódy 0DH a 0AH).

    Číslo může být v poli ASCBF zobrazeno buď. "přímo", nebo v exponenciálním tvaru.

    Příklad:

            35.23
         - 145
             0.65         nula není povinná, možno i: .65
             2.765E3
         - 35E-27
             -.56E12
             -1,23456E-12 tvar zápisu postihující max. přesnost
                          (6 číslic) i rozsah aritmetiky; délka
                          zápisu je 12 znaků
    

    Znaménko "+" se zadávat nemusí.


    VÝSTUP

    Obsah střadače (FACC) v pohyblivé řádové čárce se převede do znakového (ASCII) tvaru a uloží se do výstupního pole WRBF.

         FWR.......... WRBF = ASCII (FACC)
    

    Výstupní pole WRBF má délku 14 bytů. Čísla v rozsahu 0.1 až 999 999 se zobrazují přímo. Mimo tento rozsah se zobrazují v exponenciálním tvaru. Znakový řetězec je v poli VRBF ukončen znakem NUL (ASCII kód 00H). Znaménko exponentu se zobrazuje (plní) vždy, tedy i znaménko "+". U mantisy nebo čísla v přímém tvaru se zobrazuje znaménko "-", místo "+" se do výstupního pole plní mezera (ASCII kód 20H)

    Příklad:

        Číslo Obsah pole WRBF ( hexadecimálně )
    
        235.41        20, 32, 33, 35, 2E, 34, 31, 00, ...
          -.76        2D, 2E, 37, 36, 00, ...
          3.83E+08    20, 33, 2E, 38, 33, 45, 2B, 30, 38, 00, ...
         -1.9E-12     2D, 31, 2E, 39, 45, 2D, 31, 32, 00, ...
    

  9. Podprogramy přesunu
  10. Přesun obsahu střadače (FACC) do zásobníku:

         MAS.......... (SP) = FACC
    

    Přesun obsahu střadače (FACC) do registru B, C, D, E:

         MAR.......... BCDE = FACC
    

    Přesun obsahu střadače do paměti na adresu určenou obsahem reg. páru HL:

         MAX.......... (HL) = FACC
    

    Přesun operandu ze zásobníku do střadače (FACC):

         MSA.......... FACC = (SP)
    

    Přesun operandu v paměti z adresy, určené obsahem REG. páru DE na adresu určenou obsahem reg. páru HL:

         MXX.......... (HL) = (DE)
    

    Přesun operandu z paměti z adresy určené obsahem reg. páru HL do střadače (FACC) a do registru B, C, D, E:

         MXA.......... FACC = (HL)
                       BCDE = (HL)
    

    Přesun operandu z paměti z adresy určené obsahem reg. páru HL do střadače (FACC):

         MXA1 ......... FACC = (HL)
    

    Přesun obsahu registrů B, C, D, E do střadače (FACC):

         MRA.......... FACC = BCDE
    

    Přesun operandu z paměti g adresy určené obsahem reg. páru HL do registrů B, C, D, E:

         MXR.......... BCDE = (HL)
    

    Záměna obsahu střadače (FACC) a registrů B, C, D, E:

         MAER......... FACC <=> BCDE
    

    Záměna obsahu paměti na adrese určené obsahem reg, páru HL a registrů B, C, D, E:

         MXER......... (HL) <=> BCDE
    


Aplikace aritmetiky

Jak bylo uvedeno, aritmetika v pohyblivé řádové čárce je knihovna podprogramů, které umožňují provádět jednotlivé aritmetické operace a funkce, přičemž jsou přesně definovány jednotlivé vstupy i výstupy. Ty mohou být buď znakové, nebo ve formátu pohyblivé řádové čárky. Protože převod z "normálního" tvaru čísla do formátu pohyblivé řádové čárky je dosti obtížný, je vstup ve znakové podobě výhodnější. Převod ze znakové formy do formátu pohyblivé čárky a zpět je zajištěn podprogramy knihovny.

Dodaná zdrojová forma aritmetiky předpokládá její umístění (po překladu) od adresy 7000H. pracovní oblast pak od adresa 7800H. Tyto adresy jsou definovány v úvodu aritmetiky:

Systém ADDRESS:

     RAM     EQU     7800H
     EPROM   EQU     7000H
     MONIT   EQU     139H

Změnou hodnot 7000H a 7800H je možno aritmetiku přemístit na libovolné místo v paměti. Vynecháním definice začátku programu "EPROM EQU ..." a následně direktivy "ORG EPROM" lze aritmetiku začlenit do jiného programu jako jeho součást. Definici prostoru pro pracovní pole aritmetiky "RAM EQU ..." je potom nutno uzpůsobit příslušnému rozdělení paměti.

Poznámka:

Pracovní oblast aritmetiky obsahující jednotlivá pole a proměnil je určena pomocí proměnné "RAM" a musí ležet v prostoru fyzické paměti typu RAM. Uložení vlastní aritmetiky v paměti je dáno obsahem proměnné "EPROM". Aritmetika může přitom být fyzicky uložena jak v paměti typu "EPROM", tak i typu "RAM".


Ošetřeni operandu a výsledku

Překročeni povoleného rozsahu operandu při jejich vstupu ze znakového pole ASCBF a přetečeni výsledku v jednotlivých operacích je aritmetikou kontrolováno. Program však nevypisuje žádnou zprávu a při přetečeni výsledku nebo překročeni rozsahu operandu pouze ukončí svoji činnost a předá řízení monitoru. To je dáno deklarací:

     MONIT      EQU     139H

V konkrétní aplikaci matematiky lze již určit, jak ošetřit vznik přetečení. Má-li např. podprogram, který ošetřuje přetečeni, název "OVER", bude příslušná direktiva v aritmetice vypadat takto:

     MONIT      EQU     OVER

Ještě je třeba upozornit, že řízení (pod)programu, který ošetřuje přetečeni, se předává skokovou instrukcí, nikoliv instrukcí voláni podprogramu. Adresa návratu se tedy neuchovává.


Překlad aritmetiky

Aritmetika se dodává nahraná na pásce ve zdrojovém tvaru, tedy textový tvar programu v assembleru. Pro vlastni používáni je nutno ji přeložit.

Před překladem je nutno si ujasnit způsob používáni aritmetiky a především její uloženi v paměti, případné vazby na další (nadřízený) program. Ve zdrojovém tvaru aritmetiky je v části "SYSTEM ADRESS" nutno opravit proměnné "RAM", "EPROM" a "MONIT" na hodnoty, které odpovídají požadovanému použití aritmetiky. Potom je možno provést překlad.

Opravy zdrojového tvaru aritmetiky se provedou programem "PEDIT". Překlad se provede překladačem ASSEMBLERU v programu "TOOL". Vzhledem k délce aritmetiky do 2 kilobytů je možno provést překlad z paměti, tedy "MODE X". Přeložená aritmetika je však uložena od adresy 7000H. Aby byla spustitelná, je nutno ji příkazem "M" v TOOLu nebo MONITORu přemístit na správné místo (na adresu, kam byla překládána podle direktivy "EPROM EQU ...").


Tabulka skoků

Pro jednodušší práci s jednotlivými podprogramy knihovny obsahuje aritmetika tabulku skoků. V této tabulce jsou jednotlivé podprogramy seřazeny za sebou a jejich volání je přehlednější. Z důvodů omezení rozsahu aritmetiky pod 2 kilobyty neobsahuje tabulka skoků adresy úplně všech podprogramů - jsou vynechány některé podprogramy přesunu. Pokud by chtěl uživatel použít i tyto podprogramy, jsou jejich adresy uvedeny za tabulkou skoků.

Přírůstek     Podprogram      Adresa (pro EPROM EQU 7000H)
-----------------------------------------------------------

   + 0H          FACA                  7000H
   + 3           FAXA                  7003
   + 6           FASA                  7006
   + 9           FARA                  7009
   + C           FSCA                  700C
   + F           FSXA                  700F
   +12           FSSA                  7012
   +15           FSRA                  7015
   +18           FMCA                  7018
   +1B           FMXA                  701B
   +1E           FMSA                  701E
   +21           FMRA                  7021
   +24           FDCA                  7024
   +27           FDXA                  7027
   +2A           FDSA                  702A
   +2D           FDRA                  702B
   +30           FSID                  7030
   +33           FSIN                  7033
   +36           FCOD                  7036
   +39           FCOS                  7039
   +3C           FTAD                  703C
   +3F           FTAN                  703F
   +42           FATN                  7042
   +45           FPXY                  7045
   +48           FLN                   7048
   +4B           FLOG                  704B
   +4E           FSQR                  704E
   +51           FEXP                  7051
   +54           FINT                  7054
   +57           FSGN                  7057
   +5A           FABS                  705A
   +5D           FNEG                  705D
   +60           FCM                   7060
   +63           FCR                   7063
   +66           FSAF                  7066
   +69           FRD                   7069
   +6C           FWR                   706C
   +6F           MAS                   706F
   +72           MAR                   7072
   +75           MAX                   7075
 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
   +5E8          MSA                   75E8
   +5F5          MXX                   75F5
   +606          MXA                   7606
   +609          MRA                   7609
   +617          MXR                   7617
   +635          MXA1                  7635
   +64A          MAER                  764A
   +64D          MXER                  764D

Při používání této tabulky pro volání podprogramů aritmetiky se hodnota přírůstku připočte k adrese definované direktivou " EPROM EQU ...".

Upozornění:

Kromě podprogramů, které očekávají 2. operand v zásobníku (podprogramy FASA, FSSA, FMSA, FDSA), jsou všechny ostatní podprogramy volány instrukcí CALL. Pro uvedené 4 podprogramy platí následující:


Adresy pracovních polí

                                      Délka pole

FCON             + 0                   2 byty
FACC             + 2                   5 bytů
VRBF             + 7                  14 bytů
ASCBF            +21 (+15H)           14 bytů
FMD              +35 (+23H)            4 byty

Adresy poli získáme připočtením přírůstku k adrese uvedené v direktivě "RAM EQU ...". Uvedené adresy slouží například pro orientační kontrolu obsahu jednotlivých poli jejich prohlížením v paměti.


Přiklad použiti aritmetiky

Zde uvedené příklady provádějí součin dvou čísel ve formátu pohyblivé řádové čárky. Jsou demonstrovány všechny možnosti uložení 1. operandu (2. operand je vždy předpokládán ve střadači (FACC)). Jednotlivé příklady se tedy liší pouze ulož ním operandu a vyvoláním různého výkonného podprogramu pro násobení. Operandy vstupují ve znakové formě a stejným způsobem vystupuje i výsledek. Pro tento příklad byla aritmetika přelo žena od adresy 8000H. Pracovní prostor byl určen od adresy 8900H a přetečení je avizováno varovným textem "CHYBA - PŘETEČENÍ". Příslušný program je uložen od adresy 7200H. Definice systémových adres tedy vypadá takto:

             SYSTEM  ADRESS

     RAM     EQU     890CH
     EPROM   EQU     8000H
     MONIT   EQU     7200H

Dále je nutno nějakým způsobem naplnit vstupní pole a zobrazit výsledek. V uvedených příkladech se operandy zadávají (a do vstupního pole ASCBF plní) z klávesnice. Obstará to pod program QFRD, který navíc ještě za zadaný operand doplní koncové znaky CR a LF (ASCII kódy 0DH a 0AH). Vstup se ukončuje znakem <SP> nebo končí automaticky po zadání 12. znaku (včetně mezer, ty jsou však zbytečné - převodní podprogram FRD je ignoruje).

Výsledek operace je z výstupního znakového pole WRBF vypsán na displej pomocí podprogramu SFWR, který z výstupního pole zobrazuje ASCII znaky až po koncový znak NUL (kód 00H).

Postup vlastního výpočtu je ve všech příkladech v principu stejný a vyžaduje:

Volání výkonných podprogramů násobení se provádí přes tabulku skoků. Obdobným způsobem jsou určeny i adresy obou znakových polí.

Uvedený příklad je čistě demonstrační a nepostihuje zcela přesně aplikační možnosti aritmetiky, především z hlediska volby požadované operace. Příklad byl přeložen samostatně, aritmetika byla nahrána do paměti již přeložená.


Ukázka spuštěni přikladu, vstupu a výstupu

(načteni příkladu a aritmetiky do paměti)

.G=7000 <CR>                        FACC=(FCON) * FACC
76* 1.1E0 = 83.6
.G=7040 <CR>                        FACC=(HL) * FACC
2.45E-3*57 =  .13965
.G=7080 <CR>                        FACC=(SP) * FACC
-24.5E12*   3.2E-2 = -7.84E+11
.G=70C0 <CR>                        FACC=BCDE * FACC
76.5*0 = 0
.G=7000 <CR>
23.65E37   CHYBA –PŘETEČENÍ         Překročeni rozsahu operandu
.G=7000 <CR>
47.65E30* 2.2E6 CHYBA - PŘETEČENÍ   Překročeni rozsahu aritmetiky,
                                    tj. přetečeni výsledku


Přehled podprogramů aritmetiky v pohyblivé ř. č.

  1. Aritmetické operace
  2. I-------------------------------------------------------------I
    I OPERAND               KONST.   (HL)    (SP)      B, C, D, E I
    I-------------------------------------------------------------I
    I SEČÍTÁNÍ      FA..    FACA     FAXA    FASA         FARA    I
    I ODČÍTÁNÍ      FS..    FSCA     FSXA    FSSA         FSRA    I
    I NÁSOBENÍ      FM..    FMCA     FMXA    FMSA         FMRA    I
    I DĚLENÍ        FD..    FDCA     FDXA    FDSA         FDRA    I
    I POROVNÁNÍ     FC.              FCM                  FCR     I
    I POROVNÁNÍ S 0 FSAF                                          I
    I-------------------------------------------------------------I
    
    Pro všechny operace platí:
    
         FACC = operand operace <FACC>
    


  3. Trigonometrické funkce
  4. I-------------------------------------------------------------I
    I OPERAND V         DEG.    RAD.                              I
    I-------------------------------------------------------------I
    I SINUS             FSID    FSIN      Vstup všech funkcí je   I
    I COSINUS           FCOD    FCOS      předpokládán ve střada- I
    I TANGENS           FTAD    FTAN      či (FACC); výsledek je  I
    I ARCUS TANGENS             FATN      také ve střadači (FACC) I
    I-------------------------------------------------------------I
    


  5. Standardní funkce
  6. I-------------------------------------------------------------I
    I MOCNINA                      FPXY   FACC = FACC**BCDE       I
    I LOGARITMUS                   FLN    FACC = LN(FACC)         I
    I DESÍTKOVÝ LOGARITMUS         FLOG   FACC = LOG(FACC)        I
    I ODMOCNINA                    FSQR   FACC = SQR(FACC)        I
    I EXPONENCIÁLNÍ FUNKCE         FEXP   FACC = E**FACC          I
    I CELÁ ČÁST                    FINT   FACC = INT(FACC)        I
    I ZNAMÉNKO                     FSGN   FACC = SGN(FACC)        I
    I ABSOLUTNÍ HODNOTA            FABS   FACC = ABS(FACC)        I
    I NEGACE                       FNEG   FACC = -FACC            I
    I-------------------------------------------------------------I
    
    Operand i výsledek jsou ve střadači (FACC)
    


  7. Podprogramy přesunu
  8. I-------------------------------------------------------------I
    I Znakový obsah pole ASCBF převede                            I
    I do střadače (FACC)                    FRD  FACC=FLOAT(ASCBF)I
    I Obsah střadače (FACC) převede do                            I
    I ASCII a uloží do pole WRBF            FWR  WRBF=ASCII(FACC) I
    I Obsah střadače (FACC) do zásobníku    MAS  (SP)FACC         I
    I Obsah střadače (FACC) do reg.B,C,D,E  MAR  BCDE=FACC        I
    I Obsah střadače do paměti dle HL       MAX  (HL)=FACC        I
    I Operand ze zásobníku do střadače                            I
    I (FACC)                                MSA  FACC=(SP)        I
    I Operand dle DE do paměti dle HL       MXX  (HL)=(DE)        I
    I Operand z paměti dle HL do střadače                         I
    I (FACC)                                MXA1 FACC=(HL)        I
    I Operand z paměti dle HL do střadače   MXA  FACC=(HL)        I
    I (FACC) a registru B,C,D,E                  BCDE=(HL)        I
    I Obsah registrů B,C,D,E do střadače                          I
    I (FACC)                                MRA  FACC=BCDE        I
    I Operand z paměti dle HL do registrů                         I
    I B,C,D,E                               MXR  BCDE=(HL)        I
    I Záměna střadače (FACC) a registru                           I
    I B,C,D,E                               MAER FACC <=> BCDE    I
    I Záměna obsahu paměti dle HL a re-                           I
    I gistrů B, C, D, E                     MXER (HL) <=> BCDE    I
    I-------------------------------------------------------------I
    





























        TITLE   PRIKLAD POUZITI PODPROGRAMU KNIHOVNY
;               PRO NASOBENI.


;  A)           SOUCIN
;               FACC=(FCON)*FACC

        ORG     7000H

        CALL    QFRD    ;1.OPERAND
        LXI     H,ASCBF ;PREVOD DO FACC
        CALL    FRD
        LXI     H,8950H
        SHLD    FCON
        CALL    MAX     ;OPERAND DO "KONSTANTY"
        MVI     C,'*'
        CALL    CO
        CALL    SPACE
        CALL    QFRD    ;2.OPERAND
        LXI     H,ASCBF
        CALL    FRD     ;DO FACC
        CALL    FMCA    ;FACC=(FCON)*FACC
        CALL    FWR     ;PREVOD Z FACC
        CALL    QFWR
        CALL    NEXT


;  B)           SOUCIN
;               FACC=(HL)*FACC

        ORG     7040H

        CALL    QFRD    ;1.OPERAND
        LXI     H,ASCBF ;PREVOD DO FACC
        CALL    FRD
        LXI     H,8950H
        PUSH    H
        CALL    MAX     ;OPERAND DO (HL)
        MVI     C,'*'
        CALL    CO
        CALL    SPACE
        CALL    QFRD    ;2.OPERAND
        LXI     H,ASCBF
        CALL    FRD     ;DO FACC
        POP     H
        CALL    FMXA    ;FACC*(HL)*FACC
        CALL    FWR     ;PREVOD Z FACC
        CALL    QFWR
        CALL    NEXT


;  C)           SOUCIN
;               FACC=(SP)*FACC

        ORG     7080H

        CALL    QFRD    ;1.OPERAND
        LXI     H,ASCBF ;PREVOD DO FACC
        CALL    FRD
        LXI     H,QFMSA ;NAVRATOVA ADRESA PRO
        PUSH    H       ;PODPR. FMSA
        CALL    MAR
        PUSH    D
        PUSH    B       ;OPERAND DO (SP)
        MVI     C,'*'
        CALL    CO
        CALL    SPACE
        CALL    QFRD    ;2.OPERAND
        LXI     H,ASCBF
        CALL    FRD     ;DO FACC
        JMP     FMSA    ;FACC=(SP)*FACC
QFMSA:  CALL    FWR     ;PREVOD Z FACC
        CALL    QFWR
        CALL    NEXT


;  D)           SOUCIN"
;               FACC=BCDE*FACC"

        ORG     70C0H
        CALL    QFRD    ;1.OPERAND
        LXI     H,ASCBF ;PREVOD DO FACC
        CALL    FRD
        CALL    MAR     ;OPERAND DO BCDE
        PUSH    B
        PUSH    D
        MVI     C,'*'
        CALL    CO
        CALL    SPACE
        CALL    QFRD    ;2.OPERAND
        LXI     H,ASCBF
        CALL    FRD     ;DO FACC
        POP     D
        POP     B       ;OBNOVA 1.OPERANDU
        CALL    FMRA    ;FACC=BCDE*FACC
        CALL    FWR     ;PREVOD Z FACC
        CALL    QFWR
        CALL    NEXT


;------------------------


        ORG     7100H

QFRD:   LXI     H,ASCBF ;NAPLN VSTUPNI BUFFER
        MVI     B,12
Q1:     CALL    CINCR
        JZ      Q2
        MOV     M,A
        INX     H
        DCR     B
        JNZ     Q1
Q2:     MVI     M,0DH   ;KONCOVE ZNAKY
        INX     H
        MVI     M,0AH
        RET


QFWR:   MVI     C,'='
        CALL    CO
        CALL    SPACE
        LXI     H,WRBF
        MVI     D,14    ;TISK VYST. BUFFRU
Q3:     MOV     A,M
        CPI     0
        RZ
        MOV     C,A
        CALL    CO
        INX     H
        DCR     D
        JNZ     Q3
        RET


        ORG     7200H

OVER:   MVI     D,17
        LXI     H,ERR
        CALL    TEXT
        CALL    NEXT

ERR:    DB      'CHYBA - PRETECENI'

FCON    EQU     8900H
WRBF    EQU     8907H
ASCBF   EQU     8915H

FMCA    EQU     8018H
FMXA    EQU     801BH
FMSA    EQU     801EH
FMRA    EQU     8021H
FRD     EQU     8069H
FWR     EQU     806CH
MAR     EQU     8072H
MAX     EQU     8075H

CO      EQU     109H
NEXT    EQU     139H
SPACE   EQU     13CH
CINCR   EQU     13FH
TEXT    EQU     142H

        END


























;KNIHOVNA PROGRAMU V PEVNE RADOVE CARCE

;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
TITLE   'ARITHMETICS FOR CONTROL    V1.0'
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%


        ORG     7000H

        JMP     PRIK1   ;PRIKLAD POUZITI KNIHOVNY
        JMP     PRIK2   ;PRIKLAD POUZITI KNIHOVNY
        JMP     PLUS    ;PLUS
        JMP     DSUB    ;MINUS
        JMP     MUL     ;MULTIPLY
        JMP     DIV     ;DIVIDE
        JMP     PROC    ;%
        JMP     COMP    ;COMPLEMENT
        JMP     EQUAL   ;COMPARE
;
;
;#################################
;
;
;  DECIMAL <A>,<HL>   TO  BINAR <HL>
;*************************************************
;       IN: <A>..HIGH <HL>..DEC
;       OUT: <HL>..BIN
;       DES: <PSW>

DEBIN:  PUSH    B
        PUSH    D
        LXI     D,0     ; DE-BINAR
        MVI     C,5     ; COUNTER
        ANI     07H
        JMP     DEBN2
DEBN1:  XRA     A
        DAD     H       ; NIBBLE->A
        RAL
        DAD     H
        RAL
        DAD     H
        RAL
        DAD     H
        RAL
DEBN2:  XCHG            ; DE...DEC
        PUSH    D       ; HL...BIN
        DAD     H       ; 2*
        MOV     E,L
        MOV     D,H
        DAD     H       ; 4*
        DAD     H       ; 8*
        DAD     D       ;8*(+2)=10*
        MVI     D,0
        MOV     E,A     ; 10*NIBBLE
        DAD     D       ; HL BINAR
        POP     D
        XCHG
        DCR     C       ; DALSI NIBBLE??
        JNZ     DEBN1
        XCHG
        POP     D
        POP     B       ; HL .. RESULT
        RET


;       PREVOD <HL>=BIN NA <A>/<HL>=DEC
;************************************************
;       IN: <HL>..BIN
;       OUT: <A>..HIGH <HL>..DEC
;       DES: <PSW>

BINDE:  PUSH    B       ; SAVE
        PUSH    D
        LXI     B,0
        MVI     C,16
        LXI     D,0
BIND0:  DAD     H       ; MSB->CY
        MOV     A,E     ; PRICTI K DE
        ADC     A       ; A PREVED NA DEC
        DAA
        MOV     E,A
        MOV     A,D
        ADC     A
        DAA
        MOV     D,A
        MOV     A,B
        ADC     A
        DAA
        MOV     B,A
        DCR     C       ; DALSI NIBBLE??
        JNZ     BIND0
        XCHG
        MOV     A,B
        POP     D
        POP     B
        RET
;
;       COMPLEMENT HL"
;************************************************
;       IN:  <HL>..BIN  OUT: <HL>..BIN

COMP:   MOV     A,L     ; ONE COMPL.
        CMA
        MOV     L,A
        MOV     A,H
        CMA
        MOV     H,A
        INX     H       ; TWOS COMPL.
        RET
;
;       ADD HL+BC->HL
;*************************************************
;
PLUS:   DAD     B
        RET
;
;       SUBTRACT HL-DE->HL       (BINAR)
;*************************************************
;
DSUB:   MOV     A,L
        SUB     E
        MOV     L,A
        MOV     A,H
        SBB     D
        MOV     H,A
        RET
;
;
;       COMPARE HL : DE         (BINAR)
;*************************************************
;
EQUAL:  MOV     A,H     ; CY=0  HL > DE
        SUB     D       ; CY=1  HL < DE
        RNZ             ; Z=1   HL = DE
        MOV     A,L
        SBB     E
        RET
;
;
;       <HL>*<BC>-><HL,DE>      (BINAR)
;*************************************************
;
MUL:    XRA     A
        MOV     D,A
        MOV     E,A
AR1:    DAD     H 
        RAR
        XCHG
        DAD     H
        JNC     $+4
        INX     D
        RAL
        JNC     AR2
        DAD     B
        JNC     AR2
        INX     D
AR2:    XCHG
        ADI     10H
        JNC     AR1
        RET
;
;
; <HL,DE>:<BC>-><HL>;<DE>..REMAINDER  (BINAR)
;*************************************************
;
DIV:    XRA     A
        DAD     H
        PUSH    PSW
        XCHG
        DAD     H
        XCHG
        JNC     $+4
        INX     H
        MOV     A,L
        SUB     C
        MOV     L,A
        MOV     A,H
        SBB     B
        MOV     H,A
        JC      AR4
        POP     PSW
        INX     D
        JMP     AR5
AR4:    POP     PSW
        JC      $-5
        DAD     B
AR5:    ADI     10H
        JNC     DIV+1
        XCHG            ; HL .. RESULT
        RET
;
;       PROCENTA
;*************************************************
;       IN:  <HL>..PROCENTOVA CAST
;            <BC>..PROCENT
;       OUT: <HL>..ZAKLAD
PROC:   PUSH    B
        LXI     B,100
        CALL    MUL
        POP     B
        JMP     DIV
;
;
;#################################################
;
;
;       PRIKLADY POUZITI KNIHOVNY
;       =========================
;
;
;       PRIK1:
;       ------
;       ARITMETIKA V PEVNE RADOVE CARCE V ROZSAHU 15 BITU
;       VSTUP I VYSTUP JE NA OBRAZOVKU V 'BCD' KODU
;       S OSETRENIM ZNAMENKA
;       (ZNAMENKO '+' SE NEZADAVA ANI NEVYSTUPUJE)
;
        ORG     7400H

PRIK1:  CALL    CRLF
        CALL    READ
        CALL    DEBIN
        LDA     SIGN
        CPI     '-'
        JNZ     PRI1
        MOV     A,H
        ORI     80H
        MOV     H,A
PRI1:   PUSH    H
        CALL    READ
        CALL    DEBIN
        LDA     SIGN
        CPI     '-'
        JNZ     PRI2
        MOV     A,H
        ORI     80H
        MOV     H,A
PRI2:   MOV     B,H
        MOV     C,L
        POP     H
        LXI     D,EX
        PUSH    D
        PUSH    B
        CALL    CRLF
        MVI     C,'_'
        CALL    CO
        POP     B
        LXI     D,0     ; FOR 32 BITS
;
        CALL    CINCR   ; SIGN
        STA     SRPR
        CPI     '+'
        JZ      SECTI
        CPI     '-'
        JZ      MI
        CPI     'N'
        JZ      NEG
        CPI     'E'
        JZ      SROV
        CPI     '*'
        JZ      NA
        CPI     ':'
        JZ      DEL
        CPI     '%'
        JZ      PROCC
        RET
;
;-------------------------------------------------
;
EX:     LDA     SRPR
        CPI     'E'
        JNZ     EXX
        CALL    CRLF
        MOV     B,L
        MVI     D,2
        LXI     H,TE1
        CALL    TEXT
        MOV     A,B
        ANI     40H
        JZ      EXX1
        MVI     A,L
EXX1:   CALL    DBYTE
        CALL    SPACE
        CALL    SPACE
        MVI     D,3
        LXI     H,TE2
        CALL    TEXT
        MOV     A,B
        ANI     1
        CALL    DBYTE
        JMP     PRIK1
EXX:    MVI     C,'='
        CALL    CO
        LDA     SIGN
        CPI     '-'
        JNZ     EX2
        MVI     C,'-'
        CALL    CO
EX2:    CALL    BINDE   ; TO DECIMAL
        ORA     A
        JZ      EX1
        CALL    DBYTE
EX1:    CALL    DADR
        JMP     PRIK1
;
TE1:    DB      'Z='
TE2:    DB      'CY='
;-------------------------------------------------
;
SECTI:  CALL    MIPL
        CALL    PLUS
        CALL    VYSL
        RET
MI:     CALL    MIPL
        MOV     D,B
        MOV     E,C
        CALL    DSUB
        CALL    VYSL
        RET
NA:     CALL    NADEL
        CALL    MUL
        XCHG
        RET
DEL:    CALL    NADEL
        XCHG
        CALL    DIV
        RET
SROV:   CALL    MIPL
        MOV     D,B
        MOV     E,C
        CALL    EQUAL
        MVI     A,0
        PUSH    PSW
        POP     H
        RET
;
NEG:    MVI     A,'+'
        STA     SIGN
        MVI     A,80H
        XRA     H
        ANI     80H
        JZ      NE1
        MVI     A,'-'
        STA     SIGN
NE1:    MOV     A,H
        ANI     7FH
        MOV     H,A
        RET
;
PROCC:  MOV     A,H
        ANI     80H
        JZ      PRO1
        MVI     A,'-'
        STA     SIGN
        MOV     A,H
        ANI     7FH
        MOV     H,A
PRO1:   MOV     A,B
        ANI     7FH
        MOV     B,A
        CALL    PROC
        RET
;
;-------------------------------------------------
;
VYSL:   MVI     A,'+'
        STA     SIGN
        MOV     A,H
        ANI     80H
        JZ      VYSL1
        MVI     A,'-'
        STA     SIGN
        CALL    COMP
VYSL1:  RET
;
MIPL:   MOV     A,H
        ANI     80H
        JZ      MIPL1
        MOV     A,H
        ANI     7FH
        MOV     H,A
        CALL    COMP
MIPL1:  MOV     A,B
        ANI     80H
        JZ      MIPL2
        MOV     A,B
        ANI     7FH
        MOV     B,A
        PUSH    H
        MOV     H,B
        MOV     L,C
        CALL    COMP
        MOV     B,H
        MOV     C,L
        POP     H
MIPL2:  RET
;
NADEL:  MOV     A,B
        ANI     80H
        MOV     D,A
        JZ      NADE
        MOV     A,B
        ANI     7FH
        MOV     B,A
NADE:   MOV     A,H
        ANI     80H
        PUSH    PSW
        JZ      NADE1
        MOV     A,H
        ANI     7FH
        MOV     H,A
NADE1:  POP     PSW
        XRA     D
        JZ      NADE2
        MVI     A,'-'
        JMP     NADE3
NADE2:  MVI     A,'+'
NADE3:  STA     SIGN
        LXI     D,0
        RET
;
READ:   PUSH    B
        PUSH    D
R6:     CALL    CRLF
        MVI     C,':'
        CALL    CO
        MVI     A,'+'
        STA     SIGN
        LXI     H,RBF
        MVI     B,0
        CALL    CINCR
        CPI     '-'
        JNZ     R1
        STA     SIGN
R2:     CALL    CINCR
        JZ      R3      ; ZNAKU < 5
R1:     ANI     0FH
        MOV     M,A
        INX     H
        INR     B
        MOV     A,B
        CPI     5
        JZ      R4      ; 5 ZNAKU
        JMP     R2
R3:     MOV     E,B
        DCR     E
        MVI     D,0
        LXI     H,RBF
        DAD     D
        XRA     A
        JMP     R5
R4:     MOV     E,B
        DCR     E
        MVI     D,0
        LXI     H,RBF
        DAD     D
        LDA     RBF
        DCR     B
R5:     MOV     C,A
        LXI     D,0
        MOV     E,M
        DCR     B
        JZ      DOST
        DCX     H
        MOV     A,M
        RLC
        RLC
        RLC
        RLC
        ORA     E
        MOV     E,A
        DCR     B
        JZ      DOST
        DCX     H
        MOV     D,M
        DCR     B
        JZ      DOST
        DCX     H
        MOV     A,M
        RLC
        RLC
        RLC
        RLC
        ORA     D
        MOV     D,A
DOST:   XCHG
        MOV     A,C
        POP     D
        POP     B
        RET
;
;
;       PRIK2:
;       ------
;       ARITMETIKA V PEVNE RADOVE CARCE V ROZSAHU 15 BITU
;       16 BIT JE ZNAMENKOVY
;       OPERANDY JSOU V REGISTROVYCH PARECH <HL>,<BC>
;       (15 BITU VYZNAMOVYCH A 16.BIT ZNAMENKO)
;       V BINARNIM TVARU. DRUH OPERACE JE V REGISTRU <A>
;       VYSTUP JE V REG.PARU <HL> (16.BIT ZNAMENKO)
;
;
        ORG     7600H
;
PRIK2:  LXI     D,ZNVYS
        PUSH    D
        CPI     '+'
        JZ      SECTI
        CPI     '-'
        JZ      MI
        CPI     'N'
        JZ      NEG
        CPI     'E'
        JZ      SROV1
        CPI     '*'
        JZ      NA
        CPI     ':'
        JZ      DEL
        CPI     '%'
        JZ      PROCC
POKR:   RET
;
SROV1:  CALL    SROV
        MOV     A,H
        ANI     7FH
        MOV     H,A
        RET
;
ZNVYS:  LDA     SIGN
        CPI     '-'
        JNZ     ZNVY1
        MOV     A,H
        ORI     80H
        MOV     M,A
ZNVY1:  JMP     POKR
;
;-------------------------------------------------
;
SIGN:   DS      1
SRPR:   DS      1
RBF:    DS      5
;
CO      EQU     109H
CRLF    EQU     124H
DADR    EQU     130H
DBYTE   EQU     133H
SPACE   EQU     13CH
CINCR   EQU     13FH
TEXT    EQU     142H
;
;
        END

























;******************************************

        TITLE   FP-ARIT  V 4.1

;******************************************
;
;
; STANDART FUNCTIONS:   SIN,COS,TAN (DEC OR RAD)
;                       ATN (RAD)
;                       SQRT,LN,LOG,EXP,SGN,INT,FIX,FLO
; FLOATING OPERATIONS:  ADD,SUB,MUL,DIV,CMP,SAF
;                       FRD,FWR
;                       MXA,MAX,MXX,MRA,MAR,MAS,MSA 
;                       MAER
;--------------------------------------------------------------
;                       FACC - FLOATING ACCUMULATOR
; WORKING AREAS:        WRBF - NUMERIC ASCII OUTPUT BF
;                       ASCBF - NUMERIC ASCII INPUT BF
;                       FMD$ - TEMPORARY WORKING BF
;                       FCON - CONSTANT ADDRESS BF
;--------------------------------------------------------------
;                       E  D  C  B (REG.)
;                       B0 B1 B2 B3
; FLOATING FORMAT:      XX XX XX XX
; (INTERNAL CODING)     ML MM MH EXP(EXCESS 80)
;                             MS
;                       MANTISA: SIGN.+"1"+23 BITS
;                  I E. XX XX XX 00 = 0
;                       00 00 00 81 = 1    EXP. 2**1
;                       00 00 00 80 = 5    EXP. 2**0
;                       00 00 80 81 = -1
;                       FF FF 7F FF = 1.7014117 X 10 ^ 38
;                       00 00 00 01 = 2.9387359 X 10 ^ 39
;                       00 00 80 01 =-2.9387359 X 10 ^ 38
;                       FF FF FF FF =-1.7014117 X 10 ^ 38
;--------------------------------------------------------------
;                       A - FLOATING ACCUMULATOR (FACC)
; SYMBOL USED:          R - "REGISTER" B,C,D,E (BCDE)
;                       S - 4 STACK CELS POINTED BY (SP)
;                       X - 4 RAM CELS
;                           (LSB POINTED BY (HL) )

;==============================================================

;       SYSTEM ADDRESS:

RAM     EQU     7800H   ; DATA ARRAY
EPROM   EQU     7000H   ; START OF PROGAM
MONIT   EQU     139H    ; RETURN TO MONITOR SAPI 1


;==============================================================


        ORG     EPROM


;JUMP TABLE:
;==========


;       ADD:    FACC = (FCON) + FACC  ........ FACA
;       ----         = (HL)   + FACC  ........ FAXA
;                    = (SP)   + FACC  ........ FASA
;                    = BCDE   + FACC  ........ FARA
        JMP     FACA
        JMP     FAXA
        JMP     FASA
        JMP     FARA

;       SUB:    FACC = (FCON) - FACC  ........ FSCA
;       ----         = (HL)   - FACC  ........ FSXA
;                    = (SP)   - FACC  ........ FSSA
;                    = BCDE   - FACC  ........ FSRA
        JMP     FSCA
        JMP     FSXA
        JMP     FSSA
        JMP     FSRA

;       MULT:   FACC = (FCON) * FACC  ........ FMCA
;       -----        = (HL)   * FACC  ........ FMXA
;                    = (SP)   * FACC  ........ FMSA
;                    = BCDE   * FACC  ........ FMRA
        JMP     FMCA
        JMP     FMXA
        JMP     FMSA
        JMP     FMRA

;       DIV:    FACC = (FCON) / FACC  ........ FDCA
;       ----         = (HL)   / FACC  ........ FDXA
;                    = (SP)   / FACC  ........ FDSA
;                    = BCDE   / FACC  ........ FDRA
        JMP     FDCA
        JMP     FDXA
        JMP     FDSA
        JMP     FDRA

;       TRIGONOMETRIC FUNCTIONS:
;       ------------------------

;       SIN:    FACC = SIN(FACC)      ........ FSID   DEG
;                    = SIN(FACC)      ........ FSIN   RAD
        JMP     FSID
        JMP     FSIN

;       COS:    FACC = COS(FACC)      ........ FCOD   DEG
;                    = COS(FACC)      ........ FCOS   RAD
        JMP     FCOD
        JMP     FCOS

;       TAN:    FACC = TAN(FACC)      ........ FTAD   DEG
;                    = TAN(FACC)      ........ FTAN   RAD
        JMP     FTAD
        JMP     FTAN

;       ATN:    FACC = ATN(FACC)      ........ FATN   RAD
        JMP     FATN

;       STANDART FUNCTIONS:
;       -------------------

;       POWER:  FACC = FACC ** BCDE   ........ FPXY
        JMP     FPXY

;       LN:     FACC = LN(FACC)       ........ FLN
        JMP     FLN

;       LOG:    FACC = LOG(FACC)      ........ FLOG
        JMP     FLOG

;       SQR:    FACC = SQR(FACC)      ........ FSQR
        JMP     FSQR

;       EXP:    FACC = EXP(FACC)      ........ FEXP
        JMP     FEXP

;       INT:    FACC = INT(FACC)      ........ FINT
        JMP     FINT

;       SGN:    FACC = SIGN(FACC)     ........ FSGN
        JMP     FSGN

;       ABS:    FACC = ABS(FACC)      ........ FABS
        JMP     FABS

;       NEG:    FACC = -FACC          ........ FNEG
        JMP     FNEG

;       COMPARE FACC WITH: (HL)        ....... FCM
;       ------------------ BCDE        ....... FCR
;                          "0"(SET AF) ....... FSAF
        JMP     FCM
        JMP     FCR
        JMP     FSAF

;INTEL: FACC<X AF=0102; FACC=X AF=0056; FACC>X AF=FF87
;ZIL0G:           0100            0042            FFBF
;               Z:   0               1               0
;              CY:   0               0               1
;               P:   0(0)            1(E)            1(E)

;       READ/WRITE AND MOVE PROCEDURES:
;       -------------------------------

;       READ INPUT ASCII BUFFER       ........  FRD
;       WRITE OUTPUT ASCII BUFFER     ........  FWR
        JMP     FRD
        JMP     FWR

;       MOVE FACC TO STACK            ........  MAS
;       MOVE FACC TO BCDE             ........  MAR
;       MOVE FACC TO FXHL             ........  MAX
        JMP     MAS
        JMP     MAR
        JMP     MAX


;**************************************************************


;ADD FCON SUBROUTINE

;       (FCON)=(SOURCE ADDRESS)
;       CALL FACA
;       (FACC)=(FCON)+(FACC)
;
FACA:   LHLD    FCON
;
;ADD FXHL SUBROUTINE
;
;       (HL)=(SOURCE ADDRESS)
;       CALL FAXA
;       (FACC)=((HL))+(FACC)
;
FAXA:   CALL    MXR
;
;ADD FXSP SUBROUTINE
;
;       (SP)=(SOURCE ADDRESS)
;       JMP FASA
;       (FACC)=((SP))+(FACC)
;
        DB      21H
FASA:   POP     B
        POP     D
        JMP     FARA
;
;SUBTRACT FCON SUBROUTINE
;
;       (FCON)=(SOURCE ADDRESS)
;       CALL FSCA
;       (FACC)=(FCON)-(FACC)
;
FSCA:   LHLD    FCON
;
;SUBTRACT FXHL SUBROUTINE
;
;       (HL)=(SOURCE ADDRESS)
;       CALL FSXA
;       (FACC)-((HL))-(FACC)
;
FSXA:   CALL    MXR
;
;SUBTRACT FXSP SUBROUTINE
;
;       (SP)=(SOURCE ADDRESS)
;       JMP FSSA
;       (FACC)=((SP))-(FACC)
;
        DB      21H
FSSA:   POP     B
        POP     D
;
;SUBTRACT BCDE SUBROUTINE
;
;       (BCDE)=(SOUCE DATA)
;       CALL FSRA
;       (FACC)=(BCDE)-(FACC)
;
FSRA:   LXI     H,FACC+2
        MOV     A,M
        XRI     80H
        MOV     M,A
;
;ADD BCDE SUBROUTINE
;
;       (BCDE)=(SOURCE DATA)
;       CALL FARA
;       (FACC)=(BCDE)+(FACC)
FARA:   MOV     A,B
        ANA     A
        RZ
        LDA     FACC+3
        ANA     A
FAR1:   JZ      MRA
        SUB     B
        JNC     FAR2
        CMA
        INR     A
        PUSH    PSW
        CALL    MAER
        POP     PSW
FAR2:   CPI     19H
        RNC
        PUSH    PSW
        CALL    F$F
        MOV     H,A
        POP     PSW
        CALL    F$D
        ORA     H
        LXI     H,FACC
        JP      F$K
        CALL    F$B
        JNC     F$L2
        INX     H
        INR     M
        JZ      F$OV
        MVI     L,1
        CALL    F$D5
        JMP     F$L2
;
;MULTIPLY FCON SUBROUTINE
;
;       (FCON)=(SOURCE ADDRESS)
;       CALL FMCA
;       (FACC)=(FCON)*(FACC)
;
FMCA:   LHLD    FCON

;MULTIPLY FXHL SUBROUTINE
;
;       (HL)*(SOURCE ADDRESS)
;       CALL FMXA
;       (FACC)=((HL))*(FACC)
;
FMXA:   CALL    MXR
;
;MULTIPLY FXSP SUBROUTINE
;
;       (SP)=(SOURCE ADDRESS)
;       JMP FMSA
;       (FACC)=((SP))*(FACC)
;
        DB      21H
FMSA:   POP     B
        POP     D
;
;MULTIPLY BCDE SUBROUTINE
;
;       (BCDE)=(SOURCE DATA)
;       CALL FMRA
;       (FACC)=(BCDE)*(FACC)
;
FMRA:   CALL    FSAF
        RZ
FMR1:   MVI     L,0
        CALL    F$E
        MOV     A,C
        STA     FMD$
        XCHG
        SHLD    FMD$+1
        LXI     B,0
        MOV     D,B
        MOV     E,B
        LXI     H,F$K2
        PUSH    H 
        LXI     H,FMR2
        PUSH    H
        PUSH    H
        LXI     H,FACC
FMR2:   MOV     A,M
        INX     H
        ANA     A
        JZ      FMR6
        PUSH    H
        XCHG
        MVI     E,8
FMR3:   RAR
        MOV     D,A
        MOV     A,C
        JNC     FMR4
        PUSH    D
        XCHG
        LHLD    FMD$+1
        DAD     D
        PUSH    H
        LXI     H,FMD$
        ADC     M
        POP     H
        POP     D
FMR4:   RAR
        MOV     C,A
        MOV     A,H
        RAR
        MOV     H,A
        MOV     A,L
        RAR
        MOV     L,A
        MOV     A,B
        RAR
        MOV     B,A
        DCR     E
        MOV     A,D
        JNZ     FMR3
        XCHG
FMR5:   POP     H
        RET
FMR6:   MOV     B,E
        MOV     E,D
        MOV     D,C
        MOV     C,A
        RET
;
;DIVIDE FCON SUBROUTINE
;
;       (FCON)=(SOURCE ADDRESS)
;       CALL FDCA
;       (FACC)=(FCON)/(FACC)
;
FDCA:   LHLD    FCON
;
;DIVIDE FXHL SUBROUTINE
;
;       (HL)=(SOURCE ADDRESS)
;       CALL FDXA
;       (FACC)=((HL))/(FACC)
;
FDXA:   CALL    MXR
;
;DIVIDE FXSP SUBROUTINE
;
;       (SP)=(SOURCE ADDRESS)
;       JMP FDSA
;       (FACC)=((SP))/(FACC)
;
        DB      21H
FDSA:   POP     B
        POP     D
;
;DIVIDE BCDE SUBROUTINE
;
;       (BCDE)=(SOURCE DATA)
;       CALL FDRA
;       (FACC)=(BCDE)/(FACC)
;
FDRA:   CALL    FSAF
        JZ      F$OV
        MVI     L,-1
        CALL    F$E
        INR     M
        INR     M
        DCX     H
        MOV     A,M
        STA     FMD$+2
        DCX     H
        MOV     A,M
        STA     FMD$+1
        DCX     H
        MOV     A,M
        STA     FMD$
        MOV     B,C
        XCHG
        XRA     A
        MOV     C,A
        MOV     D,A
        MOV     E,A
        STA     FMD$+3
FDR2:   PUSH    H
        PUSH    B
        PUSH    D
        XCHG
        LXI     H,FMD$
        MOV     A,E
        SUB     M
        MOV     E,A
        MOV     A,D
        INX     H
        SBB     M
        MOV     D,A
        MOV     A,B
        INX     H
        SBB     M
        MOV     B,A
        INX     H
        MOV     A,M
        SBI     0
        XCHG
        POP     D
        CMC
        JNC     FDR4
        STA     FMD$+3
        POP     PSW
        POP     PSW
        STC
        DB      0D2H
FDR4:   POP     B
        POP     H
        MOV     A,C
        INR     A
        DCR     A
        RAR
        JM      F$L3
        RAL
        MOV     A,E
        RAL
        MOV     E,A
        MOV     A,D
        RAL
        MOV     D,A
        MOV     A,C
        RAL
        MOV     C,A
        DAD     H
        MOV     A,B
        RAL
        MOV     B,A
        LDA     FMD$+3
        RAL
        STA     FMD$+3
        MOV     A,C
        ORA     D
        ORA     E
        JNZ     FDR2
        LDA     FACC+3
        DCR     A
        STA     FACC+3
        JNZ     FDR2
        JMP     F$OV
;
;APROXIMATE (X*X) CALCULATION SUBROUTINE
;
;       (HL)=(CONSTANT TABLE ADDRESS)
;       (FACC)=(X DATA)
;       CALL FCXX
;       (FACC)=(((C1XX+C2)XX+C3)XX+...)
;
FCXX:   CALL    MAS
        LXI     D,FMSA
        PUSH    D
        PUSH    H
        CALL    MAR
        CALL    FMRA
        POP     H
;
;APPROXIMATE (X) CALCULATION SUBROUTINE
;
;       (HL)=(CONSTANT TABLE ADDRESS)
;       (FACC)=(X DATA)
;       CALL FCX
;       (FACC)=(((C1X+C2)X+C3)X+...)
;
FCX:    CALL    MAS
        MOV     A,M
        INX     H
        CALL    MXA
        DB      6
FCX1:   POP     PSW
        POP     B
        POP     D
        DCR     A
        RZ
        PUSH    D
        PUSH    B
        PUSH    PSW
        PUSH    H
        CALL    FMRA
        POP     H
        CALL    MXR
        PUSH    H
        CALL    FARA
        POP     H
        JMP     FCX1
;
;GENERAL LOGARITHM SUBROUTINE
;
;       (FACC)=(SOURCE DATA)
;       CALL FLOG
;       (FACC)=LOC(FACC)
;
FLOG:   MVI     A,1
        ANA     A
        JMP     FLN+1
;
;NATURAL LOGARITHM SUBROUTINE
;
;       (FACC)=(SOURCE DATA)
;       CALL FLN
;       (FACC)=LN(FACC)
;
FLN:    XRA     A
        PUSH    PSW
        CALL    FSAF
        JPE     F$OV
        LXI     H,FACC+3
        MOV     A,M
        LXI     B,8035H
        LXI     D,04F3H
        SUB     B
        PUSH    PSW
        MOV     M,B
        PUSH    D
        PUSH    B
        CALL    FARA
        POP     B
        POP     D
        INR     B
        CALL    FDRA
        LXI     B,8100H
        MOV     D,C
        MOV     E,C
        CALL    FSRA
        LXI     H,FLGT
        CALL    FCXX
        LXI     B,8080H
        LXI     D,0
        CALL    FARA
        POP     PSW
        CALL    FLN3
        POP     PSW
        JNZ     FLN2
FLN1:   LXI     B,8031H
        LXI     D,7218H
        JMP     FMRA
FLN2:   LXI     B,7F1AH
        LXI     D,209BH
        JMP     FMRA
FLN3:   CALL    MAS
        CALL    FSG1
        JMP     FASA
;
FLGT:   DB      3
        DB      0AAH,56H,19H,80H
        DB      0F1H,22H,76H,80H
        DB      45H,0AAH,38H,82H
;
;SQUARE ROOT SUBROUTINE
;
;       (FACC)=(SOURCE DATA)
;       CALL FSQR
;       (FACC)=SQR(FACC)
;
FSQR:   CALL    MAR
        LXI     H,8000H
        SHLD    FACC+2
        MOV     H,L
        SHLD    FACC
        CALL    FSAF
        MOV     A,B
        JZ      FEXP
        JP      FSQ1
        ANA     A
        JP      F$OV
FSQ1:   ANA     A
        JZ      F$K5
        PUSH    D
        PUSH    B
        MOV     A,C
        ORI     7FH
        CALL    MAR
        JP      FSQ2
        PUSH    D
        PUSH    B
        CALL    FINT
        POP     B
        POP     D
        PUSH    PSW
        CALL    FCR
        POP     H
        MOV     A,H
        RAR
FSQ2:   POP     H
        SHLD    FACC+2
        POP     H
        SHLD    FACC
        CC      FSQ3
        CZ      FNEG
        LXI     H,FEXP
        PUSH    H
        PUSH    D
        PUSH    B
        CALL    FLN 
        JMP     FMSA
FSQ3:   LXI     H,FNEG
        XTHL
        PCHL
;
;EXPONENTIAL SUBROUTINE
;
;       (FACC)=(SOURCE DATA)
;       CALL FEXP
;       (FACC)=EXP(FACC)
;
FEXP:   CALL    MAS
        LXI     B,8138H
        LXI     D,0AA3BH
        CALL    FMRA
        LDA     FACC+3
        CPI     88H
        JNC     F$E1
        CALL    FINT
        ADI     82H
        JC      F$E1
        PUSH    PSW
        LXI     B,8100H
        MOV     D,C
        MOV     E,C
        CALL    FARA
        CALL    FLN1
        POP     PSW
        POP     B
        POP     D
        PUSH    PSW
        CALL    FSRA
        LXI     H,FACC+2
        MOV     A,H
        XRI     80H
        MOV     M,A
        LXI     H,FEXT
        CALL    FCX
        LXI     D,0
        POP     B
        MOV     C,D
        JMP     FMRA
;
FEXT:   DB      8
        DB      40H,2EH,94H,74H
        DB      70H,4FH,2EH,77H
        DB      6EH,2,88H,7AH
        DB      0E6H,0A0H,2AH,7CH
        DB      50H,0AAH,0AAH,7EH
        DB      0FFH,0FFH,7FH,7FH
        DB      0,0,80H,81H
FONE:   DB      0,0,0,81H
FC05:   DB      0,0,0,80H
;
;INT FACC SUBROUTINE
;
;       (FACC)=(SOURCE DATA)
;       CALL FINT
;       (FACC)=INT(FACC)
;
FINT:   LXI     H,FACC+3
        MOV     A,M
        CPI     98H
        LDA     FACC
        RNC
        MOV     A,M
        CALL    F$J
        MVI     M,98H
        MOV     A,E
        PUSH    PSW
        MOV     A,C
        RAL
        CALL    F$K1
        POP     PSW
        RET
;
;SGN INITIALIZE SUBROUTINE
;
;       (FACC)=(SOURCE DATA)
;       CALL FSIG
;       (FACC)=SGN(FACC)
;
FSGN:   CALL    FSAF
FSG1:   MVI     B,88H
        LXI     D,0
FSG2:   LXI     H,FACC+3
        MOV     M,B
        MOV     C,A
        MVI     B,0
        INX     H
        MVI     M,80H
        RAL
        JMP     F$K1
;
;ABSOLUTE VALUE SUBROUTINE
;
;       (FACC)=(SOURCE DATA)
;       CALL FABS
;       (FACC)=ABS(FACC)
;
FABS:   CALL    FSAF
        RP
;
;NEGATE FACC SUBROUTINE
;
;       (FACC)=(SOURCE DATA)
;       CALL=FNEG
;       (FACC)=-(FACC)
;
FNEG:   LXI     H,FACC+2
        MOV     A,M
	XRI     80H
        MOV     M,A
        RET
;
;COSIN SUBROUTINE
;
;       (FACC)=(SOURCE DATA: DEGREE)
;       CALL FCOD
;       (FACC)=COS(FACC)
;
FCOD:   LXI     B,3734H
        LXI     D,0
        CALL    FARA
;
;SIN SUBROUTINE
;
;       (FACC)=(SOURCE DATA: DEGREE)
;       CALL FSID
;       (FACC)=SIN(FACC)
;
FSID:   LXI     B,7B0EH
        LXI     D,0FA35H
        CALL    FMRA
        JMP     FSIN
;
;COSIN SUBROUTINE
;
;       (FACC)=(SOURCE DATA: RADIAN)
;       CALL FCOS
;       (FACC)=COS(FACC)
;
FCOS:   LXI     B,8149H
        LXI     D,0FDBH
        CALL    FARA
;
;SIN SUBROUTINE
;
;       (FACC)=(SOURCE DATA: RADIAN)
;       CALL FSIN
;       (FACC)=SIN(FACC)
;
FSIN:   LXI     B,8349H
        LXI     D,0FDBH
        CALL    MAER
        CALL    FDRA
        CALL    MAS
        CALL    FINT
        POP     B
        POP     D
        CALL    FSRA
        LXI     B,7F00H
        MOV     D,C
        MOV     E,C
        CALL    FSRA
        CALL    FSAF
        STC
        JP      FSI1
        LXI     B,8000H
        MOV     D,C
        MOV     E,C
        CALL    FARA
        CALL    FSAF
        ANA     A
FSI1:   PUSH    PSW
        CP      FNEG
        LXI     B,7F00H
        MOV     D,C
        MOV     E,C
        CALL    FARA
        POP     PSW
        CNC     FNEG
        LXI     H,FSIT
        JMP     FCXX
;
FSIT:   DB      5
        DB      0BAH,0D7H,1EH,86H
        DB      64H,26H,99H,87H
        DB      58H,34H,23H,87H
        DB      0E0H,5DH,0A5H,86H
        DB      0DAH,0FH,49H,83H
;
;
;TANGENTH SUBROUTINE
;
;       (FACC)=(SOURCE DATA:DEGREE)
;       CALL FTAD
;       (FACC)=TAN(FACC)
;
FTAD:   LXI     B,7B0EH
        LXI     D,0FA35H
        CALL    FMRA
;
;TANGENTH SUBROUTINE
;
;       (FACC)=(SOURCE DATA: RADIAN)
;       CALL FTAN
;       (FACC)=TAN(FACC)
;
FTAN:   CALL    MAS
        CALL    FSIN
        POP     B
        POP     H
        CALL    MAS
        XCHG
        CALL    MRA
        CALL    FCOS
        JMP     FDSA
;
;ARCTAN SUBROUTINE
;
;       (FACC)=(SOURCE DATA)
;       CALL FATN
;       (FACC)=ATN(FACC)
;
FATN:   CALL    FSAF
        CM      FSQ3
        CM      FNEG
        LDA     FACC+3
        CPI     81H
        JC      FAT1
        LXI     B,8100H
        MOV     D,C
        MOV     E,C
        CALL    FDRA
        LXI     H,FSRA
        PUSH    H
FAT1:   LXI     H,FATT
        CALL    FCXX
        LXI     B,8149H
        LXI     D,0FDBH
        RET
;
FATT:   DB      9
        DB      4AH,0D7H,3BH,78H
        DB      2,6EH,84H,7BH
        DB      -2,0C1H,2FH,7CH
        DB      74H,31H,9AH,7DH
        DB      84H,3DH,5AH,7DH
        DB      0C8H,7FH,91H,7EH
        DB      0E4H,0BBH,4CH,7EH
        DB      6CH,0AAH,0AAH,7FH
        DB      0,0,0,81H
;
;GENERAL POWEP SUBROUTINE
;       (FACC)=(X DATA)
;       (BCDE)=(Y DATA)
;       CALL FPXY
;       (FACC)=X**Y
;
FPXY:   LXI     H,FEXP
        PUSH    H
        PUSH    D
        PUSH    B
        CALL    FLN
        JMP     FMSA
;
;SET AF  SUBROUTINE
;
;       (FACC)=(SOURCE DATA)       S
;       CALL    FSAF             Z C P
;       IF FACC>0 THEN AF=0102   0 0 0
;          FACC=0      AF=0056   1 0 1
;          FACC<0      AF=FF87   0 1 1
;
FSAF:   LDA     FACC+3
        ANA     A
        JNZ     FSAF1
        RET
FSAF1:  LDA     FACC+2
        DB      -2
        CMA
        RAL
FSAF2:  SBB     A
FSAF3:  CALL    FSAF5
        RNZ
        INR     A
Z80:
FSAF5:  PUSH    H
        PUSH    PSW
        POP     H
        ANA     A
        MOV     A,L
        JPE     FSAF6
        ANI     11111011B
        JMP     FSAF7
FSAF6:  ORI     00000100B
FSAF7:  MOV     L,A
        PUSH    H
        POP     PSW
        POP     H
        RET
;
;F$B SUBROUTINE
;
F$B:    MOV     A,M
        ADD     E
        MOV     E,A
        INX     H
        MOV     A,M
        ADC     D
        MOV     D,A
        INX     H
        MOV     A,M
        ADC     C
        MOV     C,A
        RET
;
;F$C SUBROUTINE
;
F$C:    LXI     H,FACC+4
        MOV     A,M
        CMA
        MOV     M,A
        XRA     A
        MOV     L,A
        SUB     B
        MOV     B,A
        MOV     A,L
        SBB     E
        MOV     E,A
        MOV     A,L
        SBB     D
        MOV     D,A
        MOV     A,L
        SBB     C
        MOV     C,A
        RET
;
;F$D SUBROUTINE
;
F$D:    MVI     B,0
F$D1:   SUI     8
F$D2:   JC      F$D3
        MOV     B,E
        MOV     E,D
        MOV     D,C
        MVI     C,0
        JMP     F$D1
F$D3:   ADI     9
        MOV     L,A
F$D4:   XRA     A
        DCR     L
        RZ
        MOV     A,C
F$D5:   RAR
        MOV     C,A
        MOV     A,D
        RAR
        MOV     D,A
        MOV     A,E
        RAR
        MOV     E,A
        MOV     A,B
        RAR
        MOV     B,A
        JMP     F$D4
;
;F$E SUBROUTINE
;
F$E:    MOV     A,B
        ANA     A
        JZ      F$E3
        MOV     A,L
        LXI     H,FACC+3
        XRA     M
        ADD     B
        MOV     B,A
        RAR
        XRA     B
        MOV     A,B
        JP      F$E2
        ADI     80H
        MOV     M,A
        JZ      FMR5
        CALL    F$F
        MOV     M,A
        DCX     H
        RET
F$E1:   CALL    FSAF
        CMA
        POP     H
F$E2:   ANA     A
F$E3:   POP     H
        JP      F$K4
        JMP     F$OV
;
;F$F SUBROUTINE
;
F$F:    LXI     H,FACC+2
        MOV     A,M
        RLC
        STC
        RAR
        MOV     M,A
        CMC
        RAR
        INX     H
        INX     H
        MOV     M,A
        MOV     A,C
        RLC
        STC
        RAR
        MOV     C,A
        RAR
        XRA     M
        RET
;
;
;COMPARE FXHL SUBROUTINE
;
;       (HL)=(SOURCE ADDRESS)
;       CALL    FCX
;       (FACC)=((HL)) ?
;
FCM:    CALL    MXR
;
;COMPARE BCDE SUBROUTINE
;
;       (BCDE)=(SOURCE DATA)
;       CALL FCR                      S
;       (FACC)-(BCDE) ?             Z C P
;       IF FACC<BCDE THEN AF=0102   0 0 0
;          FACC=BCDE      AF=0056   1 0 1
;          FACC>BCDE      AF=FF87   0 1 1
;
FCR:    MOV     A,B
        ANA     A
        JZ      FSAF
        LXI     H,FSAF1+4
        PUSH    H
        CALL    FSAF
        MOV     A,C
        RZ
        LXI     H,FACC+2
        XRA     M
        MOV     A,C
        RM
        CALL    F$H
        RAR
        XRA     C
        RET
;
;F$H SUBROUTINE
;
F$H:    INX     H
        MOV     A,B
        CMP     M
        RNZ
        DCX     H
        MOV     A,C
        CMP     M
        RNZ
        DCX     H
        MOV     A,D
        CMP     M
        RNZ
        DCX     H
        MOV     A,E
        SUB     M
        RNZ
        POP     H
        POP     H
        RET
;
;FIX FACC SUBROUTINE
;
;       (FACC)=(SOURCE DATA)
;       CALL FFIX
;       (BCDE)=FIX(FACC)
;
FFIX:   LDA     FACC+3
;
F$J:    MOV     B,A
        MOV     C,A
        MOV     D,A
        MOV     E,A
        ANA     A
        RZ
        PUSH    H
        CALL    MAR
        CALL    F$F
        XRA     M
        MOV     H,A
        CM      F$J1 
        MVI     A,98H 
        SUB     B
        CALL    F$D
        MOV     A,H
        RAL
        CC      F$M
        MVI     B,0
        CC      F$C
        POP     H
        RET
F$J1:   DCX     D
        MOV     A,D
        ANA     E
        INR     A
        RNZ
        DCX     B
        RET
;
;       FLOAT(HL) SUBROUTINE
;
;       (HL)=(SOURCE DATA)
;       CALL FFLO
;       (FACC)=FLOAT(HL)
;
FFLO:   XCHG
        XRA     A
        MVI     B,98H
        CALL    FSG2
        RET
;
;F$K SUBROUTINE
;
F$K:    XRA     A
        SUB     B
        MOV     B,A
        MOV     A,M
        SBB     E
        MOV     E,A
        INX     H
        MOV     A,M
        SBB     D
        MOV     D,A
        INX     H
        MOV     A,M
        SBB     C
        MOV     C,A
F$K1:   CC      F$C
F$K2:   MOV     L,B
        MOV     H,E
        XRA     A
F$K3:   MOV     B,A
        MOV     A,C
        ANA     A
        JNZ     F$L1
        MOV     C,D
        MOV     D,H
        MOV     H,L
        MOV     L,A
        MOV     A,B
        SUI     8
        CPI     0E0H
        JNZ     F$K3
F$K4:   XRA     A
F$K5:   STA     FACC+3
        RET
;
;F$L SUBROUTINE
;
F$L:    DCR     B
        DAD     H
        MOV     A,D
        RAL
        MOV     D,A
        MOV     A,C
        ADC     A
        MOV     C,A
F$L1:   JP      F$L
        MOV     A,B
        MOV     E,H
        MOV     B,L
        ANA     A
        JZ      F$L2
        LXI     H,FACC+3
        ADD     M
        MOV     M,A
        JNC     F$K4
        RZ
F$L2:   MOV     A,B
F$L3:   LXI     H,FACC+3
        ANA     A
        CM      F$M
        MOV     B,M
        INX     H
        MOV     A,M
        ANI     80H
        XRA     C
        MOV     C,A
        JMP     MRA
;
;F$M SUBROUTINE
;
F$M:    INR     E
        RNZ
        INR     D
        RNZ
        INR     C
        RNZ
        MVI     C,80H
        INR     M
        RNZ
        JMP     F$OV
;
;F$N SUBROUTINE
;
F$N:    CALL    MAR
        MOV     A,B
        ANA     A
        RZ
        ADI     2
        JC      F$OV
        MOV     B,A
        CALL    FARA
        LXI     H,FACC+3
        INR     M
        RNZ
        JMP     F$OV
;
;F$O SUBROUTINE
;
F$O:    INX     H
F$O1:   MOV     A,M
        CPI     ':'
        RNC
        CPI     ' '
        JZ      F$O
        CPI     '0'
        CMC
        INR     A
        DCR     A
        RET
;
;MOVE FACC TO STACK SUBROUTINE
;
MAS:    XCHG
        LHLD    FACC
        XTHL
        PUSH    H
        LHLD    FACC+2
        XTHL
        PUSH    H
        XCHG
        RET
;
;MOVE STACK TO FACC SUBROUTINE
;
MSA:    XCHG
        POP     H
        XTHL
        SHLD    FACC+2
        POP     H
        XTHL
        SHLD    FACC
        XCHG
        RET
;
;MOVE FXDE TO FXHL SUBROUTINE
;
MXX:    LDAX    D
        MOV     M,A
        INX     D
        INX     H
        LDAX    D
        MOV     M,A
        INX     D
        INX     H
        LDAX    D
        MOV     M,A
        INX     D
        INX     H
        LDAX    D
        MOV     M,A
        INX     D
        INX     H
        RET
;
;MOVE FXHL TO FACC SUBROUTINE
;
MXA:    CALL    MXR
;
;MOVE BCDE TO FACC SUBROUTINE
;
MRA:    XCHG
        SHLD    FACC
        MOV     H,B
        MOV     L,C
        SHLD    FACC+2
        XCHG
        RET
;
;MOVE FACC TO BCDE SUBROUTINE
;
MAR:    LXI     H,FACC
;
;MOVE FXHL TO BCDE SUBROUTINE
;
MXR:    MOV     E,M
        INX     H
        MOV     D,M
        INX     H
        MOV     C,M
        INX     H
        MOV     B,M
        INX     H
        RET
;
; MOVE FACC TO FXHL SUBROUTINE
;
MAX:    LDA     FACC
        MOV     M,A
        INX     H
        LDA     FACC+1
        MOV     M,A
        INX     H
        LDA     FACC+2
        MOV     M,A
        INX     H
        LDA     FACC+3
        MOV     M,A
        INX     H
        RET
;
;MOVE FXHL TO FACC SUBROUTINE
;
MXA1:   MOV     A,M
        STA     FACC
        INX     H
        MOV     A,M
        STA     FACC+1
        INX     H
        MOV     A,M
        STA     FACC+2
        INX     H
        MOV     A,M
        STA     FACC+3
        INX     H
        RET
;
;EXCHANGE FACC AND BCDE SUBROUTINE
;
MAER:   LXI     H,FACC
;
;EXCHANGE FXHL AND BCDE SUBROUTINE
;
MXER:   MOV     A,E
        MOV     E,M
        MOV     M,A
        INX     H
        MOV     A,D
        MOV     D,M
        MOV     M,A
        INX     H
        MOV     A,C
        MOV     C,M
        MOV     M,A
        INX     H
        MOV     A,B
        MOV     B,M
        MOV     M,A
        INX     H
        RET
;
;FLOATING READ SUBROUTINE
;
;       (HL)=(INPUT ASCII BUFFER ADDRESS)
;       CALL FRD
;       (FACC)=FLOAT((HL))
;
FRD:    MOV     A,M
        CPI     '-'
        PUSH    PSW
        JZ      FRD1
        CPI     '+'
        JZ      FRD1
        DCX     H
FRD1:   XRA     A
        STA     FACC+3
        MOV     B,A
        MOV     D,A
        MOV     E,A
        CMA
        MOV     C,A
FRD2:   CALL    F$O
        JC      FRD10
        CPI     '.'
        JZ      FRD4
        CPI     'E'
        JNZ     FRD5
        CALL    F$O
        PUSH    H
        LXI     H,FRD3
        XTHL
        DCR     D
        CPI     '-'
        RZ
        INR     D
        CPI     '+'
        RZ
        POP     PSW
        DCX     H
FRD3:   CALL    F$O
        JC      FRD11
        INR     D
        JNZ     FRD5
        XRA     A
        SUB     E
        MOV     E,A
        INR     C
FRD4:   INR     C
        JZ      FRD2
FRD5:   PUSH    H
        MOV     A,E
        SUB     B
FRD6:   CP      FRD8
        JP      FRD7
        PUSH    PSW
        LXI     B,8420H
        LXI     D,0
        CALL    MAER
        CALL    FDRA
        POP     PSW
        INR     A
FRD7:   JNZ     FRD6
        POP     D
        POP     PSW
        CZ      FNEG
        XCHG
        RET
FRD8:   RZ
FRD9:   PUSH    PSW
        CALL    F$N
        POP     PSW
        DCR     A
        RET
FRD10:  PUSH    D
        MOV     D,A
        MOV     A,B
        ADC     C
        MOV     B,A
        PUSH    B
        PUSH    H
        PUSH    D
        CALL    F$N
        POP     PSW
        SUI     30H
        CALL    MAS
        CALL    FSG1
        POP     B
        POP     D
        CALL    FARA
        POP     H
        POP     B
        POP     D
        JMP     FRD2
FRD11:  MOV     A,E
        RLC
        RLC
        ADD     E
        RLC
        ADD     M
        SUI     30H
        MOV     E,A
        JMP     FRD3
;
;FLOATING WRITE SUBROUTINE
;
;       (FACC)=(SOURCE DATA)
;       CALL FWR
;       (WRBF)=ASCII(FACC)
;       FACC UNDEFINED
;
FWR:    LXI     H,WRBF
        PUSH    H
        CALL    FSAF
        MVI     M,' '
        JP      FWR1
        MVI     M,'-'
FWR1:   INX     H
        MVI     M,30H
        JZ      FWR12
        PUSH    H
        CM      FNEG
        XRA     A
        PUSH    PSW
        CALL    FWR14
FWR2:   LXI     B,9143H
        LXI     D,4FF8H
        CALL    FCR
        JPO     FWR4
        POP     PSW
        CALL    FRD9
        PUSH    PSW
        JMP     FWR2
FWR3:   CALL    MAR
        LXI     H,0
        SHLD    FACC
        LXI     H,8420H
        SHLD    FACC+2
        CALL    FDRA
        POP     PSW
        INR     A
        PUSH    PSW
        CALL    FWR14
FWR4:   LXI     B,8000H
        MOV     D,C
        MOV     E,C
        CALL    FARA
        INR     A
        CALL    F$J
        CALL    MRA
        LXI     B,0306H
        POP     PSW
        ADD     C
        INR     A
        JM      FWR5
        CPI     8
        JNC     FWR5
        INR     A
        MOV     B,A
        MVI     A,2
FWR5:   DCR     A
        DCR     A
        POP     H
        PUSH    PSW
        LXI     D,FWRC
        DCR     B
        JNZ     FWR6
        MVI     M,'.'
        INX     H
        MVI     M,'0'
        INX     H
FWR6:   DCR     B
        MVI     M,'.'
        JNZ     $+4
        INX     H
        PUSH    B
        PUSH    H
        PUSH    D
        CALL    MAR
        POP     H
        MVI     B,2FH
FWR7:   INR     B
        MOV     A,E
        SUB     M
        MOV     E,A
        INX     H
        MOV     A,D
        SBB     M
        MOV     D,A
        INX     H
        MOV     A,C
        SBB     M
        MOV     C,A
        DCX     H
        DCX     H
        JNC     FWR7
        CALL    F$B
        INX     H
        CALL    MRA
        XCHG
        POP     H
        MOV     M,B
        INX     H
        POP     B
        DCR     C
        JNZ     FWR6
        DCR     B
        JZ      FWR9
FWR8:   DCX     H
        MOV     A,M
        CPI     30H
        JZ      FWR8
        CPI     '.'
        JZ      $+4
        INX     H
FWR9:   POP     PSW
        JZ      FWR13
        MVI     M,'E'
        INX     H
        MVI     M,'+'
        JP      FWR10
        MVI     M,'-'
        CMA
        INR     A
FWR10:  MVI     B,2FH
FWR11:  INR     B
        SUI     10
        JNC     FWR11
        ADI     3AH
        INX     H
        MOV     M,B
FWR12:  INX     H
        MOV     M,A
        INX     H
FWR13:  MOV     M,C
        POP     H
        RET
;
FWR14:  LXI     B,9474H
        LXI     D,23F7H
        CALL    FCR
        POP     H
        JPO     FWR3
        PCHL
;
FWRC:   DB      0A0H,86H,1,10H
        DB      27H,0,0E8H,3
        DB      0,64H,0,0
        DB      0AH,0,0,1
        DB      0,0
;
;
;F$OV SUBROUTINE
;
F$OV:   JMP     MONIT
;
@@@@@   EQU     $-1
;
;RAM    AREA
        ORG     RAM
;
FCON:   DS      2
FACC:   DS      5       ;FLOATING ACCUMULATOR
WRBF:   DS     14       ;OUTPUT ASCII BUFFER (NUMERIC)
ASCBF:  DS     14       ;INPUT ASCII BUFFER (NUMERIC)
FMD$:   DS      4       ;WORKING AREA 
;
RAMNEX  EQU     $       ;NEXT RAM CELL

        END




ARITMETIKA V PEVNÉ ŘÁDOVÉ ČÁRCE

Aritmetika v pevné řádové čárce je prakticky knihovna podprogramů, které umožňují provádět základní aritmetické operace v pevné řádové čárce.

Názvy podprogramů, které tyto operace řeší, jsou uvedeny v následující tabulce:

         OPERACE          NÁZEV PODPROGRAMU
        ------------------------------------
         Sečítání               PLUS
         Odečítáni              DSUB
         Násobení               MUL
         Dělení                 DIV
         Procenta               PROC
         Doplněk                COMP
         Srovnání               EQUAL

         PŘEVODY (v rozsahu 16 bitů)
        ------------------------------------
         BINAR/DEC              BINDE
         DEC/BINAR              DEBIN

Všechny podprogramy knihovny mají přesně definovány své vstupy a výstupy. Vstupem jsot operandy operací, výstupem je potom výsledek. Podprogramy předpokládají vstup a dávají výstup do registrových párů, a to v binárním tvaru.

Aby bylo možno operandy operací zadávat desítkově a stejně tak zobrazovat výsledek, obsahuje knihovna rovněž podprogramy BINDE a DEBIN. Tyto realizují převody v rozsahu 16 bitů z binárního do dekadického tvaru a naopak.

Výše uvedené podprogramy knihovny pracuji s čísly v rozsahu <0 – 65535>. Znaménkový bit není uvažován, všech 16 bitů představuje platná místa. Tyto podprogramy tedy samostatně neřeší aritmetiku v pevné řádové čárce na požadované úrovni - tj s ošetřením znaménka na vstupu i výstupu. Proto byly do knihovny zařazeny také dva podprogramy PRIK1, PRUC2 řešící aritmetiku již s uvedenými požadavky v pevné řádové čárce. V rozsahu <0 - 32767> (15 bitová, 16. bit je uvažován pro znaménko). Oba podprogramy budou popsány později.

Poznámka:

Podprogram pro operace násobení dává výsledek do dvou reg. párů . Podobně podprogram pro dělení předpokládá dělenec ve dvou registrových párech <HLDE> . Je tedy možno při násobeni a následném dělení uchovat všechna platná místa! Jako příklad lze uvést převod "cm" na "palce":

        .
        .
        .
        LHLD 	cm      ; HL = převáděná hodnota 2540 CM
        LXI     B,100   ; *100
        CALL    MUL     ; výsledek HLDE = 254000
        LXI     B,254   ; :254
        CALL    DIV     ; HL = HLDE:BC
        SHLD    palce   ; výsledek v palcích: 1000
        .               ; DE = zbytek

Z příkladu je zřejmé, že rozsah výsledku při násobení a dělence při dělení umožňuje uchování všech platných míst a tím nezkreslení výsledku.

Velkou výhodou "knihovny" je skutečnost, že podprogramy řešící jednotlivé aritmetické operace jsou až na podprogram pro výpočet procent na sobě nezávislé.

Mohou být tedy použity i samostatně (podprogram pro výpočet procent využívá podprogramy násobeni a děleni).

Knihovna je přeložena a umístěna v paměti od adresy 7000. Použitím direktivy ORG ji lze přeložit a pak umístit na libovolné místo paměti. V úvodu, tedy od adresy 7000H, začíná tabulka skoků na jednotlivé podprogramy. Je vhodné si například zadanou knihovnu podprogramů umístit na konec operační paměti a pomocí tabulky skoků se odvolávat na jednotlivé podprogramy - aritmetické operace.


Popis jednotlivých podprogramů knihovny

DEBIN

Provádí převod dekadického čísla na binární. Vstupem je dekadické číslo v rozsahu <0,65535 >. Spodní čtyři řády dekadického čísla vstupuji v reg. páru <HL> . Pátý řád (nejvyšší) pak v registru <A > .

Binární tvar vystupuje v registrovém páru-< HL> . Podprogram mění obsah stavového slova <PSW> '


BINDE

Provádí převod binárního čísla na dekadické. Vstupem je binární číslo v rozsahu 16 bitů uložené v reg. páru <HL>. Výstupem je dekadické číslo v rozsahu <0,65535>. Spodní čtyři řády jsou uloženy do reg. páru <HL> , pátý řád (nejvyšší) je uložen do registru <A> . Podprogram mění obsah stavového slova <PSW>.


COMP

Provádí, dvojkový doplněk obsahu reg. páru <HL>. Mění obsah stavového slova <PSW>.

Mezní hodnoty:     0          výsledek:      0
                   65535                     1
                   1                         65535

PLUS

Provádí součet dvou čísel v binárním tvaru. Oba operandy i výsledek jsou v rozsahu,16 bitů. Vstupní hodnoty jsou v reg. párech <HL> a <BC> . Výsledek je uložen do reg. páru <HL> .

Podprogram mění v obsahu stavového slova <PSW> pouze hodnotu příznaku CY. V případě, že příznak CY = 1, došlo k přetečení.


DSUB

Provádí rozdíl dvou čísel v binárním tvaru.

Vstup:  menšenec v reg. páru <HL>
        menši tel v reg. Páru <DE>
Výstup: rozdíl do reg. páru <HL>

Podprogram mění obsah stavového slova <PSW>

Příznak CY udává vztah mezi menšencem a menšitelem dle následující tabulky:

menšenec > menšitel        CY = 0        Z = 0
menšenec < menšitel        CY = 1        Z = 0
menšenec = menšitel        CY = 0        Z = 1

(v případě rovnosti obou operandů rozhoduje příznak nuly Z).


EQUAL

Provádí porovnáni dvou čísel v binárním tvaru. Porovnané hodnoty jsou v reg. párech <HL> a <DE> . Výsledkem operace je nastaveni příznaků CY, Z dle následující tabulky:

        Z = 1     CY = 0     HL = DE
        Z = 0     CY = 0     HL > DE
        Z = 0     CY = 1     HL < DE

Obsahy reg. párů <HL>, jsou zachovány, mění se obsah stavového slova PSW


MUL

Provádí součin dvou čísel v binárním tvaru. Vstupní hodno ty v rozsahu 16 bitů jsou v reg. párech <HL>, <BC>. Výsledek v rozsahu 32 bitů je dán do 2 reg. párů <HLDE> . Podprogram mění obsah stavového slova <PSW> .


DIV

Provádí podil dvou čišel v binárním tvaru.

Vstup:  dělenec v rozsahu 32 bitů je ve 2 reg. párech <HLDE>
        dělitel v rozsahu 16 bitů je v reg. páru <BC>
Výstup: podil v rozsahu 16 bitů je v reg. páru <HL>
        zbytek v rozsahu 16 bitů je v reg. páru <DE>

Dělení nulou není ošetřováno, dává výsledek 65535. Podprogram mění obsah stavového slova <PSW>.


PROC

Provádí výpočet procentového základu.

Vstup:  procentová část v reg. páru <HL>
        počet procent v reg. páru <BC>
Výstup: procentový základ v reg. Páru<HL>

Podprogram mění obsah stavového slova <PSW>

Poznámka:

  1. Pro počet procent = 0 dává základ = 65535
  2. Při překročeni rozsahu dává základ = 65535


Nyní popíšeme podprogramy PRIK1, PRIK2 představující aritmetiku v pevné řádové čárce v rozsahu 0 - 32767 (15 bitová, 16. bit je uvažován pro znaménko). Oba využívají plně výše popsané podprogramy knihovny.


PRIK1

Je uložen od adresy 7400H. Po spuštěni umožňuje provádět uvedené aritmetické a logické operace.

Operandy a operace se zadávají z klávesnice, výsledek se zobrazí na displeji. Zadání i výstup se provádí v BCD kódu. Vstup cifer operandu i znaménka je realizován službou monitoru CINCR v podprogramu READ.

Operandy se zadávají po znaku ' : 'Nejvíce je možno zadat 5ciferné číslo. Vstup operandu se ukončuje znakem 'SP' (mezera) nebo automaticky po zadání 5. cifry. Operace se zadává po znaku ' - ' dle následující tabulky:

        sčítání .................... +  (SECII)
        odčítání ................... -  (MI)
        násobení ................... *  (NA)
        dělení ..................... :  (DEL)
        procenta ................... %  (PROCC)
        negace...................... N  (NEG)
        srovnáni ................... E  (SROV)

V závorce jsou názvy podprogramů řešící dané operace. Tyto před vyvoláním vlastních podprogramů knihovny provádějí určité předzpracování související s ošetřením znaménka. Výstup znaku znaménka ' - ' (' + ' nevystupuje) a hodnoty výsledku je realizován posloupností příkazů začínajících návěštím EX:, která je aktivována instrukcí RET. Potom je podprogram opět připraven pro další vstup, což oznámí vypsáním znaku ' : ' na obrazovku.


Příklady vstupu:

1. Požadovaná operace:        -2*5
   způsob zadání              :-2
                              :5
výsledek                      -*=-0010

2. Požadovaná operace:        12800:4
   způsob zadání:             :12800
                              :4
   výsledek                   -:=3200

3. Přiklad chybného zadání:
   požadovaná operace:        35000+15
   způsob zadání:             :35000
                              :15
   výsledek                   -+=-2222

   1 . operand zadán mimo rozsah <0 – 32767>. Pak výsledek chybný !

Operace negace 'N ' provádí negování zadaného operandu.


Přiklad:

Požadovaná operace:           Negace   (-75)
zadání:                       :-75
                              :0
                              -n=0075

Prakticky se tedy jedná o změnu znaménka. Negace se provádí pouze z 1. operandu, 2. operand je v tomto případě bezvýznamní.

Zadáním znaku '%' jako operace se provede výpočet procentového základu ze zadané procentové části - 1 . operand a počtu procent - 2. operand.

Přiklad:

Požadovaná operace:           procent, část.  .50
                              počet procent.  .5
                              procent, základ .?
zadáni:                       :50
                              :5
                              -%=1 000

Výsledkem operace SROV je nastaveni příznaků CY, Z. V tomto případě je výstupem hodnota příznaků Z, CY dle registru příznaku (význam BITU; S;Z;0;AC;0;P;1;CY;).

Přiklad:

=0<SP>=10<SP>=0<SP>=10<CR>
Z=1   CY=0

Z toho vyplývá, že operandy jsou shodné.

Výstup se zobrazuje na 4 nebo 6 dekadických míst. Operandy jsou zadávány dekadicky, podprogramy knihovny pracují s binárními; operandy. Převody realizují podprogramy DEBIN a BINDE.

PRIK2

Je uložen od adresy 760CH. Tento podprogram je obdobou PRIK1 v tom smyslu, že řeší operace aritmetiky v pevné řádové čárce v rozsahu <0 - 32767> . Nemá však ošetřeno zadáváni operandu, operace a výstup výsledku.

Operandy a znaménko předpokládá připravené v registrech.

1. operand ..... reg. pár <HL>
2. operand ..... reg. Pár <BC>

(znaménka operandů jsou v 16. bitu, hodnota pak v 15 zbývajících významových bitech).

Znak operace.....reg. <A>

Podobně výstup dává do reg. páru se znaménkem v 16. bitu.

Tento podprogram netvoři samostatný spustitelný celek, jako tomu bylo u PRIK1. Je naopak určen pro využiti jako modul s pevně definovanými vstupy a výstupem.

Poznámka;

Podprogramy PRIK1 a PRIK2 využívají rovněž služeb monitoru (např. CINCR, CO ...). Tabulka použitých služeb je za podprogramem PRIK2.





 SAPI-1
 TESLA ELTOS OBOROVÝ PODNIK DIZ

I-------------------------------------------------------I
I  VÝVOJ: TESIA-ELSTROJ, KÚO, KONCERN ES                I
I VÝROBA: TESLA LIBEREC k. p.                           I
I DODÁVÁ: TESLA ELTOS,                                  I
I        DODAVATELSKO INŽENÝRSKÝ ZÁVOD                  I
I        poštovní schránka 27, pošta 45, 145 00 PRAHA 4 I
I-------------------------------------------------------I

(C) TESIA ELTOS 1985



OBSAH

  1. NÁVOD K PROGRAMU GENCODE
  2. PRINTER - program pro tisk souborů
  3. COPIER - program pro kopírování souborů
  4. OVLADAČ DÁLNOPISU T-100
  5. ARITMETIKA V POHYBLIVÉ ŘÁDOVÉ ČÁRCE
  6. ARITMETIKA V PEVNÉ ŘÁDOVÉ ČÁRCE


ÚVOD | Novinky | 8 Bitů | Příslušenství | Drobnosti | TTL | Kontakt


SAPI-1 | ONDRA | PMI-80 | PMD-85 | klony PMD-85 | PP01 | PETR | PLAN-80A | IQ151


ZPS | Technické prostředky | Programové vybavení | Dokumentace


8 bity / SAPI-1 / Programové vybavení / Dokumentace programů



SAPI.cz - web o československých osmibitech, zejména SAPI-1. Provozuje EC1045 od roku 2011
Za korekce češtiny dekuji: MELSOFTovi, Silliconovi, Martinu Lukáškovi a NOSTALCOMPovi

Když začínám blbnout z 8bitů tak se chodím léčit mezi otaku.
Animefest.cz