diff options
Diffstat (limited to 'arm9')
| -rw-r--r-- | arm9/asm/OS_mutex.s | 170 | ||||
| -rw-r--r-- | arm9/asm/OS_valarm.s | 54 | ||||
| -rw-r--r-- | arm9/lib/include/OS_init.h | 1 | ||||
| -rw-r--r-- | arm9/lib/include/OS_interrupt.h | 1 | ||||
| -rw-r--r-- | arm9/lib/include/OS_valarm.h | 25 | ||||
| -rw-r--r-- | arm9/lib/include/registers.h | 1 | ||||
| -rw-r--r-- | arm9/lib/src/OS_init.c | 1 | ||||
| -rw-r--r-- | arm9/lib/src/OS_valarm.c | 30 | 
8 files changed, 58 insertions, 225 deletions
| diff --git a/arm9/asm/OS_mutex.s b/arm9/asm/OS_mutex.s deleted file mode 100644 index 0970a10d..00000000 --- a/arm9/asm/OS_mutex.s +++ /dev/null @@ -1,170 +0,0 @@ -    .include "asm/macros.inc" -    .include "global.inc" - -    .text - -	arm_func_start OSi_DequeueItem -OSi_DequeueItem: ; 0x020CBE9C -	ldr r2, [r1, #0x10] -	ldr r1, [r1, #0x14] -	cmp r2, #0x0 -	streq r1, [r0, #0x8c] -	strne r1, [r2, #0x14] -	cmp r1, #0x0 -	streq r2, [r0, #0x88] -	strne r2, [r1, #0x10] -	bx lr - -	arm_func_start OSi_EnqueueTail -OSi_EnqueueTail: ; 0x020CBEC0 -	ldr r2, [r0, #0x8c] -	cmp r2, #0x0 -	streq r1, [r0, #0x88] -	strne r1, [r2, #0x10] -	str r2, [r1, #0x14] -	mov r2, #0x0 -	str r2, [r1, #0x10] -	str r1, [r0, #0x8c] -	bx lr - -	arm_func_start OS_TryLockMutex -OS_TryLockMutex: ; 0x020CBEE4 -	stmdb sp!, {r4-r6,lr} -	mov r5, r0 -	bl OS_DisableInterrupts -	ldr r2, [r5, #0x8] -	ldr r1, _020CBF54 ; =OSi_ThreadInfo -	mov r4, r0 -	cmp r2, #0x0 -	ldr r0, [r1, #0x4] -	bne _020CBF28 -	str r0, [r5, #0x8] -	ldr r2, [r5, #0xc] -	mov r1, r5 -	add r2, r2, #0x1 -	str r2, [r5, #0xc] -	bl OSi_EnqueueTail -	mov r6, #0x1 -	b _020CBF40 -_020CBF28: -	cmp r2, r0 -	ldreq r0, [r5, #0xc] -	moveq r6, #0x1 -	addeq r0, r0, #0x1 -	streq r0, [r5, #0xc] -	movne r6, #0x0 -_020CBF40: -	mov r0, r4 -	bl OS_RestoreInterrupts -	mov r0, r6 -	ldmia sp!, {r4-r6,lr} -	bx lr -	.balign 4 -_020CBF54: .word OSi_ThreadInfo - -	arm_func_start OSi_UnlockAllMutex -OSi_UnlockAllMutex: ; 0x020CBF58 -	stmdb sp!, {r4-r6,lr} -	mov r6, r0 -	ldr r0, [r6, #0x88] -	cmp r0, #0x0 -	ldmeqia sp!, {r4-r6,lr} -	bxeq lr -	add r5, r6, #0x88 -	mov r4, #0x0 -_020CBF78: -	mov r0, r5 -	bl OSi_RemoveMutexLinkFromQueue -	str r4, [r0, #0xc] -	str r4, [r0, #0x8] -	bl OS_WakeupThread -	ldr r0, [r6, #0x88] -	cmp r0, #0x0 -	bne _020CBF78 -	ldmia sp!, {r4-r6,lr} -	bx lr - -	arm_func_start OS_UnlockMutex -OS_UnlockMutex: ; 0x020CBFA0 -	stmdb sp!, {r4-r5,lr} -	sub sp, sp, #0x4 -	mov r5, r0 -	bl OS_DisableInterrupts -	ldr r1, _020CC00C ; =OSi_ThreadInfo -	mov r4, r0 -	ldr r0, [r1, #0x4] -	ldr r1, [r5, #0x8] -	cmp r1, r0 -	bne _020CBFF8 -	ldr r1, [r5, #0xc] -	sub r1, r1, #0x1 -	str r1, [r5, #0xc] -	ldr r1, [r5, #0xc] -	cmp r1, #0x0 -	bne _020CBFF8 -	mov r1, r5 -	bl OSi_DequeueItem -	mov r1, #0x0 -	mov r0, r5 -	str r1, [r5, #0x8] -	bl OS_WakeupThread -_020CBFF8: -	mov r0, r4 -	bl OS_RestoreInterrupts -	add sp, sp, #0x4 -	ldmia sp!, {r4-r5,lr} -	bx lr -	.balign 4 -_020CC00C: .word OSi_ThreadInfo - -	arm_func_start OS_LockMutex -OS_LockMutex: ; 0x020CC010 -	stmdb sp!, {r4-r7,lr} -	sub sp, sp, #0x4 -	mov r5, r0 -	bl OS_DisableInterrupts -	ldr r1, _020CC098 ; =OSi_ThreadInfo -	mov r4, r0 -	ldr r7, [r1, #0x4] -	mov r6, #0x0 -_020CC030: -	ldr r0, [r5, #0x8] -	cmp r0, #0x0 -	bne _020CC05C -	str r7, [r5, #0x8] -	ldr r1, [r5, #0xc] -	mov r0, r7 -	add r2, r1, #0x1 -	mov r1, r5 -	str r2, [r5, #0xc] -	bl OSi_EnqueueTail -	b _020CC084 -_020CC05C: -	cmp r0, r7 -	ldreq r0, [r5, #0xc] -	addeq r0, r0, #0x1 -	streq r0, [r5, #0xc] -	beq _020CC084 -	mov r0, r5 -	str r5, [r7, #0x84] -	bl OS_SleepThread -	str r6, [r7, #0x84] -	b _020CC030 -_020CC084: -	mov r0, r4 -	bl OS_RestoreInterrupts -	add sp, sp, #0x4 -	ldmia sp!, {r4-r7,lr} -	bx lr -	.balign 4 -_020CC098: .word OSi_ThreadInfo - -	arm_func_start OS_InitMutex -OS_InitMutex: ; 0x020CC09C -	mov r2, #0x0 -	str r2, [r0, #0x4] -	ldr r1, [r0, #0x4] -	str r1, [r0, #0x0] -	str r2, [r0, #0x8] -	str r2, [r0, #0xc] -	bx lr diff --git a/arm9/asm/OS_valarm.s b/arm9/asm/OS_valarm.s deleted file mode 100644 index 1b282c71..00000000 --- a/arm9/asm/OS_valarm.s +++ /dev/null @@ -1,54 +0,0 @@ -    .include "asm/macros.inc" -    .include "global.inc" - -	.section .bss - -	.global OSi_UseVAlarm -OSi_UseVAlarm: ; 0x021D37C8 -	.space 0x4 - -	.global OSi_PreviousVCount -OSi_PreviousVCount: ; 0x021D37CC -	.space 0x4 - -	.global OSi_VFrameCount -OSi_VFrameCount: ; 0x021D37D0 -	.space 0x4 - -	.global OSi_VAlarmQueue -OSi_VAlarmQueue: ; 0x021D37D4 -	.space 0x8 - -    .text - -	arm_func_start OS_InitVAlarm -OS_InitVAlarm: ; 0x020CD28C -	stmdb sp!, {lr} -	sub sp, sp, #0x4 -	ldr r2, _020CD2EC ; =OSi_UseVAlarm -	ldrh r0, [r2, #0x0] -	cmp r0, #0x0 -	addne sp, sp, #0x4 -	ldmneia sp!, {lr} -	bxne lr -	ldr r1, _020CD2F0 ; =OSi_VAlarmQueue -	mov r3, #0x0 -	mov r12, #0x1 -	mov r0, #0x4 -	strh r12, [r2, #0x0] -	str r3, [r1, #0x0] -	str r3, [r1, #0x4] -	bl OS_DisableIrqMask -	ldr r1, _020CD2F4 ; =OSi_VFrameCount -	mov r2, #0x0 -	ldr r0, _020CD2F8 ; =OSi_PreviousVCount -	str r2, [r1, #0x0] -	str r2, [r0, #0x0] -	add sp, sp, #0x4 -	ldmia sp!, {lr} -	bx lr -	.balign 4 -_020CD2EC: .word OSi_UseVAlarm -_020CD2F0: .word OSi_VAlarmQueue -_020CD2F4: .word OSi_VFrameCount -_020CD2F8: .word OSi_PreviousVCount diff --git a/arm9/lib/include/OS_init.h b/arm9/lib/include/OS_init.h index ea1fa66b..7427fed8 100644 --- a/arm9/lib/include/OS_init.h +++ b/arm9/lib/include/OS_init.h @@ -25,6 +25,7 @@  #include "OS_reset.h"  #include "OS_exception.h"  #include "OS_message.h" +#include "OS_valarm.h"  void OS_Init(void); diff --git a/arm9/lib/include/OS_interrupt.h b/arm9/lib/include/OS_interrupt.h index d84cae00..893e6d65 100644 --- a/arm9/lib/include/OS_interrupt.h +++ b/arm9/lib/include/OS_interrupt.h @@ -4,6 +4,7 @@  #include "consts.h"  #include "nitro/OS_interrupt_shared.h" +#define OS_IE_V_COUNT       (1UL << REG_OS_IE_VE_SHIFT)  #define OS_IE_TIMER0        (1UL << REG_OS_IE_T0_SHIFT)  #define OS_IE_TIMER1        (1UL << REG_OS_IE_T1_SHIFT) diff --git a/arm9/lib/include/OS_valarm.h b/arm9/lib/include/OS_valarm.h new file mode 100644 index 00000000..b4850f9d --- /dev/null +++ b/arm9/lib/include/OS_valarm.h @@ -0,0 +1,25 @@ +#ifndef POKEDIAMOND_OS_VALARM_H +#define POKEDIAMOND_OS_VALARM_H + +#include "nitro/types.h" +#include "OS_alarm.h" + +typedef struct OSiVAlarm OSVAlarm; +struct OSiVAlarm +{ +    OSAlarmHandler handler; +    void *arg; +    u32 tag; +    u32 frame; +    s16 fire; +    s16 delay; +    OSVAlarm *prev; +    OSVAlarm *next; +    BOOL period; +    BOOL finish; +    BOOL canceled; +}; + +void OS_InitVAlarm(void); + +#endif //POKEDIAMOND_OS_VALARM_H diff --git a/arm9/lib/include/registers.h b/arm9/lib/include/registers.h index 6bfb52ac..b2915f8c 100644 --- a/arm9/lib/include/registers.h +++ b/arm9/lib/include/registers.h @@ -345,6 +345,7 @@  #define reg_MI_MCD1                (*(REGType32v *)0x4100010)  #define reg_CARD_DATA              (*(REGType32v *)0x4100010) //? +#define REG_OS_IE_VE_SHIFT                                 2  #define REG_OS_IE_T0_SHIFT                                 3  #define REG_OS_IE_T1_SHIFT                                 4 diff --git a/arm9/lib/src/OS_init.c b/arm9/lib/src/OS_init.c index c93b1584..152a5534 100644 --- a/arm9/lib/src/OS_init.c +++ b/arm9/lib/src/OS_init.c @@ -3,7 +3,6 @@  extern void PXI_Init(void);  extern void MI_Init(void); -extern void OS_InitVAlarm(void);  extern void OSi_InitVramExclusive(void);  extern void CTRDG_Init(void);  extern void CARD_Init(void); diff --git a/arm9/lib/src/OS_valarm.c b/arm9/lib/src/OS_valarm.c new file mode 100644 index 00000000..37329147 --- /dev/null +++ b/arm9/lib/src/OS_valarm.c @@ -0,0 +1,30 @@ +#include "OS_valarm.h" +#include "function_target.h" +#include "OS_interrupt.h" + +static struct OSiVAlarmQueue +{ +    OSVAlarm *head; +    OSVAlarm *tail; +} OSi_VAlarmQueue; + +static u16 OSi_UseVAlarm = FALSE; + +static s32 OSi_VFrameCount; +static s32 OSi_PreviousVCount; + +ARM_FUNC void OS_InitVAlarm(void) +{ +    if (!OSi_UseVAlarm) +    { +        OSi_UseVAlarm = TRUE; + +        OSi_VAlarmQueue.head = NULL; +        OSi_VAlarmQueue.tail = NULL; + +        (void)OS_DisableIrqMask(OS_IE_V_COUNT); + +        OSi_VFrameCount = 0; +        OSi_PreviousVCount = 0; +    } +} | 
