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 - Désactivation de la souris et du clavier
(Article écrit par François Lionet et extrait d'Amiga News Tech - décembre 1991)
|
|
Bienvenue dans cette nouvelle rubrique ! Je vais vous proposer ici quelques routines utilitaires en assembleur
qui n'auront d'autre but que de vous faciliter la vie.
Pour commencer, voici un moyen vraiment légal (j'insiste !) pour empêcher les mouvements de la souris de
parvenir au Workbench, lorsque l'on monopolise l'affichage. Allons bon, voilà que je me coupe mes effets,
alors que j'avais préparé une belle introduction. Bon, ce n'est pas grave, la voici quand même.
La belle intro
Que c'est bien de modifier les listes Copper du système... Comme l'on peut faire de jolies choses dans son
propre affichage... On bouge la souris, on clique ici et là, on tape de belles commandes au clavier... Tout
semble se passer pour le mieux. Puis on sort de son beau programme, et on constate, ô divine surprise, que
toutes les actions de la souris on été enregistrées dans le Workbench ! En sélectionnant telle icône de son
programme, on a fait démarrer un utilitaire dans la fenêtre Workbench. Un peu (NDLR : beaucoup) de malchance
et on formate son disque dur !
Pourtant, il existe des moyens tout à fait légaux pour empêcher les mouvements de la souris et les touches
du clavier d'arriver au Workbench. Des moyens vraiment légaux, j'entends, sans toucher aux CIA,
sans "poker" dans les vecteurs d'interruption, sans même interdire le multitâche.
Le nom magique est "input.device". Sous ce nom est regroupée toute la gestion des entrées de l'Amiga :
souris, clavier, mais aussi manette, disquette insérée ou enlevée, etc. La routinette d'aujourd'hui
se place au beau milieu de l'input.device et joue le rôle de filtre : elle ne laisse pas passer la
souris ou le clavier. A part ça, l'Amiga fonctionne tout à fait normalement : vous pouvez même faire des
accès disques, lancer des tâches secondaires...
Le beau programme
Comme toutes mes futures routinettes, celle d'aujourd'hui est totalement relogeable, ce qui vous permettra
par exemple de l'insérer dans un programme BASIC (AMOS bien sûr, mais aussi Amiga et même GFA !).
L'assemblage a été réalisé avec le Devpac.
La routinette offre deux points d'entrée :
- NEv_Start : à appeler en début de programme, cette routine ouvre l'input.device et intercepte les
évènements clavier et souris.
- NEv_Stop : à appeler avant de sortir du programme, pour remettre les choses en place.
Attention, avant de faire un accès disque, il est sage de rebrancher le clavier et la souris : n'oubliez pas
qu'une requête d'AmigaDOS peut apparaître. Dans ce cas, il vaut mieux pouvoir bouger la souris... Voici un
tout petit exemple d'utilisation de cette première routinette, dans lequel on se contente de modifier très
rapidement la couleur zéro en testant le bouton gauche de la souris directement dans les circuits, en toute
quiétude.
*--------------------------------------------------------------------
*
* ROUTINETTE numéro 1
* A'pu souris, a'pu clavier. In English: No_Events
*
* Par François Lionet
* Paru dans l'A.N.T. du 32 Fevrier 1789
*
*--------------------------------------------------------------------
*---------------------- Definition de variables système
* Structures "io"
io_command equ $1c
io_data equ $28
Lof_io equ $30
AddHandler equ 9
RemHandler equ 10
* Message port
Lof_msg equ $20
* Structures interrupt
ln_type equ $08
ln_pri equ $09
ln_name equ $0a
is_data equ $0e
is_code equ $12
Lof_is equ $16
* Fonctions EXEC
DoIo equ -456
FindTask equ -294
OpenDevice equ -444
CloseDevice equ -450
AddPort equ -354
RemPort equ -360
* input.device
Ie_NextEvent equ 0
Ie_Class equ 4
Ie_SubClass equ 5
Ie_Code equ 6
Ie_Qualifier equ 8
Ie_EventAddress equ 10
Ie_X equ 10
Ie_Y equ 12
IECLASS_RAWKEY EQU $01
IECLASS_RAWMOUSE EQU $02
*---------------------- Pitit exemple...
Exemple:
; On enlève le clavier et la souris
bsr NEv_Start
; Boucle de test
.loop move.w d0,$dff180 Changement de couleur
addq.w #1,d0
btst #6,$BFE001 Test du bouton souris
bne.s .loop
; On remet tout!
bsr NEv_Stop
; Basta, finito!
moveq #0,d0
rts
*---------------------- Point d'entrée 1: démarrage du filtre
NEv_Start:
movem.l d0-d7/a0-a6,-(sp)
move.l $4.w,a6
; Adresse des différentes structures
lea NEv_msg(pc),a2
lea NEv_io(pc),a3
lea NEv_int(pc),a4
; Fabrication du port de communication
sub.l a1,a1
jsr FindTask(a6)
move.l a2,a1
move.l d0,$10(a1)
jsr AddPort(a6)
; Ouverture de l'input.device
lea NEv_name(pc),a0
move.l a3,a1
moveq #0,d0
moveq #0,d1
jsr OpenDevice(a6)
move.l a2,14(a3) Associe le port et le device.
; Branchement de la routine d'interruption
lea NEv_Handler(pc),a0
move.l a0,is_code(a4)
clr.l is_data(a4)
move.b #100,ln_pri(a4)
move.l a3,a1
move.l a4,io_data(a1)
move.w #AddHandler,io_command(a1)
jsr DoIo(a6)
; Voila, c'est tout.
movem.l (sp)+,d0-d7/a0-a6
rts
;---------------------- Point d'entrée 2: arret du filtre.
NEv_Stop:
movem.l d0-d7/a0-a6,-(sp)
move.l $4.w,a6
; Adresse des structures
lea NEv_msg(pc),a2
lea NEv_io(pc),a3
lea NEv_int(pc),a4
; Enleve la routine d'interruption
move.l a3,a1
move.l a4,io_data(a1)
move.w #RemHandler,io_command(a1)
move.l $4.w,a6
jsr DoIo(a6)
; Ferme l'input.device
move.l $4.w,a6
jsr CloseDevice(a6)
; Ferme le port de communication
move.l a2,a1
jsr RemPort(a6)
; Ok!
movem.l (sp)+,d0-d7/a0-a6
rts
;------ Routine de filtre en interruption
; Pour plus de détails, consultez les ROM Kernels,
; chapitre input.device
NEv_Handler:
move.l a0,d0
move.l a0,d2
moveq #0,d3
; Boucle d'exploration des évènements
.loop move.b Ie_Class(a0),d1
cmp.b #IECLASS_RAWMOUSE,d1 Mouvement souris?
beq.s .trash Oui! A la poubelle!
cmp.b #IECLASS_RAWKEY,d1 Touche clavier?
beq.s .trash Oui! A la poubelle!
move.l d2,d3 On garde l'évènement,
move.l (a0),d2
.next move.l d2,a0 Un autre à voir?
bne.s .loop
rts Non! C'est fini.
; Balance l'évènement à la poubelle.
.trash
tst.l d3 Un évènement avant?
beq.s .skip
move.l d3,a1 Oui, il faut changer les
move.l (a0),d2 pointeurs.
move.l d2,(a1)
bra.s .next Va voir les suivants..
.skip move.l (a0),d0 Pas d'évènement avant.
move.l d0,a0 On peut voir le suivant.
bne.s .loop
rts Ben yen a plus: on sort!
*---------------------- Toute petite tchote zone de data.
; Structure io
NEv_io ds.b Lof_io
; Structure message-port
NEv_msg ds.b Lof_msg
; Structure interrupt
NEv_int ds.b Lof_is
; Nom de l'input.device
NEv_name dc.b "input.device",0
even
|
|