summaryrefslogtreecommitdiff
path: root/arm7/asm/SND_seq.s
blob: fcf067df2843d642076850a676aa006087be6d3b (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
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
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
	.include "asm/macros.inc"
	.include "global.inc"

    .text

	arm_func_start SNDi_SetTrackParam
SNDi_SetTrackParam: ; 0x037FE9F4
	stmdb	sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr}
	sub	sp, sp, #4
	mov	sl, r1
	mov	r9, r2
	mov	r8, r3
	ldr	r7, [sp, #40]	; 0x28
	ldr	r2, _037FEA94	; =_038084AC
	mov	r1, #36	; 0x24
	mla	fp, r0, r1, r2
	mov	r6, #0
	mov	r0, r8, lsl #16
	mov	r4, r0, lsr #16
	and	r5, r8, #255	; 0xff
	b	_037FEA78
_037FEA2C:
	ands	r0, sl, #1
	beq	_037FEA70
	mov	r0, fp
	mov	r1, r6
	bl	FUN_037FE460
	cmp	r0, #0
	beq	_037FEA70
	cmp	r7, #1
	beq	_037FEA64
	cmp	r7, #2
	beq	_037FEA6C
	cmp	r7, #4
	streq	r8, [r0, r9]
	b	_037FEA70
_037FEA64:
	strb	r5, [r0, r9]
	b	_037FEA70
_037FEA6C:
	strh	r4, [r0, r9]
_037FEA70:
	add	r6, r6, #1
	mov	sl, sl, lsr #1
_037FEA78:
	cmp	r6, #16
	bge	_037FEA88
	cmp	sl, #0
	bne	_037FEA2C
_037FEA88:
	add	sp, sp, #4
	ldmia	sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr}
	bx	lr
_037FEA94:	.word	(SNDi_Work + 0x540)

	arm_func_start SNDi_SetPlayerParam
SNDi_SetPlayerParam: ; 0x037FEA98
	stmfd	sp!, {lr}
	sub	sp, sp, #4
	ldr	lr, _037FEAE0	; =_038084AC
	mov	ip, #36	; 0x24
	mla	ip, r0, ip, lr
	cmp	r3, #1
	beq	_037FEAC8
	cmp	r3, #2
	beq	_037FEAD0
	cmp	r3, #4
	streq	r2, [ip, r1]
	b	_037FEAD4
_037FEAC8:
	strb	r2, [ip, r1]
	b	_037FEAD4
_037FEAD0:
	strh	r2, [ip, r1]
_037FEAD4:
	add	sp, sp, #4
	ldmia	sp!, {lr}
	bx	lr
_037FEAE0:	.word	(SNDi_Work + 0x540)

	arm_func_start SND_InvalidateBank
SND_InvalidateBank: ; 0x037FEAE4
	stmdb	sp!, {r4, r5, r6, r7, r8, lr}
	mov	r7, r0
	mov	r6, r1
	mov	r5, #0
	ldr	r4, _037FEB40	; =_038084AC
	mov	r8, #36	; 0x24
_037FEAFC:
	mul	r1, r5, r8
	add	r0, r4, r1
	ldrb	r1, [r4, r1]
	mov	r1, r1, lsl #31
	movs	r1, r1, lsr #31
	beq	_037FEB2C
	ldr	r1, [r0, #32]
	cmp	r7, r1
	bhi	_037FEB2C
	cmp	r1, r6
	bhi	_037FEB2C
	bl	FUN_037FE3AC
_037FEB2C:
	add	r5, r5, #1
	cmp	r5, #16
	blt	_037FEAFC
	ldmia	sp!, {r4, r5, r6, r7, r8, lr}
	bx	lr
_037FEB40:	.word	(SNDi_Work + 0x540)

	arm_func_start SND_InvalidateSeq
SND_InvalidateSeq: ; 0x037FEB44
	stmdb	sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr}
	sub	sp, sp, #4
	mov	sl, r0
	mov	r9, r1
	mov	r7, #0
	mov	r5, r7
	ldr	fp, _037FEBDC	; =_038084AC
	mov	r4, #36	; 0x24
_037FEB64:
	mul	r0, r7, r4
	add	r8, fp, r0
	ldrb	r0, [fp, r0]
	mov	r0, r0, lsl #31
	movs	r0, r0, lsr #31
	beq	_037FEBC4
	mov	r6, r5
	b	_037FEBBC
_037FEB84:
	mov	r0, r8
	mov	r1, r6
	bl	FUN_037FE460
	cmp	r0, #0
	beq	_037FEBB8
	ldr	r0, [r0, #40]	; 0x28
	cmp	sl, r0
	bhi	_037FEBB8
	cmp	r0, r9
	bhi	_037FEBB8
	mov	r0, r8
	bl	FUN_037FE3AC
	b	_037FEBC4
_037FEBB8:
	add	r6, r6, #1
_037FEBBC:
	cmp	r6, #16
	blt	_037FEB84
_037FEBC4:
	add	r7, r7, #1
	cmp	r7, #16
	blt	_037FEB64
	add	sp, sp, #4
	ldmia	sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr}
	bx	lr
_037FEBDC:	.word	(SNDi_Work + 0x540)

	arm_func_start SND_SetTrackAllocatableChannel
SND_SetTrackAllocatableChannel: ; 0x037FEBE0
	stmdb	sp!, {r4, r5, r6, r7, lr}
	sub	sp, sp, #4
	mov	r6, r1
	ldr	r3, _037FEC54	; =_038084AC
	mov	r1, #36	; 0x24
	mla	r5, r0, r1, r3
	mov	r4, #0
	mov	r0, r2, lsl #16
	mov	r7, r0, lsr #16
	b	_037FEC38
_037FEC08:
	ands	r0, r6, #1
	beq	_037FEC30
	mov	r0, r5
	mov	r1, r4
	bl	FUN_037FE460
	cmp	r0, #0
	strneh	r7, [r0, #30]
	ldrneb	r1, [r0]
	orrne	r1, r1, #128	; 0x80
	strneb	r1, [r0]
_037FEC30:
	add	r4, r4, #1
	mov	r6, r6, lsr #1
_037FEC38:
	cmp	r4, #16
	bge	_037FEC48
	cmp	r6, #0
	bne	_037FEC08
_037FEC48:
	add	sp, sp, #4
	ldmia	sp!, {r4, r5, r6, r7, lr}
	bx	lr
_037FEC54:	.word	(SNDi_Work + 0x540)

	arm_func_start SND_SetTrackMute
SND_SetTrackMute: ; 0x037FEC58
	stmdb	sp!, {r4, r5, r6, r7, lr}
	sub	sp, sp, #4
	mov	r7, r1
	mov	r6, r2
	ldr	r2, _037FECC8	; =_038084AC
	mov	r1, #36	; 0x24
	mla	r5, r0, r1, r2
	mov	r4, #0
	b	_037FECAC
_037FEC7C:
	ands	r0, r7, #1
	beq	_037FECA4
	mov	r0, r5
	mov	r1, r4
	bl	FUN_037FE460
	cmp	r0, #0
	beq	_037FECA4
	mov	r1, r5
	mov	r2, r6
	bl	FUN_037FD440
_037FECA4:
	add	r4, r4, #1
	mov	r7, r7, lsr #1
_037FECAC:
	cmp	r4, #16
	bge	_037FECBC
	cmp	r7, #0
	bne	_037FEC7C
_037FECBC:
	add	sp, sp, #4
	ldmia	sp!, {r4, r5, r6, r7, lr}
	bx	lr
_037FECC8:	.word	(SNDi_Work + 0x540)

	arm_func_start SND_SkipSeq
SND_SkipSeq: ; 0x037FECCC
	stmdb	sp!, {r4, r5, r6, r7, r8, lr}
	mov	r6, r1
	ldr	r2, _037FED90	; =_038084AC
	mov	r1, #36	; 0x24
	mla	r5, r0, r1, r2
	mov	r8, #0
	mov	r4, #127	; 0x7f
_037FECE8:
	mov	r0, r5
	mov	r1, r8
	bl	FUN_037FE460
	movs	r7, r0
	beq	_037FED10
	mov	r1, r5
	mov	r2, r4
	bl	FUN_037FE588
	mov	r0, r7
	bl	FUN_037FE54C
_037FED10:
	add	r8, r8, #1
	cmp	r8, #16
	blt	_037FECE8
	bl	SND_StopIntervalTimer
	mov	r4, #0
	mov	r7, r4
	b	_037FED50
_037FED2C:
	mov	r0, r5
	mov	r1, r7
	bl	FUN_037FD548
	cmp	r0, #0
	beq	_037FED4C
	mov	r0, r5
	bl	FUN_037FE3AC
	b	_037FED58
_037FED4C:
	add	r4, r4, #1
_037FED50:
	cmp	r4, r6
	bcc	_037FED2C
_037FED58:
	bl	SND_StartIntervalTimer
	ldr	r0, _037FED94	; =SNDi_SharedWork
	ldr	r0, [r0]
	cmp	r0, #0
	beq	_037FED88
	add	r3, r0, #64	; 0x40
	ldrb	r1, [r5, #1]
	mov	r0, #36	; 0x24
	mul	r2, r1, r0
	ldr	r0, [r3, r2]
	add	r0, r0, r4
	str	r0, [r3, r2]
_037FED88:
	ldmia	sp!, {r4, r5, r6, r7, r8, lr}
	bx	lr
_037FED90:	.word	(SNDi_Work + 0x540)
_037FED94:	.word	SNDi_SharedWork

	arm_func_start SND_PauseSeq
SND_PauseSeq: ; 0x037FED98
	stmdb	sp!, {r4, r5, r6, r7, lr}
	sub	sp, sp, #4
	ldr	r5, _037FEE18	; =_038084AC
	mov	r2, #36	; 0x24
	mul	r3, r0, r2
	add	r4, r5, r3
	ldrb	r0, [r5, r3]
	bic	r2, r0, #4
	and	r0, r1, #255	; 0xff
	and	r0, r0, #1
	orr	r0, r2, r0, lsl #2
	strb	r0, [r5, r3]
	cmp	r1, #0
	beq	_037FEE0C
	mov	r7, #0
	mov	r5, #127	; 0x7f
_037FEDD8:
	mov	r0, r4
	mov	r1, r7
	bl	FUN_037FE460
	movs	r6, r0
	beq	_037FEE00
	mov	r1, r4
	mov	r2, r5
	bl	FUN_037FE588
	mov	r0, r6
	bl	FUN_037FE54C
_037FEE00:
	add	r7, r7, #1
	cmp	r7, #16
	blt	_037FEDD8
_037FEE0C:
	add	sp, sp, #4
	ldmia	sp!, {r4, r5, r6, r7, lr}
	bx	lr
_037FEE18:	.word	(SNDi_Work + 0x540)

	arm_func_start SND_StopSeq
SND_StopSeq: ; 0x037FEE1C
	stmdb	sp!, {r4, lr}
	mov	r4, r0
	ldr	r2, _037FEE70	; =_038084AC
	mov	r0, #36	; 0x24
	mul	r1, r4, r0
	add	r0, r2, r1
	ldrb	r1, [r2, r1]
	mov	r1, r1, lsl #31
	movs	r1, r1, lsr #31
	beq	_037FEE68
	bl	FUN_037FE3AC
	ldr	r0, _037FEE74	; =SNDi_SharedWork
	ldr	r2, [r0]
	cmp	r2, #0
	ldrne	r1, [r2, #4]
	movne	r0, #1
	mvnne	r0, r0, lsl r4
	andne	r0, r1, r0
	strne	r0, [r2, #4]
_037FEE68:
	ldmia	sp!, {r4, lr}
	bx	lr
_037FEE70:	.word	(SNDi_Work + 0x540)
_037FEE74:	.word	SNDi_SharedWork

	arm_func_start SND_StartSeq
SND_StartSeq: ; 0x037FEE78
	stmdb	sp!, {r4, lr}
	mov	r4, r0
	bl	SND_PrepareSeq
	mov	r0, r4
	bl	SND_StartPreparedSeq
	ldmia	sp!, {r4, lr}
	bx	lr

	arm_func_start SND_StartPreparedSeq
SND_StartPreparedSeq: ; 0x037FEE94
	ldr	r2, _037FEEB0	; =_038084AC
	mov	r1, #36	; 0x24
	mul	r1, r0, r1
	ldrb	r0, [r2, r1]
	orr	r0, r0, #2
	strb	r0, [r2, r1]
	bx	lr
_037FEEB0:	.word	(SNDi_Work + 0x540)

	arm_func_start SND_PrepareSeq
SND_PrepareSeq: ; 0x037FEEB4
	stmdb	sp!, {r4, r5, r6, r7, r8, r9, lr}
	sub	sp, sp, #4
	mov	r4, r0
	mov	r8, r1
	mov	r6, r2
	mov	r5, r3
	ldr	r1, _037FEFFC	; =_038084AC
	mov	r0, #36	; 0x24
	mul	r0, r4, r0
	add	r7, r1, r0
	ldrb	r0, [r1, r0]
	mov	r0, r0, lsl #31
	movs	r0, r0, lsr #31
	beq	_037FEEF4
	mov	r0, r7
	bl	FUN_037FE3AC
_037FEEF4:
	mov	r0, r7
	mov	r1, r5
	bl	FUN_037FE5F8
	bl	FUN_037FD4C0
	movs	r9, r0
	bmi	_037FEFF0
	ldr	r0, _037FF000	; =_038086EC
	add	r5, r0, r9, lsl #6
	mov	r0, r5
	bl	FUN_037FE6BC
	mov	r0, r5
	mov	r1, r8
	mov	r2, r6
	bl	FUN_037FE6A8
	strb	r9, [r7, #8]
	ldr	r0, [r5, #40]	; 0x28
	bl	FUN_037FE9B8
	ldr	r0, [r5, #40]	; 0x28
	bl	FUN_037FE968
	add	r2, r5, #40	; 0x28
	ldr	r1, [r5, #40]	; 0x28
	add	r1, r1, #1
	str	r1, [r5, #40]	; 0x28
	cmp	r0, #254	; 0xfe
	ldrne	r0, [r2]
	subne	r0, r0, #1
	strne	r0, [r2]
	bne	_037FEFB8
	mov	r0, r5
	bl	FUN_037FE918
	mov	r0, r0, lsl #15
	mov	r5, r0, lsr #16
	mov	r6, #1
	ldr	r8, _037FF000	; =_038086EC
	b	_037FEFB0
_037FEF80:
	ands	r0, r5, #1
	beq	_037FEFA4
	bl	FUN_037FD4C0
	movs	r9, r0
	bmi	_037FEFB8
	add	r0, r8, r9, lsl #6
	bl	FUN_037FE6BC
	add	r0, r7, r6
	strb	r9, [r0, #8]
_037FEFA4:
	add	r6, r6, #1
	mov	r0, r5, lsl #15
	mov	r5, r0, lsr #16
_037FEFB0:
	cmp	r5, #0
	bne	_037FEF80
_037FEFB8:
	ldrb	r0, [r7]
	bic	r0, r0, #1
	orr	r0, r0, #1
	strb	r0, [r7]
	ldrb	r0, [r7]
	bic	r0, r0, #2
	strb	r0, [r7]
	ldr	r0, _037FF004	; =SNDi_SharedWork
	ldr	r2, [r0]
	cmp	r2, #0
	ldrne	r1, [r2, #4]
	movne	r0, #1
	orrne	r0, r1, r0, lsl r4
	strne	r0, [r2, #4]
_037FEFF0:
	add	sp, sp, #4
	ldmia	sp!, {r4, r5, r6, r7, r8, r9, lr}
	bx	lr
_037FEFFC:	.word	(SNDi_Work + 0x540)
_037FF000:	.word	(SNDi_Work + 0x780)
_037FF004:	.word	SNDi_SharedWork

	arm_func_start SND_SeqMain
SND_SeqMain: ; 0x037FF008
	stmdb	sp!, {r4, r5, r6, r7, r8, r9, sl, lr}
	mov	r8, r0
	mov	r5, #0
	mov	r6, r5
	mov	sl, #1
	ldr	r4, _037FF0A0	; =_038084AC
	mov	r9, #36	; 0x24
_037FF024:
	mul	r0, r6, r9
	add	r7, r4, r0
	ldrb	r1, [r4, r0]
	mov	r0, r1, lsl #31
	movs	r0, r0, lsr #31
	beq	_037FF07C
	mov	r0, r1, lsl #30
	movs	r0, r0, lsr #31
	beq	_037FF06C
	cmp	r8, #0
	beq	_037FF064
	mov	r0, r1, lsl #29
	movs	r0, r0, lsr #31
	bne	_037FF064
	mov	r0, r7
	bl	FUN_037FE48C
_037FF064:
	mov	r0, r7
	bl	FUN_037FE1A0
_037FF06C:
	ldrb	r0, [r7]
	mov	r0, r0, lsl #31
	movs	r0, r0, lsr #31
	orrne	r5, r5, sl, lsl r6
_037FF07C:
	add	r6, r6, #1
	cmp	r6, #16
	blt	_037FF024
	ldr	r0, _037FF0A4	; =SNDi_SharedWork
	ldr	r0, [r0]
	cmp	r0, #0
	strne	r5, [r0, #4]
	ldmia	sp!, {r4, r5, r6, r7, r8, r9, sl, lr}
	bx	lr
_037FF0A0:	.word	(SNDi_Work + 0x540)
_037FF0A4:	.word	SNDi_SharedWork

	arm_func_start SND_SeqInit
SND_SeqInit: ; 0x037FF0A8
	stmfd	sp!, {lr}
	sub	sp, sp, #4
	mov	lr, #0
	ldr	r3, _037FF10C	; =_038084AC
	mov	r0, #36	; 0x24
_037FF0BC:
	mul	r2, lr, r0
	add	ip, r3, r2
	ldrb	r1, [r3, r2]
	bic	r1, r1, #1
	strb	r1, [r3, r2]
	strb	lr, [ip, #1]
	add	lr, lr, #1
	cmp	lr, #16
	blt	_037FF0BC
	mov	r2, #0
	ldr	r1, _037FF110	; =_038086EC
_037FF0E8:
	ldrb	r0, [r1, r2, lsl #6]
	bic	r0, r0, #1
	strb	r0, [r1, r2, lsl #6]
	add	r2, r2, #1
	cmp	r2, #32
	blt	_037FF0E8
	add	sp, sp, #4
	ldmia	sp!, {lr}
	bx	lr
_037FF10C:	.word	(SNDi_Work + 0x540)
_037FF110:	.word	(SNDi_Work + 0x780)