summaryrefslogtreecommitdiff
path: root/arm9/asm/OS_vramExclusive.s
diff options
context:
space:
mode:
Diffstat (limited to 'arm9/asm/OS_vramExclusive.s')
-rw-r--r--arm9/asm/OS_vramExclusive.s128
1 files changed, 128 insertions, 0 deletions
diff --git a/arm9/asm/OS_vramExclusive.s b/arm9/asm/OS_vramExclusive.s
new file mode 100644
index 00000000..7b780f69
--- /dev/null
+++ b/arm9/asm/OS_vramExclusive.s
@@ -0,0 +1,128 @@
+ .include "asm/macros.inc"
+ .include "global.inc"
+
+ .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