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
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
|
.include "asm/macros.inc"
.include "global.inc"
.text
arm_func_start OS_CheckHeap
OS_CheckHeap: ; 0x037F9D88
stmdb sp!, {r4, r5, r6, r7, r8, lr}
mov r8, r0
mov r7, r1
mov r6, #0
mov r5, r6
mvn r4, #0
bl OS_DisableInterrupts
ldr r1, _037F9F34 ; =OSiHeapInfo
ldr ip, [r1, r8, lsl #2]
mov r1, r4
cmp r7, r1
ldreq r7, [ip]
ldr r2, [ip, #16]
cmp r2, #0
beq _037F9F24
cmp r7, #0
blt _037F9F24
ldr r1, [ip, #4]
cmp r7, r1
bge _037F9F24
mov r1, #12
mul r1, r7, r1
add r3, r2, r1
ldr r2, [r2, r1]
cmp r2, #0
blt _037F9F24
ldr r1, [r3, #8]
cmp r1, #0
beq _037F9E70
ldr r7, [r1]
cmp r7, #0
bne _037F9F24
b _037F9E70
_037F9E0C:
ldr r7, [ip, #8]
cmp r7, r1
bhi _037F9F24
ldr r7, [ip, #12]
cmp r1, r7
bcs _037F9F24
ands r7, r1, #31
bne _037F9F24
ldr lr, [r1, #4]
cmp lr, #0
beq _037F9E44
ldr r7, [lr]
cmp r7, r1
bne _037F9F24
_037F9E44:
ldr r7, [r1, #8]
cmp r7, #64 ; 0x40
bcc _037F9F24
ands r1, r7, #31
bne _037F9F24
add r6, r6, r7
cmp r6, #0
ble _037F9F24
cmp r6, r2
bgt _037F9F24
mov r1, lr
_037F9E70:
cmp r1, #0
bne _037F9E0C
ldr r1, [r3, #4]
cmp r1, #0
beq _037F9F14
ldr r3, [r1]
cmp r3, #0
bne _037F9F24
b _037F9F14
_037F9E94:
ldr r3, [ip, #8]
cmp r3, r1
bhi _037F9F24
ldr r3, [ip, #12]
cmp r1, r3
bcs _037F9F24
ands r3, r1, #31
bne _037F9F24
ldr lr, [r1, #4]
cmp lr, #0
beq _037F9ECC
ldr r3, [lr]
cmp r3, r1
bne _037F9F24
_037F9ECC:
ldr r7, [r1, #8]
cmp r7, #64 ; 0x40
bcc _037F9F24
ands r3, r7, #31
bne _037F9F24
cmp lr, #0
beq _037F9EF4
add r1, r1, r7
cmp r1, lr
bcs _037F9F24
_037F9EF4:
add r6, r6, r7
sub r1, r7, #32
add r5, r5, r1
cmp r6, #0
ble _037F9F24
cmp r6, r2
bgt _037F9F24
mov r1, lr
_037F9F14:
cmp r1, #0
bne _037F9E94
cmp r6, r2
moveq r4, r5
_037F9F24:
bl OS_RestoreInterrupts
mov r0, r4
ldmia sp!, {r4, r5, r6, r7, r8, lr}
bx lr
_037F9F34: .word OSiHeapInfo
arm_func_start OS_CreateHeap
OS_CreateHeap: ; 0x037F9F38
stmdb sp!, {r4, r5, r6, r7, lr}
sub sp, sp, #4
mov r4, r0
mov r6, r1
mov r5, r2
bl OS_DisableInterrupts
ldr r1, _037F9FDC ; =OSiHeapInfo
ldr r7, [r1, r4, lsl #2]
add r1, r6, #31
bic r6, r1, #31
bic r5, r5, #31
mov r4, #0
ldr lr, [r7, #4]
mov r1, #12
b _037F9FC0
_037F9F74:
ldr r3, [r7, #16]
mul r2, r4, r1
add ip, r3, r2
ldr r2, [r3, r2]
cmp r2, #0
bge _037F9FBC
sub r1, r5, r6
str r1, [ip]
mov r2, #0
str r2, [r6]
str r2, [r6, #4]
ldr r1, [ip]
str r1, [r6, #8]
str r6, [ip, #4]
str r2, [ip, #8]
bl OS_RestoreInterrupts
mov r0, r4
b _037F9FD0
_037F9FBC:
add r4, r4, #1
_037F9FC0:
cmp r4, lr
blt _037F9F74
bl OS_RestoreInterrupts
mvn r0, #0
_037F9FD0:
add sp, sp, #4
ldmia sp!, {r4, r5, r6, r7, lr}
bx lr
_037F9FDC: .word OSiHeapInfo
arm_func_start OS_InitAlloc
OS_InitAlloc: ; 0x037F9FE0
stmdb sp!, {r4, r5, r6, r7, r8, lr}
mov r7, r0
mov r5, r1
mov r4, r2
mov r6, r3
bl OS_DisableInterrupts
ldr r1, _037FA084 ; =OSiHeapInfo
str r5, [r1, r7, lsl #2]
mov r2, #12
mul r1, r6, r2
add r3, r5, #20
str r3, [r5, #16]
str r6, [r5, #4]
mov r8, #0
mvn lr, #0
mov ip, r8
b _037FA044
_037FA024:
ldr r6, [r5, #16]
mul r3, r8, r2
add r7, r6, r3
str lr, [r6, r3]
str ip, [r7, #8]
ldr r3, [r7, #8]
str r3, [r7, #4]
add r8, r8, #1
_037FA044:
ldr r3, [r5, #4]
cmp r8, r3
blt _037FA024
mvn r2, #0
str r2, [r5]
ldr r2, [r5, #16]
add r1, r2, r1
add r1, r1, #31
bic r1, r1, #31
str r1, [r5, #8]
bic r1, r4, #31
str r1, [r5, #12]
bl OS_RestoreInterrupts
ldr r0, [r5, #8]
ldmia sp!, {r4, r5, r6, r7, r8, lr}
bx lr
_037FA084: .word OSiHeapInfo
arm_func_start OS_SetCurrentHeap
OS_SetCurrentHeap: ; 0x037FA088
stmdb sp!, {r4, r5, lr}
sub sp, sp, #4
mov r4, r0
mov r5, r1
bl OS_DisableInterrupts
ldr r1, _037FA0C0 ; =OSiHeapInfo
ldr r1, [r1, r4, lsl #2]
ldr r4, [r1]
str r5, [r1]
bl OS_RestoreInterrupts
mov r0, r4
add sp, sp, #4
ldmia sp!, {r4, r5, lr}
bx lr
_037FA0C0: .word OSiHeapInfo
arm_func_start OS_FreeToHeap
OS_FreeToHeap: ; 0x037FA0C4
stmdb sp!, {r4, r5, r6, r7, lr}
sub sp, sp, #4
mov r7, r0
mov r4, r1
mov r6, r2
bl OS_DisableInterrupts
mov r5, r0
ldr r0, _037FA134 ; =OSiHeapInfo
ldr r0, [r0, r7, lsl #2]
cmp r4, #0
ldrlt r4, [r0]
sub r6, r6, #32
ldr r1, [r0, #16]
mov r0, #12
mla r7, r4, r0, r1
ldr r0, [r7, #8]
mov r1, r6
bl DLExtract
str r0, [r7, #8]
ldr r0, [r7, #4]
mov r1, r6
bl DLInsert
str r0, [r7, #4]
mov r0, r5
bl OS_RestoreInterrupts
add sp, sp, #4
ldmia sp!, {r4, r5, r6, r7, lr}
bx lr
_037FA134: .word OSiHeapInfo
arm_func_start OS_AllocFromHeap
OS_AllocFromHeap: ; 0x037FA138
stmdb sp!, {r4, r5, r6, r7, lr}
sub sp, sp, #4
mov r6, r0
mov r5, r1
mov r7, r2
bl OS_DisableInterrupts
mov r4, r0
ldr r1, _037FA24C ; =OSiHeapInfo
ldr r1, [r1, r6, lsl #2]
cmp r1, #0
bne _037FA170
bl OS_RestoreInterrupts
mov r0, #0
b _037FA240
_037FA170:
cmp r5, #0
ldrlt r5, [r1]
ldr r1, [r1, #16]
mov r0, #12
mla r6, r5, r0, r1
add r0, r7, #32
add r0, r0, #31
bic r7, r0, #31
ldr r0, [r6, #4]
mov r5, r0
b _037FA1AC
_037FA19C:
ldr r1, [r5, #8]
cmp r7, r1
ble _037FA1B4
ldr r5, [r5, #4]
_037FA1AC:
cmp r5, #0
bne _037FA19C
_037FA1B4:
cmp r5, #0
bne _037FA1CC
mov r0, r4
bl OS_RestoreInterrupts
mov r0, #0
b _037FA240
_037FA1CC:
ldr r1, [r5, #8]
sub r1, r1, r7
cmp r1, #64 ; 0x40
bcs _037FA1EC
mov r1, r5
bl DLExtract
str r0, [r6, #4]
b _037FA224
_037FA1EC:
str r7, [r5, #8]
add r2, r5, r7
str r1, [r2, #8]
ldr r0, [r5]
str r0, [r5, r7]
ldr r0, [r5, #4]
str r0, [r2, #4]
ldr r0, [r2, #4]
cmp r0, #0
strne r2, [r0]
ldr r0, [r2]
cmp r0, #0
strne r2, [r0, #4]
streq r2, [r6, #4]
_037FA224:
ldr r0, [r6, #8]
mov r1, r5
bl DLAddFront
str r0, [r6, #8]
mov r0, r4
bl OS_RestoreInterrupts
add r0, r5, #32
_037FA240:
add sp, sp, #4
ldmia sp!, {r4, r5, r6, r7, lr}
bx lr
_037FA24C: .word OSiHeapInfo
arm_func_start DLInsert
DLInsert: ; 0x037FA250
stmfd sp!, {lr}
sub sp, sp, #4
mov ip, r0
mov lr, #0
b _037FA274
_037FA264:
cmp r1, ip
bls _037FA27C
mov lr, ip
ldr ip, [ip, #4]
_037FA274:
cmp ip, #0
bne _037FA264
_037FA27C:
str ip, [r1, #4]
str lr, [r1]
cmp ip, #0
beq _037FA2BC
str r1, [ip]
ldr r3, [r1, #8]
add r2, r1, r3
cmp r2, ip
bne _037FA2BC
ldr r2, [ip, #8]
add r2, r3, r2
str r2, [r1, #8]
ldr ip, [ip, #4]
str ip, [r1, #4]
cmp ip, #0
strne r1, [ip]
_037FA2BC:
cmp lr, #0
beq _037FA2F4
str r1, [lr, #4]
ldr r2, [lr, #8]
add r3, lr, r2
cmp r3, r1
bne _037FA2F8
ldr r1, [r1, #8]
add r1, r2, r1
str r1, [lr, #8]
str ip, [lr, #4]
cmp ip, #0
strne lr, [ip]
b _037FA2F8
_037FA2F4:
mov r0, r1
_037FA2F8:
add sp, sp, #4
ldmia sp!, {lr}
bx lr
arm_func_start DLExtract
DLExtract: ; 0x037FA304
ldr r3, [r1, #4]
cmp r3, #0
ldrne r2, [r1]
strne r2, [r3]
ldr r2, [r1]
cmp r2, #0
ldreq r0, [r1, #4]
ldrne r1, [r1, #4]
strne r1, [r2, #4]
bx lr
arm_func_start DLAddFront
DLAddFront: ; 0x037FA32C
str r0, [r1, #4]
mov r2, #0
str r2, [r1]
cmp r0, #0
strne r1, [r0]
mov r0, r1
bx lr
|