pokeheartgold/src/timer3.c
2024-11-12 09:37:12 +02:00

55 lines
1.4 KiB
C

#include "global.h"
#include "timer_3.h"
vu64 _021D2214;
int _021D2210;
static void sub_02025438(void);
void Init_Timer3(void) {
_021D2214 = 0;
_021D2210 = 0;
OS_SetTimerControl(OS_TIMER_3, 0);
OS_SetTimerCount(OS_TIMER_3, 0);
OS_SetTimerControl(OS_TIMER_3, (OS_TIMER_PRESCALER_64 << REG_OS_TM3CNT_H_PS_SHIFT) | (1 << REG_OS_TM3CNT_H_I_SHIFT) | (1 << REG_OS_TM3CNT_H_E_SHIFT));
OS_SetIrqFunction(OS_IE_TIMER3, sub_02025438);
OS_EnableIrqMask(OS_IE_TIMER3);
}
static void sub_02025438(void) {
_021D2214++;
if (_021D2210) {
OS_SetTimerControl(OS_TIMER_3, 0);
OS_SetTimerCount(OS_TIMER_3, 0);
OS_SetTimerControl(OS_TIMER_3, (OS_TIMER_PRESCALER_64 << REG_OS_TM3CNT_H_PS_SHIFT) | (1 << REG_OS_TM3CNT_H_I_SHIFT) | (1 << REG_OS_TM3CNT_H_E_SHIFT));
_021D2210 = 0;
}
OS_SetIrqCheckFlag(OS_IE_TIMER3);
OS_SetIrqFunction(OS_IE_TIMER3, sub_02025438);
}
u64 sub_02025488(void) {
vu16 count_lo;
vu64 count_hi;
OSIntrMode bak_psr;
bak_psr = OS_DisableInterrupts();
count_lo = *(REGType16 *)((u32)(REG_TM0CNT_L_ADDR + 4 * OS_TIMER_3));
count_hi = _021D2214 & 0x0000FFFFFFFFFFFFull;
if ((OS_GetRequestIrqMask() & OS_IE_TIMER3) && !(count_lo & 0x8000)) {
count_hi++;
}
OS_RestoreInterrupts(bak_psr);
return (count_hi << 16) | count_lo;
}
u64 sub_020254FC(void) {
return sub_02025488();
}
u64 sub_02025504(u64 a0) {
return (a0 * 64) / OS_SYSTEM_CLOCK;
}