/* LORD OF HOSTS - joymouse.c --- Maus-Joystick-Umschalter */

#include "Lord.h"

extern struct IOStdReq *IOReq;
extern ULONG JoyMouseData;
BOOL joymouse_on;
struct Interrupt Input_Handler;
#pragma regcall(JoyMouseHandler(a0,a1))   /* dann brauche ich keinen Assembler-
                                             Stub für die Parameter */

struct InputEvent *JoyMouseHandler (struct InputEvent *Event, ULONG *Data)
/* Dies ist das Stück Interrupt-Code, das sich jede Mausbewegung schnappt,
   bevor Intuition selbst drankommt, sie "streckt" (und alle anderen Events
   durchläßt) */
{
   if (Event->ie_Class == IECLASS_RAWMOUSE)
   {
      Event->ie_X *= *Data;
      Event->ie_Y *= *Data;
   }
   return Event;
}

void swapjoymouse(BOOL what)
   /* swapjoymouse(TRUE) schaltet Joymouse an, FALSE dagegen aus */
{
   UBYTE Type,Port;
   if (what == TRUE)
   {
      Type = GPCT_RELJOYSTICK;   /* Joystick als Eingabegerät */
      Port = 1;                  /*          am Gameport 2    */
      Input_Handler.is_Code = (VOID (*)())JoyMouseHandler;
      Input_Handler.is_Data = (APTR) &JoyMouseData;
      Input_Handler.is_Node.ln_Pri = 51;
      IOReq->io_Data = (APTR) &Input_Handler;
      IOReq->io_Command = (UWORD) IND_ADDHANDLER;
      DoIO((struct IORequest *)IOReq);             /* Handler einbinden */
   }
   else
   {
      Type = GPCT_MOUSE;         /* Maus als Eingabegerät */
      Port = 0;                  /*      am Gameport 1    */
      IOReq->io_Data = (APTR) &Input_Handler;
      IOReq->io_Command = (UWORD) IND_REMHANDLER;
      DoIO((struct IORequest *)IOReq);             /* Handler entfernen */
   }

   /* Port wechseln */
   IOReq->io_Data = (APTR) &Port;
   IOReq->io_Length = 1;
   IOReq->io_Command = (UWORD) IND_SETMPORT;
   DoIO((struct IORequest *)IOReq);

   /* Controllertyp umschalten */
   IOReq->io_Data = (APTR) &Type;
   IOReq->io_Length = 1;
   IOReq->io_Command = (UWORD) IND_SETMTYPE;
   DoIO((struct IORequest *)IOReq);
   joymouse_on = what;
}
