diff options
-rw-r--r-- | arm7/asm/OS_message.s | 147 | ||||
-rw-r--r-- | arm7/lib/include/OS_init.h | 1 | ||||
-rw-r--r-- | arm7/lib/include/OS_message.h | 14 | ||||
-rw-r--r-- | arm7/lib/src/OS_message.c | 97 | ||||
-rw-r--r-- | arm9/lib/include/OS_message.h | 25 | ||||
-rw-r--r-- | arm9/lib/src/OS_message.c | 1 | ||||
-rw-r--r-- | include/nitro/OS_message_shared.h | 34 |
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 |