Initiation à lassembleur 6809
Cours n°7
Décalages
Les instructions de décalage portent sur les registres A, B et tout registre mémoire. Le
programmeur y a recours entre autres:
- Arithmétiquement, la multiplication et la
division par 2, 4, 8, 16, 32, 64, 128, 256, etc... donc par une puissance de 2.
- Graphiquement, le décalage d'un ou plusieurs
segments d'un bit vers la droite ou la gauche (scrolling).
ASLA Décale le registre 8 bits A d'un bit vers la gauche
ASLB Décale le registre 8 bits B d'un bit vers la gauche
ASL Décale le registre mémoire 8 bits d'un bit vers la gauche
Ces trois instructions ne récupèrent pas de bit entrant. Le registre est décalé vers la gauche et le
bit 0 est positionné à 0.
LDA #$18 < Charge le registre A avec la valeur $18
ASLA < A prend alors la valeur $18*2 soit $30
LSLA Décale le registre 8 bits A d'un bit vers la gauche
LSLB Décale le registre 8 bits B d'un bit vers la gauche
LSL Décale le registre mémoire 8 bits d'un bit vers la gauche
Ces trois instructions ont respectivement le même effet que ASLA, ASLB et ASL.
ASRA Décale le registre 8 bits A d'un bit vers la droite
ASRB Décale le registre 8 bits B d'un bit vers la droite
ASR Décale le registre mémoire 8 bits d'un bit vers la droite
Ces trois instructions récupèrent l'état du bit 7 comme bit entrant. Le registre est décalé vers la
droite et le bit 7 est positionné selon l'état du bit 7 précédant le décalage
LDA #$08 < Charge le registre A avec la valeur $08
ASRA < A prend alors la valeur $08/2 soit 4
...
LDA #$84 < Charge le registre A avec la valeur $84
ASRA < A prend alors la valeur $84/2 soit $42 plus
$80 puisque le bit 7 était à 1 avant le
décalage soit A=$C2
LSRA Décale le registre 8 bits A d'un bit vers la droite
LSRB Décale le registre 8 bits B d'un bit vers la droite
LSR Décale le registre mémoire 8 bits d'un bit vers la droite
Ces trois instructions ne récupèrent pas de bit entrant. Le registre est décalé vers la droite et le
bit 7 est positionné à 0.
LDA #$20 < Charge le registre A avec la valeur $20
LSRA < A prend alors la valeur $20/2 soit $10
ROLA Décale le registre 8 bits A d'un bit vers la gauche avec retenue
ROLB Décale le registre 8 bits B d'un bit vers la gauche avec retenue
ROL Décale le registre mémoire 8 bits d'un bit vers la gauche avec retenue
Ces trois instructions récupèrent l'état du flag C de CC comme bit entrant. Le registre est décalé
d'un bit vers la gauche et le bit 0 est positionné selon l'état du flag C de
CC.
LDA #$50 < Charge le registre A avec la valeur $50
LDB #$C0 < Charge le registre B avec la valeur $C0
ASLB < Décalage de B ; bit sortant = 1 donc C=1
ROLA < A prend alors la valeur $50*2 + la retenue consécutive au décalage de A soit $A1
RORA Décale le registre 8 bits A d'un bit vers la droite avec retenue
RORB Décale le registre 8 bits B d'un bit vers la droite avec retenue
ROR Décale le registre mémoire 8 bits d'un bit vers la droite avec retenue
Ces trois instructions récupèrent l'état du flag C de CC comme bit entrant. Le
registre est décalé d'un bit vers la droite et le bit 7 est positionné selon
l'état du flag C de CC.
LDA #$11 < Charge le registre A avec la valeur $11
LDB #$10 < Charge le registre B avec la valeur $10
LSRA < Décalage de A ; bit sortant = 1 donc C=1
RORB < B prend alors la valeur $10/2 + la retenue
consécutive au décalage de A soit $88
Pour toutes ces instructions, le flag C de CC est chargé selon l'état du bit sortant.
Un petit programme pour faire scroller l'écran du moniteur. Ce programme fait non seulement scroller l'écran horizontalement mais
aussi verticalement de telle façon que les segments sortant du haut de l'écran
sont récupérés en bas. Une astuce que nous permet l'instruction ADCB vue dans
le cours précédent.
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. Et 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
SWI + un numéro d'interruption), que l'écran se trouve à une place différente
du TO et que l'instruction d'arrêt du programme est STOP et non SWI:
DEBUT | LDB $E7C3 | | |
| ORB #$01 | | | Passe en RAMA
| STB $E7C3 | CALL $06 | |
* Boucle sur scroll en attendant inkey
NEXT | BSR SCROLL | BSR SCROLL | Déplace l'écran
| JSR $E806 | CALL $0A | Test clavier
| CMPB #$20 | CMPB #$20 | | Si pas barre
| BNE NEXT | BNE NEXT | | espace, boucle
| SWI | STOP | Sortie programme
* Décalage de l'écran
SCROLL | LDX #$4000+8000 | LDX #$0000+8000 | Ptr sur écran
| LDY #7999 | LDY #7999 | Taille écran
| CLRB | CLRB | Efface valeur der seg
| ASL ,-X | ASL ,-X | Décale premier
SCROL0 | ROL ,-X | ROL ,-X | Décale suivant + C
| LEAY -1,Y | LEAY -1,Y | | Pour tous les
| BNE SCROL0 | BNE SCROL0 | | segments
| ADCB $4000+7999 | ADCB $0000+7999 | Ajoute retenue
| STB $4000+7999 | STB $0000+7999 | Ajourne dern segment
| RTS | RTS | Retour s\programme
| | |
| END | END | Fin du programme
|