Vous êtes sur la page 1sur 9

COURS ASSEMBLEUR 6809 E

THOMSON - TO8 - TO8D - TO9 - TO9+


Pour ces cours il vous faudra
=============================
- Le programme: ASS6809.CHG vers 2.0 Programme pour crer
vos fichiers sources et, les assembler.
AVANT PROPOS
Ce cours est destin expliquer la programmation du
MICROPROCESSEUR 6809 E en ASSEMBLEUR.
Je vous conseille tous les livres suivants:
- MANUEL TECHNIQUE des TO8, TO9, et TO9+ par Jean-Claude
MARIACCIA et Olivier SAVIN (disponibles en quelques
exemplaires dans la brocante de PILOUX).
Ce livre prsente entre autres toutes les routine de
l'extramoniteur et du moniteur de ces machines (comportant
des fiches prsentant le point d'entre,les registres
d'entre, de retour, ainsi que des exemples).
- LE MICROPROCESSEUR 6809 SES PERIPHERIQUES ET LE
PROCESSEUR GRAPHIQUE 9365-66, par Claude DARDANNE.
(Modes d'adressage, instructions, codes,interruptions, ...)
bref, une vraie mine !
.
Je vous souhaite un bon apprentissage,et si vous avez des
questions ou des remarques concernant des fautes qui on pu
tre commises, laissez-moi un message dans ma BAL: MACGYVER (
sur
SERVEUR 87 ou PARIS-THOMS).
Bon courage.
.
NB: Sauf demande expresse de votre part,je ne traiterais pas
les instructions du microprocesseur et les multiples cas
possibles qu'elles offrent en combinaison avec les diffrentes
modes d'adressage.
Pour avoir des prcisions sur les instructions et tout ce
qui concerne le 6809 E, consultez le livre "LE MICROPROCESSEUR 6809 E, ...", cit plus haut.
INTRODUCTION
************

Le langage BASIC ne peut tre excut en dehors du


programme appel "INTERPRETEUR". C'est--dire que
chaque instruction du basic est traduite en langage

machine et excute une par une au fur et mesure du


droulement du programme.
Le langage ASSEMBLEUR, lui, ne permet pas d'excuter le
programme directement: Il faut d'abord l'assembler, c'est-dire
le traduire entirement en langage machine, directement
excutable par le processeur.
L'assemblage prend du temps, mais l'excution du programme
une fois assembl est trs rapide.
Les programmes machine, donc ASSEMBLEUR ( c'est le
mme
programme, mais sous une autre forme), utilisant les
instructions du microprocesseur pour raliser leurs
traitements.
Gnralement, pour raliser une action comme afficher un
caractre, trace run trait, on appelle une routine (sous
programme) implant dans la mmoire de l'ordinateur. Les
donnes
ncessaires l'excution de ces sous-programmes sont
REGISTRES. La routine, lors de son appel, lit donc les
registres contenant les valeurs constituant les paramtres
d'entre.
A l'issue de la routine, on rcupre, s'il y a lieu, les
valeurs dans des registres fixes ou a prciser(Ex:chanes de
caratres), constituant les paramtres de retour.(Ex:La
routine PUTC affiche un caractre dont le code ASCII a t
plac dans l'accu B du 6809.
Conventions d'criture:
----------------------Une valeur en hexadcimal sera prcde du signe "$".
Une valeur en dcimal ne sera prcde d'aucun signe spcial.
LES REGISTRES du 6809 E
=======================
Le 6809 E possde plusieurs registres utiliss pour la
manipulation et le traitement des donnes. Ils sont:
-2 accus 8 bits (A et B) transformables en 1 accu 16 bits, D.
Ils sont utiliss pour les instructions arithmtiques et
de chargement de donnes 8 bits (ou 16 bits) en mmoire.
-2 registres d'index X et Y, sur 16 bits. Ils sont
gnralement utiliss pour contenir des adresses de donnes en
mmoire.

-2 registres pointeurs de pile U et S.U est utilis


uniquement par le programmeur, S par le systme. La pile est
un emplacement ou le microprocesseur sauvegarde le contenu de
ses registres internes pendant un certain temps. Elle
fonctionne comme une pile
d'assiettes, ou un fichier squentiel: pour obtenir le contenu
d'un registre, il faut dpiler tous les prcdentes.
Mais rassurez-vous cette tche est entirement (ou presque)
gre par le 6809 E dans des instructions spciales.
-un compteur programme PC ( Program Counter), sur 16 bits,
pointant toujours sur l'adresse que le microprocesseur doit
excuter.
-1 registre "codes conditions", affichant en permanence
l'tat de ces bits. Il fera l'objet d'un paragraphe spcial
traitant galement les instructions de branchement.
-1 registre de "page mmoire" , sur 8 bits, indiquant la page
de mmoire active, et configurable par l'utilisateur.
LES MODES D'ADRESSAGE
=====================
Le 6809, possde 59 instructions " de base". Cela peut
paratre faible, mais combines aux diffrents modes
d'adressage (un peu comme diffrentes faons de faire
comprendre une instruction au microprocesseur), elles offrent
1464
possibilites.
Structure d'une instruction:
Elle comporte de un 4 octets. Gnralement, le premier
octet indique l'action effectuer, les suivants prcisent les
oprandes ou sur quelques registres cette action agira.
L'adressage inhrent, ou implicite:
C'est le plus simple, car les oprandes sont gnralement
incluses dans le code opratoire(donc un octet).
Ex: INCA, incrmentation de 1 de l'accu A.
ABX, addition de l'accu B au registre X.
TFR

A,B transfert le contenu de A dans B.

Dans ce dernier cas, un post-octet (situ aprs le code


opratoire) prcise quelles sont les oprations de
l'instruction. 5 Dans cet exemple, les oprandes sont A et B).
Ce mode de l'adressage inhrent est est utilis aussi dans
les instructions d'accs aux piles, pour prciser quels
sont les registres dpiler/empiler.

L'adressage immdiat:
=====================
Dans ce mode, l'oprande que l'instruction doit prendre en
compte est situe aprs le code opratoire.
Ex: LDA
#$DF Chargement de A avec la valeur
hexadcimal DF.( le symbole "$" prcise que la donne est en
hexadcimal. Pour les instructions LDa (a: accu quelconque),la
valeur a charger dans l'accu doit tre du mme type que cet
accu (8 bits
pour A,B et 16 bits pour X,Y,U,S,D).
Les instructions de stockage en mmoire ( STa, a: accu du
microprocesseur) n'existent pas en adressage immdiat, car ces
instructions n'agissent que sur la mmoire.
Ce mode d'adressage est utilis pour configurer des
registres (microprocesseur ou RAM) en vue de l'appel ultrieur
d'une routine de l'ordinateur ou bien d'un sous-programme.
L'appel de cette routine se fera
par: JSR
ADRESSE, ADRESSE tant le dbut du sous-programme
(=point d'entre).
JSR (Jump to SubRoutine) est l'assembleur ce que GOSUB est
au BASIC. Un retour de sous-programme se fera par
un RTS(Return of SubRoutine). RTS est l'quivalent
de RETURN sous BASIC.
L'adressage direct:
===================
Ce mode d'adressage permet de travailler sur la mmoire.
L'oprande d'une instruction en adressage direct ne sera
constitue que d'un seul octet registre mmoire sur lequel il
faut agir.
Explications...:
On notera que l'adresssage direct sera spcifi par le
signe "<" plac devant l'oprande, dans la syntaxe assembleur.
Ex: Si le registre de page vaut $A1:
l'instruction STA
<$45 stockera le contenu de
l'accu A en $A145. et de l'oprande (poids faibles, $45).

Ce mode prsente l'avantage d'tre excut


rapidement, mais ne peut tre utilis que lorsqu'on ne
travaille pas sur des zones de mmoire trop importantes
(256 octets).
Une toute autre faon de concevoir cet affichage, le tout
tant d'arriver au rsultat escompt. Nous commencerons par

dcider de l'endroit de la mmoire vive de notre programme en


langage machine sera log; en utilisant la directive ORG.

.
Avec ORG $8000, on va dcider de l'implanter partir de cette adresse dans la partie
utilisateur non commutable de la RAM (voir page 189 guide du TO8). L'assembleur va alors,
automatiquement, se charger de ranger squentiellement le code de
chacune des instructions ou donnes de votre programme
partir de l'adresse $8000.
Notre programme commence donc ainsi:
*affichage d'un caractre graphique mode 320X200 16 couleurs
ORG $8000
PSHS U,Y,X,DP,B,A
*communication mode TO7/70
LDA #$00
STA $E7DC
Les lignes prcdes d'un * sont des commentaires non pris en
compte lors de l'assemblage. On a commenc par sauvegarder
dans la pile systme S, le contenu des
registres U,Y,X,DP,B,A ;c'est une sage prcaution prendre !
Puis le programme choisit le mode TO7/70 en mettant la valeur
0 dans le registre &HE7DC.
*mmorisation adresse 1er octet de l'cran.
LDX #$4000
*calcul adresse de l'octet situ ligne L (coordonne
caractre)
*et colonne C(en coordonne caractre) donn par formule
*adr=$4000+C+(L*8*($28)) avec 0<=L<=24 et 0<=C<=39
LDB COORL
*calcul valeur d'octet pour ligne du dessous
LDA COORL
LDB #$08
MUL
LDA #$28
MUL
LEAX D,X
Cette partie du programme mrite quelques explications. Le
guide du TO8 nous informe page 189 que la mmoire vido
s'tend de l'adresse &H4000 jusqu' &H5FFF; cela nous
intresse.
On va donc ranger dans le registre X de 16 bits la valeur de
l'adresse mmoire du premier segment d'cran en haut gauche.
Mais ce qu'il faut connatre c'est l'adresse mmoire vido qui
correspond un segment quelconque situ colonne Cligne L. La
formule de calcul est fournie en commentaire dans le
programme. On peut la vrifier car si
&H4000+1+(0*&H28)=&H4001.
L'cran contenant 40 segments de 8 points (40=&H28).

Les instructions du programme ont pour but de calculer la


formule arithmtique explicite. Pour cela on range dans le
registre 8bits B la valeur du numro de colonne (dsign par
COORC) le logo va commencer s'afficher, on additionne cette
valeur celle contenue dans X qui est une valeur du premier
octet et on laisse le rsultat dans X. Puis on met dans le
deuxime registre
8 bits A, la valeur (COORL) du numro de ligne (en coordonne
caractre) va s'afficher le logo. Il faut multiplier par 8,
cette coordonne caractre de la ligne pour avoir sa valeur en
coordonne graphique. Donc, on met la valeur 8 dans le
registre
B(il est libre),celle-ci sera notre multiplicateur et on crit
la puissante instruction MUL qui a pour effet de multiplier le
contenu de A par B en rangeant le rsultat dans D(D est un
registre 16 bits form par l'association de A et de B). La il
y a une astuce, car en fait le rsultat de 8 multipli par le
numro
de la ligne (en coordonne caractre) tant toujours infrieur
255 n'occupera que 8 bits donc la partie droite de
l'accumulateur 16 bits D !
Donc on pourra en toute tranquillit charger la
valeur &H28 dans la partie gauche de D, donc A sans altrer le
contenu de B. Et on emploie nouveau l'instruction MUL pour
multiplier les contenus de A et de B avec rangement du
rsultat dans D. On obtiendra finalement le rsultat de notre
formule (pour calculer l'adresse mmoire d'un segment)en
ajoutant la valeur de l'adresse du premier segment d'cran.
C'est le rle de l'instruction LEAX D,X, car X pointera
maintenant sur l'adresse du segment dbutant
colonne C ligne L. La valeur indiqu par X sera utilis pour
la suite pour y envoyer les donnes vers la mmoire vido. La
suite du programme consiste afficher ligne par ligne chacun
des segments, en envoyant dans la mmoire vido les valeurs de
chaque segment .On commence par slectionner la mmoire forme
ou RAM A(la RAM B tant la mmoire couleurs).
*commutation mmoire forme
LDA $E7C3
ORA #$01
STA $E7C3
Il s'agit par ces 3 instructions dedonner la valeur 1 au bit
n de l'octet d'adresse &HE7C3 pour raliser cette
communication. Le programme ira chercher les donnes dans la
zone mmoire que vous devrez prciser et qui sera repre par
des tiquettes. Un peu comme en BASIC on met des donnes
l'aide de l'instruction DATA et on repre ces donnes grce
aux numros de lignes.

Les donnes utilises par le programme sont d'une part le


numro de ligne et le numro de colonne sera affich le bord
suprieur gauche du LOGO, et d'autre part les caractristiques
du LOGO soit les codes des 48 segments qui le composent.
Laissons l notre programme en sautant quelques lignes et
crivons en fin de listing l'ensemble de ces donnes. Comme
nous avons dcid de ranger le code du programme partir de
l'adresse
&H8000, celui-ci sera rang dans les
adresses &H8000,&H8001,&H8002 etc..

Pour ne pas prendre de risque de chevauchement entre la


zone du programme et celle des donnes prenons
l'adresse &H8100pour ranger la premire donne.
*rangement des donnes
ORG &8100
COORC FCB &H15
LOGO

FCB
FCB
FCB
FCB
FCB
FCB
FCB
FCB

$FF,$FF,$80,$80,$00,$80
$80,$00,$80,$BC,$7E,$80
$A4,$02,$80,$A4,$06,$80
$A4,$0C,$80,$BC,$18,$80
$A4,$C0,$80,$BD,$80,$80
$A4,$C0,$80,$80,$00,$80
$80,$00,$80,$80,$00,$80
$80,$00,$80,$FF,$FF,$80

END
L'tiquette COORC pointera sur l'adresse &H8100 qui contient
la valeur dcimale (dsigne par &) 15 reprsentant le numro
de colonne, l'tiquette COORL pointera sur
l'adresse &H8101 contenant la valeur 10, puis LOGO pointera
sur l'adresse &H8102contenant la valeur segment du
logo. FCB est une directive d'assemblage qui permet de
rserver un espace de 8 bits pour y ranger une valeur.
Remontons dans la suite de notre programme et crivons les
instructions pour transfrer les donnes.
Donc suite l'instruction STA $E7C3 slectionner la mmoire
forme) on crira
*rcupration et transfert des donnes
LDY #LOGO
LDA #&16
LSUIV
LDB ,Y+
STB ,X+
LDB ,Y+

STB ,X+
LDB ,Y+
STB ,X
On charge dans le registre 16 bits Y l'adresse pointe par
l'tiquette LOGO (cette adresse vaut &H8102) et on se sert du
registre A pour compter les lignes afficher( 16 lignes au
total). On dmarre par l'tiquette LSUIV, une boucle de
transfert de donnes pour chacune des 16 lignes avec 3
segments
par ligne. On met dans B le contenu de l'adresse point par
Y(donc la valeur situe en &H8102 soit $FF) puis on augmente Y
de
1 et la prochaine adresse pointe sera &H8103 qui contient la
seconde valeur soit $FF. On range ensuite la valeur contenue
dans
B l'adresse indiqu par le registre X (celui-ci rappelons le
conserve l'adresse de la mmoire vido). On augmente de 1
l'adresse vido pour pointer sur le segment suivant et on
recommence trois fois la mme opration en augmentant chaque
fois de 1 les registres Y et X pour rcuprer la valeur
suivante du logo et passer la case mmoire vido suivante.
Une fois le troisime segment affich il n'est plus question
de continuer sue la mme ligne mais il faut passer la ligne
du dessous et s'aligner nouveau sur la colonne de gauche.
Pour cela il faut retrouver la bonne adresse vido
correspondante.
LEAX $26,X
DECA
BNE
LSUIV
PULS A,B,DP,X,Y,U
SWI
On fait pointer alors X sur le 1er segment de la ligne du
dessous donc pour obtenir son adresse partir de l'adresse du
3me segment que l'on vient de traiter on ajoute 40 et on
retranche 2 soit ajouter 38 (38 s'crit 26 en hxa). On
diminue de 1 notre compteur de ligne et s'il n'est pas nul on
aura pas fini de
traiter les 16 lignes on recommence la boucle en se branchant
l'endroit du programme dsign par LSUIV (dbut de
la boucle ).
Quand le compteur de ligne est zro le programme se termine,
on rcupre le contenu des registres par PULS et on termine
par l'instruction d'interruption SWI (non pas RTS car on
excutera ce
programme partir de l'assembleur et non pas du Basic).
Rappelons qu'a la suite de l'instruction SWI le listing du
programme n'est pas termin puisque nous avons crit toute
la partie de stockage des donnes vue plus haut. La fin
logique du programme c'est la directive END qui est l pour

l'indiquer.
III-EXECUTION DU PROGRAMME
Le programme ainsi dit s'appelle le programme source.
Il est recommand de le sauvegarder sur disquette avant la
phase d'assemblage. Il sera converti en langage machine par la
commande A (assemblage).
Un assemblage en mmoire permet de le tester. Pour cela
quitter l'diteur et passer en mode moniteur par la touche X.
Une fois dans l'environnement du moniteur le programme se
lance par la commande GO, celle-ci sera tape aprs le
prompt >, sous cette forme: G$8000 (cela signifie lancer le
programme commenant l'adresse &H8000)
Le programme est interrompu ds qu'il rencontre
l'instruction SWI.