Ú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