summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--arm9/asm/OS_mutex.s170
-rw-r--r--arm9/asm/OS_valarm.s54
-rw-r--r--arm9/lib/include/OS_init.h1
-rw-r--r--arm9/lib/include/OS_interrupt.h1
-rw-r--r--arm9/lib/include/OS_valarm.h25
-rw-r--r--arm9/lib/include/registers.h1
-rw-r--r--arm9/lib/src/OS_init.c1
-rw-r--r--arm9/lib/src/OS_valarm.c30
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;
+ }
+}