summaryrefslogtreecommitdiff
path: root/arm9/asm/NNS_GFD_gfdi_linkedlist.s
blob: 125a146e13f5797bd6b4eef683498166d26ad4eb (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
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
	.include "asm/macros.inc"
	.include "global.inc"

	.section .text

	arm_func_start NNSi_GfdFreeLnkVram
NNSi_GfdFreeLnkVram: ; 0x020AF334
	stmdb sp!, {r4-r6,lr}
	sub sp, sp, #0x10
	add r3, r2, r3
	str r2, [sp, #0x0]
	str r2, [sp, #0x8]
	str r3, [sp, #0x4]
	str r3, [sp, #0xc]
	ldr r3, [r0, #0x0]
	add r12, sp, #0x0
	cmp r3, #0x0
	beq _020AF418
	mov r6, #0x0
_020AF364:
	ldr r5, [r3, #0x0]
	ldr r4, [r12, #0x4]
	ldr r2, [r3, #0xc]
	cmp r5, r4
	bne _020AF3B8
	ldr r4, [r3, #0x4]
	add r4, r5, r4
	str r4, [sp, #0xc]
	ldr r4, [r3, #0x8]
	cmp r4, #0x0
	strne r2, [r4, #0xc]
	streq r2, [r0, #0x0]
	cmp r2, #0x0
	strne r4, [r2, #0x8]
	ldr r4, [r1, #0x0]
	cmp r4, #0x0
	strne r3, [r4, #0x8]
	ldr r4, [r1, #0x0]
	str r4, [r3, #0xc]
	str r6, [r3, #0x8]
	str r3, [r1, #0x0]
_020AF3B8:
	ldr r5, [r3, #0x0]
	ldr lr, [r3, #0x4]
	ldr r4, [r12, #0x0]
	add lr, r5, lr
	cmp r4, lr
	bne _020AF40C
	str r5, [sp, #0x8]
	ldr r5, [r3, #0x8]
	ldr r4, [r3, #0xc]
	cmp r5, #0x0
	strne r4, [r5, #0xc]
	streq r4, [r0, #0x0]
	cmp r4, #0x0
	strne r5, [r4, #0x8]
	ldr lr, [r1, #0x0]
	cmp lr, #0x0
	strne r3, [lr, #0x8]
	ldr lr, [r1, #0x0]
	str lr, [r3, #0xc]
	str r6, [r3, #0x8]
	str r3, [r1, #0x0]
_020AF40C:
	mov r3, r2
	cmp r2, #0x0
	bne _020AF364
_020AF418:
	ldr r4, [r1, #0x0]
	cmp r4, #0x0
	ldrne r2, [r4, #0xc]
	strne r2, [r1, #0x0]
	cmp r4, #0x0
	addeq sp, sp, #0x10
	moveq r0, #0x0
	ldmeqia sp!, {r4-r6,pc}
	ldr r2, [sp, #0x8]
	mov r1, #0x0
	str r2, [r4, #0x0]
	ldr r3, [sp, #0xc]
	ldr r2, [sp, #0x8]
	sub r2, r3, r2
	str r2, [r4, #0x4]
	str r1, [r4, #0x8]
	str r1, [r4, #0xc]
	ldr r1, [r0, #0x0]
	cmp r1, #0x0
	strne r4, [r1, #0x8]
	ldr r2, [r0, #0x0]
	mov r1, #0x0
	str r2, [r4, #0xc]
	str r1, [r4, #0x8]
	str r4, [r0, #0x0]
	mov r0, #0x1
	add sp, sp, #0x10
	ldmia sp!, {r4-r6,pc}
	arm_func_end NNSi_GfdFreeLnkVram

	arm_func_start NNSi_GfdAllocLnkVramAligned
NNSi_GfdAllocLnkVramAligned: ; 0x020AF488
	stmdb sp!, {r4-r10,lr}
	ldr r4, [r0, #0x0]
	ldr r9, [sp, #0x20]
	cmp r4, #0x0
	mov r5, #0x0
	beq _020AF4EC
	sub r12, r9, #0x1
	mvn lr, r12
_020AF4A8:
	cmp r9, #0x1
	ldrls r8, [r4, #0x0]
	movls r6, r5
	movls r7, r3
	bls _020AF4D0
	ldr r7, [r4, #0x0]
	add r6, r7, r12
	and r8, lr, r6
	sub r6, r8, r7
	add r7, r3, r6
_020AF4D0:
	ldr r10, [r4, #0x4]
	cmp r10, r7
	movcs r5, r4
	bhs _020AF4EC
	ldr r4, [r4, #0xc]
	cmp r4, #0x0
	bne _020AF4A8
_020AF4EC:
	cmp r5, #0x0
	beq _020AF5B8
	cmp r6, #0x0
	beq _020AF54C
	ldr r9, [r1, #0x0]
	cmp r9, #0x0
	ldrne r3, [r9, #0xc]
	strne r3, [r1, #0x0]
	cmp r9, #0x0
	beq _020AF5B8
	ldr r4, [r5, #0x0]
	mov r3, #0x0
	str r4, [r9, #0x0]
	str r6, [r9, #0x4]
	str r3, [r9, #0x8]
	str r3, [r9, #0xc]
	ldr r3, [r0, #0x0]
	cmp r3, #0x0
	strne r9, [r3, #0x8]
	ldr r4, [r0, #0x0]
	mov r3, #0x0
	str r4, [r9, #0xc]
	str r3, [r9, #0x8]
	str r9, [r0, #0x0]
_020AF54C:
	ldr r3, [r5, #0x4]
	sub r3, r3, r7
	str r3, [r5, #0x4]
	ldr r3, [r5, #0x0]
	add r3, r3, r7
	str r3, [r5, #0x0]
	ldr r3, [r5, #0x4]
	cmp r3, #0x0
	bne _020AF5AC
	ldr r4, [r5, #0x8]
	ldr r3, [r5, #0xc]
	cmp r4, #0x0
	strne r3, [r4, #0xc]
	streq r3, [r0, #0x0]
	cmp r3, #0x0
	strne r4, [r3, #0x8]
	ldr r0, [r1, #0x0]
	cmp r0, #0x0
	strne r5, [r0, #0x8]
	ldr r3, [r1, #0x0]
	mov r0, #0x0
	str r3, [r5, #0xc]
	str r0, [r5, #0x8]
	str r5, [r1, #0x0]
_020AF5AC:
	str r8, [r2, #0x0]
	mov r0, #0x1
	ldmia sp!, {r4-r10,pc}
_020AF5B8:
	mov r0, #0x0
	str r0, [r2, #0x0]
	ldmia sp!, {r4-r10,pc}
	arm_func_end NNSi_GfdAllocLnkVramAligned

	arm_func_start NNSi_GfdAllocLnkVram
NNSi_GfdAllocLnkVram: ; 0x020AF5C4
	stmdb sp!, {lr}
	sub sp, sp, #0x4
	mov r12, #0x0
	str r12, [sp, #0x0]
	bl NNSi_GfdAllocLnkVramAligned
	add sp, sp, #0x4
	ldmia sp!, {pc}
	arm_func_end NNSi_GfdAllocLnkVram

	arm_func_start NNSi_GfdAddNewFreeBlock
NNSi_GfdAddNewFreeBlock: ; 0x020AF5E0
	stmdb sp!, {lr}
	sub sp, sp, #0x4
	ldr lr, [r1, #0x0]
	cmp lr, #0x0
	ldrne r12, [lr, #0xc]
	strne r12, [r1, #0x0]
	cmp lr, #0x0
	beq _020AF640
	str r2, [lr, #0x0]
	str r3, [lr, #0x4]
	mov r1, #0x0
	str r1, [lr, #0x8]
	str r1, [lr, #0xc]
	ldr r1, [r0, #0x0]
	add sp, sp, #0x4
	cmp r1, #0x0
	strne lr, [r1, #0x8]
	ldr r2, [r0, #0x0]
	mov r1, #0x0
	str r2, [lr, #0xc]
	str r1, [lr, #0x8]
	str lr, [r0, #0x0]
	mov r0, #0x1
	ldmia sp!, {pc}
_020AF640:
	mov r0, #0x0
	add sp, sp, #0x4
	ldmia sp!, {pc}
	arm_func_end NNSi_GfdAddNewFreeBlock

	arm_func_start NNSi_GfdInitLnkVramBlockPool
NNSi_GfdInitLnkVramBlockPool: ; 0x020AF64C
	stmdb sp!, {r4,lr}
	subs lr, r1, #0x1
	mov r2, #0x0
	beq _020AF684
	mov r4, r0
_020AF660:
	add r12, r2, #0x1
	add r2, r0, r2, lsl #0x4
	add r3, r0, r12, lsl #0x4
	str r3, [r2, #0xc]
	str r4, [r3, #0x8]
	mov r2, r12
	cmp r12, lr
	add r4, r4, #0x10
	blo _020AF660
_020AF684:
	mov r2, #0x0
	str r2, [r0, #0x8]
	add r1, r0, r1, lsl #0x4
	str r2, [r1, #-0x4]
	ldmia sp!, {r4,pc}
	arm_func_end NNSi_GfdInitLnkVramBlockPool

	arm_func_start NNSi_GfdInitLnkVramMan
NNSi_GfdInitLnkVramMan: ; 0x020AF698
	mov r1, #0x0
	str r1, [r0, #0x0]
	bx lr
	arm_func_end NNSi_GfdInitLnkVramMan