X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=Pico%2Fsound%2Fmix.s;h=d44e2280ef4d19fe327af332aafd5345395359b7;hb=4a32f01f5527929fe5feafd53937007dcfd64735;hp=ab0853e1af8b139f67be94a31e1fc25554b2810c;hpb=4f265db77684ec33f9533e7c76734498df03bba4;p=picodrive.git diff --git a/Pico/sound/mix.s b/Pico/sound/mix.s index ab0853e..d44e228 100644 --- a/Pico/sound/mix.s +++ b/Pico/sound/mix.s @@ -1,63 +1,11 @@ @ vim:filetype=armasm -.global memcpy32 @ int *dest, int *src, int count - -memcpy32: - stmfd sp!, {r4,lr} - - subs r2, r2, #4 - bmi mcp32_fin - -mcp32_loop: - ldmia r1!, {r3,r4,r12,lr} - subs r2, r2, #4 - stmia r0!, {r3,r4,r12,lr} - bpl mcp32_loop - -mcp32_fin: - tst r2, #3 - ldmeqfd sp!, {r4,pc} - tst r2, #1 - ldrne r3, [r1], #4 - strne r3, [r0], #4 - -mcp32_no_unal1: - tst r2, #2 - ldmneia r1!, {r3,r12} - ldmfd sp!, {r4,lr} - stmneia r0!, {r3,r12} - bx lr - - - -.global memset32 @ int *dest, int c, int count - -memset32: - stmfd sp!, {lr} - - mov r3, r1 - subs r2, r2, #4 - bmi mst32_fin - - mov r12,r1 - mov lr, r1 - -mst32_loop: - subs r2, r2, #4 - stmia r0!, {r1,r3,r12,lr} - bpl mst32_loop - -mst32_fin: - tst r2, #1 - strne r1, [r0], #4 - - tst r2, #2 - stmneia r0!, {r1,r3} - - ldmfd sp!, {lr} - bx lr +@ Generic routines for mixing audio samples +@ (c) Copyright 2007, Grazvydas "notaz" Ignotas +.text +.align 4 @ this assumes src is word aligned .global mix_16h_to_32 @ int *dest, short *src, int count @@ -206,10 +154,10 @@ m16_32_s2_no_unal2: @ limit @ reg=int_sample, lr=1, r3=tmp, kills flags .macro Limit reg - add r3, lr, \reg, asr #16 + add r3, lr, \reg, asr #15 bics r3, r3, #1 @ in non-overflow conditions r3 is 0 or 1 movne \reg, #0x8000 - submi \reg, \reg, #1 + subpl \reg, \reg, #1 .endm @@ -223,11 +171,11 @@ m16_32_s2_no_unal2: @ mov r3, #0x8000 @ subpl r3, r3, #1 - add r3, lr, \reg, asr #16 + add r3, lr, \reg, asr #15 bics r3, r3, #1 @ in non-overflow conditions r3 is 0 or 1 moveq \reg, \reg, lsl #16 movne \reg, #0x80000000 - submi \reg, \reg, #0x00010000 + subpl \reg, \reg, #0x00010000 .endm @@ -292,7 +240,7 @@ mix_32_to_16_mono: @ check if dest is word aligned tst r0, #2 beq m32_16_mo_no_unalw - ldrsh r5, [r0], #2 + ldrsh r5, [r0] ldr r4, [r1], #4 sub r2, r2, #1 add r4, r4, r5 @@ -339,7 +287,7 @@ m32_16_mo_end: m32_16_mo_no_unal2: tst r2, #1 ldmeqfd sp!, {r4-r8,pc} - ldrsh r5, [r0], #2 + ldrsh r5, [r0] ldr r4, [r1], #4 add r4, r4, r5 Limit r4 @@ -348,3 +296,72 @@ m32_16_mo_no_unal2: ldmfd sp!, {r4-r8,lr} bx lr + + +.data +.align 4 + +.global mix_32_to_16l_level +mix_32_to_16l_level: + .word 0 + +.text +.align 4 + +@ same as mix_32_to_16l_stereo, but with additional shift +.global mix_32_to_16l_stereo_lvl @ short *dest, int *src, int count + +mix_32_to_16l_stereo_lvl: + stmfd sp!, {r4-r9,lr} + + ldr r9, =mix_32_to_16l_level + mov lr, #1 + ldr r9, [r9] + + mov r2, r2, lsl #1 + subs r2, r2, #4 + bmi m32_16l_st_l_end + +m32_16l_st_l_loop: + ldmia r0, {r8,r12} + ldmia r1!, {r4-r7} + mov r8, r8, lsl #16 + mov r12,r12,lsl #16 + add r4, r4, r8, asr #16 + add r5, r5, r8, asr #16 + add r6, r6, r12,asr #16 + add r7, r7, r12,asr #16 + mov r4, r4, asr r9 + mov r5, r5, asr r9 + mov r6, r6, asr r9 + mov r7, r7, asr r9 + Limitsh r4 + Limitsh r5 + Limitsh r6 + Limitsh r7 + subs r2, r2, #4 + orr r4, r5, r4, lsr #16 + orr r5, r7, r6, lsr #16 + stmia r0!, {r4,r5} + bpl m32_16l_st_l_loop + +m32_16l_st_l_end: + @ check for remaining bytes to convert + tst r2, #2 + beq m32_16l_st_l_no_unal2 + ldrsh r6, [r0] + ldmia r1!,{r4,r5} + add r4, r4, r6 + add r5, r5, r6 + mov r4, r4, asr r9 + mov r5, r5, asr r9 + Limitsh r4 + Limitsh r5 + orr r4, r5, r4, lsr #16 + str r4, [r0], #4 + +m32_16l_st_l_no_unal2: + ldmfd sp!, {r4-r9,lr} + bx lr + +