ÚVOD | Novinky | 8 Bitů | Příslušenství | Drobnosti | TTL | Kontakt
SAPI-1 | ONDRA | PMI-80 | PMD-85 | klony PMD-85 | klony SM50/40 | PETR | PLAN-80A | IQ151 | TNS | FK-1 | HVĚZDA | SP 830 | PCS 1-QR6000
ZPS | Technické prostředky | Programové vybavení | Dokumentace
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 |
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é!
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.
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:
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:
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 |
| 4303H | 48H | hexadecimálně počet znaků na jeden řádek (48H = 72DEC) |
| 4304H | 48H | hexadecimálně počet řádků (celkem) na stránku |
| 4305H | 4EH | = '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
.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
.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
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
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)
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" 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ů:
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:
| Nastavením řídicích slov: | URES | na | 88H |
| UMODE | 00H | ||
| USTAT | 0DH |
(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:
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=T | CRT+LPR | ||
| C=C | CRT | ||
| C=B | BATCH | (TN:PTR) | |
| (OUT:LPR) | |||
| C=1 | USER | (IN:1) | 0 |
| (OUT: 1) | 1 | ||
| R=T | CRT | ||
| R=P | PTR | ||
| R=1 | USER1 | 2 | |
| R=2 | USER2 | 3 | |
| P=T | CRT | ||
| P=P | PTP | ||
| P=1 | USER1 | 4 | |
| P=2 | USER2 | 5 | |
| L=T | CRT+LPR | ||
| L=C | CTR | ||
| L=L | LPR | ||
| L=1 | USER1 | 6 | |
| console user status | 7 | ||
| memtop | 8 | ||
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.
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é čá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:
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í. | ||
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
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.
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
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, ...
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
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>
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
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)
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 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.
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:
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
ÚVOD | Novinky | 8 Bitů | Příslušenství | Drobnosti | TTL | Kontakt
SAPI-1 | ONDRA | PMI-80 | PMD-85 | klony PMD-85 | klony SM50/40 | PETR | PLAN-80A | IQ151 | TNS | FK-1 | HVĚZDA | SP 830 | PCS 1-QR6000
ZPS | Technické prostředky | Programové vybavení | Dokumentace