mirror of
https://github.com/Oibaf66/uae-wii.git
synced 2024-11-15 07:15:09 +01:00
142 lines
3.1 KiB
C
142 lines
3.1 KiB
C
/*
|
|
* IEvent mouse hack
|
|
*
|
|
* Compile with DCC
|
|
*
|
|
* Copyright 1997 Bernd Schmidt
|
|
*/
|
|
|
|
#include <stdio.h>
|
|
|
|
#include <exec/devices.h>
|
|
#include <exec/interrupts.h>
|
|
#include <exec/nodes.h>
|
|
#include <exec/io.h>
|
|
#include <exec/memory.h>
|
|
#include <intuition/intuitionbase.h>
|
|
#include <intuition/preferences.h>
|
|
#include <devices/input.h>
|
|
#include <devices/inputevent.h>
|
|
#include <devices/timer.h>
|
|
#include <hardware/intbits.h>
|
|
#include <clib/alib_protos.h>
|
|
#include <clib/exec_protos.h>
|
|
|
|
int (*calltrap)(__d0 int) = 0xF0FF70;
|
|
|
|
extern void mousehackint(void);
|
|
|
|
struct {
|
|
ULONG mx;
|
|
ULONG my;
|
|
ULONG sigbit;
|
|
struct Task *mt;
|
|
} foo;
|
|
|
|
struct Interrupt myint = {
|
|
{ 0, 0, NT_INTERRUPT, 5, "UAE mouse hack" },
|
|
&foo,
|
|
mousehackint
|
|
};
|
|
|
|
int main(int argc, char **argv)
|
|
{
|
|
struct IntuitionBase *ibase;
|
|
struct InputEvent *iev;
|
|
struct IOStdReq *ioreq = 0;
|
|
struct MsgPort *port;
|
|
|
|
struct timerequest *timereq = 0;
|
|
struct MsgPort *timeport;
|
|
int oldx = 0, oldy = 0;
|
|
int i;
|
|
|
|
i = (*calltrap) (0);
|
|
if (i == 0) {
|
|
fprintf(stderr, "mousehack not needed for this version of UAE.\n");
|
|
exit (0);
|
|
}
|
|
if (i == -1) {
|
|
fprintf(stderr, "mousehack already running.\n");
|
|
exit (5);
|
|
}
|
|
|
|
i = AllocSignal (-1);
|
|
if (i < 0)
|
|
goto fail;
|
|
foo.sigbit = 1 << i;
|
|
|
|
port = CreatePort(0, 0);
|
|
timeport = CreatePort (0, 0);
|
|
if (port)
|
|
ioreq = CreateStdIO(port);
|
|
|
|
if (timeport)
|
|
timereq = CreateStdIO(timeport);
|
|
|
|
if (ioreq == 0)
|
|
goto fail;
|
|
if (timereq == 0)
|
|
goto fail;
|
|
|
|
iev = AllocMem (sizeof (struct InputEvent), MEMF_CLEAR + MEMF_PUBLIC);
|
|
if (iev == 0)
|
|
goto fail;
|
|
if (OpenDevice ("input.device", 0, ioreq, 0) != 0)
|
|
goto fail;
|
|
if (OpenDevice ("timer.device", 0, timereq, 0) != 0)
|
|
goto fail;
|
|
|
|
foo.mx = (ULONG)-1;
|
|
foo.my = (ULONG)-1;
|
|
foo.mt = FindTask (0);
|
|
AddIntServer(INTB_VERTB, &myint);
|
|
|
|
ibase = OpenLibrary ("intuition.library", 0);
|
|
SetTaskPri (foo.mt, 20); /* same as input.device */
|
|
for (;;) {
|
|
int newx, newy;
|
|
|
|
Wait (foo.sigbit);
|
|
ioreq->io_Command = IND_WRITEEVENT;
|
|
ioreq->io_Length = sizeof (struct InputEvent);
|
|
ioreq->io_Data = iev;
|
|
ioreq->io_Flags = IOF_QUICK;
|
|
iev->ie_Class = IECLASS_POINTERPOS;
|
|
iev->ie_SubClass = 0;
|
|
iev->ie_Code = 0;
|
|
iev->ie_Qualifier = 0;
|
|
#if 0
|
|
newx = (*calltrap) (1);
|
|
newy = (*calltrap) (2);
|
|
|
|
if (oldy != newy || oldx != newx)
|
|
#endif
|
|
{
|
|
timereq->tr_node.io_Flags = IOF_QUICK;
|
|
timereq->tr_node.io_Command = TR_GETSYSTIME;
|
|
DoIO (timereq);
|
|
iev->ie_TimeStamp = timereq->tr_time;
|
|
/* Those are signed, so I hope negative values are OK... */
|
|
/* I wonder why I have to multiply those by 2... but it works,
|
|
* at least for me. */
|
|
iev->ie_position.ie_xy.ie_x = foo.mx - ibase->ViewLord.DxOffset*2;
|
|
iev->ie_position.ie_xy.ie_y = foo.my - ibase->ViewLord.DyOffset*2;
|
|
|
|
oldx = newx;
|
|
oldy = newy;
|
|
DoIO(ioreq);
|
|
}
|
|
#if 0
|
|
timereq->tr_node.io_Flags = IOF_QUICK;
|
|
timereq->tr_time.tv_secs = 0;
|
|
timereq->tr_time.tv_micro = 20000;
|
|
timereq->tr_node.io_Command = TR_ADDREQUEST;
|
|
DoIO(timereq);
|
|
#endif
|
|
}
|
|
fail:
|
|
fprintf (stderr, "Couldn't start mousehack (that's bad!)\n");
|
|
exit (5);
|
|
}
|