COURS208.TXT

From AtariForumWiki
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