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
129
130
131
132
133
134
135
136
137
138
|
.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
|