Initiation à lassembleur 6809
Exemples de programmes
Programme de dessin
Et si nous dessinions un peu avec le crayon optique ou la souris ? Pour les deux, le programme
est le même. Il suffira de choisir loption voulue dans « Réglages et préférences ».
Les modalités seront les suivantes :
- Lécran sera bleu sur blanc
- On sortira du programme en tapant sur la barre espace.
En entrée de programme, lécran est initialisé. Les coordonnées courantes sont récupérées pour afficher
le point de départ du tracé. Puis un événement est attendu. Si le bouton de la souris ou du crayon nest
pas appuyé, on est en mode relâche : seul le curseur apparaît à lécran. Si le bouton est
appuyé, on est en mode tracé.
En mode relâche, si le crayon ou la souris nont pas changé de position, le point du curseur ne sera
pas mis à jour pour quil ne clignote pas frénétiquement. Pendant un mouvement, le point précédent
est effacé et le nouveau point est affiché. Il est convenu quune routine permettant la commutation
du point suffit à assurer lallumage et leffacement du point. Si la couleur de forme est
4 (bleu) et la couleur de fond est -8 (blanc) soit $F8 en 8 bits, un XOR avec la valeur $FC (soit $F8
+ $04) suffit à commuter entre ces deux valeurs.
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 :
DEBUT | LDU #MSIN | LDU #MSIN | Pointe sur le message dinitialisation
| BSR AFFM | BSR AFFM | Initialise lécran
| CLR $6041 | CLR $2036 | Demande le tracé en mode graphique
* Attend une capture de coordonnées valide
B0 | SET * | SET * |
| JSR $E818 | CALL $18 | Lit les coordonnées crayon/souris
| BCS B0 | BCS B0 | Si illisibles, nouvelle tentative
| BSR INVER | BSR INVER | Inverse le point affiché
* Attend un évènement
B0 | SET * | SET * |
| JSR $E81B | CALL $16 | Lit le bouton crayon/souris
| BCS AFFIC | BCS AFFIC | Si le bouton est enfoncé, affiche le point
| JSR $E818 | CALL $18 | Lit les coordonnées crayon/souris
| BCS NEXT | BCS NEXT | Si mauvaise lecture, passe
* Affichage du curseur
| CMPX $603D | CMPX $2032 | |
| BNE COMM | BNE COMM | | Si les nouvelles coordonnées sont égales
| CMPY $603F | CMPY $2034 | | au coordonnées courantes, passe
| BEQ NEXT | BEQ NEXT | |
COMM | PSHS X,Y | PSHS X,Y | Protège les nouvelles coordonnés en pile
| LDX $603D | LDX $2032 | Lit labscisse du point précédent
| LDY $603F | LDY $2034 | Lit lordonnée du point précédent
| BSR INVER | BSR INVER | Inverse (efface) le point précédent
| PULS X,Y | PULS X,Y | Récupère les coordonnées du nouveau point
| BSR INVER | BSR INVER | Inverse (allume) le nouveau point
| BRA NEXT | BRA NEXT | Attend lévénement suivant
* Affichage dun segment
AFFIC | JSR $E818 | CALL $18 | Lit les coordonnées crayon/souris
| BCS NEXT | BCS NEXT | Si mauvaise lecture, passe
| LDB #4 | LDB #4 | | Fixe la couleur 4 (bleu)
| STB $6038 | STB $2029 | | pour le tracé
| JSR $E80C | CALL $0E | Trace le segment
* Test frappe de barre espace
NEXT | JSR $E806 | CALL $0A | Lit le clavier
| CMPB #$20 | CMPB #$20 | | Si barre espace pas appuyée,
| BNE B0 | BNE B0 | | boucle sur le programme
FIN | SWI | STOP | Arrêt du programme
* Inversion du point de curseur
INVER | JSR $E821 | CALL $14 | Lit la couleur du point
| EORB #$FC | EORB #$FC | Commute la couleur
| STB $6038 | STB $2029 | Initialise la nouvelle couleur
| JMP $E80F | CALL $10+$80 | Affiche le point
* Programme dinitialisation de lécran
B0 | SET * | SET * |
| JSR $E803 | CALL $02 | Envoie à la routine PUTC$
AFFM | LDB ,U+ | LDB ,U+ | Lit un caractère
| BNE B0 | BNE B0 | Si pas caractère 0, envoie le caractère
| RTS | RTS | Retour au programme principal
* Message dinitialisation de lécran
MSIN | FCB $1F,$20,$20 | FCB $1F,$20,$20 | | Déclaration dune fenêtre
| FCB $1F,$12,$14 | FCB $1F,$12,$14 | | dune ouverture maximum
| FCB $1B,$40 | FCB $1B,$40 | Couleur de forme 0 (noir)
| FCB $1B,$57 | FCB $1B,$57 | Couleur de fond 7 (blanc)
| FCB $1B,$67 | FCB $1B,$67 | Couleur de tour décran 7 (blanc)
| FCB $0C | FCB $0C | Efface lécran
| FCB $00 | FCB $00 | - Fin de message -
| END | END | Fin du programme à assembler
Un peu de musique
« Au clair de la lune », vous connaissez ? Faisons jouer ce thème par le Thomson.
Afin dobtenir une partition claire, les octaves et les notes seront définies par des EQU. Les
valeurs concernant les octaves seront augmentées de $80. La même partition sera utilisée pour les TO
et les MO. Vous remarquerez que les phrasés 1, 2 et 4 de la partition sont rigoureusement identiques.
Vous pourrez les dupliquer à lédition en tapant « Z »+RET, en déplaçant par les curseurs
pour couvrir la zone à copier, en tapant « C »+RET, en positionnant ensuite par les curseurs
lendroit de la copie et en tapant « I »+RET dans la barre dédition dAssembler.
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 :
* Définition des valeurs pour les octaves
O1 | EQU 16+$80 | EQU 16+$80 | Valeur pour octave 1 + $80
O2 | EQU 8+$80 | EQU 8+$80 | Valeur pour octave 2 + $80
O3 | EQU 4+$80 | EQU 4+$80 | Valeur pour octave 3 + $80
O4 | EQU 2+$80 | EQU 2+$80 | Valeur pour octave 4 + $80
O5 | EQU 1+$80 | EQU 1+$80 | Valeur pour octave 5 + $80
* Définitions des valeurs pour les notes
SL | EQU $30 | EQU $00 | Valeur pour le silence
DO | EQU $31 | EQU $01 | Valeur pour le DO bécarre
RE | EQU $33 | EQU $03 | Valeur pour le RE bécarre
MI | EQU $35 | EQU $05 | Valeur pour le MI bécarre
FA | EQU $36 | EQU $06 | Valeur pour le FA bécarre
SO | EQU $38 | EQU $08 | Valeur pour le SOL bécarre
LA | EQU $3A | EQU $0A | Valeur pour le LA bécarre
SI | EQU $3C | EQU $0C | Valeur pour le SI bécarre
* Initialisation des registres de musique
DEBUT | LDD #4 | LDD #4 | | Initialise loctave
| STD $6036 | STD $203E | | à 4
| LDD #12 | LDD #12 | | Initialise la durée
| STD $6033 | STD $203B | | à 12
| LDD #5 | LDD #5 | | Initialise le tempo
| STD $6031 | STD $2039 | | à 5
| LDB #0 | LDB #0 | | Initialise le timbre
| STB $6035 | STB $203D | | à 0
* Joue la musique
| LDX #MUSIQ | LDX #MUSIQ | Pointeur sur partition
B0 | SET * | SET * |
| LDB ,X+ | LDB ,X+ | Lit une valeur de partition
| BLT OCTAV | BLT OCTAV | Si b7 à 1, change doctave
| BITB #$40 | BITB #$40 | | Si b6 à 1,
| BNE FIN | BNE FIN | | sort du programme
| JSR $E81E | CALL $1E | Envoie le code de note à jouer
| BRA B0 | BRA B0 | Lit la suite de la partition
OCTAV | ANDB #$7F | ANDB #$7F | Enlève le b7 à 1
| STB $6036+1 | STB $203E+1 | Initialise la nouvelle octave
| BRA B0 | BRA B0 | Lit la suite de la partition
FIN | SWI | STOP | Arrêt du programme
* Même partition pour TO et MO
* Phrasé 1
MUSIQ FCB O4,DO,DO,DO,RE,MI,SL,RE,SL
FCB DO,MI,RE,RE,DO,SL,SL,SL
* Phrasé 2
FCB O4,DO,DO,DO,RE,MI,SL,RE,SL
FCB DO,MI,RE,RE,DO,SL,SL,SL
* Phrasé 3
FCB RE,RE,RE,RE,O3,LA,SL,LA,SL
FCB O4,RE,DO,O3,SI,LA,SO,SL,SL
FCB SL
* Phrasé 4
FCB O4,DO,DO,DO,RE,MI,SL,RE,SL
FCB DO,MI,RE,RE,DO,SL,SL,SL
* Appendice
FCB SL,DO,DO,DO,RE,SL,SO,SL,DO
FCB $40 - Fin du message -
| END | END | Fin du programme à assembler
|