Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /**************************************/
- /* Project: NitroLib */
- /* File: snd_MixProc.s */
- /* Copyright (c) 2011, Aikku */
- /**************************************/
- /* HISTORY */
- /**************************************/
- /* 10-06-18 */
- /* Added reverb \o/ */
- /* 10-05-22 */
- /* Added sound buffer flushing */
- /* 10-05-20 */
- /* Added 11-bit mixing (faster) */
- /* 10-05-08 */
- /* Fixed bugs */
- /* 10-05-03 */
- /* Added LERP all #define */
- /* Added proper delta rounding */
- /* 10-05-01 */
- /* Changed envelopes to 8.8 */
- /* Doubled update speed (~120Hz) */
- /* Added linear envelope #define */
- /* 10-04-30 */
- /* Fixed command queue bug */
- /* 10-04-25 */
- /* Fixed usage timing */
- /* 10-04-20 */
- /* Added cycle usage #define */
- /* 10-04-19 */
- /* Added queue system */
- /* 10-04-18 */
- /* Complete rewrote looping scheme */
- /* Fixed sample count calculator */
- /* Fixed LERP shift bug */
- /* 10-04-16 */
- /* Switched back to 32728Hz */
- /* Switched to 24 channels */
- /* Added linear interpolation def */
- /* Changed delta table (x^2 -> x^3) */
- /* 10-04-11 */
- /* Improved mixing loop (remove end */
- /* of sample check from every skip) */
- /* chan.end -> chan.sampRem */
- /* samp.loopLen -> samp.loopStart */
- /* 10-04-09 */
- /* Fixed sample skipping loop */
- /* Optimized mixdown pre-loop */
- /* Switched to 22050Hz */
- /* 10-04-07 */
- /* Switched to oct-buffer */
- /* Added end-of-sample code */
- /* 10-04-05 */
- /* Removed sound multiplier from */
- /* mixdown. */
- /* Fixed mixdown code. */
- /* Added IRQ off #define. */
- /* 10-03-30 */
- /* Fixed buffer clear */
- /* Fixed samp end pointer */
- /* Optimized samp storeback */
- /* 10-03-27 */
- /* Change cpsr at once - not modify */
- /* 10-03-26 */
- /* Added mADPCM code v0.1 */
- /* smp += tab[(signed)nib]! */
- /* 10-03-25 */
- /* Initial release. */
- /**************************************/
- #define MIX11 0
- #define LERP 1
- #define LERP_ALL 1
- #define IRQ_ON 1
- #define LINEAR 0
- #define REVERB 1
- #define TIMING 0
- /**************************************/
- .section .itcm, "ax", %progbits
- .align
- .arm
- /**************************************/
- snd_MixProc:
- #if TIMING
- ldr r0, =0x04000000
- ldr r1, =0x00800000
- str r1, [r0, #0x104]
- add r1, r1, #0x040000
- str r1, [r0, #0x108]
- #endif
- #if IRQ_ON
- #if !TIMING
- mov r0, #0x04000000
- #endif
- ldr r1, [r0, #0x210]
- bic r1, r1, #0x08
- str r1, [r0, #0x210]
- stmfd sp!, {lr}
- mrs r0, cpsr
- mrs r1, spsr
- msr cpsr, #0x1F
- stmfd sp!, {r0-r1,r4-r12,lr}
- #else
- stmfd sp!, {r4-r11,lr}
- #endif
- ldr r0, =snd_MixBuf
- ldr r1, =0
- ldr r2, =0
- ldr r3, =0
- ldr r4, =0
- ldr r5, =0
- ldr r6, =0
- ldr r7, =0
- ldr r8, =0
- ldr r9, =272
- 1: stmia r0!, {r1-r8}
- stmia r0!, {r1-r8}
- #if !MIX11
- stmia r0!, {r1-r8}
- stmia r0!, {r1-r8}
- #endif
- subs r9, r9, #0x10
- bne 1b
- ldr r4, =snd_QueueDat
- ldrh r5, [r4], #0x04
- mov r6, r5, lsr #0x08
- bic r5, r5, r6, lsl #0x08
- and r6, r6, #0x3F
- 1: cmp r5, r6
- beq 2f
- ldr r1, [r4, r5]
- add r5, r5, #0x04
- and r5, r5, #0x3F
- mov r0, r1, lsr #0x1C
- mov r2, r0, lsr #0x02
- bic r1, r1, r0, lsl #0x1C
- bic r0, r0, r2, lsl #0x02
- adr lr, 1b
- ldr pc, [pc, r2, lsl #0x02]
- nop
- .word snd_iSeqPlay
- .word snd_iSeqStop
- .word snd_iSeqKill
- 2: strb r5, [r4, #-0x04]
- blx snd_SeqProc
- ldr r0, =snd_ChnDat - 56
- ldr r1, =24
- .Lchan_read_loop:
- ldr r2, [r0, #0x38]!
- tst r2, #0x80
- beq .Lchan_read_ok
- tst r2, #0x40
- beq .Lchan_skip_noteon
- bic r2, r2, #0x00000043
- bic r2, r2, #0x00FF0000
- bic r2, r2, #0xFF000000
- @ r3 = smp<<16 | subPos
- @ r4 = smpRem
- @ r5 = adDat
- @ r6 = smpNow
- @ r7 = tabPos
- add r8, r0, #0x24
- ldr r6, [r0, #0x18] @ r6 = smp
- ldr r5, [r6, #0x10]! @ r5 = adpack, r5 = smp.data
- ldr r4, [r6, #0x04-0x10] @ r4 = loop len
- ldr r3, [r6, #0x00-0x10]
- add r4, r4, r3 @ r4 = full len
- mov r4, r4, lsl #0x0A
- mov r3, #0x00 @ r3 = 0 [smp | pos]
- ldr r7, =snd_DelTab @ r7 = tabPos
- stmia r8, {r3-r7}
- .Lchan_skip_noteon:
- tst r2, #0x08
- bne 1f
- tst r2, #0x20
- @bicne r2, r2, #0x20 @ pointless, only ever changed here
- orrne r2, r2, #0x03
- and lr, r2, #0xFF00
- 1: bic r3, r2, #0xFF
- bic r3, r3, #0xFF00
- and r4, r2, #0x03
- ldr pc, [pc, r4, lsl #0x02]
- nop
- .word .Lchan_attack
- .word .Lchan_decay
- .word .Lchan_sustain
- .word .Lchan_release
- .Lchan_attack:
- ldrh r4, [r0, #0x04]
- adds r3, r3, r4, lsl #0x10
- bcs 1f
- bne .Lchan_env_ok @ env <= FFFF, env != 0
- 1: mvn r3, #0x00
- mov r3, r3, lsl #0x10
- add r2, r2, #0x01
- b .Lchan_env_ok
- .Lchan_decay:
- ldrh r4, [r0, #0x06]
- subs r3, r3, r4, lsl #0x10
- movcc r3, #0x00
- ldrh r4, [r0, #0x08]
- cmp r4, r3, lsr #0x10
- movhi r3, r4, lsl #0x10
- addhi r2, r2, #0x01
- b .Lchan_env_ok
- .Lchan_sustain:
- ldrh r3, [r0, #0x08]
- mov r3, r3, lsl #0x10
- b .Lchan_env_ok
- .Lchan_release:
- ldrh r4, [r0, #0x0A]
- cmp r4, #0x00
- subnes r3, r3, r4, lsl #0x10
- movls r3, #0x00
- .Lchan_env_ok:
- movs r6, r3, lsr #0x01
- mov r2, r2, lsl #0x10
- orrne r2, r3, r2, lsr #0x10
- str r2, [r0]
- beq .Lchan_read_ok
- #if LINEAR
- ldr r5, [r0, #0x10]
- mov r4, r5, lsr #0x08
- and r4, r4, #0xFF
- smulbb r4, r4, r4 @ 7F*7F = 3F01
- smulwb r3, r6, r4 @ 7FFF0000*3F01>>16 = 1F8040FF
- ldrh r4, [r0, #0x14]
- and r6, r4, #0xFF
- smulwb r3, r3, r6 @ 1F8040FF*7F>>16 = 000FA0A0
- and r4, r4, #0xFF00
- rsb r6, r4, #0x7F00
- smulwb r4, r3, r4 @ 000FA0A0*7F00>>16 = 0007C0AF
- smulwb r3, r3, r6
- mov r3, r3, lsr #0x08
- mov r4, r4, lsr #0x08
- orr r3, r3, r4, lsl #0x10
- #else
- ldr r5, [r0, #0x10]
- mov r4, r5, lsr #0x08
- and r4, r4, #0xFF
- smulbb r4, r4, r4 @ 7F*7F = 3F01
- smulwt r6, r6, r6 @ 7FFF8000*7FFF>>16 = 3FFF4000
- smulwb r3, r6, r4 @ 3FFF4000*3F01>>16 = 0FC010BF
- ldrh r4, [r0, #0x14]
- and r6, r4, #0xFF
- smulwb r3, r3, r6 @ 0FC010BF*7F>>16 = 0007D048
- and r4, r4, #0xFF00
- rsb r6, r4, #0x7F00
- smulwb r4, r3, r4 @ 0007D048*7F00>>16 = 0003E053
- smulwb r3, r3, r6
- mov r3, r3, lsr #0x07
- mov r4, r4, lsr #0x07
- orr r3, r3, r4, lsl #0x10
- #endif
- ldr ip, [r0, #0x18]
- and r7, r5, #0xFF
- cmp r7, #0xFF
- ldreqh r4, [r0, #0x16]
- moveq r4, r4, lsl #0x02
- beq .Lchan_freq_ok
- .Lchan_calc_freq:
- cmp lr, #0x00
- movne r7, lr, lsr #0x08
- and r6, r5, #0xFF0000 @ bndMul
- mov r8, r5, asr #0x08 @ bnd
- smultt r6, r6, r8
- add r4, r6, r7, lsl #0x06 @ bnd + key<<6
- ldr r5, [r0, #0x0C]
- and r6, r5, #0xFF
- subs r6, r6, #0x01
- strneb r6, [r0, #0x0C]
- bne .Lchan_lfo_ok
- ands r6, r5, #0xFF0000
- andnes r7, r5, #0xFF00
- beq .Lchan_lfo_ok
- add r7, r5, r7, lsl #0x10
- str r7, [r0, #0x0C]
- mov r5, r5, lsr #0x18
- and r7, r5, #0x3F
- tst r5, #0x40
- rsbne r7, r7, #0x80
- tst r5, #0x80
- rsbne r7, r7, #0x00
- smultb r5, r6, r7
- add r4, r4, r5, asr #0x06
- .Lchan_lfo_ok:
- ands r5, r4, #0x3F
- and r4, r4, #0x7F << 6
- ldr r6, =snd_FrqTab
- ldr r4, [r6, r4, lsr #0x04]!
- ldrne r6, [r6, #0x04] @ only needed if tune != 0 [else mul by 0]
- sub r6, r6, r4
- mov r6, r6, lsl #0x05
- smulwb r5, r6, r5
- add r4, r4, r5, lsl #0x05 @ lower 8-32 bits are precision, anyway
- ldr r8, [ip, #0x08]
- umull r8, r4, r4, r8
- .Lchan_freq_ok:
- ldr r5, =0x080280C8
- umulls r5, r4, r4, r5
- addcs r4, r4, #0x01
- ldmia ip, {r5-r6}
- movs r5, r5, lsl #0x01 @ looped?
- addne r5, ip, r5, lsr #0x02 @ yes - set start pos
- addne r5, r5, #0x10 @ skip header
- str r5, .Lloop+0 @ <- loop start
- strne r6, .Lloop+4 @ <- loop len
- ldrne r7, [ip, #0x0C]
- strne r7, .Lloop+8 @ <- loop inf
- add r5, r0, #0x24
- ldmia r5, {r5-r9}
- orr r4, r4, r5, lsl #0x10
- bic r5, r5, r4, lsr #0x10
- ldr sl, =snd_MixBuf
- ldr fp, =272
- stmfd sp!, {r0,r1,r6,fp}
- .Lchan_mix_prep:
- ldr r6, [sp, #0x08]
- smulbb r1, r4, fp @ assume delta < 0x8000U (32.0)
- rsbs r1, r1, r6
- strge r1, [sp, #0x08]
- bge .Lchan_calcmix
- mov r1, #0x04000000
- str r6, [r1, #0x290]
- mov r2, r4, lsl #0x10
- mov r2, r2, lsr #0x10
- str r2, [r1, #0x298]
- str r1, [r1, #0x280]
- 1: ldr r0, [r1, #0x280]
- tst r0, #0x8000
- bne 1b
- ldr fp, [r1, #0x2A0]
- ldr r0, [r1, #0x2A8]
- cmp r0, #0x00
- addne fp, fp, #0x01
- smulbb r1, r4, fp @ assume delta < 0x8000U (32.0)
- rsb r1, r1, r6
- str r1, [sp, #0x08]
- .Lchan_calcmix:
- ldr r0, [sp, #0x0C]
- sub r0, r0, fp
- str r0, [sp, #0x0C]
- #if LERP
- mov r0, r4, lsl #0x10
- cmp r0, #0x04000000
- bhi .Lmix_no_lerp
- mov r0, r4, lsr #0x10
- bic r4, r4, r0, lsl #0x10
- orr r4, r4, r0, lsl #0x15
- .Lmix_lerp:
- mov ip, r7, asr #0x1C
- ldr ip, [r9, ip, lsl #0x02]!
- /**************************************/
- /* 11-bit MIXING */
- /**************************************/
- #if MIX11
- /**************************************/
- ands r0, fp, #0x03
- mvn r1, #0x00
- add fp, r1, fp, lsl #0x10 @ FFFFh + (cnt-1)<<16
- beq .Lchan_mix_lerp
- sub fp, fp, r0, lsl #0x10
- @ r0: [smp temp]
- @ r1: [smp temp]
- @ r2: [smp temp]
- @ r3: volL | volR<<16
- @ r4: delta | subPos<<16
- @ r5: smpLast<<16 | smpDelta
- @ r6: [smp temp] [smpRem]
- @ r7: smpPack
- @ r8: smpNow
- @ r9: tabPos
- @ sl: dstBuffer
- @ fp: mixCount-1<<16 | 0xFFFF
- @ ip: [mix temp]
- @ sp: ---
- @ lr: [mix temp]
- .macro mixl dst
- smultb ip, r4, r5
- qdadd ip, r5, ip
- smultb lr, ip, r3
- and lr, lr, fp, lsl #0x10
- add \dst, lr, \dst, ror #0x10
- smultt lr, ip, r3
- and lr, lr, fp, lsl #0x10
- add \dst, lr, \dst, ror #0x10
- adds r4, r4, r4, lsl #0x15
- bpl 1f
- bic r4, r4, #0x80000000
- mov ip, r5, lsl #0x10
- qadd r5, r5, ip
- and r5, r5, fp, lsl #0x10
- movs r7, r7, lsl #0x04
- ldreq r7, [r8, #0x04]!
- mov ip, r7, asr #0x1C
- ldr ip, [r9, ip, lsl #0x02]!
- orr r5, r5, ip, lsr #0x10
- 1:
- .endm
- .Lchan_mixrem_lerp:
- ldmia sl, {r1}
- mixl r1
- stmia sl!, {r1}
- subs r0, r0, #0x01
- bne .Lchan_mixrem_lerp
- cmp fp, #0x00
- bmi .Lchan_mix_lerp_ok
- .Lchan_mix_lerp:
- ldmia sl, {r0,r1,r2,r6}
- mixl r0
- mixl r1
- mixl r2
- mixl r6
- stmia sl!, {r0,r1,r2,r6}
- subs fp, fp, #0x040000
- bpl .Lchan_mix_lerp
- /**************************************/
- #else
- /**************************************/
- tst fp, #0x01
- beq .Lchan_mix_lerp
- @ r0: [smp temp]
- @ r1: [smp temp]
- @ r2: [smp temp]
- @ r3: volL | volR<<16
- @ r4: delta | subPos<<16
- @ r5: smpLast<<16
- @ r6: [smp temp] [smpRem]
- @ r7: smpPack
- @ r8: smpNow
- @ r9: tabPos
- @ sl: dstBuffer
- @ fp: mixCount
- @ ip: smpDel
- @ sp: ---
- @ lr: [mix temp]
- .macro mixl d0, d1
- smultt lr, r4, ip
- qdadd lr, r5, lr
- smlatb \d0, lr, r3, \d0
- smlatt \d1, lr, r3, \d1
- adds r4, r4, r4, lsl #0x15
- bpl 1f
- bic r4, r4, #0x80000000
- qadd r5, r5, ip
- movs r7, r7, lsl #0x04
- ldreq r7, [r8, #0x04]!
- mov ip, r7, asr #0x1C
- ldr ip, [r9, ip, lsl #0x02]!
- 1:
- .endm
- .Lchan_mixrem_lerp:
- ldmia sl, {r0,r1}
- mixl r0, r1
- stmia sl!, {r0,r1}
- subs fp, fp, #0x01
- beq .Lchan_mix_lerp_ok
- .Lchan_mix_lerp:
- ldmia sl, {r0,r1,r2,r6}
- mixl r0, r1
- mixl r2, r6
- stmia sl!, {r0,r1,r2,r6}
- subs fp, fp, #0x02
- bne .Lchan_mix_lerp
- /**************************************/
- #endif
- /**************************************/
- .Lchan_mix_lerp_ok:
- mov ip, r7, asr #0x1C
- sub r9, r9, ip, lsl #0x02
- mov r0, r4, lsr #0x15
- bic r4, r4, r0, lsl #0x15
- orr r4, r4, r0, lsl #0x10
- b .Lchan_mix_ok
- #endif
- .Lmix_no_lerp:
- #if LERP_ALL
- mov lr, r7, asr #0x1C
- ldr lr, [r9, lr, lsl #0x02]!
- #endif
- /**************************************/
- /* 11-bit MIXING */
- /**************************************/
- #if MIX11
- /**************************************/
- #if LERP_ALL
- orr r5, r5, lr, lsr #0x10
- #endif
- ands r0, fp, #0x03
- mvn r1, #0x00
- add fp, r1, fp, lsl #0x10 @ FFFFh + (cnt-1)<<16
- beq .Lchan_mix
- sub fp, fp, r0, lsl #0x10
- @ r0: [smp temp]
- @ r1: [smp temp]
- @ r2: [smp temp]
- @ r3: volL | volR<<16
- @ r4: delta | subPos<<16
- @ r5: smpLast<<16 [ | delta]
- @ r6: [smp temp] [smpRem]
- @ r7: smpPack
- @ r8: smpNow
- @ r9: tabPos
- @ sl: dstBuffer
- @ fp: mixCount-1<<16 | 0xFFFF
- @ ip: [mix temp]
- @ sp: ---
- @ lr: [mix temp]
- .macro mix dst
- #if LERP_ALL
- smultb ip, r4, r5
- mov ip, ip, lsl #0x10-10
- qadd ip, ip, r5
- smultb lr, ip, r3
- and lr, lr, fp, lsl #0x10
- add \dst, lr, \dst, ror #0x10
- smultt lr, ip, r3
- and lr, lr, fp, lsl #0x10
- add \dst, lr, \dst, ror #0x10
- #else
- smultb ip, r5, r3
- and ip, ip, fp, lsl #0x10
- add \dst, ip, \dst, ror #0x10
- smultt ip, r5, r3
- and ip, ip, fp, lsl #0x10
- add \dst, ip, \dst, ror #0x10
- #endif
- add r4, r4, r4, lsl #0x10
- #if LERP //! if LERP is enabled, this loop processes delta > 1.0, no need to check
- sub r4, r4, #0x04000000
- #else
- subs ip, r4, #0x04000000
- bmi 2f
- #endif
- #if LERP_ALL
- mov lr, r5, lsl #0x10
- 1: qadd r5, r5, lr
- movs r7, r7, lsl #0x04
- ldreq r7, [r8, #0x04]!
- mov lr, r7, asr #0x1C
- ldr lr, [r9, lr, lsl #0x02]!
- #else
- 1: mov lr, r7, asr #0x1C
- ldr lr, [r9, lr, lsl #0x02]!
- movs r7, r7, lsl #0x04
- ldreq r7, [r8, #0x04]!
- qadd r5, r5, lr
- #endif
- #if LERP
- subs r4, r4, #0x04000000
- bpl 1b
- add r4, r4, #0x04000000
- #else
- subs ip, ip, #0x04000000
- bpl 1b
- add r4, ip, #0x04000000
- #endif
- and r5, r5, fp, lsl #0x10
- orr r5, r5, lr, lsr #0x10
- 2:
- .endm
- .Lchan_mixrem:
- ldmia sl, {r1}
- mix r1
- stmia sl!, {r1}
- subs r0, r0, #0x01
- bne .Lchan_mixrem
- cmp fp, #0x00
- bmi .Lchan_mix_nolerp_ok
- .Lchan_mix:
- ldmia sl, {r0,r1,r2,r6}
- mix r0
- mix r1
- mix r2
- mix r6
- stmia sl!, {r0,r1,r2,r6}
- subs fp, fp, #0x040000
- bpl .Lchan_mix
- /**************************************/
- #else
- /**************************************/
- tst fp, #0x01
- beq .Lchan_mix
- @ r0: [smp temp]
- @ r1: [smp temp]
- @ r2: [smp temp]
- @ r3: volL | volR<<16
- @ r4: delta | subPos<<16
- @ r5: smpLast<<16
- @ r6: [smp temp] [smpRem]
- @ r7: smpPack
- @ r8: smpNow
- @ r9: tabPos
- @ sl: dstBuffer
- @ fp: mixCount
- @ ip: [mix temp]
- @ sp: ---
- @ lr: [delta] (only when LERP_ALL is enabled)
- .macro mix d0, d1
- #if LERP_ALL
- smultt ip, lr, r4
- mov ip, ip, lsl #0x10-10
- qadd ip, ip, r5
- smlatb \d0, ip, r3, \d0
- smlatt \d1, ip, r3, \d1
- #else
- smlatb \d0, r5, r3, \d0
- smlatt \d1, r5, r3, \d1
- #endif
- add r4, r4, r4, lsl #0x10
- #if LERP
- sub r4, r4, #0x04000000
- #else
- subs ip, r4, #0x04000000
- bmi 2f
- #endif
- #if LERP_ALL
- 1: qadd r5, r5, lr
- movs r7, r7, lsl #0x04
- ldreq r7, [r8, #0x04]!
- mov lr, r7, asr #0x1C
- ldr lr, [r9, lr, lsl #0x02]!
- #else
- 1: mov lr, r7, asr #0x1C
- ldr lr, [r9, lr, lsl #0x02]!
- movs r7, r7, lsl #0x04
- ldreq r7, [r8, #0x04]!
- qadd r5, r5, lr
- #endif
- #if LERP
- subs r4, r4, #0x04000000
- bpl 1b
- add r4, r4, #0x04000000
- #else
- subs ip, ip, #0x04000000
- bpl 1b
- add r4, ip, #0x04000000
- #endif
- 2:
- .endm
- .Lchan_mixrem:
- ldmia sl, {r0,r1}
- mix r0, r1
- stmia sl!, {r0,r1}
- subs fp, fp, #0x01
- beq .Lchan_mix_nolerp_ok
- .Lchan_mix:
- ldmia sl, {r0,r1,r2,r6}
- mix r0, r1
- mix r2, r6
- stmia sl!, {r0,r1,r2,r6}
- subs fp, fp, #0x02
- bne .Lchan_mix
- /**************************************/
- #endif
- /**************************************/
- .Lchan_mix_nolerp_ok:
- #if LERP_ALL
- mov ip, r7, asr #0x1C
- sub r9, r9, ip, lsl #0x02
- #if MIX11
- and r5, r5, fp, lsl #0x10
- #endif
- #endif
- .Lchan_mix_ok:
- ldr r6, [sp, #0x08]
- ldr fp, [sp, #0x0C]
- cmp r6, #0x00
- blle .Lsmp_end
- cmp fp, #0x00
- bne .Lchan_mix_prep
- ldmfd sp!, {r0,r1}
- add sp, sp, #0x08
- orr r5, r5, r4, lsr #0x10
- add r2, r0, #0x24
- stmia r2, {r5-r9}
- .Lchan_read_ok:
- subs r1, r1, #0x01
- bne .Lchan_read_loop
- .Lstart_mixdown:
- #if MIX11
- mvn r6, #0x00
- mov r5, #0x20
- orr r5, r5, r6, lsl #0x10
- mov r4, r5, lsr #0x11
- mov r3, #0x02 * 272
- ldr r2, =snd_MixInf
- ldrb r1, [r2]
- add r0, r1, #0x01
- and r0, r0, #0x3F
- strb r0, [r2]
- ldr r0, =snd_OutBuf
- smlabb r0, r1, r3, r0
- add r1, r0, r3, lsl #0x06
- ldr r2, =snd_MixBuf
- #else
- mvn r5, #0x00
- mov r4, r5, lsr #0x11
- mov r3, #0x02 * 272
- ldr r2, =snd_MixInf
- ldrb r1, [r2]
- add r0, r1, #0x01
- and r0, r0, #0x3F
- strb r0, [r2]
- ldr r0, =snd_OutBuf
- smlabb r0, r1, r3, r0
- add r1, r0, r3, lsl #0x06
- ldr r2, =snd_MixBuf
- #endif
- #if REVERB
- stmfd sp!, {r0-r1,r3}
- #endif
- .Lflush_lines:
- bic r7, r0, #0x1F
- bic r8, r1, #0x1F
- and r9, r0, #0x1F
- add r9, r9, r3
- .Lflush_go:
- mcr p15, 0, r7, c7, c14, 1
- mcr p15, 0, r8, c7, c14, 1
- add r7, r7, #0x20
- add r8, r8, #0x20
- subs r9, r9, #0x20
- bhi .Lflush_go
- /**************************************/
- /* 11-bit MIXING */
- /**************************************/
- #if MIX11
- /**************************************/
- @ r0: dstL
- @ r1: dstR
- @ r2: src
- @ r3: cnt*2
- @ r4: 7FFFh
- @ r5: 1<<5 | 0xFFFF<<16
- @ r6: [muxTmp]
- @ r7: [smp]
- @ r8: [smp]
- @ r9: [smp]
- @ sl: [tmp]
- @ fp: [smpTmp]
- @ ip: [smpTmp]
- .macro mux dst, sp0, sp1, chn
- .if \chn == 0
- smulbb \dst, r5, \sp0 @ SMP0 [left]
- teq \dst, \dst, lsl #0x10
- submi \dst, r4, \dst, asr #0x1F
- andpl \dst, \dst, r5, lsr #0x10
- smulbb r6, r5, \sp1 @ SMP1 [left]
- teq r6, r6, lsl #0x10
- submi r6, r4, r6, asr #0x1F
- orr \dst, \dst, r6, lsl #0x10
- .else
- smulbt \dst, r5, \sp0 @ SMP0 [right]
- teq \dst, \dst, lsl #0x10
- submi \dst, r4, \dst, asr #0x1F
- andpl \dst, \dst, r5, lsr #0x10
- smulbt r6, r5, \sp1 @ SMP1 [right]
- teq r6, r6, lsl #0x10
- submi r6, r4, r6, asr #0x1F
- orr \dst, \dst, r6, lsl #0x10
- .endif
- .endm
- 1: ldmia r2!, {r7,r8,r9,sl}
- mux ip, r7, r8, 0
- mux lr, r9, sl, 0
- stmia r0!, {ip,lr}
- mux ip, r7, r8, 1
- mux lr, r9, sl, 1
- stmia r1!, {ip,lr}
- subs r3, r3, #0x02*4
- bne 1b
- /**************************************/
- #else
- /**************************************/
- @ r0: dstL
- @ r1: dstR
- @ r2: src
- @ r3: cnt*2
- @ r4: 7FFFh
- @ r5: 0xFFFFFFFF
- @ r9: [smp]
- @ sl: [smp]
- @ fp: [smp]
- @ ip: [smp]
- .macro mux src, sid
- mov \src, \src, asr #0x0B
- teq \src, \src, lsl #0x10
- submi \src, r4, \src, asr #0x1F
- .if \sid == 0
- and \src, \src, r5, lsr #0x10
- .endif
- .endm
- 1: ldmia r2!, {r9-ip}
- mux r9, 0
- mux fp, 1
- orr r9, r9, fp, lsl #0x10
- str r9, [r0], #0x04
- mux sl, 0
- mux ip, 1
- orr sl, sl, ip, lsl #0x10
- str sl, [r1], #0x04
- subs r3, r3, #0x02*2
- bne 1b
- /**************************************/
- #endif
- /**************************************/
- /**************************************/
- /* REVERB PROCESSING */
- /**************************************/
- #if REVERB
- /**************************************/
- .Lrev_go:
- ldmfd sp!, {r0-r2}
- ldr r3, =snd_OutBuf + 272*64*2
- ldr r4, =snd_CmbDat-4
- stmfd sp!, {r4}
- @ r0: dstL
- @ r1: dstR
- @ r2: cnt
- @ r3: bufEndL
- @ r4: combData
- @ r5: combSrcL
- @ r6: combSrcR
- @ r7: combOld
- @ r8: combScale
- @ r9: comAdr
- @ sl: smpL
- @ fp: smpR
- .macro comb n
- ldmib r4!, {r5-r8}
- mov ip, r7, lsl #0x10
- ldrsh lr, [r6], #0x02
- mov lr, lr, lsl #0x10
- qadd r7, r7, lr
- movs r7, r7, asr #0x11
- adcmi r7, r7, #0x00
- mov r7, r7, lsl #0x10
- ldrsh lr, [r5], #0x02
- mov lr, lr, lsl #0x10
- qadd ip, ip, lr
- movs ip, ip, asr #0x11
- adcmi ip, ip, #0x00
- mov ip, ip, lsl #0x10
- orr r7, r7, ip, lsr #0x10
- smulbb ip, r7, r8
- smultb lr, r7, r8
- qadd sl, sl, ip
- qadd fp, fp, lr
- cmp r5, r3
- ldreq r5, =snd_OutBuf
- moveq r6, r3
- stmdb r4, {r5-r7}
- .endm
- .Lrev_do:
- ldrsh sl, [r0]
- ldrsh fp, [r1]
- mov sl, sl, lsl #0x10
- mov fp, fp, lsl #0x10
- comb 0
- comb 1
- comb 2
- comb 3
- mov sl, sl, asr #0x10
- mov fp, fp, asr #0x10
- strh sl, [r0], #0x02
- strh fp, [r1], #0x02
- subs r2, r2, #0x02*1
- ldrne r4, [sp]
- bne .Lrev_do
- add sp, sp, #0x04
- /**************************************/
- #endif
- /**************************************/
- #if TIMING
- ldr r0, =0x04000000
- strb r0, [r0, #0x106]
- strb r0, [r0, #0x10A]
- add r0, r0, #0x104
- ldrh r1, [r0, #0x04]
- ldrh r0, [r0]
- orr r0, r0, r1, lsl #0x10
- ldr r1, =0x027FF000
- ldr r2, [r1, #0x04]
- add r0, r0, r2
- str r0, [r1, #0x04]
- #endif
- #if IRQ_ON
- ldmfd sp!, {r0-r1,r4-r12,lr}
- msr cpsr, r0
- msr spsr, r1
- mov r0, #0x04000000
- ldr r1, [r0, #0x210]
- orr r1, r1, #0x08
- str r1, [r0, #0x210]
- ldmfd sp!, {pc}
- #else
- ldmfd sp!, {r4-r11,pc}
- #endif
- .Lloop: .word 0 @ loop start
- .word 0 @ loop len
- .hword 0 @ loop samp
- .hword 0 @ loop idx
- .Lsmp_end:
- ldr r8, .Lloop+0
- cmp r8, #0x12
- bcc .Lsmp_no_loop
- mov r1, r6
- ldr r7, .Lloop+4
- add r6, r6, r7, lsl #0x0A
- str r6, [sp, #0x08]
- ldr r0, .Lloop+8
- mov r5, r0, lsl #0x10
- bic r0, r0, r5, lsr #0x10
- ldr r9, =snd_DelTab
- add r9, r9, r0, lsr #0x10-2
- ldr r7, [r8]
- cmp r1, #0x00
- moveq pc, lr
- 1: mov r0, r7, asr #0x1C
- ldr r0, [r9, r0, lsl #0x02]!
- qadd r5, r5, r0
- movs r7, r7, lsl #0x04
- ldreq r7, [r8, #0x04]!
- adds r1, r1, #0x400
- bmi 1b
- mov pc, lr
- .Lsmp_no_loop:
- ldmfd sp!, {r0-r1}
- add sp, sp, #0x08
- strb r8, [r0]
- b .Lchan_read_ok
- /**************************************/
- .align
- .pool
- /**************************************/
- .size snd_MixProc, .-snd_MixProc
- .global snd_MixProc
- /**************************************/
- /* EOF */
- /**************************************/
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement