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