Suivez-nous sur X

|
|
|
0,
A,
B,
C,
D,
E,
F,
G,
H,
I,
J,
K,
L,
M,
N,
O,
P,
Q,
R,
S,
T,
U,
V,
W,
X,
Y,
Z,
ALL
|
|
0,
A,
B,
C,
D,
E,
F,
G,
H,
I,
J,
K,
L,
M,
N,
O,
P,
Q,
R,
S,
T,
U,
V,
W,
X,
Y,
Z
|
|
0,
A,
B,
C,
D,
E,
F,
G,
H,
I,
J,
K,
L,
M,
N,
O,
P,
Q,
R,
S,
T,
U,
V,
W,
X,
Y,
Z
|
|
A propos d'Obligement
|
|
David Brunet
|
|
|
|
Programmation : Assembleur 68k - choix de menus avec la souris
(Article écrit par François Fleuret et extrait de Génération 4 - mai 1989)
|
|
Jusqu'à aujourd'hui, les programmes que nous vous avons donnés étaient simplement des "démonstrations"
sans possibilité pour l'utilisateur d'intervenir sur le déroulement des choses. Nous allons donc
ici nous attarder sur l'un des liens entre l'utilisateur et l'Amiga : la souris.
Contrairement à ce que l'on pourrait penser, la gestion de la souris est des plus simples car il n'y
a absolument aucune initialisation à faire avant de lire les données fournies par ce sympathique
rongeur. La souris fournit cinq informations : sa position en X, sa position en Y et la position de
chacun de ses trois boutons (car l'Amiga peut accepter des souris à trois boutons !).
Les coordonnées X et Y sont comprises entre 0 et 255 et le problème est donc de savoir comment le
système fait pour pouvoir gérer les déplacements de la souris sur plus de 255 points (par exemple,
horizontalement, il y a 320 points ou plus). Le principe utilisé est très simple, en effet,
le système convertit les coordonnées absolues (fournies par la souris) en coordonnées relatives à
partir desquelles il calcule la nouvelle position à l'écran. Pour faire cela, il suffit de noter la
dernière position absolue de la souris et de la soustraire à la nouvelle pour obtenir un déplacement
relatif. On ajoute ensuite ce déplacement relatif aux précédentes coordonnées utilisées par le système
(et qui sont absolues) pour avoir les nouvelles coordonnées de la souris (pour le système).
Les coordonnées que l'on obtient sont donc purement artificielles mais le principe fonctionne à
merveille. Le léger défaut est que ce principe ne permet pas de faire un déplacement de plus de 127
points entre deux calculs de coordonnées, essayez donc de déplacer votre souris très rapidement,
elle fait n'importe quoi.
Pour lire les coordonnées absolues (comprises entre 0 et 255), il suffit de lire l'adresse JOY0DAT
pour le port 0 et JOY1DAT pour le port 1, on récupère ainsi X dans l'octet de poids faible et Y dans
l'octet de poids fort. Pour ce qui est des boutons : le bouton de gauche est représenté par le bit
6 de CIA ($BFE001) pour le port 0 et par le bit 7 pour le port 1. Pour le bouton droit du port 0,
c'est le bit 10 de POTGOR ($DFF016) et pour le bouton fantôme, c'est le bit 8. Pour le port 1,
ce sont les bits 14 et 12. Voici un petit tableau récapitulatif :
Port 0
- X : bits 0-7 de JOY0DAT $DFFOOA
- Y : bits 8-15 de JOY0DAT $DFFOOA
- Bouton gauche : bit 6 de CIA $BFE001 (1=OFF 0=ON)
- Bouton droit : bit 10 de POTGOR $DFF016 (1=OFF 0=ON)
- Bouton fantôme : bit 8 de POTGOR $DFF016 (1=OFF 0=ON)
Port 1
- X : bits 0-7 de JOY1DAT $DFFOOC
- Y : bits 8-15 de JOY1DAT $DFFOOC
- Bouton gauche : bit 7 de CIA $BFE001 (1=OFF 0=ON)
- Bouton droit : bit 14 de POTGOR $DFF016 (1=OFF 0=ON)
- Bouton fantôme : bit 12 de POTGOR $DFF016 (1=OFF 0=ON)
Comme programme illustrant ce qui précède, je vous donne un sélectionneur de menu qui
vous permettra de placer des choix dans vos démos. Ce sélectionneur permet de faire un
choix parmi 16 menus différents. Il affiche tout d'abord une image IFF 320x256 monochrome
non compactée qui contient ces 16 choix (chacun se trouvant dans une boîte de 16 lignes de
hauteur). Ensuite, en fonction de la position de la souris, il change la couleur du fond sous
le menu ainsi désigné. On peut sélectionner un menu en cliquant dessus. Dans ce cas-là, sa
couleur change définitivement. Un deuxième clic annule la sélection. Le programme gère quatre
types de menus :
- Les menus non sélectionnables.
- Les menus sélectionnables.
- Les menus non sélectionnables qui font quitter.
- Les menus sélectionnables qui font quitter.
Le type de chacune des lignes est donné dans deux mots :
- TYPE_WORD qui contient la "sélectionnabilité" (mais si, ça doit bien exister !) d'un menu.
Par exemple, si le bit 0 est à 1 cela signifie que l'on peut sélectionner le menu le plus
en haut de l'écran.
- QUIT_WORD qui indique si le clic sur un menu fait quitter la routine. Si le bit 5 est à 1, cela
signifie que le menu n°5 (le sixième en partant du haut) est un menu "EXIT".
On récupère ensuite les menus sélectionnés dans SELECT_WORD dont chaque bit correspond à un menu...
Techniquement, c'est bête à pleurer, on construit au début une liste Copper qui contient un
dégradé de couleur. Ce dégradé est pris dans une table appelée "DEGRADE" dont on fait une copie
au début dans la table "COULEURS". Durant l'IRQ, on remet les couleurs de la table COULEURS dans
la liste Copper puis on place du vert dans la bande désignée par la souris. Lorsque l'on clique,
si le menu était déjà sélectionné, on remet la couleur de la table DEGRADE dans la table COULEURS
(pour effacer la sélection) sinon, on rajoute du vert dans la couleur de COULEURS afin de signaler
que ce choix a été sélectionné. Si le menu choisi est un EXIT, on met le drapeau QUIT_FLAG à $FF
afin que la routine d'attente (hors interruption) soit prévenue du changement et arrête de boucler.
C'est tout...
Bien évidemment, cette routine ne sert à rien lorsqu'elle est toute seule, il faut l'insérer dans un
autre programme pour que son intérêt apparaisse. Pour l'inclure dans un autre programme, il
faut supprimer les routines SAVE_ALL et RESTORE_ALL et ne pas oublier de remettre les initialisations
de l'autre programme (celui dans lequel la routine se trouve) lorsqu'on la quitte.
Comme toujours, ce programme a été réalisé avec le petit Kseka mais peut être adapté sans gros
problèmes aux autres assembleurs. Pour le Devpac, il faut remplacer les "BLK" par des "DS"
et remplacer les quatre dernières lignes par :
image:
incbin "image.iff" ; Remplace le RI du Seka
bitplan=image+138
|
Voilà, c'est tout pour les menus...
|