Macros
Macros are a way of extending the assembler. Macros are effectively extra commands or instructions. Used sparingly they can really enhance you code. As an example, inside the Astrum editor is some code that takes a keypress and decides what to do with it. It uses a list of keys and labels:
defb 8 defw LEFT defb 9 defw RIGHT defb 11 defw UPIt would be nicer if each keypress and label were on one line. We can do this with a macro:
MACRO KEY_HANDLER key,label defb key defw label ENDMNow we can write:
KEY_HANDLER 8,LEFT KEY_HANDLER 9,RIGHT KEY_HANDLER 11,UP
Macros can call other macros but they must have been declared previously.
You can declare and use labels inside a macro but you cannot reference them from outside a macro. In general you cannot declare a label more than once but labels used in a macro are hidden so you do not have to worry about choosing unique label names from one macro to another.
You could do:
MACRO VDUN ch,n ld b,n loop ld a,ch rst 16 djnz loop ENDM
Of course just because you can do something doesn't mean you should! If a macro is more than a few lines long it might be worth considering its worth.
Do not choose macro names that would be recognised as something else and do not use argument names that could be confused with a register name. You can't use a macro to modify an existing instruction or directive.