/************************************************************************
 *									*
 * Routines.c								*
 * 									*
 * Routines.c is a collection of routines to do simple things. A quick  *
 * summery is as follows:						*
 *									*
 * OpenLibs() 	: Opens all useful libraries 				*
 * CloseLibs()	: Closes all libraries open by OpenLibs()		*
 ************************************************************************/
#define ROUTINES
#include "def.h"

/* OpenLibs, CloseLibs section */

struct IntuitionBase *IntuitionBase;
struct GfxBase *GfxBase;
struct LayersBase *LayersBase;

BOOL OpenLibs()
{
   if (!(GfxBase = (struct GfxBase *)OpenLibrary("graphics.library",0))) {
      CloseLibs();
      return(FALSE);
   }
   if (!(LayersBase = (struct LayersBase *)
         OpenLibrary("layers.library",0))) {
      CloseLibs();
      return(FALSE);
   }
   if (!(IntuitionBase = (struct IntuitionBase *)
         OpenLibrary("intuition.library",0))) {
      CloseLibs();
      return(FALSE);
   }
   return(TRUE);
}

CloseLibs()
{
   if (IntuitionBase)   CloseLibrary(IntuitionBase);
   if (GfxBase)         CloseLibrary(GfxBase);
   if (LayersBase)      CloseLibrary(LayersBase);
   return();
}

struct BitMap *MakeBitMap(Depth,Width,Height)
   long Depth,Width,Height;
/* Returns a BitMap structure with everything allocated */
{
   struct BitMap *bm;
   int i;
   
   if (!(bm = (struct BitMap *)AllocMem(sizeof(struct BitMap), MEMF_CHIP)))
      return(NULL);
   InitBitMap (bm, Depth, Width, Height);
   for (i=0; i<Depth; i++) {
      if (!(bm->Planes[i] = (PLANEPTR)AllocRaster(Width,Height))) {
         RemoveBitMap(bm,Depth,Width,Height);
         return(NULL);
      }
      BltClear(bm->Planes[i],(Width/8)*Height,1);
   }
   return(bm);
}

RemoveBitMap(bm,Depth,Width,Height)
   struct BitMap *bm;
   long Depth,Width,Height;
{
   int i;
   if (bm) {
      for (i=0;i<bm->Depth; i++) {
         if (bm->Planes[i]) FreeRaster(bm->Planes[i],Width,Height);
      }
      FreeMem(bm,sizeof(struct BitMap));
   }
}

long FileLength(file)
   FILE *file;
{
   long i;
   
   fseek(file,0L,2);
   i = ftell(file);
   return(i);
}


/************************************************************************
 * JoyStick Routines							*
 * 									*
 ************************************************************************/

short *Stick1 = JOYSTICK1;
short *Stick2 = JOYSTICK2;
short *Stick[2] = { JOYSTICK1,JOYSTICK2 };
char  *Buttons = BUTTONS;



short ReadJoystick1()
{
   register short stick;
   register short ans;
   register char  button;

       stick = *Stick1;
       stick &= 0x303;
       ans = (stick & 2) | (stick & 2 ? (stick & 1)^1:stick&1) | 
                (((stick & 0x200) | (stick & 0x200 ? 
                 (stick & 0x100)^0x100:stick &0x100))/64);
       ans |= (*Buttons & 0x40) * 16;

   return(ans);
}

short ReadJoystick2()
{
   register short stick;
   register short ans;
   register char  button;

       stick = *Stick2;
       stick &= 0x303;
       ans = (stick & 2) | (stick & 2 ? (stick & 1)^1:stick&1) | 
                (((stick & 0x200) | (stick & 0x200 ? 
                 (stick & 0x100)^0x100:stick &0x100))/64);
       ans |= (*Buttons & 0x80) * 8;

   return(ans);
}





char *pra=0xbfe001;
short *stick=0xdff00c;
char *pra0=0xbfe001;
short *stick0=0xdff00a;

int Joytrig(vx,vy,dx,dy,left,right)
	WORD *vx, *vy, *dx, *dy;
	UBYTE *left, *right;
{

*right = (*pra & 128) ? 0 : 1;
*left = (*pra0 & 64) ? 0 : 1;

/********/
switch(*stick0 & 0x303)
	{
	case 0x003:	/* RIGHT */
		*dx=1;
		*dy=0;
		break;
	case 0x300:	/* LEFT */
		*dx=(-1);
		*dy=0;
		break;
	case 0x001:	/* DOWN */
		*dx=0;
		*dy=1;
		break;
	case 0x100:	/* UP */
		*dx=0;
		*dy=(-1);
		break;
	case 0x002:	/* RIGHT/DOWN */
		*dx=1;
		*dy=1;
		break;
	case 0x200:	/* LEFT/UP */
		*dx=(-1);
		*dy=(-1);
		break;
	case 0x301:	/* LEFT/DOWN */
		*dx=(-1);
		*dy=1;
		break;
	case 0x103:	/* RIGHT/UP */
		*dx=1;
		*dy=(-1);
		break;
	default:	/* GOING NOWHERE */
		*dx=0;
		*dy=0;
	}
switch(*stick & 0x303)
	{
	case 0x003:	/* RIGHT */
		*vx=1;
		*vy=0;
		return;
		break;
	case 0x300:	/* LEFT */
		*vx=(-1);
		*vy=0;
		return;
		break;
	case 0x001:	/* DOWN */
		*vx=0;
		*vy=1;
		return;
		break;
	case 0x100:	/* UP */
		*vx=0;
		*vy=(-1);
		return;
		break;
	case 0x002:	/* RIGHT/DOWN */
		*vx=1;
		*vy=1;
		return;
		break;
	case 0x200:	/* LEFT/UP */
		*vx=(-1);
		*vy=(-1);
		return;
		break;
	case 0x301:	/* LEFT/DOWN */
		*vx=(-1);
		*vy=1;
		return;
		break;
	case 0x103:	/* RIGHT/UP */
		*vx=1;
		*vy=(-1);
		return;
		break;
	default:	/* GOING NOWHERE */
		*vx=0;
		*vy=0;
		return;
	}

}

