summaryrefslogtreecommitdiff
path: root/arm9/asm/MSL_Common_file_pos.s
blob: d416f9ad17db0c9d72d1c9f66beb2a060111999f (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
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
	.include "asm/macros.inc"
	.include "global.inc"

	.text

	arm_func_start _ftell
_ftell: ; 0x020DEDE4
	ldr r1, [r0, #0x4]
	mov r1, r1, lsl #0x16
	mov r1, r1, lsr #0x1d
	and r1, r1, #0xff
	add r1, r1, #0xff
	and r1, r1, #0xff
	cmp r1, #0x1
	bhi _020DEE10
	ldrb r1, [r0, #0xd]
	cmp r1, #0x0
	beq _020DEE24
_020DEE10:
	ldr r0, _020DEE5C ; =errno
	mov r1, #0x28
	str r1, [r0, #0x0]
	sub r0, r1, #0x29
	bx lr
_020DEE24:
	ldr r1, [r0, #0x8]
	mov r1, r1, lsl #0x1d
	movs r12, r1, lsr #0x1d
	ldreq r0, [r0, #0x18]
	bxeq lr
	ldr r2, [r0, #0x24]
	ldr r1, [r0, #0x1c]
	ldr r3, [r0, #0x34]
	sub r0, r2, r1
	cmp r12, #0x3
	add r0, r3, r0
	subcs r1, r12, #0x2
	subcs r0, r0, r1
	bx lr
	.balign 4
_020DEE5C: .word errno
	arm_func_end _ftell

	arm_func_start ftell
ftell: ; 0x020DEE60
	stmdb sp!, {r3-r7,lr}
	ldr r1, _020DEF60 ; =__files
	mov r7, r0
	cmp r7, r1
	moveq r6, #0x2
	beq _020DEE98
	ldr r0, _020DEF64 ; =__files + 0x4C
	cmp r7, r0
	moveq r6, #0x3
	beq _020DEE98
	ldr r0, _020DEF68 ; =__files + 0x98
	cmp r7, r0
	moveq r6, #0x4
	movne r6, #0x5
_020DEE98:
	mov r0, #0x18
	mul r4, r6, r0
	ldr r5, _020DEF6C ; =__cs
	add r0, r5, r4
	bl OS_TryLockMutex
	cmp r0, #0x0
	bne _020DEED8
	ldr r0, _020DEF70 ; =OSi_ThreadInfo
	ldr r2, _020DEF74 ; =__cs_id
	ldr r1, [r0, #0x4]
	ldr r0, _020DEF78 ; =__cs_ref
	ldr r3, [r1, #0x6c]
	mov r1, #0x1
	str r3, [r2, r6, lsl #0x2]
	str r1, [r0, r6, lsl #0x2]
	b _020DEF30
_020DEED8:
	ldr r0, _020DEF70 ; =OSi_ThreadInfo
	ldr r1, _020DEF74 ; =__cs_id
	ldr r0, [r0, #0x4]
	ldr r1, [r1, r6, lsl #0x2]
	ldr r0, [r0, #0x6c]
	cmp r1, r0
	bne _020DEF08
	ldr r1, _020DEF78 ; =__cs_ref
	ldr r0, [r1, r6, lsl #0x2]
	add r0, r0, #0x1
	str r0, [r1, r6, lsl #0x2]
	b _020DEF30
_020DEF08:
	add r0, r5, r4
	bl OS_LockMutex
	ldr r0, _020DEF70 ; =OSi_ThreadInfo
	ldr r2, _020DEF74 ; =__cs_id
	ldr r1, [r0, #0x4]
	ldr r0, _020DEF78 ; =__cs_ref
	ldr r3, [r1, #0x6c]
	mov r1, #0x1
	str r3, [r2, r6, lsl #0x2]
	str r1, [r0, r6, lsl #0x2]
_020DEF30:
	mov r0, r7
	bl _ftell
	ldr r1, _020DEF78 ; =__cs_ref
	mov r7, r0
	ldr r0, [r1, r6, lsl #0x2]
	subs r0, r0, #0x1
	str r0, [r1, r6, lsl #0x2]
	bne _020DEF58
	add r0, r5, r4
	bl OS_UnlockMutex
_020DEF58:
	mov r0, r7
	ldmia sp!, {r3-r7,pc}
	.balign 4
_020DEF60: .word __files
_020DEF64: .word __files + 0x4C
_020DEF68: .word __files + 0x98
_020DEF6C: .word __cs
_020DEF70: .word OSi_ThreadInfo
_020DEF74: .word __cs_id
_020DEF78: .word __cs_ref
	arm_func_end ftell

	arm_func_start _fseek
_fseek: ; 0x020DEF7C
	stmdb sp!, {r0-r3}
	stmdb sp!, {r3-r5,lr}
	mov r5, r0
	ldr r1, [r5, #0x4]
	mov r4, r2
	mov r1, r1, lsl #0x16
	mov r1, r1, lsr #0x1d
	and r1, r1, #0xff
	cmp r1, #0x1
	ldreqb r1, [r5, #0xd]
	cmpeq r1, #0x0
	beq _020DEFC8
	ldr r0, _020DF160 ; =errno
	mov r1, #0x28
	str r1, [r0, #0x0]
	sub r0, r1, #0x29
	ldmia sp!, {r3-r5,lr}
	add sp, sp, #0x10
	bx lr
_020DEFC8:
	ldr r1, [r5, #0x8]
	mov r1, r1, lsl #0x1d
	mov r1, r1, lsr #0x1d
	cmp r1, #0x1
	bne _020DF018
	mov r1, #0x0
	bl __flush_buffer
	cmp r0, #0x0
	beq _020DF018
	mov r0, #0x1
	strb r0, [r5, #0xd]
	mov r2, #0x0
	ldr r0, _020DF160 ; =errno
	mov r1, #0x28
	str r2, [r5, #0x28]
	str r1, [r0, #0x0]
	sub r0, r1, #0x29
	ldmia sp!, {r3-r5,lr}
	add sp, sp, #0x10
	bx lr
_020DF018:
	cmp r4, #0x1
	bne _020DF038
	mov r0, r5
	mov r4, #0x0
	bl _ftell
	ldr r1, [sp, #0x14]
	add r0, r1, r0
	str r0, [sp, #0x14]
_020DF038:
	cmp r4, #0x2
	beq _020DF0CC
	ldr r0, [r5, #0x4]
	mov r0, r0, lsl #0x1b
	mov r0, r0, lsr #0x1d
	cmp r0, #0x3
	beq _020DF0CC
	ldr r0, [r5, #0x8]
	mov r0, r0, lsl #0x1d
	mov r0, r0, lsr #0x1d
	sub r0, r0, #0x2
	cmp r0, #0x1
	bhi _020DF0CC
	ldr r2, [sp, #0x14]
	ldr r0, [r5, #0x18]
	cmp r2, r0
	bhs _020DF088
	ldr r0, [r5, #0x34]
	cmp r2, r0
	bhs _020DF098
_020DF088:
	ldr r0, [r5, #0x8]
	bic r0, r0, #0x7
	str r0, [r5, #0x8]
	b _020DF0D8
_020DF098:
	ldr r1, [r5, #0x1c]
	sub r0, r2, r0
	add r0, r1, r0
	str r0, [r5, #0x24]
	ldr r1, [r5, #0x18]
	ldr r0, [sp, #0x14]
	sub r0, r1, r0
	str r0, [r5, #0x28]
	ldr r0, [r5, #0x8]
	bic r0, r0, #0x7
	orr r0, r0, #0x2
	str r0, [r5, #0x8]
	b _020DF0D8
_020DF0CC:
	ldr r0, [r5, #0x8]
	bic r0, r0, #0x7
	str r0, [r5, #0x8]
_020DF0D8:
	ldr r0, [r5, #0x8]
	mov r0, r0, lsl #0x1d
	movs r0, r0, lsr #0x1d
	bne _020DF150
	ldr r12, [r5, #0x38]
	cmp r12, #0x0
	beq _020DF13C
	ldr r0, [r5, #0x0]
	ldr r3, [r5, #0x48]
	add r1, sp, #0x14
	mov r2, r4
	blx r12
	cmp r0, #0x0
	beq _020DF13C
	mov r0, #0x1
	strb r0, [r5, #0xd]
	mov r2, #0x0
	ldr r0, _020DF160 ; =errno
	mov r1, #0x28
	str r2, [r5, #0x28]
	str r1, [r0, #0x0]
	sub r0, r1, #0x29
	ldmia sp!, {r3-r5,lr}
	add sp, sp, #0x10
	bx lr
_020DF13C:
	mov r1, #0x0
	strb r1, [r5, #0xc]
	ldr r0, [sp, #0x14]
	str r0, [r5, #0x18]
	str r1, [r5, #0x28]
_020DF150:
	mov r0, #0x0
	ldmia sp!, {r3-r5,lr}
	add sp, sp, #0x10
	bx lr
	.balign 4
_020DF160: .word errno
	arm_func_end _fseek

	arm_func_start fseek
fseek:
	stmdb sp!, {r3-r9,lr}
	ldr r3, _020DF274 ; =__files
	mov r9, r0
	cmp r9, r3
	mov r8, r1
	mov r7, r2
	moveq r6, #0x2
	beq _020DF1A4
	ldr r0, _020DF278 ; =__files + 0x4C
	cmp r9, r0
	moveq r6, #0x3
	beq _020DF1A4
	ldr r0, _020DF27C ; =__files + 0x98
	cmp r9, r0
	moveq r6, #0x4
	movne r6, #0x5
_020DF1A4:
	mov r0, #0x18
	mul r4, r6, r0
	ldr r5, _020DF280 ; =__cs
	add r0, r5, r4
	bl OS_TryLockMutex
	cmp r0, #0x0
	bne _020DF1E4
	ldr r0, _020DF284 ; =OSi_ThreadInfo
	ldr r2, _020DF288 ; =__cs_id
	ldr r1, [r0, #0x4]
	ldr r0, _020DF28C ; =__cs_ref
	ldr r3, [r1, #0x6c]
	mov r1, #0x1
	str r3, [r2, r6, lsl #0x2]
	str r1, [r0, r6, lsl #0x2]
	b _020DF23C
_020DF1E4:
	ldr r0, _020DF284 ; =OSi_ThreadInfo
	ldr r1, _020DF288 ; =__cs_id
	ldr r0, [r0, #0x4]
	ldr r1, [r1, r6, lsl #0x2]
	ldr r0, [r0, #0x6c]
	cmp r1, r0
	bne _020DF214
	ldr r1, _020DF28C ; =__cs_ref
	ldr r0, [r1, r6, lsl #0x2]
	add r0, r0, #0x1
	str r0, [r1, r6, lsl #0x2]
	b _020DF23C
_020DF214:
	add r0, r5, r4
	bl OS_LockMutex
	ldr r0, _020DF284 ; =OSi_ThreadInfo
	ldr r2, _020DF288 ; =__cs_id
	ldr r1, [r0, #0x4]
	ldr r0, _020DF28C ; =__cs_ref
	ldr r3, [r1, #0x6c]
	mov r1, #0x1
	str r3, [r2, r6, lsl #0x2]
	str r1, [r0, r6, lsl #0x2]
_020DF23C:
	mov r0, r9
	mov r1, r8
	mov r2, r7
	bl _fseek
	ldr r1, _020DF28C ; =__cs_ref
	mov r7, r0
	ldr r0, [r1, r6, lsl #0x2]
	subs r0, r0, #0x1
	str r0, [r1, r6, lsl #0x2]
	bne _020DF26C
	add r0, r5, r4
	bl OS_UnlockMutex
_020DF26C:
	mov r0, r7
	ldmia sp!, {r3-r9,pc}
	.balign 4
_020DF274: .word __files
_020DF278: .word __files + 0x4C
_020DF27C: .word __files + 0x98
_020DF280: .word __cs
_020DF284: .word OSi_ThreadInfo
_020DF288: .word __cs_id
_020DF28C: .word __cs_ref
	arm_func_end fseek

	arm_func_start rewind
rewind: ; 0x020DF290
	stmdb sp!, {r4,lr}
	mov r1, #0x0
	mov r4, r0
	mov r2, r1
	strb r1, [r4, #0xd]
	bl fseek
	mov r0, #0x0
	strb r0, [r4, #0xd]
	ldmia sp!, {r4,pc}
	arm_func_end rewind

	exception ftell, 285, 0x00300F00
	exception _fseek, 489, 0x00400320
	exception fseek, 301, 0x00403F00
	exception rewind, 37, 0x00100100