diff options
Diffstat (limited to 'arm7')
-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 |
4 files changed, 112 insertions, 147 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; +} |