diff --git a/source/common/hid.c b/source/common/hid.c index 2ea6396..c6a0e72 100644 --- a/source/common/hid.c +++ b/source/common/hid.c @@ -7,8 +7,8 @@ u32 InputWait() { u32 pad_state_old = HID_STATE; u32 cart_state_old = CART_STATE; u32 sd_state_old = SD_STATE; + u64 timer = timer_start(); delay = (delay) ? 72 : 128; - timer_start(); while (true) { u32 pad_state = HID_STATE; if (!(pad_state & BUTTON_ANY)) { // no buttons pressed @@ -29,7 +29,7 @@ u32 InputWait() { } if ((pad_state == pad_state_old) && (!(pad_state & BUTTON_ARROW) || - (delay && (timer_msec() < delay)))) + (delay && (timer_msec(timer) < delay)))) continue; // make sure the key is pressed u32 t_pressed = 0; diff --git a/source/common/timer.c b/source/common/timer.c index e98dfd3..5f0b53a 100644 --- a/source/common/timer.c +++ b/source/common/timer.c @@ -1,36 +1,48 @@ #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; +u64 timer_start( void ) { + static bool timer_init = true; + if (timer_init) { + // 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; + // start timers + *TIMER_CNT0 = TIMER_ACTIVE; + *TIMER_CNT1 = *TIMER_CNT2 = *TIMER_CNT3 = TIMER_ACTIVE | TIMER_COUNT_UP; + + // timer initialized (no need to do this more than once) + timer_init = false; + } + return timer_ticks( 0 ); } -void timer_stop( void ) { +/*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 timer_ticks( u64 start_time ) { 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; + return ticks - start_time; } -u64 timer_msec( void ) { - return (timer_ticks() * 1000) / TICKS_PER_SEC; +u64 timer_msec( u64 start_time ) { + return timer_ticks( start_time ) / (TICKS_PER_SEC/1000); } -u64 timer_sec( void ) { - return timer_ticks() / TICKS_PER_SEC; +u64 timer_sec( u64 start_time ) { + return timer_ticks( start_time ) / TICKS_PER_SEC; +} + +void wait_msec( u64 msec ) { + u64 timer = timer_start(); + while (timer_msec( timer ) < msec ); } diff --git a/source/common/timer.h b/source/common/timer.h index 658fbcd..76b8f71 100644 --- a/source/common/timer.h +++ b/source/common/timer.h @@ -16,8 +16,8 @@ #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 ); +u64 timer_start( void ); +u64 timer_ticks( u64 start_time ); +u64 timer_msec( u64 start_time ); +u64 timer_sec( u64 start_time ); +void wait_msec( u64 msec ); diff --git a/source/common/ui.c b/source/common/ui.c index 1a59335..ee9c511 100644 --- a/source/common/ui.c +++ b/source/common/ui.c @@ -608,13 +608,14 @@ bool ShowProgress(u64 current, u64 total, const char* opstr) u32 prog_percent = ((total > 0) && (current <= total)) ? (current * 100) / total : 0; char tempstr[64]; char progstr[64]; + u64 timer = 0; static u64 last_sec_remain = 0; if (!current) { - timer_start(); + timer = timer_start(); last_sec_remain = 0; } - u64 sec_elapsed = (total > 0) ? timer_sec() : 0; + u64 sec_elapsed = (total > 0) ? timer_sec( timer ) : 0; u64 sec_total = (current > 0) ? (sec_elapsed * total) / current : 0; u64 sec_remain = (!last_sec_remain) ? (sec_total - sec_elapsed) : ((last_sec_remain + (sec_total - sec_elapsed) + 1) / 2); if (sec_remain >= 60 * 60) sec_remain = 60 * 60 - 1; diff --git a/source/godmode.c b/source/godmode.c index 49d21ed..2af0bc7 100644 --- a/source/godmode.c +++ b/source/godmode.c @@ -1373,7 +1373,7 @@ u32 GodMode() { } SplashInit(); - timer_start(); // show splash for at least 1 sec + u64 timer = timer_start(); // show splash for at least 1 sec InitSDCardFS(); AutoEmuNandBase(true); @@ -1396,7 +1396,7 @@ u32 GodMode() { clipboard->n_entries = 0; memset(panedata, 0x00, 0x10000); - while(timer_sec() < 1); // show splash for at least 1 sec + while(timer_sec( timer ) < 1); // show splash for at least 1 sec ClearScreenF(true, true, COLOR_STD_BG); // clear splash while (true) { // this is the main loop