/* $Revision Header * Header built automatically - do not edit! ************* * * (C) Copyright 1990 by MXM * * Name .....: Port2.c * Created ..: Thursday 02-Aug-90 13:59 * Revision .: 0 * * Date Author Comment * ========= ======== ==================== * 02-Aug-90 Olsen Created this file! * * $Revision Header ********************************************************/ /* Included header files. */ #define __NO_PRAGMAS 1 #include #include #include #include #include #include #include #include #include /* Global symbols. */ struct IntuitionBase *IntuitionBase; struct GfxBase *GfxBase; struct Window *Window; struct MsgPort *GamePort; struct IOStdReq *GameReq; struct MsgPort *InputPort; struct IOStdReq *InputReq; struct InputEvent *InputEvent; struct SimpleSprite PointerSprite; USHORT *PointerImage; struct Preferences *Preferences; BYTE ControllerType = GPCT_NOCONTROLLER; /* Signal bits. */ #define SIG_GAMEPORT (1 << GamePort -> mp_SigBit) #define SIG_WINDOW (1 << Window -> UserPort -> mp_SigBit) /* Delta movement values we wish to be signalled. */ #define XMOVE 1 #define YMOVE 1 /* Window title and width of the window. */ #define NAME "Port2" #define WIDTH (84 + (sizeof(NAME) - 1) * 8) /* New window structure. */ struct NewWindow NewWindow = { 0,11, WIDTH,10, 0,1, CLOSEWINDOW, RMBTRAP | WINDOWCLOSE | WINDOWDRAG | WINDOWDEPTH, (struct Gadget *)NULL, (struct Image *)NULL, (STRPTR)NAME, (struct Screen *)NULL, (struct BitMap *)NULL, 0,0, 0,0, WBENCHSCREEN }; /* A GameTrigger structure. */ struct GamePortTrigger GameTrigger = { GPTF_UPKEYS|GPTF_DOWNKEYS, /* Key events. */ ~0, /* Event timeout (very large). */ XMOVE, /* Movement. */ YMOVE }; /* Stub routines. */ VOID _cli_parse(){} VOID _wb_parse(){} LONG Chk_Abort(VOID) { return(0); } /* CloseAll(BYTE ExitCode): * * Close all resources and exit. */ VOID CloseAll(BYTE ExitCode) { /* If we have allocated a controller, release the * port. */ if(ControllerType == GPCT_MOUSE) { ControllerType = GPCT_NOCONTROLLER; GameReq -> io_Command = GPD_SETCTYPE; GameReq -> io_Length = 1; GameReq -> io_Flags = IOF_QUICK; GameReq -> io_Data = (APTR)&ControllerType; DoIO(GameReq); } /* Release the sprite. */ if(PointerSprite . num != -1) FreeSprite(PointerSprite . num); if(Window) CloseWindow(Window); if(InputEvent) FreeMem(InputEvent,sizeof(struct InputEvent)); if(PointerImage) FreeMem(PointerImage,POINTERSIZE * sizeof(USHORT)); if(Preferences) FreeMem(Preferences,sizeof(struct Preferences)); if(GameReq) { if(GameReq -> io_Device) { GameReq -> io_Command = CMD_CLEAR; DoIO(GameReq); CloseDevice(GameReq); } DeleteStdIO(GameReq); } if(GamePort) DeletePort(GamePort); if(InputReq) { if(InputReq -> io_Device) CloseDevice(InputReq); DeleteStdIO(InputReq); } if(InputPort) DeletePort(InputPort); if(GfxBase) CloseLibrary(GfxBase); if(IntuitionBase) CloseLibrary(IntuitionBase); exit(ExitCode); } /* OpenAll(): * * Open all the required resources. */ VOID OpenAll() { if(!(IntuitionBase = (struct IntuitionBase *)OpenLibrary("intuition.library",0))) CloseAll(RETURN_FAIL + 0); if(!(GfxBase = (struct GfxBase *)OpenLibrary("graphics.library",0))) CloseAll(RETURN_FAIL + 1); if(!(GamePort = (struct MsgPort *)CreatePort(NULL,0))) CloseAll(RETURN_FAIL + 2); if(!(GameReq = (struct IOStdReq *)CreateStdIO(GamePort))) CloseAll(RETURN_FAIL + 3); if(OpenDevice("gameport.device",1,GameReq,0)) CloseAll(RETURN_FAIL + 4); if(!(InputPort = (struct MsgPort *)CreatePort(NULL,0))) CloseAll(RETURN_FAIL + 5); if(!(InputReq = (struct IOStdReq *)CreateStdIO(InputPort))) CloseAll(RETURN_FAIL + 6); if(OpenDevice("input.device",0,InputReq,0)) CloseAll(RETURN_FAIL + 7); if(!(Preferences = (struct Preferences *)AllocMem(sizeof(struct Preferences),MEMF_PUBLIC | MEMF_CLEAR))) CloseAll(RETURN_FAIL + 8); if(!(PointerImage = (USHORT *)AllocMem(POINTERSIZE * sizeof(USHORT),MEMF_PUBLIC | MEMF_CHIP | MEMF_CLEAR))) CloseAll(RETURN_FAIL + 9); if(!(InputEvent = (struct InputEvent *)AllocMem(sizeof(struct InputEvent),MEMF_PUBLIC | MEMF_CLEAR))) CloseAll(RETURN_FAIL + 10); if(!(Window = (struct Window *)OpenWindow(&NewWindow))) CloseAll(RETURN_FAIL + 11); /* Get the current system preferences. */ GetPrefs(Preferences,sizeof(struct Preferences)); /* Copy pointer image to user buffer. */ CopyMem(Preferences -> PointerMatrix,PointerImage,POINTERSIZE * sizeof(USHORT)); /* Set up the sprite control structure. */ PointerSprite . posctldata = PointerImage; PointerSprite . height = 16; /* Allocate a hardware sprite. */ if((PointerSprite . num = GetSprite(&PointerSprite,1)) == -1) CloseAll(RETURN_FAIL + 12); /* Check if we are able to allocate the second controller * port. */ GameReq -> io_Command = GPD_ASKCTYPE; GameReq -> io_Length = 1; GameReq -> io_Flags = IOF_QUICK; GameReq -> io_Data = (APTR)&ControllerType; Forbid(); DoIO(GameReq); /* The port is already allocated. */ if(ControllerType != GPCT_NOCONTROLLER) { Permit(); CloseAll(RETURN_FAIL + 13); } /* Install a mouse type controller. */ ControllerType = GPCT_MOUSE; GameReq -> io_Command = GPD_SETCTYPE; GameReq -> io_Length = 1; GameReq -> io_Flags = IOF_QUICK; GameReq -> io_Data = (APTR)&ControllerType; DoIO(GameReq); Permit(); /* Start queueing. */ GameReq -> io_Command = GPD_SETTRIGGER; GameReq -> io_Length = sizeof(struct GamePortTrigger); GameReq -> io_Data = (APTR)&GameTrigger; DoIO(GameReq); /* Initialize IORequests. */ GameReq -> io_Command = GPD_READEVENT; GameReq -> io_Length = sizeof(struct InputEvent); GameReq -> io_Data = (APTR)InputEvent; InputReq -> io_Command = IND_WRITEEVENT; InputReq -> io_Length = sizeof(struct InputEvent); InputReq -> io_Data = (APTR)InputEvent; } /* main(): * * The main program. */ VOID main() { LONG PointerX = 0,PointerY = 0; ULONG SignalSet; OpenAll(); /* Read the first controller event. */ SendIO(GameReq); FOREVER { SignalSet = Wait(SIG_GAMEPORT | SIG_WINDOW); /* Close the window? */ if(SignalSet & SIG_WINDOW) CloseAll(RETURN_OK); /* Remove queued messages. */ while(GetMsg(GamePort)); /* Mouse move event. */ if(InputEvent -> ie_X || InputEvent -> ie_Y) { /* Calculate delta values. */ PointerX += InputEvent -> ie_X * 2; PointerY += InputEvent -> ie_Y * 2; /* Avoid view limits. */ if(PointerX < 0) PointerX = 0; if(PointerY < 0) PointerY = 0; if(PointerX > 639) PointerX = 639; if(PointerY > 511) PointerY = 511; /* Move second mouse pointer. */ MoveSprite(NULL,&PointerSprite,(PointerX >> 1) + Preferences -> XOffset,(PointerY >> 1) + Preferences -> YOffset); } /* Hit a mouse button, move the real mouse pointer * to the current sprite position. */ if(InputEvent -> ie_Code != IECODE_NOBUTTON) { InputEvent -> ie_Qualifier &= ~IEQUALIFIER_RELATIVEMOUSE; InputEvent -> ie_Class = IECLASS_POINTERPOS; InputEvent -> ie_X = PointerX; InputEvent -> ie_Y = PointerY; DoIO(InputReq); } /* Read the next event. */ SendIO(GameReq); } }