mirror of
https://github.com/pret/pokediamond.git
synced 2026-09-10 10:06:32 -05:00
Merge pull request #242 from red031000/master
split mod05_021E1374 to mod05_02E1AD8 + arm9 OS_alarm
This commit is contained in:
@@ -530,6 +530,8 @@ Overlay MODULE_05
|
||||
Object mod05_021DBE04.o
|
||||
Object mod05_021DBEF4.o
|
||||
Object mod05_021DC0B8.o
|
||||
Object mod05_021E1374.o
|
||||
Object mod05_021E1AD8.o
|
||||
Object module_05.o
|
||||
}
|
||||
|
||||
|
||||
@@ -1,350 +0,0 @@
|
||||
.include "asm/macros.inc"
|
||||
.include "global.inc"
|
||||
|
||||
.section .bss
|
||||
|
||||
.global OSi_UseAlarm
|
||||
OSi_UseAlarm: ; 0x021D37BC
|
||||
.space 0x4
|
||||
|
||||
.global OSi_AlarmQueue
|
||||
OSi_AlarmQueue: ; 0x021D37C0
|
||||
.space 0x8
|
||||
|
||||
.text
|
||||
|
||||
arm_func_start OSi_AlarmHandler
|
||||
OSi_AlarmHandler: ; 0x020CCE00
|
||||
stmdb sp!, {r0,lr}
|
||||
bl OSi_ArrangeTimer
|
||||
ldmia sp!, {r0,lr}
|
||||
bx lr
|
||||
|
||||
arm_func_start OSi_ArrangeTimer
|
||||
OSi_ArrangeTimer: ; 0x020CCE10
|
||||
stmdb sp!, {r4-r5,lr}
|
||||
sub sp, sp, #0x4
|
||||
ldr r1, _020CCF1C ; =0x04000106
|
||||
mov r2, #0x0
|
||||
mov r0, #0x10
|
||||
strh r2, [r1, #0x0]
|
||||
bl OS_DisableIrqMask
|
||||
ldr r0, _020CCF20 ; =0x027E0000
|
||||
add r0, r0, #0x3000
|
||||
ldr r1, [r0, #0xff8]
|
||||
orr r1, r1, #0x10
|
||||
str r1, [r0, #0xff8]
|
||||
bl OS_GetTick
|
||||
ldr r2, _020CCF24 ; =OSi_AlarmQueue
|
||||
ldr r4, [r2, #0x0]
|
||||
cmp r4, #0x0
|
||||
addeq sp, sp, #0x4
|
||||
ldmeqia sp!, {r4-r5,lr}
|
||||
bxeq lr
|
||||
ldr r3, [r4, #0x10]
|
||||
ldr r12, [r4, #0xc]
|
||||
cmp r1, r3
|
||||
cmpeq r0, r12
|
||||
bhs _020CCE84
|
||||
mov r0, r4
|
||||
bl OSi_SetTimer
|
||||
add sp, sp, #0x4
|
||||
ldmia sp!, {r4-r5,lr}
|
||||
bx lr
|
||||
_020CCE84:
|
||||
ldr r1, [r4, #0x18]
|
||||
cmp r1, #0x0
|
||||
moveq r0, #0x0
|
||||
streq r0, [r2, #0x4]
|
||||
str r1, [r2, #0x0]
|
||||
movne r0, #0x0
|
||||
strne r0, [r1, #0x14]
|
||||
ldr r2, [r4, #0x1c]
|
||||
ldr r1, [r4, #0x20]
|
||||
mov r0, #0x0
|
||||
cmp r1, r0
|
||||
ldr r5, [r4, #0x0]
|
||||
cmpeq r2, r0
|
||||
streq r0, [r4, #0x0]
|
||||
cmp r5, #0x0
|
||||
beq _020CCECC
|
||||
ldr r0, [r4, #0x4]
|
||||
blx r5
|
||||
_020CCECC:
|
||||
ldr r2, [r4, #0x1c]
|
||||
ldr r0, [r4, #0x20]
|
||||
mov r1, #0x0
|
||||
cmp r0, r1
|
||||
cmpeq r2, r1
|
||||
beq _020CCEF4
|
||||
mov r0, r4
|
||||
mov r2, r1
|
||||
str r5, [r4, #0x0]
|
||||
bl OSi_InsertAlarm
|
||||
_020CCEF4:
|
||||
ldr r0, _020CCF24 ; =OSi_AlarmQueue
|
||||
ldr r0, [r0, #0x0]
|
||||
cmp r0, #0x0
|
||||
addeq sp, sp, #0x4
|
||||
ldmeqia sp!, {r4-r5,lr}
|
||||
bxeq lr
|
||||
bl OSi_SetTimer
|
||||
add sp, sp, #0x4
|
||||
ldmia sp!, {r4-r5,lr}
|
||||
bx lr
|
||||
.balign 4
|
||||
_020CCF1C: .word 0x04000106
|
||||
_020CCF20: .word 0x027E0000
|
||||
_020CCF24: .word OSi_AlarmQueue
|
||||
|
||||
arm_func_start OS_CancelAlarm
|
||||
OS_CancelAlarm: ; 0x020CCF28
|
||||
stmdb sp!, {r4-r5,lr}
|
||||
sub sp, sp, #0x4
|
||||
mov r5, r0
|
||||
bl OS_DisableInterrupts
|
||||
ldr r1, [r5, #0x0]
|
||||
mov r4, r0
|
||||
cmp r1, #0x0
|
||||
bne _020CCF58
|
||||
bl OS_RestoreInterrupts
|
||||
add sp, sp, #0x4
|
||||
ldmia sp!, {r4-r5,lr}
|
||||
bx lr
|
||||
_020CCF58:
|
||||
ldr r0, [r5, #0x18]
|
||||
cmp r0, #0x0
|
||||
ldreq r2, [r5, #0x14]
|
||||
ldreq r1, _020CCFBC ; =OSi_AlarmQueue
|
||||
streq r2, [r1, #0x4]
|
||||
ldrne r1, [r5, #0x14]
|
||||
strne r1, [r0, #0x14]
|
||||
ldr r1, [r5, #0x14]
|
||||
cmp r1, #0x0
|
||||
strne r0, [r1, #0x18]
|
||||
bne _020CCF98
|
||||
ldr r1, _020CCFBC ; =OSi_AlarmQueue
|
||||
cmp r0, #0x0
|
||||
str r0, [r1, #0x0]
|
||||
beq _020CCF98
|
||||
bl OSi_SetTimer
|
||||
_020CCF98:
|
||||
mov r1, #0x0
|
||||
str r1, [r5, #0x0]
|
||||
str r1, [r5, #0x1c]
|
||||
mov r0, r4
|
||||
str r1, [r5, #0x20]
|
||||
bl OS_RestoreInterrupts
|
||||
add sp, sp, #0x4
|
||||
ldmia sp!, {r4-r5,lr}
|
||||
bx lr
|
||||
.balign 4
|
||||
_020CCFBC: .word OSi_AlarmQueue
|
||||
|
||||
arm_func_start OS_SetAlarm
|
||||
OS_SetAlarm: ; 0x020CCFC0
|
||||
stmdb sp!, {r4-r7,lr}
|
||||
sub sp, sp, #0x4
|
||||
movs r6, r0
|
||||
mov r5, r1
|
||||
mov r4, r2
|
||||
mov r7, r3
|
||||
beq _020CCFE8
|
||||
ldr r0, [r6, #0x0]
|
||||
cmp r0, #0x0
|
||||
beq _020CCFEC
|
||||
_020CCFE8:
|
||||
bl OS_Terminate
|
||||
_020CCFEC:
|
||||
bl OS_DisableInterrupts
|
||||
mov r1, #0x0
|
||||
str r1, [r6, #0x1c]
|
||||
str r1, [r6, #0x20]
|
||||
str r7, [r6, #0x0]
|
||||
ldr r1, [sp, #0x18]
|
||||
mov r7, r0
|
||||
str r1, [r6, #0x4]
|
||||
bl OS_GetTick
|
||||
adds r3, r5, r0
|
||||
adc r2, r4, r1
|
||||
mov r0, r6
|
||||
mov r1, r3
|
||||
bl OSi_InsertAlarm
|
||||
mov r0, r7
|
||||
bl OS_RestoreInterrupts
|
||||
add sp, sp, #0x4
|
||||
ldmia sp!, {r4-r7,lr}
|
||||
bx lr
|
||||
|
||||
arm_func_start OSi_InsertAlarm
|
||||
OSi_InsertAlarm: ; 0x020CD038
|
||||
stmdb sp!, {r4-r8,lr}
|
||||
mov r8, r0
|
||||
ldr r4, [r8, #0x1c]
|
||||
ldr r3, [r8, #0x20]
|
||||
mov r0, #0x0
|
||||
cmp r3, r0
|
||||
mov r7, r1
|
||||
mov r6, r2
|
||||
cmpeq r4, r0
|
||||
beq _020CD0B4
|
||||
bl OS_GetTick
|
||||
ldr r6, [r8, #0x28]
|
||||
ldr r7, [r8, #0x24]
|
||||
cmp r6, r1
|
||||
cmpeq r7, r0
|
||||
bhs _020CD0B4
|
||||
ldr r5, [r8, #0x1c]
|
||||
ldr r4, [r8, #0x20]
|
||||
subs r0, r0, r7
|
||||
mov r2, r5
|
||||
mov r3, r4
|
||||
sbc r1, r1, r6
|
||||
bl _ll_udiv
|
||||
mov r2, #0x1
|
||||
adds r2, r0, r2
|
||||
adc r0, r1, #0x0
|
||||
umull r3, r1, r5, r2
|
||||
mla r1, r5, r0, r1
|
||||
mla r1, r4, r2, r1
|
||||
adds r7, r7, r3
|
||||
adc r6, r6, r1
|
||||
_020CD0B4:
|
||||
str r7, [r8, #0xc]
|
||||
ldr r0, _020CD174 ; =OSi_AlarmQueue
|
||||
str r6, [r8, #0x10]
|
||||
ldr r4, [r0, #0x0]
|
||||
cmp r4, #0x0
|
||||
beq _020CD134
|
||||
mov r1, #0x0
|
||||
_020CD0D0:
|
||||
ldr r2, [r4, #0xc]
|
||||
ldr r0, [r4, #0x10]
|
||||
subs r3, r7, r2
|
||||
sbc r2, r6, r0
|
||||
subs r0, r3, r1
|
||||
sbcs r0, r2, r1
|
||||
bge _020CD128
|
||||
ldr r0, [r4, #0x14]
|
||||
str r0, [r8, #0x14]
|
||||
str r8, [r4, #0x14]
|
||||
str r4, [r8, #0x18]
|
||||
ldr r0, [r8, #0x14]
|
||||
cmp r0, #0x0
|
||||
strne r8, [r0, #0x18]
|
||||
ldmneia sp!, {r4-r8,lr}
|
||||
bxne lr
|
||||
ldr r1, _020CD174 ; =OSi_AlarmQueue
|
||||
mov r0, r8
|
||||
str r8, [r1, #0x0]
|
||||
bl OSi_SetTimer
|
||||
ldmia sp!, {r4-r8,lr}
|
||||
bx lr
|
||||
_020CD128:
|
||||
ldr r4, [r4, #0x18]
|
||||
cmp r4, #0x0
|
||||
bne _020CD0D0
|
||||
_020CD134:
|
||||
ldr r1, _020CD174 ; =OSi_AlarmQueue
|
||||
mov r0, #0x0
|
||||
str r0, [r8, #0x18]
|
||||
ldr r0, [r1, #0x4]
|
||||
str r8, [r1, #0x4]
|
||||
str r0, [r8, #0x14]
|
||||
cmp r0, #0x0
|
||||
strne r8, [r0, #0x18]
|
||||
ldmneia sp!, {r4-r8,lr}
|
||||
bxne lr
|
||||
mov r0, r8
|
||||
str r8, [r1, #0x4]
|
||||
str r8, [r1, #0x0]
|
||||
bl OSi_SetTimer
|
||||
ldmia sp!, {r4-r8,lr}
|
||||
bx lr
|
||||
.balign 4
|
||||
_020CD174: .word OSi_AlarmQueue
|
||||
|
||||
arm_func_start OS_CreateAlarm
|
||||
OS_CreateAlarm: ; 0x020CD178
|
||||
mov r1, #0x0
|
||||
str r1, [r0, #0x0]
|
||||
str r1, [r0, #0x8]
|
||||
bx lr
|
||||
|
||||
arm_func_start OS_IsAlarmAvailable
|
||||
OS_IsAlarmAvailable: ; 0x020CD188
|
||||
ldr r0, _020CD194 ; =OSi_UseAlarm
|
||||
ldrh r0, [r0, #0x0]
|
||||
bx lr
|
||||
.balign 4
|
||||
_020CD194: .word OSi_UseAlarm
|
||||
|
||||
arm_func_start OS_InitAlarm
|
||||
OS_InitAlarm: ; 0x020CD198
|
||||
stmdb sp!, {lr}
|
||||
sub sp, sp, #0x4
|
||||
ldr r1, _020CD1E8 ; =OSi_UseAlarm
|
||||
ldrh r0, [r1, #0x0]
|
||||
cmp r0, #0x0
|
||||
addne sp, sp, #0x4
|
||||
ldmneia sp!, {lr}
|
||||
bxne lr
|
||||
mov r0, #0x1
|
||||
strh r0, [r1, #0x0]
|
||||
bl OSi_SetTimerReserved
|
||||
ldr r1, _020CD1EC ; =OSi_AlarmQueue
|
||||
mov r2, #0x0
|
||||
mov r0, #0x10
|
||||
str r2, [r1, #0x0]
|
||||
str r2, [r1, #0x4]
|
||||
bl OS_DisableIrqMask
|
||||
add sp, sp, #0x4
|
||||
ldmia sp!, {lr}
|
||||
bx lr
|
||||
.balign 4
|
||||
_020CD1E8: .word OSi_UseAlarm
|
||||
_020CD1EC: .word OSi_AlarmQueue
|
||||
|
||||
arm_func_start OSi_SetTimer
|
||||
OSi_SetTimer: ; 0x020CD1F0
|
||||
stmdb sp!, {r4-r5,lr}
|
||||
sub sp, sp, #0x4
|
||||
mov r4, r0
|
||||
bl OS_GetTick
|
||||
ldr r3, _020CD27C ; =0x04000106
|
||||
mov r2, #0x0
|
||||
strh r2, [r3, #0x0]
|
||||
ldr r12, [r4, #0xc]
|
||||
ldr r3, [r4, #0x10]
|
||||
subs r5, r12, r0
|
||||
sbc r4, r3, r1
|
||||
ldr r1, _020CD280 ; =OSi_AlarmHandler
|
||||
mov r0, #0x1
|
||||
bl OSi_EnterTimerCallback
|
||||
mov r2, #0x0
|
||||
subs r0, r5, r2
|
||||
sbcs r0, r4, r2
|
||||
ldrlt r2, _020CD284 ; =0x0000FFFE
|
||||
blt _020CD254
|
||||
mov r0, #0x10000
|
||||
subs r0, r5, r0
|
||||
sbcs r0, r4, r2
|
||||
mvnlt r0, r5
|
||||
movlt r0, r0, lsl #0x10
|
||||
movlt r2, r0, lsr #0x10
|
||||
_020CD254:
|
||||
ldr r0, _020CD288 ; =0x04000104
|
||||
ldr r1, _020CD27C ; =0x04000106
|
||||
strh r2, [r0, #0x0]
|
||||
mov r2, #0xc1
|
||||
mov r0, #0x10
|
||||
strh r2, [r1, #0x0]
|
||||
bl OS_EnableIrqMask
|
||||
add sp, sp, #0x4
|
||||
ldmia sp!, {r4-r5,lr}
|
||||
bx lr
|
||||
.balign 4
|
||||
_020CD27C: .word 0x04000106
|
||||
_020CD280: .word OSi_AlarmHandler
|
||||
_020CD284: .word 0x0000FFFE
|
||||
_020CD288: .word 0x04000104
|
||||
@@ -6,8 +6,20 @@
|
||||
#include "OS_tick.h"
|
||||
#include "nitro/OS_alarm_shared.h"
|
||||
|
||||
void OS_CancelAlarm(OSAlarm *alarm);
|
||||
struct OSiAlarmQueue
|
||||
{
|
||||
OSAlarm *head;
|
||||
OSAlarm *tail;
|
||||
};
|
||||
|
||||
static void OSi_SetTimer(OSAlarm *alarm);
|
||||
void OS_InitAlarm(void);
|
||||
BOOL OS_IsAlarmAvailable(void);
|
||||
void OS_CreateAlarm(OSAlarm *alarm);
|
||||
static void OSi_InsertAlarm(OSAlarm *alarm, OSTick fire);
|
||||
void OS_SetAlarm(OSAlarm *alarm, OSTick tick, OSAlarmHandler handler, void *arg);
|
||||
void OS_CancelAlarm(OSAlarm *alarm);
|
||||
void OSi_AlarmHandler(void *arg);
|
||||
static void OSi_ArrangeTimer(void);
|
||||
|
||||
#endif //POKEDIAMOND_ARM9_OS_ALARM_H
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
#include "nitro/OS_interrupt_shared.h"
|
||||
|
||||
#define OS_IE_TIMER0 (1UL << REG_OS_IE_T0_SHIFT)
|
||||
#define OS_IE_TIMER1 (1UL << REG_OS_IE_T1_SHIFT)
|
||||
|
||||
extern OSIrqFunction OS_IRQTable[];
|
||||
extern OSIrqCallbackInfo OSi_IrqCallbackInfo[8];
|
||||
|
||||
@@ -346,6 +346,7 @@
|
||||
#define reg_CARD_DATA (*(REGType32v *)0x4100010) //?
|
||||
|
||||
#define REG_OS_IE_T0_SHIFT 3
|
||||
#define REG_OS_IE_T1_SHIFT 4
|
||||
|
||||
#define REG_OS_TM0CNT_H_I_MASK 0x0040
|
||||
#define REG_OS_TM0CNT_H_E_MASK 0x0080
|
||||
|
||||
250
arm9/lib/src/OS_alarm.c
Normal file
250
arm9/lib/src/OS_alarm.c
Normal file
@@ -0,0 +1,250 @@
|
||||
#include "function_target.h"
|
||||
#include "consts.h"
|
||||
#include "OS_alarm.h"
|
||||
#include "OS_interrupt.h"
|
||||
#include "OS_irqTable.h"
|
||||
#include "OS_terminate_proc.h"
|
||||
#include "OS_system.h"
|
||||
|
||||
static struct OSiAlarmQueue OSi_AlarmQueue;
|
||||
|
||||
static u16 OSi_UseAlarm = FALSE;
|
||||
|
||||
ARM_FUNC static void OSi_SetTimer(OSAlarm *alarm)
|
||||
{
|
||||
OSTick tick = OS_GetTick();
|
||||
|
||||
OS_SetTimerControl(OS_TIMER_1, 0);
|
||||
|
||||
s64 delta = (s64)(alarm->fire - tick);
|
||||
|
||||
OSi_EnterTimerCallback(OS_TIMER_1, OSi_AlarmHandler, NULL);
|
||||
|
||||
u16 timerCount;
|
||||
if (delta < 0)
|
||||
{
|
||||
timerCount = (u16)~1;
|
||||
}
|
||||
else if (delta < 0x10000)
|
||||
{
|
||||
timerCount = (u16)(~delta);
|
||||
}
|
||||
else
|
||||
{
|
||||
timerCount = 0;
|
||||
}
|
||||
|
||||
OS_SetTimerCount((OSTimer)OS_TIMER_1, timerCount);
|
||||
OS_SetTimerControl(OS_TIMER_1, (u16)OSi_TICK_TIMERCONTROL);
|
||||
|
||||
(void)OS_EnableIrqMask(OS_IE_TIMER1);
|
||||
}
|
||||
|
||||
ARM_FUNC void OS_InitAlarm(void)
|
||||
{
|
||||
if (!OSi_UseAlarm)
|
||||
{
|
||||
OSi_UseAlarm = TRUE;
|
||||
|
||||
OSi_SetTimerReserved(OS_TIMER_1);
|
||||
|
||||
OSi_AlarmQueue.head = NULL;
|
||||
OSi_AlarmQueue.tail = NULL;
|
||||
|
||||
(void)OS_DisableIrqMask(OS_IE_TIMER1);
|
||||
}
|
||||
}
|
||||
|
||||
ARM_FUNC BOOL OS_IsAlarmAvailable(void)
|
||||
{
|
||||
return OSi_UseAlarm;
|
||||
}
|
||||
|
||||
ARM_FUNC void OS_CreateAlarm(OSAlarm *alarm)
|
||||
{
|
||||
alarm->handler = 0;
|
||||
alarm->tag = 0;
|
||||
}
|
||||
|
||||
ARM_FUNC static void OSi_InsertAlarm(OSAlarm *alarm, OSTick fire)
|
||||
{
|
||||
if (alarm->period > 0)
|
||||
{
|
||||
OSTick tick = OS_GetTick();
|
||||
|
||||
fire = alarm->start;
|
||||
if (alarm->start < tick)
|
||||
{
|
||||
fire += alarm->period * ((tick - alarm->start) / alarm->period + 1);
|
||||
}
|
||||
}
|
||||
|
||||
alarm->fire = fire;
|
||||
|
||||
OSAlarm *prev;
|
||||
OSAlarm *next;
|
||||
|
||||
for (next = OSi_AlarmQueue.head; next; next = next->next)
|
||||
{
|
||||
if ((s64)(fire - next->fire) >= 0)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
alarm->prev = next->prev;
|
||||
next->prev = alarm;
|
||||
alarm->next = next;
|
||||
prev = alarm->prev;
|
||||
if (prev)
|
||||
{
|
||||
prev->next = alarm;
|
||||
}
|
||||
else
|
||||
{
|
||||
OSi_AlarmQueue.head = alarm;
|
||||
OSi_SetTimer(alarm);
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
alarm->next = 0;
|
||||
prev = OSi_AlarmQueue.tail;
|
||||
OSi_AlarmQueue.tail = alarm;
|
||||
alarm->prev = prev;
|
||||
if (prev)
|
||||
{
|
||||
prev->next = alarm;
|
||||
}
|
||||
else
|
||||
{
|
||||
OSi_AlarmQueue.head = OSi_AlarmQueue.tail = alarm;
|
||||
OSi_SetTimer(alarm);
|
||||
}
|
||||
}
|
||||
|
||||
ARM_FUNC void OS_SetAlarm(OSAlarm * alarm, OSTick tick, OSAlarmHandler handler, void *arg)
|
||||
{
|
||||
if (!alarm || alarm->handler)
|
||||
{
|
||||
OS_Terminate();
|
||||
}
|
||||
|
||||
OSIntrMode enabled = OS_DisableInterrupts();
|
||||
|
||||
alarm->period = 0;
|
||||
|
||||
alarm->handler = handler;
|
||||
alarm->arg = arg;
|
||||
|
||||
OSi_InsertAlarm(alarm, OS_GetTick() + tick);
|
||||
|
||||
(void)OS_RestoreInterrupts(enabled);
|
||||
}
|
||||
|
||||
ARM_FUNC void OS_CancelAlarm(OSAlarm *alarm)
|
||||
{
|
||||
OSIntrMode enabled = OS_DisableInterrupts();
|
||||
|
||||
if (!alarm->handler)
|
||||
{
|
||||
(void)OS_RestoreInterrupts(enabled);
|
||||
return;
|
||||
}
|
||||
|
||||
OSAlarm *next = alarm->next;
|
||||
|
||||
if (!next)
|
||||
{
|
||||
OSi_AlarmQueue.tail = alarm->prev;
|
||||
}
|
||||
else
|
||||
{
|
||||
next->prev = alarm->prev;
|
||||
}
|
||||
|
||||
if (alarm->prev)
|
||||
{
|
||||
alarm->prev->next = next;
|
||||
}
|
||||
else
|
||||
{
|
||||
OSi_AlarmQueue.head = next;
|
||||
if (next)
|
||||
{
|
||||
OSi_SetTimer(next);
|
||||
}
|
||||
}
|
||||
|
||||
alarm->handler = NULL;
|
||||
alarm->period = 0;
|
||||
|
||||
(void)OS_RestoreInterrupts(enabled);
|
||||
}
|
||||
|
||||
ARM_FUNC asm void OSi_AlarmHandler(void *arg)
|
||||
{
|
||||
stmfd sp!, {r0, lr}
|
||||
bl OSi_ArrangeTimer
|
||||
ldmfd sp!, {r0, lr}
|
||||
bx lr
|
||||
}
|
||||
|
||||
ARM_FUNC static void OSi_ArrangeTimer(void)
|
||||
{
|
||||
OS_SetTimerControl(OS_TIMER_1, 0);
|
||||
|
||||
(void)OS_DisableIrqMask(OS_IE_TIMER1);
|
||||
|
||||
OS_SetIrqCheckFlag(OS_IE_TIMER1);
|
||||
|
||||
OSTick tick = OS_GetTick();
|
||||
|
||||
OSAlarm *alarm = OSi_AlarmQueue.head;
|
||||
|
||||
if (!alarm)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (tick < alarm->fire)
|
||||
{
|
||||
OSi_SetTimer(alarm);
|
||||
return;
|
||||
}
|
||||
|
||||
OSAlarm *next = alarm->next;
|
||||
OSi_AlarmQueue.head = next;
|
||||
|
||||
if (!next)
|
||||
{
|
||||
OSi_AlarmQueue.tail = NULL;
|
||||
}
|
||||
else
|
||||
{
|
||||
next->prev = NULL;
|
||||
}
|
||||
|
||||
OSAlarmHandler handler = alarm->handler;
|
||||
|
||||
if (!alarm->period)
|
||||
{
|
||||
alarm->handler = NULL;
|
||||
}
|
||||
|
||||
if (handler)
|
||||
{
|
||||
(handler)(alarm->arg);
|
||||
}
|
||||
|
||||
if (alarm->period > 0)
|
||||
{
|
||||
alarm->handler = handler;
|
||||
OSi_InsertAlarm(alarm, 0);
|
||||
}
|
||||
|
||||
if (OSi_AlarmQueue.head)
|
||||
{
|
||||
OSi_SetTimer(OSi_AlarmQueue.head);
|
||||
}
|
||||
}
|
||||
1178
arm9/modules/05/asm/mod05_021E1374.s
Normal file
1178
arm9/modules/05/asm/mod05_021E1374.s
Normal file
File diff suppressed because it is too large
Load Diff
2119
arm9/modules/05/asm/mod05_021E1AD8.s
Normal file
2119
arm9/modules/05/asm/mod05_021E1AD8.s
Normal file
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user