COURS208.TXT/fr: Difference between revisions
Jump to navigation
Jump to search
No edit summary |
No edit summary |
||
Line 4: | Line 4: | ||
* COURS D'ASSEMBLEUR 68000 SUR ATARI ST * |
* COURS D'ASSEMBLEUR 68000 SUR ATARI ST * |
||
* * |
* * |
||
− | * par Le |
+ | * par Le Féroce Lapin (from 44E) * |
* * |
* * |
||
− | * Seconde |
+ | * Seconde série * |
* * |
* * |
||
− | * Cours |
+ | * Cours numéro 8 * |
****************************************************************** |
****************************************************************** |
||
− | J' |
+ | J'espère que vous n'abordez pas ce cours immédiatement après avoir |
− | fini de lire le |
+ | fini de lire le précédent, mais, qu'au contraire, vous vous êtes |
− | + | plongé dans la ligne A avec bonheur! |
|
Nous allons maintenant aborder un sujet qui, je dois l'avouer, |
Nous allons maintenant aborder un sujet qui, je dois l'avouer, |
||
− | m'effrayait un peu au |
+ | m'effrayait un peu au début: le GEM. |
En fait, en programmation comme dans beaucoup d'autres sujets, on |
En fait, en programmation comme dans beaucoup d'autres sujets, on |
||
− | se met |
+ | se met à bosser simplement lorsqu'on y est obligé. Ainsi je |
− | n'avais |
+ | n'avais réalisé que de tout petits trucs avec le GEM en |
assembleur, des trucs du genre ACCessoire de bureau qui permet de |
assembleur, des trucs du genre ACCessoire de bureau qui permet de |
||
− | mettre l' |
+ | mettre l'écran en inverse vidéo, avec un choix dans une boîte |
d'alerte, avant de me trouver face au descriptif du soft que me |
d'alerte, avant de me trouver face au descriptif du soft que me |
||
− | proposait une |
+ | proposait une boîte Parisienne. Je dois avouer que les premiers |
− | jours ont |
+ | jours ont été un peu durs, mais qu'à la longue j'ai découvert que |
− | le GEM est vraiment une chose fabuleuse, pas |
+ | le GEM est vraiment une chose fabuleuse, pas très dur à maîtriser |
− | et que les |
+ | et que les possibilités sont largement suffisantes pour combler de |
− | bonheur tout programmeur digne de ce nom!!! J' |
+ | bonheur tout programmeur digne de ce nom!!! J'espère donc que vous |
− | prendrez autant de plaisir que moi |
+ | prendrez autant de plaisir que moi à programmer sous GEM une fois |
que vous aurez lu ce chapitre. |
que vous aurez lu ce chapitre. |
||
− | Tout d'abord les remarques qui se trouvent au |
+ | Tout d'abord les remarques qui se trouvent au début du chapitre |
− | sur la ligne A, |
+ | sur la ligne A, méritent d'être relus. Chercher donc de la docu- |
mentation sans vous soucier du langage. Vous trouverez dans le |
mentation sans vous soucier du langage. Vous trouverez dans le |
||
− | dernier cours de cette |
+ | dernier cours de cette série une bibliographie dans laquelle j'ai |
− | + | essayé de recenser divers articles bien sympas. |
|
− | Le GEM est accessible par le TRAP #2, mais en fait |
+ | Le GEM est accessible par le TRAP #2, mais en fait grâce à ce trap |
− | nous avons |
+ | nous avons accès à plusieurs parties du GEM, un peu comme si le |
− | trap #1 |
+ | trap #1 débouchait en même temps sur GEMDOS et BIOS. Le GEM est, |
− | en effet, |
+ | en effet, composé principalement de 2 parties: |
l'AES et le VDI. |
l'AES et le VDI. |
||
Line 48: | Line 48: | ||
s'occupent des graphismes; |
s'occupent des graphismes; |
||
− | + | traçage de cercles, |
|
ellipse, |
ellipse, |
||
traits, |
traits, |
||
Line 56: | Line 56: | ||
Par contre, l'affichage des objets typiques du GEM : |
Par contre, l'affichage des objets typiques du GEM : |
||
− | + | fenêtres, |
|
− | + | boîtes d'alertes |
|
− | est |
+ | est réalisé par l'AES - APPLICATION ENVIRONMENT SYSTEM - . |
− | Au fur et |
+ | Au fur et à mesure que vous découvrirez les fonctions VDI et AES |
vous vous rendrez compte de l'interaction des 2. |
vous vous rendrez compte de l'interaction des 2. |
||
− | Le gros avantage de ce |
+ | Le gros avantage de ce système peut s'expliquer simplement: il |
− | semble |
+ | semble évident à tout le monde que sortir un dessin sur un écran, |
− | une disquette ou une imprimante, ce n'est pas la |
+ | une disquette ou une imprimante, ce n'est pas la même chose. |
ERREUR! Pour le GEM c'est pareil! |
ERREUR! Pour le GEM c'est pareil! |
||
− | En fait, on peut dire que vous avez |
+ | En fait, on peut dire que vous avez à préparer votre dessin et à |
− | dire "je l'envoie". |
+ | dire "je l'envoie". Où? Ah là, c'est comme vous voulez parce que |
pour le VDI |
pour le VDI |
||
− | l' |
+ | l'écran, |
− | la table |
+ | la table traçante, |
le disque, |
le disque, |
||
l'imprimante |
l'imprimante |
||
etc.. |
etc.. |
||
− | ne sont que des |
+ | ne sont que des périphériques. Il suffit de lui désigner le péri- |
− | + | phérique de notre choix et il fait le boulot tout seul!!!! |
|
− | Le seul |
+ | Le seul problème: |
− | les routines |
+ | les routines véritablement indépendantes des périphériques se |
− | trouvent dans GDOS - ce nom vous fait |
+ | trouvent dans GDOS - ce nom vous fait sûrement frémir d'effroi...- |
− | -- Plusieurs programmes en |
+ | -- Plusieurs programmes en même temps ? |
− | Le principe du GEM est |
+ | Le principe du GEM est très attirant mais doit nous amener à ré- |
− | + | fléchir un petit peu sur le mélange potentiel des données. En ef- |
|
− | fet le GEM, |
+ | fet le GEM, même s'il n'est pas réellement multitâche (être multi- |
− | + | tâche consiste à pouvoir faire tourner des applications exactement |
|
− | en |
+ | en même temps, ce qui est de toute façon impossible avec un 68000) |
− | le GEM donc, permet d'avoir plusieurs programmes actifs en |
+ | le GEM donc, permet d'avoir plusieurs programmes actifs en même |
temps, en l'occurrence un programme principal et 6 accessoires. |
temps, en l'occurrence un programme principal et 6 accessoires. |
||
− | Pour le GEM il n'y a fondamentalement pas de |
+ | Pour le GEM il n'y a fondamentalement pas de différence entre un |
PRG et un ACC et, pour cette raison, dans le vocabulaire GEM on |
PRG et un ACC et, pour cette raison, dans le vocabulaire GEM on |
||
les nomme "applications". Le GEM peut donc se retrouver avec 7 ap- |
les nomme "applications". Le GEM peut donc se retrouver avec 7 ap- |
||
− | plications |
+ | plications à gérer, chacune ayant potentiellement plusieurs fenê- |
− | tres. On imagine facilement le bazar dans la |
+ | tres. On imagine facilement le bazar dans la mémoire!!! |
-- Comment le GEM s'y retrouve t-il? |
-- Comment le GEM s'y retrouve t-il? |
||
− | Au |
+ | Au démarrage d'une application, celle-ci appelle la fonction AP- |
− | PL_INIT (Application_Init). Cette fonction |
+ | PL_INIT (Application_Init). Cette fonction prévient le GEM que no- |
− | tre application |
+ | tre application désire devenir active, et le GEM répond en nous |
− | fournissant un |
+ | fournissant un numéro, l'APP_ID (Application_Identificator) qui |
− | nous servira maintenant de |
+ | nous servira maintenant de référence. Notre application sera donc |
par exemple la 3, et sera reconnue comme telle par le GEM. Atten- |
par exemple la 3, et sera reconnue comme telle par le GEM. Atten- |
||
− | tion, l'APP_ID n'est |
+ | tion, l'APP_ID n'est donné à l'application que pour la durée de |
− | + | présence en mémoire de celle-ci. Si je lance un ACC le lundi, il |
|
− | peut |
+ | peut hériter de l'APP_ID 4 mais si je le relance le mardi dans des |
− | conditions |
+ | conditions différentes, il peut obtenir l'APP_ID 5. Seulement il |
− | gardera cet APP_ID pendant toute son |
+ | gardera cet APP_ID pendant toute son activité. |
− | Lorsque l'on ouvre une |
+ | Lorsque l'on ouvre une fenêtre, c'est le même principe. Le GEM |
− | fournit ce que l'on nomme un HANDLE, c'est |
+ | fournit ce que l'on nomme un HANDLE, c'est à dire un numéro cor- |
− | respondant |
+ | respondant à la fenêtre. En fait le HANDLE c'est le numéro d'iden- |
− | tification d'une |
+ | tification d'une fenêtre mais potentiellement aussi d'un périphé- |
rique. |
rique. |
||
Line 125: | Line 125: | ||
Une des parties les plus importantes du GEM concerne la gestion |
Une des parties les plus importantes du GEM concerne la gestion |
||
− | des |
+ | des événements. Un événements c'est une action de l'utilisateur de |
la machine: clic souris, appui sur une touche etc... En fait, sous |
la machine: clic souris, appui sur une touche etc... En fait, sous |
||
− | GEM les applications passent la plus grande partie de leur temps |
+ | GEM les applications passent la plus grande partie de leur temps à |
− | attendre. Imaginons un PRG avec une |
+ | attendre. Imaginons un PRG avec une fenêtre ouverte et un menu |
− | + | déroulant, et en même temps en mémoire 3 accessoires. Je vais dans |
|
− | le menu des accessoires. Le menu se |
+ | le menu des accessoires. Le menu se déroule et les titres passent |
− | en inverse |
+ | en inverse vidéo lorsque la souris passe dessus. Tout ceci est |
fait par le GEM, tout seul comme un grand. Je clique sur le titre |
fait par le GEM, tout seul comme un grand. Je clique sur le titre |
||
de l'accessoire 2. |
de l'accessoire 2. |
||
− | Le GEM |
+ | Le GEM détecte le clic, sait que je suis dans les accessoires, re- |
− | garde sur quelle |
+ | garde sur quelle entrée j'ai cliqué. Comme c'est le GEM qui a at- |
− | + | tribué les entrées aux ACC, il envoie un message à l'accessoire 2 |
|
pour lui dire "il faut que tu t'ouvres". Celui-ci s'ouvre donc, et |
pour lui dire "il faut que tu t'ouvres". Celui-ci s'ouvre donc, et |
||
− | affiche une |
+ | affiche une fenêtre à l'écran. Nous avons donc 2 fenêtres en même |
− | temps. Je clique sur celle du PRG, le GEM regarde |
+ | temps. Je clique sur celle du PRG, le GEM regarde à qui appartient |
− | cette |
+ | cette fenêtre et envoi au PRG un message pour lui dire "on a acti- |
− | + | vé ta fenêtre numéro XX" etc... Nous allons donc construire dans |
|
nos programmes sous GEM, un noyau de surveillance des actions, et |
nos programmes sous GEM, un noyau de surveillance des actions, et |
||
− | nous |
+ | nous réagirons en fonction de celles-ci. |
-- Pour appeler les fonctions du GEM. |
-- Pour appeler les fonctions du GEM. |
||
− | Les appels se font avec des |
+ | Les appels se font avec des paramètres que nous passons dans des |
tableaux. Comme nous utilisons DEVPACK, nous utiliserons sa bi- |
tableaux. Comme nous utilisons DEVPACK, nous utiliserons sa bi- |
||
− | + | bliothèque. En effet, pour les appels au GEM, les paramètres sont |
|
− | nombreux et |
+ | nombreux et à placer à des endroits bien précis dans les tableaux. |
− | Pour ces raisons, les macros trouvent ici tout leur |
+ | Pour ces raisons, les macros trouvent ici tout leur intérêt. Nous |
appellerons donc les fonctions du GEM avec les macros contenues |
appellerons donc les fonctions du GEM avec les macros contenues |
||
− | dans la |
+ | dans la bibliothèque de DEVPACK. Cependant il convient de connaî- |
− | tre |
+ | tre également les tableaux, afin de pouvoir parfaitement compren- |
dre le principe de fonctionnement. |
dre le principe de fonctionnement. |
||
Line 176: | Line 176: | ||
PTSOUT. |
PTSOUT. |
||
− | Attention |
+ | Attention à la légère différence d'orthographe entre INT_IN et |
− | INTIN ! Pour indiquer, lors de l'appel au GEM, l'emplacement |
+ | INTIN ! Pour indiquer, lors de l'appel au GEM, l'emplacement où il |
− | trouvera ces tableaux, leurs adresses sont |
+ | trouvera ces tableaux, leurs adresses sont placées dans 2 listes: |
Une pour l'AES: |
Une pour l'AES: |
||
Line 185: | Line 185: | ||
vdi_params dc.l contrl, intin, ptsin, intout, ptsout |
vdi_params dc.l contrl, intin, ptsin, intout, ptsout |
||
− | Voici les tableaux tels qu'ils sont |
+ | Voici les tableaux tels qu'ils sont définis dans la bibliothèque |
GEM de DEVPACK: |
GEM de DEVPACK: |
||
Line 213: | Line 213: | ||
ptsout ds.w 128 min 12 |
ptsout ds.w 128 min 12 |
||
− | Vous remarquez l' |
+ | Vous remarquez l'étrange mise en place du tableau CONTRL (tableau |
− | pour le VDI). En effet il faut assez souvent passer des |
+ | pour le VDI). En effet il faut assez souvent passer des paramètres |
− | ' |
+ | 'à la main' dans ce tableau. Avec ce système, il sera possible de |
− | + | réaliser une opération du genre MOVE.W #10,CONTRL2 |
|
− | Attention cette |
+ | Attention cette numérotation des CONTRL correspond au nombre de |
− | words car chacune des |
+ | words car chacune des entrées est définie par DS.W et non pas par |
DS.B!!! Ceci s'explique par le fait que 99% des documents relatifs |
DS.B!!! Ceci s'explique par le fait que 99% des documents relatifs |
||
au GEM sont pour le 'C' et que c'est ce type de commande qui est |
au GEM sont pour le 'C' et que c'est ce type de commande qui est |
||
faite en 'C'. Ainsi vous trouverez souvent; "mettre 10 en |
faite en 'C'. Ainsi vous trouverez souvent; "mettre 10 en |
||
contrl(2)"; il vous suffira de faire MOVE.W #10,CONTRL2 et le tour |
contrl(2)"; il vous suffira de faire MOVE.W #10,CONTRL2 et le tour |
||
− | est |
+ | est joué. |
-- Pourquoi tant de tableaux? Parce que chacun de ces tableaux est |
-- Pourquoi tant de tableaux? Parce que chacun de ces tableaux est |
||
− | + | destiné à recevoir ou à renvoyer un certain type de données. |
|
Voyons un descriptif rapide de ces tableaux. |
Voyons un descriptif rapide de ces tableaux. |
||
Line 234: | Line 234: | ||
** control |
** control |
||
− | + | Destiné à contenir, dans l'ordre: |
|
− | + | numéro de la fonction (.W), |
|
nombre d'octets de INT_IN (.W), |
nombre d'octets de INT_IN (.W), |
||
nombre d'octets de INT_OUT (.W), |
nombre d'octets de INT_OUT (.W), |
||
Line 244: | Line 244: | ||
** global |
** global |
||
− | Ce tableau est un peu |
+ | Ce tableau est un peu spécial, et les explications le concernant |
− | ne sont d'aucune |
+ | ne sont d'aucune utilité dans le cadre de ces cours. Une fois bien |
− | + | ingurgité le reste, vous pourrez toujours vous pencher dessus mais |
|
actuellement cela ne ferait que vous embrouiller! (Voir la biblio- |
actuellement cela ne ferait que vous embrouiller! (Voir la biblio- |
||
graphie pour en savoir plus) |
graphie pour en savoir plus) |
||
Line 252: | Line 252: | ||
** int_in |
** int_in |
||
− | Ce tableau est |
+ | Ce tableau est destiné à recevoir des valeurs entières (Integer |
In) dont l'AES aura besoin. |
In) dont l'AES aura besoin. |
||
− | Par exemple un |
+ | Par exemple un numéro de fenêtre. |
** int_out |
** int_out |
||
− | A l'inverse du |
+ | A l'inverse du précédent ce tableau renvoi des résultats par exem- |
− | ple si vous demander la surface disponible pour une |
+ | ple si vous demander la surface disponible pour une fenêtre, vous |
aurez ici les dimensions. |
aurez ici les dimensions. |
||
Line 268: | Line 268: | ||
− | ** addr_out et |
+ | ** addr_out et là, vous pourrez en lire! En fait il suffit, comme |
− | toujours, de lire le nom du tableau pour en |
+ | toujours, de lire le nom du tableau pour en déduire ce qu'il |
contient! |
contient! |
||
Line 276: | Line 276: | ||
** contrl |
** contrl |
||
− | Dans contrl0 nous |
+ | Dans contrl0 nous plaçons l'opcode de la fonction, c'est ainsi que |
− | l'on appelle son |
+ | l'on appelle son numéro. |
− | Dans contrl1 nous |
+ | Dans contrl1 nous plaçons le nombre de données qui seront mise |
dans le tableau intin |
dans le tableau intin |
||
− | Dans contrl2 nous |
+ | Dans contrl2 nous plaçons le nombre de points (donc de couples de |
− | + | données) qui seront placés dans le tableau ptsin |
|
Dans contrl3 nous placerons l'identificateur de la sous-fonction. |
Dans contrl3 nous placerons l'identificateur de la sous-fonction. |
||
− | Par exemple le |
+ | Par exemple le traçage des cercles, ellipse, rectangle etc... ce |
fait avec la fonction 11. Il faut donc un sous-code permettant de |
fait avec la fonction 11. Il faut donc un sous-code permettant de |
||
− | + | définir quel module dans la fonction 11 on désire utiliser. |
|
− | Dans contrl6 nous |
+ | Dans contrl6 nous plaçons le handle du périphérique. (voir plus |
haut) |
haut) |
||
− | A partir de contrl7 il y a parfois des informations |
+ | A partir de contrl7 il y a parfois des informations à passer, |
suivant la fonction. |
suivant la fonction. |
||
** intin et ptsin |
** intin et ptsin |
||
− | Nous remplirons ensuite le tableau INTIN avec les |
+ | Nous remplirons ensuite le tableau INTIN avec les paramètres en- |
− | tiers |
+ | tiers demandés par la fonction et le tableau PTSIN avec les coor- |
− | + | données demandées par la fonction. Une fois la fonction appelée, |
|
− | nous |
+ | nous récupèrerons: |
− | en contrl2 le nombre de couples de |
+ | en contrl2 le nombre de couples de coordonnées de ptsout et |
en contrl4 le nombre de mots de intout. |
en contrl4 le nombre de mots de intout. |
||
− | Voici un appel au GEM. Cette fonction affiche une phrase |
+ | Voici un appel au GEM. Cette fonction affiche une phrase où l'on |
− | veut sur l' |
+ | veut sur l'écran, contrairement à Gemdos (9) qui est limité sur |
les lignes et les colonnes de texte. De plus cette fonction permet |
les lignes et les colonnes de texte. De plus cette fonction permet |
||
− | d'afficher du texte avec des effets (gras, |
+ | d'afficher du texte avec des effets (gras, souligné etc...) avec |
la fonte de notre choix: |
la fonte de notre choix: |
||
LEA MESSAGE,A1 adresse de la phrase |
LEA MESSAGE,A1 adresse de la phrase |
||
− | LEA INTIN,A0 tableau de |
+ | LEA INTIN,A0 tableau de réception |
MOVEQ.L #0,D2 init le compteur de lettres |
MOVEQ.L #0,D2 init le compteur de lettres |
||
ICI3 CLR.W D0 |
ICI3 CLR.W D0 |
||
− | MOVE.B (A1)+,D0 |
+ | MOVE.B (A1)+,D0 prélève en bytes |
BEQ GO_ON fin du texte |
BEQ GO_ON fin du texte |
||
ADDQ.B #1,D2 on compte les lettres |
ADDQ.B #1,D2 on compte les lettres |
||
− | MOVE.W D0,(A0)+ |
+ | MOVE.W D0,(A0)+ transfère dans INTIN (en words) |
BRA ICI |
BRA ICI |
||
GO_ON MOVE.W #100,PTSIN position X |
GO_ON MOVE.W #100,PTSIN position X |
||
Line 332: | Line 332: | ||
AAAAAAAAAARRRRRRGGGLLL!!!!!! C'est l'horreur n'est ce pas! |
AAAAAAAAAARRRRRRGGGLLL!!!!!! C'est l'horreur n'est ce pas! |
||
− | Il faut vous munir de patience et |
+ | Il faut vous munir de patience et décortiquer les multiples appels |
au GEM. |
au GEM. |
||
Pour vous aider dans vos essais, vous trouverez ci-joint un dos- |
Pour vous aider dans vos essais, vous trouverez ci-joint un dos- |
||
− | sier |
+ | sier intitulé GEM. Il contient le source d'un ACC qui affiche une |
− | + | boîte d'alerte, d'un PRG qui gère une ressource (listing issu de |
|
− | WERCS) et d'un accessoire |
+ | WERCS) et d'un accessoire gérant une fenêtre. Pour ce qui est des |
− | + | éditeurs de ressources, je travaille avec K Ressource qui est bien |
|
− | sympa et qui ne plante pas, contrairement |
+ | sympa et qui ne plante pas, contrairement à Wercs! |
− | Essayez de bien comprendre le principe: affichez une |
+ | Essayez de bien comprendre le principe: affichez une boîte |
d'alerte avec un seul bouton, puis avec plusieurs, faites des |
d'alerte avec un seul bouton, puis avec plusieurs, faites des |
||
petites ressources toutes simples, puis de plus en plus compli- |
petites ressources toutes simples, puis de plus en plus compli- |
||
− | + | quées etc... Le principe restera toujours le même quelle que soit |
|
la taille de votre application. Essayez de faire de petits acces- |
la taille de votre application. Essayez de faire de petits acces- |
||
soires du genre formateur de disquettes, avec un petit formulaire |
soires du genre formateur de disquettes, avec un petit formulaire |
||
Line 351: | Line 351: | ||
ou en double face etc... |
ou en double face etc... |
||
− | A l'aide de ces exemples, vous devriez |
+ | A l'aide de ces exemples, vous devriez réussir à vous débrouiller. |
− | C'est avec |
+ | C'est avec ça que j'ai commencé! Jetez également un coup d'oeil |
− | sur la bibliographie, il y a quelques trucs |
+ | sur la bibliographie, il y a quelques trucs intéressants! |
+ | |||
</pre> |
</pre> |
||
Back to [[ASM_Tutorial]] |
Back to [[ASM_Tutorial]] |
Revision as of 12:43, 24 November 2023
****************************************************************** * * * COURS D'ASSEMBLEUR 68000 SUR ATARI ST * * * * par Le Féroce Lapin (from 44E) * * * * Seconde série * * * * Cours numéro 8 * ****************************************************************** J'espère que vous n'abordez pas ce cours immédiatement après avoir fini de lire le précédent, mais, qu'au contraire, vous vous êtes plongé dans la ligne A avec bonheur! Nous allons maintenant aborder un sujet qui, je dois l'avouer, m'effrayait un peu au début: le GEM. En fait, en programmation comme dans beaucoup d'autres sujets, on se met à bosser simplement lorsqu'on y est obligé. Ainsi je n'avais réalisé que de tout petits trucs avec le GEM en assembleur, des trucs du genre ACCessoire de bureau qui permet de mettre l'écran en inverse vidéo, avec un choix dans une boîte d'alerte, avant de me trouver face au descriptif du soft que me proposait une boîte Parisienne. Je dois avouer que les premiers jours ont été un peu durs, mais qu'à la longue j'ai découvert que le GEM est vraiment une chose fabuleuse, pas très dur à maîtriser et que les possibilités sont largement suffisantes pour combler de bonheur tout programmeur digne de ce nom!!! J'espère donc que vous prendrez autant de plaisir que moi à programmer sous GEM une fois que vous aurez lu ce chapitre. Tout d'abord les remarques qui se trouvent au début du chapitre sur la ligne A, méritent d'être relus. Chercher donc de la docu- mentation sans vous soucier du langage. Vous trouverez dans le dernier cours de cette série une bibliographie dans laquelle j'ai essayé de recenser divers articles bien sympas. Le GEM est accessible par le TRAP #2, mais en fait grâce à ce trap nous avons accès à plusieurs parties du GEM, un peu comme si le trap #1 débouchait en même temps sur GEMDOS et BIOS. Le GEM est, en effet, composé principalement de 2 parties: l'AES et le VDI. Les routines du VDI - VIRTUAL DEVICE INTERFACE - s'occupent des graphismes; traçage de cercles, ellipse, traits, rectangles etc ... Par contre, l'affichage des objets typiques du GEM : fenêtres, boîtes d'alertes est réalisé par l'AES - APPLICATION ENVIRONMENT SYSTEM - . Au fur et à mesure que vous découvrirez les fonctions VDI et AES vous vous rendrez compte de l'interaction des 2. Le gros avantage de ce système peut s'expliquer simplement: il semble évident à tout le monde que sortir un dessin sur un écran, une disquette ou une imprimante, ce n'est pas la même chose. ERREUR! Pour le GEM c'est pareil! En fait, on peut dire que vous avez à préparer votre dessin et à dire "je l'envoie". Où? Ah là, c'est comme vous voulez parce que pour le VDI l'écran, la table traçante, le disque, l'imprimante etc.. ne sont que des périphériques. Il suffit de lui désigner le péri- phérique de notre choix et il fait le boulot tout seul!!!! Le seul problème: les routines véritablement indépendantes des périphériques se trouvent dans GDOS - ce nom vous fait sûrement frémir d'effroi...- -- Plusieurs programmes en même temps ? Le principe du GEM est très attirant mais doit nous amener à ré- fléchir un petit peu sur le mélange potentiel des données. En ef- fet le GEM, même s'il n'est pas réellement multitâche (être multi- tâche consiste à pouvoir faire tourner des applications exactement en même temps, ce qui est de toute façon impossible avec un 68000) le GEM donc, permet d'avoir plusieurs programmes actifs en même temps, en l'occurrence un programme principal et 6 accessoires. Pour le GEM il n'y a fondamentalement pas de différence entre un PRG et un ACC et, pour cette raison, dans le vocabulaire GEM on les nomme "applications". Le GEM peut donc se retrouver avec 7 ap- plications à gérer, chacune ayant potentiellement plusieurs fenê- tres. On imagine facilement le bazar dans la mémoire!!! -- Comment le GEM s'y retrouve t-il? Au démarrage d'une application, celle-ci appelle la fonction AP- PL_INIT (Application_Init). Cette fonction prévient le GEM que no- tre application désire devenir active, et le GEM répond en nous fournissant un numéro, l'APP_ID (Application_Identificator) qui nous servira maintenant de référence. Notre application sera donc par exemple la 3, et sera reconnue comme telle par le GEM. Atten- tion, l'APP_ID n'est donné à l'application que pour la durée de présence en mémoire de celle-ci. Si je lance un ACC le lundi, il peut hériter de l'APP_ID 4 mais si je le relance le mardi dans des conditions différentes, il peut obtenir l'APP_ID 5. Seulement il gardera cet APP_ID pendant toute son activité. Lorsque l'on ouvre une fenêtre, c'est le même principe. Le GEM fournit ce que l'on nomme un HANDLE, c'est à dire un numéro cor- respondant à la fenêtre. En fait le HANDLE c'est le numéro d'iden- tification d'une fenêtre mais potentiellement aussi d'un périphé- rique. -- Multitraitement ? Une des parties les plus importantes du GEM concerne la gestion des événements. Un événements c'est une action de l'utilisateur de la machine: clic souris, appui sur une touche etc... En fait, sous GEM les applications passent la plus grande partie de leur temps à attendre. Imaginons un PRG avec une fenêtre ouverte et un menu déroulant, et en même temps en mémoire 3 accessoires. Je vais dans le menu des accessoires. Le menu se déroule et les titres passent en inverse vidéo lorsque la souris passe dessus. Tout ceci est fait par le GEM, tout seul comme un grand. Je clique sur le titre de l'accessoire 2. Le GEM détecte le clic, sait que je suis dans les accessoires, re- garde sur quelle entrée j'ai cliqué. Comme c'est le GEM qui a at- tribué les entrées aux ACC, il envoie un message à l'accessoire 2 pour lui dire "il faut que tu t'ouvres". Celui-ci s'ouvre donc, et affiche une fenêtre à l'écran. Nous avons donc 2 fenêtres en même temps. Je clique sur celle du PRG, le GEM regarde à qui appartient cette fenêtre et envoi au PRG un message pour lui dire "on a acti- vé ta fenêtre numéro XX" etc... Nous allons donc construire dans nos programmes sous GEM, un noyau de surveillance des actions, et nous réagirons en fonction de celles-ci. -- Pour appeler les fonctions du GEM. Les appels se font avec des paramètres que nous passons dans des tableaux. Comme nous utilisons DEVPACK, nous utiliserons sa bi- bliothèque. En effet, pour les appels au GEM, les paramètres sont nombreux et à placer à des endroits bien précis dans les tableaux. Pour ces raisons, les macros trouvent ici tout leur intérêt. Nous appellerons donc les fonctions du GEM avec les macros contenues dans la bibliothèque de DEVPACK. Cependant il convient de connaî- tre également les tableaux, afin de pouvoir parfaitement compren- dre le principe de fonctionnement. Pour l'AES, il faut 6 tableaux: CONTROL, GLOBAL, INT_IN, INT_OUT, ADDR_IN, ADDR_OUT. Pour le VDI il en faut 5: CONTRL, INTIN, INTOUT, PTSIN, PTSOUT. Attention à la légère différence d'orthographe entre INT_IN et INTIN ! Pour indiquer, lors de l'appel au GEM, l'emplacement où il trouvera ces tableaux, leurs adresses sont placées dans 2 listes: Une pour l'AES: aes_params dc.l control, global, int_in, int_out,addr_in, addr_out et une pour le VDI: vdi_params dc.l contrl, intin, ptsin, intout, ptsout Voici les tableaux tels qu'ils sont définis dans la bibliothèque GEM de DEVPACK: control ds.w 5 global ds.w 14 int_in ds.w 16 int_out ds.w 7 addr_in ds.l 3 addr_out ds.l 1 contrl ds.w 1 contrl1 ds.w 1 contrl2 ds.w 1 contrl3 ds.w 1 contrl4 ds.w 1 contrl5 ds.w 1 contrl6 ds.w 1 contrl7 ds.w 1 contrl8 ds.w 1 contrl9 ds.w 1 contrl10 ds.w 1 contrl11 ds.w 1 intin ds.w 128 min 30 intout ds.w 128 min 45 ptsin ds.w 128 min 30 ptsout ds.w 128 min 12 Vous remarquez l'étrange mise en place du tableau CONTRL (tableau pour le VDI). En effet il faut assez souvent passer des paramètres 'à la main' dans ce tableau. Avec ce système, il sera possible de réaliser une opération du genre MOVE.W #10,CONTRL2 Attention cette numérotation des CONTRL correspond au nombre de words car chacune des entrées est définie par DS.W et non pas par DS.B!!! Ceci s'explique par le fait que 99% des documents relatifs au GEM sont pour le 'C' et que c'est ce type de commande qui est faite en 'C'. Ainsi vous trouverez souvent; "mettre 10 en contrl(2)"; il vous suffira de faire MOVE.W #10,CONTRL2 et le tour est joué. -- Pourquoi tant de tableaux? Parce que chacun de ces tableaux est destiné à recevoir ou à renvoyer un certain type de données. Voyons un descriptif rapide de ces tableaux. Tableaux AES ** control Destiné à contenir, dans l'ordre: numéro de la fonction (.W), nombre d'octets de INT_IN (.W), nombre d'octets de INT_OUT (.W), nombre de longs mots de ADDR_IN (.W) nombre de longs mots de ADDR_OUT ** global Ce tableau est un peu spécial, et les explications le concernant ne sont d'aucune utilité dans le cadre de ces cours. Une fois bien ingurgité le reste, vous pourrez toujours vous pencher dessus mais actuellement cela ne ferait que vous embrouiller! (Voir la biblio- graphie pour en savoir plus) ** int_in Ce tableau est destiné à recevoir des valeurs entières (Integer In) dont l'AES aura besoin. Par exemple un numéro de fenêtre. ** int_out A l'inverse du précédent ce tableau renvoi des résultats par exem- ple si vous demander la surface disponible pour une fenêtre, vous aurez ici les dimensions. ** addr_in Liste dans laquelle vous pourrez placer des adresses ** addr_out et là, vous pourrez en lire! En fait il suffit, comme toujours, de lire le nom du tableau pour en déduire ce qu'il contient! Tableaux VDI ** contrl Dans contrl0 nous plaçons l'opcode de la fonction, c'est ainsi que l'on appelle son numéro. Dans contrl1 nous plaçons le nombre de données qui seront mise dans le tableau intin Dans contrl2 nous plaçons le nombre de points (donc de couples de données) qui seront placés dans le tableau ptsin Dans contrl3 nous placerons l'identificateur de la sous-fonction. Par exemple le traçage des cercles, ellipse, rectangle etc... ce fait avec la fonction 11. Il faut donc un sous-code permettant de définir quel module dans la fonction 11 on désire utiliser. Dans contrl6 nous plaçons le handle du périphérique. (voir plus haut) A partir de contrl7 il y a parfois des informations à passer, suivant la fonction. ** intin et ptsin Nous remplirons ensuite le tableau INTIN avec les paramètres en- tiers demandés par la fonction et le tableau PTSIN avec les coor- données demandées par la fonction. Une fois la fonction appelée, nous récupèrerons: en contrl2 le nombre de couples de coordonnées de ptsout et en contrl4 le nombre de mots de intout. Voici un appel au GEM. Cette fonction affiche une phrase où l'on veut sur l'écran, contrairement à Gemdos (9) qui est limité sur les lignes et les colonnes de texte. De plus cette fonction permet d'afficher du texte avec des effets (gras, souligné etc...) avec la fonte de notre choix: LEA MESSAGE,A1 adresse de la phrase LEA INTIN,A0 tableau de réception MOVEQ.L #0,D2 init le compteur de lettres ICI3 CLR.W D0 MOVE.B (A1)+,D0 prélève en bytes BEQ GO_ON fin du texte ADDQ.B #1,D2 on compte les lettres MOVE.W D0,(A0)+ transfère dans INTIN (en words) BRA ICI GO_ON MOVE.W #100,PTSIN position X MOVE.W #150,PTSIN+2 position Y MOVE.W D2,CONTRL3 nombre de lettres MOVE.W #1,CONTRL1 MOVE.W CURRENT_HANDLE,CONTRL6 MOVE.W #8,CONTRL opcode MOVE.L #VDI_PARAMS,D1 MOVE.W #$73,D0 TRAP #2 AAAAAAAAAARRRRRRGGGLLL!!!!!! C'est l'horreur n'est ce pas! Il faut vous munir de patience et décortiquer les multiples appels au GEM. Pour vous aider dans vos essais, vous trouverez ci-joint un dos- sier intitulé GEM. Il contient le source d'un ACC qui affiche une boîte d'alerte, d'un PRG qui gère une ressource (listing issu de WERCS) et d'un accessoire gérant une fenêtre. Pour ce qui est des éditeurs de ressources, je travaille avec K Ressource qui est bien sympa et qui ne plante pas, contrairement à Wercs! Essayez de bien comprendre le principe: affichez une boîte d'alerte avec un seul bouton, puis avec plusieurs, faites des petites ressources toutes simples, puis de plus en plus compli- quées etc... Le principe restera toujours le même quelle que soit la taille de votre application. Essayez de faire de petits acces- soires du genre formateur de disquettes, avec un petit formulaire qui demande si l'on veut formater le disque A ou le B, en simple ou en double face etc... A l'aide de ces exemples, vous devriez réussir à vous débrouiller. C'est avec ça que j'ai commencé! Jetez également un coup d'oeil sur la bibliographie, il y a quelques trucs intéressants!
Back to ASM_Tutorial