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

    .section .data

	.global _03807660
_03807660:
	.word	0x12345678

    .section .text

	arm_func_start SND_CalcRandom
SND_CalcRandom: ; 0x037FC058
	ldr	r2, _037FC080	; =_03807660
	ldr	r3, [r2]
	ldr	r0, _037FC084	; =0x0019660D
	ldr	r1, _037FC088	; =0x3C6EF35F
	mla	r0, r3, r0, r1
	str	r0, [r2]
	mov	r0, r0, lsr #16
	mov	r0, r0, lsl #16
	mov	r0, r0, lsr #16
	bx	lr
_037FC080:	.word	_03807660
_037FC084:	.word	0x0019660D
_037FC088:	.word	0x3C6EF35F

	arm_func_start SND_SinIdx
SND_SinIdx: ; 0x037FC08C
	cmp	r0, #32
	ldrlt	r1, _037FC0F4	; =_03807170
	ldrltsb	r0, [r1, r0]
	bxlt	lr
	cmp	r0, #64	; 0x40
	rsblt	r1, r0, #64	; 0x40
	ldrlt	r0, _037FC0F4	; =_03807170
	ldrltsb	r0, [r0, r1]
	bxlt	lr
	cmp	r0, #96	; 0x60
	bge	_037FC0D4
	sub	r1, r0, #64	; 0x40
	ldr	r0, _037FC0F4	; =_03807170
	ldrsb	r0, [r0, r1]
	rsb	r0, r0, #0
	mov	r0, r0, lsl #24
	mov	r0, r0, asr #24
	bx	lr
_037FC0D4:
	sub	r0, r0, #96	; 0x60
	rsb	r1, r0, #32
	ldr	r0, _037FC0F4	; =_03807170
	ldrsb	r0, [r0, r1]
	rsb	r0, r0, #0
	mov	r0, r0, lsl #24
	mov	r0, r0, asr #24
	bx	lr
_037FC0F4:	.word	_03807170

	arm_func_start SND_CalcChannelVolume
SND_CalcChannelVolume: ; 0x037FC0F8
	stmdb	sp!, {r4, lr}
	mov	r4, r0
	ldr	r0, _037FC168	; =0xFFFFFD2D
	cmp	r4, r0
	movlt	r4, r0
	blt	_037FC118
	cmp	r4, #0
	movgt	r4, #0
_037FC118:
	ldr	r0, _037FC16C	; =0x000002D3
	add	r0, r4, r0
	bl	FUN_037FC170
	mvn	r1, #239	; 0xef
	cmp	r4, r1
	movlt	r1, #3
	blt	_037FC154
	mvn	r1, #119	; 0x77
	cmp	r4, r1
	movlt	r1, #2
	blt	_037FC154
	mvn	r1, #59	; 0x3b
	cmp	r4, r1
	movlt	r1, #1
	movge	r1, #0
_037FC154:
	orr	r0, r0, r1, lsl #8
	mov	r0, r0, lsl #16
	mov	r0, r0, lsr #16
	ldmia	sp!, {r4, lr}
	bx	lr
_037FC168:	.word	0xFFFFFD2D
_037FC16C:	.word	0x000002D3

	arm_func_start FUN_037FC170
FUN_037FC170: ; 0x037FC170
	ldr	ip, _037FC178	; =SVC_GetVolumeTable
	bx	ip
_037FC178:	.word	SVC_GetVolumeTable

	arm_func_start SND_CalcTimer
SND_CalcTimer: ; 0x037FC17C
	stmdb	sp!, {r4, r5, lr}
	sub	sp, sp, #4
	mov	r5, r0
	mov	r4, #0
	rsb	r0, r1, #0
	b	_037FC19C
_037FC194:
	sub	r4, r4, #1
	add	r0, r0, #768	; 0x300
_037FC19C:
	cmp	r0, #0
	blt	_037FC194
	b	_037FC1B0
_037FC1A8:
	add	r4, r4, #1
	sub	r0, r0, #768	; 0x300
_037FC1B0:
	cmp	r0, #768	; 0x300
	bge	_037FC1A8
	bl	FUN_037FC2A4
	mov	r2, #0
	mov	r1, #65536	; 0x10000
	adds	lr, r0, r1
	adc	ip, r2, #0
	mov	r3, r5, asr #31
	umull	r1, r0, lr, r5
	mla	r0, lr, r3, r0
	mla	r0, ip, r5, r0
	sub	lr, r4, #16
	cmp	lr, #0
	bgt	_037FC208
	rsb	r2, lr, #0
	mov	r3, r0, lsr r2
	mov	r5, r1, lsr r2
	rsb	r1, r2, #32
	orr	r5, r5, r0, lsl r1
	sub	r1, r2, #32
	orr	r5, r5, r0, lsr r1
	b	_037FC264
_037FC208:
	cmp	lr, #32
	bge	_037FC25C
	mvn	r5, #0
	rsb	r4, lr, #32
	mov	ip, r5, lsl r4
	rsb	r3, r4, #32
	orr	ip, ip, r5, lsr r3
	sub	r3, r4, #32
	orr	ip, ip, r5, lsl r3
	and	r3, r0, ip
	and	r5, r1, r5, lsl r4
	cmp	r3, r2
	cmpeq	r5, r2
	ldrne	r0, _037FC2A0	; =0x0000FFFF
	bne	_037FC294
	mov	r5, r1, lsl lr
	mov	r3, r0, lsl lr
	orr	r3, r3, r1, lsr r4
	sub	r0, lr, #32
	orr	r3, r3, r1, lsl r0
	b	_037FC264
_037FC25C:
	ldr	r0, _037FC2A0	; =0x0000FFFF
	b	_037FC294
_037FC264:
	mov	r1, #0
	mov	r0, #16
	cmp	r3, r1
	cmpeq	r5, r0
	movcc	r5, r0
	bcc	_037FC28C
	ldr	r0, _037FC2A0	; =0x0000FFFF
	cmp	r3, r1
	cmpeq	r5, r0
	movhi	r5, r0
_037FC28C:
	mov	r0, r5, lsl #16
	mov	r0, r0, lsr #16
_037FC294:
	add	sp, sp, #4
	ldmia	sp!, {r4, r5, lr}
	bx	lr
_037FC2A0:	.word	0x0000FFFF

	arm_func_start FUN_037FC2A4
FUN_037FC2A4: ; 0x037FC2A4
	ldr	ip, _037FC2AC	; =SVC_GetPitchTable
	bx	ip
_037FC2AC:	.word	SVC_GetPitchTable