MCUME/MCUME_teensy/teensynofrendo/nesinput.c

213 wiersze
4.7 KiB
C
Executable File

/*
** Nofrendo (c) 1998-2000 Matthew Conte (matt@conte.com)
**
**
** This program is free software; you can redistribute it and/or
** modify it under the terms of version 2 of the GNU Library General
** Public License as published by the Free Software Foundation.
**
** This program is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
** Library General Public License for more details. To obtain a
** copy of the GNU Library General Public License, write to the Free
** Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
**
** Any permitted reproduction of these routines, in whole or in part,
** must bear this legend.
**
**
** nesinput.c
**
** Event handling system routines
** $Id: nesinput.c,v 1.2 2001/04/27 14:37:11 neil Exp $
*/
#include "noftypes.h"
#include "nesinput.h"
#include "log.h"
/* TODO: make a linked list of inputs sources, so they
** can be removed if need be
*/
static nesinput_t *nes_input[MAX_CONTROLLERS];
static int active_entries = 0;
/* read counters */
static int pad0_readcount, pad1_readcount, ppad_readcount, ark_readcount;
static int retrieve_type(int type)
{
int i, value = 0;
for (i = 0; i < active_entries; i++)
{
ASSERT(nes_input[i]);
if (type == nes_input[i]->type)
value |= nes_input[i]->data;
}
return value;
}
static uint8 get_pad0(void)
{
uint8 value;
value = (uint8) retrieve_type(INP_JOYPAD0);
/* mask out left/right simultaneous keypresses */
if ((value & INP_PAD_UP) && (value & INP_PAD_DOWN))
value &= ~(INP_PAD_UP | INP_PAD_DOWN);
if ((value & INP_PAD_LEFT) && (value & INP_PAD_RIGHT))
value &= ~(INP_PAD_LEFT | INP_PAD_RIGHT);
/* return (0x40 | value) due to bus conflicts */
return (0x40 | ((value >> pad0_readcount++) & 1));
}
static uint8 get_pad1(void)
{
uint8 value;
value = (uint8) retrieve_type(INP_JOYPAD1);
/* mask out left/right simultaneous keypresses */
if ((value & INP_PAD_UP) && (value & INP_PAD_DOWN))
value &= ~(INP_PAD_UP | INP_PAD_DOWN);
if ((value & INP_PAD_LEFT) && (value & INP_PAD_RIGHT))
value &= ~(INP_PAD_LEFT | INP_PAD_RIGHT);
/* return (0x40 | value) due to bus conflicts */
return (0x40 | ((value >> pad1_readcount++) & 1));
}
static uint8 get_zapper(void)
{
return (uint8) (retrieve_type(INP_ZAPPER));
}
static uint8 get_powerpad(void)
{
int value;
uint8 ret_val = 0;
value = retrieve_type(INP_POWERPAD);
if (((value >> 8) >> ppad_readcount) & 1)
ret_val |= 0x10;
if (((value & 0xFF) >> ppad_readcount) & 1)
ret_val |= 0x08;
ppad_readcount++;
return ret_val;
}
static uint8 get_vsdips0(void)
{
return (retrieve_type(INP_VSDIPSW0));
}
static uint8 get_vsdips1(void)
{
return (retrieve_type(INP_VSDIPSW1));
}
static uint8 get_arkanoid(void)
{
uint8 value = retrieve_type(INP_ARKANOID);
if ((value >> (7 - ark_readcount++)) & 1)
return 0x02;
else
return 0;
}
/* return input state for all types indicated (can be ORed together) */
uint8 input_get(int types)
{
uint8 value = 0;
if (types & INP_JOYPAD0)
value |= get_pad0();
if (types & INP_JOYPAD1)
value |= get_pad1();
if (types & INP_ZAPPER)
value |= get_zapper();
if (types & INP_POWERPAD)
value |= get_powerpad();
if (types & INP_VSDIPSW0)
value |= get_vsdips0();
if (types & INP_VSDIPSW1)
value |= get_vsdips1();
if (types & INP_ARKANOID)
value |= get_arkanoid();
return value;
}
/* register an input type */
void input_register(nesinput_t *input)
{
if (NULL == input)
return;
nes_input[active_entries] = input;
active_entries++;
}
void input_event(nesinput_t *input, int state, int value)
{
ASSERT(input);
if (state == INP_STATE_MAKE)
input->data |= value; /* OR it in */
else /* break state */
input->data &= ~value; /* mask it out */
}
void input_strobe(void)
{
pad0_readcount = 0;
pad1_readcount = 0;
ppad_readcount = 0;
ark_readcount = 0;
}
/*
** $Log: nesinput.c,v $
** Revision 1.2 2001/04/27 14:37:11 neil
** wheeee
**
** Revision 1.1.1.1 2001/04/27 07:03:54 neil
** initial
**
** Revision 1.1 2000/10/24 12:20:28 matt
** changed directory structure
**
** Revision 1.9 2000/09/10 23:25:03 matt
** minor changes
**
** Revision 1.8 2000/07/31 04:27:59 matt
** one million cleanups
**
** Revision 1.7 2000/07/23 15:11:45 matt
** removed unused variables
**
** Revision 1.6 2000/07/17 01:52:28 matt
** made sure last line of all source files is a newline
**
** Revision 1.5 2000/07/04 04:56:50 matt
** include changes
**
** Revision 1.4 2000/06/09 15:12:26 matt
** initial revision
**
*/