Diff for /np2/x11/joymng.c between versions 1.1 and 1.2

version 1.1, 2003/11/16 16:43:45 version 1.2, 2004/07/26 15:53:26
Line 1 Line 1
   /*      $Id$    */
   
   /*-
    * Copyright (c) 2004 NONAKA Kimihiro <aw9k-nnk@asahi-net.or.jp>,
    * All rights reserved.
    *
    * Redistribution and use in source and binary forms, with or without
    * modification, are permitted provided that the following conditions
    * are met:
    * 1. Redistributions of source code must retain the above copyright
    *    notice, this list of conditions and the following disclaimer.
    * 2. Redistributions in binary form must reproduce the above copyright
    *    notice, this list of conditions and the following disclaimer in the
    *    documentation and/or other materials provided with the distribution.
    *
    * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
    * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
    * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
    * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
    * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
    * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
    * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
    * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    * SUCH DAMAGE.
    */
   
 #include "compiler.h"  #include "compiler.h"
   
   #if defined(SUPPORT_JOYSTICK)
   
 #include "np2.h"  #include "np2.h"
   
 #include "joymng.h"  #include "joymng.h"
   #include "joydrv/joydrv.h"
   
   static struct {
           joydrv_handle_t hdl;
   
           BYTE            pad1btn[NELEMENTS(np2oscfg.JOY1BTN)];
           REG8            flag;
   
           joydrv_handle_t *devlist;
           BOOL            inited;
   } joyinfo = {
           NULL,
   
           { 0, },
           0xff,
   
           NULL,
           FALSE,
   };
   
   void
   joymng_initialize(void)
   {
           int i;
   
           if (!joyinfo.inited) {
                   joyinfo.devlist = joydrv_initialize();
                   if (joyinfo.devlist == NULL) {
                           np2oscfg.JOYPAD1 |= 2;
                   }
                   joyinfo.inited = TRUE;
           }
   
           if (joyinfo.hdl) {
                   joydrv_close(joyinfo.hdl);
                   joyinfo.hdl = NULL;
           }
           if (np2oscfg.JOYPAD1 == 1) {
                   joyinfo.hdl = joydrv_open(np2oscfg.JOYDEV[0]);
                   if (joyinfo.hdl == NULL) {
                           np2oscfg.JOYPAD1 |= 2;
                   }
           }
   
           for (i = 0; i < JOY_NBUTTON; i++) {
                   joyinfo.pad1btn[i] = 0xff ^ ((np2oscfg.JOY1BTN[i] & 3) << ((np2oscfg.JOY1BTN[i] & 4) ? 4 : 6));
           }
   }
   
   void
   joymng_deinitialize(void)
   {
   
           if (joyinfo.hdl) {
                   joydrv_close(joyinfo.hdl);
                   joyinfo.hdl = NULL;
           }
           if (joyinfo.devlist) {
                   _MFREE(joyinfo.devlist);
                   joyinfo.devlist = NULL;
           }
           joydrv_terminate();
           joyinfo.inited = FALSE;
           np2oscfg.JOYPAD1 &= 1;
   }
   
   const joydrv_handle_t *
   joymng_get_devinfo_list(void)
   {
   
           return (const joydrv_handle_t *)joyinfo.devlist;
   }
   
   void
   joymng_sync(void)
   {
   
           np2oscfg.JOYPAD1 &= 0x7f;
           joyinfo.flag = 0xff;
   }
   
   REG8
   joymng_getstat(void)
   {
           JOYINFO_T ji;
           int i;
   
           if ((np2oscfg.JOYPAD1 == 1) && joyinfo.hdl) {
                   if (joydrv_getstat(joyinfo.hdl, &ji) == SUCCESS) {
                           np2oscfg.JOYPAD1 |= 0x80;
                           joyinfo.flag = 0xff;
   
                           /* X */
                           if (ji.axis[0] > 0x4000) {
                                   joyinfo.flag &= ~JOY_RIGHT_BIT;
                           } else if (ji.axis[0] < -0x4000) {
                                   joyinfo.flag &= ~JOY_LEFT_BIT;
                           }
   
                           /* Y */
                           if (ji.axis[1] > 0x4000) {
                                   joyinfo.flag &= ~JOY_DOWN_BIT;
                           } else if (ji.axis[1] < -0x4000) {
                                   joyinfo.flag &= ~JOY_UP_BIT;
                           }
   
                           /* button */
                           for (i = 0; i < JOY_NBUTTON; ++i) {
                                   if (ji.button[i]) {
                                           joyinfo.flag &= joyinfo.pad1btn[i];
                                   }
                           }
                   }
           }
           return joyinfo.flag;
   }
   
   REG8
   joymng_getstat_with_map(UINT8 *axismap, UINT8 *btnmap)
   {
           JOYINFO_T ji;
           int i;
           REG8 joyflag;
   
           if (joyinfo.hdl) {
                   if (joydrv_getstat_with_map(joyinfo.hdl, &ji, axismap, btnmap) == SUCCESS) {
                           joyflag = 0xff;
   
                           /* X */
                           if (ji.axis[0] > 0x4000) {
                                   joyflag &= ~JOY_RIGHT_BIT;
                           } else if (ji.axis[0] < -0x4000) {
                                   joyflag &= ~JOY_LEFT_BIT;
                           }
   
                           /* Y */
                           if (ji.axis[1] > 0x4000) {
                                   joyflag &= ~JOY_DOWN_BIT;
                           } else if (ji.axis[1] < -0x4000) {
                                   joyflag &= ~JOY_UP_BIT;
                           }
   
                           /* button */
                           for (i = 0; i < JOY_NBUTTON; ++i) {
                                   if (ji.button[i]) {
                                           joyflag &= joyinfo.pad1btn[i];
                                   }
                           }
                           return joyflag;
                   }
           }
           return 0xff;
   }
   
   void
   joymng_update(void)
   {
   
           if (joyinfo.hdl) {
                   joydrv_update(joyinfo.hdl);
           }
   }
   
   int
   joymng_update_task(void *p)
   {
   
           UNUSED(p);
   
           if (joyinfo.hdl) {
                   joydrv_update(joyinfo.hdl);
           }
   
           return TRUE;
   }
   #endif  /* SUPPORT_JOYSTICK */

Removed from v.1.1  
changed lines
  Added in v.1.2


RetroPC.NET-CVS <cvs@retropc.net>