added apex audio system
[gbajam21] / libs / aas / AAS_ASM.s
1 @ Copyright (c) 2003-2021 James Daniels
2 @ Distributed under the MIT License
3 @ license terms: see LICENSE file in root or http://opensource.org/licenses/MIT
4
5 .TEXT
6 .SECTION    .text,"ax",%progbits
7 .ALIGN
8 .ARM
9
10 .GLOBAL AAS_DoDMA3
11
12 .GLOBAL AAS_MixAudio_SetMode_Normal
13 .GLOBAL AAS_MixAudio_SetMode_Boost
14 .GLOBAL AAS_MixAudio_SetMode_BoostAndClip
15
16 .GLOBAL AAS_MixAudio_SetMaxChans_2
17 .GLOBAL AAS_MixAudio_SetMaxChans_4
18 .GLOBAL AAS_MixAudio_SetMaxChans_8
19
20 .GLOBAL _AAS_vol_lookup
21
22
23 @ Volume lookup table. -1 means use multiply, 0 to 7 means use bit shift.
24
25 _AAS_vol_lookup:
26         .byte 0, 1, -1, 2, -1, -1, -1, 3, -1, -1, -1, -1, -1, -1, -1, 4
27         .byte -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5
28         .byte -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
29         .byte -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 6
30         .byte -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
31         .byte -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
32         .byte -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
33         .byte -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7
34
35 _ma_mul_r5_r0_r3:
36         .word 0x00000010
37         mul r5,r0,r3
38 _ma_mov_r5_r0_lsl_0:
39         .word 0x00000001
40         mov r5,r0,lsl #0
41 _ma_mlane_r5_r0_r3_r5:
42         .word 0x00000011
43         mlane r5,r0,r3,r5
44 _ma_add_r5_r5_r0_lsl_0:
45         .word 0x00000011
46         add r5,r5,r0,lsl #0
47
48
49 _ma_merge_noclip_start:
50         @ ma_again:
51
52         @ Merge
53         ldr r14,[sp,#24]
54         and r5,r14,r5,lsr #8
55         and r6,r14,r6,lsr #8
56         and r7,r14,r7,lsr #8
57         and r8,r14,r8,lsr #8
58         and r9,r14,r9,lsr #8
59         and r10,r14,r10,lsr #8
60         and r11,r14,r11,lsr #8
61         and r12,r14,r12,lsr #8
62         add r5,r5,r6,lsl #8
63         add r6,r7,r8,lsl #8
64         add r7,r9,r10,lsl #8
65         add r8,r11,r12,lsl #8
66         
67         @ Store
68         stmia r4!,{r5-r8}
69         
70         @ Loop
71         subs r14,r14,#0x2000000
72         .word 0xdaffffa5  @ ble ma_end
73         
74         @ ma_start:
75         str r14,[sp,#24]
76 _ma_merge_noclip_end:
77
78
79 _ma_merge_boostnoclip_start:
80         @ ma_again:
81
82         @ Merge
83         ldr r14,[sp,#24]
84         and r5,r14,r5,lsr #7
85         and r6,r14,r6,lsr #7
86         and r7,r14,r7,lsr #7
87         and r8,r14,r8,lsr #7
88         and r9,r14,r9,lsr #7
89         and r10,r14,r10,lsr #7
90         and r11,r14,r11,lsr #7
91         and r12,r14,r12,lsr #7
92         add r5,r5,r6,lsl #8
93         add r6,r7,r8,lsl #8
94         add r7,r9,r10,lsl #8
95         add r8,r11,r12,lsl #8
96         
97         @ Store
98         stmia r4!,{r5-r8}
99         
100         @ Loop
101         subs r14,r14,#0x2000000
102         .word 0xdaffffa5  @ ble ma_end
103         
104         @ ma_start:
105         str r14,[sp,#24]
106 _ma_merge_boostnoclip_end:
107
108
109 _ma_merge_clip_start:
110         _ma_mask_0x80808080: .word 0x80808080
111
112         .word 0,0 @ padding
113
114         @ ma_again:
115         @ Merge
116         ldr r14,[sp,#24]
117         .word 0xe51f2018  @ ldr r2,_ma_mask_0x80808080
118         
119         and r0,r14,r5,lsr #8
120         and r1,r14,r6,lsr #8
121         add r0,r0,r1,lsl #8
122         and r5,r14,r5,lsr #7
123         and r6,r14,r6,lsr #7
124         add r5,r5,r6,lsl #8
125         eor r0,r0,r5
126         ands r0,r2,r0
127         beq no_clip1  @ perhaps not worthwhile?
128         and r1,r2,r5
129         sub r1,r2,r1,lsr #7
130         sub r0,r0,r0,lsr #7
131         orr r0,r0,r0,lsl #1
132         bic r5,r5,r0
133         and r1,r1,r0
134         orr r5,r5,r1
135 no_clip1:
136
137         and r0,r14,r7,lsr #8
138         and r1,r14,r8,lsr #8
139         add r0,r0,r1,lsl #8
140         and r7,r14,r7,lsr #7
141         and r8,r14,r8,lsr #7
142         add r6,r7,r8,lsl #8
143         eor r0,r0,r6
144         ands r0,r2,r0
145         beq no_clip2  @ perhaps not worthwhile?
146         and r1,r2,r6
147         sub r1,r2,r1,lsr #7
148         sub r0,r0,r0,lsr #7
149         orr r0,r0,r0,lsl #1
150         bic r6,r6,r0
151         and r1,r1,r0
152         orr r6,r6,r1
153 no_clip2:
154
155         and r0,r14,r9,lsr #8
156         and r1,r14,r10,lsr #8
157         add r0,r0,r1,lsl #8
158         and r9,r14,r9,lsr #7
159         and r10,r14,r10,lsr #7
160         add r7,r9,r10,lsl #8
161         eor r0,r0,r7
162         ands r0,r2,r0
163         beq no_clip3  @ perhaps not worthwhile?
164         and r1,r2,r7
165         sub r1,r2,r1,lsr #7
166         sub r0,r0,r0,lsr #7
167         orr r0,r0,r0,lsl #1
168         bic r7,r7,r0
169         and r1,r1,r0
170         orr r7,r7,r1
171 no_clip3:
172
173         and r0,r14,r11,lsr #8
174         and r1,r14,r12,lsr #8
175         add r0,r0,r1,lsl #8
176         and r11,r14,r11,lsr #7
177         and r12,r14,r12,lsr #7
178         add r8,r11,r12,lsl #8
179         eor r0,r0,r8
180         ands r0,r2,r0
181         beq no_clip4  @ perhaps not worthwhile?
182         and r1,r2,r8
183         sub r1,r2,r1,lsr #7
184         sub r0,r0,r0,lsr #7
185         orr r0,r0,r0,lsl #1
186         bic r8,r8,r0
187         and r1,r1,r0
188         orr r8,r8,r1
189 no_clip4:
190
191         @ Store
192         stmia r4!,{r5-r8}
193         
194         @ Loop
195         subs r14,r14,#0x2000000
196         .word 0xdaffff6d  @ ble ma_end
197         
198         @ ma_start:
199         str r14,[sp,#24]
200 _ma_merge_clip_end:
201
202 _ma_clip:
203 add r12,pc,#0x540  @ adr r12,ma_buffer_start
204 .word 0xea000091  @ b ma_start
205 add r0,pc,#0x248  @ adr r0,ma_again
206
207 _ma_noclip:
208 add r12,pc,#0x460  @ adr r12,ma_buffer_start
209 .word 0xea000059  @ b ma_start
210 add r0,pc,#0x23c  @ adr r0,ma_again
211
212
213 AAS_MixAudio_SetMode_BoostAndClip:
214         adr r12,_ma_clip
215         adr r0,_ma_merge_clip_start
216         mov r2,#((_ma_merge_clip_end-_ma_merge_clip_start)/4)
217
218 do_mods:
219         ldr r1,=_AAS_MixAudio_mod4
220         add r2,r2,#0x84000000
221         mov r3,#0x04000000
222         add r3,r3,#0xd4
223         stmia r3,{r0-r2}
224         ldmia r12,{r1-r3}
225         ldr r0,=_AAS_MixAudio_mod1
226         str r1,[r0]
227         ldr r0,=_AAS_MixAudio_mod2
228         str r2,[r0]
229         ldr r0,=_AAS_MixAudio_mod3
230         str r3,[r0]
231         bx lr
232
233
234 AAS_MixAudio_SetMode_Normal:
235         adr r12,_ma_noclip
236         adr r0,_ma_merge_noclip_start
237         mov r2,#((_ma_merge_noclip_end-_ma_merge_noclip_start)/4)
238         b do_mods
239         
240         
241 AAS_MixAudio_SetMode_Boost:
242         adr r12,_ma_noclip
243         adr r0,_ma_merge_boostnoclip_start
244         mov r2,#((_ma_merge_boostnoclip_end-_ma_merge_boostnoclip_start)/4)
245         b do_mods
246         
247
248 _ma_2ch:
249 mov r6,#0x10000000
250 mov r10,#2
251 mov r14,#2
252 sub r1,r1,#(20*2)
253
254 _ma_4ch:
255 mov r6,#0x30000000
256 mov r10,#4
257 mov r14,#4
258 sub r1,r1,#(20*4)
259
260 _ma_8ch:
261 mov r6,#0x70000000
262 mov r10,#8
263 mov r14,#8
264 sub r1,r1,#(20*8)
265
266
267 AAS_MixAudio_SetMaxChans_4:
268         adr r12,_ma_4ch
269
270 do_mods2:
271         ldmia r12,{r0-r3}
272         ldr r12,=_AAS_MixAudio_mod5
273         str r0,[r12]
274         ldr r12,=_AAS_MixAudio_mod6
275         str r1,[r12]
276         ldr r12,=_AAS_MixAudio_mod7
277         str r2,[r12]
278         ldr r12,=_AAS_MixAudio_mod8
279         str r3,[r12]
280         bx lr
281
282
283 AAS_MixAudio_SetMaxChans_8:
284         adr r12,_ma_8ch
285         b do_mods2
286         
287         
288 AAS_MixAudio_SetMaxChans_2:
289         adr r12,_ma_2ch
290         b do_mods2
291
292 .pool
293
294
295 AAS_DoDMA3:
296         mov r3,#0x04000000
297         add r3,r3,#0xd4
298         stmia r3,{r0-r2}
299         bx lr