COURS202.TXT
Jump to navigation
Jump to search
******************************************************************
* *
* COURS D'ASSEMBLEUR 68000 SUR ATARI ST *
* *
* par Le F‚roce Lapin (from 44E) *
* *
* Seconde s‚rie *
* *
* Cours num‚ro 2 *
******************************************************************
Nous voici donc repartis pour de nouvelles aventures! Ce second
cours aura pour sujet les TRAP et plus pr‚cis‚ment comment les
programmer soit mˆme.Nous avions vu, dans la premiŠre s‚rie, que
les traps ‚taient un excellent moyen d'acc‚der au systŠme d'ex-
ploitation, et plus g‚n‚ralement d'acc‚der … des espaces prot‚g‚s
(uniquement accessible en mode Superviseur). Nous avions ‚gale-
ment ‚tudi‚ le passage des paramŠtres par la pile, ce qui nous
avait servi pour r‚aliser des subroutines avec paramŠtres.
Le premier exemple va consister … changer la couleur du fond de
l'‚cran, avec une routine fabrication maison, qui sera appel‚e
par un trap.
D'abord la routine:
Etant donn‚ qu'un trap est toujours ex‚cut‚ en Superviseur, nous
n'h‚sitons pas … utiliser les adresses systŠme. La palette de
couleurs du ST est situ‚e … l'adresse $FF8240. Chaque couleur
‚tant cod‚e sur un mot, la couleur 0 est en $FF8240, la couleur 1
en $FF8242 etc...
Nous allons faire 2 routines. Une qui mettra le fond en rouge,
l'autre qui mettra le fond en vert. Les voici:
ROUGE MOVE.W #$700,$FF8240
RTE
VERT MOVE.W #$070,$FF8240
RTE
Une ‚tiquette permet de les rep‚rer (ROUGE et VERT). Les couleurs
‚tant cod‚es en RVB (rouge/vert/bleu. On trouve aussi RGB qui est
la traduction anglaise: red/green/blue) et les niveaux varient de
0 … 7. Nous remarquons que les routines ne se terminent pas par
RTS mais par RTE. Cela signifie Return from exception. Il s'agit
bien en effet d'un retour d'exception et non pas du retour d'une
subroutine classique.
Petit rappel: RTE se lit "return from exception". Je vous rappelle
qu'il faut TOUT lire en Anglais et pas se contenter de lire l'abr‚
viation dont la signification est souvent assez ‚vasive.
Voici le programme 'en entier'.
MOVE.L #MESSAGE,-(SP) toujours sympa de se pr‚senter
MOVE.W #9,-(SP)
TRAP #1 appel GEMDOS
ADDQ.L #6,SP
* Fixer les vecteur d'exception
MOVE.L #ROUGE,-(SP) adresse 'routine'
MOVE.W #35,-(SP) num‚ro de vecteur du trap #3
MOVE.W #5,-(SP) fonction Setexec()
TRAP #13 du bios
ADDQ.L #8,SP
MOVE.L #VERT,-(SP) adresse 'routine'
MOVE.W #36,-(SP) num‚ro de vecteur du trap #4
MOVE.W #5,-(SP) fonction Setexec()
TRAP #13 du bios
ADDQ.L #8,SP
* Les routines sont donc maintenant accessibles par le trap 3 et
par le trap 4.
BSR TOUCHE
TRAP #3
BSR TOUCHE
TRAP #4
BSR TOUCHE
TRAP #3
BSR TOUCHE
MOVE.W #0,-(SP)
TRAP #1
*-------------------------------------*
ROUGE MOVE.W #$700,$FF8240
RTE
VERT MOVE.W #$070,$FF8240
RTE
*-------------------------------------*
TOUCHE MOVE.W #7,-(SP)
TRAP #1
ADDQ.L #2,SP
RTS
*-------------------------------------*
SECTION DATA
MESSAGE DC.B 27,"E","LES TRAPS",0
Facile n'est ce pas ? Et bien maintenant que vous savez mettre
vos propres routines en TRAP et que vous savez ‚galement passer
des paramŠtres … une sub routine, il ne vous reste plus qu'…
faire la mˆme chose. J'estime que vous ˆtes assez grand pour le
faire tout seul et c'est pour cette raison que nous n'allons pas
le faire ici. A vous de travailler! Une seule pr‚caution …
prendre: Une subroutine n'a besoin que de l'adresse de retour et
donc n'empile que cela. Un TRAP par contre, du fait qu'il passe
en Superviseur, sauve ‚galement le Status Register. Il ne faut
donc pas oublier de le prendre en compte pour calculer le saut
qui vous permettra de r‚cup‚rer vos paramŠtres pass‚s sur la
pile. L'adresse de retour est bien s–r cod‚e sur 4 bytes et le
Status Register sur 2. Il y a donc empilage de 6 bytes par le
TRAP qui les d‚pile automatiquement au retour afin de retrouver
d'o— il vient et afin ‚galement de remettre comme avant le Status-
Register. Il ne faudra pas non plus oublier de corriger la pile
au retour.
Comme d'habitude, prenez votre temps et faites de nombreux petits
essais afin de parfaitement comprendre la systŠme.
Regardez ‚galement attentivement la fonction du Bios qui nous a
servi … mettre en place nos deux routines. Si au lieu de lui
fournir la nouvelle adresse pour le vecteur, nous lui passons -1,
cette fonction nous retourne, dans D0.L, l'adresse actuelle
correspondant … ce vecteur. Rien ne nous empˆche donc de demander
l'adresse utilis‚e par le TRAP #1 (Gemdos), de transf‚rer cette
adresse dans le trap #0 (par exemple) et de mettre notre propre
routine dans le TRAP #1. Cela peut aussi vous servir pour
d‚tourner le TRAP. Par exemple pour g‚n‚rer automatiquement des
macros. Il est possible d'imaginer ainsi un programme r‚sident en
m‚moire, qui est plac‚ … la place du trap 13 (Bios). A chaque
fois qu'il y a un appel au Bios, c'est donc notre routine qui est
d‚clench‚e. Etant donn‚ que les appels se font avec empilage
des paramŠtres, il est tout … fait possible de savoir quelle
fonction du Bios on veut appeler. Il est alors possible de r‚agir
diff‚remment pour certaines fonctions. Cela permet par exemple de
tester des appuis sur Alternate+touches de fonction et dans ce
cas, d'aller ‚crire des phrases dans le buffer clavier, ceci afin
de g‚n‚rer des macros!
Note: Un trap ne peut faire appel … des traps plac‚s 'au-dessous'
de lui. Ainsi, dans un trap #1, il est tout … fait possible
d'appeler un trap #13 mais l'inverse n'est pas possible.
Exemple curieux et int‚ressant:
MOVE.W #"A",-(SP)
MOVE.W #2,-(SP)
TRAP #1
ADDQ.L #4,SP
MOVE.W #0,-(SP)
TRAP #1
Ce court programme ne doit pas poser de problŠme. Nous affichons A
puis nous quittons. Assemblez-le, puis passez sous MONST.
Appuyez sur [Control] + P. Vous choisissez alors les pr‚f‚rences
de MONST. Parmi celles-ci, il y a "follow traps", c'est-…-dire
suivre les TRAPs qui, par d‚faut, est sur "NO". Tapez Y pour YES.
Une fois les pr‚f‚rences d‚finies, faites avancer votre programme
pas … pas avec control+Z. A la diff‚rence des autres fois,
lorsque vous arrivez sur le TRAP vous voyez ce qui se passe. Ne
vous ‚tonnez pas, cela va ˆtre assez long car il se passe
beaucoup de chose pour afficher un caractŠre … l'‚cran. Le plus
‚tonnant va ˆtre l'appel au trap #13. Eh oui, pour afficher un
caractŠre le GEMDOS fait appel au Bios!!!!!
Une autre exp‚rience tout aussi int‚ressante:
MOVE.W #"A",-(SP)
MOVE.W #2,-(SP)
MOVE.W #3,-(SP)
TRAP #13
ADDQ.L #6,SP
MOVE.W #0,-(SP)
TRAP #1
Affichage de A mais cette fois avec la fonction Bconout() du
Bios. Assemblez puis passez sous MONST avec un suivi des traps.
Lorsque vous arrivez dans le Bios (donc aprŠs le passage sur
l'instruction TRAP #13), faites avancer pas … pas le programme
mais de temps en temps taper sur la lettre V. Cela vous permet de
voir l'‚cran. Pour revenir sous MONST tapez n'importe quelle
touche. Avancer encore de quelques instructions puis retaper V
etc... Au bout d'un moment vous verrez apparaŒtre la lettre A.
R‚fl‚chissez … la notion d'‚cran graphique et … la notion de fon-
tes et vous comprendrez sans mal ce qui se passe. Surprenant non ?
Quelques petites choses encore: suivez les traps du Bios, Xbios
GemDos et regardez ce qui se passe au d‚but. Vous vous rendrez
compte qu'il y a sauvegarde des registres sur la pile. Seulement
il n'y a pas sauvegarde de TOUS les registres! Seuls D3-D7/A3-A6
sont sauv‚s et donc le contenu de D2 est potentiellement ‚crasa-
ble par un appel au systŠme d'exploitation. La prudence est donc
conseill‚e. En suivant ‚galement les TRAPs vous apercevrez USP.
Cela signifie User Stack Pointer c'est ainsi que l'on d‚signe la
pile utilisateur.
Voil…, normalement les traps n'ont plus de secret pour vous. Vous
devez savoir leur passer des paramŠtres, les reprogrammer etc ...
Vous devez mˆme vous rendre compte qu'en suivant les fonctions du
systŠme d'exploitation, on doit pouvoir d‚couvrir comment se font
telle et telle choses, et ainsi pouvoir r‚‚crire des morceaux de
routines.
Back to ASM_Tutorial