<?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=COURS203.TXT</id>
	<title>COURS203.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=COURS203.TXT"/>
	<link rel="alternate" type="text/html" href="https://www.temlib.org/AtariForumWiki/index.php?title=COURS203.TXT&amp;action=history"/>
	<updated>2026-07-27T00:55:20Z</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=COURS203.TXT&amp;diff=11517&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=COURS203.TXT&amp;diff=11517&amp;oldid=prev"/>
		<updated>2016-12-22T14:53:53Z</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 3                         *&lt;br /&gt;
   *****************************************************************&lt;br /&gt;
   &lt;br /&gt;
   Avant  de continuer … ‚tudier ces cours,  je pense qu'il est grand&lt;br /&gt;
   temps  pour vous d'‚tudier toutes les instructions du 68000.  Vous&lt;br /&gt;
   avez d‚j… suffisamment de bases pour r‚aliser de petits programmes&lt;br /&gt;
   et  surtout  vous  devez  vous  ˆtre  habitu‚  avec le systŠme qui&lt;br /&gt;
   consiste  …   taper  seulement  2 ou 3 lignes de programmes puis …&lt;br /&gt;
   visualiser leur fonction avec MONST.&lt;br /&gt;
   &lt;br /&gt;
   Prenez  donc  l'ouvrage sur le 68000 que vous avez normalement ac-&lt;br /&gt;
   quis,  et faites le tour de toutes les instructions avec cette m‚-&lt;br /&gt;
   thode.  Observez  bien  les  r‚sultats des op‚rations de d‚calages&lt;br /&gt;
   (ASL,  ASR  etc..) Il ne s'agit pas ici de les connaŒtre par coeur&lt;br /&gt;
   mais  au  moins  de  savoir qu'elles existent pour pouvoir, le cas&lt;br /&gt;
   ‚ch‚ant, les  retrouver  facilement,  et surtout d'ˆtre capable de&lt;br /&gt;
   comprendre  ce qu'elles font.  Le nombre d'instructions est faible&lt;br /&gt;
   mais  chacune  d'elle  r‚alise  une  op‚ration  bien pr‚cise qu'il&lt;br /&gt;
   convient  de connaŒtre dans ses moindres d‚tails. Il ne suffit pas&lt;br /&gt;
   de  savoir  que  ROR r‚alise une rotation vers la droite,  il faut&lt;br /&gt;
   ‚galement  savoir que le bit ‚ject‚ d'un cot‚ est remis de l'autre&lt;br /&gt;
   et, qu'en  plus, il  est recopi‚ dans le bit C du SR.  Il faut re-&lt;br /&gt;
   marquer  aussi  que ROR #4,D0 est accept‚ mais pas ROR #9,D0. Dans&lt;br /&gt;
   ce  cas il faut faire 2 ROR ou MOVE.W #9,D1 puis ROR D1,D0.  C'est&lt;br /&gt;
   ce  genre  de  petits  trucs qui vous bloqueront plus tard si vous&lt;br /&gt;
   n'avez pas pass‚ quelques heures … les d‚cortiquer!&lt;br /&gt;
   &lt;br /&gt;
   LES INCLUSIONS DE FICHIERS&lt;br /&gt;
   &lt;br /&gt;
   L'un  des plus gros problŠme de l'ASSEMBLEUR se situe au niveau de&lt;br /&gt;
   la  taille  des  listings.  Si  en BASIC une ligne suffit pour une&lt;br /&gt;
   op‚ration parfois trŠs complexe, nous avons vu qu'en ASSEMBLEUR ce&lt;br /&gt;
   n'‚tait  pas  le  cas.  Par  contre  nous  avons  vu ‚galement que&lt;br /&gt;
   l'‚criture  en ASSEMBLEUR consistait …  taper le bon nombre d'ins-&lt;br /&gt;
   truction  machine, alors  que  le compilateur du BASIC, du C ou du&lt;br /&gt;
   PASCAL  se  d‚brouille  … faire une traduction 'qui marche' et qui&lt;br /&gt;
   n'est donc pas forc‚ment la plus ‚conomique au niveau taille et/ou&lt;br /&gt;
   au niveau vitesse.&lt;br /&gt;
   &lt;br /&gt;
   En contre partie,  nos sources ASSEMBLEUR font trŠs rapidement des&lt;br /&gt;
   pages  et des pages l…, o— un programmeur travaillant avec un lan-&lt;br /&gt;
   gage  '‚volu‚' n'aurait que quelques dizaines de lignes. Il existe&lt;br /&gt;
   cependant  quelques  m‚thodes  permettant  non  pas  d'‚viter  ces&lt;br /&gt;
   multiples pages, mais de r‚duire sensiblement la taille du listing&lt;br /&gt;
   sur lequel nous travaillons.&lt;br /&gt;
   &lt;br /&gt;
   Deux  directives vont principalement nous servir. Attention, ce ne&lt;br /&gt;
   sont  pas des instructions ASSEMBLEUR, mais des ordres interpr‚t‚s&lt;br /&gt;
   par  l'ASSEMBLEUR.  Ce sont donc, dans notre cas, des instructions&lt;br /&gt;
   'Devpack' et non pas des instructions '68000'.&lt;br /&gt;
   &lt;br /&gt;
   La  premiŠre, INCBIN, permet  d'incorporer  dans  le  programme un&lt;br /&gt;
   fichier  binaire.  Un fichier binaire cela peut-ˆtre une image, de&lt;br /&gt;
   la digit, des sprites etc... ou bien un morceau de programme qui a&lt;br /&gt;
   ‚t‚  assembl‚ sous forme de fichier binaire. Voici un exemple avec&lt;br /&gt;
   une image. (listing 1 s‚rie 2)&lt;br /&gt;
   &lt;br /&gt;
   Tout  d'abord  nous  transf‚rons l'adresse de l'image en A6,  nous&lt;br /&gt;
   sautons  l'en-tˆte  de  celle-ci pour pointer sur les couleurs qui&lt;br /&gt;
   sont mises en place avec Xbios(6), nous cherchons ensuite l'adres-&lt;br /&gt;
   se de l'‚cran avec la fonction Xbios(3) puis, aprŠs avoir saut‚ la&lt;br /&gt;
   palette  de couleurs de notre image,  nous transf‚rons cette image&lt;br /&gt;
   sur  l'‚cran. Un  ‚cran  fait  32000  octets.  Si nous transf‚rons&lt;br /&gt;
   long  mot  par  long  mot,  nous  ne  devons transf‚rer que 32000 &lt;br /&gt;
   divis‚  par  4 c'est  … dire 8000 long mots.  Comme nous utilisons&lt;br /&gt;
   une  boucle  DBF  qui compte jusqu'… 0 compris (la boucle s'arrˆte&lt;br /&gt;
   quand  le  compteur  atteint  -1),  il  faut  donc  initialiser le&lt;br /&gt;
   compteur  …  7999. Ensuite  attente  d'appui sur une touche et bye&lt;br /&gt;
   bye.&lt;br /&gt;
   &lt;br /&gt;
   Petit exercice ‚ducatif. Une fois ce programme assembl‚, suivez le&lt;br /&gt;
   sous MONST. Lorsque Xbios(3) aura donn‚ l'adresse de l'‚cran, pla-&lt;br /&gt;
   cez  la fenˆtre 3 sur cette adresse puis continuez … faire avancer&lt;br /&gt;
   pas … pas le programme, pour voir la recopie se faire. De temps en&lt;br /&gt;
   temps tapez sur la touche V afin de voir l'‚cran au lieu de MONST,&lt;br /&gt;
   vous pourrez ainsi suivre l'affichage 'en direct'!!!&lt;br /&gt;
   &lt;br /&gt;
   Autre  petit  exercice:  Le ST possŠde la particularit‚ d'avoir en&lt;br /&gt;
   quelque sorte 2 ‚crans: l'‚cran sur lequel on travaille (Xbios(2))&lt;br /&gt;
   et  celui  que  l'on  voit (Xbios(3)).  Dans la plupart des cas il&lt;br /&gt;
   s'agit  du  mˆme  mais il est tout … fait possible de les placer …&lt;br /&gt;
   des  endroits  diff‚rents  de  la  m‚moire et ainsi de pr‚parer un&lt;br /&gt;
   affichage  dans  xbios2 tout  en  montrant  Xbios3.  Il sera ainsi&lt;br /&gt;
   possible  d'afficher  rapidement  Xbios2 en  le  transf‚rant  dans&lt;br /&gt;
   Xbios3, et ainsi, de faire des animations rapides. Essayez donc de&lt;br /&gt;
   changer  un  peu  le  listing  et de mettre MOVE.W  #2,-(SP)  … la&lt;br /&gt;
   place  de 3 pour la recherche de l'‚cran. D‚buggez le programme et&lt;br /&gt;
   constatez!&lt;br /&gt;
   &lt;br /&gt;
   Mais ceci nous ‚loigne un peu du sujet qui ‚tait l'inclusion. Pour&lt;br /&gt;
   r‚aliser ceci nous avons juste fourni un label de rep‚rage qui est&lt;br /&gt;
   ici  IMAGE  puis l'instruction INCBIN suivi du chemin pour trouver&lt;br /&gt;
   cette  image. Dans l'exemple c'est une image PI3 mais rien ne vous&lt;br /&gt;
   empˆche  de mettre une image PI2 ou PI1! Nous aurions trŠs bien pu&lt;br /&gt;
   mettre 2 images l'une … la suite de l'autre,  sans mettre de label&lt;br /&gt;
   pour  rep‚rer  la  seconde.  Pour  pointer dessus,  sachant qu'une&lt;br /&gt;
   image DEGAS fait 32066 octets, nous aurions fait:&lt;br /&gt;
   &lt;br /&gt;
            LEA       IMAGE,A6&lt;br /&gt;
            ADDA.L    #32066,A6&lt;br /&gt;
   Je rappelle que cela se lit: load effective address IMAGE dans A6 &lt;br /&gt;
   add address long...&lt;br /&gt;
   &lt;br /&gt;
   Petit  exercice: faire  un  programme  qui tourne en moyenne r‚so-&lt;br /&gt;
   lution, passe en basse, affiche une image basse r‚solution, attend&lt;br /&gt;
   un appui sur une touche puis repasse en moyenne.  Sachant utiliser&lt;br /&gt;
   les  fonctions Xbios et les boucles,  vous devriez ˆtre capable de&lt;br /&gt;
   faire  une  routine  de  sauvegarde  de la palette et une autre de&lt;br /&gt;
   restitution de celle-ci.&lt;br /&gt;
   &lt;br /&gt;
   Il  est  tout  …  fait  possible d'inclure ainsi des fichiers trŠs&lt;br /&gt;
   divers.  Il  existe pourtant plusieurs problŠmes.  Tout d'abord la&lt;br /&gt;
   taille  du programme r‚sultant.  En effet,  notre image DEGAS,  de&lt;br /&gt;
   part sa taille, a grossi notre programme de 32Ko!  Bien s–r il y a&lt;br /&gt;
   maintenant  l'avantage  de  pouvoir  empˆcher  les bidouilleurs de&lt;br /&gt;
   venir  y   mettre  leur  pieds!  Encore  qu'une  image  DEGAS fait&lt;br /&gt;
   toujours  la mˆme taille, mais il est possible d'inclure une image&lt;br /&gt;
   compact‚e   (en  mettant bien s–r une routine de d‚compactage dans&lt;br /&gt;
   notre programme!).&lt;br /&gt;
   &lt;br /&gt;
   Autre  problŠme,  le temps! En effet,  si l'affichage lui mˆme est&lt;br /&gt;
   plus  rapide  du fait qu'il n'y a pas … aller chercher l'image sur&lt;br /&gt;
   la  disquette  puisque  cette  image  est  d‚j… en m‚moire avec le&lt;br /&gt;
   programme, c'est … l'assemblage que ‡a p‚dale!!! Il faut donc pas-&lt;br /&gt;
   ser  par des m‚canismes de travail bien ordonn‚s.  Mettre en place&lt;br /&gt;
   un  disque virtuel (de pr‚f‚rence r‚sistant au Reset) recopier les&lt;br /&gt;
   images dedans et ensuite commencer …  travailler. Vous comprendrez&lt;br /&gt;
   bien  vite pourquoi les possesseurs de  520 ont tout int‚rˆt … les&lt;br /&gt;
   faire gonfler … un m‚ga minimum et pourquoi un lecteur externe ou &lt;br /&gt;
   mieux un disque dur devient vite indispensable!!!&lt;br /&gt;
   &lt;br /&gt;
   AprŠs  avoir vu le m‚canisme d'inclusion de fichiers,  nous allons&lt;br /&gt;
   nous  int‚resser  maintenant aux inclusions de listings. Il est en&lt;br /&gt;
   effet  possible  de  prendre un bout de listing,  de le sauver sur&lt;br /&gt;
   disquette et de demander … l'assembleur de l'inclure lors de l'as-&lt;br /&gt;
   semblage.  L…  aussi,  perte  de temps … l'assemblage mais gain de&lt;br /&gt;
   temps  trŠs  appr‚ciable  lors  de  la  cr‚ation de programme. Par&lt;br /&gt;
   exemple votre routine de sauvegarde de palette:  faites avec soin,&lt;br /&gt;
    elle  marche  bien  et  en fait vous en avez besoin dans tous vos&lt;br /&gt;
   programmes.  Il  faut  donc  …  chaque  fois la retaper et surtout&lt;br /&gt;
   consommer  quelques  dizaines de lignes avec cette routine.  Perte&lt;br /&gt;
   de  temps,  possibilit‚  d'erreur  de  frappe  et allongement bien&lt;br /&gt;
   inutile  du listing.  Lorsque vous commencerez … circuler dans  10&lt;br /&gt;
   ou   20  pages  de sources … la recherche d'une variable vous com-&lt;br /&gt;
   mencerez  … comprendre de quoi je parle, en sachant en plus que 20&lt;br /&gt;
   pages, c'est un tout petit source assembleur...&lt;br /&gt;
   &lt;br /&gt;
   Voyons concrŠtement un exemple, avec la sauvegarde de palette.&lt;br /&gt;
   &lt;br /&gt;
   SAUVE_PALETTE&lt;br /&gt;
            MOVEM.L   D0-D4/A0-A4,-(SP)&lt;br /&gt;
            LEA       ANC_PAL,A4            ptn sur le lieu de &lt;br /&gt;
sauvegarde&lt;br /&gt;
            MOVE.W    #15,D4                16 couleurs&lt;br /&gt;
   &lt;br /&gt;
   .ICI     MOVE.W    #-1,-(SP)             demande de couleurs&lt;br /&gt;
            MOVE.W    D4,-(SP)              num‚ro de la couleur&lt;br /&gt;
            MOVE.W    #7,-(SP)              Setcolor()&lt;br /&gt;
            TRAP      #14                   Xbios&lt;br /&gt;
            ADDQ.L    #6,SP&lt;br /&gt;
            MOVE.W    D0,(A4)+              sauvegarde de la couleur&lt;br /&gt;
            DBF       D4,.ICI               et on passe … la suivante&lt;br /&gt;
            MOVEM.L   (SP)+,D0-D4/A0-A4&lt;br /&gt;
            RTS&lt;br /&gt;
   ANC_PAL  DC.L      0,0,0,0,0,0,0,0&lt;br /&gt;
   REMET_PALETTE&lt;br /&gt;
            MOVEM.L   D0-D4/A0-A4,-(SP)&lt;br /&gt;
            LEA       ANC_PAL,A4            ptn sur le lieu de &lt;br /&gt;
sauvegarde&lt;br /&gt;
            MOVE.W    #15,D4                16 couleurs&lt;br /&gt;
   &lt;br /&gt;
   .ICI     MOVE.W    (A4)+,-(SP)           demande de couleurs&lt;br /&gt;
            MOVE.W    D4,-(SP)              num‚ro de la couleur&lt;br /&gt;
            MOVE.W    #7,-(SP)              Setcolor()&lt;br /&gt;
            TRAP      #14                   Xbios&lt;br /&gt;
            ADDQ.L    #6,SP&lt;br /&gt;
            DBF       D4,.ICI               et on passe … la suivante&lt;br /&gt;
            MOVEM.L   (SP)+,D0-D4/A0-A4&lt;br /&gt;
            RTS&lt;br /&gt;
   &lt;br /&gt;
   Voici  donc  2 routines.  Tout d'abord sachant qu'un appel … Xbios&lt;br /&gt;
   ne  sauve pas les registres D0-D3 et A0-A3 nous utilisons D4 et A4&lt;br /&gt;
   pour  le  compteur  de couleur et l'adresse de sauvegarde,  ce qui&lt;br /&gt;
   explique  aussi  la  sauvegarde  sur  la  pile  au  d‚but des deux&lt;br /&gt;
   routines. La  premiŠre sauvegarde la palette et la met … l'adresse&lt;br /&gt;
   ANC_PAL.  Nous  constatons que cette adresse se trouve entre les 2&lt;br /&gt;
   routines.  En effet plusieurs solutions s'offrent … nous.  D'abord&lt;br /&gt;
   la  plus  ‚conomique  en  taille c'est de mettre cette r‚servation&lt;br /&gt;
   pour  la palette dans la section BSS de notre programme en faisant&lt;br /&gt;
   ANC_PAL  DS.W  16 Nous avons d‚j… vu que la section BSS n'occupait&lt;br /&gt;
   pas  de  place sur la disquette.  Cependant nous avons r‚alis‚ ces&lt;br /&gt;
   routines  avec  en  tˆte l'id‚e de les inclure,  afin de gagner en&lt;br /&gt;
   facilit‚  de programmation. En pla‡ant cette r‚servation entre les&lt;br /&gt;
   routines,  elle  fera  partie  int‚grante  du  fichier.  Il  n'est&lt;br /&gt;
   cependant  pas  possible  de  la  mettre  en  DS  nous  somme donc&lt;br /&gt;
   contraint  de  la  mettre  en  DC.  Le  danger  serait  que  notre&lt;br /&gt;
   programme  essaye  de lire cette partie.  Faire un BSR ANC_PAL par&lt;br /&gt;
   exemple serait fatal mais nous sommes assez s‚rieux pour ne pas le&lt;br /&gt;
   faire, donc pas de problŠme...&lt;br /&gt;
   &lt;br /&gt;
   Une  fois tap‚ ce petit listing, sauvez le par exemple sous le nom&lt;br /&gt;
   SAUV_PAL.S. Ensuite  modifiez le programme du listing 1 (celui que&lt;br /&gt;
   nous  venons de voir avec l'image incluse).  Juste aprŠs la fin du&lt;br /&gt;
   programme  par  MOVE.W   #0,-(SP),   TRAP   #1  (donc  juste avant&lt;br /&gt;
   l'inclusion de l'image), mettez&lt;br /&gt;
   &lt;br /&gt;
            INCLUDE   &amp;quot;A:\SAUV_PAL.S&amp;quot;&lt;br /&gt;
   &lt;br /&gt;
   Ne  mettez  pas d'‚tiquette sur le bord gauche puisque la premiŠre&lt;br /&gt;
   ‚tiquette  c'est  SAUVE_PALETTE et qu'elle est dans notre routine.&lt;br /&gt;
   Ensuite  au tout d‚but du programme, mettez BSR SAUVE_PALETTE et …&lt;br /&gt;
   la fin juste avant de quitter, mettez BSR REMET_PALETTE. Au niveau&lt;br /&gt;
   taille, votre listing est donc simplement augment‚ de 3  lignes:&lt;br /&gt;
   &lt;br /&gt;
    (BSR SAUVE_PALETTE, BSR REMET_PALETTE et INCLUDE &amp;quot;A:\SAUV_PAL.S&amp;quot;)&lt;br /&gt;
   &lt;br /&gt;
   et pourtant ce sont 24 lignes qui sont ajout‚es!!!&lt;br /&gt;
   &lt;br /&gt;
   Nous  sommes  donc en train de nous cr‚er une bibliothŠque.  C'est&lt;br /&gt;
   une trŠs grande partie du travail du programmeur en assembleur car&lt;br /&gt;
   de nombreuses choses reviennent souvent: initialisation par sauve-&lt;br /&gt;
   garde de la palette, passage en basse r‚solution et passage en Su-&lt;br /&gt;
   perviseur,  restitution  en  faisant  l'inverse,  d‚compactage des&lt;br /&gt;
   images etc&lt;br /&gt;
   &lt;br /&gt;
   De  mˆme, si  vous ˆtes en train de r‚aliser un gros programme, en&lt;br /&gt;
   cours de d‚veloppement ce sont des pages entiŠres qui peuvent ˆtre&lt;br /&gt;
   incluses  diminuant  d'autant la taille du listing et y permettant&lt;br /&gt;
   des d‚placements nettement plus ais‚s.&lt;br /&gt;
   &lt;br /&gt;
   Voyons  tout  de  suite  un  autre bloc qui devra maintenant faire&lt;br /&gt;
   partie  de notre bibliothŠque. Jusqu'… pr‚sent nous avons tap‚ pas&lt;br /&gt;
   mal  de petits programmes,  sans nous soucier de la place m‚moire.&lt;br /&gt;
   Il  est temps d'y penser afin de commencer … prendre conscience du&lt;br /&gt;
   fait  qu'il  faut  programmer  proprement.   Imaginons  que  notre&lt;br /&gt;
   programme  soit en m‚moire mais qu'en mˆme temps il y ait d'autres&lt;br /&gt;
   programmes  dans cette m‚moire.  Il est bien ‚vident que chacun ne&lt;br /&gt;
   doit  s'approprier  que  la place m‚moire dont il a  besoin,  afin&lt;br /&gt;
   d'en  laisser le plus possible pour ces voisins. Pour cela il faut&lt;br /&gt;
   savoir  que lors de l'assemblage sous forme de fichier ex‚cutable,&lt;br /&gt;
   il y  a g‚n‚ration d'une en-tˆte.  Grƒce …  cette en-tˆte, au lan-&lt;br /&gt;
   cement  de  notre programme il va y avoir cr‚ation de ce qu'on ap-&lt;br /&gt;
   pelle  la  page  de base.  En voici un descriptif. Si vous d‚sirez&lt;br /&gt;
   obtenir un maximum de renseignements sur les en-tˆtes de programme&lt;br /&gt;
   ou  les pages de base,  reportez vous aux chapitres correspondants&lt;br /&gt;
   dans  la Bible ou le Livre du D‚veloppeur.  Excellent chapitre sur&lt;br /&gt;
   ce  sujet  dans la doc officielle ATARI (document sur la structure&lt;br /&gt;
   des programmes).&lt;br /&gt;
   &lt;br /&gt;
   * Page de base&lt;br /&gt;
   &lt;br /&gt;
   Adresse         Description&lt;br /&gt;
   $00      Adresse de d‚but de cette page de base&lt;br /&gt;
   $04      Adresse de fin de la m‚moire libre&lt;br /&gt;
   $08      Adresse du d‚but de la section TEXTE&lt;br /&gt;
   $0C      Taille de la section TEXTE&lt;br /&gt;
   $10      Adresse de d‚but de la section DATA&lt;br /&gt;
   $14      Taille de la section DATA&lt;br /&gt;
   $18      Adresse de d‚but de la section BSS&lt;br /&gt;
   $1C      Taille de la section BSS&lt;br /&gt;
   &lt;br /&gt;
   Nous allons donc piocher ces informations, et en d‚duire la taille&lt;br /&gt;
   qui    devrait   suffire   pour   notre   programme.   Connaissant&lt;br /&gt;
   l'emplacement  de  la  zone  d'implantation  du  programme,   nous&lt;br /&gt;
   utiliserons  la  fonction 74 du  GEMDOS  (fonction Mshrink)    qui&lt;br /&gt;
   permet,  en  donnant  la  taille  d‚sir‚e et l'adresse de fin,  de&lt;br /&gt;
   r‚tr‚cir  une zone m‚moire. En effet, au lancement notre programme&lt;br /&gt;
   a  pris  toute  la place disponible, nous devons donc la r‚tr‚cir.&lt;br /&gt;
   Notre  programme a ‚galement besoin d'une pile. Au lieu de prendre&lt;br /&gt;
   celle  qui est d‚j… en place, nous allons lui substituer la notre,&lt;br /&gt;
   dont nous pourrons r‚gler la taille … loisir.&lt;br /&gt;
   &lt;br /&gt;
   * ROUTINE DE DEMARRAGE DES PROGRAMMES&lt;br /&gt;
   &lt;br /&gt;
            MOVE.L    A7,A5                 pr‚lŠve ptn de pile pour &lt;br /&gt;
prendre&lt;br /&gt;
                                            * les paramŠtres&lt;br /&gt;
            LEA.L     PILE,A7               impose notre pile&lt;br /&gt;
            MOVE.L    4(A5),A5              adresse de la page de base &lt;br /&gt;
de&lt;br /&gt;
                                            * l'ancienne pile&lt;br /&gt;
            MOVE.L    12(A5),D0             taille de la section texte&lt;br /&gt;
            ADD.L     20(A5),D0             + taille section data&lt;br /&gt;
            ADD.L     28(A5),D0             + taille section bss&lt;br /&gt;
            ADD.L     #$100,D0              + longueur de la page de &lt;br /&gt;
base    &lt;br /&gt;
                                            *(256 bytes)&lt;br /&gt;
   &lt;br /&gt;
   * Appel … la fonction MShrink() du GEMDOS (Memory Shrink)&lt;br /&gt;
   &lt;br /&gt;
            MOVE.L    D0,-(SP)&lt;br /&gt;
            MOVE.L    A5,-(SP)&lt;br /&gt;
            MOVE.W    #0,-(SP)&lt;br /&gt;
            MOVE.W    #74,-(SP)             M_shrink()&lt;br /&gt;
            TRAP      #1&lt;br /&gt;
            LEA       12(A7),A7&lt;br /&gt;
   &lt;br /&gt;
   Voil…,  aprŠs  cette op‚ration, notre programme n'utilise plus que&lt;br /&gt;
   la  place  m‚moire  dont  il  a besoin.  Il ne faut pas oublier de&lt;br /&gt;
   d‚finir la pile dans la section BSS par ceci:&lt;br /&gt;
   &lt;br /&gt;
            DS.L      256&lt;br /&gt;
   PILE     DS.L      1&lt;br /&gt;
   &lt;br /&gt;
   J'en  vois  qui  sont  surpris  par  cette r‚servation!!! Dans les&lt;br /&gt;
   exemples fournis avec DEVPACK il est marqu‚  &amp;quot;stack go backwards&amp;quot;,&lt;br /&gt;
   que je traduis librement par &amp;quot;moi j'avance la pile recule, comment&lt;br /&gt;
   veux tu ...&amp;quot; Un peu de s‚rieux. Nous avons vu que l'utilisation de&lt;br /&gt;
   la pile se faisait en d‚cr‚mentant celle ci:&lt;br /&gt;
   &lt;br /&gt;
   (move.w        #12,-(sp) par exemple).&lt;br /&gt;
   &lt;br /&gt;
   Il  faut  donc r‚server de la place AVANT l'‚tiquette.  Pour cette&lt;br /&gt;
   raison  nous  notons  le label et, au-dessus, la taille r‚ellement&lt;br /&gt;
   r‚serv‚e pour la pile.&lt;br /&gt;
   &lt;br /&gt;
   Quelle  taille  choisir?  Cela d‚pend de vous!  Si votre programme&lt;br /&gt;
   est  plein  de subroutines s'appelant mutuellement et sauvant tous&lt;br /&gt;
   les registres … chaque fois, il faut pr‚voir assez gros.&lt;br /&gt;
   &lt;br /&gt;
   Tapez  le  programme suivant.  Il est ‚vident que vous devez avoir&lt;br /&gt;
   tap‚ au pr‚alable la routine de d‚marrage de programmes qui est un&lt;br /&gt;
   peu plus haut dans ce cours. Elle est ici incluse au d‚but. Pas de&lt;br /&gt;
   branchement  …  y  faire.  Si, une fois assembl‚, vous d‚buggez ce&lt;br /&gt;
   programme, vous  verrez au d‚but la routine de start.  Dor‚navant,&lt;br /&gt;
   cette  routine  sera  toujours pr‚sente au d‚but de nos programmes&lt;br /&gt;
   mais  ne  sera jamais int‚gralement recopi‚e,  un INCLUDE est bien&lt;br /&gt;
   plus  commode! Note:  Il semble que DEVAPCK se m‚lange parfois les&lt;br /&gt;
   pinceaux   lorsque  les inclusions sont nombreuses et font appel …&lt;br /&gt;
   des  fichiers  contenus  dans des dossiers.  De mˆme il existe des&lt;br /&gt;
   problŠmes  avec  les  inclusions sur disque B lorsque celui-ci est&lt;br /&gt;
   pris  comme lecteur A dans lequel on met le disque B. (je n'ai par&lt;br /&gt;
   contre pas rencontr‚ de problŠme avec mon lecteur externe). &lt;br /&gt;
   &lt;br /&gt;
            INCLUDE   &amp;quot;A:\START.S&amp;quot;&lt;br /&gt;
            MOVE.W    #$AAAA,BIDULE&lt;br /&gt;
            BSR       TRUCMUCHE&lt;br /&gt;
            MOVE.W    BIDULE,D6&lt;br /&gt;
            MOVE.W    #0,-(SP)&lt;br /&gt;
            TRAP      #1&lt;br /&gt;
   *-----------------------------------------------*&lt;br /&gt;
   TRUCMUCHE MOVEM.L  D0-D7/A0-A6,-(SP)&lt;br /&gt;
            BSR       MACHIN&lt;br /&gt;
            MOVEM.L   (SP)+,D0-D7/A0-A6&lt;br /&gt;
            RTS&lt;br /&gt;
   &lt;br /&gt;
   MACHIN   MOVEM.L   D0-D7/A0-A6,-(SP)&lt;br /&gt;
            MOVE.L    #$12345678,D0&lt;br /&gt;
            MOVEM.L   (SP)+,D0-D7/A0-A6&lt;br /&gt;
            RTS&lt;br /&gt;
   &lt;br /&gt;
            SECTION BSS&lt;br /&gt;
           &lt;br /&gt;
   BIDULE   DS.W      1&lt;br /&gt;
            DS.B      124&lt;br /&gt;
   PILE     DS.L      1&lt;br /&gt;
            END&lt;br /&gt;
   &lt;br /&gt;
   Ce  programme  est  bien  sur  bidon.  J'espŠre cependant que vous&lt;br /&gt;
   l'avez scrupuleusement tap‚. Lancez le... paf  4 bombes!!!!!&lt;br /&gt;
   &lt;br /&gt;
   Observons  le  … la loupe afin de comprendre pourquoi...  Le start&lt;br /&gt;
   est  bien  mis  en place et lorsque nous d‚buggons il est effectu‚&lt;br /&gt;
   sans  incident.  On  place  ensuite $AAAA dans la variable BIDULE.&lt;br /&gt;
   Activons  la fenˆtre 3 et pointons sur BIDULE (il suffit pour cela&lt;br /&gt;
   de faire Alternate A et de taper le nom du label en majuscule donc&lt;br /&gt;
   ici  BIDULE).  Avan‡ons  pas  …  pas,   nous  voyons  bien  BIDULE&lt;br /&gt;
   recevoir  AAAA.  Continuons … avancer: nous sautons dans TRUCMUCHE&lt;br /&gt;
   avec  au passage sauvegarde dans la pile de l'adresse de retour (…&lt;br /&gt;
   ce  propos  vous  pouvez  faire  pointer la fenˆtre 3  sur PILE et&lt;br /&gt;
   regarder  au  dessus  l'empilage des donn‚es). Ensuite nous allons&lt;br /&gt;
   sauter  dans  MACHIN mais l…, stop!!!!!!! Suivez attentivement les&lt;br /&gt;
   explications. Juste  avant d'ex‚cuter le BSR MACHIN, faites scrol-&lt;br /&gt;
   ler  la  fenˆtre 1 avec  la touche 'flŠche vers le bas'.  En effet&lt;br /&gt;
   d'aprŠs  la taille du listing et celle de la fenˆtre vous ne devez&lt;br /&gt;
   pas  voir  BIDULE.  Descendez donc de  7 lignes.   Normalement, la&lt;br /&gt;
   premiŠre  ligne de la fenˆtre doit maintenant ˆtre BSR MACHIN avec&lt;br /&gt;
   la petite flŠche en face indiquant que c'est cette instruction qui&lt;br /&gt;
   va  ˆtre  ex‚cut‚e.  En  bas  de la fenˆtre vous devez voir BIDULE&lt;br /&gt;
   avec en face DC.W  $AAAA puisque c'est ce que nous y avons d‚pos‚.&lt;br /&gt;
    En  dessous  des  ORI.B#0,D0 .  En  effet  nous  sommes  dans une&lt;br /&gt;
   fenˆtre  qui cherche … nous montrer le d‚sassemblage de ce qu'il y&lt;br /&gt;
   a  dans le tube.  Or … cette endroit il y a 0 dans le tube et cela&lt;br /&gt;
   correspond  … ORI.B #0,d0;  ce qui explique ces instructions. Mais&lt;br /&gt;
   ces  ORI.B correspondent … quoi ?  o— sont-ils situ‚s? eh bien, il&lt;br /&gt;
   sont dans notre pile puisque celle-ci est constitu‚e d'un bloc de &lt;br /&gt;
   124 octets  entre  BIDULE  et PILE.  Alors maintenant scrutez trŠs&lt;br /&gt;
   attentivement  BIDULE et avancez le programme d'un pas. Nous voici&lt;br /&gt;
   maintenant sur la ligne MOVEM.L de la subroutine MACHIN. Ex‚cutons&lt;br /&gt;
   cette ligne...&lt;br /&gt;
   &lt;br /&gt;
   Stupeur,  BIDULE  est  ‚cras‚, de mˆme que le RTS de la subroutine&lt;br /&gt;
   MACHIN  qui  est  juste  au  dessus!!!  Et  maintenant,   si  nous&lt;br /&gt;
   continuons,  aprŠs  le  second MOVEM le 68000 ne va pas tomber sur&lt;br /&gt;
   le RTS puisque celui-ci vient d'ˆtre ‚cras‚, et notre programme va&lt;br /&gt;
   planter! Pourquoi ? eh bien, parce que nous avons essay‚ d'empiler&lt;br /&gt;
   128 octets  (MOVEM de trucmuche=15 registres donc 15*4=60  octets,&lt;br /&gt;
   idem pour le MOVEM de machin,  auquel il faut ajouter l'adresse de&lt;br /&gt;
   retour pour trucmuche et celle de machin, total 128 octets!) alors&lt;br /&gt;
   que nous n'avions pr‚vu qu'une pile de 124 octets.&lt;br /&gt;
   &lt;br /&gt;
   Pour que ce programme marche sans problŠme, il faut donc mettre au&lt;br /&gt;
   minimum une pile de 128 octets. Faites trŠs attention … ‡a, car si&lt;br /&gt;
   nous  avions  mis  une  pile  de  124  octets,  le programme ne se&lt;br /&gt;
   serait  pas plant‚ car il n'y aurait pas eu ‚crasement du RTS mais&lt;br /&gt;
   il  y  aurait  eu ‚crasement de BIDULE et je suis certain que vous&lt;br /&gt;
   auriez  cherch‚ bien longtemps en vous disant &amp;quot; mais qu'est ce qui&lt;br /&gt;
   peut  bien ‚craser BIDULE  &amp;quot; surtout que cet ‚crasement survient …&lt;br /&gt;
   un moment o—, justement, on n'utilise pas BIDULE!!!&lt;br /&gt;
   &lt;br /&gt;
   Gardez  donc  toujours  pr‚sent  …  l'esprit  le  principe du tube&lt;br /&gt;
   m‚moire,  sans oublier qu'il est plein d'instructions, de contenus&lt;br /&gt;
   de variables et que rien n'empˆche de les ‚craser!&lt;br /&gt;
   &lt;br /&gt;
   Encore  une  petite  remarque  sur  le Start.   Il est tout … fait&lt;br /&gt;
   possible  de  tester  D0 en  retour du Mshrink().  Si celui-ci est&lt;br /&gt;
   n‚gatif, c'est  qu'il y  a eu erreur. Si vous savez que syst‚mati-&lt;br /&gt;
   quement vous mettez le label BYE_BYE en face du GEMDOS(0) qui ter-&lt;br /&gt;
   mine votre programme,  vous pouvez rajouter … la fin du start:&lt;br /&gt;
   &lt;br /&gt;
            TST.W     D0&lt;br /&gt;
            BMI       BYE_BYE&lt;br /&gt;
   &lt;br /&gt;
   Une  derniŠre  pr‚cision  sur  les inclusions.  Il existe d'autres&lt;br /&gt;
   moyens  de r‚aliser de telles choses,  par exemple d'assembler les&lt;br /&gt;
   morceaux  puis  de  les  lier  avec un LINKER.  Cette solution est&lt;br /&gt;
   int‚ressante  lorsque les programmes commencent … prendre des pro-&lt;br /&gt;
   portions gigantesques.&lt;br /&gt;
   &lt;br /&gt;
   Sinon, il  s'agit  plus d'embˆtements qu'autre chose!!!!   Mˆme si&lt;br /&gt;
   certains puristes pr‚fŠrent linker:&lt;br /&gt;
   &lt;br /&gt;
   j'‚dite, j'assemble, je  quitte, je linke, je lance, ‡a plante, je&lt;br /&gt;
   d‚bugge, j'‚dite etc...) &lt;br /&gt;
   &lt;br /&gt;
   je  pr‚fŠre, quant  … moi, la m‚thode de l' &amp;quot;include&amp;quot;. Elle permet&lt;br /&gt;
   ‚ventuellement  d'avoir  accŠs directement au source. Par exemple,&lt;br /&gt;
   si  votre routine de sauvegarde palette plante,  placer le curseur&lt;br /&gt;
   de  GENST  sur  la ligne INCLUDE  &amp;quot;A:\SAUV_PAL.S&amp;quot;  puis choisissez&lt;br /&gt;
   l'option  Insert  File  dans  le  menu fichier.  Votre routine est&lt;br /&gt;
   maintenant  sous  vos  yeux. Une  fois  que  ce bloc est au point,&lt;br /&gt;
   d‚limitez le avec F1 et F2 puis sauver le avec F3, hop le tour est&lt;br /&gt;
   jou‚!&lt;br /&gt;
   &lt;br /&gt;
   Fin  du  cours  sur  les  inclusions!  Commencez … fabriquez votre&lt;br /&gt;
   bibliothŠque  et  n'h‚sitez pas … en faire des copies de s‚curit‚,&lt;br /&gt;
   et  m‚fiez  vous  des virus!  Sur cette disquette il y a  IMUN.PRG&lt;br /&gt;
   Vous  le mettez en dossier Auto sur votre disquette de boot, et il&lt;br /&gt;
   v‚rifi‚  toutes  les  disquettes  que  vous  introduisez  dans  le&lt;br /&gt;
   lecteur!&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>