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 XY, 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.