diff options
author | PikalaxALT <PikalaxALT@users.noreply.github.com> | 2020-08-01 19:46:28 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-08-01 19:46:28 -0400 |
commit | 5beb002bb50ee5aec156c24352e28c66c46f0474 (patch) | |
tree | ce7500bf47a4ec829f0c06cf617034d339d04f8f | |
parent | f7208c80c780bb666630a343cfe5912009dd5eaa (diff) | |
parent | eb4007dce800281754d17e989eab1cf51708f164 (diff) |
Merge pull request #253 from red031000/master
arm9 OS_vramExclusive
-rw-r--r-- | arm9/asm/OS_vramExclusive.s | 138 | ||||
-rw-r--r-- | arm9/lib/include/OS_init.h | 1 | ||||
-rw-r--r-- | arm9/lib/include/OS_vramExclusive.h | 10 | ||||
-rw-r--r-- | arm9/lib/include/gx.h | 2 | ||||
-rw-r--r-- | arm9/lib/src/OS_init.c | 1 | ||||
-rw-r--r-- | arm9/lib/src/OS_vramExclusive.c | 88 |
6 files changed, 100 insertions, 140 deletions
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_init.h b/arm9/lib/include/OS_init.h index 7427fed8..f0b80220 100644 --- a/arm9/lib/include/OS_init.h +++ b/arm9/lib/include/OS_init.h @@ -26,6 +26,7 @@ #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_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/src/OS_init.c b/arm9/lib/src/OS_init.c index 152a5534..5bd435e7 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 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_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); +} |