ASSEMBLEUR

 

 
COURS D'ASM 68000
(par le Féroce Lapin)

retour au VOLUME 2

            
******************************************************************
*                                                                *
*               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.