summaryrefslogtreecommitdiff
path: root/arm7/asm/SND_bank.s
blob: acf1ac4422bc8c5044e01a1b8afecefd7d1a369d (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
	.include "asm/macros.inc"
	.include "global.inc"

    .text

	arm_func_start GetWaveData
GetWaveData: ; 0x037FF114
	stmfd	sp!, {lr}
	sub	sp, sp, #4
	add	r0, r0, r1, lsl #3
	ldr	r0, [r0, #24]
	cmp	r0, #0
	moveq	r0, #0
	beq	_037FF148
	ldr	r1, [r0, #56]	; 0x38
	cmp	r2, r1
	movcs	r0, #0
	bcs	_037FF148
	mov	r1, r2
	bl	SND_GetWaveDataAddress
_037FF148:
	add	sp, sp, #4
	ldmia	sp!, {lr}
	bx	lr

	arm_func_start SND_NoteOn
SND_NoteOn: ; 0x037FF154
	stmdb	sp!, {r4, r5, r6, r7, r8, r9, lr}
	sub	sp, sp, #4
	mov	r9, r0
	mov	r8, r1
	mov	r7, r2
	mov	r6, r3
	ldr	r5, [sp, #36]	; 0x24
	ldrb	r4, [r5, #10]
	cmp	r4, #255	; 0xff
	mvneq	r6, #0
	moveq	r4, #0
	ldrb	r0, [r5]
	cmp	r0, #4
	addls	pc, pc, r0, lsl #2
	b	_037FF210
	b	_037FF210
	b	_037FF1A4
	b	_037FF1EC
	b	_037FF200
	b	_037FF1A4
_037FF1A4:
	cmp	r0, #1
	ldrneh	r1, [r5, #4]
	ldrneh	r0, [r5, #2]
	orrne	r1, r0, r1, lsl #16
	bne	_037FF1CC
	ldr	r0, [sp, #32]
	ldrh	r1, [r5, #4]
	ldrh	r2, [r5, #2]
	bl	GetWaveData
	mov	r1, r0
_037FF1CC:
	cmp	r1, #0
	moveq	r0, #0
	beq	_037FF214
	mov	r0, r9
	add	r2, r1, #12
	mov	r3, r6
	bl	SND_StartExChannelPcm
	b	_037FF214
_037FF1EC:
	mov	r0, r9
	ldrh	r1, [r5, #2]
	mov	r2, r6
	bl	SND_StartExChannelPsg
	b	_037FF214
_037FF200:
	mov	r0, r9
	mov	r1, r6
	bl	SND_StartExChannelNoise
	b	_037FF214
_037FF210:
	mov	r0, #0
_037FF214:
	cmp	r0, #0
	moveq	r0, #0
	beq	_037FF270
	strb	r8, [r9, #8]
	ldrb	r0, [r5, #6]
	strb	r0, [r9, #5]
	strb	r7, [r9, #9]
	mov	r0, r9
	ldrb	r1, [r5, #7]
	bl	SND_SetExChannelAttack
	mov	r0, r9
	ldrb	r1, [r5, #8]
	bl	SND_SetExChannelDecay
	mov	r0, r9
	ldrb	r1, [r5, #9]
	bl	SND_SetExChannelSustain
	mov	r0, r9
	mov	r1, r4
	bl	SND_SetExChannelRelease
	ldrb	r0, [r5, #11]
	sub	r0, r0, #64	; 0x40
	strb	r0, [r9, #10]
	mov	r0, #1
_037FF270:
	add	sp, sp, #4
	ldmia	sp!, {r4, r5, r6, r7, r8, r9, lr}
	bx	lr

	arm_func_start SND_GetWaveDataAddress
SND_GetWaveDataAddress: ; 0x037FF27C
	stmdb	sp!, {r4, r5, lr}
	sub	sp, sp, #4
	mov	r5, r0
	mov	r4, r1
	bl	SNDi_LockMutex
	add	r0, r5, r4, lsl #2
	ldr	r4, [r0, #60]	; 0x3c
	cmp	r4, #0
	beq	_037FF2AC
	cmp	r4, #33554432	; 0x2000000
	addcc	r4, r5, r4
	b	_037FF2B0
_037FF2AC:
	mov	r4, #0
_037FF2B0:
	bl	SNDi_UnlockMutex
	mov	r0, r4
	add	sp, sp, #4
	ldmia	sp!, {r4, r5, lr}
	bx	lr

	arm_func_start SND_ReadInstData
SND_ReadInstData: ; 0x037FF2C4
	stmdb	sp!, {r4, r5, r6, r7, lr}
	sub	sp, sp, #4
	mov	r6, r0
	movs	r7, r1
	mov	r5, r2
	mov	r4, r3
	movmi	r0, #0
	bmi	_037FF43C
	bl	SNDi_LockMutex
	ldr	r0, [r6, #56]	; 0x38
	cmp	r7, r0
	bcc	_037FF300
	bl	SNDi_UnlockMutex
	mov	r0, #0
	b	_037FF43C
_037FF300:
	add	r0, r6, r7, lsl #2
	ldr	r3, [r0, #60]	; 0x3c
	strb	r3, [r4]
	ldrb	r0, [r4]
	cmp	r0, #17
	addls	pc, pc, r0, lsl #2
	b	_037FF428
	b	_037FF428
	b	_037FF364
	b	_037FF364
	b	_037FF364
	b	_037FF364
	b	_037FF364
	b	_037FF428
	b	_037FF428
	b	_037FF428
	b	_037FF428
	b	_037FF428
	b	_037FF428
	b	_037FF428
	b	_037FF428
	b	_037FF428
	b	_037FF428
	b	_037FF384
	b	_037FF3D4
_037FF364:
	add	r3, r6, r3, lsr #8
	add	r2, r4, #2
	mov	r1, #5
_037FF370:
	ldrh	r0, [r3], #2
	strh	r0, [r2], #2
	subs	r1, r1, #1
	bne	_037FF370
	b	_037FF434
_037FF384:
	add	r2, r6, r3, lsr #8
	ldrb	r1, [r2, #1]
	ldrb	r0, [r6, r3, lsr #8]
	cmp	r5, r0
	blt	_037FF3A0
	cmp	r5, r1
	ble	_037FF3AC
_037FF3A0:
	bl	SNDi_UnlockMutex
	mov	r0, #0
	b	_037FF43C
_037FF3AC:
	sub	r1, r5, r0
	mov	r0, #12
	mla	r0, r1, r0, r2
	add	r2, r0, #2
	mov	r1, #6
_037FF3C0:
	ldrh	r0, [r2], #2
	strh	r0, [r4], #2
	subs	r1, r1, #1
	bne	_037FF3C0
	b	_037FF434
_037FF3D4:
	mov	r2, #0
	add	r1, r6, r3, lsr #8
	b	_037FF3F8
_037FF3E0:
	add	r2, r2, #1
	cmp	r2, #8
	blt	_037FF3F8
	bl	SNDi_UnlockMutex
	mov	r0, #0
	b	_037FF43C
_037FF3F8:
	ldrb	r0, [r1, r2]
	cmp	r5, r0
	bgt	_037FF3E0
	mov	r0, #12
	mla	r0, r2, r0, r1
	add	r2, r0, #8
	mov	r1, #6
_037FF414:
	ldrh	r0, [r2], #2
	strh	r0, [r4], #2
	subs	r1, r1, #1
	bne	_037FF414
	b	_037FF434
_037FF428:
	bl	SNDi_UnlockMutex
	mov	r0, #0
	b	_037FF43C
_037FF434:
	bl	SNDi_UnlockMutex
	mov	r0, #1
_037FF43C:
	add	sp, sp, #4
	ldmia	sp!, {r4, r5, r6, r7, lr}
	bx	lr