Revenir au plan du site
Instructions de rotations et décalages de bits
De façon générale, toutes ces instructions modifient les flags de la façon suivante :
- flag S si le résultat est négatif (supérieur à 127)
- flag Z si le résultat est zéro
- flag P qui contient la parité des bits du résultat
- flag C qui contient le bit "sorti" du résultat
- flag H et N remis à zéro
Voici un tableau récapitulatif et visuel des différents décalages et rotations possibles, ça vaut mieux qu'un long discours
SLL
- L'instruction SLL réalise un décalage de l'opérande vers la gauche d'un bit et injecte la valeur 1 dans le bit 0. On peut la trouver aussi sous la syntaxe SL1.
- Cette instruction fait partie des instructions qui ont été documentée plus tard par Zilog, c'est pourquoi peu d'assembleurs les supportent à part Rasm, Sjasm et Orgams.
- Cette instruction possède un mode d'exécution qui copie le résultat dans un autre registre. La syntaxe a alors besoin de deux opérandes. Là encore, seuls Rasm et Sjasm les supportent.
Écritures possibles en mode simple :
SLL reg8
SLL (HL)
SLL (IX+d)
SLL (IY+d)
|
Écritures possibles en duplication de résultat :
SLL (IX+d),A
SLL (IX+d),B
SLL (IX+d),C
SLL (IX+d),D
SLL (IX+d),E
SLL (IX+d),H
SLL (IX+d),L
;
SLL (IY+d),A
SLL (IY+d),B
SLL (IY+d),C
SLL (IY+d),D
SLL (IY+d),E
SLL (IY+d),H
SLL (IY+d),L
|
Note: Le registre destination contiendra la valeur du décalage même si l'adresse pointée par IX ou IY est en ROM. Dans ce cas de figure, la valeur est lue dans la ROM, le décalage est effectué dans un registre interne du Z80, puis il est copié dans le registre destination. Enfin, la valeur est écrite à l'adresse pointée par IX ou IY +dep8. Si l'adresse pointe sur une ROM active, alors la valeur sera écrite dans la mémoire située en arrière-plan de la ROM.
RLD
Ce décalage très particulier impacte le registre A ainsi que l'adresse pointée par HL.
Il effectue une rotation de 4 bits vers la gauche sur le nombre 12 bits composé des 4 bits de poids faible de A et de (HL).
; exemple 'visuel'
LD A,#12
LD (HL),#34
RLD
; A=#13
; (HL)=#42
|
Les 4 bits supérieurs du registre A sont inchangés, il peut être nécessaire d'initialiser à zéro le registre avant usage.
Usage: Cette instruction trouve ses origines dans l'arithmétique BCD et permet par exemple de multiplier par 10 très facilement un nombre BCD de n'importe quelle taille. Comme elle modifie l'octet pointé par HL, il faut faire attention à son usage dans le cadre unique de la lecture.
Effet sur les flags :
- H et N à zéro
- P/V est la parité
- S et Z modifiés par définition
- C n'est pas modifié
RRD
RRD est le pendant de l'instruction RLD. Il impacte le registre A ainsi que l'adresse pointée par HL.
Il effectue une rotation de 4 bits vers la droite sur le nombre 12 bits composé des 4 bits de poids faible de A et de (HL).
; exemple 'visuel'
LD A,#12
LD (HL),#34
RRD
; A=#14
; (HL)=#23
|
Effet sur les flags :
- H et N à zéro
- P/V est la parité
- S et Z modifiés par définition
- C n'est pas modifié
Décalages 16 bits
Il est possible de réaliser des décalages 16 bits vers la gauche de façon native en utilisant l'addition.
ADD HL,HL ; copie le bit 15 dans C, décale tous les bits vers la gauche et injecte 0 dans le bit 0
ADC HL,HL ; copie le bit 15 dans C, décale tous les bits vers la gauche et injecte C dans le bit 0
|
Pour faire un décalage équivalent à SLL il est nécessaire de décomposer
SCF ; force la carry à 1
ADC HL,HL ; copie le bit 15 dans C, décale tous les bits vers la gauche et injecte 1 dans le bit 0
|
Ou bien
ADD HL,HL
SET 0,L ; forcer le bit 0 de HL
|
On peut réaliser des décalages 16 bits sur les autres registres, toujours en décomposant.
SRL BC s'écrit SRL B : RR C
SRL DE s'écrit SRL D : RR E
SRL HL s'écrit SRL H : RR L
SRA BC s'écrit SRA B : RR C
SRA DE s'écrit SRA D : RR E
SRA HL s'écrit SRA H : RR L
SLL BC s'écrit SLL C : RL B
SLL DE s'écrit SLL E : RL D
SLL HL s'écrit SLL L : RL H
SLA BC s'écrit SLA C : RL B
SLA DE s'écrit SLA E : RL D
SLA HL s'écrit SLA L : RL H
RR BC s'écrit RR B : RR C
RR DE s'écrit RR D : RR E
RR HL s'écrit RR H : RR L
RL BC s'écrit RR C : RR B
RL DE s'écrit RR E : RR D
RL HL s'écrit RR L : RR H
RLC BC s'écrit SLA B : RL C : RR B : RLC B
RLC DE s'écrit SLA D : RL E : RR D : RLC D
RLC HL s'écrit SLA H : RL L : RR H : RLC H
RRC BC s'écrit SRL B : RR C : RL B : RRC B
RRC DE s'écrit SRL D : RR E : RL D : RRC D
RRC HL s'écrit SRL H : RR L : RL H : RRC H
|