CALM macros

Les macros permettent en utilisant une instruction unique, appelée instruction de macro, d'insérer plusieurs instructions d'assembleur.

Différence sous-programme - macro

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.

Définition d'une macro

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

.MACRO nom_de_la_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

Paramètres dans une macro

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

Paramètres par défaut

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

.LOCALMACRO étiquette1,...,étiquette8

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

Autres pseudos pour les macros

Il y a d'autres possibilités dans les macros, à l'intention des spécialistes. Voir www.didel.com/doc/smileng/CalmMacros.pdf