Advertisement
Guest User

Untitled

a guest
Sep 21st, 2017
77
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-06-18                           */
  9. /*   Added reverb \o/                 */
  10. /* 10-05-22                           */
  11. /*   Added sound buffer flushing      */
  12. /* 10-05-20                           */
  13. /*   Added 11-bit mixing (faster)     */
  14. /* 10-05-08                           */
  15. /*   Fixed bugs                       */
  16. /* 10-05-03                           */
  17. /*   Added LERP all #define           */
  18. /*   Added proper delta rounding      */
  19. /* 10-05-01                           */
  20. /*   Changed envelopes to 8.8         */
  21. /*   Doubled update speed (~120Hz)    */
  22. /*   Added linear envelope #define    */
  23. /* 10-04-30                           */
  24. /*   Fixed command queue bug          */
  25. /* 10-04-25                           */
  26. /*   Fixed usage timing               */
  27. /* 10-04-20                           */
  28. /*   Added cycle usage #define        */
  29. /* 10-04-19                           */
  30. /*   Added queue system               */
  31. /* 10-04-18                           */
  32. /*   Complete rewrote looping scheme  */
  33. /*   Fixed sample count calculator    */
  34. /*   Fixed LERP shift bug             */
  35. /* 10-04-16                           */
  36. /*   Switched back to 32728Hz         */
  37. /*   Switched to 24 channels          */
  38. /*   Added linear interpolation def   */
  39. /*   Changed delta table (x^2 -> x^3) */
  40. /* 10-04-11                           */
  41. /*   Improved mixing loop (remove end */
  42. /*   of sample check from every skip) */
  43. /*   chan.end -> chan.sampRem         */
  44. /*   samp.loopLen -> samp.loopStart   */
  45. /* 10-04-09                           */
  46. /*   Fixed sample skipping loop       */
  47. /*   Optimized mixdown pre-loop       */
  48. /*   Switched to 22050Hz              */
  49. /* 10-04-07                           */
  50. /*   Switched to oct-buffer           */
  51. /*   Added end-of-sample code         */
  52. /* 10-04-05                           */
  53. /*   Removed sound multiplier from    */
  54. /*   mixdown.                         */
  55. /*   Fixed mixdown code.              */
  56. /*   Added IRQ off #define.           */
  57. /* 10-03-30                           */
  58. /*   Fixed buffer clear               */
  59. /*   Fixed samp end pointer           */
  60. /*   Optimized samp storeback         */
  61. /* 10-03-27                           */
  62. /*   Change cpsr at once - not modify */
  63. /* 10-03-26                           */
  64. /*   Added mADPCM code v0.1           */
  65. /*     smp += tab[(signed)nib]!       */
  66. /* 10-03-25                           */
  67. /*   Initial release.                 */
  68. /**************************************/
  69. #define MIX11    0
  70. #define LERP     1
  71. #define LERP_ALL 1
  72. #define IRQ_ON   1
  73. #define LINEAR   0
  74. #define REVERB   1
  75. #define TIMING   0
  76. /**************************************/
  77. .section .itcm, "ax", %progbits
  78. .align
  79. .arm
  80. /**************************************/
  81.  
  82. snd_MixProc:
  83. #if TIMING
  84.     ldr r0, =0x04000000
  85.     ldr r1, =0x00800000
  86.     str r1, [r0, #0x104]
  87.     add r1, r1, #0x040000
  88.     str r1, [r0, #0x108]
  89. #endif
  90. #if IRQ_ON
  91. #if !TIMING
  92.     mov r0, #0x04000000
  93. #endif
  94.     ldr r1, [r0, #0x210]
  95.     bic r1, r1, #0x08
  96.     str r1, [r0, #0x210]
  97.    
  98.     stmfd   sp!, {lr}
  99.     mrs r0, cpsr
  100.     mrs r1, spsr
  101.     msr cpsr, #0x1F
  102.     stmfd   sp!, {r0-r1,r4-r12,lr}
  103. #else
  104.     stmfd   sp!, {r4-r11,lr}
  105. #endif
  106.     ldr r0, =snd_MixBuf
  107.     ldr r1, =0
  108.     ldr r2, =0
  109.     ldr r3, =0
  110.     ldr r4, =0
  111.     ldr r5, =0
  112.     ldr r6, =0
  113.     ldr r7, =0
  114.     ldr r8, =0
  115.     ldr r9, =272
  116. 1:  stmia   r0!, {r1-r8}
  117.     stmia   r0!, {r1-r8}
  118. #if !MIX11
  119.     stmia   r0!, {r1-r8}
  120.     stmia   r0!, {r1-r8}
  121. #endif
  122.     subs    r9, r9, #0x10
  123.     bne 1b
  124.    
  125.     ldr r4, =snd_QueueDat
  126.     ldrh    r5, [r4], #0x04
  127.     mov r6, r5, lsr #0x08
  128.     bic r5, r5, r6, lsl #0x08
  129.    
  130.     and r6, r6, #0x3F
  131. 1:  cmp r5, r6
  132.     beq 2f
  133.    
  134.     ldr r1, [r4, r5]
  135.     add r5, r5, #0x04
  136.     and r5, r5, #0x3F
  137.     mov r0, r1, lsr #0x1C
  138.     mov r2, r0, lsr #0x02
  139.     bic r1, r1, r0, lsl #0x1C
  140.     bic r0, r0, r2, lsl #0x02
  141.    
  142.     adr lr, 1b
  143.     ldr pc, [pc, r2, lsl #0x02]
  144.     nop
  145.     .word   snd_iSeqPlay
  146.     .word   snd_iSeqStop
  147.     .word   snd_iSeqKill
  148.    
  149. 2:  strb    r5, [r4, #-0x04]
  150.     blx snd_SeqProc
  151.    
  152.     ldr r0, =snd_ChnDat - 56
  153.     ldr r1, =24
  154.  
  155. .Lchan_read_loop:
  156.     ldr r2, [r0, #0x38]!
  157.     tst r2, #0x80
  158.     beq .Lchan_read_ok
  159.    
  160.     tst r2, #0x40
  161.     beq .Lchan_skip_noteon
  162.    
  163.     bic r2, r2, #0x00000043
  164.     bic r2, r2, #0x00FF0000
  165.     bic r2, r2, #0xFF000000
  166.  
  167. @ r3 = smp<<16 | subPos
  168. @ r4 = smpRem
  169. @ r5 = adDat
  170. @ r6 = smpNow
  171. @ r7 = tabPos
  172.  
  173.     add r8, r0, #0x24
  174.     ldr r6, [r0, #0x18]       @ r6 = smp
  175.     ldr r5, [r6, #0x10]!      @ r5 = adpack, r5 = smp.data
  176.     ldr r4, [r6, #0x04-0x10]  @ r4 = loop len
  177.     ldr r3, [r6, #0x00-0x10]
  178.     add r4, r4, r3            @ r4 = full len
  179.     mov r4, r4, lsl #0x0A
  180.     mov r3, #0x00             @ r3 = 0 [smp | pos]
  181.     ldr r7, =snd_DelTab       @ r7 = tabPos
  182.     stmia   r8, {r3-r7}
  183.  
  184. .Lchan_skip_noteon:
  185.     tst r2, #0x08
  186.     bne 1f
  187.     tst r2, #0x20
  188.     @bicne  r2, r2, #0x20 @ pointless, only ever changed here
  189.     orrne   r2, r2, #0x03
  190.     and lr, r2, #0xFF00
  191.    
  192. 1:  bic r3, r2, #0xFF
  193.     bic r3, r3, #0xFF00
  194.     and r4, r2, #0x03
  195.     ldr pc, [pc, r4, lsl #0x02]
  196.     nop
  197.     .word   .Lchan_attack
  198.     .word   .Lchan_decay
  199.     .word   .Lchan_sustain
  200.     .word   .Lchan_release
  201.  
  202. .Lchan_attack:
  203.     ldrh    r4, [r0, #0x04]
  204.     adds    r3, r3, r4, lsl #0x10
  205.     bcs 1f
  206.     bne .Lchan_env_ok @ env <= FFFF, env != 0
  207.    
  208. 1:  mvn r3, #0x00
  209.     mov r3, r3, lsl #0x10
  210.     add r2, r2, #0x01
  211.     b   .Lchan_env_ok
  212.  
  213. .Lchan_decay:
  214.     ldrh    r4, [r0, #0x06]
  215.     subs    r3, r3, r4, lsl #0x10
  216.     movcc   r3, #0x00
  217.     ldrh    r4, [r0, #0x08]
  218.     cmp r4, r3, lsr #0x10
  219.     movhi   r3, r4, lsl #0x10
  220.     addhi   r2, r2, #0x01
  221.     b   .Lchan_env_ok
  222.  
  223. .Lchan_sustain:
  224.     ldrh    r3, [r0, #0x08]
  225.     mov r3, r3, lsl #0x10
  226.     b   .Lchan_env_ok
  227.  
  228. .Lchan_release:
  229.     ldrh    r4, [r0, #0x0A]
  230.     cmp r4, #0x00
  231.     subnes  r3, r3, r4, lsl #0x10
  232.     movls   r3, #0x00
  233.  
  234. .Lchan_env_ok:
  235.     movs    r6, r3, lsr #0x01
  236.     mov r2, r2, lsl #0x10
  237.     orrne   r2, r3, r2, lsr #0x10
  238.     str r2, [r0]
  239.     beq .Lchan_read_ok
  240. #if LINEAR
  241.     ldr r5, [r0, #0x10]
  242.     mov r4, r5, lsr #0x08
  243.     and r4, r4, #0xFF
  244.     smulbb  r4, r4, r4 @ 7F*7F = 3F01
  245.     smulwb  r3, r6, r4 @ 7FFF0000*3F01>>16 = 1F8040FF
  246.     ldrh    r4, [r0, #0x14]
  247.     and r6, r4, #0xFF
  248.     smulwb  r3, r3, r6 @ 1F8040FF*7F>>16 = 000FA0A0
  249.     and r4, r4, #0xFF00
  250.     rsb r6, r4, #0x7F00
  251.     smulwb  r4, r3, r4 @ 000FA0A0*7F00>>16 = 0007C0AF
  252.     smulwb  r3, r3, r6
  253.     mov r3, r3, lsr #0x08
  254.     mov r4, r4, lsr #0x08
  255.     orr r3, r3, r4, lsl #0x10
  256. #else
  257.     ldr r5, [r0, #0x10]
  258.     mov r4, r5, lsr #0x08
  259.     and r4, r4, #0xFF
  260.     smulbb  r4, r4, r4 @ 7F*7F = 3F01
  261.     smulwt  r6, r6, r6 @ 7FFF8000*7FFF>>16 = 3FFF4000
  262.     smulwb  r3, r6, r4 @ 3FFF4000*3F01>>16 = 0FC010BF
  263.     ldrh    r4, [r0, #0x14]
  264.     and r6, r4, #0xFF
  265.     smulwb  r3, r3, r6 @ 0FC010BF*7F>>16 = 0007D048
  266.     and r4, r4, #0xFF00
  267.     rsb r6, r4, #0x7F00
  268.     smulwb  r4, r3, r4 @ 0007D048*7F00>>16 = 0003E053
  269.     smulwb  r3, r3, r6
  270.     mov r3, r3, lsr #0x07
  271.     mov r4, r4, lsr #0x07
  272.     orr r3, r3, r4, lsl #0x10
  273. #endif
  274.     ldr ip, [r0, #0x18]
  275.    
  276.     and r7, r5, #0xFF
  277.     cmp r7, #0xFF
  278.     ldreqh  r4, [r0, #0x16]
  279.     moveq   r4, r4, lsl #0x02
  280.     beq .Lchan_freq_ok
  281.  
  282. .Lchan_calc_freq:
  283.     cmp lr, #0x00
  284.     movne   r7, lr, lsr #0x08
  285.    
  286.     and r6, r5, #0xFF0000 @ bndMul
  287.     mov r8, r5, asr #0x08 @ bnd
  288.     smultt  r6, r6, r8
  289.     add r4, r6, r7, lsl #0x06 @ bnd + key<<6
  290.    
  291.     ldr r5, [r0, #0x0C]
  292.     and r6, r5, #0xFF
  293.     subs    r6, r6, #0x01
  294.     strneb  r6, [r0, #0x0C]
  295.     bne .Lchan_lfo_ok
  296.    
  297.     ands    r6, r5, #0xFF0000
  298.     andnes  r7, r5, #0xFF00
  299.     beq .Lchan_lfo_ok
  300.    
  301.     add r7, r5, r7, lsl #0x10
  302.     str r7, [r0, #0x0C]
  303.    
  304.     mov r5, r5, lsr #0x18
  305.     and r7, r5, #0x3F
  306.     tst r5, #0x40
  307.     rsbne   r7, r7, #0x80
  308.     tst r5, #0x80
  309.     rsbne   r7, r7, #0x00
  310.    
  311.     smultb  r5, r6, r7
  312.     add r4, r4, r5, asr #0x06
  313.  
  314. .Lchan_lfo_ok:
  315.     ands    r5, r4, #0x3F
  316.     and r4, r4, #0x7F << 6
  317.    
  318.     ldr r6, =snd_FrqTab
  319.     ldr r4, [r6, r4, lsr #0x04]!
  320.     ldrne   r6, [r6, #0x04] @ only needed if tune != 0 [else mul by 0]
  321.     sub r6, r6, r4
  322.     mov r6, r6, lsl #0x05
  323.     smulwb  r5, r6, r5
  324.     add r4, r4, r5, lsl #0x05 @ lower 8-32 bits are precision, anyway
  325.    
  326.     ldr r8, [ip, #0x08]
  327.     umull   r8, r4, r4, r8
  328.  
  329. .Lchan_freq_ok:
  330.     ldr r5, =0x080280C8
  331.     umulls  r5, r4, r4, r5
  332.     addcs   r4, r4, #0x01
  333.    
  334.     ldmia   ip, {r5-r6}
  335.    
  336.     movs    r5, r5, lsl #0x01     @ looped?
  337.     addne   r5, ip, r5, lsr #0x02 @   yes - set start pos
  338.     addne   r5, r5, #0x10         @   skip header
  339.     str r5, .Lloop+0 @ <- loop start
  340.     strne   r6, .Lloop+4 @ <- loop len
  341.     ldrne   r7, [ip, #0x0C]
  342.     strne   r7, .Lloop+8 @ <- loop inf
  343.    
  344.     add r5, r0, #0x24
  345.     ldmia   r5, {r5-r9}
  346.    
  347.     orr r4, r4, r5, lsl #0x10
  348.     bic r5, r5, r4, lsr #0x10
  349.    
  350.     ldr sl, =snd_MixBuf
  351.     ldr fp, =272
  352.    
  353.     stmfd   sp!, {r0,r1,r6,fp}
  354.  
  355. .Lchan_mix_prep:
  356.     ldr r6, [sp, #0x08]
  357.     smulbb  r1, r4, fp @ assume delta < 0x8000U (32.0)
  358.     rsbs    r1, r1, r6
  359.     strge   r1, [sp, #0x08]
  360.     bge .Lchan_calcmix
  361.    
  362.     mov r1, #0x04000000
  363.     str r6, [r1, #0x290]
  364.     mov r2, r4, lsl #0x10
  365.     mov r2, r2, lsr #0x10
  366.     str r2, [r1, #0x298]
  367.     str r1, [r1, #0x280]
  368. 1:  ldr r0, [r1, #0x280]
  369.     tst r0, #0x8000
  370.     bne 1b
  371.     ldr fp, [r1, #0x2A0]
  372.     ldr r0, [r1, #0x2A8]
  373.     cmp r0, #0x00
  374.     addne   fp, fp, #0x01
  375.    
  376.     smulbb  r1, r4, fp @ assume delta < 0x8000U (32.0)
  377.     rsb r1, r1, r6
  378.     str r1, [sp, #0x08]
  379.  
  380. .Lchan_calcmix:
  381.     ldr r0, [sp, #0x0C]
  382.     sub r0, r0, fp
  383.     str r0, [sp, #0x0C]
  384. #if LERP
  385.     mov r0, r4, lsl #0x10
  386.     cmp r0, #0x04000000
  387.     bhi .Lmix_no_lerp
  388.    
  389.     mov r0, r4, lsr #0x10
  390.     bic r4, r4, r0, lsl #0x10
  391.     orr r4, r4, r0, lsl #0x15
  392.  
  393. .Lmix_lerp:
  394.     mov ip, r7, asr #0x1C
  395.     ldr ip, [r9, ip, lsl #0x02]!
  396.  
  397. /**************************************/
  398. /* 11-bit MIXING                      */
  399. /**************************************/
  400. #if MIX11
  401. /**************************************/
  402.  
  403.     ands    r0, fp, #0x03
  404.     mvn r1, #0x00
  405.     add fp, r1, fp, lsl #0x10 @ FFFFh + (cnt-1)<<16
  406.     beq .Lchan_mix_lerp
  407.     sub fp, fp, r0, lsl #0x10
  408.  
  409. @ r0: [smp temp]
  410. @ r1: [smp temp]
  411. @ r2: [smp temp]
  412. @ r3: volL | volR<<16
  413. @ r4: delta | subPos<<16
  414. @ r5: smpLast<<16 | smpDelta
  415. @ r6: [smp temp] [smpRem]
  416. @ r7: smpPack
  417. @ r8: smpNow
  418. @ r9: tabPos
  419. @ sl: dstBuffer
  420. @ fp: mixCount-1<<16 | 0xFFFF
  421. @ ip: [mix temp]
  422. @ sp: ---
  423. @ lr: [mix temp]
  424.  
  425. .macro mixl dst
  426.     smultb  ip, r4, r5
  427.     qdadd   ip, r5, ip
  428.    
  429.     smultb  lr, ip, r3
  430.     and lr, lr, fp, lsl #0x10
  431.     add \dst, lr, \dst, ror #0x10
  432.     smultt  lr, ip, r3
  433.     and lr, lr, fp, lsl #0x10
  434.     add \dst, lr, \dst, ror #0x10
  435.    
  436.     adds    r4, r4, r4, lsl #0x15
  437.     bpl 1f
  438.     bic r4, r4, #0x80000000
  439.     mov ip, r5, lsl #0x10
  440.     qadd    r5, r5, ip
  441.     and r5, r5, fp, lsl #0x10
  442.    
  443.     movs    r7, r7, lsl #0x04
  444.     ldreq   r7, [r8, #0x04]!
  445.     mov ip, r7, asr #0x1C
  446.     ldr ip, [r9, ip, lsl #0x02]!
  447.     orr r5, r5, ip, lsr #0x10
  448. 1:
  449. .endm
  450.  
  451. .Lchan_mixrem_lerp:
  452.     ldmia   sl, {r1}
  453.     mixl    r1
  454.     stmia   sl!, {r1}
  455.     subs    r0, r0, #0x01
  456.     bne .Lchan_mixrem_lerp
  457.    
  458.     cmp fp, #0x00
  459.     bmi .Lchan_mix_lerp_ok
  460.  
  461. .Lchan_mix_lerp:
  462.     ldmia   sl, {r0,r1,r2,r6}
  463.     mixl    r0
  464.     mixl    r1
  465.     mixl    r2
  466.     mixl    r6
  467.     stmia   sl!, {r0,r1,r2,r6}
  468.     subs    fp, fp, #0x040000
  469.     bpl .Lchan_mix_lerp
  470.  
  471. /**************************************/
  472. #else
  473. /**************************************/
  474.  
  475.     tst fp, #0x01
  476.     beq .Lchan_mix_lerp
  477.  
  478. @ r0: [smp temp]
  479. @ r1: [smp temp]
  480. @ r2: [smp temp]
  481. @ r3: volL | volR<<16
  482. @ r4: delta | subPos<<16
  483. @ r5: smpLast<<16
  484. @ r6: [smp temp] [smpRem]
  485. @ r7: smpPack
  486. @ r8: smpNow
  487. @ r9: tabPos
  488. @ sl: dstBuffer
  489. @ fp: mixCount
  490. @ ip: smpDel
  491. @ sp: ---
  492. @ lr: [mix temp]
  493.  
  494. .macro mixl d0, d1
  495.     smultt  lr, r4, ip
  496.     qdadd   lr, r5, lr
  497.     smlatb  \d0, lr, r3, \d0
  498.     smlatt  \d1, lr, r3, \d1
  499.    
  500.     adds    r4, r4, r4, lsl #0x15
  501.     bpl 1f
  502.     bic r4, r4, #0x80000000
  503.     qadd    r5, r5, ip
  504.    
  505.     movs    r7, r7, lsl #0x04
  506.     ldreq   r7, [r8, #0x04]!
  507.     mov ip, r7, asr #0x1C
  508.     ldr ip, [r9, ip, lsl #0x02]!
  509. 1:
  510. .endm
  511.  
  512. .Lchan_mixrem_lerp:
  513.     ldmia   sl, {r0,r1}
  514.     mixl    r0, r1
  515.     stmia   sl!, {r0,r1}
  516.     subs    fp, fp, #0x01
  517.     beq .Lchan_mix_lerp_ok
  518.  
  519. .Lchan_mix_lerp:
  520.     ldmia   sl, {r0,r1,r2,r6}
  521.     mixl    r0, r1
  522.     mixl    r2, r6
  523.     stmia   sl!, {r0,r1,r2,r6}
  524.     subs    fp, fp, #0x02
  525.     bne .Lchan_mix_lerp
  526.  
  527. /**************************************/
  528. #endif
  529. /**************************************/
  530.  
  531. .Lchan_mix_lerp_ok:
  532.     mov ip, r7, asr #0x1C
  533.     sub r9, r9, ip, lsl #0x02
  534.    
  535.     mov r0, r4, lsr #0x15
  536.     bic r4, r4, r0, lsl #0x15
  537.     orr r4, r4, r0, lsl #0x10
  538.     b   .Lchan_mix_ok
  539.  
  540. #endif
  541.  
  542. .Lmix_no_lerp:
  543. #if LERP_ALL
  544.     mov lr, r7, asr #0x1C
  545.     ldr lr, [r9, lr, lsl #0x02]!
  546. #endif
  547.  
  548. /**************************************/
  549. /* 11-bit MIXING                      */
  550. /**************************************/
  551. #if MIX11
  552. /**************************************/
  553.  
  554. #if LERP_ALL
  555.     orr r5, r5, lr, lsr #0x10
  556. #endif
  557.     ands    r0, fp, #0x03
  558.     mvn r1, #0x00
  559.     add fp, r1, fp, lsl #0x10 @ FFFFh + (cnt-1)<<16
  560.     beq .Lchan_mix
  561.     sub fp, fp, r0, lsl #0x10
  562.  
  563. @ r0: [smp temp]
  564. @ r1: [smp temp]
  565. @ r2: [smp temp]
  566. @ r3: volL | volR<<16
  567. @ r4: delta | subPos<<16
  568. @ r5: smpLast<<16 [ | delta]
  569. @ r6: [smp temp] [smpRem]
  570. @ r7: smpPack
  571. @ r8: smpNow
  572. @ r9: tabPos
  573. @ sl: dstBuffer
  574. @ fp: mixCount-1<<16 | 0xFFFF
  575. @ ip: [mix temp]
  576. @ sp: ---
  577. @ lr: [mix temp]
  578.  
  579. .macro mix dst
  580. #if LERP_ALL
  581.     smultb  ip, r4, r5
  582.     mov ip, ip, lsl #0x10-10
  583.     qadd    ip, ip, r5
  584.    
  585.     smultb  lr, ip, r3
  586.     and lr, lr, fp, lsl #0x10
  587.     add \dst, lr, \dst, ror #0x10
  588.     smultt  lr, ip, r3
  589.     and lr, lr, fp, lsl #0x10
  590.     add \dst, lr, \dst, ror #0x10
  591. #else
  592.     smultb  ip, r5, r3
  593.     and ip, ip, fp, lsl #0x10
  594.     add \dst, ip, \dst, ror #0x10
  595.     smultt  ip, r5, r3
  596.     and ip, ip, fp, lsl #0x10
  597.     add \dst, ip, \dst, ror #0x10
  598. #endif
  599.     add r4, r4, r4, lsl #0x10
  600. #if LERP //! if LERP is enabled, this loop processes delta > 1.0, no need to check
  601.     sub r4, r4, #0x04000000
  602. #else
  603.     subs    ip, r4, #0x04000000
  604.     bmi 2f
  605. #endif
  606. #if LERP_ALL
  607.     mov lr, r5, lsl #0x10
  608. 1:  qadd    r5, r5, lr
  609.    
  610.     movs    r7, r7, lsl #0x04
  611.     ldreq   r7, [r8, #0x04]!
  612.    
  613.     mov lr, r7, asr #0x1C
  614.     ldr lr, [r9, lr, lsl #0x02]!
  615. #else
  616. 1:  mov lr, r7, asr #0x1C
  617.     ldr lr, [r9, lr, lsl #0x02]!
  618.    
  619.     movs    r7, r7, lsl #0x04
  620.     ldreq   r7, [r8, #0x04]!
  621.    
  622.     qadd    r5, r5, lr
  623. #endif
  624. #if LERP
  625.     subs    r4, r4, #0x04000000
  626.     bpl 1b
  627.     add r4, r4, #0x04000000
  628. #else
  629.     subs    ip, ip, #0x04000000
  630.     bpl 1b
  631.     add r4, ip, #0x04000000
  632. #endif
  633.     and r5, r5, fp, lsl #0x10
  634.     orr r5, r5, lr, lsr #0x10
  635. 2:
  636. .endm
  637.  
  638. .Lchan_mixrem:
  639.     ldmia   sl, {r1}
  640.     mix r1
  641.     stmia   sl!, {r1}
  642.     subs    r0, r0, #0x01
  643.     bne .Lchan_mixrem
  644.    
  645.     cmp fp, #0x00
  646.     bmi .Lchan_mix_nolerp_ok
  647.  
  648. .Lchan_mix:
  649.     ldmia   sl, {r0,r1,r2,r6}
  650.     mix r0
  651.     mix r1
  652.     mix r2
  653.     mix r6
  654.     stmia   sl!, {r0,r1,r2,r6}
  655.     subs    fp, fp, #0x040000
  656.     bpl .Lchan_mix
  657.  
  658. /**************************************/
  659. #else
  660. /**************************************/
  661.  
  662.     tst fp, #0x01
  663.     beq .Lchan_mix
  664.  
  665. @ r0: [smp temp]
  666. @ r1: [smp temp]
  667. @ r2: [smp temp]
  668. @ r3: volL | volR<<16
  669. @ r4: delta | subPos<<16
  670. @ r5: smpLast<<16
  671. @ r6: [smp temp] [smpRem]
  672. @ r7: smpPack
  673. @ r8: smpNow
  674. @ r9: tabPos
  675. @ sl: dstBuffer
  676. @ fp: mixCount
  677. @ ip: [mix temp]
  678. @ sp: ---
  679. @ lr: [delta] (only when LERP_ALL is enabled)
  680.  
  681. .macro mix d0, d1
  682. #if LERP_ALL
  683.     smultt  ip, lr, r4
  684.     mov ip, ip, lsl #0x10-10
  685.     qadd    ip, ip, r5
  686.     smlatb  \d0, ip, r3, \d0
  687.     smlatt  \d1, ip, r3, \d1
  688. #else
  689.     smlatb  \d0, r5, r3, \d0
  690.     smlatt  \d1, r5, r3, \d1
  691. #endif
  692.     add r4, r4, r4, lsl #0x10
  693. #if LERP
  694.     sub r4, r4, #0x04000000
  695. #else
  696.     subs    ip, r4, #0x04000000
  697.     bmi 2f
  698. #endif
  699. #if LERP_ALL
  700. 1:  qadd    r5, r5, lr
  701.    
  702.     movs    r7, r7, lsl #0x04
  703.     ldreq   r7, [r8, #0x04]!
  704.    
  705.     mov lr, r7, asr #0x1C
  706.     ldr lr, [r9, lr, lsl #0x02]!
  707. #else
  708. 1:  mov lr, r7, asr #0x1C
  709.     ldr lr, [r9, lr, lsl #0x02]!
  710.    
  711.     movs    r7, r7, lsl #0x04
  712.     ldreq   r7, [r8, #0x04]!
  713.    
  714.     qadd    r5, r5, lr
  715. #endif
  716. #if LERP
  717.     subs    r4, r4, #0x04000000
  718.     bpl 1b
  719.     add r4, r4, #0x04000000
  720. #else
  721.     subs    ip, ip, #0x04000000
  722.     bpl 1b
  723.     add r4, ip, #0x04000000
  724. #endif
  725. 2:
  726. .endm
  727.  
  728. .Lchan_mixrem:
  729.     ldmia   sl, {r0,r1}
  730.     mix r0, r1
  731.     stmia   sl!, {r0,r1}
  732.     subs    fp, fp, #0x01
  733.     beq .Lchan_mix_nolerp_ok
  734.  
  735. .Lchan_mix:
  736.     ldmia   sl, {r0,r1,r2,r6}
  737.     mix r0, r1
  738.     mix r2, r6
  739.     stmia   sl!, {r0,r1,r2,r6}
  740.     subs    fp, fp, #0x02
  741.     bne .Lchan_mix
  742.  
  743. /**************************************/
  744. #endif
  745. /**************************************/
  746.  
  747. .Lchan_mix_nolerp_ok:
  748. #if LERP_ALL
  749.     mov ip, r7, asr #0x1C
  750.     sub r9, r9, ip, lsl #0x02
  751. #if MIX11
  752.     and r5, r5, fp, lsl #0x10
  753. #endif
  754. #endif
  755.  
  756. .Lchan_mix_ok:
  757.     ldr r6, [sp, #0x08]
  758.     ldr fp, [sp, #0x0C]
  759.     cmp r6, #0x00
  760.     blle    .Lsmp_end
  761.     cmp fp, #0x00
  762.     bne .Lchan_mix_prep
  763.    
  764.     ldmfd   sp!, {r0,r1}
  765.     add sp, sp, #0x08
  766.     orr r5, r5, r4, lsr #0x10
  767.     add r2, r0, #0x24
  768.     stmia   r2, {r5-r9}
  769.  
  770. .Lchan_read_ok:
  771.     subs    r1, r1, #0x01
  772.     bne .Lchan_read_loop
  773.  
  774. .Lstart_mixdown:
  775. #if MIX11
  776.     mvn r6, #0x00
  777.     mov r5, #0x20
  778.     orr r5, r5, r6, lsl #0x10
  779.     mov r4, r5, lsr #0x11
  780.     mov r3, #0x02 * 272
  781.     ldr r2, =snd_MixInf
  782.     ldrb    r1, [r2]
  783.     add r0, r1, #0x01
  784.     and r0, r0, #0x3F
  785.     strb    r0, [r2]
  786.     ldr r0, =snd_OutBuf
  787.     smlabb  r0, r1, r3, r0
  788.     add r1, r0, r3, lsl #0x06
  789.     ldr r2, =snd_MixBuf
  790. #else
  791.     mvn r5, #0x00
  792.     mov r4, r5, lsr #0x11
  793.     mov r3, #0x02 * 272
  794.     ldr r2, =snd_MixInf
  795.     ldrb    r1, [r2]
  796.     add r0, r1, #0x01
  797.     and r0, r0, #0x3F
  798.     strb    r0, [r2]
  799.     ldr r0, =snd_OutBuf
  800.     smlabb  r0, r1, r3, r0
  801.     add r1, r0, r3, lsl #0x06
  802.     ldr r2, =snd_MixBuf
  803. #endif
  804. #if REVERB
  805.     stmfd   sp!, {r0-r1,r3}
  806. #endif
  807.  
  808. .Lflush_lines:
  809.     bic r7, r0, #0x1F
  810.     bic r8, r1, #0x1F
  811.     and r9, r0, #0x1F
  812.     add r9, r9, r3
  813.  
  814. .Lflush_go:
  815.     mcr p15, 0, r7, c7, c14, 1
  816.     mcr p15, 0, r8, c7, c14, 1
  817.     add r7, r7, #0x20
  818.     add r8, r8, #0x20
  819.     subs    r9, r9, #0x20
  820.     bhi .Lflush_go
  821.  
  822. /**************************************/
  823. /* 11-bit MIXING                      */
  824. /**************************************/
  825. #if MIX11
  826. /**************************************/
  827.  
  828. @ r0: dstL
  829. @ r1: dstR
  830. @ r2: src
  831. @ r3: cnt*2
  832. @ r4: 7FFFh
  833. @ r5: 1<<5 | 0xFFFF<<16
  834. @ r6: [muxTmp]
  835. @ r7: [smp]
  836. @ r8: [smp]
  837. @ r9: [smp]
  838. @ sl: [tmp]
  839. @ fp: [smpTmp]
  840. @ ip: [smpTmp]
  841.  
  842. .macro mux dst, sp0, sp1, chn
  843. .if \chn == 0
  844.     smulbb  \dst, r5, \sp0            @ SMP0 [left]
  845.     teq \dst, \dst, lsl #0x10
  846.     submi   \dst, r4, \dst, asr #0x1F
  847.     andpl   \dst, \dst, r5, lsr #0x10
  848.     smulbb  r6, r5, \sp1              @ SMP1 [left]
  849.     teq r6, r6, lsl #0x10
  850.     submi   r6, r4, r6, asr #0x1F
  851.     orr \dst, \dst, r6, lsl #0x10
  852. .else
  853.     smulbt  \dst, r5, \sp0            @ SMP0 [right]
  854.     teq \dst, \dst, lsl #0x10
  855.     submi   \dst, r4, \dst, asr #0x1F
  856.     andpl   \dst, \dst, r5, lsr #0x10
  857.     smulbt  r6, r5, \sp1              @ SMP1 [right]
  858.     teq r6, r6, lsl #0x10
  859.     submi   r6, r4, r6, asr #0x1F
  860.     orr \dst, \dst, r6, lsl #0x10
  861. .endif
  862. .endm
  863.  
  864. 1:  ldmia   r2!, {r7,r8,r9,sl}
  865.    
  866.     mux ip, r7, r8, 0
  867.     mux lr, r9, sl, 0
  868.     stmia   r0!, {ip,lr}
  869.    
  870.     mux ip, r7, r8, 1
  871.     mux lr, r9, sl, 1
  872.     stmia   r1!, {ip,lr}
  873.    
  874.     subs    r3, r3, #0x02*4
  875.     bne 1b
  876.  
  877. /**************************************/
  878. #else
  879. /**************************************/
  880.  
  881. @ r0: dstL
  882. @ r1: dstR
  883. @ r2: src
  884. @ r3: cnt*2
  885. @ r4: 7FFFh
  886. @ r5: 0xFFFFFFFF
  887. @ r9: [smp]
  888. @ sl: [smp]
  889. @ fp: [smp]
  890. @ ip: [smp]
  891.  
  892. .macro mux src, sid
  893.     mov \src, \src, asr #0x0B
  894.     teq \src, \src, lsl #0x10
  895.     submi   \src, r4, \src, asr #0x1F
  896.     .if \sid == 0
  897.     and \src, \src, r5, lsr #0x10
  898.     .endif
  899. .endm
  900.  
  901. 1:  ldmia   r2!, {r9-ip}
  902.    
  903.     mux r9, 0
  904.     mux fp, 1
  905.     orr r9, r9, fp, lsl #0x10
  906.     str r9, [r0], #0x04
  907.    
  908.     mux sl, 0
  909.     mux ip, 1
  910.     orr sl, sl, ip, lsl #0x10
  911.     str sl, [r1], #0x04
  912.    
  913.     subs    r3, r3, #0x02*2
  914.     bne 1b
  915.  
  916. /**************************************/
  917. #endif
  918. /**************************************/
  919.  
  920. /**************************************/
  921. /* REVERB PROCESSING                  */
  922. /**************************************/
  923. #if REVERB
  924. /**************************************/
  925.  
  926. .Lrev_go:
  927.     ldmfd   sp!, {r0-r2}
  928.     ldr r3, =snd_OutBuf + 272*64*2
  929.     ldr r4, =snd_CmbDat-4
  930.     stmfd   sp!, {r4}
  931.  
  932. @ r0: dstL
  933. @ r1: dstR
  934. @ r2: cnt
  935. @ r3: bufEndL
  936. @ r4: combData
  937. @ r5: combSrcL
  938. @ r6: combSrcR
  939. @ r7: combOld
  940. @ r8: combScale
  941. @ r9: comAdr
  942. @ sl: smpL
  943. @ fp: smpR
  944.  
  945. .macro comb n
  946.     ldmib   r4!, {r5-r8}
  947.     mov ip, r7, lsl #0x10
  948.    
  949.     ldrsh   lr, [r6], #0x02
  950.     mov lr, lr, lsl #0x10
  951.     qadd    r7, r7, lr
  952.     movs    r7, r7, asr #0x11
  953.     adcmi   r7, r7, #0x00
  954.     mov r7, r7, lsl #0x10
  955.    
  956.     ldrsh   lr, [r5], #0x02
  957.     mov lr, lr, lsl #0x10
  958.     qadd    ip, ip, lr
  959.     movs    ip, ip, asr #0x11
  960.     adcmi   ip, ip, #0x00
  961.     mov ip, ip, lsl #0x10
  962.     orr r7, r7, ip, lsr #0x10
  963.    
  964.     smulbb  ip, r7, r8
  965.     smultb  lr, r7, r8
  966.    
  967.     qadd    sl, sl, ip
  968.     qadd    fp, fp, lr
  969.    
  970.     cmp r5, r3
  971.     ldreq   r5, =snd_OutBuf
  972.     moveq   r6, r3
  973.    
  974.     stmdb   r4, {r5-r7}
  975. .endm
  976.  
  977. .Lrev_do:
  978.     ldrsh   sl, [r0]
  979.     ldrsh   fp, [r1]
  980.     mov sl, sl, lsl #0x10
  981.     mov fp, fp, lsl #0x10
  982.    
  983.     comb    0
  984.     comb    1
  985.     comb    2
  986.     comb    3
  987.    
  988.     mov sl, sl, asr #0x10
  989.     mov fp, fp, asr #0x10
  990.     strh    sl, [r0], #0x02
  991.     strh    fp, [r1], #0x02
  992.    
  993.     subs    r2, r2, #0x02*1
  994.     ldrne   r4, [sp]
  995.     bne .Lrev_do
  996.     add sp, sp, #0x04
  997.  
  998. /**************************************/
  999. #endif
  1000. /**************************************/
  1001.  
  1002. #if TIMING
  1003.     ldr r0, =0x04000000
  1004.     strb    r0, [r0, #0x106]
  1005.     strb    r0, [r0, #0x10A]
  1006.     add r0, r0, #0x104
  1007.     ldrh    r1, [r0, #0x04]
  1008.     ldrh    r0, [r0]
  1009.     orr r0, r0, r1, lsl #0x10
  1010.     ldr r1, =0x027FF000
  1011.     ldr r2, [r1, #0x04]
  1012.     add r0, r0, r2
  1013.     str r0, [r1, #0x04]
  1014. #endif
  1015. #if IRQ_ON
  1016.     ldmfd   sp!, {r0-r1,r4-r12,lr}
  1017.     msr cpsr, r0
  1018.     msr spsr, r1
  1019.     mov r0, #0x04000000
  1020.     ldr r1, [r0, #0x210]
  1021.     orr r1, r1, #0x08
  1022.     str r1, [r0, #0x210]
  1023.     ldmfd   sp!, {pc}
  1024. #else
  1025.     ldmfd   sp!, {r4-r11,pc}
  1026. #endif
  1027.  
  1028. .Lloop: .word   0 @ loop start
  1029.     .word   0 @ loop len
  1030.     .hword  0 @ loop samp
  1031.     .hword  0 @ loop idx
  1032.  
  1033. .Lsmp_end:
  1034.     ldr r8, .Lloop+0
  1035.     cmp r8, #0x12
  1036.     bcc .Lsmp_no_loop
  1037.     mov r1, r6
  1038.    
  1039.     ldr r7, .Lloop+4
  1040.     add r6, r6, r7, lsl #0x0A
  1041.     str r6, [sp, #0x08]
  1042.    
  1043.     ldr r0, .Lloop+8
  1044.     mov r5, r0, lsl #0x10
  1045.     bic r0, r0, r5, lsr #0x10
  1046.     ldr r9, =snd_DelTab
  1047.     add r9, r9, r0, lsr #0x10-2
  1048.     ldr r7, [r8]
  1049.     cmp r1, #0x00
  1050.     moveq   pc, lr
  1051. 1:  mov r0, r7, asr #0x1C
  1052.     ldr r0, [r9, r0, lsl #0x02]!
  1053.     qadd    r5, r5, r0
  1054.     movs    r7, r7, lsl #0x04
  1055.     ldreq   r7, [r8, #0x04]!
  1056.     adds    r1, r1, #0x400
  1057.     bmi 1b
  1058.    
  1059.     mov pc, lr
  1060.  
  1061. .Lsmp_no_loop:
  1062.     ldmfd   sp!, {r0-r1}
  1063.     add sp, sp, #0x08
  1064.     strb    r8, [r0]
  1065.     b   .Lchan_read_ok
  1066.  
  1067. /**************************************/
  1068. .align
  1069. .pool
  1070. /**************************************/
  1071. .size   snd_MixProc, .-snd_MixProc
  1072. .global snd_MixProc
  1073. /**************************************/
  1074. /* EOF                                */
  1075. /**************************************/
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement