<?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=COURS202.TXT</id>
	<title>COURS202.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=COURS202.TXT"/>
	<link rel="alternate" type="text/html" href="https://www.temlib.org/AtariForumWiki/index.php?title=COURS202.TXT&amp;action=history"/>
	<updated>2026-07-26T21:51:09Z</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=COURS202.TXT&amp;diff=11516&amp;oldid=prev</id>
		<title>&gt;Zorro 2: Created page with &quot;&lt;pre&gt;    ******************************************************************    *                                                                *    *               COURS D'ASSEM...&quot;</title>
		<link rel="alternate" type="text/html" href="https://www.temlib.org/AtariForumWiki/index.php?title=COURS202.TXT&amp;diff=11516&amp;oldid=prev"/>
		<updated>2016-12-22T14:53:46Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;&amp;lt;pre&amp;gt;    ******************************************************************    *                                                                *    *               COURS D&amp;#039;ASSEM...&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 2                         *&lt;br /&gt;
   ******************************************************************&lt;br /&gt;
&lt;br /&gt;
   Nous  voici donc repartis pour de nouvelles aventures!  Ce  second&lt;br /&gt;
   cours   aura pour sujet les TRAP et plus pr‚cis‚ment  comment  les&lt;br /&gt;
   programmer  soit mˆme.Nous  avions vu, dans la premiŠre s‚rie, que&lt;br /&gt;
   les  traps ‚taient un excellent  moyen  d'acc‚der au systŠme d'ex-&lt;br /&gt;
   ploitation,  et plus g‚n‚ralement d'acc‚der … des espaces prot‚g‚s&lt;br /&gt;
   (uniquement  accessible  en mode Superviseur).  Nous avions ‚gale-&lt;br /&gt;
   ment  ‚tudi‚  le  passage des paramŠtres par la pile,  ce qui nous&lt;br /&gt;
   avait servi pour r‚aliser des subroutines avec paramŠtres.&lt;br /&gt;
&lt;br /&gt;
   Le   premier exemple va consister … changer la couleur du fond  de&lt;br /&gt;
   l'‚cran,   avec une routine fabrication maison,  qui sera  appel‚e&lt;br /&gt;
   par un trap.&lt;br /&gt;
&lt;br /&gt;
   D'abord la routine:&lt;br /&gt;
   Etant  donn‚ qu'un trap est toujours ex‚cut‚ en Superviseur,  nous&lt;br /&gt;
   n'h‚sitons  pas … utiliser  les  adresses systŠme.  La palette  de&lt;br /&gt;
   couleurs   du ST est situ‚e … l'adresse  $FF8240.  Chaque  couleur&lt;br /&gt;
   ‚tant  cod‚e sur un mot, la couleur 0 est en $FF8240, la couleur 1&lt;br /&gt;
   en $FF8242 etc...&lt;br /&gt;
&lt;br /&gt;
   Nous  allons faire 2 routines.  Une qui mettra le fond en  rouge, &lt;br /&gt;
   l'autre qui mettra le fond en vert. Les voici:&lt;br /&gt;
&lt;br /&gt;
   ROUGE   MOVE.W  #$700,$FF8240&lt;br /&gt;
           RTE&lt;br /&gt;
&lt;br /&gt;
   VERT    MOVE.W  #$070,$FF8240&lt;br /&gt;
           RTE&lt;br /&gt;
&lt;br /&gt;
   Une  ‚tiquette permet de les rep‚rer (ROUGE et VERT). Les couleurs&lt;br /&gt;
   ‚tant  cod‚es en RVB (rouge/vert/bleu. On trouve aussi RGB qui est&lt;br /&gt;
   la  traduction anglaise: red/green/blue) et les niveaux varient de&lt;br /&gt;
   0 …  7. Nous  remarquons  que les routines ne se terminent pas par&lt;br /&gt;
   RTS  mais  par RTE. Cela signifie Return from exception. Il s'agit&lt;br /&gt;
   bien  en effet d'un retour d'exception et non pas du retour d'une &lt;br /&gt;
   subroutine classique.&lt;br /&gt;
&lt;br /&gt;
   Petit rappel: RTE se lit &amp;quot;return from exception&amp;quot;. Je vous rappelle&lt;br /&gt;
   qu'il faut TOUT lire en Anglais et pas se contenter de lire l'abr‚&lt;br /&gt;
   viation dont la signification est souvent assez ‚vasive.&lt;br /&gt;
&lt;br /&gt;
   Voici le programme 'en entier'.&lt;br /&gt;
&lt;br /&gt;
           MOVE.L  #MESSAGE,-(SP)  toujours sympa de se pr‚senter&lt;br /&gt;
           MOVE.W  #9,-(SP)&lt;br /&gt;
           TRAP    #1              appel GEMDOS&lt;br /&gt;
           ADDQ.L  #6,SP   &lt;br /&gt;
&lt;br /&gt;
   * Fixer les vecteur d'exception&lt;br /&gt;
           MOVE.L  #ROUGE,-(SP)    adresse 'routine'&lt;br /&gt;
           MOVE.W  #35,-(SP)       num‚ro de vecteur du trap #3&lt;br /&gt;
           MOVE.W  #5,-(SP)        fonction Setexec()&lt;br /&gt;
           TRAP    #13             du bios&lt;br /&gt;
           ADDQ.L  #8,SP&lt;br /&gt;
&lt;br /&gt;
           MOVE.L  #VERT,-(SP)     adresse 'routine'&lt;br /&gt;
           MOVE.W  #36,-(SP)       num‚ro de vecteur du trap #4&lt;br /&gt;
           MOVE.W  #5,-(SP)        fonction Setexec()&lt;br /&gt;
           TRAP    #13             du bios&lt;br /&gt;
           ADDQ.L  #8,SP&lt;br /&gt;
&lt;br /&gt;
   * Les  routines sont donc maintenant accessibles par le trap 3  et&lt;br /&gt;
   par le trap 4.&lt;br /&gt;
           BSR     TOUCHE&lt;br /&gt;
           TRAP    #3&lt;br /&gt;
           BSR     TOUCHE&lt;br /&gt;
           TRAP    #4&lt;br /&gt;
           BSR     TOUCHE&lt;br /&gt;
           TRAP    #3&lt;br /&gt;
           BSR     TOUCHE&lt;br /&gt;
           &lt;br /&gt;
           MOVE.W  #0,-(SP)&lt;br /&gt;
           TRAP    #1&lt;br /&gt;
   *-------------------------------------*&lt;br /&gt;
   ROUGE   MOVE.W  #$700,$FF8240&lt;br /&gt;
           RTE&lt;br /&gt;
           &lt;br /&gt;
   VERT    MOVE.W  #$070,$FF8240&lt;br /&gt;
           RTE&lt;br /&gt;
   *-------------------------------------*&lt;br /&gt;
   TOUCHE  MOVE.W  #7,-(SP)&lt;br /&gt;
           TRAP    #1&lt;br /&gt;
           ADDQ.L  #2,SP&lt;br /&gt;
           RTS&lt;br /&gt;
   *-------------------------------------*&lt;br /&gt;
           SECTION DATA&lt;br /&gt;
   MESSAGE DC.B    27,&amp;quot;E&amp;quot;,&amp;quot;LES TRAPS&amp;quot;,0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   Facile   n'est ce pas ?  Et bien maintenant que vous savez  mettre&lt;br /&gt;
   vos   propres routines en TRAP et que vous savez ‚galement  passer&lt;br /&gt;
   des   paramŠtres  … une sub routine,  il ne vous reste  plus  qu'…&lt;br /&gt;
   faire  la  mˆme chose.  J'estime que vous ˆtes assez grand pour le&lt;br /&gt;
   faire  tout seul et c'est pour cette raison que nous n'allons  pas&lt;br /&gt;
   le   faire  ici.  A vous de travailler!  Une  seule  pr‚caution  …&lt;br /&gt;
   prendre:  Une  subroutine n'a besoin que de l'adresse de retour et&lt;br /&gt;
   donc  n'empile que cela.  Un TRAP par contre,  du fait qu'il passe&lt;br /&gt;
   en  Superviseur, sauve  ‚galement  le Status Register.  Il ne faut&lt;br /&gt;
   donc   pas  oublier  de le prendre en compte pour calculer le saut&lt;br /&gt;
   qui   vous   permettra de r‚cup‚rer vos paramŠtres  pass‚s  sur la&lt;br /&gt;
   pile.  L'adresse   de  retour est bien s–r cod‚e sur 4 bytes et le&lt;br /&gt;
   Status  Register  sur  2.  Il  y a donc empilage de 6 bytes par le&lt;br /&gt;
   TRAP   qui les d‚pile automatiquement au retour afin de  retrouver&lt;br /&gt;
   d'o— il vient et afin ‚galement de remettre comme avant le Status-&lt;br /&gt;
   Register.  Il  ne faudra pas non plus oublier de corriger la  pile&lt;br /&gt;
   au retour.&lt;br /&gt;
&lt;br /&gt;
   Comme  d'habitude, prenez votre temps et faites de nombreux petits&lt;br /&gt;
   essais afin de parfaitement comprendre la systŠme.&lt;br /&gt;
   Regardez   ‚galement attentivement la fonction du Bios qui nous  a&lt;br /&gt;
   servi   …  mettre en place nos deux routines.  Si au lieu  de  lui&lt;br /&gt;
   fournir  la nouvelle adresse pour le vecteur, nous lui passons -1,&lt;br /&gt;
   cette   fonction  nous  retourne,  dans D0.L, l'adresse   actuelle&lt;br /&gt;
   correspondant  … ce vecteur. Rien ne nous empˆche donc de demander&lt;br /&gt;
   l'adresse  utilis‚e par le TRAP #1 (Gemdos),  de transf‚rer  cette&lt;br /&gt;
   adresse   dans le trap #0 (par exemple) et de mettre notre  propre&lt;br /&gt;
   routine   dans  le  TRAP #1.  Cela peut  aussi  vous  servir  pour&lt;br /&gt;
   d‚tourner  le TRAP.  Par exemple pour g‚n‚rer automatiquement  des&lt;br /&gt;
   macros. Il  est possible d'imaginer ainsi un programme r‚sident en&lt;br /&gt;
   m‚moire,  qui   est plac‚ … la place du trap 13 (Bios).  A  chaque&lt;br /&gt;
   fois  qu'il y a un appel au Bios, c'est donc notre routine qui est&lt;br /&gt;
   d‚clench‚e.  Etant   donn‚  que  les appels se font avec  empilage&lt;br /&gt;
   des   paramŠtres,   il  est  tout … fait possible de savoir quelle&lt;br /&gt;
   fonction  du Bios on veut appeler. Il est alors possible de r‚agir&lt;br /&gt;
   diff‚remment pour certaines fonctions.  Cela permet par exemple de&lt;br /&gt;
   tester   des  appuis sur Alternate+touches de fonction et dans  ce&lt;br /&gt;
   cas, d'aller  ‚crire des phrases dans le buffer clavier, ceci afin&lt;br /&gt;
   de g‚n‚rer des macros!&lt;br /&gt;
&lt;br /&gt;
   Note:  Un trap ne peut faire appel … des traps plac‚s 'au-dessous'&lt;br /&gt;
   de   lui.  Ainsi,  dans  un trap #1, il est tout …  fait  possible&lt;br /&gt;
   d'appeler un trap #13 mais l'inverse n'est pas possible. &lt;br /&gt;
&lt;br /&gt;
   Exemple curieux et int‚ressant:&lt;br /&gt;
           MOVE.W  #&amp;quot;A&amp;quot;,-(SP)&lt;br /&gt;
           MOVE.W  #2,-(SP)&lt;br /&gt;
           TRAP    #1&lt;br /&gt;
           ADDQ.L  #4,SP&lt;br /&gt;
&lt;br /&gt;
           MOVE.W  #0,-(SP)&lt;br /&gt;
           TRAP    #1&lt;br /&gt;
&lt;br /&gt;
   Ce court programme ne doit pas poser de problŠme. Nous affichons A&lt;br /&gt;
    puis   nous   quittons.  Assemblez-le, puis  passez  sous  MONST.&lt;br /&gt;
   Appuyez  sur [Control] + P.  Vous choisissez alors les pr‚f‚rences&lt;br /&gt;
   de MONST.   Parmi celles-ci, il y a &amp;quot;follow traps&amp;quot;,   c'est-…-dire&lt;br /&gt;
   suivre  les TRAPs qui, par d‚faut, est sur &amp;quot;NO&amp;quot;. Tapez Y pour YES.&lt;br /&gt;
   Une  fois les pr‚f‚rences d‚finies, faites avancer votre programme&lt;br /&gt;
   pas   …  pas  avec control+Z.  A la diff‚rence  des  autres  fois,&lt;br /&gt;
   lorsque  vous arrivez sur le TRAP vous voyez ce qui se  passe.  Ne&lt;br /&gt;
   vous   ‚tonnez  pas,  cela  va ˆtre assez long  car  il  se  passe&lt;br /&gt;
   beaucoup  de chose pour afficher un caractŠre … l'‚cran.  Le  plus&lt;br /&gt;
   ‚tonnant   va ˆtre l'appel au trap #13.  Eh oui, pour afficher  un&lt;br /&gt;
   caractŠre le GEMDOS fait appel au Bios!!!!!&lt;br /&gt;
&lt;br /&gt;
   Une autre exp‚rience tout aussi int‚ressante:&lt;br /&gt;
&lt;br /&gt;
           MOVE.W  #&amp;quot;A&amp;quot;,-(SP)&lt;br /&gt;
           MOVE.W  #2,-(SP)&lt;br /&gt;
           MOVE.W  #3,-(SP)&lt;br /&gt;
           TRAP    #13&lt;br /&gt;
           ADDQ.L  #6,SP   &lt;br /&gt;
&lt;br /&gt;
           MOVE.W  #0,-(SP)&lt;br /&gt;
           TRAP    #1&lt;br /&gt;
&lt;br /&gt;
   Affichage   de  A mais cette fois avec la  fonction  Bconout()  du&lt;br /&gt;
   Bios.  Assemblez  puis passez sous MONST avec un suivi des  traps.&lt;br /&gt;
   Lorsque   vous  arrivez dans le Bios (donc aprŠs  le  passage  sur&lt;br /&gt;
   l'instruction  TRAP  #13),  faites  avancer pas … pas le programme&lt;br /&gt;
   mais  de temps en temps taper sur la lettre V. Cela vous permet de&lt;br /&gt;
   voir   l'‚cran.  Pour  revenir sous MONST tapez  n'importe  quelle&lt;br /&gt;
   touche.  Avancer   encore de quelques instructions puis retaper  V&lt;br /&gt;
   etc...  Au   bout d'un moment vous verrez apparaŒtre la lettre  A.&lt;br /&gt;
   R‚fl‚chissez  … la notion d'‚cran graphique et … la notion de fon-&lt;br /&gt;
   tes et vous comprendrez sans mal ce qui se passe. Surprenant non ?&lt;br /&gt;
&lt;br /&gt;
   Quelques  petites choses encore:  suivez les traps du Bios,  Xbios&lt;br /&gt;
   GemDos   et regardez ce qui se passe au d‚but.  Vous vous  rendrez&lt;br /&gt;
   compte  qu'il y a sauvegarde des registres sur la pile.  Seulement&lt;br /&gt;
   il n'y a pas sauvegarde de TOUS les registres! Seuls  D3-D7/A3-A6 &lt;br /&gt;
   sont  sauv‚s et donc le contenu  de D2 est potentiellement ‚crasa-&lt;br /&gt;
   ble  par  un appel au systŠme d'exploitation. La prudence est donc&lt;br /&gt;
   conseill‚e.  En  suivant ‚galement les  TRAPs vous apercevrez USP.&lt;br /&gt;
   Cela  signifie  User Stack Pointer c'est ainsi que l'on d‚signe la&lt;br /&gt;
   pile utilisateur.&lt;br /&gt;
&lt;br /&gt;
   Voil…, normalement  les traps n'ont plus de secret pour vous. Vous&lt;br /&gt;
   devez  savoir leur passer des paramŠtres, les reprogrammer etc ...&lt;br /&gt;
   Vous  devez mˆme vous rendre compte qu'en suivant les fonctions du&lt;br /&gt;
   systŠme  d'exploitation, on doit pouvoir d‚couvrir comment se font&lt;br /&gt;
   telle  et telle choses,  et ainsi pouvoir r‚‚crire des morceaux de&lt;br /&gt;
   routines. &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>