CODINGAMSLIVE ★ AMSLIVE n°02 - ASSEMBLEUR : A DAA DAA SUR MON BCD ★

AMSLIVE n°02 - AsmCoding Amslive
N'ayant pas reçu d'acides critiques sur mon article basique, je lance dans la continuité en évoquant le codage BCD et la méconnue instruction DAA.

BINARY CODED DECIMAL

En Français, Décimal Codé Binaire. Soit un nombre, on considère son expression décimale. Puis chaque chiffre est codé en binaire.
Puisqu'il y a 10 chiffres différents en décimal, il faudra 4 bits en binaire. Les chiffres 0 à 9 seront écrits 0000, 0001, 0010, 0011, 0100, 0101, 0110, 0111, 1000, 1001.

Ainsi le nombre 125 sera codé 0001 0010 0101. Veuillez remarquer que cela correspond à &125 en hexa ! je rappelle le jonc qu'il y a équivalence entre quartet et chiffre hexa.

AVANTAGES ?

Lors d'une transmission, la réception des quartets 1010, 1011, 1100, 1101, 1110, 1111, témoignera d'une erreur ou d'un signal spécial. C'est pas le Pérou, mais bon, pardonnons à ces hommes qui ne savent pas ce qu'ils font. Il suffit d'ORer &30 pour obtenir le code ASCII correspondant au chiffre.

COMMENT CODER ?

Comme exercice pratique, écrivons une routine qui code une valeur x dans un registre 8 bits, l'accumulateur du Z80 par exemple. Si x (compris entre 0 et 99) s'écrit &PQ en hexa et &BC en BCD, on a :

x= 16*P + Q = 10*B + C

On a B = INT (x/10), puisque B représente le nombre de dizaines. Mais en arrangeant cette expression, on trouve :

x+6*B= 16*B + C = &BC Je sens que certains ne suivent plus, alors
voici un exemple :

x = 78 = &4E En BCD, on doit obtenir &78 = 120.

Or, 120-78 = 42 =6* 7

Le seul problème reste la division par 10. Essayons 13/128 comme approximation de 1/10.

On a ( x + x/2 + x/2/2/2 ) / 16 = x/10 (où la division est entière) vrai pour x pair entre 0 et 99. Comme il y a le même nombre de dizaines dans un nombre impair et le nombre qui le précède, il suffit de mettre le bit 0 de x à 0 pour rendre la formule toujours valable.

Il faudra tenir compte de la perte du LSQ (quartet de poids faible) due à la division par 16 lors du raccourci utilisé pour la multiplication par 6. Si vous trouvez ça tarabiscoté, n'oubliez pas qu'on ne fait pas de ski nautique sans mettre de slip de bain (04h13).

LD B,A ; Entrée : A contient la valeur à coder
SRA A ; Le bit 7 est censé être à 0
LD C,A
RLCA ; Bit 0 à 0
ADD A,C
SRA C
SRA C
ADD A,C
AND #F0 ; Ces 6 instructions correspondent
RRCA ; à la division par 16 et à la
RRCA ; multiplication par f>.
LD C,A
RRCA
ADD A,C
ADD A,B ;Sortie: A contient la valeur en BCD.

NE SERAIT-CE PAS PLUS SIMPLE AVEC DAA ?

Si, mais il faut bien maîtriser cette instruction, Décimal Adjust Accumulator, très sensible puisque son exécution dépend des flags N, H et C. Rendez-vous compte :

Fabriquons un compteur décimal pour les scores de votre prochain jeu). Chaque octet ne contiendra qu'un chiffre.
On utilise la configuration N=H=C=0.

LD HL,COMPT; Pointe sur le chiffre
LD BC,#0F90; de poids faible
LD D,0
LD A,(HL)
INC A
AND B ; Si LSQ > 9, MSQ va être incrément^
OR C ; dépasser 9, puis enclencher C qui
DAA ; sera récupéré par ADC.
LD (HL),A ; Attention, MSQ vaut 0 ou 9
INCHL
LD A,(HL)
ADC A,D
ANDB
OR C
DAA ; ...

Exercice de conclusion : comprenez la routine suivante (non, non ce n'est pas de la flemme).

OR A ; A contient un nombre DAA ; compris entre 0 et 15

ADD A,#F0
ADC A,#40

; Sortie : A découvrir !

AMSLIVE n°2

★ ANNÉE: ???
★ AUTEUR: MADRAM

Page précédente : AMSLIVE n°01 - Z80

★ AMSTRAD CPC ★ A voir aussi sur CPCrulez , les sujets suivants pourront vous intéresser...

Lien(s):
» Coding » AMSLIVE n°14 - Multiplication Saignee a Mort
» Coding » AMSLIVE n°17 - 3D
» Coding » AMSLIVE n°14 - 3D est-ce l'amour ?
» Coding » AMSLIVE n°01 - Init
» Coding » AMSLIVE n°12 - Rom Pour les Matelots
» Coding » AMSLIVE n°02 - Choisir Son Assembleur
Je participe au site:

» Vous avez remarqué une erreur dans ce texte ?
» Aidez-nous à améliorer cette page : en nous contactant via le forum ou par email.

CPCrulez[Content Management System] v8.7-desktop/c
Page créée en 407 millisecondes et consultée 2955 fois

L'Amstrad CPC est une machine 8 bits à base d'un Z80 à 4MHz. Le premier de la gamme fut le CPC 464 en 1984, équipé d'un lecteur de cassettes intégré il se plaçait en concurrent  du Commodore C64 beaucoup plus compliqué à utiliser et plus cher. Ce fut un réel succès et sorti cette même années le CPC 664 équipé d'un lecteur de disquettes trois pouces intégré. Sa vie fut de courte durée puisqu'en 1985 il fut remplacé par le CPC 6128 qui était plus compact, plus soigné et surtout qui avait 128Ko de RAM au lieu de 64Ko.