La conversion décimale
On peut être amené à devoir afficher de grands nombres entiers en décimal, comme les tailles de fichiers
en octets. Il existe bien sûr des routines utilisant des algorithmes de division avec reste ou passant
par des boucles de soustractions, avec des tables, etc... Voici une proposition parmi tant d'autres
(le nombre sur 24 bits est passé par B et X):
TBASE EQU 4 Taille pour buffer base/résultat
* Module de conversion binaire/décimal pour 24 bits
CNVDEC PSHS A,B,X,Y,U |
LDX #BASE |
LDA #TBASE*2 | Efface les buffers
CNVDC0 CLR ,X+ | pour la base
DECA | et le résultat
BNE CNVDC0 |
INC -TBASE-1,X Initialise la base à 1
LDY #24 24 bits à tester
CNVDC1 LSR 1,S |
ROR 2,S | Décale le nombre binaire
ROR 3,S |
BCC CNVDC2 | Si bit à 1,
LDU #RESULT+TBASE | ajoute la
BSR AJOUT | base au résultat
CNVDC2 LDU #BASE+TBASE | Multiplie la base par 2
BSR AJOUT | (ajoute la base à la base)
LEAY -1,Y | Bit
BNE CNVDC1 | suivant
PULS A,B,X,Y,U,PC |
* Ajoute la base au buffer pointé par U
AJOUT LDX #BASE+TBASE Pointeur sur la base
LDB #TBASE Taille du buffer
CLRA C de CC à 0
AJOU0 LDA ,-U Charge le nombre
ADCA ,-X Ajoute la base + la retenue
DAA Ajustement décimal
STA ,U Ecrit le nombre
DECB | Octet
BNE AJOU0 | suivant
RTS |
BASE RMB TBASE Buffer pour la base
RESULT RMB TBASE Buffer pour le résultat
Ce programme décale bit par bit le nombre binaire à décomposer. Sil trouve un bit à 1,
il ajoute la base initialisée à 1 au résultat. A chaque décalage, il multiplie la base par 2, qui
passe alors à 2, 4, 8, 16, 32, etc... Une fois le nombre binaire entièrement décomposé, il ne reste
plus qu'à afficher le nombre décimal avec un programme ayant pour fonction d'afficher plutôt de l'hexadécimal,
puisque chaque chiffre du nombre converti est traduit sur un quartet par l'ajustement décimal. Le programme
suivant affiche tous les chiffres du nombre, les 0 préalables y compris:
* Affiche un nombre hexadécimal à plusieurs octets
* ou affiche un nombre décimal ajusté
AFFDEC LDU #RESULT Pointeur sur buffer à afficher
LDX #TBASE Nombre d'octets à traiter
AFFDE0 LDB ,U+ Récupère un octet
BSR HEX Affiche les deux quartets
LEAX -1,X | Octet
BNE AFFDE0 | suivant
RTS |
* Décomposition par quartet d'un octet sous forme ASCII numérique
HEX PSHS B |
LDA #$10 | Dizaine
MUL | dans A
PULS B |
ANDB #$0F Isole les unités
BSR HEX0 Affiche la dizaine
HEX0 EXG A,B Valeur dans B pour affichage
ADDB #0 Ajuste le chiffre
JMP $E803 Affiche caractère
L'avantage de ce programme de conversion binaire/décimal est qu'il ne nécessite pas beaucoup de mémoire et permet
néanmoins de décomposer de très grands nombres.
Si vous fixez la taille des buffers (TBASE) à 10, que vous utilisez les registres
A, B, X, Y et U pour passer votre nombre à 64 bits et que vous insérez cette partie de programme:
...
LDY #64 64 bits à tester
CNVDC1 LSR ,S |
ROR 1,S |
ROR 2,S |
ROR 3,S | Décale le
ROR 4,S | nombre binaire
ROR 5,S |
ROR 6,S |
ROR 7,S |
BCC CNVDC2 | Si bit à 1, etc...
...
...vous pourrez afficher des nombres décimaux allant jusqu'à 18446744073709551615,
plus que ne saurait faire votre calculatrice de poche!
|