Envoyer un e-mail à Collection ThomsonCollection Thomson
EditoForum 2002Liens
Nanoreseau
Docs
Logiciels
Matériel
Imprimer le document
Retour à la liste

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.

Site
Plus
Forums
Code
Créations

*Site en favoris
*Page en favoris
*Site en démarrage
*Page en démarrage


Haut de page

Collection Thomson 2015 © Ghislain Fournier & François Mouret