1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
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
|