====== 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.