Les macros permettent en utilisant une instruction unique, appelée instruction de macro, d'insérer plusieurs instructions d'assembleur.
Un sous-programme est caractérisé par le fait qu'il n'y a qu'une copie du texte de sous-programme dans le programme. Le sous-programme est exécuté si l'instruction de programme qui appelle le sous-programme est exécutée. Les paramètres transmis au sous-programme déterminent sa fonction dans les limites établies au développement du sous-programme. Des sous-programmes diminuent la longueur totale d'un programme ainsi que l'effort pour les écrire puisqu'un appel remplace un sous-programme entier.
Cependant, l'appel d'une routine coûte du temps, car il faut passer les paramètres, appeler le sous-programme, accéder aux paramètres et quitter le sous-programme.
La macro ou "le code de ligne" offre une solution plus rapide aux frais de la place mémoire. Une copie d'une instruction de macro au lieu d'un appel de sous-programme est placé dans le programme. Le code correspondant est inséré au moment de l'assemblage.
La définition d'une macro doit se trouver avant l'appel à cette macro.
Une macro peut appeler une autre macro mais pas elle-même. Jusqu'à dix appels
de macro imbriqués sont possible. Des .If .. .Else .. ,Endif sont possibles
dans une macro
Cette pseudo-instruction commence la définition d'une macro. Le nom de cette macro est nom_de_la_macro. Les caractères admis dans nom_de_la_macro sont les mêmes que pour les étiquettes dans l'assembleur CALM. Actuellement, 32 caractères sont significatifs dans nom_de_la_macro. Une autre macro ne peut pas être définie à l'intérieur de la définition d'une macro.
.Macro SaveWF
Move W,SaveW
; Ne modifie pas F
Swap F,W
Move W,SaveF
.Endmacro
Les 8 paramètres possibles sont appelés dans la partie principale de la macro par les symboles %1 à %8. Ils sont remplacés par les %1 à %8 si le paramètre correspondant n'a pas été spécifié lors de l'appel à cette macro.
Exemple: JumpLO Var/Cste, Var, Adresse de saut si Var < Var/Const -- nombres
positifs
.Macro JumpLO
Move %1,W
Sub W,%2,W
; %2 + (256-W) --> W
Skip,CS Jump %3
.Endmacro
On écrira dans le programme
JumpLo #PosMax,Position,TropPetit
On peut donner dans la lignes .Macro une liste de valeurs qui seront prises par défaut si elles ne sont pas mentionnées dans l'appel de la macro. A utiliser prudemment.
Par exemple si on écrit
.Macro JumpLO,Max, ,Loop (remarquez
que le 2e paramètre n'est pas défini)
Move %1,W
Sub W,%2,W
; %2 + (256-W) --> W
Skip,CS Jump %3
.Endmacro
JumpLO ,Var,Adr
est équivalent à JumpLO Max,Var,Adr
JumpLO Min,Var, est équivalent à
JumpLO Min,Var,Loop
JumpLO Min, ,Adr génère une erreur
Cette pseudo-instruction définit jusqu'à huit étiquettes qui peuvent être utilisées dans la partie principale d'une macro. Ces étiquettes seront converties en étiquettes locales (M_0$..M_999$) si cette macro est appelée. Ceci évite des étiquettes à double si cette macro est appelée plusieurs fois. La syntaxe permise pour les étiquettes est la même que pour les étiquettes dans l'assembleur CALM. Une virgule sépare les étiquettes. Des espaces et des tabulateurs avant et après les étiquettes sont ignorés. Si cette pseudo-instruction est utilisée, elle doit directement suivre .MACRO. 32 caractères sont actuellement significatifs dans les noms des étiquettes. A noter pour le PIC dont les instructions ont toutes la même longueur, on a souvent avantage à utiliser l'adressage relatif lorsque les sauts sont courts.
.Macro Delai
; La durée du délai est dans W
Move W,C1
DecSkip,EQ C1
Jump APC-1
; remonte d'une instruction
.Endmacro
Il y a d'autres possibilités dans les macros, à l'intention des spécialistes. Voir www.didel.com/doc/smileng/CalmMacros.pdf