dillon@POSTGRES.BERKELEY.EDU (Matt Dillon) (05/07/89)
Somebody asked me to make this up and I figure other people might
be interested in a working example that modifies mouse events (reverses
their direction, in fact! :-))
Compiles under Aztec C, is well commented, 16 or 32 bit ints, no
precompiled symbol table needed, etc...
-Matt
/*
* MREVS.C
*
* Example input event interceptor program
*
* Takes mouse events and reverses their direction (x -> -x y -> -y)
*
* Matthew Dillon, public domain.
*/
#include <exec/types.h>
#include <exec/nodes.h>
#include <exec/interrupts.h>
#include <devices/inputevent.h>
#include <devices/input.h>
#include <libraries/dos.h>
typedef struct InputEvent IE;
typedef struct MsgPort PORT;
typedef struct IOStdReq IOR;
typedef struct Interrupt INT;
typedef void (*FPTR)();
IE *handler();
extern int Enable_Abort;
extern PORT *CreatePort();
extern IOR *CreateExtIO();
extern long Wait();
main()
{
IOR *ior;
PORT *port;
INT handnode;
Enable_Abort = 0;
port = CreatePort(NULL, 0);
ior = CreateExtIO(port, (long)sizeof(IOR));
handnode.is_Node.ln_Pri = 51;
handnode.is_Code = (FPTR)handler;
handnode.is_Data = NULL;
if (OpenDevice("input.device", 0L, ior, 0L)) {
puts("unable to open input.device!");
goto failure;
}
puts("adding");
ior->io_Command = IND_ADDHANDLER;
ior->io_Data = (APTR)&handnode;
ior->io_Message.mn_Node.ln_Type = NT_MESSAGE;
DoIO(ior);
for (;;) {
long mask = Wait((long)SIGBREAKF_CTRL_C);
if (mask & SIGBREAKF_CTRL_C)
break;
}
puts("removing");
ior->io_Command = IND_REMHANDLER;
ior->io_Data = (APTR)&handnode;
ior->io_Message.mn_Node.ln_Type = NT_MESSAGE;
DoIO(ior);
CloseDevice(ior);
failure:
DeletePort(port);
DeleteExtIO(ior);
}
#asm
; A0 = pointer to event linked list
; A1 = pointer to data segment (not used)
;
; return D0 = new event linked list
;
; I don't know if A0/A1 need to be preserved. I don't think so
; but why take the chance?
;
; D2/D3/A4/A6 are preserved here because Aztec C does not
; preserve them.
;
; NOTE: position of A0 on the stack is assumed by CHandler()
public _CHandler
_handler:
movem.l D2/D3/A0/A1/A4/A6,-(sp)
bsr _CHandler
movem.l (sp)+,D2/D3/A0/A1/A4/A6
rts
#endasm
IE *
CHandler(scr0, scr1, Ev)
long scr0, scr1;
IE *Ev;
{
register IE *ev;
geta4(); /* small data model support for Aztec C */
/* the base register must be initialized */
for (ev = Ev; ev; ev = Ev->ie_NextEvent) {
if (ev->ie_Class == IECLASS_RAWMOUSE) {
ev->ie_X = -ev->ie_X;
ev->ie_Y = -ev->ie_Y;
}
}
return(Ev);
}kodiak@amiga.UUCP (Robert R. Burns) (05/12/89)
In article ... (Matt Dillon) writes: )... code for the input event handler in assembler... )#asm ) ; A0 = pointer to event linked list ) ; A1 = pointer to data segment (not used) ) ; ) ; return D0 = new event linked list ) ; ) ; I don't know if A0/A1 need to be preserved. I don't think so ) ; but why take the chance? They don't need to be preserved. Guaranteed. -- Bob Burns, {cbmvax,oliveb,well}!amiga!kodiak _ | /_ _|. _ | Commodore __ |_) _ |_ _ )' |<(_)(_)|(_\|< /\ | ||| _` /\ |_)(_\| )(_\ | | \ Software ___/..\|\/|||__|/..\___ Faith