Initiation à lassembleur 6809
Exemples de programmes
Agrandissement dun caractère affichable
Proposons-nous dagrandir un caractère affichable sur lécran selon les modalités suivantes :
- Le caractère à afficher se trouvera en haut à gauche de lécran.
- Le caractère agrandi pourra être dimensionné à volonté et sera centré sur lécran.
- Pour avoir tel ou tel caractère à lécran, il suffira de frapper la touche du caractère au clavier.
- On sortira du programme en tapant sur la barre espace.
Pour que le caractère agrandi soit au milieu de lécran, il faut positionner
le premier pavé de telle sorte quil se trouve à la moitié de lécran moins la moitié du caractère
agrandi. La formule pour labscisse X0 sera donc 160-(XSIZ*4), puisque le caractère agrandi comporte
8 pavés en largeur et la formule pour lordonnée Y0 sera donc 100-(YSIZ*4), puisque le caractère
agrandi comporte 8 pavés en hauteur. Les étiquettes sont en première colonne, le programme TO en 2ème
colonne, le programme MO en 3ème colonne et les commentaires en 4ème colonne :
XSIZ | EQU 24 | EQU 24 | Largeur dun pavé (maximum 38)
YSIZ | EQU 24 | EQU 24 | Hauteur dun pavé (maximum 24)
X0 | EQU 160-(XSIZ*4) | EQU 160-(XSIZ*4) | Abscisse du premier pavé
Y0 | EQU 100-(YSIZ*4) | EQU 100-(YSIZ*4) | Ordonnée du premier pavé
* Initialise l'écran
DEBUT | LDU #MSIN | LDU #MSIN | Pointe sur la séquence dinitialisation
| BSR AFFM | BSR AFFM | Exécute la séquence dinitialisation
* Initialise le tracé
| CLR $6041 | CLR $2036 | Demande le mode graphique
| LDB #0 | LDB #0 | | Couleur 0 pour couleur de trait (on
| STB $6038 | STB $2029 | | aurait pu écrire CLRB plutôt que LDB #0)
* Préparation des registres
| LDX #X0 | LDX #X0 | Charge labscisse du point de départ
| LDY #Y0 | LDY #Y0 | Charge lordonnée du point de départ
| LDU #$4000 | LDU #$0000 | Charge le pointeur du caractère sur lécran
* Programme d'affichage
B0 | SET * | SET * |
| LDB $E7C3 | | | La RAMA doit être constamment
| ORB #$01 | | | réactivée puisque les routines de traçage
| STB $E7C3 | CALL $06 | | de point et de ligne forcent en RAMB
| LDB ,U | LDB ,U | Lit le segment courant
| LDA #$08 | LDA #$08 | 8 segments à lire en tout
B1 | SET * | SET * |
| ASLB | ASLB | Expulse le bit 7 (se retrouve dans C de CC)
| BSR BOXF | BSR BOXF | Affiche un BOXF ou un BOX
| LEAX XSIZ,X | LEAX XSIZ,X | Déplace labscisse dune case
| DECA | DECA | Nombre de segments - 1
| BNE B1 | BNE B1 | Si nombre de segments <> 0, segment suivant
| LEAX -(XSIZ*8),X | LEAX -(XSIZ*8),X | Rétablit labscisse au début du pavé
| LEAY YSIZ,Y | LEAY YSIZ,Y | Déplace lordonnée dune rangée de cases
| LEAU 40,U | LEAU 40,U | Pointe sur le segment suivant du caractère
| CMPU #$4000+(40*8) | CMPU #$0000+(40*8) | | Si pas dernier segment du caractère
| BLO B0 | BLO B0 | | affiché à lécran, traite le segment
* Attente de frappe d'une touche
WKEY | JSR $E806 | CALL $0A | Lit le clavier (B = code de touche appuyée)
| CMPB #$20 | CMPB #$20 | Compare au code de touche 32
| BEQ EXIT | BEQ EXIT | Si barre espace appuyée, fin du programme
| BLT WKEY | BLT WKEY | Si inférieur ou négatif, nouvelle lecture
| STB CARAC | STB CARAC | Sinon, initialise le code caractère
| BRA DEBUT | BRA DEBUT | ...et affiche le caractère
EXIT | SWI | STOP | Arrêt du programme
* Affichage d'un BOXF
BOXF | PSHS A,X,Y | PSHS A,X,Y | Empile les registres
| BCC BOX | BCC BOX | Si pixel à 0, trace un BOX
| LDA #YSIZ+1 | LDA #YSIZ+1 | Charge hauteur du BOXF
B0 | SET * | SET * |
| JSR $E80F | CALL $10 | Trace le point de départ (X0,Y)
| LEAX XSIZ,X | LEAX XSIZ,X | Déplace labscisse de la largeur dun pavé
| JSR $E80C | CALL $0E | Trace le segment (X0,Y)-(X1,Y)
| LEAX -XSIZ,X | LEAX -XSIZ,X | Retour de labscisse en début de pavé
| LEAY 1,Y | LEAY 1,Y | Ordonnée de la ligne en dessous (Y=Y+1)
| DECA | DECA | | Pour toute la
| BNE B0 | BNE B0 | | hauteur du pavé
BOXF0 | PULS A,X,Y,PC | PULS A,X,Y,PC | Restaure les registres
* Affichage d'un BOX
BOX | JSR $E80F | CALL $10 | Trace le point de départ (X0,Y0)
| LEAX XSIZ,X | LEAX XSIZ,X | Déplace labscisse à droite du pavé
| JSR $E80C | CALL $0E | Trace le segment (X0,Y0)-(X1,Y0)
| LEAY YSIZ,Y | LEAY YSIZ,Y | Déplace lordonnée en bas du pavé
| JSR $E80C | CALL $0E | Trace le segment (X1,Y0)-(X1,Y1)
| LEAX -XSIZ,X | LEAX -XSIZ,X | Retour de labscisse à gauche du pavé
| JSR $E80C | CALL $0E | Trace le segment (X1,Y1)-(X0,Y1)
| LEAY -YSIZ,Y | LEAY -YSIZ,Y | Retour de lordonnée en haut du pavé
| JSR $E80C | CALL $0E | Trace le segment (X0,Y1)-(X0,Y0)
| PULS A,X,Y,PC | PULS A,X,Y,PC | Restaure les registres
* Affichage d'un message
B0 | SET * | SET * |
| JSR $E803 | CALL $02 | Envoie le caractère à PUTC$
AFFM | LDB ,U+ | LDB ,U+ | Lit un caractère
| BNE B0 | BNE B0 | Si pas caractère $00, envoie le caractère
| RTS | RTS | Retourne au programme principal
* Message d'initialisation de l'écran
MSIN | FCB $1F,$20,$20 | FCB $1F,$20,$20 | | Ouverture maximum
| FCB $1F,$12,$14 | FCB $1F,$12,$14 | | de la fenêtre
| FCB $1B,$40 | FCB $1B,$40 | Couleur 0 pour la forme
| FCB $1B,$57 | FCB $1B,$57 | Couleur 7 pour le fond
| FCB $1B,$67 | FCB $1B,$67 | Couleur 7 pour le tour décran
| FCB $0C | FCB $0C | Efface lécran
CARAC | FCB 32 | FCB 32 | Affiche le caractère en haut à gauche
| FCB 0 | FCB 0 | - Fin du massage -
| END | END | Fin du programme à assembler
Pour rappel, le passage rapide dune page à lautre sous éditeur assembleur se fait par les touches HOME et RAZ (SHIFT+HOME).
Chargement dun secteur de disquette en mémoire
Selon les lecteurs de disquettes, le nombre de face et de pistes peut varier, le nombre de secteurs
étant toujours le même pour une piste (16) et le catalogue débutant toujours au même endroit (piste
20/secteur 3). Pour la routine Moniteur de chargement dun secteur, le code dopération, le
numéro de lecteur, le numéro de piste, le numéro de secteur et le pointeur sur le buffer de secteur
doivent être initialisés.
Chargeons le premier secteur du catalogue dune disquette en mémoire :
- Le numéro de lecteur sera défini par DRIVE.
- Le numéro de piste sera défini par TRACK.
- Le numéro de secteur sera défini par SECT.
Si une erreur survient au chargement du secteur (« NON » au break),
le code derreur se trouvera dans B.
Il est à noter que lerreur dopération disquette est mémorisée
par le bit C de CC (0=pas derreur/1=erreur). Le test derreur en retour de routine Moniteur
devra donc être assuré par un « BCC » ou un « BCS ». Libre à vous de pousser le
scrupule jusquà afficher en toutes lettres un message lors dune erreur.
Les étiquettes sont en première colonne, le programme TO en 2ème colonne,
le programme MO en 3ème colonne et les commentaires en 4ème colonne :
* Initialisation des valeurs utiles
DRIVE | EQU 0 | EQU 0 | Numéro de lecteur
TRACK | EQU 20 | EQU 20 | Numéro de piste
SECT | EQU 3 | EQU 3 | Numéro de secteur
* Programme de chargement du secteur
DEBUT | LDB #$02 | LDB #$02 | | Force en mode
| STB $6048 | STB $2048 | | « lecture de secteur »
| LDB #DRIVE | LDB #DRIVE | | Fixe le numéro
| STB $6049 | STB $2049 | | de lecteur
| LDD #TRACK | LDD #TRACK | | Fixe le numéro
| STD $604A | STD $204A | | de piste à lire
| LDB #SECT | LDB #SECT | | Fixe le numéro
| STB $604C | STB $204C | | de secteur à lire
| LDU #MEM | LDU #MEM | | Fixe ladresse de chargement
| STU $604F | STU $204F | | du secteur
| JSR $E82A | CALL $26 | Lit le secteur
| BCS ERROR | BCS ERROR | Si erreur, « NON » au break
OUI | SWI | STOP | Pas derreur, « OUI » au break
ERROR | LDB $604E | LDB $204E | Récupère le numéro de lerreur
NON | SWI | STOP | Arrêt du programme
MEM | RMB 256 | RMB 256 | Buffer pour le secteur à lire
| END | END | Fin du programme à assembler
|