COURS 5.TXT/fr

From Atari Wiki
Revision as of 13:58, 16 December 2023 by Olivier.jan (talk | contribs) (Replacing content with updated version)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search
   ******************************************************************
   *                                                                *
   *             COURS D'ASSEMBLEUR 68000 SUR ATARI ST              *
   *                                                                *
   *                 par Le Féroce Lapin (from 44E)                 *
   *                                                                *
   *                         Cours numéro 5                         *
   *                                                                *
   ******************************************************************


   Suite de l'étude du Status register, les interruptions.


   Etant  donné que nous avons parfaitement compris ce qui se passait
   dans  le cas où le 68000 trouvait le bit T du Status Register à 1,
   c'est-à-dire  tout  le système d'adresse fixe à laquelle on trouve
   l'adresse  de la routine, nous allons pouvoir continuer et en fait
   finir la description des autres bits de ce Status Register.

   Le bit S / Superviseur

     Le  68000 peut  évoluer  dans 2 modes: le mode Superviseur et le
   mode  Utilisateur. Dans  le  mode  superviseur, nous avons accès à
   TOUTES  les  instructions  du  68000 et  à TOUTE la mémoire, alors
   qu'en  mode utilisateur certaines instructions ne peuvent être em-
   ployées, et  l'accès  à  certaines  parties  de la mémoire est in-
   terdit.

     Effectivement  cela  peut  sembler  au premier abord surprenant:
   Vous avez acheté une machine, c'est quand même pour pouvoir l'uti-
   liser  dans sa totalité! Là encore, nous tombons dans le piège qui
   consiste  à  mélanger ATARI ST et 68000 MOTOROLA. Grâce à l'énorme
   puissance  de  ce  micro-processeur, il  est  tout à fait possible
   d'envisager un travail multi-utilisateur. 

   Gonflons  notre ST à 8 Mega octets, équipons le d'un énorme disque
   dur, et  connectons le à plusieurs terminaux. Nous avons donc plu-
   sieurs  claviers, plusieurs  écrans, mais  en revanche un seul mi-
   cro-processeur, celui  de  l'unité centrale (dont le nom prend ici
   toute sa valeur) et une seule mémoire, dans laquelle tout le monde
   pioche  à tours de bras. Là, la différenciation Superviseur/Utili-
   sateur  prend son sens. Le Superviseur, c'est le 'propriétaire' de
   l'unité  centrale, les  personnes  utilisant les terminaux n'étant
   que des 'utilisateurs'. Le fait de ne leur autoriser qu'une partie
   des instructions et de la mémoire, a pour but d'éviter les planta-
   ges  car  si dans le cas d'une mono-utilisation, un plantage total
   de  la machine est toujours gênant, dans le cas d'une multi-utili-
   sation, cela  relève  de  la catastrophe, car on ne plante plus le
   travail d'une seule personnes mais de plusieurs!

   Le bit S du Status Register, s'il est à 0, indique que nous sommes
   en  mode  Utilisateur. A 1, il  indique  que nous sommes en Super-
   viseur.

   Tout  comme  MONST indiquait l'état Trace en indiquant T à côté du
   SR, il  indique  U  ou  S  suivant  le  mode dans lequel nous nous
   trouvons.

   Jetons un coup d'oeil en arrière sur le chapitre décrivant le bro-
   chage  du  68000 (cours  supplémentaire  A). Nous retrouvons cette
   distinction au niveau des broches FC0, FC1, FC2.

   Avant d'étudier les 3 bits restant du SR (I2, I1, I0), il faut sa-
   voir  que le Status Register est en fait séparé en 2 octets. L'oc-
   tet de poids fort (bit 8 à 15) est appelé octet superviseur, alors
   que l'octet de poids faible est l'octet utilisateur.

   En mode utilisateur on ne peut écrire que dans l'octet utilisateur
   alors  qu'en mode superviseur nous avons accès au word dans sa to-
   talité.

   L'octet utilisateur contenant les bits de conditions (bits X N Z V
   C), on  l'appelle  également registre des codes conditions (Condi-
   tion Code Register), ou CCR.

   Les bits I2, I1 et I0  (Interrupt Mask)

   Ces  3 bits servent à représenter les masques d'interruption. Mais
   voyons  tout d'abord ce qu'est une interruption. Nous avons étudié
   précédemment  le  fonctionnement  lié au bit T (trace). Lorsque ce
   bit est positionné, le programme principal est interrompu, au pro-
   fit  d'une routine spéciale. C'est en quelque sorte le principe de
   l'interruption.

   Une  routine en interruption, c'est un bout de programme différent
   du  programme  principal. A  intervalles réguliers ou à cause d'un
   élément extérieur, le 68000 va interrompre (c'est bien le mot!) le
   programme  principal, pour  aller  exécuter cette routine. Lorsque
   celle-ci sera terminée, il y aura retour au programme principal.

   L'exemple  le  plus  simple est celui du téléphone: Je travaille à
   mon  bureau  (c'est  le  programme principal) lorsque le téléphone
   sonne. Je  détecte  l'interruption, j'arrête mon travail et je dé-
   croche (exécution de l'interruption). La conversation terminée, je
   raccroche et je retourne à mon occupation première.

   Maintenant, plus compliqué: Interruption de mon travail principal.
   Je  décroche, mais  en cours de conversation, on sonne à la porte.
   Là  intervient  le  principe  de la priorité d'interruption. Si la
   porte  d'entrée  à  une  priorité supérieure à celle du téléphone,
   j'interrompt  la conversation téléphonique pour aller ouvrir: Il y
   a  interruption  de  l'interruption. Une  fois  claqué la porte au
   124ème  marchand  de balayettes de la journée je reprends le télé-
   phone, je  finis la conversation, je raccroche puis je me remets à
   ma tâche principale.

      Par  contre, si  l'interruption 'porte d'entrée' a une priorité
   inférieure à celle du téléphone, j'attendrai d'avoir fini avec ce-
   lui-ci avant d'aller ouvrir.

   Les  3 bits I2, I1 et I0 (Interrupt mask) permettent de définir le
   niveau  mini  d'interruption  qui  sera pris en cours. Comme on ne
   possède  que 3 bits, on ne peut définir que 7 niveau, de 1 à 7 (on
   ne parle pas ici du niveau 0, car c'est le niveau de travail 'nor-
   mal' de  la  machine. Si  le niveau est à 0, c'est qu'il n'y a pas
   d'interruption.). Ainsi, si  nous  avons 011 pour ces 3 bits, nous
   obtenons  3 comme niveau mini. Les interruptions de niveaux 1 et 2
   ne seront donc pas prises en compte. Puisque le niveau indiqué par
   les  3 bits  sera accepté comme niveau d'interruption, nous en dé-
   duisons que si les bits sont à 111, seuls les interruptions de ni-
   veau  7 seront  prises  en  compte. Or  nous voyons bien également
   qu'il  n'est  pas  possible  de définir un niveau minimum de 8 par
   exemple, et donc qu'il sera impossible d'empêcher une interruption
   de niveau 7. Ce niveau est donc dit 'non-masquable'.

   Les  interruptions de niveau 7 sont donc appelées NMI c'est à dire
   non-maskable-interrupt.

   A noter qu'il n'est pas possible d'opérer une sélection précise et
   par  exemple d'autoriser les interruptions de niveaux 4, 5 et 7 et
   pas  celles de niveau 6. Si les bits sont à 100, les interruptions
   de niveau 4, 5, 6 et 7 seront autorisées. Vous pouvez jeter à nou-
   veau  un  coup d'oeil sur le cours annexe A. Vous retrouverez bien
   sur le 68000 les broches I2, I1 et I0. Une remarque cependant, ces
   broches  sont  actives  à l'état bas, c'est-à-dire qu'elle indique
   quelque  chose lorsqu'il n'y a pas de courant, à l'inverse des au-
   tres broches.

   Par  contre leur représentation au sein du Status Register se fait
   dans le bon 'sens'.
   Nous  sommes maintenant amenés à nous poser une question similaire
   à  celle que nous nous sommes posée lors de l'étude du mode Trace.
   Le  68000 reçoit  une demande d'interruption. Il compare le niveau
   de celle-ci à la limite fixée par les bits I du Status Register.

   Si  l'interruption  est acceptable, il sauve le Status Register et
   met  en place dans les bits I le niveau de l'interruption qu'il va
   exécuter  afin de ne pas être gêné par une autre demande plus fai-
   ble. Il  stoppe  alors l'exécution de son programme principal pour
   se  détourner  vers la routine. Une fois celle-ci terminée, il re-
   vient  au  programme  principal. C'est  bien  joli, mais où a-t-il
   trouvé  la  routine en interruption ? Et bien simplement en utili-
   sant  le  même  principe que pour le mode Trace. Nous avons vu que
   lorsque  le bit T était en place, le 68000 allait voir à l'adresse
   $24 et  qu'il  y trouvait un long mot, ce long mot étant l'adresse
   de la routine. Pour les interruptions, le principe est le même: si
   c'est  une  interruption de niveau 4, c'est à l'adresse $70 que le
   68000 trouvera un long mot, ce long mot, comme dans le cas du mode
   Trace  étant l'adresse de la routine à exécuter. Si l'interruption
   est de niveau 1, c'est le long mot situé à l'adresse $64 etc... Il
   est  bien évident que c'est au programmeur de placer ces long mots
   à  ces adresses: On prépare une routine, on cherche son adresse de
   départ, puis  on note celle ci à l'endroit précis où l'on sait que
   le 68000 viendra la chercher.

   Toutes  ces adresses étant situées dans le premier kilo de mémoire
   de  notre  machine, étudions  de  plus près ces 1024 octets. (Vous
   trouverez  un  tableau représentant ce kilo en annexe) Pour le mo-
   ment  nous  n'allons  faire qu'y repérer les quelques éléments que
   nous avons déjà étudiés. Toutes ces adresses ont des numéros d'or-
   dres, et à cause de leur fonction propre (ne faire que communiquer
   l'adresse d'une routine), on les appelle 'vecteurs'.

   Nous  retrouvons  bien  en $24 le vecteur 9, correspondant au mode
   Trace, de  $64 à $7C les vecteurs correspondants aux interruptions
   de niveau 1 à 7. Le niveau 0, étant le niveau 'normal' de travail,
   n'a pas de vecteur.

   Nous  pouvons  déjà expliquer d'autres vecteurs: Ainsi le numéro 5
   (adresse $14) c'est le vecteur de division par 0. Le 68000 ne peut
   pas  faire  de  division par 0. Lorsque le programme essaye, il se
   produit  la  même  chose que pour le mode Trace: Ayant détecté une
   division  par  0, le  68000 fonce  à  l'adresse  $14, y trouve une
   adresse  de  routine  et va exécuter celle-ci. Dans la plupart des
   cas  cette  routine  va afficher quelques bombes à l'écran et tout
   bloquer. Rien  ne  vous empêche cependant de préparer votre propre
   routine  et  de mettre son adresse en $14. Ainsi dans un programme
   de  math (beurkk!) cette routine peut afficher "division par 0 im-
   possible". Si  l'utilisateur  tente une telle division, inutile de
   faire  des tests pour le prévenir de cette impossibilité, le 68000
   s'en chargera tout seul.


   Les autres vecteurs

       Erreur bus. Nous avons vu précédemment que le 68000 utilise ce
   que nous appelons un bus pour recevoir ou transmettre des données.
   Si  une  erreur  survient sur celui ci, il y a saut a l'adresse $8
   pour trouver l'adresse de la routine qui sera alors exécutée.

       Erreur  d'adresse. Le  68000 ne peut accéder qu'à des adresses
   paires. S'il  tente d'accéder à une adresse impaire, il se produit
   une  erreur  d'adresse  (même  principe de traitement que l'erreur
   bus, ou le mode Trace, vecteur, adresse etc...). Nous verrons plus
   tard  qu'il  nous  sera possible d'accéder à des adresse impaires,
   mais avec des précautions.
   
       Instructions  illégales. Nous avons vu que le travail de l'as-
   sembleur  consistait  simplement  à transformer en chiffres, ligne
   par  ligne, notre programme. Cependant, si nous mettons en mémoire
   une  image, celle-ci  sera également placée dans le 'tube mémoire'
   sous  forme  de  chiffres. La différence c'est que ces chiffres là
   ne  veulent  rien  dire  pour  le 68000 en tant qu'instruction. Si
   nous  ordonnons  au  68000  d'aller  à  cette  adresse  (celle  de
   l'image) il  essayera de décrypter ces chiffres comme des instruc-
   tions, ce qui déclenchera une erreur 'instruction illégale'.

      Violation de privilège. Nous avons vu que le 68000 pouvait évo-
   luer en mode utilisateur ou en mode superviseur. On dit que l'état
   superviseur   est   l'état   privilégié  (ou  état  de  plus  haut
   privilège). Tenter  d'accéder  en  mode utilisateur à une zone mé-
   moire  réservée  au mode superviseur ou bien tenter d'exécuter une
   instruction  privilégiée  (donc  utilisable uniquement en supervi-
   seur) provoquera une erreur 'violation de privilège'.

   Connaître  ces  différents  types d'erreurs est très important. En
   effet  la phase de mise au point est généralement longue en assem-
   bleur, surtout au début. De très nombreuses erreurs peuvent surve-
   nir, dont  la cause est parfois juste sous notre nez. Le type même
   de l'erreur, si celle-ci est bien comprise, peut souvent suffire à
   orienter  les  recherches  plus précisément et ainsi raccourcir le
   temps (pénible) de recherche du grain de sable qui bloque tout!

   Tous  les  vecteurs  constituant  le premier kilo de mémoire ayant
   pour  but  de dérouter le programme principal vers une routine ex-
   ceptionnelle, sont appelés 'vecteurs d'exceptions'.

   Les vecteurs restants seront étudiés dans les séries suivantes, au
   fur et à mesure des besoins. Chaque chose en son temps!

   Pour  aujourd'hui  nous  nous  arrêterons là. Ce fut court mais le
   prochain chapitre sera consacré à la pile et sera bien gros!

   La  pile  est un problème aussi simple que les autres, qui demande
   simplement  de  l'attention. Après avoir étudié ce qu'est la pile,
   il  ne nous restera plus qu'un demi-cours avant d'aborder nos pre-
   miers 'gros' programmes!

   Courage! mais surtout prenez votre temps! Relisez les cours précé-
   dent  même  si tout vous paraît compris. Plus nous avancerons plus
   le nombre de petites choses augmentera et moins il y aura de place
   pour la plus petite incompréhension.

Back to ASM_Tutorial