Initiation à lassembleur 6809
Cours n°6
Additions et soustractions
INCA ajoute 1 au registre 8 bits A
INCB ajoute 1 au registre 8 bits B
INC ajoute 1 au registre 8 bits pointé par l'opérande
DECA soustrait 1 au registre 8 bits A
DECB soustrait 1 au registre 8 bits B
DEC soustrait 1 au registre 8 bits pointé par l'opérande
Les instructions INCA, INCB, DECA et DECB sont très fréquemment utilisées. Elles
sont concises, rapides et permettent de faire des boucles de 256 révolutions au
maximum. Les instructions DEC et INC permettent aussi de décrémenter ou
incrémenter mais seulement des registres mémoires.
LDA #$41 > A=&H41
INCA > A=A+1 (soit &H42)
ADDA ajoute au registre 8 bits A
ADDB ajoute au registre 8 bits B
ADDD ajoute au registre 16 bits D (A en poids fort et B en poids faible)
SUBA soustrait au registre 8 bits A
SUBB soustrait au registre 8 bits B
SUBD soustrait au registre 16 bits D (A en poids fort et B en poids faible)
"ADDA #16" ajoute 16 au registre 8 bits A; "SUBB #5" soustrait 5 au
registre 8 bits B; "ADDD #$01FF" ajoute $1FF au registre D. On peut
remarquer que, au contraire des instructions INCA/INCB/INC/DECA/DECB/DEC, si le
résultat de l'opération est censé dépasser le cadre des 8 bits, le "9ème
bit" est positionné par le flag C de CC.
ADCA ajoute au registre 8 bits A et ajoute la retenue
ADCB ajoute au registre 8 bits B et ajoute la retenue
SBCA soustrait au registre 8 bits A et soustrait la retenue
SBCB soustrait au registre 8 bits B et soustrait la retenue
Instructions un peu spéciales. Si le bit C de CC est positionné à 1, l'opération effectuera
un ADDA/ADDB/SUBA/SUBB simple et ajoutera/soustraira la retenue (C de CC) selon
son état précédant l'instruction, 0 ou 1. En admettant que vous ayez à trouver
un numéro de gadget qui varierait entre 7 et 8 selon l'état du bit 0 d'un
registre:
CLRB Efface le numéro
LSRA Décalage du registre
ADCB #$07 Addition de 7 et de la retenue au numéro
...
Si le bit 0 de A est à 0, vous obtenez 7. S'il est à 1, vous obtenez 8.
ABX ajoute la valeur du registre B au registre X
Instruction qui nécessite un aménagement très particulier: la valeur initiale doit être
dans le registre X et la valeur à ajouter dans le registre B. Mais aussi une
instruction concise, rapide et pratique, puisque l'addition est non signée,
résultat rare avec un registre 8 bits. On voit là l'intérêt pour positionner un
pointeur ou calculer une somme dépassant le cadre du 8 bits.
LDB #$C2 > B=&HC2
LDX #$A100 > X=&HA100
ABX > X=B+X (soit &HA1C2)
LEAS ajoute au registre 16 bits S
LEAU ajoute au registre 16 bits U
LEAY ajoute au registre 16 bits Y
LEAX ajoute au registre 16 bits X
Ces instructions sont plutôt utilisées pour les déplacements de pointeur. Mais LEAY
et LEAX entrent souvent en jeu pour les compteurs de boucles nécessitant plus
de 256 révolutions. Il est à noter que seuls LEAY et LEAX positionnent le flag
condition Z (condition d'égalité) ce qui permet d'effectuer consécutivement un
branchement sans test préalable:
LEAX -1,X > X=X-1
BNE SUITE > IF X<>0 THEN [SUITE]
LEAU et LEAS nécessiteraient une comparaison de registre avant le branchement conditionnel
LEAU -1,U > U=U-1
CMPU #$0000 > Z=(U=$0000)
BNE SUITE > IF Z=0 THEN [SUITE]
ATTENTION! Ces instructions prennent en compte le signe (bit 7) du registre de déplacement dans le cas de l'utilisation d'un registre 8
bits. "LEAX B,X" n'aura pas le même effet que "ABX": si le
bit 7 de B est à 1 (valeur comprise de $80 à $FF), le registre 16 bits X sera
décrémenté.
Un programme pour changer les couleurs de forme de l'écran moniteur. Chaque segment de couleur de forme de la mémoire de fond est augmenté
de 1. Avant l'exécution du programme, remplissez votre écran moniteur avec un
"DE000", par exemple.
Dans la première colonne, le champ étiquette. Dans la
deuxième, le programme pour les TO. Dans la troisième, à titre d'information,
le programme pour MO. Enfin, dans la quatrième colonne, le commentaire du
programme. Pour l'adaptation des programmes TO sur MO, vous devez savoir que
les routines moniteur sont sous interruptions logicielles (donc appelées par un
CALL + un numéro d'interruption), que l'écran se trouve à une place différente
du TO, que sa mémoire de fond est codée différemment et que l'instruction
d'arrêt du programme est STOP et non SWI:
DEBUT | LDB $E7C3 | | |
| ANDB #$FE | | | Passe en RAMB
| STB $E7C3 | CALL $04 | |
SUITE | BSR COLOR | BSR COLOR | Change couleurs de forme
| JSR $E806 | CALL $0A | Test clavier
| CMPB #$20 | CMPB #$20 | | Si pas barre
| BNE SUITE | BNE SUITE | | espace, boucle
| SWI | STOP | Arrêt du programme
* Change les couleurs de forme de l'écran
COLOR | LDU #$4000 | LDU #$0000 | Pointeur d'écran
| LDX #8000 | LDX #8000 | Taille de l'écran
COLR0 | LDB ,U | LDB ,U | Lit le segment
| ADDB #$8 | ADDB #$10 | | Incrémente la
| ORB #$80 | | | couleur de forme
| STB ,U+ | STB ,U+ | Ecrit le segment
| LEAX -1,X | LEAX -1,X | | Pour tous les
| BNE COLR0 | BNE COLR0 | | segments de l'écran
| RTS | RTS | Retour de s\programme
| | |
| END | END | * Fin du programme
|