diff options
Diffstat (limited to 'include/input.h')
-rw-r--r-- | include/input.h | 135 |
1 files changed, 135 insertions, 0 deletions
diff --git a/include/input.h b/include/input.h new file mode 100644 index 0000000..70b7a83 --- /dev/null +++ b/include/input.h @@ -0,0 +1,135 @@ +// +// Input header +// +//! \file tonc_input.h +//! \author J Vijn +//! \date 20060508 - 20060924 +// +// === NOTES === +// * This is a _small_ set of typedefs, #defines and inlines that can +// be found in tonclib, and might not represent the +// final forms. + + +#ifndef __INPUT__ +#define __INPUT__ + +#include "memmap.h" +#include "types.h" +#include "memdef.h" + + +INLINE int bit_tribool(u32 x, int plus, int minus); + +// === CONSTANTS ====================================================== + +typedef enum eKeyIndex +{ + KI_A=0, KI_B, KI_SELECT, KI_START, + KI_RIGHT, KI_LEFT, KI_UP, KI_DOWN, + KI_R, KI_L, KI_MAX +} eKeyIndex; + +// === MACROS ========================================================= + +// check which of the specified keys are down or up right now +#define KEY_DOWN_NOW(key) (~(REG_KEYINPUT) & key) +#define KEY_UP_NOW(key) ( (REG_KEYINPUT) & key) + +// test whether all keys are pressed, released, whatever. +// Example use: +// KEY_EQ(key_hit, KEY_L | KEY_R) +// will be true if and only if KEY_L and KEY_R are _both_ being pressed +#define KEY_EQ(key_fun, keys) ( key_fun(keys) == (keys) ) + +// === CLASSES ======================================================== +// === GLOBALS ======================================================== + +extern u16 __key_curr, __key_prev; // in tonc_core.c + +// === PROTOTYPES ===================================================== + +// --- synchronous key states --- +INLINE void key_poll(); +INLINE u32 key_curr_state(); +INLINE u32 key_prev_state(); + +INLINE u32 key_is_down(u32 key); // any of key currently down? +INLINE u32 key_is_up(u32 key); // any of key currently up? + +INLINE u32 key_was_down(u32 key); // any of key previously down? +INLINE u32 key_was_up(u32 key); // any of key previously up? + +INLINE u32 key_transit(u32 key); // any of key changing? +INLINE u32 key_held(u32 key); // any of key held down? +INLINE u32 key_hit(u32 key); // any of key being hit (going down)? +INLINE u32 key_released(u32 key); // any of key being released? + +// --- tribools --- +INLINE int key_tri_horz(); +INLINE int key_tri_vert(); +INLINE int key_tri_shoulder(); +INLINE int key_tri_fire(); + +// === INLINES========================================================= + +// --- keys ----------------------------------------------------------- + +//! Poll for keystates +INLINE void key_poll() +{ __key_prev= __key_curr; __key_curr= ~REG_KEYINPUT & KEY_MASK; } + +//! Get current keystate +INLINE u32 key_curr_state() { return __key_curr; } + +//! Get previous key state +INLINE u32 key_prev_state() { return __key_prev; } + +//! Gives the keys of \a key that are currently down +INLINE u32 key_is_down(u32 key) { return __key_curr & key; } + +//! Gives the keys of \a key that are currently up +INLINE u32 key_is_up(u32 key) { return ~__key_curr & key; } + +//! Gives the keys of \a key that were previously down +INLINE u32 key_was_down(u32 key) { return __key_prev & key; } + +//! Gives the keys of \a key that were previously down +INLINE u32 key_was_up(u32 key) { return ~__key_prev & key; } + +//! Gives the keys of \a key that are different from before +INLINE u32 key_transit(u32 key) +{ return (__key_curr^__key_prev) & key; } + +//! Gives the keys of \a key that are being held down +INLINE u32 key_held(u32 key) +{ return (__key_curr& __key_prev) & key; } + +//! Gives the keys of \a key that are pressed (down now but not before) +INLINE u32 key_hit(u32 key) +{ return (__key_curr&~__key_prev) & key; } + +//! Gives the keys of \a key that are being released +INLINE u32 key_released(u32 key) +{ return (~__key_curr&__key_prev) & key; } + +// --- tribools --- + +//! Horizontal tribool (right,left)=(+,-) +INLINE int key_tri_horz() +{ return bit_tribool(__key_curr, KI_RIGHT, KI_LEFT); } + +//! Vertical tribool (down,up)=(+,-) +INLINE int key_tri_vert() +{ return bit_tribool(__key_curr, KI_DOWN, KI_UP); } + +//! Shoulder-button tribool (R,L)=(+,-) +INLINE int key_tri_shoulder() +{ return bit_tribool(__key_curr, KI_R, KI_L); } + +//! Fire-button tribool (A,B)=(+,-) +INLINE int key_tri_fire() +{ return bit_tribool(__key_curr, KI_A, KI_B); } + + +#endif // __INPUT__ |