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.