COURS 7.TXT/fr

From Atari Wiki
Revision as of 15:08, 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)              *
   *                                                                *
   *                          Cours num�ro 7                        *
   *                                                                *
   ******************************************************************

   Nous abordons maintenant le septi�me cours de la s�rie. La totali-
   t�  du cours �tant en 2 s�ries (enfin � l'heure o� je tape ces li-
   gnes  c'est ce qui est pr�vu!), celui-ci est le dernier de la pre-
   mi�re!

   A  la  fin  de celui-ci et si vous avez tr�s attentivement et tr�s
   scrupuleusement  suivi  les  6 cours pr�c�dents, vous devriez �tre
   capable d'afficher des images, sauver des fichiers etc...

   Mais  tout d'abord revenons � notre pile et � la question du cours
   pr�c�dent. Avez vous trouv� l'erreur ?

   Eh  bien  regardez  la valeur de A7 avant d'y empiler $12345678 et
   $23456, et comparez � la valeur � la sortie du programme. Malheur!
   ce  n'est  pas  la m�me! Normal, si nous comptons les empilages et
   les  d�pilages, nous  nous  rendons compte que nous avons empil� 8
   octets de plus que nous n'avons d�pil�. En effet, comme nous avons
   r�cup�r�  nos  2 nombres  en sauvegardant au pr�alable A7 dans A0,
   nous   n'avons  pas  touch�  A7  au  moment  de  la  r�cup�ration.
   Heureusement d'ailleurs car le retour de la routine aurait �t� mo-
   difi�!

   Partant du principe de d�pilage dans l'ordre inverse, il nous faut
   donc corriger la pile une fois revenu de la subroutine. Comme nous
   avons empil� en faisant -(SP) il faut ajouter pour que la pile re-
   devienne  comme avant. Ayant empil� 2 nombres de 4 octets chacuns,
   nous devons ajouter 8 octets � l'adresse de la pile pour la corri-
   ger  comme  il  faut. Nous  avons  d�j�  vu  comment augmenter une
   adresse, avec ADDA.

   Il  convient  donc de rajouter juste apr�s la ligne BSR AJOUTE une
   addition sur SP, en faisant ADDA.L  #8,SP   (qui se lit ADD ADRESS
   LONG 8 STACK POINTER)

   Un  appel  �  une  subroutine en lui passant des param�tres sur la
   pile sera donc typiquement du genre:

          MOVE.W     #$1452,-(SP)
          MOVE.L     #$54854,-(SP)
          MOVE.L     #TRUC,-(SP)
          BSR        BIDOUILLE
          ADDA.L     #10,SP

   Nous  passons  le word de valeur $1452 dans la pile (modifi�e donc
   de  2 octets), le long mot de valeur $54854 dans la pile (modifi�e
   de  4 octets), l'adresse  rep�r�e  par  le label TRUC dans la pile
   (modifi�e de 4 octets) puis nous partons vers notre subroutine. Au
   retour correction de 2+4+4=10 octets du stack pointer pour revenir
   � l'�tat d'origine.


   La  pile  poss�de une petite particularit�. Nous avons vu dans les
   cours  pr�c�dents  que  le  68000 �tait  un micro-processeur 16/32
   bits. Il lui est tr�s difficile d'acc�der � des adresses impaires.
   Or  si nous commen�ons � empiler des octets et non plus uniquement
   des words ou des long words, le Stack Pointer peut tr�s facilement
   pointer  sur  une  adresse impaire, ce qui risque de planter notre
   machine.

   Taper le programme suivante:

          MOVE.L     #$12345678,D0
          MOVE.L     D0,-(SP)
          MOVE.B     D0,-(SP)
          MOVE.L     #$AAAAAAAA,D1

   Assemblez puis passez sous MOnst et avancez pas � pas en observant
   bien l'adresse du SP (donc celle visible en A7).

   Nous constatons que le pointeur de pile se modifie bien de 4 lors-
   que  nous  faisons  MOVE.L    D0,-(SP) mais  qu'il se modifie de 2
   lorsque  nous  faisons  MOVE.B    D0,-(SP) alors que nous pouvions
   nous  attendre � une modification de 1 ! Les erreurs provoqu�s par
   des  adresses  impaires  sont  donc  �cart�es avec la pile . Merci
   Monsieur MOTOROLA!

   (Note: ceci est une particularit� des registres A7 et A7'. Si nous
   avions  travaill�  avec A3 par exemple au lieu de SP, celui-ci au-
   rait eu une adresse impaire. C'est le type d'usage qui est fait de
   la  pile  qui  a conduit les gens de MOTOROLA � cr�er cette diff�-
   rence.)

   Abordons maintenant l'ultime chapitre de cette premi�re s�rie:

                               LES 'TRAP'

   Une  instruction  TRAP  est comparable � une instruction BSR. Elle
   agit  comme un branchement vers une routine. Cependant, contraire-
   ment  �  l'instruction  BSR  qui  demande  �  �tre  compl�t�e  par
   l'adresse, c'est-�-dire le label permettant de trouver la routine,
   l'instruction  TRAP se contente d'un num�ro. Ce num�ro peut varier
   de  0 � 15. Lorsque le 68000 rencontre une instruction TRAP il re-
   garde  son  num�ro  et agit en cons�quence. Vous vous rappeler des
   tout  premiers  cours, dans lesquels nous avions parl� du principe
   utilis�  par  le 68000 lorsqu'il trouvait la bit T (mode trace) du
   SR  (status  register) �  1 ? Saut dans le premier kilo de m�moire
   (table  des vecteurs d'exceptions), recherche de l'adresse $24, on
   regarde  dans le tube � cette adresse, on y trouve un long mot, ce
   long mot c'est l'adresse de la routine et on fonce � cette adresse
   ex�cuter cette routine.

   Et  bien regardez la feuille qui donne la liste des vecteurs d'ex-
   ceptions, et  jetez un coup d'oeil aux vecteurs 32 � 47. Les voil�
   nos  vecteurs  TRAP  !!! Lorsque  le  68000 rencontre  par exemple
   l'instruction  TRAP  #8, il  fonce � l'adresse $0A0 pour y trouver
   l'adresse de la routine qu'il doit ex�cuter.

   A priori cela semble bien compliqu� pour pas grand chose! En effet
   il  faut pr�voir sa routine, la mettre en m�moire, puis placer son
   adresse dans le vecteur. Plus compliqu� qu'un BSR, surtout que BSR
   REGLAGE_CLAVIER   et plus parlant qu'un TRAP #5 ou un TRAP #12 !!!

   L�, nous  retournons encore en arri�re (je vous avais bien dit que
   TOUT �tait important dans ces cours!!!!!) pour nous souvenir de la
   notion  de mode Utilisateur et de mode Superviseur. Le Superviseur
   acc�de � toute la m�moire et � toutes les instructions, pas l'Uti-
   lisateur.

   S'il  s'agit  d'interdire  � l'Utilisateur des instructions assem-
   bleur  telles  que  RESET, notre Utilisateur ne sera pas trop g�n�
   par  contre  c'est  en ce qui concerne la m�moire que tout va tr�s
   s�rieusement  se  compliquer. Voulez  vous conna�tre la r�solution
   dans laquelle se trouve votre machine ? C'est facile, c'est not� �
   l'adresse $FF8260.

   Vous  voulez  changer la palette de couleur ? Rien de plus simple,
   elle est not�e en $FF8240. Imprimer un petit texte ?  A l'aise, il
   suffit d'employer les registres de communications vers l'ext�rieur
   du  chip  son  (�tonnant n'est ce pas!). C'est situ� en $FF8800 et
   $FF8802.

   Pardon ??? Quoi ??? Vous �tes Utilisateur ??? Ah bon.... Parce que
   c'est  g�nant... Toutes ces adresses sont situ�es dans la zone m�-
   moire uniquement accessible au Superviseur.....

   L'Utilisateur se trouve bien coinc� et les possibilit�s s'en trou-
   vent  dr�lement r�duites. Heureusement, les TRAP sont l� !!! Gr�ce
   � ce syst�me l'utilisateur va avoir acc�s � des zones qui lui sont
   normalement  interdites. Pas  directement, bien s�r, mais gr�ce au
   superviseur. Le  superviseur  a, en  effet, fabriqu�  des routines
   qu'il  a  plac� en m�moire et dont les adresses sont dans les vec-
   teurs  TRAP. Ces routines sont ex�cut�s en mode superviseur et ta-
   pent  �  tour  de  bras dans les zones m�moires prot�g�es. Lorsque
   l'Utilisateur  veut  les  utiliser il les appelle par les TRAP. La
   protection est donc bien assur�e car l'Utilisateur ne fait que d�-
   clencher une routine dont g�n�ralement il ne conna�t que les para-
   m�tres  �  lui passer et le type de message qu'il aura en r�ponse.
   C'est  de  cette mani�re que nous pouvons acc�der au syst�me d'ex-
   ploitation de notre Atari !!!

   Petit rappel: qu'est ce qu'un syst�me d'exploitation ?

   Le premier qui r�pond c'est GEM se prend une paire de claques. GEM
   c'est l'interface utilisateur et pas le syst�me d'exploitation.

   Le  syst�me  d'exploitation  (ou  Operating System) dans notre cas
   c'est  TOS. La  confusion  entre  interface Utilisateur et syst�me
   d'exploitation  vient du fait que certains syst�mes d'exploitation
   int�grent �galement un interface utilisateur: c'est par exemple le
   cas sur PC avec MS DOS.

   Le  syst�me d'exploitation c'est un ensemble de routine permettant
   d'exploiter  la  machine. Ces  multiples  routines  permettent par
   exemple  d'afficher un caract�re � l'�cran d'ouvrir un fichier, de
   formater une piste de disquette,   d'envoyer un octet sur la prise
   MIDI  etc... En fait tous les 'trucs' de base, mais jamais de cho-
   ses  compliqu�es. Une routine du syst�me d'exploitation ne permet-
   tra  pas, par exemple, de lire le contenu d'un fichier se trouvant
   sur  la disquette. En effet ceci demande plusieurs op�rations avec
   � chaque fois des tests:

   Ouverture du fichier: existe t-il,
   la disquette n'est elle pas ab�m�e etc... 
   positionnement  du  pointeur  dans  le  fichier: le positionnement
   s'est il bien pass�?

   Lecture: N'as t-on pas essay� de lire trop d'octets etc, etc....

   Il faudra donc bien souvent plusieurs appels � des routines diff�-
   rentes pour r�aliser ce que l'on veut.

   Il  est  toujours possible de se passer du syst�me d'exploitation,
   sp�cialement  lorsque l'on programme en assembleur. En effet l'en-
   semble  des routines de l'OS (abr�viation de Operating System) est
   destin�  �  un usage commun, tout comme d'ailleurs les routines de
   l'interface Utilisateur.

   Ceci  explique  bien souvent la r�-�criture de toutes petites par-
   ties  du  syst�me  afin de n'utiliser que le strict n�cessaire. La
   routine  de gestion souris du GEM par exemple doit s'occuper de la
   souris  mais aussi du clavier, du MIDI et du joystick. Pour un jeu
   il  peut �tre int�ressant de r�-�crire cette routine afin de g�rer
   uniquement  le  joystick  et  donc d'avoir une routine qui 'colle'
   plus au besoin.

   Nous  verrons  beaucoup plus tard comment regarder dans le syst�me
   d'exploitation  afin de pouvoir par la suite r�aliser soi-m�me ses
   routines. Avant cela, utilisons simplement ce syst�me!

   Nous allons donc l'appeler gr�ce aux TRAPs.
   4 traps sont accessibles 'normalement' dans le ST:

   TRAP  #1      routines du GEMDOS
   TRAP  #2      routines du GEM
   TRAP  #13     routines du BIOS
   TRAP  #14     routines du BIOS �tendu (eXtended Bios donc XBIOS)

   GEMDOS   =Graphic environment manager disk operating system
   GEM      =Graphic  environment manager (se d�coupe par la suite en
   AES, VDI  etc.. Un  chapitre de la seconde s�rie y sera consacr�e)
   BIOS     =Basic Input Output System
   XBIOS    =Extended Basic Input Output System

   Les autres vecteurs TRAP (0, 3 � 12 et 15) sont, bien entendu, ac-
   tifs mais aucune routine n'y est affect�e. Nous pouvons les utili-
   ser  pour  peu que nous y mettions avant nos routines, ce qui sera
   l'objet du premier cours de la seconde s�rie.

   Nous  constatons  que le TRAP #1 permet d'appeler le GEMDOS. Or il
   n'y  a  pas qu'une routine GEMDOS mais une bonne quantit�. De plus
   ces  routines demandent parfois des param�tres. Comment faire pour
   les transmettre ? Et bien tout simplement par la pile !!!

   Taper le programme suivant:

          MOVE.W     #65,-(SP)
          MOVE.W     #2,-(SP)
          TRAP       #1
          ADDQ.L     #4,SP

          MOVE.W     #7,-(SP)
          TRAP       #1
          ADDQ.L     #2,SP
          MOVE.W     #0,-(SP)
          TRAP       #1
          ADDQ.L     #2,SP

   Assemblez  ce  programme  mais  ne  le d�buggez pas, lancez le par
   Alternate+ X. Vous  voyez appara�tre un A sur l'�cran de votre ST.
   Appuyer  sur  une touche et hop vous revenez dans GENST! Analysons
   ce  que  nous  avons fait car l� de tr�s tr�s nombreuses choses se
   sont pass�es, et avouons le, nous n'avons rien vu !!!!!

   Tout  d'abord  nous  avons appel� la fonction Cconout() du Gemdos.
   Nous  avons  appel� le Gemdos avec le TRAP #1, mais cette instruc-
   tion nous a envoy� vers un ensemble de routine, toutes appartenant
   au  Gemdos. Pour  indiquer  � cette routine principale vers quelle
   subroutine  du Gemdos nous d�sirons aller, nous avons pass� le nu-
   m�ro  de  cette subroutine dans la pile. Partant toujours du prin-
   cipe  du  dernier  entr� premier sorti, il est bien �vident que ce
   num�ro  doit se trouver empil� en dernier afin de pouvoir �tre d�-
   pil�  en premier par la routine principale de Gemdos, afin qu'elle
   puisse  s'orienter  vers  la  sous-routine  qui nous int�resse. La
   fonction  Cconout  ayant le num�ro 2, nous avons donc fait MOVE.W 
   #2,-(SP) .(voir  plus  haut  pour se rappeler que 2 peut tr�s bien
   �tre  cod� sur un octet mais, comme nous travaillons vers la pile,
   il sera pris comme un word de toutes fa�ons).

   Maintenant  le  Gemdos  ayant  trouv� 2 comme param�tre, s'oriente
   vers  cette routine au nom barbare, qui a pour fonction d'afficher
   un  caract�re  sur  l'�cran. Une fois rendu vers cette routine, le
   Gemdos  va  chercher  � savoir quel caract�re afficher. C'est pour
   cela  que  nous  avons  plac� le code ASCII de ce caract�re sur la
   pile avec MOVE.W  #65,-(SP).

   Note: Pour  l'assembleur, le  code ASCII peut �tre remplac� par la
   lettre  elle-m�me. Nous  aurions donc pu �crire  MOVE.W #"A",-(SP)
   sans oublier toutefois les guillemets!

   De  retour  du TRAP nous devons corriger la pile, afin d'�viter le
   probl�me  qui a fait l'objet du d�but de ce cours. Nous avions em-
   pil�  un word donc 2 octets et ensuite un autre word soit au total
   4 octets. Nous  allons  donc  ajouter  4 au SP. Nous profitons ici
   d'une  op�ration  d'addition plus rapide que ADDA, ADDQ qui se lit
   add quick. Cette addition est autoris�e jusqu'� 8 inclus. Il n'est
   pas possible par exemple de faire ADDQ.L   #12,D1

   Ensuite nous recommen�ons le m�me genre de chose, avec la fonction
   7 du  GEMDOS  (nomm�e  Crawcin)qui  elle n'attend aucun param�tre,
   c'est  pourquoi  nous  passons juste son num�ro sur la pile. Cette
   fonction  attend un appui sur une touche. Ayant pass� un param�tre
   sur un word, nous corrigeons au retour du TRAP la pile de 2.

   Le  programme se termine avec la fonction 0 du GEMDOS (Ptermo) qui
   lib�re  la  m�moire occup�e par notre programme et le termine pour
   de  bon. Cette  routine n'attend pas de param�tre, nous ne passons
   dans la pile que son num�ro donc correction de 2. Note: la correc-
   tion  de pile pour la fonction Ptermo n'est l� que par souci p�da-
   gogique. Cette  fonction  terminant  le  programme, notre derni�re
   instruction ADDQ.L  #2,SP ne sera jamais atteinte!

   Plusieurs choses maintenant. D'abord ne soyez pas �tonn�s des noms
   bizarres des fonctions du GEMDOS, du Bios ou du Xbios. Ce sont les
   v�ritables noms de ces fonctions. En assembleur nous ne les utili-
   serons pas directement puisque l'appel se fait pas un num�ro, mais
   en C par exemple c'est ainsi que sont appel�es ces fonctions. Dans
   les  cours  d'assembleur  de  ST MAG (dont les vertus p�dagogiques
   sont  plus  que  douteuses), nous pouvons lire que les noms de ces
   fonctions  ont  �t�  choisis au hasard et que la fonction Malloc()
   par  exemple  aurait  pu  s'appeler  Mstroumph(). C'est  ridicule!
   Chacun des noms est, comme toujours en informatique, l'abr�viation
   d'un  expression  anglo-saxonne qui indique concr�tement le but ou
   la  fonction. Ainsi Malloc signifie Memory Allocation, cette fonc-
   tion  du  GEMDOS  permet donc de r�server une partie de m�moire!!!
   Malheureusement  de  nombreux ouvrages passe sur ce 'd�tail' et ne
   fournissent que l'abr�viation.

   Ceci  n'emp�che qu'il vous faut imp�rativement une liste de toutes
   les  fonctions  du GEMDOS, du BIOS et du XBIOS. Ces fonctions sont
   d�crites  dans  le Livre du D�veloppeur, dans la Bible mais �gale-
   ment dans les derni�res pages de la doc du GFA 3.

   Note: dans la doc du GFA, il manque la fonction GEMDOS 32 qui per-
   met  de  passer en Superviseur. Ce mode n'�tant pour le moment que
   d'un int�r�t limit� pour vous, pas de panique, nous d�crirons tout
   cela dans la seconde s�rie.

   Continuons pour le moment avec des petits exemples.
   Affichons une phrase sur l'�cran � la place d'un lettre.
   Ceci va se faire avec la programme suivant:

          MOVE.L     #MESSAGE,-(SP)        adresse du texte
          MOVE.W     #9,-(SP)   num�ro de la fonction
          TRAP       #1         appel gemdos
          ADDQ.L     #6,SP      correction pile

   * attente d'un appui sur une touche

          MOVE.W     #7,-(SP)   num�ro de la fonction
          TRAP       #1         appel GEMDOS
          ADDQ.L     #2,SP      correction pile

   * fin du programme

          MOVE.W     #0,-(SP)
          TRAP       #1

          SECTION DATA

MESSAGE   DC.B       "SALUT",0

   Une nouveaut�, le passage d'une adresse. En effet la fonction 9 du
   gemdos demande comme param�tre l'adresse de la cha�ne de caract�re
   �  afficher. Nous  avons  donc  donn�  MESSAGE, qui  est le label,
   l'�tiquette  servant  �  rep�rer  l'emplacement dans le tube o� se
   trouve  notre  phrase, tout  comme  nous  avions mis une �tiquette
   AJOUTE pour rep�rer notre subroutine, dans le cours pr�c�dent.

   Ce  message est une suite de lettres, toutes cod�es sur un octets.
   Pour  cette  raison nous disons que cette cha�ne est une constante
   constitu�e d'octet. Nous d�finissons donc une constante en octets:
   Define Constant Byte, en abr�g� DC.B  Attention ceci n'est pas une
   instruction  68000 ! C'est  simplement  une notation pour l'assem-
   bleur afin de lui dire: 

   n'essaye  pas d'assembler �a comme du code normal, ce n'est qu'une
   constante.  De m�me nous d�finissons une zone.

   La  fonction 9 du GEMDOS demande � ce que la phrase se termine par
   0, ce qui explique sa pr�sence � la fin.

   R�alisons maintenant un programme suivant le sch�ma suivant:

   affichage d'un texte de pr�sentation en inverse vid�o;

   ce texte demande si on veut quitter ou voir un message

   si on choisit quitter, bye bye

   sinon on affiche 'coucou' et on redemande etc...

   D�taillons un peu plus, en traduisant ce programme en pseudo-code.
   C'est  ainsi  que  l'on nomme la fa�on de pr�senter un d�roulement
   d'op�ration en langage clair mais dont l'organisation se rapproche
   d�j� de la programmation.

   AFFICHE        "QUITTER (Q) OU VOIR LE MESSAGE (V) ?"
   SI REPONSE=Q
        VA A QUITTER
   SI REPONSE=V
        AFFICHE "COUCOU"
        RETOURNE A AFFICHE "QUITTER...."
   SI REPONSE DIFFERENTE RETOURNE A AFFICHE "QUITTER..."

   Par  commodit�, ce  listing  se  trouve  sur  une  feuille s�par�e
   (listing num�ro 1 / Cours num�ro 7).

   Tout  d'abord  affichage de la phrase qui servira de menu, avec la
   fonction  Gemdos 9. Cette phrase se trouve � l'�tiquette MENU, al-
   lons  la voir pour la d�tailler. Nous remarquons tout d'abord qu'-
   elle  commence  par 27. Apr�s avoir regard� dans une table de code
   ASCII, nous notons qu'il s'agit du code ASCII de la touche Escape.
   Nous cherchons donc d'abord � afficher Escape. Mais, comme vous le
   savez s�rement, ce caract�re n'est pas imprimable!

            Impossible de l'afficher � l'�cran!

   C'est  tout � fait normal! en fait il n'est pas question ici d'af-
   ficher  r�ellement  un  caract�re, mais plut�t de faire appel � un
   ensemble  de  routines, r�pondant au nom de VT52. Pour appeler ces
   routines, il  faut afficher Escape. Voyant cela le syst�me se dit:
   "Tiens, on  cherche � afficher Escape, c'est donc en fait que l'on
   cherche � appeler le VT52".

   L'�mulateur  VT52 r�agit  donc, mais  que  doit-il faire ? et bien
   pour  le savoir il va regarder la lettre qui suit Escape. En l'oc-
   currence  il s'agit ici de E majuscule. Regardez dans les feuilles
   annexes  �  cette s�rie de cours, il y en a une consacr�e au VT52.
   Nous  voyons  que  Escape suivi de E efface l'�cran, c'est donc ce
   qui va se passer ici.

   Ensuite  il  �tait  dit dans le 'cahier des charges' de notre pro-
   gramme, que le MENU devait �tre affich� en inverse vid�o.

   Consultons donc la feuille sur le VT52. Nous y trouvons: Escape et
   'p' minuscule  = passe  en  �criture inverse vid�o. Juste ce qu'il
   nous faut! Nous remettons donc 27,"p" dans notre phrase.

   Trois remarques:

   tout  d'abord  il  faut  remettre  �  chaque  fois  Escape.  Faire
   27,"E","p" aurait effac� l'�cran puis aurait affich� p.

   Seconde  remarque, il faut bien faire la diff�rence entre les let-
   tres majuscules et les lettres minuscules. Escape+E efface l'�cran
   mais Escape+e active le curseur!!!

   Troisi�me remarque, on peut repr�senter dans le listing une lettre
   par son 'caract�re' ou bien par son code ASCII.

   Ainsi  si  on veut afficher Salut, on peut �crire le listing comme
   ceci:
TXT       DC.B       Salut",0
   ou bien comme cela:
   TXT    DC.B    83,97,108,117,116,0
   Il  est  de  m�me possible de m�langer les donn�es en d�cimal , en
   binaire, en hexad�cimal et les codes ASCII. Par exemple ceci:

TXT       DC.B       65,$42,%1000011,"D",0

   affichera ABCD si on utilise cette "phrase" avec Gemdos 9.

   Ceci  vous  sera bien utile lorsque vous chercherez � afficher des
   lettres difficiles � trouver sur le clavier. Pour le 'o' tr�ma, il
   est possible de faire:

TXT       DC.B       "A bient",147,"t les amis.",0

   Note: J'esp�re  que  depuis  le  d�but, il  n'y en a pas un seul �
   avoir lu DC.B "d�c�b�"!!!! Je vous rappelle que cela se lit Define
   Constant Byte.

   Continuons  l'exploration  de notre programme. Notre phrase efface
   donc  l'�cran  puis passe en inverse vid�o. Viens ensuite le texte
   lui-m�me:

   QUITTER (Q) OU VOIR LE MESSAGE (V) ?

   Ensuite une nouvelle commande VT52 pour repasser en vid�o normale,
   puis  2 codes ASCII qui, eux non plus, ne sont pas imprimables. Ce
   sont  les codes de retour chariot. Le curseur va donc se retrouver
   tout � gauche de l'�cran, une ligne plus bas. Enfin le 0 indiquant
   la fin de la phrase.

   Une fois le 'menu' affich�, nous attendons un appui sur une touche
   avec la fonction Gemdos num�ro 7. Cette fonction renvoi dans D0 un
   r�sultat. Ce r�sultat est cod� sur un long mot, comme ceci:

   Bits 0 � 7  code ASCII de la touche
   Bits 8 � 15 mis � z�ro
   Bits 16 � 23 code clavier
   Bits  24 �  31 Indication  des  touches  de commutation du clavier
   (shifts..)

   Dans  notre  cas nous ne nous int�resserons qu'au code ASCII de la
   touche enfonc�e. Nous allons donc comparer le word de D0 avec cha-
   cun des codes ASCII que nous attendons, c'est � dire Q, q, V et v.
   Cette  comparaison  va  se  faire  avec  une nouvelle instruction:
   Compare (CMP). Comme nous comparons un word nous notons CMP.W, que
   nous  lisons  COMPARE WORD. Nous comparons Q avec D0 (nous aurions
   pu marquer CMP.W  #81,D0 puisque 81 est le code ASCII de Q).

   Cette  comparaison effectu�e, il faut la tester. Nous abordons ici
   les  possibilit�s de branchement d�pendant d'une condition, c'est-
   �-dire les branchements conditionnels.

   Chacune  de  ces instructions commence par la lettre B, signifiant
   BRANCH. En clair, ces instructions peuvent �tre lues comme:

   Va � tel endroit si...

   Mais si quoi ???

   Eh  bien  plusieurs conditions sont disponibles, que l'on peut re-
   grouper en 3 cat�gories:

   D'abord  une cat�gorie qui r�agit � l'�tat d'un des bits du Status
   Register:

     BCC  Branch if carry clear (bit de retenue � 0)
     BCS  Branch if carry set   (bit de retenue � 1)
     BNE  Branch if not equal   (bit de z�ro � 0)
     BEQ  Branch if equal       (bit de z�ro � 1)
     BVC  Branch if overflow clear (bit de d�passement � 0)
     BVS  Branch if overflow set   (bit de d�passement � 1)
     BPL  Branch if plus  (bit n�gatif � 0)
     BMI  Branch if minus (bit n�gatif � 1)


   Une seconde cat�gorie, r�agissant � la comparaison de nombres sans
   signe.

     BHI  Branch if higher  (branche si sup�rieur �)
     BLS  Branch if lower or same (inf�rieur ou �gal)
   (on peut aussi remettre BEQ et BNE dans cette cat�gorie)


   UNe  troisi�me  cat�gorie, r�agissant  � la comparaison de nombres
   avec signe.

     BGT Branch if greater than (si sup�rieur �)
     BGE Branch if greater or equal (si sup�rieur ou �gal �)
     BLT Branch if lower than  (si plus petit que)
     BLE Branch if lower or equal (si plus petit ou �gal)
    (on peut encore remettre BEQ et BNE!!!)

   Je suis profond�ment d�sol� pour les gens de MICRO-APPLICATION (Le
   Langage  Machine  sur  ST, la Bible, le Livre du GEM etc...) ainsi
   que  pour  le  journaliste  qui  �crit les cours d'assembleur dans
   STMAG, mais  les  branchements  BHS  et BLO, malgr� le fait qu'ils
   soient accept�s par de nombreux assembleurs, N'EXISTENT PAS!!!!! 

   Il  est  donc  impossible de les trouver dans un listing assembl�,
   l'assembleur les convertissant ou bien les rejetant.

   Cet  ensemble de branchement conditionnel constitue un ensemble de
   commande du type Bcc (branch conditionnaly)

   Poursuivons notre lente progression dans le listing...
   La comparaison est effectu�e, testons la:

          CMP.W      #"Q",D0    est-ce la lettre 'Q' ?
          BEQ        QUITTER    branch if equal 'quitter'

   C'est � dire, si c'est �gal, sauter � l'�tiquette QUITTER.
   Si  ce  n'est  pas  �gal, le  programme  continue comme si de rien
   n'�tait, et tombe sur un nouveau test:

          CMP.W      #"q",D0    est-ce q minuscule ?
          BEQ        QUITTER    branch if equal quitter

   Nous  comparons  ensuite � 'V' majuscule et en cas d'�galit�, nous
   sautons � AFFICHAGE. Viens ensuite le test avec 'v' minuscule. L�,
   c'est  l'inverse: Si  ce  n'est  pas �gal, retour au d�but puisque
   toutes les possibilit�s ont �t� vues. Par contre, si c'est 'v' qui
   a  �t�  appuy�, le  programme continuera sans remonter � DEBUT, et
   tombera de lui m�me sur AFFICHAGE.

   L'affichage  se  fait  classiquement  avec Gemdos 9. Cet affichage
   termin�, il faut remonter au d�but. Ici, pas besoin de test car il
   faut absolument remonter. Nous utilisons donc un ordre de branche-
   ment  sans  condition  (inconditionnel) qui  se  lit BRANCH ALWAYS
   (branchement toujours)et qui s'�crit BRA.

   En  cas  de  choix  'Q' ou 'q', il y a saut � QUITTER et donc � la
   fonction Gemdos 0 qui termine le programme.

   N'h�sitez pas � modifier ce programme, � essayer d'autres tests, �
   jouer avec le VT52, avant de passer au suivant.

   ("Quelques heures passent..." In ('Le manoir de Mortevielle')
   acte 2 sc�ne III)

   Prenons  maintenant le listing num�ro 3. Nous �tudierons le num�ro
   2 en dernier � cause de sa longueur un peu sup�rieure.

   Le  but de ce listing est de r�aliser un affichage un peu compara-
   ble  �  celui des horaires dans les gares ou les a�roports: chaque
   lettre  n'est  pas  affich�e  d'un coup mais 'cherch�e' dans l'al-
   phabet.

   D'abord  effacement  de  l'�cran  en  affichant Escape et 'E' avec
   Gemdos 9: rien que du classique pour vous maintenant!

   Ensuite  cela  se  complique. Nous  pla�ons l'adresse de TXT_FINAL
   dans  A6. Regardons  ce  qu'il  y a � cette �tiquette 'TXT_FINAL':
   nous y trouvons la phrase � afficher.

   Observons  maintenant  TRES  attentivement  ce  qui  se  trouve  �
   l'adresse  TXT. Nous  y  voyons  27,"Y",42 .  En  regardant  notre
   feuille  du  VT52 nous  voyons  que cela correspond � une fonction
   pla�ant le curseur � un endroit pr�cis de l'�cran. Nous constatons
   aussi 2 choses:

   1) La commande est incompl�te
   2) Une phrase affich�e par exemple avec gemdos 9, doit se terminer
      par 0, ce qui ici n'est pas le cas !
      En  effet, la phrase est incompl�te si on se contente de lire  
      cette  ligne. Jetons un coup d'oeil sur la ligne suivante. Nous
      y  trouvons 42, qui est peut �tre la suite de la commande (nous
      avons  donc  escape+Y+42+42), et une ligne encore plus bas nous
      trouvons deux z�ros. Nous pouvons remarquer �galement que si la
      phrase  commence  �  l'�tiquette  TXT, la seconde ligne poss�de
      �galement une �tiquette ('COLONE') ainsi que la troisi�me ligne
      ('LETTRE').

   Imaginons  maintenant que nous ayons une lettre � la place du pre-
   mier  z�ro  en face de l'�tiquette LETTRE. Si nous affichons cette
   phrase  nous  verrons s'afficher cette lettre sur la 10�me colonne
   de  la 10�me ligne (r�visez la commande Escape+Y sur la feuille du
   VT52).

   Imaginons  ensuite  que  nous ajoutions 1 au chiffre se trouvant �
   l'�tiquette  COLONNE  et  que nous recommencions l'affichage. Nous
   verrions  notre lettre toujours 10�me ligne, mais maintenant 11�me
   colonne!
   C'est ce que nous allons faire, en compliquant d'avantage. Pla�ons
   le code ASCII 255 (c'est le code maximale autoris� puisque les co-
   des  ASCII  sont  cod�s sur un byte) � la place du premier z�ro de
   l'�tiquette  LETTRE. Nous  faisons  cela  par  MOVE.B #255,LETTRE.
   Ajoutons  1 ensuite au chiffre des colonnes avec ADD.B  #1,COLONNE
   ensuite  posons  nous  la question suivante: la lettre que je vais
   afficher  (actuellement  de  code  ASCII  255), est-ce la m�me que
   celle  de la phrase finale ? Pour le savoir il faut pr�lever cette
   lettre  de cette phrase. Comme nous avons plac� l'adresse de cette
   phrase  dans  A6, nous  pr�levons  tout en faisant avancer A6 pour
   pointer sur la seconde lettre. MOVE.B  (A6)+,D6

   Et si la lettre que nous venons de pr�lever �tait le code ASCII 0?
   Cela  voudrais  donc dire que nous sommes � la fin de la phrase et
   donc  qu'il faut s'en aller!!! Nous comparons donc D6 qui contient
   le code ASCII de la lettre, avec 0.

          CMP.B      #0,D6
          BEQ        FIN        si c'est �gal, bye bye!

   Ouf! Ce  n'est  pas la derni�re lettre; nous pouvons donc afficher
   notre phrase. Cela se fait avec Gemdos 9, en lui passant l'adresse
   du  d�but de la phrase dans la pile. Cette adresse c'est TXT et le
   Gemdos  affichera  jusqu'� ce qu'il rencontre 0. Il affichera donc
   27,"Y",42,43,255,0. Ceci  �tant fait, comparons la lettre que nous
   venons  d'afficher, et qui se trouve en face de l'�tiquette LETTRE
   avec  celle  qui  se  trouve dans D6 et qui a �t� pr�lev�e dans la
   phrase mod�le.

   Si  c'est  la  m�me, nous remontons jusqu'� l'�tiquette PROCHAINE,
   nous  changeons de colonne, nous pr�levons la lettre suivante dans
   la  phrase  mod�le  et  nous recommen�ons. Mais si ce n'est pas la
   m�me lettre?

   Et  bien  nous  diminuons  de  1 le  code ASCII de 'LETTRE' (SUB.B
   #1,LETTRE) et  nous  r�-affichons  notre phrase qui est maintenant
   27,"Y",42,43,254,0

   C'est compris ?

   La  aussi  c'est  une  bonne  �tude  qui vous permettra de vous en
   sortir.

   N'abandonner  pas  ce  listing en disant "oh �a va j'ai � peu pr�s
   compris"
   il  faut  PARFAITEMENT  COMPRENDRE. N'h�sitez pas � vous servir de
   MONST pour aller voir � l'adresse de LETTRE ce qui s'y passe. Pour
   avoir  les  adresses  des �tiquettes, taper L quand vous �tes sous
   MONST. Il est tout � fait possible de demander � ce que la fen�tre
   m�moire  (la  3) pointe  sur  une  partie  vous montrant LETTRE et
   COLONE, puis  de revenir sur la fen�tre 2 pour faire avancer pas �
   pas le programme. Ceci vous permettra de voir le contenu de la m�-
   moire se modifier tout en regardant les instructions s'ex�cuter.

   Il  reste  un  petit point � �claircir, concernant le mot EVEN qui
   est  situ� dans la section data. Nous avons d�j� compris (du moins
   j'esp�re) que l'assembleur ne faisait que traduire en chiffres des
   instructions, afin  que  ces ordres soient compris par la machine.
   Nous avons vu �galement que le 68000 n'aimait pas les adresses im-
   paires  (du  moins  nous ne l'avons pas encore vu, et ce n'est pas
   plus mal...). Lorsque l'assembleur traduit en chiffre les mn�moni-
   ques, il  n'y  a  pas de souci � se faire, celles-ci sont toujours
   traduites en un nombre pair d'octets.

   Malheureusement  ce  n'est pas forc�ment le cas avec les datas. En
   l'occurrence  ici, le  label CLS commence � une adresse paire (car
   avant lui il n'y a que des mn�moniques) mais � l'adresse CLS on ne
   trouve  que  3 octets. Nous  en  d�duisons  que le label TXT va se
   trouver  � une adresse impaire. Pour �viter cela, l'assembleur met
   �  notre  disposition  une  instruction  qui  permet d'imposer une
   adresse  paire  pour  le  label  suivant, EVEN  signifiant pair en
   Anglais.

   Note: Tout  comme SECTION DATA, DC.B, DC.W ou DC.L, EVEN n'est pas
   une  instruction  du  68000. C'est  un  ordre qui sera compris par
   l'assembleur.

   G�n�ralement  ces  ordres  sont compris par beaucoup d'assembleurs
   mais  il  existe parfois des variantes. Ainsi certains assembleurs
   demandent  � avoir .DATA ou  bien DATA et non pas SECTION DATA. De
   m�me  pour  certains  assembleurs, les labels (�tiquettes) doivent
   �tre  imp�rativement  suivis de 2 points. Il faut chercher dans la
   doc de son assembleur et faire avec, c'est la seule solution!
   Notez cependant que ceci ne change en rien les mn�moniques!

   Passons maintenant au dernier listing de ce cours, le num�ro 2.

   Ce listing affiche une image Degas dont le nom est inscrit en sec-
   tion  data, �  l'�tiquette NOM_FICHIER. Il est bien �vident que ce
   nom  ne doit pas contenir de c c�dille mais plut�t une barre obli-
   que invers�e, que mon imprimante a refus�e d'imprimer!

   Seules  2 ou  3 petites  choses  vous sont inconnues. Tout d'abord
   l'instruction  TST.W  (juste  apr�s  l'ouverture du fichier image)
   Cette instruction se lit Test et donc ici on lit:
   Test word D0. 

   Cela revient tout simplement � faire CMP.W #0,D0.

   Seconde chose qui vous est encore inconnue, la SECTION BSS.

   Nous  avons  vu dans les pr�c�dents que les variables initialis�es
   �taient  mises  dans  une  SECTION DATA. Et bien les variables non
   initialis�es sont mises dans une section nomm�e SECTION BSS. Cette
   section  poss�de une particularit� int�ressante: les donn�es y fi-
   gurant ne prennent pas de place sur disque !

   Ainsi  si  vous  avez un programme de 3 kiloctets mais que dans ce
   programme  vous d�sirez r�server 30 kilo pour pouvoir par la suite
   y  charger  diff�rentes  choses, si vous r�servez en faisant TRUC 
   DC.B  30000 votre programme, une fois sur disquette fera 33000 oc-
   tets. Par  contre si vous r�servez par TRUC DS.B 30000, votre pro-
   gramme n'occupera que 3 Ko sur le disque.

   Ces  directives  plac�es  en section BSS sont assez diff�rentes de
   celles plac�s en section data.

TRUC   DC.W     16   r�serve de la place pour 1 word qui est
                        initialis� avec la valeur 16.
TRUC   DS.W     16   r�serve de la place pour 16 words.

   Il  faut bien faire attention � cela, car c'est une faute d'�tour-
   derie peu fr�quente mais �a arrive!
   Si on note en section BSS

TRUC      DS.W       0
MACHIN    DS.W       3

   Lorsque  l'on  cherchera le label TRUC et que l'on �crira des don-
   n�es  dedans, ces  donn�es ne pourront pas aller DANS truc puisque
   cette  �tiquette  ne correspond � rien (0 word de r�serv�) et donc
   nous  �crirons  dans MACHIN, en �crasant par exemple ce que nous y
   avions plac� auparavant.


   Bon, normalement  vous devez en savoir assez long pour utiliser le
   Gemdos, le  Bios  et  le Xbios (je vous rappelle que le Bios s'ap-
   pelle par le Trap #13, exactement de la m�me mani�re que le Gemdos
   ou le Xbios).

   Vous  devez donc �tre capable de r�aliser les programmes suivants:

   Demande  du  nom  d'une  image. On tape le nom au clavier, puis le
   programme  lit  l'image sur la disquette et l'affiche. Pr�vient et
   redemande un autre nom si l'image n'est pas trouv�e. Si on tape X,
   c'est la fin et on quitte le programme.

   Lecture du premier secteur de la premi�re piste de la disquette.
   Si  le  premier octet de ce secteur est �gale � $61 (c'est le code
   de  l'instruction  BRA), faire cling  cling  cling en affichant le
   code  ASCII 7 (clochette), afficher "disquette infect�e", attendre
   un appui sur une touche et bye bye. Si disquette non infect�e, af-
   ficher  "je  remercie  le  F�roce  Lapin pour ses excellents cours
   d'assembleur, super  bien  faits  � que d'abord c'est lui le meil-
   leur" et quitter.

   Vous  pouvez aussi tenter la vaccination, en effa�ant carr�ment le
   premier octet (mettre � 0 par exemple).

   Autre exemple assez int�ressant � programmer. Vous avez vu dans le
   listing  3 comment pr�lever des donn�es situ�es les unes apr�s les
   autres  dans  une cha�ne: D6 contient bien d'abord F puis E puis R
   etc... Imaginez  que vous ayez 3 cha�nes: la premi�re contient des
   chiffres  correspondant  �  la colonne d'affichage, la seconde des
   chiffres  correspondant  �  la  ligne et la troisi�me des chiffres
   correspondant � la couleurs, ces 3 donn�es au format VT52.
   (regardez  Escape+'Y' et  Escape+'b' ou Escape+'c'). On met un re-
   gistre  d'adresse pour chacune de ces listes, on lit un chiffre de
   chaque, on place ce chiffre dans une phrase:

    (27,"Y",X1,X2,27,"b",X3,"*",0)

   X1 �tant le chiffre pr�lev� dans la liste 1
   X2 �tant le chiffre pr�lev� dans la liste 2
   X3 �tant le chiffre pr�lev� dans la liste 3

   On  affiche  donc  �  diff�rentes positions une �toile, de couleur
   diff�rente suivant les affichages.

   Conseil: Essayez de faire le maximum de petits programmes, afin de
   bien  comprendre  l'utilisation  du VT52, du Gemdos, du Bios et du
   Xbios. Cela  vous permettra �galement de vous habituer � commenter
   vos programmes, � les ordonner, � chasser l'erreur sournoise.

   Scrutez  attentivement  vos  programmes � l'aide de MONST. Pour le
   moment  les  erreurs  seront encore tr�s faciles � trouver, il est
   donc imp�ratif de tr�s tr�s bien vous entra�ner!!!

   Si  un  de vos programmes ne tourne pas, prenez votre temps et r�-
   fl�chissez. C'est  souvent  une erreur ENORME qui est juste devant
   vous: notez  sur  papier les valeurs des registres, faites avancer
   pas � pas le programme sous MONST, repensez bien au principe de la
   pile  avec ses avantages mais aussi ses inconv�nients. Utilisez le
   principe  des subroutines en y passant des param�tres afin de tr�s
   bien ma�triser ce principe.

   Vous recevrez la seconde s�rie de cours dans un mois environ. Cela
   vous  laisse le temps de bosser. Surtout approfondissez, et r�sis-
   tez � la tentation de d�sassembler des programmes pour essayez d'y
   comprendre  quelque  chose, ou  �  la tentation de prendre de gros
   sources en croyant y trouver des choses fantastiques. Ce n'est pas
   du tout la bonne solution, au contraire!!!

   Si  vraiment  vous voulez faire tout de suite un gros trucs, alors
   faite  un traitement de texte. Avec le VT52, le Gemdos et le Bios,
   c'est tout � fait possible. Bien s�r, il n'y aura pas la souris et
   il  faudra  taper le nom du fichier au lieu de cliquer dans le s�-
   lecteur, mais  imaginez la t�te de votre voisin qui frime avec son
   scrolling en comprenant 1 instruction sur 50 quand vous lui annon-
   cerez  "Le scrolling c'est pour les petits... moi je fais un trai-
   tement de texte!! "

     De tout coeur, bon courage Le F�roce Lapin (from 44E)

                   Sommaire provisoire de la s�rie 2
   Reprogrammer les Traps,
   D�sassemblage  et  commentaire  d'un programme dont nous ne sommes
   pas les auteurs,
   la m�moire �cran 
   les animations (scrolling verticaux, horizontaux, sprites, ...),
   la musique (avec et sans digits,
   les sound trackers...),
   cr�ation de routines n'utilisant pas le syst�me d'exploitation,
   le GEM et les ressources etc....

Back to ASM_Tutorial