POPIS PROGRAMU  [ M80.COM ]				strana:01
-----------------------------------------------------------------


#################################################################
######							   ######
######		      MAKROASSEMBLER M80.		   ######
######							   ######
#################################################################


	Makroassembler M80 zpracovává zdrojový text programu  za-
psaného v jazyce symbolických adres (JSA), generuje strojový  kód
v přemístitelném (relativním) tvaru REL, který se dále zpracovává
spojovacím programem L80. Mimo JSA pro 8080 překladač m80 zpraco-
vává i JSA pro Z80. Překladač dále  poskytuje  výpis  přeloženého
programu, který  může  být  vygenerován  tak,  že  z  něj  pomocí
programu CREF80 získáme výpis  opatřený  křížovými odkazy. Zprávy
o chybách se zvěřejňují na konzole a ve výpisu zdrojového textu.


               1. VYVOLÁNÍ A SPUŠTĚNÍ PŘEKLADAČE.
   ----------======================================----------

	Překladač spustíme pomocí příkazu M80, za kterým případně
uvedeme příkazový řetězec. 

	Formát příkazu:

	M80 [cíl][,[výpis]]=zdroj [/p]
nebo
	M80
	*[cíl][,výpis]]=zdroj [/p]

kde značí:

cíl	jednoznačná specifikace cílového přemístitelného souboru,
	implicitní přípona REL
výpis	jednoznačná specifikace souboru výpisu, implicitní přípo-
	na PRN. V případě, že je zadán parametr  /C  dosazuje  se
	CRF.
zdroj	jednoznačná specifikace  zdrojového  souboru,  implicitní
	přípona MAC.
/p	parametr, specifikující činnost překladače:

/C	Požadavek  na  vytvoření  souboru  výpisu  pro generování
	křížových odkazů programem CRE80. Tento soubor  bude  mít
	příponu CRF a nahradí normální soubor výpisu. Soubor  ob-
	sahuje znaky, které nelze tisknout. Lze ho umístit  pouze
	na disk. Zadáme-li /C a /L současně, má /C přednost.

/I	Překladač bude zpracovávat instrukce pro 8080.

/L	Požadavek na vytvoření souboru výpisu.

/O	Výpis programu bude v osmičkové soustavě.

/R	Požadavek na  vytvoření  cílového  souboru  se  strojovým
	kódem v přemístitelném tvaru.

/Z	Překladač bude zpracovávat instrukce pro Z80.

POPIS PROGRAMU  [ M80.COM ]				strana:02
------------------------------------------------------------------

Příklady:

*=MZDY		Bude se překládat zdrojový soubor MZDY.MAC a bude
		se generovat cílový soubor MZDY.REL. Soubor výpi-
		su nebude. 

*,=MZDY		Překlad zdroj.souboru MZDY.MAC. Cílový ani soubor
		výpisu nebudou. Budou se vypisovat chyby na CRT:

*MZDY,MZDY=MZDY Překlad zdroj. souboru  MZDY.MAC,  cílový  soubor
		bude  vystupovat pod jménem MZDY.REL a soubor vý-
		pisu pod jménem MZDY.PRN.

*CIL,VYPIS=MZDY Překlad zdroj. souboru  MZDY.MAC,  cílový  soubor
		bude vystupovat pod jménem CIL.REL a soubor výpi-
		su pod jménem VYPIS.PRN.

*,LST:=B:MZDY	Překlad  zdroj.souboru  MZDY.MAC,  umístěného  na
		disku B. Výpis půjde na	tiskárnu.

*=MZDY/L/O	Přehled  souboru  MZDY.MAC,  generování  cílového
		kódu do MZDY.REL a výpisu  do  souboru  MZDY.PRN.
		Výpis bude v osmičkové soustavě.

*MZDY.OBJ,MZDY.LST=MZDY.SRC
		Překlad zdrojového souboru MZDY.SRC,  cílový  kód
		se generuje do souboru MZDY.OBJ a výpis do soubo-
		ru MZDY.LST.


                        2.CHYBOVÁ HLÁŠENÍ.
           ----------========================----------

	Chyby odhalené ve zdrojovém textu jsou zveřejňovány  jako
jednoznakové kódy chyb na okraji řádku  výpisu,  ve  kterém  byla
chyba odhalena. Tyto chybové řádky vystupují též na konzolu. Dále
na konzolu vystupují zprávy o průběhu překladu.

2.1. Jednoznakové kódy chyb:
============================

A	Chyba argumentu.
	Argument direktivy má nesprávný tvar nebo je mimo přípus-
	tný rozsah. (Např.: .PAGE 1, .RADIX 1, .PUBLIC 2).

C	Chyba v konstrukci podmíněných bloků.
	Např. ELSE bez IF, ENDIF bez IF, nebo dvě ELSE pro  jedno
        IF ap.  

D	Odkaz na vícenásobně definované jméno.

E	Chyba vnějšího symbolu.
	Nesprávné použití vnějších  symbolů.  (Např.:  UDOBI  SET
	TYDEN##, LXI H,2-MESIC##).

M	Vícenásobně definované jméno.

POPIS PROGRAMU  [ M80.COM ]				strana:03
-----------------------------------------------------------------


N	Chyba v číselné konstantě.
	Např.: použitá číslice neodpovídá zvolené soustavě (9Q).

O	Chybný typ operace nebo chybná syntaxe.
	Např.: ENDM, LOCAL mimo tělo makroinstrukce; SET, EQU ne-
	bo MACRO bez jména, chybná syntaxe ve výrazu (závorky  či
	apostrofy si neodpovídají ap.).

P	Chyba průchodu.
	Hodnota návěští nebo jména definovaná pomocí EQU  je  při
	druhém průchodu jiná než při prvním průchodu.

Q	Problematická chyba.
	Může jít o nesprávně ukončené operandové  pole  (např.MOV
	A,C). Jedná se o upozornění.

R	Chyba přemístitelnosti.
	Nesprávné použití relativních prvků ve  výrazech.  (Rela-
	tivní hodnotu mají jména příslušející do  přemístitelných
	úseků dat, kódu a oblastí COMMON).

U	Nedefinované jméno.
	Použité jméno není definované.

V	Chyba hodnoty.
	V prvním průchodu v direktivě, která předpokládá  defino-
	vanou hodnotu, bylo použito  nedefinované  jméno.  (Např.
	direktivy .RADIX, PAGE, DE, IF, IFE  atd.).  Jestliže  je
	jméno definováno dále v programu, chyba U není ve 2. prů-
	chodu hlášena.

2.2. Zprávy o průběhu překladu.
===============================

	NO END STATEMENT ENCOUNTERED ON INPUT FILE

	Chybí příkaz END nebo se nenalezl pro chybně konstruovaný
podmíněný blok, neukončený opakovací blok nebo definici  makroin-
strukce.

	UNTERMINATED CONDITIONAL

	Nejméně jeden podmíněný blok nebyl ukončen do konce zdro-
jového textu.

	UNTERMINATED REPT/IRP/MACRO

	Nejméně jeden opakovací blok nebo definice makroinstrukce
nebyly ukončeny do konce zdrojového textu.

	NO (nebo číslo1) FATAL ERROR (S)   [,číslo2 WARNINGS]

	Tato zpráva se zveřejňuje na konci  překladu  na  konzole
a je umísťována i do souboru výpisu (pokud je vytvářen).

	číslo1  -  počet chyb
	číslo2  -  počet upozornění

POPIS PROGRAMU  [ M80.COM ]				strana:04
-----------------------------------------------------------------


	?COMMAND ERROR

	Chyba v příkazu. Neznámý parametr.

	?FILE NOT FOUND

	Nenašel se vstupní soubor.

	?CAN'T ENTER FILE

	Nelze založit výstupní soubor. Např. málo místa na  disku
nebo v adresáři.


                 3.SOUBORY POUŽÍVANÉ PŘEKLADAČEM.
    ----------======================================----------

3.1. Zdrojový soubor.
=====================

	Zdrojový soubor obsahuje jednotlivé příkazy  JSA  zapsané
v kódu ASCII. Zdrojový text by měl být zakončen  direktivou  END.
Zdrojové řádky mohou mít délku maximálně 132 znaků.
	Překladač M80 akceptuje malá  písmena,  vnitřně  je  však
(mimo znakové konstanty) převádí na velká. Ve výpisu se objeví ta
písmena, která byla použita ve zdrojovém textu.
	Pokud chceme používat ve zdrojovém souboru  čísla  řádků,
musí mít každá slabika čísla nejvyšší bit nastavený na jedničku.
	Pomocí direktivy INCLUDE je možné dočasně přepnout  vstup
zdrojového textu z hlavního zdrojového souboru na vedlejší.

3.2. Cílový soubor.
===================

	Cílový soubor generovaný překladačem M80 obsahuje strojo-
vý kód 8080 (přípustně i Z80) ve tvaru, ve  kterém  jsou  všechny
hodnoty závislé na umístěny vztaženy k začátkům jednotlivých úse-
ků (úsek kódu CSEG, úsek dat DSEG a úseky COMMON). Na této úrovni
je tak zajištěna  přemístitelnost  jednotlivých  modulů.  Spojení
jednotlivých modulů do jednoho celku, přepočítání všech  relativ-
ních hodnot podle konkrétního umístění jednotlivých modulů zajiš-
ťuje spojovací program L80.

3.3. Soubor výpisu.
===================

	V případě, že nezadáme parametr /C, vytváří se běžný tis-
kový soubor s implicitní příponou PRN. Tento soubor je možné smě-
rovat přímo na tiskárnu či  konzolu,  případně  umístit  na  disk
a vytisknout jej později.

	Jestliže  zadáme  parametr /C, vytváří se soubor s impli-
citní příponou CRF, který mimo normálního výpisu obsahuje služeb-
ní informace pro program CREF80. Tento soubor není určen k tisku,
slouží jako vstup pro program CREF80, který doplní výpis programu
tabulkou křížových odkazů a jednotlivé řádky opatří čísly.

POPIS PROGRAMU  [ M80.COM ]				strana:05
-----------------------------------------------------------------


	Výpis je stránkován, první dva řádky stránky mají  násle-
dující tvar:

	[ text1 ]	M80	verze	PAGE	x  [-y]
	[ text2 ]

kde značí:

text1	titulek zadaný direktivou TITLE
text2	podtitulek zadaný direktivou SUBTIL
verze	verzi překladače M80
x	číslo stránky, které je zvyšováno pouze v případě, že  se
	ve zdrojovém textu nalezne znak stránkování (FF=0CH). Při
	tisku tabulky jmen vystupuje na tomto místě znak S
y	číslo stránky, které je zvyšováno při přechodu  na  novou
	stránku z důvodu zaplnění stránky nebo při zpracování di-
	rektivy PAGE.

	Výpis překladu strojové instrukce má následující tvar:

	[nnnn]	[e]	aaaam	xx  yy   [C]  [+]  zdrojový řádek

kde značí:

nnnn	číslo řádku připojené  programem  CREF80  při  generování
	křížových odkazů (parametr /C)
e	kód chyby odhalené ve zdrojovém řádku
aaaa	ukládací adresa generovaného kódu
m	indikace úseku, do kterého předchozí hodnota přísluší:
	'	relativní kódový úsek      (CSEG)
	"	relativní datový úsek      (DSEG)
	!	relativní úsek             COMMAND
	mezera	absolutní úsek             (ASEG)
	*	vnější adresa 		   (EXTRN)
xx	strojový kód operace
yy	hodnota 2.slabiky instrukce  u  dvouslabičných  instrukcí
  	nebo hodnota 2. a 3. slabiky u  tříslabičných  instrukcí.
	V případě vnější hodnoty (EXTRN) zde vystupuje posun této
	hodnoty
C	příznak, že řádek pochází z rozvoje  makroinstrukce  nebo
	opakovacího bloku
+	příznak, že řádek pochází z rozvoje  makroinstrukce  nebo
	opakovacího bloku

	V případě, že zadáme parametr /O, jsou hodnotu aaaa,  xx,
yy zveřejňovány osmičkově. Implicitně jsou zveřejňovány hexadeci-
málně.

	Hodnoty zadané v direktivě DEFB jsou ve výpisu  zveřejňo-
vány po slabikách (maximálně 4 slabiky na řádek, zbývající slabi-
ky hodnoty). Za hodnotou je uveden příznak úseku, do kterého hod-
nota patří.

POPIS PROGRAMU  [ M80.COM ]				strana:06
-----------------------------------------------------------------


Tabulka jmen.
-------------

	Na závěr výpisu  vystupuje  tabulka  jmen.  V první části
uvedené hlavičkou:

	MACROS:
	programem CREF80
#	příznak, že jméno bylo na řádku definováno


              4. JAZYK ZPRACOVÁVANÝ PŘEKLADAČEM M80.
 ----------============================================----------

	Dále je uveden přehled jazyka  symbolických  adres  (JSA)
zpracovávaný překladačem M80.

4.1. Formát příkazů ve zdrojovém souboru.
=========================================

	Zdrojový soubor představuje posloupnost příkazů ve tvaru:

[návěští:] [:] [operace]   [operandy]  [;komentář]

	Jednotlivá pole příkazu nejsou povinná, operandy však mu-
sí odpovídat operaci. Dále platí zásada: jeden řádek = jeden pří-
kaz! Příkazy nemusí začínat v 1.pozici řádku.  Mezi  jednotlivými
poli příkazu je možné  pro  zvýšení  čitelnosti  používat  mezery
a tabulátory.

návěští	jméno, které slouží  k  označení  místa  programu.  Během
	překladu  získává  návěští  hodnotu,  která   představuje
	adresu paměti, na kterou je  označený  příkaz  překládán.
	Návěští musí být zakončeno  dvojtečkou.  Je-li  zakončeno
	dvěma dvojtečkami, je návěští označeno jako veřejné (viz.
	direktivy PUBLIC, GLOBAL).

operace	jméno nebo výraz, které jsou rozpoznávány v  následujícím
	pořadí:
	- jméno makroinstrukce (volání makroinstrukce)
	- jméno strojové instrukce 8080 nebo Z80
	- jméno direktivy
	- výraz

	Pokud se v poli operace vyskytne výraz, překladač nahlásí
	chybu, ale chápe jej jako by šlo o operand direktivy DEFB.

ope-	standartní jména registrů, konstanty, výrazy   vyhodnoco-
randy	vané během překladu. Typ a hodnota operandu musí  odpoví-
	dat zadané operaci.

ko-	text, který je při překladu ignorován, ve výpisu se  však
mentář	objeví. Slouží  k  dokumentačním  účelům.  Komentář  musí
	začínat znakem ";" (středník). Pro rozsáhlejší  komentáře
	je možné použít direktivu .COMMENT.

POPIS PROGRAMU  [ M80.COM ]				strana:07
-----------------------------------------------------------------


4.2. Zápis operandů.
====================

Standartní rezervovaná jména:
-----------------------------

	Rezervovaná jména, jsou jména, jejichž význam  a  hodnota
jsou pevně zabudovány v přakladači. Jsou  to  označení  registrů,
index registrů, ukazatele zásobníku a ukazatele běhu programu:

Počítadlo adres $.
------------------

	Znak "$" (dolar) se používá jako symbol zastupující  hod-
notu počítadla adres právě překládaného úseku (ASEG, DSEG,  CSEG,
COMMON). Ve strojových instrukcích ukazuje na začátek právě  pře-
kládané instrukce. Dolar použitý uvnitř jmen  však  výše  uvedený
význam nemá.

Jména definovaná uživatelem.
----------------------------

	Uživatel může pro své účely definovat jména jako  návěští
nebo pomocí direktivy EQU nebo SET. Jestliže je jméno  definováno
pomocí direktivy SET, lze jej touto direktivou předefinovat.

	Jména mohou být libovolně dlouhá, významných je však pou-
ze prvních 6 znaků. Jméno nesmí začínat číslicí. Ve jménech  jsou
přípustné následující znaky: 

	- písmena A až Z
	- číslice 0 až 9
	- speciální znaky ("$", ".", "?", "@" a "_")

	Jména v průběhu  překladu  získávají  hodnotu  a  atribut
příslušnosti k některému z úseků (ASEG, CSEG, DSEG, COMMON), pří-
padně může jít o jméno vnější (EXTERNAL) nebo jméno nedefinované.

Vnější jména.
-------------

	Jsou jména, která jsou v daném modulu používána,  defino-
vána jsou však v modulu  jiném,  kde  jsou  zároveň  označena  za
veřejná. K označení vnějších jmen se používá direktiva (EXTERNAL),
případně je možné uvést v operandovém poli za jméno znaky ##.

Veřejná jména.
--------------

	Jsou jména, jejichž hodnota a příslušnost jsou  zveřejňo-
vány mimo daný modul, takže je možné se na ně odvolávat z  jiných
modulů jako na vnější jména. K označení veřejných jmen se  použí-
vají direktivy (PUBLIC a GLOBAL), nebo dvě dvojtečky za návěštím.

POPIS PROGRAMU  [ M80.COM ]				strana:08
-----------------------------------------------------------------


Nedefinovaná jména.
-------------------

	Jsou jména, která nebyla v daném  modulu  definována  ani
označena za vnější.

Pevná jména.
------------

	Jsou jména definovaná jako náveští nebo pomocí  direktivy
EQU. Nelze je předefinovat.

Proměnná jména.
---------------

	Jsou jména definovaná direktivou SET. Pomocí této  direk-
tivy je lze předefinovat.

Číselné konstanty.
------------------

	Implicitní  číselnou  soustavou  je  soustava  desítková.
Implicitní soustavu  je  možné  změnit  pomocí  direktivy  .RADIX
zadáním nového základu, který se může pohybovat od 2 do 16.  Jes-
tliže je základ větší než 10, jako číslice následující za  devít-
kou se používají písmena A až F. Číselná konstanta  musí  začínat
číslicí 0 až 9.

	Číselné  konstanty  představují  16  bitové  hodnoty  bez
znaménka. Vyhodnocují se v právě  platné  číselné  soustavě.  Bez
ohledu na platnou číselnou soustavu je  možné  zapisovat  číselné
konstanty v jiných soustavách s pomocí indikátoru soustavy. Indi-
kátor soustavy se uvádí za číslem (mimo indikátoru X). V  případě
indikátoru X se uvádí hexadecimální číslo jako  řetězec  uzavřený
v apostrofech za indikátorem.

Indikátor	Základ	     Soustava	   Příklad :
----------------------------------------------------
    B		  2	     binární        1011B
    O		  8	     oktálová       134O
    Q		  8	     oktálová       376Q
    D		 10	     dekadická      255D
    H		 16	     hexadecimální  0BDH
    X		 16	     hexadecimální  X'AF'
----------------------------------------------------

	Přetečení  hodnoty přes 16 bitů je  ignorováno, výsledkem
je 16 nižších bitů.

Znakové konstanty.
------------------

	Za znakové konstanty považujeme  znakové  řetězce o délce
jednoho nebo dvou znaků použitých ve výrazech. Znakové  konstanty
se uzavírají do uvozovek nebo do apostrofů a platí pro ně  stejná
pravidla jako pro znakové řetězce.

POPIS PROGRAMU  [ M80.COM ]				strana:09
-----------------------------------------------------------------


	Znaková hodnota sestávající z jednoho  znaku  má  hodnotu
rovnou ASCII hodnotě tohoto znaku. To znamená, že  vyšší  slabika
má hodnotu nula a nižší slabika  obsahuje  ASCII  hodnotu  znaku.

Např. hodnota konstanty "A" = 'A' = 41H = 65D.

	Hodnotu znakové konstanty sestávající ze dvou znaků tvoří
ASCII hodnota prvního znaku ve  vyšší  slabice  a  ASCII  hodnota
druhého znaku ve slabice nižší.

Např. hodnota znakové konstanty "AB" je 41H*256+42H.

	V případě direktivy DEFW jde vždy  o  znakové  konstanty.
Z těchto důvodů  například  následující  dvě  direktivy  ukládají
ASCII hodnoty zadaných znaků vzájemně v opačném pořadí.

	DEFB "AB"   generuje kód 41H 42H
	DEFW "AB"   generuje kód 42H 41H

Znakové řetězce.
----------------

	Znakový řetězec sestává z posloupnosti znaků ASCII  uzav-
řené apostrofy nebo uvozovkami. Omezující  znaky  (apostrof  nebo
uvozovky) použité uvnitř řetězce se musí zdvojit.  Hodnoty  znaků
ASCII se ukládají do paměti v pořadí rostoucích adres. V případě,
že v řetězci neuvedeme žádné znaky, jedná se o prázdný řetězec.

4.3. Výrazy.
============

	Na místech operandů, kde  se  předpokládají  hodnoty,  je
možné použít výrazy vyhodnocované  během  překladu.  Výrazy  jsou
kombinací jmen a konstant spojených mezi sebou operátory.  Obecně
je možné považovat za výraz i samostatné jméno nebo konstantu.

	Překladač M80 připouští následující operace:

X+Y		aritmetický součet X a Y
X-Y		aritmetický rozdíl X a Y
-X		unární mínus (0-X)
+X		unární plus (0+X)
XxY		násobení X a Y
X/Y		celočíselné dělění X a Y
X MOD Y		zbytek po X/Y
LOW X		nižší slabika hodnoty X
HIGH X		vyšší slabika hodnoty X
X SHL Y		posun X o Y bitů vlevo, zprava se natahují nuly
X SHR Y		posun X o Y bitů vpravo, zleva se natahují nuly
NOT X		logická negace X (změna všech 0 na 1 a naopak)
X AND Y		logický součin (log. i)
X OR Y		logický součet (log. nebo)
X XOR Y		nonekvivalence (vylučující nebo součet modulo 2)
X EQ Y		je-li X=Y, výsledek je TRUE
X NE Y		je-li X<>Y, výsledek je TRUE

POPIS PROGRAMU  [ M80.COM ]				strana:10
-----------------------------------------------------------------

X LT Y		je-li X<Y, výsledek je TRUE
X LE Y		je-li X<=Y, výsledek je TRUE
X GT Y		je-li X>Y, výsledek je TRUE
X GE Y		je-li X>=Y, výsledek je TRUE
NUL X		je-li parametr X prázdný, výsledek je TRUE

	Aritmetické operace se provádějí na plném  rozsahu  16-ti
bitů bez znaménka. Logické operace se provádějí nezávisle po jed-
notlivých bitech na všech 16-ti bitech hodnoty.  Relační  operace
dávají hodnoty typu TRUE - FALSE (pravdivý - nepravdivý). Jestli-
že je relace pravdivá, jsou výsledkem samé jedničky. Je-li relace
nepravdivá, jsou výsledkem samé nuly. Jestliže u  operátorů  HIGH
nebo LOW použijeme relativní hodnotu, chápe se jako absolutní.

	Výrazy se vyhodnocují zleva doprava s přihlédnutím k pri-
oritě  jednotlivých  oparátorů.  Pořadí  vyhodnocování  je  možné
změnit pomocí závorek. Pořadí operátorů podle klesající  priority
je následující:

1.	NUL
2.	LOW	HIGH
3.	x	/	MOD	SHR	SHL
4.	+(unární)	-(unární)
5.	+		-
6.	EQ	NE	LT	LE	GT	GE
7.	NOT
8.	AND
9.	OR	XOR

	Operátory na stejném řádku mají stejnou prioritu.  Operá-
tory ve tvaru jmen (např. NOT, MOD, atd.) musí  být  od  operandů
odděleny minimálně jednou mezerou nebo tabelátorem.

Výrazy se jmény z různých úseků.
--------------------------------

	Jména použitá v  operandech  mohou  příslušet  k  jednomu
z následujících úseků:

	- absolutní úsek (ASEG)
	- relativní datový úsek (DSEG)
	- relativní kódový úsek (CSEG)
	- několik relatvních úseků COMMON.

Příslušnost jména k úseku je dána tím, že jméno je v daném  úseku
definováno. 

	Počet úseků  COMMON  je  dán  počtem  použitých  direktiv
COMMON s různým jménem. Různě pojmenované bloky COMMON představu-
jí různé úseky.

	Konstanty se chápou tak, jako by  příslušely  absolutnímu
úseku.

	Pro všechny operace mimo sčítání a odčítání musí operandy
příslušet k absolutnímu úseku.

POPIS PROGRAMU  [ M80.COM ]				strana:11
-----------------------------------------------------------------

Pro sčítání platí:
------------------
	- alespoň jeden operand musí být absolutní	
	- je-li jeden operand relativní, je příslušnost  výsledku
	  dána příslušností relativního operandu
	- jsou-li oba operandy absolutní, je výsledek absolutní

Pro odčítání platí:
-------------------
	- jestliže přísluší oba operandy ke  stejnému  úseku,  je
	  výsledek absolutní
	- jestliže operandy přísluší k různým úsekům, pak  menši-
	  tel musí být absolutní. Výsledek potom přísluší k úseku
	  menšence.

	Každý vnitřní krok při vyhodnocování výrazů musí  odpoví-
dat výše uvdeným pravidlům. Například, jestliže ALFA, BETA a GAMA
přísluší do programového relativního úseku, potom výraz:

	ALFA + BETA - GAMA

je chybný a překladač ohlásí chybu  R,  protože  v  prvním  kroku
ALFA + BETA se sčítají dvě relativní hodnoty. Tento problém  může
být vyřešen použitím závorek:

	ALFA + (BETA - GAMA)

Tento výraz je již přípustný, protože  BETA  -  GAMA  představuje
absolutní hodnotu, která se má přičíst k relativní hodnotě ALFA.

Výrazy s vnějšími jmény.
------------------------

	Vnější jména  (EXTERNAL)  reprezentují  vždy  hodnotu  na
16-ti bitech. Vnější jména reprezentující jednu slabiku překladač
M80 negeneruje. Pro použití vnějších jmen ve výrazech  platí  ná-
sledující pravidla:

	- vnější jména jsou přípustná pouze v  operacích  sčítání
	  a odčítání
	- jestliže použijeme ve  výrazu  vnější  jméno,  výsledek
	  představuje vždy vnější hodnotu
	- v případě operace sčítání může být pouze  jeden operand
	  vnější
	- v případě operace  odčítání  může  mít  vnější  hodnotu
	  pouze menšenec

4.4. Řízení počítadla adres.
============================

	Překladač M80 umožňuje členit program na úseky, pro které
udržuje samostatná počítadla adres. Jedná se následující úseky:

	- kódový relativní úsek CSEG (pro případné umístění v pa-
	  měti typu ROM)
	- datový relativní úsek DSEG
	- datové relativní úseky COMMON
	- absolutní úsek ASEG (úsek s pevným  umístěním  již  při
	  překladu)

POPIS PROGRAMU  [ M80.COM ]				strana:12
-----------------------------------------------------------------

	Jednotlivé úseky se  zahajují  uvedením  direktivy  CSEG,
DSEG, ASEG nebo COMMON a ukončují se uvedením direktivy zahajují-
cí jiný úsek. Při prvním uvedení příslušné direktivy se počítadlo
adres nuluje (při ASEG na absolutní nulu, jinak  relativní).  Při
dalším uvedení direktivy CSEG, DSEG  nebo  ASEG  se  úsek  otevře
jakoby na pokračování a počítadlo adres se  nastaví  na  hodnotu,
jakou mělo při opuštění úseku. V případě direktivy COMMON se úsek
otevírá vždy od začátku, počítadlo adres se tedy  nastavuje  vždy
na relativní nulu v daném úseku COMMON.

	Implicitně překladač předpokládá kódový  relativní  úsek.
To znamená, že překlad začíná jakoby prvním příkazem ve zdrojovém
textu byla direktiva CSEG. Počítadlo adres se nastaví na nulu re-
lativního kódového úseku. Všechny následující příkazy (instrukce,
konstanty, data) jsou překládány  do  tohoto  úseku  a  počítadlo
adres se postupně vyvíjí v rámci tohoto úseku dokud  se  neobjeví
direktiva ASEG, DSEG nebo COMMON.  Například  jestliže  překladač
narazí na direktivu DSEG, umístí do  aktuálního  počítadla  adres
relativní nulu datového úseku DSEG. Následující kód je  překládán
do relativníhí datového úseku. Jestliže  nyní  překladač  nalezne
direktivu CSEG, umístí do počítadla adres adresu první volné sla-
biky v kódovém úseku.

	Jestliže potřebujeme nastavit  počítadlo  adres  v  rámci
daného úseku na patřičnou hodnotu, použijeme  direktivu  ORG,  ve
které specifikujeme požadovanou hodnotu počítadla adres.

	Pomocí direktivy DEFS je možné v rámci běžného úseku  re-
zervovat požadovaný počet slabik. Direktiva  DEFS  se  zpracovává
tak, že překladač přičítá zadanou hodnotu k počítadlu adres.

	Pomocí direktivy .PHASE a .DEPHASE je možné do úseku  za-
řadit posloupnost příkazů, která se bude překládat  s  absolutním
počítadlem adres nastaveným direktivou .PHASE, ale  umísťovat  se
bude do právě překládaného úseku.  Takto  získaný  kód  je  ovšem
třeba před provedením přemístit na adresu uvedenou v této  direk-
tivě.

	Spojovací program L80 implicitně umísťuje spojené  moduly
od adres 103H, přičemž v rámci každého modulu úsek DSEG  předchá-
zí úsek CSEG. Úseky COMMON se ukládají před úsekem DSEG  v  rámci
modulu, ve kterém  se  poprvé  vyskytly  v  pořadí,  v  jakém  se
nacházejí ve zdrojovém modulu. Úseky COMMON stejného jména z růz-
ných modulů se vzájemně  překrývají.  Umístění  celého  programu,
případně datových úseků DSEG či COMMON je možné  zadat  parametry
spojovacího programu /P a /D.

	Pokud uživatel implicitně nevyžaduje umístění  kódu  nebo
dat na adresy 100H až 102H (např. pomocí ASEG, nebo parametry  /P
či /D), spojovací program umístí na tyto adresy skok na startova-
cí adresu. Pokud startovací adresa není zadána, spojovací program
na těchto adresách pouze rezervuje místo.

POPIS PROGRAMU  [ M80.COM ]				strana:13
-----------------------------------------------------------------

	Spojovací  program  L80  umísťuje  do  slova   označeného
veřejným jménem $MEMRY adresu první volné slabiky  za  programem.
To umožňuje využít tuto adresu v programu  pro  umístění  různých
polí, vyrovnávacích pamětí apod. Chce-li programátor tuto možnost
využít, musí v programu rezervovat  jedno  slovo  a  označit  jej
veřejným návěštím $MEMRY, například:

		PUBLIC	$MEMRY
	$MEMRY	DS	2

4.5. Modulární programování.
============================

	Schopnost vytvářet přemístitelné moduly patří mezi hlavní
přednosti překladače M80. Rozdělení programu do  několika  modulů
zrychluje kódování, ladění, testování, usnadňuje  provádění  změn
a umožňuje rozdělit práce na rozsáhlých úkolech mezi více pracov-
níků. 

	Vazby mezi jednotlivými moduly jsou realizovány prostřed-
nictvím vnějších a veřejných jmen. Vlastní propojení jednotlivých
modulů zajišťuje spojovací program L80.

	Veřejná jména se definují pomocí direktiv GLOBAL,  PUBLIC
(synonyma) nebo zdvojením dvojtečky při definici návěští. Hodnota
a význam takto definovaného jména se  zveřejní  mimo  daný  modul
(tzn. jméno a jeho  hodnota  se  stane  součástí  přemístitelného
modulu REL).

	Vnější jména se definují pomocí direktivy  EXTERNAL  nebo
uvedením zdvojeného znaku # za  jménem  v  poli  operandů.  Místo
použití takového jména je potom označeno v přemístitelném  modulu
REL tak, že spojovací program doplní hodnotu jména, které u jiné-
ho modulu nalezl jako veřejné.

	Překladač M80 umožňuje předat  spojovacímu  programu  L80
jména souborů, ve kterých má hledat nedefinovaná globální  jména.
Program  zadává  tato  jména  souborů  prostřednictvím  direktivy
.REQUEST.

	Dále umožňuje překladač M80 přepnout vstup ze  zdrojového
souboru na jiný (tzv.  vložený)  zdrojový  soubor.  Po  vyčerpání
vloženého souboru se překladač obrátí zpět  na  původní  zdrojový
soubor. Toto zajišťuje direktiva INCLUDE, ve které se specifikuje
jméno nového  zdrojového  souboru.  Vložený  zdrojový  soubor  je
vhodný zvláště pro definice  makroinstrukcí,  nastavení  podmínek
pro podmíněný překlad apod.

	Zdrojový modul se ukončuje direktivou END,  ve  které  je
možné zadat startovací adresu programu.

	Jméno modulu je možné zadat pomocí direktivy NAME, popří-
padě TITLE. Jinak se bere ze jména zdrojového souboru.

POPIS PROGRAMU  [ M80.COM ]				strana:14
-----------------------------------------------------------------

4.6. Definování jmen.
=====================

	Pro definování jmen slouží následující prostředky:

	- direktiva EQU přiřazující nezměnitelně hodnotu zadaného
	  výrazu
	- direktiva SET přiřazující hodnotu zadaného výrazu, jmé-
	  no takto definované lze direktivou SET předefinovat
	- návěští zakončené jednou dvojtečkou, přiřazující hodno-
	  tu počítadla adres
	- návěští zakončené dvěma dvojtečkami, přiřazující hodno-
	  tu počítadla adres a jméno definuje jako veřejné.

4.7. Definování konstant v paměti.
==================================

	Pro umístění  zvolených hodnot do paměťových míst v rámci
programu slouží tyto prostředky:

	- direktiva DEFB pro slabiky
	- direktiva DEFW pro slova
	- direktiva DEFM pro znakové řetězce
	- nepozná-li se typ operace je výraz považován za operand
	  direktivy DEFB

4.8. Podmíněný překlad.
=======================

	Technika podmíněného překladu umožňuje použít jeden zdro-
jový text pro různé varianty programu. Na začátku zdrojového tex-
tu se např. pomocí  direktivy  SET  nastaví  příslušné  podmínky,
které  se  pak  uvnitř  zdrojového  textu  testují   podmínkovými
direktivami. Na základě výsledků těchto testů se do překladu  za-
řazují nebo se  z  něj  vypouštějí  podmíněně  překládané  bloky.
Technika podmíněného překladu se také často používá v  definicích
makroinstrukcí, kde umožňuje generovat různé rozvoje makroinstruk- 
cí podle zadaných skutečných parametrů.

	Podmíněný překládaný blok se zahajuje  direktivou typu IF
a končí direktivou ENDIF. Uvnitř podmíněného bloku může být  pou-
žita jedna  direktiva ELSE. Ta způsobí, že podmínka  zadaná v zá-
hlaví bloku v direktivě IF se chápe nadále v opačném smyslu.  Di-
rektiva ELSE není povinná.

	Překladač zpracovává následující direktivy IF:

direktiva		podmínka splněna, je-li
-----------------------------------------------------------
IF      výraz		výraz <> 0
IFT     výraz		výraz <> 0
IFE     výraz		výraz =  0
IFF     výraz		výraz =  0
IF1			první průchod překladu
IF2			druhý průchod překladu
IFB     parametr	parametr prázdný
IFNB    parametr	parametr neprázdný
IFDEF   jméno		jméno definováno (nebo vnější)
IFENDEF jméno		jméno nedefinováno (ani neni vnější)

POPIS PROGRAMU  [ M80.COM ]				strana:15
-----------------------------------------------------------------

4.9. Řízení výpisu.
===================

	Obsah a tvar výpisu je možné řídit  následujícími  direk-
tivami:

TITLE	text		titulek stránky
$TITLE	('text')	titulek stránky
SUBTIL	text		podtitulek stránky
PAGE	[výraz]		zadání počtu řádků na stránce nebo
			přechod na novou stránku
*EJECT			přechod na novou stránku
.XLIST			potlačení výpisu
.LIST			obnovení výpisu
.XCREF			potlačení křížových odkazů
.CREF			obnovení křížových odkazů
.LALL  \		řízení
.SALL   -		   výpisu rozvoje
.XALL  /			makroinstrukce
.COMMENT		vložení komentářového bloku
.PRINTX			výpis zprávy na konzolu během překladu

4.10. Výběr množiny překládaných instrukcí.
===========================================

	Překladač M80 je schopen překládat  symbolické  vyjádření
strojových instrukcí mikroprocesoru 8080 nebo mikroprocesoru Z80.
Výběr jedné z možností je  dán  při  spuštění  překladače  volbou
parametru /I nebo /Z. Dále jeden z těchto režimů je  možné  volit
i uvnitř zdrojového textu direktivami:

.8080		nastavení režimu pro 8080
.Z80		nastavení režimu pro Z80

4.11. Direktivy pro Z80.
========================

	Překladač M80 zpracovává direktivy Z80 bez ohledu na  to,
zda je nastaven režim Z80 nebo režim 8080. Jedná se o následující
direktivy:

Z80		Ekvivalent		Význam
------------------------------------------------------------------
COND		IF, IFT			Zahájení podmín. bloku
ENDC		ENDIF			Zakončení podmín. bloku
*EJECT		PAGE, $EJECT		Přechod na novou stránku
DEFB		DB			Definice slabiky
DEFS		DS			Rezervace místa paměti
DEFW		DW			Definice slova
DEFM		DB			Definice řetězce znaků
DEFL		SET			Předefinovatelná def.
GLOBAL		PUBLIC, ENTRY		Def. veřejného jména
EXTERNAL	EXTRN, EXT		Def. vnějšího jména

	Formáty ekvivalentních direktiv si odpovídají.

POPIS PROGRAMU  [ M80.COM ]				strana:16
-----------------------------------------------------------------

4.12. Makroinstrukce a opakovací bloky.
=======================================

	Makroinstrukce  umožňují  generovat  opakující  se  části
zdrojového textu, které se jen málo lyší jedním příkazem. Za  tím
účelem je potřebné nejdříve požadovanou část zdrojového textu de-
finovat jako makroinstrukci pomocí direktiv MACRO a ENDM. V defi-
nici makroinstrukce jsou proměnné složky označeny  jako  formální
parametry. Jakmile byla makroinstrukce  jednou  definována,  může
být kdykoli volána příkazem, který v poli typu  operace  obsahuje
jméno makroinstrukce a v poli operandů seznam skutečných paramet-
rů. Každé volání makroinstrukce generuje posloupnost příkazů  de-
finice, ve kterých byly formální parametry nahrazeny skutečnými.

	Speciálné  případ  makroinstrukcí  představují  opakovací
bloky (REPT, IRP, IRPC). U těchto konstrukcí splývá definice  ma-
kroinstrukce s jejím voláním, takže se opakovací blok  neoznačuje
jménem. Opakovací bloky se používají v případech,  kdy  je  třeba
bezprostředně za sebou opakovat část zdojového textu. U  opakova-
cích bloků IRP a IRPC se používá formální parametr a seznam  sku-
tečných parametrů, které postupně nahrazují v jednotlivých opako-
váních formální parametr. Opakovací bloky  stejně  jako  definice
makroinstrukcí musí být zakončeny direktivou ENDM.

	Jako formální parametry se používají jména, která splňují
konvence kladené na jména uživatele. Jméno jako formální parametr
je definováno použitím v direktivách MACRO,  IRP  případně  IRPC.
Při rozpoznávání v těle makroinstrukce  mají  formální  parametry
přednost před rezervovanými jmény. Pojmenujeme-li například  for-
mální parametr jménem A, je toto jméno v těle makroinstrukce roz-
poznáno jako formální parametr a ne jako jméno registru !

	Skutečným parametrem může být libovolná posloupnost  zna-
ků. Pokud skutečný parametr obsahuje oddělovače jako např.  meze-
ry, čárky, tabelátory apod., je třeba jej uzavřít do lomených zá-
vorek < > . Při vložení skutečného parametru do rozvoje  makroin-
strukce je vždy jeden pár lomených závorek odstraněn.  Přípustným
skutečným parametrem je i znakový  řetězec uzavřený do apostrofů.
Do rozvoje makroinstrukce se přenáší meze změn. Skutečné paramet-
ry se v seznamu vzájemně  oddělují čárkami. Vedoucí a zakončující
mezery jsou ze  skutečných  parametrů  odstraněny  (pokud  nejsou
uvnitř lomených závorek nebo apostrofů). Dvě čárky nebo znaky < >
uvedené  bezprostředně za sebou vymezují v seznamu  tzv.  prázdný
skutečný parametr.

Speciální operátory v makroinstrukcích.
---------------------------------------

	V definicích makroinstrukcí, případně při volání makroin-
strukcí, je možné používat následující operátory:

&	Ampersand se používá v definicích makroinstrukcí ke  spo-
	jení textu a formálních parametrů, případně jako indikace
	formálního parametru uvnitř znakových řetězců.

POPIS PROGRAMU  [ M80.COM ]				strana:17
-----------------------------------------------------------------

	Například:

	CHYKOD		MACRO	X
	CHYBA&X		PUSH 	B
			LD	B,'X'
			JP	CHYBA
			ENDM

	Jestliže nyní budeme volat:

	CHYKOD		Y

	bude se generovat:

	CHYBAY		PUSH	B
			LD	B,'Y'
			JP	CHYBA


;;	Uvedeme-li  komentář  v  definici  makroinstrukce   dvěma
	středníky, neuchová se a proto se neobjeví v rozvoji mak-
	roinstrukce. Normálně zapsaný komentář  (jeden  středník)
	se stává součástí definice makroinstrukce a při jejím vo-
	lání se objeví v rozvoji makroinstrukce.

<...>	Jestliže skutečný parametr při volání makroinstrukce  ob-
	sahuje řídící znaky, je třeba jej uzavřít do lomených zá-
	vorek.

!	Vykřičník použitý ve skutečném parametru způsobí, že  ná-
	sledující znak ztrácí svůj řídící význam (např. zápisy !;
	a <;> jsou ekvivalentní.

NUL	Operátor NUL vrací hodnotu TRUE v případě, že  jeho  ope-
	rand je prázdný. Zbytek řádky za oparendem NUL je  chápán
	jako operand operátoru NUL. Např. podmínka:

		IF 	NUL	operand

	není splněna, jestliže první znak  operandu  při  rozvoji
	makroinstrukce je jiný než středník nebo  návrat  vozíku.
	Pro testování, zda je parametr prázdný či nikoliv je mož-
	né použít direktivu IFB a IFNB.

Ukončení makroinstrukce.
------------------------

	Rozvoj makroinstrukce je ukončen nalezením direktivy ENDM
v definici makroinstrukce. V případě,  že  potřebujeme  vystoupit
z makroinstrukce dříve (třeba  na  základě  podmínek  testovanými
direktivami), použijeme direktivu EXITM.

Lokální návěští.
----------------

	Aby bylo možno používat  uvnitř  makroinstrukcí   návěští
a nedocházelo k jejich vícenásobné definici při opakovaných volá-
ních makroinstrukce, překladač umožňuje  definovat  tzv.  lokální
návěští. Návěští se stane lokálním, jestliže je uvedeme v defini-

POPIS PROGRAMU  [ M80.COM ]				strana:18
-----------------------------------------------------------------

ci makroinstrukce v seznamu direktivy LOCAL.  Takové  návěští  je
potom při rozvoji makroinstrukce postupně nahrazováno jedinečnými
návěštími ve tvaru ..nnnn, kde nnnn je hexadecimální číslo.