Initiation à lassembleur 6809
Cours n°12
Quelques astuces
Récupération dun pointeur dans une table par le registre Y ou S
Imaginez que vous vouliez récupérer un pointeur de la table pointée par X dans Y avec auto-incrémentation de
X. Lexpression « LDY ,X++ » équivaut à « LEAY [,X++] » à ceci près
que « LDY ,X++ » utilise 3 octets à lassemblage alors que « LEAX [,X++] »
nutilise que 2 octets. Le seul désavantage est que le premier est plus rapide que le second :
vous perdrez en vitesse dexécution ce que vous gagnerez en place. Il faudra choisir.
Test de la valeur dans les registres X ou Y
Nous avons vu que le simple chargement dune valeur dans les registres X et Y positionnait le flag Z de CC. Au
lieu dutiliser lexpression « CMPY #$0000 », gourmande en temps et en place, préférez :
LEAY ,Y Teste le registre
BNE ZZZZ Si <> 0, branchement en ZZZZ
Récupération dun code en sortie de programme
Une technique très utilisée. Si le programme poursuit son exécution en EXIT0, la valeur 1 est chargée dans
A, lexécution passe sur un « TST $8602 » puis rencontre le RTS. Si le programme branche
lexécution en EXIT1, la valeur 2 est chargée dans A puis lexécution rencontre le RTS. Cela
évite davoir à écrire un branchement à la place du code de « TST » qui prendrait un
octet de plus. Il est à noter que le code de linstruction « CMPX » ($8C) est aussi très
utilisé mais altère le flag C de CC réservé bien souvent pour fixer une erreur :
EXIT0 LDA #$01 Charge la valeur 1 dans A
FCB $7D Code instruction de « TST » en étendu
EXIT1 LDA #$02 Charge la valeur 2 dans A
RTS Retour de sous programme
De même, pour ne pas casser la continuité dun programme et lorsque lon nutilise quune instruction de code simple :
FCB $21 Code instruction du BRN
CLRA Charge la valeur 0 dans A
Mise à jour dun flag dès lentrée dun programme
Selon que lon entre à loffset 0 ou à loffset 1 dun tel programme, A ou B est nul ou non :
LDA #$4F ou FCB $86 Code du LDA
CLRA Met A à 0
LDB #$5F ou FCB $C6 Code du LDB
CLRB Met B à 0
Récupération de lopposé dune valeur 16 bits
Lopposé dune valeur, cest sa complémentation + 1, soit :
COMA | Complémente
COMB | la valeur
ADDD #$0001 Ajoute 1 à la valeur
Restauration du CC avec récupération du flag derreur C
Une conclusion de routine savamment utilisée par les routines du Moniteur Disque. Le CC étant altéré pendant
le programme, il est nécessaire de le protéger en pile dès le début du programme. Les routines du Moniteur
Disque fixant lerreur par un CLRA/CLRB (C de CC mis à 0) ou un COMA/COMB (C de CC mis à 1), le
problème réside dans le fait quil faille, en sortie, en même temps préserver ce flag derreur
et restaurer le CC initial :
PSHS A,CC Empile le CC
...
PULS A Récupère le CC initial dans A
EXG A,CC Echange les deux CC
LSRA Transfère le CC derreur sur C du CC initial
PULS A,PC Retour de sous-programme
Comparaison entre deux registres
Préférez empiler les registres pour une simple comparaison plutôt que réserver un espace mémoire :
STU ,--S Empile le registre à comparer
CMPX ,S++ Compare et dépile le registre
Transfert rapide dune zone
Pour les transferts rapides de zone, rien ne vaut lutilisation de la pile. Le nombre de séquences dépendra
du programmeur. Il faudra veiller à préserver les registres (surtout DP et CC), protéger le pointeur
de pile et geler les interruptions :
...
PULU A,B,DP,X,Y Récupère la zone source
PSHS Y,X,DP,B,A Ecrit dans la zone destination
LEAS 7*2,S Pointe en début de zone destination suivante
...
Effacement rapide dune zone
Même procédé que le programme précédent.
Ce type de programme est dailleurs utilisé par linstruction CLS sous Basic :
CLRA |
CLRB |
TFR A,DP | Met les registres
TFR D,X | à 0
TFR D,Y |
TFR D,U |
...
PSHS U,Y,X,DP,B,A Ecrit dans la zone destination
LEAS 9*2,S Pointe en début de zone destination suivante
...
Etiquetage minimal
Dans votre programme
source, les étiquettes en amont des branchements peuvent être avantageusement remplacées par un SET (des
étiquettes commençant par la lettre B suivie dun chiffre, par exemple), directive qui permet dutiliser
plusieurs fois la même étiquette dans un programme. Cela vous évitera à devoir constamment chercher
un nom et économisera lespace mémoire pour lassemblage:
...
CLRB Registre B à 256 (0 en 8 bits)
B0 SET * BO contient maintenant ladresse courante du programme
CLRA Registre A à 256 (0 en 8 bits)
B1 SET * B1 contient maintenant ladresse courante du programme
DECA A = A - 1
BNE B1 Si A <> 0, branche en boucle sur B1
DECB B = B - 1
BNE B0 Si B <> 0, branche en boucle sur B0
|