COURS208.TXT/fr
Jump to navigation
Jump to search
******************************************************************
* *
* 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