<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://www.temlib.org/AtariForumWiki/index.php?action=history&amp;feed=atom&amp;title=COURS205.TXT</id>
	<title>COURS205.TXT - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://www.temlib.org/AtariForumWiki/index.php?action=history&amp;feed=atom&amp;title=COURS205.TXT"/>
	<link rel="alternate" type="text/html" href="https://www.temlib.org/AtariForumWiki/index.php?title=COURS205.TXT&amp;action=history"/>
	<updated>2026-05-13T17:10:12Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.39.2</generator>
	<entry>
		<id>https://www.temlib.org/AtariForumWiki/index.php?title=COURS205.TXT&amp;diff=11519&amp;oldid=prev</id>
		<title>&gt;Zorro 2: Created page with &quot;&lt;pre&gt;    ******************************************************************    *                                                                *    *             COURS D'ASSEMBL...&quot;</title>
		<link rel="alternate" type="text/html" href="https://www.temlib.org/AtariForumWiki/index.php?title=COURS205.TXT&amp;diff=11519&amp;oldid=prev"/>
		<updated>2016-12-22T14:54:06Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;&amp;lt;pre&amp;gt;    ******************************************************************    *                                                                *    *             COURS D&amp;#039;ASSEMBL...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
   ******************************************************************&lt;br /&gt;
   *                                                                *&lt;br /&gt;
   *             COURS D'ASSEMBLEUR 68000 SUR ATARI ST              *&lt;br /&gt;
   *                                                                *&lt;br /&gt;
   *                 par Le F‚roce Lapin (from 44E)                 *&lt;br /&gt;
   *                                                                *&lt;br /&gt;
   *                         Seconde s‚rie                          *&lt;br /&gt;
   *                                                                *&lt;br /&gt;
   *                         Cours num‚ro 5                         *&lt;br /&gt;
   ******************************************************************&lt;br /&gt;
&lt;br /&gt;
   AprŠs  ce cours sur les macros,  nous allons passer … l'usage  des&lt;br /&gt;
   tableaux   en  assembleur.   J'espŠre qu'aprŠs chaque  cours  vous&lt;br /&gt;
   effectuez  vous-mˆme des recherches et des exercices,  et que vous&lt;br /&gt;
   ne  vous pr‚cipitez pas tout de suite sur le cours  suivant.  Mˆme&lt;br /&gt;
   si   les cours vous semblent maintenant courts par rapport …  ceux&lt;br /&gt;
   de  la premiŠre s‚rie, il n'en soulŠvent pas moins le voile sur de&lt;br /&gt;
   nombreux   sujets.  Vous   avez  maintenant  le  niveau  pour  les&lt;br /&gt;
   approfondir et j'espŠre que vous le faites!&lt;br /&gt;
&lt;br /&gt;
   LES TABLEAUX&lt;br /&gt;
   L'usage   des  tableaux n'est pas trŠs r‚pandu  en  assembleur  au&lt;br /&gt;
   niveau   des  programmeurs d‚butants.  En effet  le  systŠme  peut&lt;br /&gt;
   sembler  assez p‚rilleux … manipuler mais s'avŠre par contre  trŠs&lt;br /&gt;
   puissant et trŠs commode!&lt;br /&gt;
&lt;br /&gt;
   Tout  comme le principe de la pile,  celui des tableaux est simple&lt;br /&gt;
   mais   demande  beaucoup  de  logique  pour  pouvoir   fonctionner&lt;br /&gt;
   convenablement.  Prenons   tout d'abord un  exemple  simple:  nous&lt;br /&gt;
   allons   appuyer sur les touches de fonctions F1 jusqu'… F10 et  …&lt;br /&gt;
   chaque   fois nous allons afficher une lettre.  Commen‡ons par  un&lt;br /&gt;
   exemple sans tableau.&lt;br /&gt;
&lt;br /&gt;
   Voir le listing num‚ro 2.&lt;br /&gt;
&lt;br /&gt;
   Au  d‚part INCLUDE de la routine de d‚marrage de programme ‚tudi‚e&lt;br /&gt;
   au  d‚but de la seconde s‚rie. Pr‚sentation avec un petit message,&lt;br /&gt;
   puis  attente d'un appui sur une touche. Comme nous voulons tester&lt;br /&gt;
   les   touches  de  fonctions et que celles-ci n'ont  pas  de  code&lt;br /&gt;
   ASCII,  nous  profitons du fait que la fonction Gemdos 7  retourne&lt;br /&gt;
   dans  le poids faible de D0 le code ASCII mais aussi dans le poids&lt;br /&gt;
   fort le scan code. Il n'y a d'ailleurs pas que ‡a de retourn‚, car&lt;br /&gt;
   si   vous consultez la bible ST ou simplement la  description  des&lt;br /&gt;
   fonctions  dans les derniŠres pages de la doc du GFA 3.00,  vous y&lt;br /&gt;
   apprenez  que  Gemdos  7 renvoi  dans  les bits 0-7 le code ASCI, &lt;br /&gt;
   16-23 le  code clavier et 24-31 l'‚tat des touches de commutations&lt;br /&gt;
   du clavier.&lt;br /&gt;
&lt;br /&gt;
   Petit   rappel  sur les codes ASCII et les scan  code.  Les  codes&lt;br /&gt;
   ASCII  (American Standard Code for Information  Interchange)  sont&lt;br /&gt;
   des   codes  sur 7 bits,  qui  suivent  l'ordre  alphab‚tique.  Ce&lt;br /&gt;
   standard   est  aussi  appelle  Code  t‚l‚graphique  international&lt;br /&gt;
   num‚ro  5. Le 8 Šme bit est un bit de parit‚ c'est … dire qu'il ne&lt;br /&gt;
   sert  qu'… la v‚rification de la bonne transmission  du  code.  De&lt;br /&gt;
   part   le fait que ce systŠme est Am‚ricain,  le codage  ASCII  ne&lt;br /&gt;
   prend   pas  en  compte les accents ni les caractŠres  du  type  c&lt;br /&gt;
   c‚dille.  Cependant   notre  ordinateur n'ayant pas besoin  de  ce&lt;br /&gt;
   huitiŠme   bit  pour  v‚rifier  les  transmissions,  celui-ci  est&lt;br /&gt;
   utilis‚  pour augmenter le nombre de combinaison possible.  Retour&lt;br /&gt;
   au  cours 2 de la s‚rie 1,  sur les chiffres magiques: avec 7 bits&lt;br /&gt;
   nous   pouvons compter de 0 … 127,  un bit de plus nous permet  de&lt;br /&gt;
   compter  de 0 … 255.  Consulter un tableau des codes ASCII (bible,&lt;br /&gt;
   livre  du d‚veloppeur, doc GFA etc...) et vous vous rendrez compte&lt;br /&gt;
   que  tous  les  signes 'bizarres' sont cod‚s sur 8bits et ont donc&lt;br /&gt;
   des codes sup‚rieurs … 127.&lt;br /&gt;
&lt;br /&gt;
   Cependant  les codes ASCII ne suffisent pas.  Imaginez que je tape&lt;br /&gt;
   sur   la touche A de mon clavier.  En code ASCII je vais  recevoir&lt;br /&gt;
   65. Mais  si  un Anglais tape sur la mˆme touche, pour lui ce sera&lt;br /&gt;
   un  Q et il recevra le code ASCII 81. Le code ASCII ne d‚pend donc&lt;br /&gt;
   pas  de la touche, m‚caniquement parlant, mais plut“t de la lettre&lt;br /&gt;
   de  cette touche. Il existe un autre codage qui lui correspond aux&lt;br /&gt;
   touches  d'un point de vue m‚canique. C'est ce que l'on appelle le&lt;br /&gt;
   scan-code.&lt;br /&gt;
&lt;br /&gt;
   Pour   le  scan-code,  une touche possŠde  un  num‚ro,  totalement&lt;br /&gt;
   ind‚pendant  de la lettre qui sera affect‚e … cette touche.  Ainsi&lt;br /&gt;
   la   touche A de votre clavier renvoi le scan-code $10,  et il  en&lt;br /&gt;
   est   de  mˆme pour tous les ST du monde,  que cette  touche  soit&lt;br /&gt;
   marqu‚e   &amp;quot;A&amp;quot;,  ou  &amp;quot;Q&amp;quot;.  C'est l'emplacement sur le  clavier  qui&lt;br /&gt;
   compte. &lt;br /&gt;
&lt;br /&gt;
   Nous   testons  donc le scan-code de la touche sur  laquelle  nous&lt;br /&gt;
   avons   appuy‚.  Si  c'est  Escape,  nous  sortons  du  programme.&lt;br /&gt;
   Autrement,   nous  allons  tester  s'il  s'agit  d'une  touche  de&lt;br /&gt;
   fonction.  La  touche F1 a pour scan-code  $3B,  F2-&amp;gt;$3C,  F3-&amp;gt;$3D&lt;br /&gt;
   etc...  jusqu'…  F10-&amp;gt;$44. Les scan-codes se suivant, nous testons&lt;br /&gt;
   donc   notre  r‚sultat par rapport au scan-code de  F1,  si  c'est&lt;br /&gt;
   inf‚rieur  ce  n'est  donc  pas  valable, de  mˆme  par rapport au&lt;br /&gt;
   scan-code   de  F10:  si c'est sup‚rieur ce n'est pas valable non &lt;br /&gt;
   plus. &lt;br /&gt;
&lt;br /&gt;
   Ces tests ‚tant faits, nous sommes donc en pr‚sence d'un scan-code&lt;br /&gt;
   situ‚  entre $3B et $44,  ces 2 nombres compris. $3B, cela fait 59&lt;br /&gt;
   en  d‚cimal.  Pour avoir 65 (code ASCII de A) il suffit  d'ajouter&lt;br /&gt;
   6.  C'est   que nous faisons ensuite.  Nous obtenons donc le  code&lt;br /&gt;
   ASCII  de A,  B,  C etc... suivant la touche de fonction qui a ‚t‚&lt;br /&gt;
   enfonc‚e. Il ne reste plus qu'… afficher cette lettre!&lt;br /&gt;
&lt;br /&gt;
   Imaginons   maintenant  que  nous voulions  afficher  &amp;quot;touche  F1&amp;quot;&lt;br /&gt;
   lorsque   nous appuyons sur cette  touche,  &amp;quot;touche  F2&amp;quot;,  etc....&lt;br /&gt;
   Plusieurs solutions s'offrent … nous. En voici une premiŠre qui me&lt;br /&gt;
   vient  … l'esprit et que je vais juste vous d‚voiler car elle  n'a&lt;br /&gt;
   pas  de rapport avec les tableaux.  Pour ne pas  compliquer,  nous&lt;br /&gt;
   n'afficherons   pas  &amp;quot;touche F10&amp;quot;,  en fait nous ne  prendrons  en&lt;br /&gt;
   compte  que les touches F1-F9.  Souvenez vous d'un des listing  de&lt;br /&gt;
   la  s‚rie 1.  Celui qui affichait une phrase en faisant apparaŒtre&lt;br /&gt;
   les   lettres   comme   sur   les  affichages  des  gares  ou  des&lt;br /&gt;
   a‚roports.Reprenez   donc   un   peu   ce  listing   (c'‚tait  le &lt;br /&gt;
   num‚ro   3)  et  souvenez-vous   de   ce  qui se passait pour  la &lt;br /&gt;
   phrase   situ‚e   …  l'adresse  TXT.  Nous affichions cette phrase&lt;br /&gt;
   mais  auparavant  elle  ‚tait  modifi‚e  …  l'adresse colonne et …&lt;br /&gt;
   l'adresse lettre.&lt;br /&gt;
&lt;br /&gt;
   Dans  la cas pr‚sent il suffit de faire … peu prŠs la mˆme  chose.&lt;br /&gt;
   Pr‚parons une phrase ainsi:&lt;br /&gt;
&lt;br /&gt;
   TXT     DC.B    &amp;quot;TOUCHE F&amp;quot;&lt;br /&gt;
   NUMERO  DC.B    &amp;quot;  &amp;quot;,13,10,0&lt;br /&gt;
&lt;br /&gt;
   A  chaque appui sur une touche de fonction,  nous retirons 10  (en&lt;br /&gt;
   d‚cimal)  au  scan-code,  et nous mettons le r‚sultat …  l'adresse&lt;br /&gt;
   NUMERO.  Ainsi   le  scan-code  de la touche F1 ($3B  donc  59  en&lt;br /&gt;
   d‚cimal)  deviendra   49 qui est le code ASCII de la  lettre  '1'.&lt;br /&gt;
   Nous verrons donc s'afficher 'TOUCHE F1'.&lt;br /&gt;
&lt;br /&gt;
   R‚alisez  ce  programme avant de passer … la suite, cela vous fera&lt;br /&gt;
   un excellent exercice!!!!&lt;br /&gt;
&lt;br /&gt;
   Passons maintenant au tableau, en modifiant un peu l'affichage.&lt;br /&gt;
&lt;br /&gt;
   Un appui sur:                   affichera:&lt;br /&gt;
   F1                      A&lt;br /&gt;
   F2                      Z&lt;br /&gt;
   F2                      E&lt;br /&gt;
   F4                      R&lt;br /&gt;
   F5                      T&lt;br /&gt;
   F6                      Y&lt;br /&gt;
   F7                      U&lt;br /&gt;
   F8                      I&lt;br /&gt;
   F9                      O&lt;br /&gt;
   F10                     P&lt;br /&gt;
&lt;br /&gt;
   PremiŠre   constatation:  si les scan-code des touches se  suivent&lt;br /&gt;
   toujours, on  peut  dire  que  le  lien  logique entre les lettres&lt;br /&gt;
   affich‚es est un peu l‚ger...&lt;br /&gt;
&lt;br /&gt;
   Prenez   le  listing num‚ro 3,  et commen‡ons … l'‚tudier. Tout le&lt;br /&gt;
   d‚but, jusqu'au   commentaire   'la   touche   est   valable', est&lt;br /&gt;
   strictement identique au listing pr‚c‚dent. Ensuite nous attaquons&lt;br /&gt;
   la  partie utilisant le tableau.  L'adresse de celui-ci est pass‚e&lt;br /&gt;
   en  A0 (Load Effective Adress),  ensuite  on retire  $3B … D0 afin&lt;br /&gt;
   que  celui-ci  ait  une  valeur  de  0 …  9.  Le tableau  que nous&lt;br /&gt;
   utilisons  est  compos‚ de  Words.  Or, un  word c'est  2  bytes, &lt;br /&gt;
   et  la m‚moire est compos‚  de  bytes.  Pour  se d‚placer  dans un&lt;br /&gt;
   tableau en word alors que notre unit‚ c'est  le byte, il faut donc&lt;br /&gt;
   se d‚placer de 2 en 2. Il ne faut donc pas que notre  'compteur', &lt;br /&gt;
   qui   est  ici D0,  prenne une valeur  du  type 0,1,2,3,4  etc... &lt;br /&gt;
   mais plut“t une valeur telle que  0,2,4,6,8... &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   Puisqu'…  la suite de nos op‚rations nous avons D0 avec une valeur&lt;br /&gt;
   du  type 0,1,2,3,4... il faut maintenant le multiplier par 2. Cela&lt;br /&gt;
   se   fait par l'op‚ration MULU qui se lit  Multiply  Unsigned.  En&lt;br /&gt;
   effet  c'est une multiplication non-sign‚e,  c'est-…-dire  qu'elle&lt;br /&gt;
   ne   prend  pas  en  compte le signe  de  ce  qui  est  multipli‚,&lt;br /&gt;
   contrairement … l'op‚ration MULS (Multiply signed).&lt;br /&gt;
&lt;br /&gt;
   Maintenant, observons bien cette instruction:&lt;br /&gt;
   MOVE.W    0(A0,D0.W),D0&lt;br /&gt;
   Il  s'agit d'un MOVE donc d'un d‚placement. Il se fait sur un word&lt;br /&gt;
   puisque   nous  avons .W Ce MOVE va prendre le D0 iŠme word de  A0&lt;br /&gt;
   pour   le mettre dans D1.  Ainsi,  si nous appuyons sur  F3,  nous&lt;br /&gt;
   obtenons   $3D.  Nous  retirons  $3B  et  nous  obtenons  2,  nous&lt;br /&gt;
   multiplions  par 2, et donc D0 vaut maintenant 4. Nous allons donc&lt;br /&gt;
   pointer   sur le 4Šme byte de A0 et pr‚lever un word …  partir  de&lt;br /&gt;
   cet  endroit.  Le d‚placement est en effet toujours compt‚ avec un&lt;br /&gt;
   nombre  de bytes, que le tableau soit en byte, en word ou en long.&lt;br /&gt;
   C'est   un  peu comme si vous vous d‚placiez dans une rue avec des&lt;br /&gt;
   petites  maisons, des  moyennes ou des grandes, le d‚placement  se&lt;br /&gt;
   comptera toujours en mŠtres.&lt;br /&gt;
&lt;br /&gt;
   Mais   que signifie le 0 devant la parenthŠse ?  Et bien c'est  la&lt;br /&gt;
   valeur  d'un d‚placement fixe … ajouter.  Prenons un exemple: Nous&lt;br /&gt;
   avons   un  tableau dans lequel on 'tape' suivant un  chiffre  qui&lt;br /&gt;
   nous   est fourni par un appui sur une touche.  Seulement on  doit&lt;br /&gt;
   pr‚lever   des choses diff‚rentes si la touche est  appuy‚e  alors&lt;br /&gt;
   que   SHIFT est enfonc‚e.  Il est alors possible de  se  dire:  si&lt;br /&gt;
   shift   n'est pas enfonc‚ alors se sont les premiers  ‚l‚ments  du&lt;br /&gt;
   tableau  qui seront pris en compte,  mais avec shift ce seront les&lt;br /&gt;
   ‚l‚ments de la fin. On pourra alors faire:&lt;br /&gt;
&lt;br /&gt;
   MOVE.W    0(A0,D0.W),D1  ou bien si shift est appuy‚, &lt;br /&gt;
   MOVE.W    18(A0,D0.W),D1.  Ceci revient … prendre le D0 iŠme word &lt;br /&gt;
   de A0, en commen‡ant … compter … 18 bytes du d‚but de A0.&lt;br /&gt;
&lt;br /&gt;
   Il   faut cependant se m‚fier de plusieurs choses  concernant  les&lt;br /&gt;
   tableaux. Tout  d'abord bien faire attention au type de donn‚es du&lt;br /&gt;
   tableau   afin  de  bien modifier le  'compteur'  en  cons‚quence.&lt;br /&gt;
   Ensuite  bien faire attention au fait que le premier ‚l‚ment c'est&lt;br /&gt;
   l'‚l‚ment 0 et  non  pas le 1.   Nous avions d‚j… vu dans les tous&lt;br /&gt;
   premiers   cours  de  la s‚rie 1 les  problŠmes  pouvant  survenir&lt;br /&gt;
   lorsque  l'on compte,  en oubliant parfois le 0.  Ce problŠme  est&lt;br /&gt;
   d'autant plus gˆnant avec les tableaux que, si au lieu de  retirer&lt;br /&gt;
   $3B  dans mon exemple pour avoir un chiffre de 0 … 9,  je  n'avais&lt;br /&gt;
   retir‚   que  $3A et ainsi obtenu 1 …  10,  mon  programme  aurait&lt;br /&gt;
   parfaitement  fonctionn‚.  Il aurait simplement affich‚  n'importe&lt;br /&gt;
   quoi  … la suite d'un appui sur F10. Or si vous avez un tableau de&lt;br /&gt;
   200  ‚l‚ments   que vous appelez avec les  touches,  les  touches+&lt;br /&gt;
   shifts,  +control  etc...  la v‚rification touche par touche  sera&lt;br /&gt;
   peut  ˆtre  laiss‚e  de  cot‚... Dans  notre  exemple, nous  avons&lt;br /&gt;
   utilis‚  des words dans notre tableau.  Il aurait tout … fait  ‚t‚&lt;br /&gt;
   possible d'utiliser des bytes.&lt;br /&gt;
&lt;br /&gt;
   Modifiez  un peu le programme:  supprimer la ligne avec  MULU,  et&lt;br /&gt;
   modifiez  les datas.  Au lieu de mettre DC.W … l'adresse  TABLEAU,&lt;br /&gt;
   mettez  DC.B.  Pour terminer, puisque notre tableau est maintenant&lt;br /&gt;
   en  bytes  et  non  plus  en  words,il  faut  modifier l'adressage&lt;br /&gt;
   permettant  de  piocher dedans. Au lieu de MOVE.W 0(A0,D0.W),D1 il&lt;br /&gt;
   faut mettre maintenant MOVE.B 0(A0,D0.W),D1&lt;br /&gt;
&lt;br /&gt;
   Attention cependant car nous avions parl‚ de l'impossibilit‚ de se&lt;br /&gt;
   servir  des  adresses impaires.  Pourtant, dans  ce  dernier  cas,&lt;br /&gt;
   comme  notre tableau est en bytes, si D0 vaut 3, nous nous retrou-&lt;br /&gt;
   vons  avec  une adresse impaire, et pourtant ‡a  marche! En effet &lt;br /&gt;
   cela  marche  parce  que nous pr‚levons un byte. En fait, le 68000&lt;br /&gt;
   peut  trŠs  bien  pr‚lever  un  byte  …  une  adresse  impaire, en&lt;br /&gt;
   revanche,  ce   qu'il ne peut pas faire c'est pr‚lever une  donn‚e&lt;br /&gt;
   plus grande (word ou long) qui commence sur une adresse impaire et&lt;br /&gt;
   qui  donc  chevauche  les emplacements 'normaux'. Modifions encore&lt;br /&gt;
   une  fois  le programme.  Remettez le tableau en word, et remettez&lt;br /&gt;
   l'adressage  en  word  (MOVE.W  0(A0,D0.W),D1).  L'erreur  va donc&lt;br /&gt;
   venir  du  fait  que  nous avons oubli‚ le MULU, et donc que notre&lt;br /&gt;
   compteur  va ˆtre parfois impaire alors que notre tableau et notre&lt;br /&gt;
   mode d'adressage demande un compteur paire.&lt;br /&gt;
&lt;br /&gt;
   Assemblez  et lancez.  Appuyez sur F1: tout ce passe bien! Normal,&lt;br /&gt;
   D0 aprŠs  retrait  de $3B,  vaut 0 qui est donc pair.  Appuyez sur&lt;br /&gt;
   F3: mˆme chose car D0 vaut 2. Par contre, un appui sur F2 se solde&lt;br /&gt;
   par  3 bombes et le retour … DEVPACK.  D‚buggons  donc  notre pro-&lt;br /&gt;
   gramme:  alternate+D, et descendons jusqu'… la ligne:&lt;br /&gt;
   MOVE.W 0(A0,D0.W),D1&lt;br /&gt;
&lt;br /&gt;
   Pla‡ons   cette  ligne en haut de la fenˆtre 1 et tapons control+B&lt;br /&gt;
   Un  breakpoint  s'y  met. Lan‡ons avec control+R, et tapons sur la&lt;br /&gt;
   touche  F2.  Breakpoint,  nous revoici sous MONST. En regardant la&lt;br /&gt;
   valeur  de A0 nous connaissons l'adresse de notre tableau, adresse&lt;br /&gt;
   paire  en l'occurrence.  Par contre,  si vous avez appuyez sur F2,&lt;br /&gt;
   vous  devez  avoir  1 comme valeur de D0, donc une valeur impaire.&lt;br /&gt;
   Avancez  d'un  pas  sur  MOVE.W  0(A0,D0.W),D1 … l'aide Control+Z.&lt;br /&gt;
   Erreur  d'adresse!  Il  ne  vous  reste  plus  qu'…  quitter  par &lt;br /&gt;
   Control+C.&lt;br /&gt;
&lt;br /&gt;
   Bon,  nous   avons vu comment pr‚lever un word ou un byte dans  un&lt;br /&gt;
   tableau.  Avec  un tout petit peu d'intelligence vous  devez  ˆtre&lt;br /&gt;
   capable   de pr‚lever un long mot (au lieu de faire un MULU par  2&lt;br /&gt;
   on  en fait un par 4).  Prenons un peu de recul et rappelons  nous&lt;br /&gt;
   des   cours  pr‚c‚dents:  nous y avons ‚tudi‚ le  principe  de  ce&lt;br /&gt;
   'tube',  de   cette   m‚moire   que  nous  commen‡ons  …  utiliser&lt;br /&gt;
   abondamment.  Si vous avez un peu de m‚moire justement, vous devez&lt;br /&gt;
   vous  rappeler  d'une  remarque  faite au tout d‚but, disant qu'il&lt;br /&gt;
   fallait  bien se m‚fier de confondre contenu du tube et adresse de&lt;br /&gt;
   ce contenu. Il est en effet tout … fait possible d'avoir&lt;br /&gt;
&lt;br /&gt;
   IMAGE         incbin         A:\MAISON.PI1&amp;quot;&lt;br /&gt;
   PTN_IMAGE     DC.L           IMAGE&lt;br /&gt;
&lt;br /&gt;
   A  l'adresse  IMAGE, nous trouvons dans le tube l'image elle-mˆme,&lt;br /&gt;
   mais  …  l'adresse  PTN_IMAGE, nous  trouvons  un long mot, qui se&lt;br /&gt;
   trouve  ˆtre l'adresse de l'image. Avec un peu d'imagination, nous&lt;br /&gt;
   pouvons  donc  imaginer  un tableau compos‚ de long mot, ces longs&lt;br /&gt;
   mots  ‚tant des adresses d'images, de textes, mais aussi (pourquoi&lt;br /&gt;
   pas!) de routines!!!!!!&lt;br /&gt;
&lt;br /&gt;
   Voici  le  squelette  d'un programme r‚alisant une telle chose: Au&lt;br /&gt;
   d‚part, mˆme  chose  que  pr‚c‚demment, attente d'un appui touche,&lt;br /&gt;
   v‚rification  de  la validit‚ de la touche, on trafique pour avoir&lt;br /&gt;
   un code du type 0,1,2,3,4... puis on le mulu par 4 puisque notre &lt;br /&gt;
   tableau va ˆtre compos‚ de long mot.&lt;br /&gt;
&lt;br /&gt;
            LEA       TABLEAU,A0&lt;br /&gt;
            MOVE.L    0(A0,D0.W),A0 &lt;br /&gt;
            JSR       (A0)&lt;br /&gt;
            BRA       DEBUT                et on recommence&lt;br /&gt;
&lt;br /&gt;
   Nous  faisons un JSR (jump subroutine) au lieu d'un BSR. Pourquoi?&lt;br /&gt;
   essayez, et  regardez  l'annexe sur les instructions pour voir les&lt;br /&gt;
   diff‚rences entre les 2 instructions!!!&lt;br /&gt;
&lt;br /&gt;
   Mais de quoi est compos‚ notre tableau? eh bien, par exemple&lt;br /&gt;
&lt;br /&gt;
   TABLEAU DC.L TOUT_VERT&lt;br /&gt;
    DC.L    TOUT_BLEU&lt;br /&gt;
    DC.L    QUITTER&lt;br /&gt;
    DC.L    DRING&lt;br /&gt;
    DC.L    COUCOU&lt;br /&gt;
&lt;br /&gt;
   etc....&lt;br /&gt;
&lt;br /&gt;
   Toutes ces entr‚es ‚tant les adresses des routines. Par exemple&lt;br /&gt;
&lt;br /&gt;
   COUCOU move.l #message,-(sp)&lt;br /&gt;
    move.w #9,-(sp)&lt;br /&gt;
    trap #1&lt;br /&gt;
    addq.l #6,sp&lt;br /&gt;
    rts&lt;br /&gt;
&lt;br /&gt;
   La routine TOUT_VERT met toute la palette en vert etc....&lt;br /&gt;
&lt;br /&gt;
   Il  est  de  mˆme  possible  de  mettre en tableau des adresses de&lt;br /&gt;
   phrases et de passer l'adresse &amp;quot;pioch‚e&amp;quot; … une routine qui affiche&lt;br /&gt;
   avec gemdos(9) par exemple.&lt;br /&gt;
&lt;br /&gt;
   Une derniŠre chose, qui est plus proche du systŠme de liste que de&lt;br /&gt;
   celui de tableau, mais qui est aussi bien utile. Nous avons ‚tudi‚&lt;br /&gt;
   ici   des  possibilit‚s  ‚manant  toujours  d'une  mˆme  ‚vidence:&lt;br /&gt;
   les  donn‚es  qui  nous  servent  …  pointer  dans  le tableau, se&lt;br /&gt;
   suivent ! Malheureusement  dans  de  nombreux cas, celles-ci ne se&lt;br /&gt;
   suivent pas...&lt;br /&gt;
&lt;br /&gt;
   Voici  donc  une  autre  m‚thode: Imaginons le cas d'un ‚diteur de&lt;br /&gt;
   texte, avec  plusieurs actions possibles (effacer le texte, sauver&lt;br /&gt;
   le  texte, l'imprimer, charger, ‚craser, scroller etc...) appel‚es&lt;br /&gt;
   par  des  combinaisons  de touches. Pour ˆtre … la norme Wordstart&lt;br /&gt;
   (c'est  la  norme  clavier utilis‚e par Devack: ALT+W=imprimer par&lt;br /&gt;
   exemple), j'ai  d'abord  relev‚  avec un tout petit programme, les&lt;br /&gt;
   codes  renvoy‚s  par  les  combinaisons  de  touches  Ensuite j'ai&lt;br /&gt;
   r‚alis‚  une liste de ces codes, liste en word car les codes ASCII&lt;br /&gt;
   ne  suffisent  plus dans le cas de combinaisons de touches (il est&lt;br /&gt;
   possible  bien  s–r de construire la combinaison touche enfonc‚e/-&lt;br /&gt;
   touche de control).&lt;br /&gt;
&lt;br /&gt;
   TAB_CODE dc.w $1519,$1615,$1312,$2e03,$FFFF&lt;br /&gt;
&lt;br /&gt;
   Ensuite  j'ai r‚alis‚ une liste avec les adresses de mes routines.&lt;br /&gt;
   Comme au d‚part je n'en avais aucune de faite, j'en ai r‚alis‚ une&lt;br /&gt;
   'bidon', nomm‚e JRTS et qui ne fait.... qu'RTS!&lt;br /&gt;
&lt;br /&gt;
   TAB_ROUTINE dc.l JRTS,JRTS,JRTS,JRTS&lt;br /&gt;
&lt;br /&gt;
   Ensuite  j'ai  fait une boucle pour lire TAB_CODE, en comparant, …&lt;br /&gt;
   chaque  fois, la  valeur  trouv‚e dans le tableau avec celle de la&lt;br /&gt;
   touche. En mˆme temps je parcours TAB_ROUTINE afin qu'au moment o—&lt;br /&gt;
   je  lis le 3Šme ‚l‚ment de TAB_CODE, je sois en face du 3 Šme ‚l‚-&lt;br /&gt;
   ment de TAB_ROUTINE.&lt;br /&gt;
&lt;br /&gt;
   Voici  le module. D7 contient le word correspondant … la touche ou&lt;br /&gt;
   … la combinaison de touche.&lt;br /&gt;
&lt;br /&gt;
    LEA TAB_CODE,A0&lt;br /&gt;
    LEA TAB_ROUTINE,A1&lt;br /&gt;
   .ICI MOVE.W (A0)+,D0&lt;br /&gt;
    CMP.W #$FFFF,D0&lt;br /&gt;
    BEQ DEBUT&lt;br /&gt;
    MOVE.L (A1)+,A2&lt;br /&gt;
    CMP.W D0,D7&lt;br /&gt;
    BNE .ICI&lt;br /&gt;
    JSR (A2)&lt;br /&gt;
    BRA DEBUT&lt;br /&gt;
&lt;br /&gt;
   L'adresse  de  la  liste  des  codes  est  mise en A0 et celle des&lt;br /&gt;
   adresses   de  routines  en  A1.  On  pr‚lŠve  un  word  de  code.&lt;br /&gt;
   C'est $FFFF? si c'est le cas, c'est donc que nous sommes en fin de&lt;br /&gt;
   liste  donc  on  se  sauve  puisque  la  touche  choisit n'est pas&lt;br /&gt;
   valable. Sinon  on  pr‚lŠve l'adresse dans le tableau des adresses&lt;br /&gt;
   de  routines. Le  code  du  tableau est-il le mˆme que celui de la&lt;br /&gt;
   touche  ? Non, on boucle (notez ici le point devant le label. Cela&lt;br /&gt;
   indique  que  le  label  est  local. L'assembleur le rapportera au&lt;br /&gt;
   label le plus proche portant ce nom. Il est ainsi possible d'avoir&lt;br /&gt;
   plusieurs  label  .ICI  dans  un  programme,  ou  tout  autre  nom&lt;br /&gt;
   pourvu  qu'il  soit  pr‚c‚d‚  d'un  point. Dans  le cas de petites&lt;br /&gt;
   boucles  par  exemple, cela  ‚vite  de chercher des noms de labels&lt;br /&gt;
   tordus!!!).&lt;br /&gt;
&lt;br /&gt;
   Puisque  le code est identique … celui de la touche, on saute vers&lt;br /&gt;
   la routine, et au retour, on recommence.&lt;br /&gt;
&lt;br /&gt;
   Les  avantages  de  cette  m‚thode sont multiples. Tout d'abord la&lt;br /&gt;
   petite taille de la routine de test: s'il avait fallu r‚aliser des&lt;br /&gt;
   tests du genre:&lt;br /&gt;
&lt;br /&gt;
    cmp.w #$1519,d7&lt;br /&gt;
    bne.s .ici1&lt;br /&gt;
    bsr truc&lt;br /&gt;
    bra d‚but&lt;br /&gt;
   .ici1 cmp.w #$1615,d7&lt;br /&gt;
    bne.s .ici2&lt;br /&gt;
    bsr truc2&lt;br /&gt;
    bra d‚but&lt;br /&gt;
   .ici2&lt;br /&gt;
   etc.... la  taille aurait ‚t‚ sup‚rieure, surtout que dans l'exem-&lt;br /&gt;
   ple il n'y a que 4 codes... Imaginez avec une trentaine!!! L'autre&lt;br /&gt;
   avantage  concerne  la  mise  au point du programme. En effet rien&lt;br /&gt;
   n'empˆche  de  pr‚voir plein de routines mais de simplement mettre&lt;br /&gt;
   l'adresse d'un RTS, et progressivement de construire ces routines.&lt;br /&gt;
   Rien  n'empˆchera pour autant le programme de marcher. De mˆme, le&lt;br /&gt;
   systŠme  du flag de fin ($FFFF) permet de rajouter trŠs facilement&lt;br /&gt;
   des codes et donc des routines.&lt;br /&gt;
&lt;br /&gt;
   Voila  pour  les listes et tableaux!! les applications sont innom-&lt;br /&gt;
   brables  et  permettent  souvent  en  peu de lignes des tests, des&lt;br /&gt;
   recherches, des  calculs,  des  conversions  ou  des  branchements&lt;br /&gt;
   r‚alisables autrement mais au prix de difficult‚s immenses!&lt;br /&gt;
&lt;br /&gt;
   Voici des id‚es d'applications:&lt;br /&gt;
&lt;br /&gt;
   codage  de  texte  (utilisation du code ASCII pour pointer dans un&lt;br /&gt;
   tableau donnant la valeur … substituer)&lt;br /&gt;
&lt;br /&gt;
   animation  (tableau parcouru s‚quentiellement donnant les adresses&lt;br /&gt;
   des images … afficher)&lt;br /&gt;
&lt;br /&gt;
   gestion de touches&lt;br /&gt;
&lt;br /&gt;
   gestion de souris (tableau avec les coordonn‚es des zones ‚cran)&lt;br /&gt;
   menu d‚roulant&lt;br /&gt;
&lt;br /&gt;
   etc...&lt;br /&gt;
   &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Back to [[ASM_Tutorial]]&lt;br /&gt;
[[Category: ASSEMBLEUR 68000 sur ATARI ST Part 1 ]]&lt;/div&gt;</summary>
		<author><name>&gt;Zorro 2</name></author>
	</entry>
</feed>