COURS202.TXT/fr

From Atari Wiki
Revision as of 11:41, 24 November 2023 by Exxos (talk | contribs)
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