summaryrefslogtreecommitdiff
path: root/include/input.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/input.h')
-rw-r--r--include/input.h135
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__