diff options
Diffstat (limited to 'arm9')
| -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); +} | 
