summaryrefslogtreecommitdiff
path: root/arm9/asm/OS_vramExclusive.s
blob: ca2caade8ada952111b5b918deb74b1d106fb13b (plain)
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