Obligement - L'Amiga au maximum

Vendredi 24 mai 2019 - 05:08  

Translate

En De Nl Nl
Es Pt It Nl


Rubriques

 · Accueil
 · A Propos
 · Articles
 · Galeries
 · Glossaire
 · Liens
 · Liste jeux Amiga
 · Quizz
 · Téléchargements
 · Trucs et astuces


Articles

 · Actualité (récente)
 · Actualité (archive)
 · Comparatifs
 · Dossiers
 · Entrevues
 · Matériel (tests)
 · Matériel (bidouilles)
 · Points de vue
 · En pratique
 · Programmation
 · Reportages
 · Tests de jeux
 · Tests de logiciels
 · Tests de compilations
 · Articles divers

 · Articles in english
 · Articles en d'autres langues


Twitter

Suivez-nous sur Twitter




Liens

 · Sites de téléchargements
 · Associations
 · Pages Personnelles
 · Matériel
 · Réparateurs
 · Revendeurs
 · Presse et médias
 · Programmation
 · Logiciels
 · Jeux
 · Scène démo
 · Divers


Jeux Amiga

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


Trucs et astuces

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


Glossaire

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


Partenaires

Annuaire Amiga

Amedia Computer

Relec

Hit Parade


Contact

David Brunet

Courriel

 


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 de l'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


[Retour en haut] / [Retour aux articles]