Sans grande prétention, nous pensons que quelques conseils seraient utiles pour éviter de perdre du temps dans la mise au point de programmes à cause de broutilles.

En premier, éviter de faire trop de corrections sur le texte source en une seule fois. Souvent cela ne fait qu'agraver les problèmes. Mieux vaut revoir ses algorithmes, s'ils semblent bons, alors intervenir sur le source.Les 80% du travail se font avec papier, crayon, gomme.
Quelquefois, votre programme fonctionne bien, vous voulez l'améliorer ; et à la fin il ne fonctionne plus. Pensez à l'enregistrer sous un autre nom avant de le modifier.

Pour les habitués des langages évolués (Pascal, Ada, C ...), nous rappelons qu'il a été démontré que tout algrithme peut s'écrire avec trois instructions : l'affectation, l'alternative et l'itérative.

La première (que nous noterons "<=") se traduit en assembleur HC par : LDAA, LDAB, LDD, LDS, LDX, LDY
A <= 15 se traduit par : LDAA #15
c'est un adressage immédiat caractérisé par le signe '#', 15 étant ici une valeur décimale. Si le nombre est une valeur hexadécimale il faut écrire : LDAA #$15.
Si vous omettez le signe '#', LDAA 15 signifie alors : charger l'accumulateur A avec la valeur se trouvant dans la mémoire d'adresse 15 (en décimal).
Enfin nous utiliserons souvent l'adressage indexé comme LDAA 0,X qui signifie : charger l'accumulateur A avec la valeur contenue dans la mémoire dont l'adresse se trouve dans l'index X. (voir la page Les bases).
A noter que la paire d'instructions
LDAA #$15
LDAB #$21

peut être remplacée par l'instruction unique
LDD #$1521 en numérations hexadécimale ou binaire uniquement.

L'instruction alternative peut avoir deux formes, SI (condition=vrai) ALORS (instructions) FINSI, ou SI (condition=vrai) ALORS (instructions_1) SINON (instructions_2) FINSI.

Exemple : dans pratiquement tous nos programmes, nous utiliserons une séquence de scrutation du clavier pour savoir si une touche a été actionnée et laquelle. Une telle séquence est une suite d'alternatives.

* lecture du clavier

BOUCLE        JSR    LIRE_CLAVIER
        JSR    RELACHE
        LDX    #LISTE       
        LDAB    TOUCHE
        CMPB    #$11        ; touche '+' ?
        BNE    SUIVANTE_1   ; non => aller à SUIVANTE_1
        BRA    ECRITURE    ; oui => écrire le nom de la touche
SUIVANTE_1    INX
        CMPB    #$12        ; touche '-' ?
        BNE    SUIVANTE_2
        BRA    ECRITURE
SUIVANTE_2    INX
        CMPB    #$14        ; touche 'E' ?
        BNE    SUIVANTE_3
        BRA    ECRITURE
SUIVANTE_3    INX
        CMPB    #$18        ; touche 'P' ?
        BNE    AUCUNE

La séquence commence à CMPB #$11, pour savoir si la touche de code $11, la touche "+", a été actionnée. Si c'est le cas le programme passe à la routine d'écriture du nom de la touche sinon il effectue la comparaison avec la touche suivante et ainsi de suite. Si aucun code ne correspond il revient au début de la boucle.
L'ndex X pointe sur le nom de la touche correspondante, pour un affichage ultérieur.

B <= TOUCHE
SI (B) <> $11 ALORS
    voir touche suivante
SINON
    afficher la touche
FINSI
SUIVANTE    SI (B)<>$12 ...

Nous en profitons pour signaler une amélioration possible de l'écriture du programme qui n'a pas été faite ici.
Il s'agit de définir des constantes pour les codes des touches :

TOUCHE_Plus   equ $11
TOUCHE_Moins   equ $12
TOUCHE_E   equ $14
TOUCHE_P   equ $18

dans la séquence il serait alors écrit :

CMPB #TOUCHE_Plus
...
CMPB #TOUCHE_Moins
etc.

Quel est l'intérêt d'une telle écriture ? Si pour une raison quelconque vous devez par la suite changer les codes des touches nous n'aurez qu'à changer les valeurs des constantes, sinon vous devrez les changer partout où elles sont utilisées dans le programme, et celà peut faire beaucoup.
Ce genre d'écriture n'agit pas sur la taille du programme binaire, seulement sur celle du code source.

L'itération TANT QUE (condition=vrai) FAIRE (instructions) FINTQE permet de répéter une suite d'instructions tant que la condition est vrai. Dans la suite d'instructions il doit y en avoir au moins une qui modifie la condition. Si la condition est fausse dès le départ la suite d'instructions n'est jamais exécutée.

Une variante de cette itération est la boucle REPETER (instructions) JUSQUA (condition=vrai) FIN. Ici la condition est testée après les instructions donc celles-ci sont exécutées au moins une fois.

Exemple : Dans le programme RAZ_RAM nous utilisons une itération de ce type :

INIT_RAM     STAA 1,X+
                        DBNE B,INIT_RAM

la condition est testée après l'instruction. Le contenu de l'accumulateur B doit être supérieur à zéro avant d'entrer dans l'itération. Le programme revient à l'instruction d'étiquette INIT_RAM jusqu'à ce que le contenu de l'accumulateur B soit nul.

La programmation de ces instructions nous amène à utiliser abondamment les instructions assembleur de branchement conditionnel. Attention à utiliser les bonnes instructions en fonction des variables utilisées. Pour les nombres non signés que nous utiliserons le plus souvent ce sont les instructions BHS/BCC, BEQ, BLS,BLO/BCS.

Les sentinelles : pendant la mise au point d'un programme, il est souvent utile de voir comment évoluent nos données dans le temps. Pour cela nous mettons les résultats successifs dans des variables que nous lisons dans la mémoire RAM après l'exécution du programme. Nous pouvons aussi arréter le programme après une instruction en faisant suivre celle-ci de l'instruction "BRA *" (l'instruction boucle sur elle-même) et lire la mémoire RAM. Ceci est très utile pour voir si les branchements conditionnels se font correctement.

Enfin, n'hésiter pas à donner des noms très explicites aux étiquettes. Si vous trouvez cela trop fatigant à l'écriture et préférez utiliser des noms courts, par la suite remplacez ceux-ci par des plus explicites en utilisant la fonction chercher ... remplacer de votre éditeur de texte. Vous ne le regretterez pas plus tard.

Retour sommaire Retour sommaire HC12