summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--arm7/asm/OS_message.s147
-rw-r--r--arm7/lib/include/OS_init.h1
-rw-r--r--arm7/lib/include/OS_message.h14
-rw-r--r--arm7/lib/src/OS_message.c97
-rw-r--r--arm9/lib/include/OS_message.h25
-rw-r--r--arm9/lib/src/OS_message.c1
-rw-r--r--include/nitro/OS_message_shared.h34
7 files changed, 153 insertions, 166 deletions
diff --git a/arm7/asm/OS_message.s b/arm7/asm/OS_message.s
deleted file mode 100644
index ade175de..00000000
--- a/arm7/asm/OS_message.s
+++ /dev/null
@@ -1,147 +0,0 @@
- .include "asm/macros.inc"
- .include "global.inc"
-
- .text
-
- arm_func_start OS_ReadMessage
-OS_ReadMessage: ; 0x037F980C
- stmdb sp!, {r4, r5, r6, r7, r8, lr}
- mov r6, r0
- mov r5, r1
- mov r7, r2
- bl OS_DisableInterrupts
- mov r4, r0
- and r8, r7, #1
- add r7, r6, #8
- b _037F9850
-_037F9830:
- cmp r8, #0
- bne _037F9848
- mov r0, r4
- bl OS_RestoreInterrupts
- mov r0, #0
- b _037F987C
-_037F9848:
- mov r0, r7
- bl OS_SleepThread
-_037F9850:
- ldr r0, [r6, #28]
- cmp r0, #0
- beq _037F9830
- cmp r5, #0
- ldrne r1, [r6, #16]
- ldrne r0, [r6, #24]
- ldrne r0, [r1, r0, lsl #2]
- strne r0, [r5]
- mov r0, r4
- bl OS_RestoreInterrupts
- mov r0, #1
-_037F987C:
- ldmia sp!, {r4, r5, r6, r7, r8, lr}
- bx lr
-
- arm_func_start OS_ReceiveMessage
-OS_ReceiveMessage: ; 0x037F9884
- stmdb sp!, {r4, r5, r6, r7, r8, lr}
- mov r6, r0
- mov r5, r1
- mov r7, r2
- bl OS_DisableInterrupts
- mov r4, r0
- and r8, r7, #1
- add r7, r6, #8
- b _037F98C8
-_037F98A8:
- cmp r8, #0
- bne _037F98C0
- mov r0, r4
- bl OS_RestoreInterrupts
- mov r0, #0
- b _037F991C
-_037F98C0:
- mov r0, r7
- bl OS_SleepThread
-_037F98C8:
- ldr r0, [r6, #28]
- cmp r0, #0
- beq _037F98A8
- cmp r5, #0
- ldrne r1, [r6, #16]
- ldrne r0, [r6, #24]
- ldrne r0, [r1, r0, lsl #2]
- strne r0, [r5]
- ldr r0, [r6, #24]
- add r0, r0, #1
- ldr r1, [r6, #20]
- bl _s32_div_f
- str r1, [r6, #24]
- ldr r0, [r6, #28]
- sub r0, r0, #1
- str r0, [r6, #28]
- mov r0, r6
- bl OS_WakeupThread
- mov r0, r4
- bl OS_RestoreInterrupts
- mov r0, #1
-_037F991C:
- ldmia sp!, {r4, r5, r6, r7, r8, lr}
- bx lr
-
- arm_func_start OS_SendMessage
-OS_SendMessage: ; 0x037F9924
- stmdb sp!, {r4, r5, r6, r7, lr}
- sub sp, sp, #4
- mov r6, r0
- mov r5, r1
- mov r7, r2
- bl OS_DisableInterrupts
- mov r4, r0
- and r7, r7, #1
- b _037F9968
-_037F9948:
- cmp r7, #0
- bne _037F9960
- mov r0, r4
- bl OS_RestoreInterrupts
- mov r0, #0
- b _037F99AC
-_037F9960:
- mov r0, r6
- bl OS_SleepThread
-_037F9968:
- ldr r2, [r6, #28]
- ldr r1, [r6, #20]
- cmp r1, r2
- ble _037F9948
- ldr r0, [r6, #24]
- add r0, r0, r2
- bl _s32_div_f
- ldr r0, [r6, #16]
- str r5, [r0, r1, lsl #2]
- ldr r0, [r6, #28]
- add r0, r0, #1
- str r0, [r6, #28]
- add r0, r6, #8
- bl OS_WakeupThread
- mov r0, r4
- bl OS_RestoreInterrupts
- mov r0, #1
-_037F99AC:
- add sp, sp, #4
- ldmia sp!, {r4, r5, r6, r7, lr}
- bx lr
-
- arm_func_start OS_InitMessageQueue
-OS_InitMessageQueue: ; 0x037F99B8
- mov ip, #0
- str ip, [r0, #4]
- ldr r3, [r0, #4]
- str r3, [r0]
- str ip, [r0, #12]
- ldr r3, [r0, #12]
- str r3, [r0, #8]
- str r1, [r0, #16]
- str r2, [r0, #20]
- str ip, [r0, #24]
- str ip, [r0, #28]
- bx lr
diff --git a/arm7/lib/include/OS_init.h b/arm7/lib/include/OS_init.h
index b4836234..afb1d9a2 100644
--- a/arm7/lib/include/OS_init.h
+++ b/arm7/lib/include/OS_init.h
@@ -14,6 +14,7 @@
#include "OS_irqTable.h"
#include "OS_timer.h"
#include "OS_tick.h"
+#include "OS_message.h"
void OS_Init(void);
diff --git a/arm7/lib/include/OS_message.h b/arm7/lib/include/OS_message.h
new file mode 100644
index 00000000..d5b122e0
--- /dev/null
+++ b/arm7/lib/include/OS_message.h
@@ -0,0 +1,14 @@
+#ifndef POKEDIAMOND_ARM7_OS_MESSAGE_H
+#define POKEDIAMOND_ARM7_OS_MESSAGE_H
+
+#include "OS_thread.h"
+#include "OS_context.h"
+#include "nitro/types.h"
+#include "nitro/OS_message_shared.h"
+
+void OS_InitMessageQueue(OSMessageQueue *mq, OSMessage *msgArray, s32 msgCount);
+BOOL OS_SendMessage(OSMessageQueue *mq, OSMessage msg, s32 flags);
+BOOL OS_ReceiveMessage(OSMessageQueue *mq, OSMessage *msg, s32 flags);
+BOOL OS_ReadMessage(OSMessageQueue *mq, OSMessage *msg, s32 flags);
+
+#endif //POKEDIAMOND_ARM7_OS_MESSAGE_H
diff --git a/arm7/lib/src/OS_message.c b/arm7/lib/src/OS_message.c
new file mode 100644
index 00000000..62817517
--- /dev/null
+++ b/arm7/lib/src/OS_message.c
@@ -0,0 +1,97 @@
+#include "OS_message.h"
+#include "function_target.h"
+#include "OS_system.h"
+#include "OS_thread.h"
+
+ARM_FUNC void OS_InitMessageQueue(OSMessageQueue *mq, OSMessage *msgArray, s32 msgCount)
+{
+ OS_InitThreadQueue(&mq->queueSend);
+ OS_InitThreadQueue(&mq->queueReceive);
+ mq->msgArray = msgArray;
+ mq->msgCount = msgCount;
+ mq->firstIndex = 0;
+ mq->usedCount = 0;
+}
+
+ARM_FUNC BOOL OS_SendMessage(OSMessageQueue *mq, OSMessage msg, s32 flags)
+{
+ OSIntrMode enabled = OS_DisableInterrupts();
+
+ while (mq->msgCount <= mq->usedCount)
+ {
+ if (!(flags & OS_MESSAGE_BLOCK))
+ {
+ (void)OS_RestoreInterrupts(enabled);
+ return FALSE;
+ }
+ else
+ {
+ OS_SleepThread(&mq->queueSend);
+ }
+ }
+
+ s32 lastIndex = (mq->firstIndex + mq->usedCount) % mq->msgCount;
+ mq->msgArray[lastIndex] = msg;
+ mq->usedCount++;
+
+ OS_WakeupThread(&mq->queueReceive);
+
+ (void)OS_RestoreInterrupts(enabled);
+ return TRUE;
+}
+
+ARM_FUNC BOOL OS_ReceiveMessage(OSMessageQueue *mq, OSMessage *msg, s32 flags)
+{
+ OSIntrMode enabled = OS_DisableInterrupts();
+
+ while (mq->usedCount == 0)
+ {
+ if (!(flags & OS_MESSAGE_BLOCK))
+ {
+ (void)OS_RestoreInterrupts(enabled);
+ return FALSE;
+ }
+ else
+ {
+ OS_SleepThread(&mq->queueReceive);
+ }
+ }
+
+ if (msg != NULL)
+ {
+ *msg = mq->msgArray[mq->firstIndex];
+ }
+ mq->firstIndex = (mq->firstIndex + 1) % mq->msgCount;
+ mq->usedCount--;
+
+ OS_WakeupThread(&mq->queueSend);
+
+ (void)OS_RestoreInterrupts(enabled);
+ return TRUE;
+}
+
+ARM_FUNC BOOL OS_ReadMessage(OSMessageQueue *mq, OSMessage *msg, s32 flags)
+{
+ OSIntrMode enabled = OS_DisableInterrupts();
+
+ while (mq->usedCount == 0)
+ {
+ if (!(flags & OS_MESSAGE_BLOCK))
+ {
+ (void)OS_RestoreInterrupts(enabled);
+ return FALSE;
+ }
+ else
+ {
+ OS_SleepThread(&mq->queueReceive);
+ }
+ }
+
+ if (msg != NULL)
+ {
+ *msg = mq->msgArray[mq->firstIndex];
+ }
+
+ (void)OS_RestoreInterrupts(enabled);
+ return TRUE;
+}
diff --git a/arm9/lib/include/OS_message.h b/arm9/lib/include/OS_message.h
index 2dc26d50..b9c570db 100644
--- a/arm9/lib/include/OS_message.h
+++ b/arm9/lib/include/OS_message.h
@@ -1,23 +1,10 @@
-#ifndef POKEDIAMOND_OS_MESSAGE_H
-#define POKEDIAMOND_OS_MESSAGE_H
+#ifndef POKEDIAMOND_ARM9_OS_MESSAGE_H
+#define POKEDIAMOND_ARM9_OS_MESSAGE_H
-#include "nitro/types.h"
#include "OS_thread.h"
-
-typedef void *OSMessage;
-
-typedef struct OSMessageQueue
-{
- OSThreadQueue queueSend;
- OSThreadQueue queueReceive;
- OSMessage *msgArray;
- s32 msgCount;
- s32 firstIndex;
- s32 usedCount;
-} OSMessageQueue;
-
-#define OS_MESSAGE_NOBLOCK 0
-#define OS_MESSAGE_BLOCK 1
+#include "OS_context.h"
+#include "nitro/types.h"
+#include "nitro/OS_message_shared.h"
void OS_InitMessageQueue(OSMessageQueue *mq, OSMessage *msgArray, s32 msgCount);
BOOL OS_SendMessage(OSMessageQueue *mq, OSMessage msg, s32 flags);
@@ -25,4 +12,4 @@ BOOL OS_ReceiveMessage(OSMessageQueue *mq, OSMessage *msg, s32 flags);
BOOL OS_JamMessage(OSMessageQueue *mq, OSMessage msg, s32 flags);
BOOL OS_ReadMessage(OSMessageQueue *mq, OSMessage *msg, s32 flags);
-#endif //POKEDIAMOND_OS_MESSAGE_H
+#endif //POKEDIAMOND_ARM9_OS_MESSAGE_H
diff --git a/arm9/lib/src/OS_message.c b/arm9/lib/src/OS_message.c
index 9f7beb8e..3b5c33b0 100644
--- a/arm9/lib/src/OS_message.c
+++ b/arm9/lib/src/OS_message.c
@@ -1,6 +1,7 @@
#include "OS_message.h"
#include "function_target.h"
#include "OS_system.h"
+#include "OS_thread.h"
ARM_FUNC void OS_InitMessageQueue(OSMessageQueue *mq, OSMessage *msgArray, s32 msgCount)
{
diff --git a/include/nitro/OS_message_shared.h b/include/nitro/OS_message_shared.h
new file mode 100644
index 00000000..993111a2
--- /dev/null
+++ b/include/nitro/OS_message_shared.h
@@ -0,0 +1,34 @@
+/*
+ * NOTE:
+ * This file is shared between ARM9 and ARM7
+ * DO NOT PUT PROC SPECIFIC CODE IN HERE
+ * Thank You!
+ */
+
+/*
+ * DO NOT INCLUDE THIS FILE DIRECTLY
+ * Include OS_message.h from the specific proc's lib
+ */
+
+#ifndef POKEDIAMOND_OS_MESSAGE_SHARED_H
+#define POKEDIAMOND_OS_MESSAGE_SHARED_H
+
+#include "nitro/types.h"
+#include "nitro/OS_thread_shared.h"
+
+typedef void *OSMessage;
+
+#define OS_MESSAGE_NOBLOCK 0
+#define OS_MESSAGE_BLOCK 1
+
+typedef struct OSMessageQueue
+{
+ OSThreadQueue queueSend;
+ OSThreadQueue queueReceive;
+ OSMessage *msgArray;
+ s32 msgCount;
+ s32 firstIndex;
+ s32 usedCount;
+} OSMessageQueue;
+
+#endif //POKEDIAMOND_OS_MESSAGE_SHARED_H