home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Club Amiga de Montreal - CAM
/
CAM_CD_1.iso
/
files
/
446.lha
/
Port2
/
Port2.c
< prev
next >
Wrap
C/C++ Source or Header
|
1990-12-03
|
8KB
|
364 lines
/* $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 <intuition/intuitionbase.h>
#include <libraries/dosextens.h>
#include <devices/inputevent.h>
#include <devices/gameport.h>
#include <graphics/gfxbase.h>
#include <graphics/sprite.h>
#include <devices/input.h>
#include <exec/memory.h>
#include <functions.h>
/* 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);
}
}