Advertisement
Guest User

Untitled

a guest
Sep 21st, 2017
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /**************************************/
  2. /* Project: NitroLib                  */
  3. /* File: snd_MixProc.s                */
  4. /* Copyright (c) 2011, Aikku          */
  5. /**************************************/
  6. /* HISTORY                            */
  7. /**************************************/
  8. /* 10-07-04                           */
  9. /*   Added 8-bit DPCM support (x^2)   */
  10. /* 10-06-29                           */
  11. /*   Removed 11-bit mode              */
  12. /*   Removed timing                   */
  13. /*   Added emulator #define           */
  14. /*   Optimized reverb                 */
  15. /* 10-06-18                           */
  16. /*   Added reverb \o/                 */
  17. /* 10-05-22                           */
  18. /*   Added sound buffer flushing      */
  19. /* 10-05-20                           */
  20. /*   Added 11-bit mixing (faster)     */
  21. /* 10-05-08                           */
  22. /*   Fixed bugs                       */
  23. /* 10-05-03                           */
  24. /*   Added LERP all #define           */
  25. /*   Added proper delta rounding      */
  26. /* 10-05-01                           */
  27. /*   Changed envelopes to 8.8         */
  28. /*   Doubled update speed (~120Hz)    */
  29. /*   Added linear envelope #define    */
  30. /* 10-04-30                           */
  31. /*   Fixed command queue bug          */
  32. /* 10-04-25                           */
  33. /*   Fixed usage timing               */
  34. /* 10-04-20                           */
  35. /*   Added cycle usage #define        */
  36. /* 10-04-19                           */
  37. /*   Added queue system               */
  38. /* 10-04-18                           */
  39. /*   Complete rewrote looping scheme  */
  40. /*   Fixed sample count calculator    */
  41. /*   Fixed LERP shift bug             */
  42. /* 10-04-16                           */
  43. /*   Switched back to 32728Hz         */
  44. /*   Switched to 24 channels          */
  45. /*   Added linear interpolation def   */
  46. /*   Changed delta table (x^2 -> x^3) */
  47. /* 10-04-11                           */
  48. /*   Improved mixing loop (remove end */
  49. /*   of sample check from every skip) */
  50. /*   chan.end -> chan.sampRem         */
  51. /*   samp.loopLen -> samp.loopStart   */
  52. /* 10-04-09                           */
  53. /*   Fixed sample skipping loop       */
  54. /*   Optimized mixdown pre-loop       */
  55. /*   Switched to 22050Hz              */
  56. /* 10-04-07                           */
  57. /*   Switched to oct-buffer           */
  58. /*   Added end-of-sample code         */
  59. /* 10-04-05                           */
  60. /*   Removed sound multiplier from    */
  61. /*   mixdown.                         */
  62. /*   Fixed mixdown code.              */
  63. /*   Added IRQ off #define.           */
  64. /* 10-03-30                           */
  65. /*   Fixed buffer clear               */
  66. /*   Fixed samp end pointer           */
  67. /*   Optimized samp storeback         */
  68. /* 10-03-27                           */
  69. /*   Change cpsr at once - not modify */
  70. /* 10-03-26                           */
  71. /*   Added mADPCM code v0.1           */
  72. /*     smp += tab[(signed)nib]!       */
  73. /* 10-03-25                           */
  74. /*   Initial release.                 */
  75. /**************************************/
  76. #define EMU          1
  77. #define LERP         1
  78. #define LERP_ALL     1
  79. #define IRQ_ON       1
  80. #define LINEAR       0
  81. #define REVERB       1
  82. #define UNROLL_COMBS 1
  83. /**************************************/
  84. .section .itcm, "ax", %progbits
  85. .align
  86. .arm
  87. /**************************************/
  88.  
  89. snd_MixProc:
  90. #if IRQ_ON
  91.     mov r0, #0x04000000
  92.     ldr r1, [r0, #0x210]
  93.     bic r1, r1, #0x08
  94.     str r1, [r0, #0x210]
  95.    
  96.     stmfd   sp!, {lr}
  97.     mrs r0, cpsr
  98.     mrs r1, spsr
  99.     msr cpsr, #0x1F
  100.     stmfd   sp!, {r0-r1,r4-r12,lr}
  101. #else
  102.     stmfd   sp!, {r4-r11,lr}
  103. #endif
  104.     ldr r0, =snd_MixBuf
  105.     ldr r1, =0
  106.     ldr r2, =0
  107.     ldr r3, =0
  108.     ldr r4, =0
  109.     ldr r5, =0
  110.     ldr r6, =0
  111.     ldr r7, =0
  112.     ldr r8, =0
  113.     ldr r9, =272
  114. 1:  stmia   r0!, {r1-r8}
  115.     stmia   r0!, {r1-r8}
  116.     stmia   r0!, {r1-r8}
  117.     stmia   r0!, {r1-r8}
  118.     subs    r9, r9, #0x10
  119.     bne 1b
  120.    
  121.     ldr r4, =snd_QueueDat
  122.     ldrh    r5, [r4], #0x04
  123.     mov r6, r5, lsr #0x08
  124.     bic r5, r5, r6, lsl #0x08
  125.    
  126.     and r6, r6, #0x3F
  127. 1:  cmp r5, r6
  128.     beq 2f
  129.    
  130.     ldr r1, [r4, r5]
  131.     add r5, r5, #0x04
  132.     and r5, r5, #0x3F
  133.     mov r0, r1, lsr #0x1C
  134.     mov r2, r0, lsr #0x02
  135.     bic r1, r1, r0, lsl #0x1C
  136.     bic r0, r0, r2, lsl #0x02
  137.    
  138.     adr lr, 1b
  139.     ldr pc, [pc, r2, lsl #0x02]
  140.     nop
  141.     .word   snd_iSeqPlay
  142.     .word   snd_iSeqStop
  143.     .word   snd_iSeqKill
  144.    
  145. 2:  strb    r5, [r4, #-0x04]
  146.     blx snd_SeqProc
  147.    
  148.     ldr r0, =snd_ChnDat - 0x38
  149.     ldr r1, =24
  150.  
  151. .Lchan_read_loop:
  152.     ldr r2, [r0, #0x38]!
  153.     tst r2, #0x80
  154.     beq .Lchan_read_ok
  155.    
  156.     tst r2, #0x40
  157.     beq .Lchan_skip_noteon
  158.    
  159.     bic r2, r2, #0x00000043
  160.     bic r2, r2, #0x00FF0000
  161.     bic r2, r2, #0xFF000000
  162.  
  163. @ r3 = subPos
  164. @ r4 = smp
  165. @ r5 = smpRem
  166. @ r6 = smpDat
  167. @ r7 = smpNow
  168.  
  169.     add r8, r0, #0x24
  170.     ldr r7, [r0, #0x18]       @ r7 = wave
  171.     ldr r6, [r7, #0x10]!      @ r6 = smpPack, r7 = smp.data
  172.     ldr r5, [r7, #0x04-0x10]  @ r5 = loopLen
  173.     ldr r4, [r7, #0x00-0x10]
  174.     add r5, r5, r4            @ r5 = smpLen
  175.     mov r5, r5, lsl #0x0A
  176.     mov r4, #0x00             @ r4 = smp = 0
  177.     mov r3, #0x00             @ r3 = subPos = 0
  178.     stmia   r8, {r3-r7}
  179.  
  180. .Lchan_skip_noteon:
  181.     tst r2, #0x08
  182.     bne 1f
  183.     tst r2, #0x20
  184.     @bicne  r2, r2, #0x20 @ pointless, only ever changed here
  185.     orrne   r2, r2, #0x03
  186.     and lr, r2, #0xFF00
  187.    
  188. 1:  bic r3, r2, #0xFF
  189.     bic r3, r3, #0xFF00
  190.     and r4, r2, #0x03
  191.     ldr pc, [pc, r4, lsl #0x02]
  192.     nop
  193.     .word   .Lchan_attack
  194.     .word   .Lchan_decay
  195.     .word   .Lchan_sustain
  196.     .word   .Lchan_release
  197.  
  198. .Lchan_attack:
  199.     ldrh    r4, [r0, #0x04]
  200.     adds    r3, r3, r4, lsl #0x10
  201.     bcs 1f
  202.     bne .Lchan_env_ok @ env <= FFFF, env != 0
  203.    
  204. 1:  mvn r3, #0x00
  205.     mov r3, r3, lsl #0x10
  206.     add r2, r2, #0x01
  207.     b   .Lchan_env_ok
  208.  
  209. .Lchan_decay:
  210.     ldrh    r4, [r0, #0x06]
  211.     subs    r3, r3, r4, lsl #0x10
  212.     movcc   r3, #0x00
  213.     ldrh    r4, [r0, #0x08]
  214.     cmp r4, r3, lsr #0x10
  215.     movhi   r3, r4, lsl #0x10
  216.     addhi   r2, r2, #0x01
  217.     b   .Lchan_env_ok
  218.  
  219. .Lchan_sustain:
  220.     ldrh    r3, [r0, #0x08]
  221.     mov r3, r3, lsl #0x10
  222.     b   .Lchan_env_ok
  223.  
  224. .Lchan_release:
  225.     ldrh    r4, [r0, #0x0A]
  226.     cmp r4, #0x00
  227.     subnes  r3, r3, r4, lsl #0x10
  228.     movls   r3, #0x00
  229.  
  230. .Lchan_env_ok:
  231.     movs    r6, r3, lsr #0x01
  232.     mov r2, r2, lsl #0x10
  233.     orrne   r2, r3, r2, lsr #0x10
  234.     str r2, [r0]
  235.     beq .Lchan_read_ok
  236. #if LINEAR
  237.     ldr r5, [r0, #0x10]
  238.     mov r4, r5, lsr #0x08
  239.     and r4, r4, #0xFF
  240.     smulbb  r4, r4, r4 @ 7F*7F = 3F01
  241.     smulwb  r3, r6, r4 @ 7FFF0000*3F01>>16 = 1F8040FF
  242.     ldrh    r4, [r0, #0x14]
  243.     and r6, r4, #0xFF
  244.     smulwb  r3, r3, r6 @ 1F8040FF*7F>>16 = 000FA0A0
  245.     and r4, r4, #0xFF00
  246.     rsb r6, r4, #0x7F00
  247.     smulwb  r4, r3, r4 @ 000FA0A0*7F00>>16 = 0007C0AF
  248.     smulwb  r3, r3, r6
  249.     mov r3, r3, lsr #0x08
  250.     mov r4, r4, lsr #0x08
  251.     orr r3, r3, r4, lsl #0x10
  252. #else
  253.     ldr r5, [r0, #0x10]
  254.     mov r4, r5, lsr #0x08
  255.     and r4, r4, #0xFF
  256.     smulbb  r4, r4, r4 @ 7F*7F = 3F01
  257.     smulwt  r6, r6, r6 @ 7FFF8000*7FFF>>16 = 3FFF4000
  258.     smulwb  r3, r6, r4 @ 3FFF4000*3F01>>16 = 0FC010BF
  259.     ldrh    r4, [r0, #0x14]
  260.     and r6, r4, #0xFF
  261.     smulwb  r3, r3, r6 @ 0FC010BF*7F>>16 = 0007D048
  262.     and r4, r4, #0xFF00
  263.     rsb r6, r4, #0x7F00
  264.     smulwb  r4, r3, r4 @ 0007D048*7F00>>16 = 0003E053
  265.     smulwb  r3, r3, r6
  266.     mov r3, r3, lsr #0x07
  267.     mov r4, r4, lsr #0x07
  268.     orr r3, r3, r4, lsl #0x10
  269. #endif
  270.     ldr ip, [r0, #0x18]
  271.    
  272.     and r7, r5, #0xFF
  273.     cmp r7, #0xFF
  274.     ldreqh  r4, [r0, #0x16]
  275.     moveq   r4, r4, lsl #0x02
  276.     beq .Lchan_freq_ok
  277.  
  278. .Lchan_calc_freq:
  279.     cmp lr, #0x00
  280.     movne   r7, lr, lsr #0x08
  281.    
  282.     and r6, r5, #0xFF0000 @ bndMul
  283.     mov r8, r5, asr #0x08 @ bnd
  284.     smultt  r6, r6, r8
  285.     add r4, r6, r7, lsl #0x06 @ bnd + key<<6
  286.    
  287.     ldr r5, [r0, #0x0C]
  288.     and r6, r5, #0xFF
  289.     subs    r6, r6, #0x01
  290.     strneb  r6, [r0, #0x0C]
  291.     bne .Lchan_lfo_ok
  292.    
  293.     ands    r6, r5, #0xFF0000
  294.     andnes  r7, r5, #0xFF00
  295.     beq .Lchan_lfo_ok
  296.    
  297.     add r7, r5, r7, lsl #0x10
  298.     str r7, [r0, #0x0C]
  299.    
  300.     mov r5, r5, lsr #0x18
  301.     and r7, r5, #0x3F
  302.     tst r5, #0x40
  303.     rsbne   r7, r7, #0x80
  304.     tst r5, #0x80
  305.     rsbne   r7, r7, #0x00
  306.    
  307.     smultb  r5, r6, r7
  308.     add r4, r4, r5, asr #0x06
  309.  
  310. .Lchan_lfo_ok:
  311.     ands    r5, r4, #0x3F
  312.     and r4, r4, #0x7F << 6
  313.    
  314.     ldr r6, =snd_FrqTab
  315.     ldr r4, [r6, r4, lsr #0x04]!
  316.     ldrne   r6, [r6, #0x04] @ only needed if tune != 0 [else mul by 0]
  317.     sub r6, r6, r4
  318.     mov r6, r6, lsl #0x05
  319.     smulwb  r5, r6, r5
  320.     add r4, r4, r5, lsl #0x05 @ lower 8-32 bits are precision, anyway
  321.    
  322.     ldr r8, [ip, #0x08]
  323.     umull   r8, r4, r4, r8
  324.  
  325. .Lchan_freq_ok:
  326.     ldr r5, =0x080280C8
  327.     umulls  r5, r4, r4, r5
  328.     addcs   r4, r4, #0x01
  329.    
  330.     ldmia   ip, {r5-r6}
  331.    
  332.     cmp r5, #0x00        @ looped?
  333.     addne   r5, ip, r5       @   yes - set start pos
  334.     addne   r5, r5, #0x10    @   skip header
  335.     str r5, .Lloop_start @ <- loop start
  336.     strne   r6, .Lloop_len   @ <- loop len
  337.     ldrne   r7, [ip, #0x0C]
  338.     strne   r7, .Lloop_smp   @ <- loop smp
  339.    
  340.     ldrh    r5, [r0, #0x24]
  341.     orr r4, r4, r5, lsl #0x10
  342.    
  343.     add r5, r0, #0x24
  344.     ldmib   r5, {r5-r8}
  345.     ldr r9, =snd_DelTab
  346.    
  347.     ldr sl, =snd_MixBuf
  348.     ldr fp, =272
  349.    
  350.     stmfd   sp!, {r0,r1,r6,fp}
  351.  
  352. .Lchan_mix_prep:
  353.     ldr r6, [sp, #0x08]
  354.     smulbb  r1, r4, fp @ assume delta < 0x8000U (32.0)
  355.     rsbs    r1, r1, r6
  356.     movcc   r1, #0x00
  357.     str r1, [sp, #0x08]
  358.     bge .Lchan_calcmix
  359.    
  360.     mov r1, #0x04000000
  361.     str r6, [r1, #0x290]
  362.     mov r2, r4, lsl #0x10
  363.     mov r2, r2, lsr #0x10
  364.     str r2, [r1, #0x298]
  365.     str r1, [r1, #0x280]
  366. 1:  ldr r0, [r1, #0x280]
  367.     tst r0, #0x8000
  368.     bne 1b
  369.     ldr fp, [r1, #0x2A0]
  370.     ldr r0, [r1, #0x2A8]
  371.     cmp r0, #0x00
  372.     addne   fp, fp, #0x01
  373.  
  374. .Lchan_calcmix:
  375.     ldr r0, [sp, #0x0C]
  376.     sub r0, r0, fp
  377.     str r0, [sp, #0x0C]
  378. #if LERP
  379.     mov r0, r4, lsl #0x10
  380.     cmp r0, #0x04000000
  381.     bhi .Lmix_no_lerp
  382.    
  383.     mov r0, r4, lsr #0x10
  384.     bic r4, r4, r0, lsl #0x10
  385.     orr r4, r4, r0, lsl #0x15
  386.  
  387. .Lmix_lerp:
  388.     mov ip, r7, lsr #0x18
  389.     ldr ip, [r9, ip, lsl #0x02]
  390.    
  391.     tst fp, #0x01
  392.     beq .Lchan_mix_lerp
  393.  
  394. @ r0: [smp temp]
  395. @ r1: [smp temp]
  396. @ r2: [smp temp]
  397. @ r3: volL | volR<<16
  398. @ r4: delta | subPos<<16
  399. @ r5: smpLast<<16
  400. @ r6: [smp temp] [smpRem]
  401. @ r7: smpPack
  402. @ r8: smpNow
  403. @ r9: tabPos
  404. @ sl: dstBuffer
  405. @ fp: mixCount
  406. @ ip: smpDel
  407. @ sp: ---
  408. @ lr: [mix temp]
  409.  
  410. .macro mixl d0, d1
  411.     smulwt  lr, ip, r4
  412.     qdadd   lr, r5, lr
  413.     smlawb  \d0, lr, r3, \d0
  414.     smlawt  \d1, lr, r3, \d1
  415.    
  416.     adds    r4, r4, r4, lsl #0x15
  417.     bpl 1f
  418.     bic r4, r4, #0x80000000
  419.     qadd    r5, r5, ip
  420.     movs    r7, r7, lsl #0x08
  421.     ldreq   r7, [r8, #0x04]!
  422.     mov ip, r7, lsr #0x18
  423.     ldr ip, [r9, ip, lsl #0x02]
  424. 1:
  425. .endm
  426.  
  427. .Lchan_mixrem_lerp:
  428.     ldmia   sl, {r0,r1}
  429.     mixl    r0, r1
  430.     stmia   sl!, {r0,r1}
  431.     subs    fp, fp, #0x01
  432.     beq .Lchan_mix_lerp_ok
  433.  
  434. .Lchan_mix_lerp:
  435.     ldmia   sl, {r0,r1,r2,r6}
  436.     mixl    r0, r1
  437.     mixl    r2, r6
  438.     stmia   sl!, {r0,r1,r2,r6}
  439.     subs    fp, fp, #0x02
  440.     bne .Lchan_mix_lerp
  441.  
  442. .Lchan_mix_lerp_ok:
  443.     mov r0, r4, lsr #0x15
  444.     bic r4, r4, r0, lsl #0x15
  445.     orr r4, r4, r0, lsl #0x10
  446.     b   .Lchan_mix_ok
  447.  
  448. #endif
  449.  
  450. .Lmix_no_lerp:
  451. #if LERP_ALL
  452.     mov lr, r7, lsr #0x18
  453.     ldr lr, [r9, lr, lsl #0x02]
  454. #endif
  455.     tst fp, #0x01
  456.     beq .Lchan_mix
  457.  
  458. @ r0: [smp temp]
  459. @ r1: [smp temp]
  460. @ r2: [smp temp]
  461. @ r3: volL | volR<<16
  462. @ r4: delta | subPos<<16
  463. @ r5: smpLast<<16
  464. @ r6: [smp temp] [smpRem]
  465. @ r7: smpPack
  466. @ r8: smpNow
  467. @ r9: tabPos
  468. @ sl: dstBuffer
  469. @ fp: mixCount
  470. @ ip: [mix temp]
  471. @ sp: ---
  472. @ lr: [delta] (only when LERP_ALL is enabled)
  473.  
  474. .macro mix d0, d1
  475. #if LERP_ALL
  476.     smulwt  ip, lr, r4
  477.     mov ip, ip, lsl #0x10-10
  478.     qadd    ip, ip, r5
  479.     smlawb  \d0, ip, r3, \d0
  480.     smlawt  \d1, ip, r3, \d1
  481. #else
  482.     smlawb  \d0, r5, r3, \d0
  483.     smlawt  \d1, r5, r3, \d1
  484. #endif
  485.     add r4, r4, r4, lsl #0x10
  486. #if LERP
  487.     sub r4, r4, #0x04000000
  488. #else
  489.     subs    ip, r4, #0x04000000
  490.     bmi 2f
  491. #endif
  492. #if LERP_ALL
  493. 1:  qadd    r5, r5, lr
  494.     movs    r7, r7, lsl #0x08
  495.     ldreq   r7, [r8, #0x04]!
  496.     mov lr, r7, lsr #0x18
  497.     ldr lr, [r9, lr, lsl #0x02]
  498. #else
  499. 1:  mov lr, r7, lsr #0x18
  500.     ldr lr, [r9, lr, lsl #0x02]
  501.     movs    r7, r7, lsl #0x08
  502.     ldreq   r7, [r8, #0x04]!
  503.     qadd    r5, r5, lr
  504. #endif
  505. #if LERP
  506.     subs    r4, r4, #0x04000000
  507.     bpl 1b
  508.     add r4, r4, #0x04000000
  509. #else
  510.     subs    ip, ip, #0x04000000
  511.     bpl 1b
  512.     add r4, ip, #0x04000000
  513. #endif
  514. 2:
  515. .endm
  516.  
  517. .Lchan_mixrem:
  518.     ldmia   sl, {r0,r1}
  519.     mix r0, r1
  520.     stmia   sl!, {r0,r1}
  521.     subs    fp, fp, #0x01
  522.     beq .Lchan_mix_nolerp_ok
  523.  
  524. .Lchan_mix:
  525.     ldmia   sl, {r0,r1,r2,r6}
  526.     mix r0, r1
  527.     mix r2, r6
  528.     stmia   sl!, {r0,r1,r2,r6}
  529.     subs    fp, fp, #0x02
  530.     bne .Lchan_mix
  531.  
  532. .Lchan_mix_nolerp_ok:
  533. .Lchan_mix_ok:
  534.     ldr r6, [sp, #0x08]
  535.     ldr fp, [sp, #0x0C]
  536.     cmp r6, #0x00
  537.     blle    .Lsmp_end
  538.     cmp fp, #0x00
  539.     bne .Lchan_mix_prep
  540.    
  541.     ldmfd   sp!, {r0,r1}
  542.     add sp, sp, #0x08
  543.     mov r4, r4, lsr #0x10
  544.     add r2, r0, #0x24
  545.     stmia   r2, {r4-r8}
  546.  
  547. .Lchan_read_ok:
  548.     subs    r1, r1, #0x01
  549.     bne .Lchan_read_loop
  550.  
  551. .Lstart_mixdown:
  552.     mvn r5, #0x00
  553.     mov r4, r5, lsr #0x11
  554.     mov r3, #0x02 * 272
  555.     ldr r2, =snd_MixInf
  556.     ldrb    r1, [r2]
  557.     add r0, r1, #0x01
  558.     and r0, r0, #0x3F
  559.     strb    r0, [r2]
  560.     ldr r0, =snd_OutBuf
  561.     smlabb  r0, r1, r3, r0
  562.     add r1, r0, r3, lsl #0x06
  563.     ldr r2, =snd_MixBuf
  564. #if REVERB
  565.     stmfd   sp!, {r0-r1,r3}
  566. #endif
  567.  
  568. #if !EMU
  569. .Lflush_lines:
  570.     bic r7, r0, #0x1F
  571.     bic r8, r1, #0x1F
  572.     and r9, r0, #0x1F
  573.     add r9, r9, r3
  574.  
  575. .Lflush_go:
  576.     mcr p15, 0, r7, c7, c14, 1
  577.     mcr p15, 0, r8, c7, c14, 1
  578.     add r7, r7, #0x20
  579.     add r8, r8, #0x20
  580.     subs    r9, r9, #0x20
  581.     bhi .Lflush_go
  582. #endif
  583.  
  584. @ r0: dstL
  585. @ r1: dstR
  586. @ r2: src
  587. @ r3: cnt*2
  588. @ r4: 7FFFh
  589. @ r5: 0xFFFFFFFF
  590. @ r9: [smp]
  591. @ sl: [smp]
  592. @ fp: [smp]
  593. @ ip: [smp]
  594.  
  595. .macro mux src, sid
  596.     mov \src, \src, asr #0x0B
  597.     teq \src, \src, lsl #0x10
  598.     submi   \src, r4, \src, asr #0x1F
  599.     .if \sid == 0
  600.     and \src, \src, r5, lsr #0x10
  601.     .endif
  602. .endm
  603.  
  604. 1:  ldmia   r2!, {r9-ip}
  605.    
  606.     mux r9, 0
  607.     mux fp, 1
  608.     orr r9, r9, fp, lsl #0x10
  609.     str r9, [r0], #0x04
  610.    
  611.     mux sl, 0
  612.     mux ip, 1
  613.     orr sl, sl, ip, lsl #0x10
  614.     str sl, [r1], #0x04
  615.    
  616.     subs    r3, r3, #0x02*2
  617.     bne 1b
  618.  
  619. /**************************************/
  620. /* REVERB PROCESSING                  */
  621. /**************************************/
  622. #if REVERB
  623. /**************************************/
  624.  
  625. .Lrev_go:
  626.     ldmfd   sp!, {r0-r2}
  627.     ldr r3, =snd_OutBuf + 272*64*2
  628.     ldr r4, =snd_CmbDat-4
  629.  
  630. @ r0: dstL
  631. @ r1: dstR
  632. @ r2: cnt*2
  633. @ r3: bufEndL
  634. @ r4: combData
  635. @ r5: combSrcL
  636. @ r6: combSrcR
  637. @ r7: combOld
  638. @ r8: combScale
  639. @ r9: comAdr
  640. @ sl: smpL
  641. @ fp: smpR
  642.  
  643. .macro comb
  644.     ldmib   r4!, {r5-r8}
  645.     mov ip, r7, lsl #0x10
  646.     bic r7, r7, ip, lsr #0x10
  647.    
  648.     ldrsh   lr, [r6], #0x02
  649.     mov lr, lr, lsl #0x10
  650.     qadd    r7, r7, lr
  651.     movs    r7, r7, asr #0x11
  652.     adcmi   r7, r7, #0x00
  653.    
  654.     ldrsh   lr, [r5], #0x02
  655.     mov lr, lr, lsl #0x10
  656.     qadd    ip, ip, lr
  657.     movs    ip, ip, asr #0x11
  658.     adcmi   ip, ip, #0x010000 @ to compensate for sign [upper = -1+1 = 0]
  659.     orr r7, ip, r7, lsl #0x10
  660.    
  661.     smulbb  ip, r7, r8
  662.     smultb  lr, r7, r8
  663.    
  664.     qadd    sl, sl, ip
  665.     qadd    fp, fp, lr
  666.    
  667.     cmp r5, r3
  668.     ldreq   r5, =snd_OutBuf
  669.     moveq   r6, r3
  670.    
  671.     stmdb   r4, {r5-r7}
  672. .endm
  673.  
  674. .Lrev_do:
  675.     ldrsh   sl, [r0]
  676.     ldrsh   fp, [r1]
  677.     mov sl, sl, lsl #0x10
  678.     mov fp, fp, lsl #0x10
  679. #if UNROLL_COMBS
  680.     comb
  681.     comb
  682.     comb
  683.     comb
  684. #else
  685. 1:  comb
  686.     adds    r0, r0, #0x40000000
  687.     bcc 1b
  688. #endif
  689.     mov sl, sl, asr #0x10
  690.     mov fp, fp, asr #0x10
  691.     strh    sl, [r0], #0x02
  692.     strh    fp, [r1], #0x02
  693.    
  694.     subs    r2, r2, #0x02*1
  695.     subne   r4, r4, #0x10*4
  696.     bne .Lrev_do
  697.  
  698. /**************************************/
  699. #endif
  700. /**************************************/
  701.  
  702. #if IRQ_ON
  703.     ldmfd   sp!, {r0-r1,r4-r12,lr}
  704.     msr cpsr, r0
  705.     msr spsr, r1
  706.     mov r0, #0x04000000
  707.     ldr r1, [r0, #0x210]
  708.     orr r1, r1, #0x08
  709.     str r1, [r0, #0x210]
  710.     ldmfd   sp!, {pc}
  711. #else
  712.     ldmfd   sp!, {r4-r11,pc}
  713. #endif
  714.  
  715. .Lloop_start:
  716.     .word   0
  717.  
  718. .Lloop_len:
  719.     .word   0
  720.  
  721. .Lloop_smp:
  722.     .word   0
  723.  
  724. .Lsmp_end:
  725.     ldr r8, .Lloop_start
  726.     cmp r8, #0x00
  727.     beq .Lsmp_no_loop
  728.     mov r1, r6
  729.    
  730.     ldr r7, .Lloop_len
  731.     add r6, r6, r7, lsl #0x0A
  732.     str r6, [sp, #0x08]
  733.    
  734.     ldr r5, .Lloop_smp
  735.     ldr r7, [r8]
  736.     mov r7, r7, lsl #0x08
  737.     cmp r1, #0x00
  738.     moveq   pc, lr
  739. 1:  mov r0, r7, lsr #0x18
  740.     ldr r0, [r9, r0, lsl #0x02]
  741.     qadd    r5, r5, r0
  742.     movs    r7, r7, lsl #0x08
  743.     ldreq   r7, [r8, #0x04]!
  744.     adds    r1, r1, #0x400
  745.     bmi 1b
  746.    
  747.     mov pc, lr
  748.  
  749. .Lsmp_no_loop:
  750.     ldmfd   sp!, {r0-r1}
  751.     add sp, sp, #0x08
  752.     strb    r8, [r0]
  753.     b   .Lchan_read_ok
  754.  
  755. /**************************************/
  756. .align
  757. .pool
  758. /**************************************/
  759. .size   snd_MixProc, .-snd_MixProc
  760. .global snd_MixProc
  761. /**************************************/
  762. /* EOF                                */
  763. /**************************************/
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement