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
|