diff options
author | PikalaxALT <pikalaxalt@gmail.com> | 2020-08-02 09:51:47 -0400 |
---|---|---|
committer | PikalaxALT <pikalaxalt@gmail.com> | 2020-08-02 09:51:47 -0400 |
commit | 50072e09f8201d20e32884537d56411fd3f856db (patch) | |
tree | 56369c5a54415bcd7ad4de4317b5e32b971cfafa | |
parent | e01a71171f8c40145d2db541b5ad2f73f4063a93 (diff) | |
parent | 5beb002bb50ee5aec156c24352e28c66c46f0474 (diff) |
Merge branch 'master' of github.com:pret/pokediamond into pikalax_work
-rw-r--r-- | arm9/asm/OS_context.s | 78 | ||||
-rw-r--r-- | arm9/asm/OS_message.s | 208 | ||||
-rw-r--r-- | arm9/asm/OS_mutex.s | 170 | ||||
-rw-r--r-- | arm9/asm/OS_valarm.s | 54 | ||||
-rw-r--r-- | arm9/asm/OS_vramExclusive.s | 138 | ||||
-rw-r--r-- | arm9/lib/include/OS_context.h | 6 | ||||
-rw-r--r-- | arm9/lib/include/OS_init.h | 3 | ||||
-rw-r--r-- | arm9/lib/include/OS_interrupt.h | 1 | ||||
-rw-r--r-- | arm9/lib/include/OS_message.h | 28 | ||||
-rw-r--r-- | arm9/lib/include/OS_valarm.h | 25 | ||||
-rw-r--r-- | arm9/lib/include/OS_vramExclusive.h | 10 | ||||
-rw-r--r-- | arm9/lib/include/gx.h | 2 | ||||
-rw-r--r-- | arm9/lib/include/registers.h | 1 | ||||
-rw-r--r-- | arm9/lib/src/OS_context.c | 92 | ||||
-rw-r--r-- | arm9/lib/src/OS_init.c | 2 | ||||
-rw-r--r-- | arm9/lib/src/OS_message.c | 123 | ||||
-rw-r--r-- | arm9/lib/src/OS_valarm.c | 30 | ||||
-rw-r--r-- | arm9/lib/src/OS_vramExclusive.c | 88 |
18 files changed, 405 insertions, 654 deletions
diff --git a/arm9/asm/OS_context.s b/arm9/asm/OS_context.s deleted file mode 100644 index 2c8feeb8..00000000 --- a/arm9/asm/OS_context.s +++ /dev/null @@ -1,78 +0,0 @@ - .include "asm/macros.inc" - .include "global.inc" - - .text - - arm_func_start OS_InitContext -OS_InitContext: ; 0x020CBAC4 - add r1, r1, #0x4 - str r1, [r0, #0x40] - str r2, [r0, #0x44] - sub r2, r2, #0x40 - tst r2, #0x4 - subne r2, r2, #0x4 - str r2, [r0, #0x38] - ands r1, r1, #0x1 - movne r1, #0x3f - moveq r1, #0x1f - str r1, [r0, #0x0] - mov r1, #0x0 - str r1, [r0, #0x4] - str r1, [r0, #0x8] - str r1, [r0, #0xc] - str r1, [r0, #0x10] - str r1, [r0, #0x14] - str r1, [r0, #0x18] - str r1, [r0, #0x1c] - str r1, [r0, #0x20] - str r1, [r0, #0x24] - str r1, [r0, #0x28] - str r1, [r0, #0x2c] - str r1, [r0, #0x30] - str r1, [r0, #0x34] - str r1, [r0, #0x3c] - bx lr - - arm_func_start OS_SaveContext -OS_SaveContext: - stmdb sp!, {r0,lr} - add r0, r0, #0x48 - ldr r1, _020CBB78 ; =CP_SaveContext - blx r1 - ldmia sp!, {r0,lr} - add r1, r0, #0x0 - mrs r2, cpsr - str r2, [r1], #0x4 - mov r0, #0xd3 - msr cpsr_c, r0 - str sp, [r1, #0x40] - msr cpsr_c, r2 - mov r0, #0x1 - stmia r1, {r0-lr} - add r0, pc, #0x8 ; =_020CBB78 - str r0, [r1, #0x3c] - mov r0, #0x0 - bx lr - .balign 4 -_020CBB78: .word CP_SaveContext - - arm_func_start OS_LoadContext -OS_LoadContext: ; 0x020CBB7C - stmdb sp!, {r0,lr} - add r0, r0, #0x48 - ldr r1, _020CBBBC ; =CPi_RestoreContext - blx r1 - ldmia sp!, {r0,lr} - mrs r1, cpsr - bic r1, r1, #0x1f - orr r1, r1, #0xd3 - msr cpsr_c, r1 - ldr r1, [r0], #0x4 - msr spsr_fsxc, r1 - ldr sp, [r0, #0x40] - ldr lr, [r0, #0x3c] - ldmia r0, {r0-lr}^ - mov r0, r0 - subs pc, lr, #0x4 - .balign 4 -_020CBBBC: .word CPi_RestoreContext diff --git a/arm9/asm/OS_message.s b/arm9/asm/OS_message.s deleted file mode 100644 index 1382e436..00000000 --- a/arm9/asm/OS_message.s +++ /dev/null @@ -1,208 +0,0 @@ - .include "asm/macros.inc" - .include "global.inc" - - .text - - arm_func_start OS_ReadMessage -OS_ReadMessage: ; 0x020CBBE0 - stmdb sp!, {r4-r8,lr} - mov r6, r0 - mov r5, r1 - mov r7, r2 - bl OS_DisableInterrupts - ldr r1, [r6, #0x1c] - mov r4, r0 - cmp r1, #0x0 - bne _020CBC3C - and r8, r7, #0x1 - add r7, r6, #0x8 -_020CBC0C: - cmp r8, #0x0 - bne _020CBC28 - mov r0, r4 - bl OS_RestoreInterrupts -_020CBC1C: - mov r0, #0x0 - ldmia sp!, {r4-r8,lr} - bx lr -_020CBC28: - mov r0, r7 - bl OS_SleepThread - ldr r0, [r6, #0x1c] - cmp r0, #0x0 - beq _020CBC0C -_020CBC3C: - cmp r5, #0x0 - ldrne r1, [r6, #0x10] - ldrne r0, [r6, #0x18] - ldrne r0, [r1, r0, lsl #0x2] - strne r0, [r5, #0x0] - mov r0, r4 - bl OS_RestoreInterrupts - mov r0, #0x1 - ldmia sp!, {r4-r8,lr} - bx lr - - arm_func_start OS_JamMessage -OS_JamMessage: ; 0x020CBC64 - stmdb sp!, {r4-r7,lr} - sub sp, sp, #0x4 - mov r6, r0 - mov r5, r1 - mov r7, r2 - bl OS_DisableInterrupts - ldr r1, [r6, #0x14] - ldr r2, [r6, #0x1c] - mov r4, r0 - cmp r1, r2 - bgt _020CBCCC - and r7, r7, #0x1 -_020CBC94: - cmp r7, #0x0 - bne _020CBCB4 - mov r0, r4 - bl OS_RestoreInterrupts - add sp, sp, #0x4 - mov r0, #0x0 - ldmia sp!, {r4-r7,lr} - bx lr -_020CBCB4: - mov r0, r6 - bl OS_SleepThread - ldr r1, [r6, #0x14] - ldr r0, [r6, #0x1c] - cmp r1, r0 - ble _020CBC94 -_020CBCCC: - ldr r0, [r6, #0x18] - add r0, r0, r1 - sub r0, r0, #0x1 - bl _s32_div_f - str r1, [r6, #0x18] - ldr r2, [r6, #0x10] - ldr r1, [r6, #0x18] - add r0, r6, #0x8 - str r5, [r2, r1, lsl #0x2] - ldr r1, [r6, #0x1c] - add r1, r1, #0x1 - str r1, [r6, #0x1c] - bl OS_WakeupThread - mov r0, r4 - bl OS_RestoreInterrupts - mov r0, #0x1 - add sp, sp, #0x4 - ldmia sp!, {r4-r7,lr} - bx lr - - arm_func_start OS_ReceiveMessage -OS_ReceiveMessage: ; 0x020CBD18 - stmdb sp!, {r4-r8,lr} - mov r6, r0 - mov r5, r1 - mov r7, r2 - bl OS_DisableInterrupts - ldr r1, [r6, #0x1c] - mov r4, r0 - cmp r1, #0x0 - bne _020CBD74 - and r8, r7, #0x1 - add r7, r6, #0x8 -_020CBD44: - cmp r8, #0x0 - bne _020CBD60 - mov r0, r4 - bl OS_RestoreInterrupts -_020CBD54: - mov r0, #0x0 - ldmia sp!, {r4-r8,lr} - bx lr -_020CBD60: - mov r0, r7 - bl OS_SleepThread - ldr r0, [r6, #0x1c] - cmp r0, #0x0 - beq _020CBD44 -_020CBD74: - cmp r5, #0x0 - ldrne r1, [r6, #0x10] - ldrne r0, [r6, #0x18] - ldrne r0, [r1, r0, lsl #0x2] - strne r0, [r5, #0x0] - ldr r0, [r6, #0x18] - ldr r1, [r6, #0x14] - add r0, r0, #0x1 - bl _s32_div_f - str r1, [r6, #0x18] - ldr r1, [r6, #0x1c] - mov r0, r6 - sub r1, r1, #0x1 - str r1, [r6, #0x1c] - bl OS_WakeupThread - mov r0, r4 - bl OS_RestoreInterrupts - mov r0, #0x1 - ldmia sp!, {r4-r8,lr} - bx lr - - arm_func_start OS_SendMessage -OS_SendMessage: ; 0x020CBDC4 - stmdb sp!, {r4-r7,lr} - sub sp, sp, #0x4 - mov r6, r0 - mov r5, r1 - mov r7, r2 - bl OS_DisableInterrupts - ldr r2, [r6, #0x1c] - ldr r1, [r6, #0x14] - mov r4, r0 - cmp r1, r2 - bgt _020CBE2C - and r7, r7, #0x1 -_020CBDF4: - cmp r7, #0x0 - bne _020CBE14 - mov r0, r4 - bl OS_RestoreInterrupts - add sp, sp, #0x4 - mov r0, #0x0 - ldmia sp!, {r4-r7,lr} - bx lr -_020CBE14: - mov r0, r6 - bl OS_SleepThread - ldr r2, [r6, #0x1c] - ldr r1, [r6, #0x14] - cmp r1, r2 - ble _020CBDF4 -_020CBE2C: - ldr r0, [r6, #0x18] - add r0, r0, r2 - bl _s32_div_f - ldr r2, [r6, #0x10] - add r0, r6, #0x8 - str r5, [r2, r1, lsl #0x2] - ldr r1, [r6, #0x1c] - add r1, r1, #0x1 - str r1, [r6, #0x1c] - bl OS_WakeupThread - mov r0, r4 - bl OS_RestoreInterrupts - mov r0, #0x1 - add sp, sp, #0x4 - ldmia sp!, {r4-r7,lr} - bx lr - - arm_func_start OS_InitMessageQueue -OS_InitMessageQueue: ; 0x020CBE6C - mov r12, #0x0 - str r12, [r0, #0x4] - ldr r3, [r0, #0x4] - str r3, [r0, #0x0] - str r12, [r0, #0xc] - ldr r3, [r0, #0xc] - str r3, [r0, #0x8] - str r1, [r0, #0x10] - str r2, [r0, #0x14] - str r12, [r0, #0x18] - str r12, [r0, #0x1c] - bx lr 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/asm/OS_vramExclusive.s b/arm9/asm/OS_vramExclusive.s deleted file mode 100644 index ca2caade..00000000 --- a/arm9/asm/OS_vramExclusive.s +++ /dev/null @@ -1,138 +0,0 @@ - .include "asm/macros.inc" - .include "global.inc" - - .section .bss - - .global OSi_vramExclusive -OSi_vramExclusive: ; 0x021D37E4 - .space 0x4 - - .global OSi_vramLockId -OSi_vramLockId: ; 0x021D37E8 - .space 0x14 - - .text - - arm_func_start OsCountZeroBits -OsCountZeroBits: ; 0x020CD5BC - clz r0, r0 - bx lr - - arm_func_start OSi_UnlockVram -OSi_UnlockVram: ; 0x020CD5C4 - stmdb sp!, {r4-r10,lr} - mov r5, r0 - mov r10, r1 - bl OS_DisableInterrupts - ldr r4, _020CD640 ; =OSi_vramExclusive - ldr r1, _020CD644 ; =0x000001FF - ldr r2, [r4, #0x0] - mov r8, r0 - and r0, r5, r2 - and r9, r0, r1 - ldr r6, _020CD648 ; =OSi_vramLockId - mov r7, #0x1 - mov r5, #0x0 -_020CD5F8: - mov r0, r9 - bl OsCountZeroBits - rsbs r2, r0, #0x1f - bmi _020CD630 - mov r1, r2, lsl #0x1 - ldrh r0, [r6, r1] - mvn r2, r7, lsl r2 - cmp r10, r0 - ldreq r0, [r4, #0x0] - and r9, r9, r2 - andeq r0, r0, r2 - streqh r5, [r6, r1] - streq r0, [r4, #0x0] - b _020CD5F8 -_020CD630: - mov r0, r8 - bl OS_RestoreInterrupts - ldmia sp!, {r4-r10,lr} - bx lr - .balign 4 -_020CD640: .word OSi_vramExclusive -_020CD644: .word 0x000001FF -_020CD648: .word OSi_vramLockId - - arm_func_start OSi_TryLockVram -OSi_TryLockVram: ; 0x020CD64C - stmdb sp!, {r4-r9,lr} - sub sp, sp, #0x4 - mov r6, r0 - mov r8, r1 - bl OS_DisableInterrupts - ldr r1, _020CD714 ; =OSi_vramExclusive - mov r7, r0 - ldr r0, [r1, #0x0] - and r5, r6, r0 - ldr sb, _020CD718 ; =OSi_vramLockId - mov r4, #0x1 -_020CD678: - mov r0, r5 - bl OsCountZeroBits - rsbs r1, r0, #0x1f - bmi _020CD6B8 - mov r0, r1, lsl #0x1 - ldrh r0, [r9, r0] - mvn r1, r4, lsl r1 - cmp r8, r0 - and r5, r5, r1 - beq _020CD678 - mov r0, r7 - bl OS_RestoreInterrupts - add sp, sp, #0x4 - mov r0, #0x0 - ldmia sp!, {r4-r9,lr} - bx lr -_020CD6B8: - ldr r0, _020CD71C ; =0x000001FF - and r6, r6, r0 - ldr r4, _020CD718 ; =OSi_vramLockId - ldr sb, _020CD714 ; =OSi_vramExclusive - mov r5, #0x1 -_020CD6CC: - mov r0, r6 - bl OsCountZeroBits - rsbs r1, r0, #0x1f - bmi _020CD6FC - ldr r0, [r9, #0x0] - mvn r2, r5, lsl r1 - orr r0, r0, r5, lsl r1 - mov r1, r1, lsl #0x1 - strh r8, [r4, r1] - str r0, [r9, #0x0] - and r6, r6, r2 - b _020CD6CC -_020CD6FC: - mov r0, r7 - bl OS_RestoreInterrupts - mov r0, #0x1 - add sp, sp, #0x4 - ldmia sp!, {r4-r9,lr} - bx lr - .balign 4 -_020CD714: .word OSi_vramExclusive -_020CD718: .word OSi_vramLockId -_020CD71C: .word 0x000001FF - - arm_func_start OSi_InitVramExclusive -OSi_InitVramExclusive: ; 0x020CD720 - ldr r0, _020CD74C ; =OSi_vramExclusive - mov r3, #0x0 - str r3, [r0, #0x0] - ldr r0, _020CD750 ; =OSi_vramLockId - mov r2, r3 -_020CD734: - mov r1, r3, lsl #0x1 - add r3, r3, #0x1 - strh r2, [r0, r1] - cmp r3, #0x9 - blt _020CD734 - bx lr - .balign 4 -_020CD74C: .word OSi_vramExclusive -_020CD750: .word OSi_vramLockId diff --git a/arm9/lib/include/OS_context.h b/arm9/lib/include/OS_context.h index 7a58a2b1..7c25ce2e 100644 --- a/arm9/lib/include/OS_context.h +++ b/arm9/lib/include/OS_context.h @@ -15,8 +15,8 @@ typedef struct OSContext CPContext cp_context; } OSContext; -extern u32 OS_SaveContext(OSContext *context); -extern void OS_LoadContext(OSContext *context); -extern void OS_InitContext(OSContext *context, u32 func, u32 stack); +void OS_InitContext(register OSContext *context, register u32 newpc, register u32 newsp); +BOOL OS_SaveContext(OSContext *context); +void OS_LoadContext(OSContext *context); #endif //POKEDIAMOND_OS_CONTEXT_H diff --git a/arm9/lib/include/OS_init.h b/arm9/lib/include/OS_init.h index 499c9f6c..f0b80220 100644 --- a/arm9/lib/include/OS_init.h +++ b/arm9/lib/include/OS_init.h @@ -24,6 +24,9 @@ #include "OS_interrupt.h" #include "OS_reset.h" #include "OS_exception.h" +#include "OS_message.h" +#include "OS_valarm.h" +#include "OS_vramExclusive.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_message.h b/arm9/lib/include/OS_message.h new file mode 100644 index 00000000..2dc26d50 --- /dev/null +++ b/arm9/lib/include/OS_message.h @@ -0,0 +1,28 @@ +#ifndef POKEDIAMOND_OS_MESSAGE_H +#define POKEDIAMOND_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 + +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_JamMessage(OSMessageQueue *mq, OSMessage msg, s32 flags); +BOOL OS_ReadMessage(OSMessageQueue *mq, OSMessage *msg, s32 flags); + +#endif //POKEDIAMOND_OS_MESSAGE_H 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/OS_vramExclusive.h b/arm9/lib/include/OS_vramExclusive.h new file mode 100644 index 00000000..d7c3ef92 --- /dev/null +++ b/arm9/lib/include/OS_vramExclusive.h @@ -0,0 +1,10 @@ +#ifndef POKEDIAMOND_OS_VRAMEXCLUSIVE_H +#define POKEDIAMOND_OS_VRAMEXCLUSIVE_H + +#include "nitro/types.h" + +void OSi_InitVramExclusive(void); +BOOL OSi_TryLockVram(u16 bank, u16 lockId); +void OSi_UnlockVram(u16 bank, u16 lockId); + +#endif //POKEDIAMOND_OS_VRAMEXCLUSIVE_H diff --git a/arm9/lib/include/gx.h b/arm9/lib/include/gx.h index bc89aa04..f9478851 100644 --- a/arm9/lib/include/gx.h +++ b/arm9/lib/include/gx.h @@ -4,6 +4,7 @@ #include "fx.h" #include "MI_memory.h" #include "MI_dma.h" +#include "OS_vramExclusive.h" //temporary while other files aren't decompiled @@ -11,7 +12,6 @@ void GXi_NopClearFifo128_(void *); void MI_Copy16B(const void *, void *); void MI_Copy64B(void *src, void *dst); void MIi_CpuCopy32(const void *src, void *dst, u32 size); -void OSi_UnlockVram(u16, u16); #include "GXcommon.h" #include "GX_struct_2d.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_context.c b/arm9/lib/src/OS_context.c new file mode 100644 index 00000000..38b722ba --- /dev/null +++ b/arm9/lib/src/OS_context.c @@ -0,0 +1,92 @@ +#include "OS_context.h" +#include "consts.h" +#include "function_target.h" + +ARM_FUNC asm void OS_InitContext(register OSContext *context, register u32 newpc, register u32 newsp) +{ + add newpc, newpc, #4 + str newpc, [context, #0x40] + + str newsp, [context, #0x44] + sub newsp, newsp, #HW_SVC_STACK_SIZE + + tst newsp, #4 + subne newsp, newsp, #4 + str newsp, [context, #0x38] + + ands r1, newpc, #1 + movne r1, #0x3f + moveq r1, #0x1f + str r1, [context] + + mov r1, #0 + str r1, [context, #0x4] + str r1, [context, #0x8] + str r1, [context, #0xc] + str r1, [context, #0x10] + str r1, [context, #0x14] + str r1, [context, #0x18] + str r1, [context, #0x1c] + str r1, [context, #0x20] + str r1, [context, #0x24] + str r1, [context, #0x28] + str r1, [context, #0x2c] + str r1, [context, #0x30] + str r1, [context, #0x34] + str r1, [context, #0x3c] + + bx lr +} + +ARM_FUNC asm BOOL OS_SaveContext(register OSContext* context) +{ + stmfd sp!, {lr, r0} + add r0, r0, #0x48 + ldr r1, =CP_SaveContext + blx r1 + ldmfd sp!, {lr, r0} + + add r1, r0, #0 + + mrs r2, cpsr + str r2, [r1], #0x4 + + mov r0, #0xd3 + msr cpsr_c, r0 + str sp, [r1, #0x40] + msr cpsr_c, r2 + + mov r0, #1 + stmia r1, {r0-r14} + add r0, pc, #8 + str r0, [r1, #0x3c] + + mov r0, #0 + bx lr +} + +ARM_FUNC asm void OS_LoadContext(register OSContext* context) +{ + stmfd sp!, {lr, r0} + add r0, r0, #0x48 + + ldr r1, =CPi_RestoreContext + blx r1 + ldmfd sp!, {lr, r0} + + mrs r1, cpsr + bic r1, r1, #HW_PSR_CPU_MODE_MASK + orr r1, r1, #0xd3 + msr cpsr_c, r1 + + ldr r1, [r0], #0x4 + msr spsr_fsxc, r1 + + ldr sp, [r0, #0x40] + + ldr lr, [r0, #0x3c] + ldmia r0, {r0-r14}^ + nop + + subs pc, lr, #4 +} diff --git a/arm9/lib/src/OS_init.c b/arm9/lib/src/OS_init.c index c93b1584..5bd435e7 100644 --- a/arm9/lib/src/OS_init.c +++ b/arm9/lib/src/OS_init.c @@ -3,8 +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); extern void PM_Init(void); diff --git a/arm9/lib/src/OS_message.c b/arm9/lib/src/OS_message.c new file mode 100644 index 00000000..9f7beb8e --- /dev/null +++ b/arm9/lib/src/OS_message.c @@ -0,0 +1,123 @@ +#include "OS_message.h" +#include "function_target.h" +#include "OS_system.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_JamMessage(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); + } + } + + mq->firstIndex = (mq->firstIndex + mq->msgCount - 1) % mq->msgCount; + mq->msgArray[mq->firstIndex] = msg; + mq->usedCount++; + + OS_WakeupThread(&mq->queueReceive); + + (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/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; + } +} diff --git a/arm9/lib/src/OS_vramExclusive.c b/arm9/lib/src/OS_vramExclusive.c new file mode 100644 index 00000000..5ce10f4a --- /dev/null +++ b/arm9/lib/src/OS_vramExclusive.c @@ -0,0 +1,88 @@ +#include "OS_vramExclusive.h" +#include "function_target.h" +#include "OS_system.h" + +static u32 OSi_vramExclusive; +static u16 OSi_vramLockId[9]; + +static u32 OsCountZeroBits(register u32 bitmap); + +ARM_FUNC static asm u32 OsCountZeroBits(register u32 bitmap) +{ + clz r0, r0 + bx lr +} + +ARM_FUNC void OSi_InitVramExclusive(void) +{ + OSi_vramExclusive = 0x0000; + + for (s32 i = 0; i < 9; i++) + { + OSi_vramLockId[i] = 0; + } +} + +ARM_FUNC BOOL OSi_TryLockVram(u16 bank, u16 lockId) +{ + u32 workMap; + s32 zeroBits; + OSIntrMode enabled = OS_DisableInterrupts(); + + workMap = (u32)(bank & OSi_vramExclusive); + while (TRUE) + { + zeroBits = (s32)(31 - OsCountZeroBits(workMap)); + if (zeroBits < 0) + { + break; + } + workMap &= ~(0x00000001 << zeroBits); + if (OSi_vramLockId[zeroBits] != lockId) + { + (void)OS_RestoreInterrupts(enabled); + return FALSE; + } + } + + workMap = (u32)(bank & 0x01ff); + while (TRUE) + { + zeroBits = (s32)(31 - OsCountZeroBits(workMap)); + if (zeroBits < 0) + { + break; + } + workMap &= ~(0x00000001 << zeroBits); + OSi_vramLockId[zeroBits] = lockId; + OSi_vramExclusive |= (0x00000001 << zeroBits); + } + + (void)OS_RestoreInterrupts(enabled); + return TRUE; +} + +ARM_FUNC void OSi_UnlockVram(u16 bank, u16 lockId) +{ + u32 workMap; + s32 zeroBits; + OSIntrMode enabled = OS_DisableInterrupts(); + + workMap = (u32)(bank & OSi_vramExclusive & 0x01ff); + while (TRUE) + { + zeroBits = (s32)(31- OsCountZeroBits((u32)workMap)); + if (zeroBits < 0) + { + break; + } + workMap &= ~(0x00000001 << zeroBits); + if (OSi_vramLockId[zeroBits] == lockId) + { + OSi_vramLockId[zeroBits] = 0; + OSi_vramExclusive &= ~(0x00000001 << zeroBits); + } + } + + (void)OS_RestoreInterrupts(enabled); +} |