COURS208.TXT/fr

From Atari Wiki
Revision as of 14:07, 23 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 8                         *
   ******************************************************************

   J'esp�re que vous n'abordez pas ce cours imm�diatement apr�s avoir
   fini  de  lire le pr�c�dent, mais, qu'au contraire, vous vous �tes
   plong� dans la ligne A avec bonheur!

   Nous  allons  maintenant  aborder  un sujet qui, je dois l'avouer,
   m'effrayait un peu au d�but: le GEM.

   En  fait, en programmation comme dans beaucoup d'autres sujets, on
   se  met  �  bosser  simplement  lorsqu'on  y  est oblig�. Ainsi je
   n'avais   r�alis�  que  de  tout  petits  trucs  avec  le  GEM  en
   assembleur, des  trucs du genre ACCessoire de bureau qui permet de
   mettre  l'�cran  en  inverse  vid�o, avec  un choix dans une bo�te
   d'alerte, avant  de  me  trouver face au descriptif du soft que me
   proposait  une  bo�te  Parisienne. Je dois avouer que les premiers
   jours  ont �t� un peu durs, mais qu'� la longue j'ai d�couvert que
   le  GEM est vraiment une chose fabuleuse, pas tr�s dur � ma�triser
   et que les possibilit�s sont largement suffisantes pour combler de
   bonheur tout programmeur digne de ce nom!!! J'esp�re donc que vous
   prendrez  autant de plaisir que moi � programmer sous GEM une fois
   que vous aurez lu ce chapitre.

   Tout  d'abord  les  remarques qui se trouvent au d�but du chapitre
   sur  la  ligne A, m�ritent d'�tre relus. Chercher donc de la docu-
   mentation  sans  vous  soucier  du langage. Vous trouverez dans le
   dernier  cours de cette s�rie une bibliographie dans laquelle j'ai
   essay� de recenser divers articles bien sympas.

   Le GEM est accessible par le TRAP #2, mais en fait gr�ce � ce trap
   nous  avons  acc�s  � plusieurs parties du GEM, un peu comme si le
   trap #1 d�bouchait  en  m�me temps sur GEMDOS et BIOS. Le GEM est,
   en effet, compos� principalement de 2 parties:

    l'AES et le VDI.

   Les routines du VDI  - VIRTUAL DEVICE INTERFACE -
   s'occupent des graphismes;

   tra�age de cercles,
   ellipse,
   traits,
   rectangles
   etc ...

   Par contre, l'affichage des objets typiques du GEM :

   fen�tres,
   bo�tes d'alertes

   est r�alis� par l'AES - APPLICATION ENVIRONMENT SYSTEM - .

   Au  fur  et � mesure que vous d�couvrirez les fonctions VDI et AES
   vous vous rendrez compte de l'interaction des 2.

   Le  gros  avantage  de  ce syst�me peut s'expliquer simplement: il
   semble  �vident � tout le monde que sortir un dessin sur un �cran,
   une disquette ou une imprimante, ce n'est pas la m�me chose.

   ERREUR! Pour le GEM c'est pareil!

   En  fait, on  peut dire que vous avez � pr�parer votre dessin et �
   dire  "je  l'envoie". O�? Ah l�, c'est comme vous voulez parce que
   pour le VDI
                      l'�cran,
                      la table tra�ante,
                      le disque,
                      l'imprimante
                      etc..

   ne  sont que des p�riph�riques. Il suffit de lui d�signer le p�ri-
   ph�rique de notre choix et il fait le boulot tout seul!!!!


   Le seul probl�me: 
   les  routines  v�ritablement  ind�pendantes  des  p�riph�riques se
   trouvent dans GDOS - ce nom vous fait s�rement fr�mir d'effroi...-

   -- Plusieurs programmes en m�me temps ?
   Le  principe  du GEM est tr�s attirant mais doit nous amener � r�-
   fl�chir  un petit peu sur le m�lange potentiel des donn�es. En ef-
   fet le GEM, m�me s'il n'est pas r�ellement multit�che (�tre multi-
   t�che consiste � pouvoir faire tourner des applications exactement
   en m�me temps, ce qui est de toute fa�on impossible avec un 68000)
   le  GEM  donc, permet  d'avoir plusieurs programmes actifs en m�me
   temps, en  l'occurrence  un  programme principal et 6 accessoires.
   Pour  le  GEM il n'y a fondamentalement pas de diff�rence entre un
   PRG  et  un  ACC et, pour cette raison, dans le vocabulaire GEM on
   les nomme "applications". Le GEM peut donc se retrouver avec 7 ap-
   plications  � g�rer, chacune ayant potentiellement plusieurs fen�-
   tres. On imagine facilement le bazar dans la m�moire!!! 

   -- Comment le GEM s'y retrouve t-il?

   Au  d�marrage  d'une application, celle-ci appelle la fonction AP-
   PL_INIT (Application_Init). Cette fonction pr�vient le GEM que no-
   tre  application  d�sire  devenir active, et le GEM r�pond en nous
   fournissant  un  num�ro, l'APP_ID  (Application_Identificator) qui
   nous  servira maintenant de r�f�rence. Notre application sera donc
   par  exemple la 3, et sera reconnue comme telle par le GEM. Atten-
   tion, l'APP_ID  n'est  donn�  � l'application que pour la dur�e de
   pr�sence  en  m�moire de celle-ci. Si je lance un ACC le lundi, il
   peut h�riter de l'APP_ID 4 mais si je le relance le mardi dans des
   conditions  diff�rentes, il  peut obtenir l'APP_ID 5. Seulement il
   gardera cet APP_ID pendant toute son activit�.

   Lorsque  l'on  ouvre  une  fen�tre, c'est le m�me principe. Le GEM
   fournit  ce  que l'on nomme un HANDLE, c'est � dire un num�ro cor-
   respondant � la fen�tre. En fait le HANDLE c'est le num�ro d'iden-
   tification  d'une fen�tre mais potentiellement aussi d'un p�riph�-
   rique.


   -- Multitraitement ?

   Une  des  parties  les plus importantes du GEM concerne la gestion
   des �v�nements. Un �v�nements c'est une action de l'utilisateur de
   la machine: clic souris, appui sur une touche etc... En fait, sous
   GEM les applications passent la plus grande partie de leur temps �
   attendre. Imaginons  un  PRG  avec  une fen�tre ouverte et un menu
   d�roulant, et en m�me temps en m�moire 3 accessoires. Je vais dans
   le  menu des accessoires. Le menu se d�roule et les titres passent
   en  inverse  vid�o  lorsque  la souris passe dessus. Tout ceci est
   fait  par le GEM, tout seul comme un grand. Je clique sur le titre
   de l'accessoire 2.

   Le GEM d�tecte le clic, sait que je suis dans les accessoires, re-
   garde  sur quelle entr�e j'ai cliqu�. Comme c'est le GEM qui a at-
   tribu�  les entr�es aux ACC, il envoie un message � l'accessoire 2
   pour lui dire "il faut que tu t'ouvres". Celui-ci s'ouvre donc, et
   affiche  une fen�tre � l'�cran. Nous avons donc 2 fen�tres en m�me
   temps. Je clique sur celle du PRG, le GEM regarde � qui appartient
   cette fen�tre et envoi au PRG un message pour lui dire "on a acti-
   v�  ta  fen�tre num�ro XX" etc... Nous allons donc construire dans
   nos  programmes sous GEM, un noyau de surveillance des actions, et
   nous r�agirons en fonction de celles-ci.


   -- Pour appeler les fonctions du GEM.

   Les  appels  se font avec des param�tres que nous passons dans des
   tableaux. Comme  nous  utilisons  DEVPACK, nous utiliserons sa bi-
   blioth�que. En  effet, pour les appels au GEM, les param�tres sont
   nombreux et � placer � des endroits bien pr�cis dans les tableaux.
   Pour  ces raisons, les macros trouvent ici tout leur int�r�t. Nous
   appellerons  donc  les  fonctions du GEM avec les macros contenues
   dans  la biblioth�que de DEVPACK. Cependant il convient de conna�-
   tre  �galement les tableaux, afin de pouvoir parfaitement compren-
   dre le principe de fonctionnement. 

   Pour l'AES, il faut 6 tableaux:

   CONTROL,
   GLOBAL, 
   INT_IN,
   INT_OUT,
   ADDR_IN,
   ADDR_OUT.

   Pour le VDI il en faut 5:

   CONTRL,
   INTIN,
   INTOUT,
   PTSIN,
   PTSOUT.

   Attention  �  la  l�g�re diff�rence d'orthographe entre  INT_IN et
   INTIN ! Pour indiquer, lors de l'appel au GEM, l'emplacement o� il
   trouvera ces tableaux, leurs adresses sont plac�es dans 2 listes:

   Une pour l'AES:
   aes_params dc.l control, global, int_in, int_out,addr_in, addr_out
   et une pour le VDI:
   vdi_params dc.l contrl, intin, ptsin, intout, ptsout

   Voici  les  tableaux tels qu'ils sont d�finis dans la biblioth�que
   GEM de DEVPACK:

   control   ds.w  5
   global    ds.w  14
   int_in    ds.w  16
   int_out   ds.w  7
   addr_in   ds.l  3
   addr_out  ds.l  1

   contrl    ds.w  1
   contrl1   ds.w  1
   contrl2   ds.w  1
   contrl3   ds.w  1
   contrl4   ds.w  1
   contrl5   ds.w  1
   contrl6   ds.w  1
   contrl7   ds.w  1
   contrl8   ds.w  1
   contrl9   ds.w  1
   contrl10  ds.w  1
   contrl11  ds.w  1

   intin     ds.w  128  min  30
   intout    ds.w  128  min  45
   ptsin     ds.w  128  min  30
   ptsout    ds.w  128  min  12

   Vous  remarquez l'�trange mise en place du tableau CONTRL (tableau
   pour le VDI). En effet il faut assez souvent passer des param�tres
   '�  la main' dans ce tableau. Avec ce syst�me, il sera possible de
   r�aliser une op�ration du genre MOVE.W #10,CONTRL2

   Attention  cette  num�rotation  des CONTRL correspond au nombre de
   words  car chacune des entr�es est d�finie par DS.W et non pas par
   DS.B!!! Ceci s'explique par le fait que 99% des documents relatifs
   au  GEM  sont pour le 'C' et que c'est ce type de commande qui est
   faite  en  'C'.  Ainsi  vous  trouverez  souvent;  "mettre  10  en
   contrl(2)"; il vous suffira de faire MOVE.W #10,CONTRL2 et le tour
   est jou�.

   -- Pourquoi tant de tableaux? Parce que chacun de ces tableaux est
   destin�  �  recevoir  ou  �  renvoyer  un certain type de donn�es.
   Voyons un descriptif rapide de ces tableaux.

   Tableaux AES

   ** control

   Destin� � contenir, dans l'ordre:

   num�ro   de la               fonction  (.W),
   nombre   d'octets de         INT_IN (.W),
   nombre   d'octets de         INT_OUT (.W),
   nombre   de longs mots de    ADDR_IN (.W)
   nombre   de longs mots de    ADDR_OUT


   ** global
   Ce  tableau  est un peu sp�cial, et les explications le concernant
   ne sont d'aucune utilit� dans le cadre de ces cours. Une fois bien
   ingurgit� le reste, vous pourrez toujours vous pencher dessus mais
   actuellement cela ne ferait que vous embrouiller! (Voir la biblio-
   graphie pour en savoir plus)


   ** int_in
   Ce  tableau  est  destin� � recevoir des valeurs enti�res (Integer
   In) dont l'AES aura besoin.

   Par exemple un num�ro de fen�tre.


   ** int_out
   A l'inverse du pr�c�dent ce tableau renvoi des r�sultats par exem-
   ple  si vous demander la surface disponible pour une fen�tre, vous
   aurez ici les dimensions.


   ** addr_in
   Liste dans laquelle vous pourrez placer des adresses


   ** addr_out  et l�, vous pourrez en lire! En fait il suffit, comme
   toujours, de  lire  le  nom  du  tableau  pour en d�duire ce qu'il
   contient!


   Tableaux VDI

   ** contrl
   Dans contrl0 nous pla�ons l'opcode de la fonction, c'est ainsi que
   l'on appelle son num�ro.

   Dans  contrl1 nous  pla�ons  le  nombre de donn�es qui seront mise
   dans le tableau intin

   Dans  contrl2 nous pla�ons le nombre de points (donc de couples de
   donn�es) qui seront plac�s dans le tableau ptsin

   Dans contrl3 nous placerons l'identificateur de la sous-fonction.
   Par  exemple  le tra�age des cercles, ellipse, rectangle etc... ce
   fait  avec la fonction 11. Il faut donc un sous-code permettant de
   d�finir quel module dans la fonction 11 on d�sire utiliser.

   Dans  contrl6 nous  pla�ons  le handle du p�riph�rique. (voir plus
   haut) 
   A  partir  de  contrl7 il  y  a parfois des informations � passer,
   suivant la fonction.

   ** intin et ptsin
   Nous  remplirons  ensuite le tableau INTIN avec les param�tres en-
   tiers  demand�s par la fonction et le tableau PTSIN avec les coor-
   donn�es  demand�es  par la fonction. Une fois la fonction appel�e,
   nous r�cup�rerons:

   en contrl2 le nombre de couples de coordonn�es de ptsout et
   en contrl4 le nombre de mots de intout.


   Voici  un  appel au GEM. Cette fonction affiche une phrase o� l'on
   veut  sur  l'�cran, contrairement  � Gemdos (9) qui est limit� sur
   les lignes et les colonnes de texte. De plus cette fonction permet
   d'afficher  du  texte avec des effets (gras, soulign� etc...) avec
   la fonte de notre choix:

            LEA       MESSAGE,A1            adresse de la phrase
            LEA       INTIN,A0              tableau de r�ception
            MOVEQ.L   #0,D2                 init le compteur de lettres
   ICI3     CLR.W     D0
            MOVE.B    (A1)+,D0              pr�l�ve en bytes
            BEQ       GO_ON                 fin du texte
            ADDQ.B    #1,D2                 on compte les lettres
            MOVE.W    D0,(A0)+              transf�re dans INTIN (en words)
            BRA       ICI
   GO_ON    MOVE.W    #100,PTSIN            position X
            MOVE.W    #150,PTSIN+2          position Y
            MOVE.W    D2,CONTRL3            nombre de lettres
            MOVE.W    #1,CONTRL1
            MOVE.W    CURRENT_HANDLE,CONTRL6
            MOVE.W    #8,CONTRL             opcode
            MOVE.L    #VDI_PARAMS,D1
            MOVE.W    #$73,D0
            TRAP      #2

   AAAAAAAAAARRRRRRGGGLLL!!!!!! C'est l'horreur n'est ce pas!

   Il faut vous munir de patience et d�cortiquer les multiples appels
   au GEM.

   Pour  vous  aider dans vos essais, vous trouverez ci-joint un dos-
   sier  intitul� GEM. Il contient le source d'un ACC qui affiche une
   bo�te  d'alerte, d'un  PRG qui g�re une ressource (listing issu de
   WERCS) et  d'un accessoire g�rant une fen�tre. Pour ce qui est des
   �diteurs de ressources, je travaille avec K Ressource qui est bien
   sympa et qui ne plante pas, contrairement � Wercs!

   Essayez  de  bien  comprendre  le  principe:  affichez  une  bo�te
   d'alerte  avec  un  seul  bouton, puis  avec plusieurs, faites des
   petites  ressources  toutes  simples, puis de plus en plus compli-
   qu�es  etc... Le principe restera toujours le m�me quelle que soit
   la  taille de votre application. Essayez de faire de petits acces-
   soires  du genre formateur de disquettes, avec un petit formulaire
   qui  demande  si l'on veut formater le disque A ou le B, en simple
   ou en double face etc...

   A l'aide de ces exemples, vous devriez r�ussir � vous d�brouiller.
   C'est  avec  �a  que j'ai commenc�! Jetez �galement un coup d'oeil
   sur la bibliographie, il y a quelques trucs int�ressants!

Back to ASM_Tutorial