====== Macro ====== Assembler v LnxSpectrum od verze 1.3.1 nově obsahuje podporu pro makra. Díky makru si můžete vytvořit vlastní sekvenci často používaných instrukci, a schovat jí pod svůj vlastní název. Makro může být definováno sice kdekoliv, ale vždy musí být definice dokončena před jeho použitím. Nejlépe je definovat makra na začátku ''main.asm'' souboru, nebo ještě lépe vytvořit nový samostatný ASM soubor pojmenovaný ''macro.asm'', v něm makro definovat a potom ho na začátku ''main.asm'' připojit pomocí ''include "macro.asm"''. ===== Základní použití makra ===== Makro definujeme instrukci kompileru v kódu ''#macro název''. Definování musíme ukončit pomocí instrukce ''#endm''. Jako příklad vytvoříme jednoduché makro pro kopírování krátkého bloku dat: ; LnxSpectrum ASM editor (www.ilnx.cz) ; nadefinujeme si makro: #macro Copy ld de,16384 ld bc,32 ldir #endm ; tady začne náš hlavní program, kde zavoláme i naše makro: org 50000 ld hl,0 Copy ret v debugeru potom vidíme, že kompiler vytvořil tuto posloupnost kódu od adresy 50000: ld hl,0 ld de,16384 ld bc,32 ldir ret ===== Makro s parametrem ===== V definici makra můžeme použít ''parametry''. Parametrem makru říkáme, že některá hodnota se může měnit v závislosti na použití. Takové makro nadefinujeme pomocí ''#macro název parametr1, parametr2''. Parametrů může být více. Název parametru musí obsahovat nejméně 5 znaků. Jako příklad vytvoříme makro s parametrem pro kopírování krátkého bloku dat: ; LnxSpectrum ASM editor (www.ilnx.cz) ; nadefinujeme si makro: #macro Copy Zdroj ld hl,Zdroj ld de,16384 ld bc,6912 ldir #endm ; tady začne náš hlavní program, použijeme i naše makro: org 50000 Copy 32768 Copy 8000 ret V debugeru potom vidíme že kompiler vytvořil tento kód od adresy 50000: ld hl,32768 ld de,16384 ld bc,6912 ldir ld hl,8000 ld de,16384 ld bc,6912 ldir ret ===== Rozšířené použítí makra ===== Parametr může být použitý i pro definice vlastní instrukce: ; LnxSpectrum ASM editor (www.ilnx.cz) ; nadefinujeme si makro: #macro Matem Instr Instr hl,de #endm ; tady začne náš hlavní program, použijeme i naše makro: org 50000 Matem adc Matem sbc ret V debugeru potom vidíme že kompiler vytvořil tento kód od adresy 50000: adc hl,de sbc hl,de ret Ještě jeden příklad pro definice vlastní instrukce: ; LnxSpectrum ASM editor (www.ilnx.cz) ; nadefinujeme si makro: #macro CByte Param1, Param2 ld Param1,Param2 #endm ; tady začne náš hlavní program, použijeme i naše makro: org 50000 CByte a,b CByte c,d ret V debugeru potom vidíme že kompiler vytvořil tento kód od adresy 50000: ld a,b ld c,d ret ===== Návěstí v makru ===== V makru se můžou používat návěstí stejným způsobem jako kdekoliv jinde v kódu. Není ale možné používat návěstí definované uvnitř v makru kdekoliv jinde (například z ''main.asm''). Všechny návěstí definované uvnitř makra jsou totiž při každém použití makra unikátní. ; LnxSpectrum ASM editor (www.ilnx.cz) ; nadefinujeme si makro: #macro Wait Kolik ld b,Kolik Smycka: nop djnz Smycka #endm ; tady začne náš hlavní program, použijeme i naše makro: org 50000 Wait 100 Wait 200 ret V debugeru potom vidíme že kompiler vytvořil tento kód od adresy 50000: ld b,100 M1_Smycka: nop djnz M1_Smycka ld b,200 M2_Smycka: nop djnz M2_Smycka ret Návěstí definované mimo makro použít uvnitř makra můžeme. ; LnxSpectrum ASM editor (www.ilnx.cz) ; nadefinujeme si makro: #macro Copy ld hl,0 ld de,Video ld bc,6912 ldir #endm ; tady začne náš hlavní program, použijeme i naše makro: org 50000 Video equ 16384 Copy ret V debugeru potom vidíme že kompiler vytvořil tento kód od adresy 50000: ld hl,0 ld de,16384 ld bc,6912 ldir ret {{:lnxspectrum:pic7.png?nolink |}}Názvy unikátních návěstí se běžně v seznamu návěstí nezobrazují. Pokud je chceme zobrazit, nastavíme v zobrazení návěstí zdrojový modul na ''Macro''. Ačkoliv tyto názvy se dají volat odkudkoliv z kódu, nedoporučujeme je využívat. Kompiler tyto názvy generuje dynamicky, a v průběhu psaní vlastního kódu je může změnit.