Optimisation de routine: affichage d'un nombre hexadécimal
La routine pour afficher un nombre hexadécimal dont la valeur à décomposer est contenue
dans le registre B est la suivante:
HEX TFR B,A Valeur dans A
LSRA |
LSRA | Décalage du
LSRA | poids fort
LSRA |
BSR HEX0 Décomposition hexadécimale
HEX0 ANDA #$0F Isole bits utiles
CMPA #10 | Si de 10 à 15,
BLO HEX1 | ajuste valeur pour
ADDA #7 | A, B, C, D, E, et F
HEX1 ADDA #$30 Ajuste en décimal
EXG A,B Valeur dans B pour affichage
JMP $E803 Affiche chiffre hexadécimal
...mais celle-ci vous fera gagner pas moins de 5 octets pour le même résultat et sous
les mêmes modalités:
HEX BSR HEX0 Affiche poids fort
EXG A,B Rétablit registres
HEX0 LDA #$10 | Passe quartet
MUL | dans A
ADDA #$90 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E 9F
DAA 90 91 92 93 94 95 96 97 98 99 00 01 02 03 04 05
ADCA #$40 D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 41 42 43 44 45 46
DAA 30 31 32 33 34 35 36 37 38 39 41 42 43 44 45 46
EXG A,B Valeur dans B pour affichage
JMP $E803 Affiche chiffre hexadécimal
Que se passe-t-il donc? L'explication de ce programme nous amène à étudier l'effet de l'ajustement
décimal introduit par l'instruction DAA.
La série de nombres en commentaire nous montre les variations que suivent les différentes
valeurs que peut prendre le registre A.
Analysons les étapes de la routine:
- La valeur à décomposer est tout d'abord multipliée par $10, ce
qui permet un positionnement des poids fort/faible du nombre hexadécimal plus
concis que 4 décalages vers la droite. La valeur qui nous intéresse se retrouve
dans le registre A ( de $00 à $0F).
- Le premier ajustement décimal (DAA) ne fait pas varier les
valeurs pour l'intervalle $90-$99. Mais, pour l'intervalle $9A-$9F, l'unité (le
deuxième quartet) est ajustée ($A=10 donc 0, $B=11 donc 1, $C=12 donc 2,
etc...) et la dizaine (le premier quartet) est incrémentée de 1. Comme cette
dizaine est à 9, son incrémentation de 1 l'amène à $A, que le même ajustement
décimal transforme en $10, soit 0. Le 1 du $10 (la centaine, en somme) est
expulsé dans le registre CC, ce qui fixe le flag de retenue C à 1. On voit là
tout l'intérêt de "ADDA #$90".
- Car cette retenue, par l'intermédiaire de "ADCA #$40",
nous permet déjà d'obtenir les codes caractères adéquats pour les chiffres de
$A à $F. L'intervalle $90-$99 n'ayant pas varié et n'ayant pas activé la
retenue C, "ADCA #$40" l'amène tout bonnement à l'intervalle $D0-$D9.
- Le deuxième et dernier ajustement décimal ne fait pas varier
l'intervalle $41-$46. Mais la dizaine (le premier quartet) de l'intervalle
$D0-$D9 étant à $D, son ajustement décimal l'amène à $13, soit 3 pour la
dizaine, la centaine résultante fixant le flag C de CC à 1 (mais celui-ci ne
nous intéresse plus).
Et il ne reste plus qu'à afficher.
|