diff --git a/source/hid.c b/source/hid.c index 38fdee5..5e24a58 100644 --- a/source/hid.c +++ b/source/hid.c @@ -1,14 +1,16 @@ #include "hid.h" +#include "timer.h" u32 InputWait() { u32 pad_state_old = HID_STATE; + timer_start(); while (true) { u32 pad_state = HID_STATE; if (!(~pad_state & BUTTON_ANY)) { // no buttons pressed pad_state_old = pad_state; continue; } - if (pad_state == pad_state_old) + if ((pad_state == pad_state_old) && (!(pad_state & BUTTON_ARROW) || timer_msec() < 120)) continue; //Make sure the key is pressed u32 t_pressed = 0; diff --git a/source/hid.h b/source/hid.h index b8139e3..a86c48e 100644 --- a/source/hid.h +++ b/source/hid.h @@ -17,5 +17,6 @@ #define BUTTON_X (1 << 10) #define BUTTON_Y (1 << 11) #define BUTTON_ANY 0x00000FFF +#define BUTTON_ARROW (BUTTON_RIGHT|BUTTON_LEFT|BUTTON_UP|BUTTON_DOWN) u32 InputWait(); diff --git a/source/timer.c b/source/timer.c new file mode 100644 index 0000000..e98dfd3 --- /dev/null +++ b/source/timer.c @@ -0,0 +1,36 @@ +#include "timer.h" + +void timer_start( void ) { + // reset / deactivate timers + *TIMER_CNT0 = 0; + *TIMER_CNT1 = *TIMER_CNT2 = *TIMER_CNT3 = TIMER_COUNT_UP; + *TIMER_VAL0 = *TIMER_VAL1 = *TIMER_VAL2 = *TIMER_VAL3 = 0; + + // start timers + *TIMER_CNT0 = TIMER_ACTIVE; + *TIMER_CNT1 = *TIMER_CNT2 = *TIMER_CNT3 = TIMER_ACTIVE | TIMER_COUNT_UP; +} + +void timer_stop( void ) { + *TIMER_CNT0 &= ~TIMER_ACTIVE; + *TIMER_CNT1 &= ~TIMER_ACTIVE; + *TIMER_CNT2 &= ~TIMER_ACTIVE; + *TIMER_CNT3 &= ~TIMER_ACTIVE; +} + +u64 timer_ticks( void ) { + u64 ticks = 0; + ticks |= (u64) *TIMER_VAL0 << 0; + ticks |= (u64) *TIMER_VAL1 << 16; + ticks |= (u64) *TIMER_VAL2 << 32; + ticks |= (u64) *TIMER_VAL3 << 48; + return ticks; +} + +u64 timer_msec( void ) { + return (timer_ticks() * 1000) / TICKS_PER_SEC; +} + +u64 timer_sec( void ) { + return timer_ticks() / TICKS_PER_SEC; +} diff --git a/source/timer.h b/source/timer.h new file mode 100644 index 0000000..658fbcd --- /dev/null +++ b/source/timer.h @@ -0,0 +1,23 @@ +#pragma once + +#include "common.h" + +// see: https://www.3dbrew.org/wiki/TIMER_Registers +#define TIMER_VAL0 ((vu16*)0x10003000) +#define TIMER_VAL1 ((vu16*)0x10003004) +#define TIMER_VAL2 ((vu16*)0x10003008) +#define TIMER_VAL3 ((vu16*)0x1000300C) +#define TIMER_CNT0 ((vu16*)0x10003002) +#define TIMER_CNT1 ((vu16*)0x10003006) +#define TIMER_CNT2 ((vu16*)0x1000300A) +#define TIMER_CNT3 ((vu16*)0x1000300E) + +#define TIMER_COUNT_UP 0x0004 +#define TIMER_ACTIVE 0x0080 +#define TICKS_PER_SEC 67027964ULL + +void timer_start( void ); +void timer_stop( void ); +u64 timer_ticks( void ); +u64 timer_msec( void ); +u64 timer_sec( void );