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

    .text

	arm_func_start ExChannelLfoUpdate
ExChannelLfoUpdate: ; 0x037FC530
	stmdb	sp!, {r4, r5, r6, lr}
	mov	r6, r0
	mov	r5, r1
	add	r0, r6, #40	; 0x28
	bl	SND_GetLfoValue
	mov	r4, r0
	mov	ip, r0, asr #31
	mov	r3, #0
	cmp	ip, r3
	cmpeq	r0, r3
	beq	_037FC5B0
	ldrb	r1, [r6, #40]	; 0x28
	cmp	r1, #0
	beq	_037FC59C
	cmp	r1, #1
	beq	_037FC584
	cmp	r1, #2
	moveq	ip, ip, lsl #6
	orreq	ip, ip, r0, lsr #26
	moveq	r4, r0, lsl #6
	b	_037FC5A8
_037FC584:
	mov	r2, #60	; 0x3c
	umull	r4, r1, r0, r2
	mla	r1, r0, r3, r1
	mla	r1, ip, r2, r1
	mov	ip, r1
	b	_037FC5A8
_037FC59C:
	mov	ip, ip, lsl #6
	orr	ip, ip, r0, lsr #26
	mov	r4, r0, lsl #6
_037FC5A8:
	mov	r4, r4, lsr #14
	orr	r4, r4, ip, lsl #18
_037FC5B0:
	cmp	r5, #0
	beq	_037FC5C0
	add	r0, r6, #40	; 0x28
	bl	SND_UpdateLfo
_037FC5C0:
	mov	r0, r4
	ldmia	sp!, {r4, r5, r6, lr}
	bx	lr

	arm_func_start ExChannelSweepUpdate
ExChannelSweepUpdate: ; 0x037FC5CC
	stmdb	sp!, {r4, r5, lr}
	sub	sp, sp, #4
	mov	r4, r0
	mov	r5, r1
	ldrsh	r3, [r4, #50]	; 0x32
	cmp	r3, #0
	moveq	r0, #0
	beq	_037FC630
	ldr	r0, [r4, #20]
	ldr	r2, [r4, #24]
	cmp	r0, r2
	movge	r0, #0
	bge	_037FC630
	sub	r0, r2, r0
	smull	r0, r1, r3, r0
	mov	r3, r2, asr #31
	bl	_ll_sdiv
	cmp	r5, #0
	beq	_037FC630
	ldrb	r1, [r4, #3]
	mov	r1, r1, lsl #29
	movs	r1, r1, lsr #31
	ldrne	r1, [r4, #20]
	addne	r1, r1, #1
	strne	r1, [r4, #20]
_037FC630:
	add	sp, sp, #4
	ldmia	sp!, {r4, r5, lr}
	bx	lr

	arm_func_start ExChannelVolumeCmp
ExChannelVolumeCmp: ; 0x037FC63C
	stmfd	sp!, {lr}
	sub	sp, sp, #4
	ldrh	lr, [r0, #36]	; 0x24
	and	r2, lr, #255	; 0xff
	ldrh	ip, [r1, #36]	; 0x24
	and	r0, ip, #255	; 0xff
	mov	r2, r2, lsl #4
	mov	r3, r0, lsl #4
	ldr	r1, _037FC698	; =sSampleDataShiftTable
	ldrb	r0, [r1, lr, asr #8]
	mov	r2, r2, asr r0
	ldrb	r0, [r1, ip, asr #8]
	mov	r0, r3, asr r0
	cmp	r2, r0
	beq	_037FC688
	cmp	r2, r0
	movlt	r0, #1
	mvnge	r0, #0
	b	_037FC68C
_037FC688:
	mov	r0, #0
_037FC68C:
	add	sp, sp, #4
	ldmia	sp!, {lr}
	bx	lr
_037FC698:	.word	sSampleDataShiftTable

	arm_func_start ExChannelStart
ExChannelStart: ; 0x037FC69C
	stmdb	sp!, {r4, lr}
	mov	r4, r0
	ldr	r0, _037FC6E4	; =0xFFFE9680
	str	r0, [r4, #16]
	mov	r0, #0
	strb	r0, [r4, #2]
	str	r1, [r4, #52]	; 0x34
	add	r0, r4, #40	; 0x28
	bl	SND_StartLfo
	ldrb	r0, [r4, #3]
	orr	r0, r0, #2
	strb	r0, [r4, #3]
	ldrb	r0, [r4, #3]
	bic	r0, r0, #1
	orr	r0, r0, #1
	strb	r0, [r4, #3]
	ldmia	sp!, {r4, lr}
	bx	lr
_037FC6E4:	.word	0xFFFE9680

	arm_func_start ExChannelSetup
ExChannelSetup: ; 0x037FC6E8
	stmdb	sp!, {r4, lr}
	mov	r4, r0
	mov	ip, #0
	str	ip, [r4, #80]	; 0x50
	str	r1, [r4, #72]	; 0x48
	str	r2, [r4, #76]	; 0x4c
	str	ip, [r4, #52]	; 0x34
	strb	r3, [r4, #34]	; 0x22
	mov	r1, #127	; 0x7f
	strh	r1, [r4, #36]	; 0x24
	ldrb	r2, [r4, #3]
	bic	r2, r2, #2
	strb	r2, [r4, #3]
	ldrb	r2, [r4, #3]
	orr	r2, r2, #4
	strb	r2, [r4, #3]
	mov	r2, #60	; 0x3c
	strb	r2, [r4, #8]
	strb	r2, [r4, #5]
	strb	r1, [r4, #9]
	strb	ip, [r4, #10]
	strh	ip, [r4, #12]
	strh	ip, [r4, #6]
	strh	ip, [r4, #14]
	strb	ip, [r4, #11]
	strb	r1, [r4, #4]
	strh	ip, [r4, #50]	; 0x32
	str	ip, [r4, #24]
	str	ip, [r4, #20]
	bl	SND_SetExChannelAttack
	mov	r0, r4
	mov	r1, #127	; 0x7f
	bl	SND_SetExChannelDecay
	mov	r0, r4
	mov	r1, #127	; 0x7f
	bl	SND_SetExChannelSustain
	mov	r0, r4
	mov	r1, #127	; 0x7f
	bl	SND_SetExChannelRelease
	add	r0, r4, #40	; 0x28
	bl	SND_InitLfoParam
	ldmia	sp!, {r4, lr}
	bx	lr

	arm_func_start CalcDecayCoeff
CalcDecayCoeff: ; 0x037FC794
	stmfd	sp!, {lr}
	sub	sp, sp, #4
	mov	r1, r0
	cmp	r1, #127	; 0x7f
	ldreq	r0, _037FC7F0	; =0x0000FFFF
	beq	_037FC7E4
	cmp	r1, #126	; 0x7e
	moveq	r0, #15360	; 0x3c00
	beq	_037FC7E4
	cmp	r1, #50	; 0x32
	movlt	r0, r1, lsl #1
	addlt	r0, r0, #1
	movlt	r0, r0, lsl #16
	movlt	r0, r0, lsr #16
	blt	_037FC7E4
	mov	r0, #7680	; 0x1e00
	rsb	r1, r1, #126	; 0x7e
	bl	_s32_div_f
	mov	r0, r0, lsl #16
	mov	r0, r0, lsr #16
_037FC7E4:
	add	sp, sp, #4
	ldmia	sp!, {lr}
	bx	lr
_037FC7F0:	.word	0x0000FFFF