@ Copyright (c) 2003-2021 James Daniels @ Distributed under the MIT License @ license terms: see LICENSE file in root or http://opensource.org/licenses/MIT .TEXT .SECTION .text,"ax",%progbits .ALIGN .ARM .GLOBAL AAS_DoDMA3 .GLOBAL AAS_MixAudio_SetMode_Normal .GLOBAL AAS_MixAudio_SetMode_Boost .GLOBAL AAS_MixAudio_SetMode_BoostAndClip .GLOBAL AAS_MixAudio_SetMaxChans_2 .GLOBAL AAS_MixAudio_SetMaxChans_4 .GLOBAL AAS_MixAudio_SetMaxChans_8 .GLOBAL _AAS_vol_lookup @ Volume lookup table. -1 means use multiply, 0 to 7 means use bit shift. _AAS_vol_lookup: .byte 0, 1, -1, 2, -1, -1, -1, 3, -1, -1, -1, -1, -1, -1, -1, 4 .byte -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5 .byte -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 .byte -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 6 .byte -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 .byte -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 .byte -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 .byte -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 7 _ma_mul_r5_r0_r3: .word 0x00000010 mul r5,r0,r3 _ma_mov_r5_r0_lsl_0: .word 0x00000001 mov r5,r0,lsl #0 _ma_mlane_r5_r0_r3_r5: .word 0x00000011 mlane r5,r0,r3,r5 _ma_add_r5_r5_r0_lsl_0: .word 0x00000011 add r5,r5,r0,lsl #0 _ma_merge_noclip_start: @ ma_again: @ Merge ldr r14,[sp,#24] and r5,r14,r5,lsr #8 and r6,r14,r6,lsr #8 and r7,r14,r7,lsr #8 and r8,r14,r8,lsr #8 and r9,r14,r9,lsr #8 and r10,r14,r10,lsr #8 and r11,r14,r11,lsr #8 and r12,r14,r12,lsr #8 add r5,r5,r6,lsl #8 add r6,r7,r8,lsl #8 add r7,r9,r10,lsl #8 add r8,r11,r12,lsl #8 @ Store stmia r4!,{r5-r8} @ Loop subs r14,r14,#0x2000000 .word 0xdaffffa5 @ ble ma_end @ ma_start: str r14,[sp,#24] _ma_merge_noclip_end: _ma_merge_boostnoclip_start: @ ma_again: @ Merge ldr r14,[sp,#24] and r5,r14,r5,lsr #7 and r6,r14,r6,lsr #7 and r7,r14,r7,lsr #7 and r8,r14,r8,lsr #7 and r9,r14,r9,lsr #7 and r10,r14,r10,lsr #7 and r11,r14,r11,lsr #7 and r12,r14,r12,lsr #7 add r5,r5,r6,lsl #8 add r6,r7,r8,lsl #8 add r7,r9,r10,lsl #8 add r8,r11,r12,lsl #8 @ Store stmia r4!,{r5-r8} @ Loop subs r14,r14,#0x2000000 .word 0xdaffffa5 @ ble ma_end @ ma_start: str r14,[sp,#24] _ma_merge_boostnoclip_end: _ma_merge_clip_start: _ma_mask_0x80808080: .word 0x80808080 .word 0,0 @ padding @ ma_again: @ Merge ldr r14,[sp,#24] .word 0xe51f2018 @ ldr r2,_ma_mask_0x80808080 and r0,r14,r5,lsr #8 and r1,r14,r6,lsr #8 add r0,r0,r1,lsl #8 and r5,r14,r5,lsr #7 and r6,r14,r6,lsr #7 add r5,r5,r6,lsl #8 eor r0,r0,r5 ands r0,r2,r0 beq no_clip1 @ perhaps not worthwhile? and r1,r2,r5 sub r1,r2,r1,lsr #7 sub r0,r0,r0,lsr #7 orr r0,r0,r0,lsl #1 bic r5,r5,r0 and r1,r1,r0 orr r5,r5,r1 no_clip1: and r0,r14,r7,lsr #8 and r1,r14,r8,lsr #8 add r0,r0,r1,lsl #8 and r7,r14,r7,lsr #7 and r8,r14,r8,lsr #7 add r6,r7,r8,lsl #8 eor r0,r0,r6 ands r0,r2,r0 beq no_clip2 @ perhaps not worthwhile? and r1,r2,r6 sub r1,r2,r1,lsr #7 sub r0,r0,r0,lsr #7 orr r0,r0,r0,lsl #1 bic r6,r6,r0 and r1,r1,r0 orr r6,r6,r1 no_clip2: and r0,r14,r9,lsr #8 and r1,r14,r10,lsr #8 add r0,r0,r1,lsl #8 and r9,r14,r9,lsr #7 and r10,r14,r10,lsr #7 add r7,r9,r10,lsl #8 eor r0,r0,r7 ands r0,r2,r0 beq no_clip3 @ perhaps not worthwhile? and r1,r2,r7 sub r1,r2,r1,lsr #7 sub r0,r0,r0,lsr #7 orr r0,r0,r0,lsl #1 bic r7,r7,r0 and r1,r1,r0 orr r7,r7,r1 no_clip3: and r0,r14,r11,lsr #8 and r1,r14,r12,lsr #8 add r0,r0,r1,lsl #8 and r11,r14,r11,lsr #7 and r12,r14,r12,lsr #7 add r8,r11,r12,lsl #8 eor r0,r0,r8 ands r0,r2,r0 beq no_clip4 @ perhaps not worthwhile? and r1,r2,r8 sub r1,r2,r1,lsr #7 sub r0,r0,r0,lsr #7 orr r0,r0,r0,lsl #1 bic r8,r8,r0 and r1,r1,r0 orr r8,r8,r1 no_clip4: @ Store stmia r4!,{r5-r8} @ Loop subs r14,r14,#0x2000000 .word 0xdaffff6d @ ble ma_end @ ma_start: str r14,[sp,#24] _ma_merge_clip_end: _ma_clip: add r12,pc,#0x540 @ adr r12,ma_buffer_start .word 0xea000091 @ b ma_start add r0,pc,#0x248 @ adr r0,ma_again _ma_noclip: add r12,pc,#0x460 @ adr r12,ma_buffer_start .word 0xea000059 @ b ma_start add r0,pc,#0x23c @ adr r0,ma_again AAS_MixAudio_SetMode_BoostAndClip: adr r12,_ma_clip adr r0,_ma_merge_clip_start mov r2,#((_ma_merge_clip_end-_ma_merge_clip_start)/4) do_mods: ldr r1,=_AAS_MixAudio_mod4 add r2,r2,#0x84000000 mov r3,#0x04000000 add r3,r3,#0xd4 stmia r3,{r0-r2} ldmia r12,{r1-r3} ldr r0,=_AAS_MixAudio_mod1 str r1,[r0] ldr r0,=_AAS_MixAudio_mod2 str r2,[r0] ldr r0,=_AAS_MixAudio_mod3 str r3,[r0] bx lr AAS_MixAudio_SetMode_Normal: adr r12,_ma_noclip adr r0,_ma_merge_noclip_start mov r2,#((_ma_merge_noclip_end-_ma_merge_noclip_start)/4) b do_mods AAS_MixAudio_SetMode_Boost: adr r12,_ma_noclip adr r0,_ma_merge_boostnoclip_start mov r2,#((_ma_merge_boostnoclip_end-_ma_merge_boostnoclip_start)/4) b do_mods _ma_2ch: mov r6,#0x10000000 mov r10,#2 mov r14,#2 sub r1,r1,#(20*2) _ma_4ch: mov r6,#0x30000000 mov r10,#4 mov r14,#4 sub r1,r1,#(20*4) _ma_8ch: mov r6,#0x70000000 mov r10,#8 mov r14,#8 sub r1,r1,#(20*8) AAS_MixAudio_SetMaxChans_4: adr r12,_ma_4ch do_mods2: ldmia r12,{r0-r3} ldr r12,=_AAS_MixAudio_mod5 str r0,[r12] ldr r12,=_AAS_MixAudio_mod6 str r1,[r12] ldr r12,=_AAS_MixAudio_mod7 str r2,[r12] ldr r12,=_AAS_MixAudio_mod8 str r3,[r12] bx lr AAS_MixAudio_SetMaxChans_8: adr r12,_ma_8ch b do_mods2 AAS_MixAudio_SetMaxChans_2: adr r12,_ma_2ch b do_mods2 .pool AAS_DoDMA3: mov r3,#0x04000000 orr r3,r3,#0xd4 stmia r3,{r0-r2} bx lr