home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 3 / AACD03.BIN / AACD / Sound / DelfAIFF / src / ADPCM4.a56 next >
Text File  |  1999-10-01  |  4KB  |  230 lines

  1.  
  2. ;Delfina object DSP56K_ADPCM4
  3. ;memory map (for Amiga access)
  4. ;
  5. ; prog
  6. ;   0 .. init (x1=/, x0=/, y1=/, y0=/)
  7. ;  +2 .. decode ADPCM4 data (x1=mono, x0=outbuf, y1=/, y0=/)
  8. ;
  9. ; xdata
  10. ;   /
  11. ;
  12. ; ydata
  13. ;   0 .. busy (Amiga read)
  14. ;  +1 .. inbuf (Amiga write)
  15.  
  16.  
  17.  
  18.  
  19. DELFINA_SAMPLES    equ    2046
  20.  
  21.  
  22.     include 'delfequ.inc'
  23.  
  24.     org    p:
  25.  
  26. ;->prog
  27.     jmp    init
  28.  
  29. ;->prog+2
  30.  
  31. ;*****************************************************************
  32. ;
  33. ; **** ADPCM4->PCM16 decoder ****
  34. ;
  35. ; designed to play files created by
  36. ; AudioConvert V1.0 (c) Stephane TAVENARD
  37. ;
  38. ;
  39. ; parameters
  40. ;  x1 - mono          (mono: not_zero, stereo: zero)
  41. ;  x0 - output buffer (mono: x: only,  stereo: x: left, y: right)
  42. ;  y1 - /
  43. ;  y0 - /
  44. ;
  45. ;
  46. ; Delfina DSP coding by Smack/Infect!
  47. ; (Mon 12-Jul-1999) - got my first DSP56K program working!
  48. ; (Fri 23-Jul-1999) - optimized a little bit
  49. ; (Wed 11-Aug-1999) - optimized further
  50. ;                     (inline functions, adap_tab + diff_tab modulo access)
  51. ;
  52. ;*****************************************************************
  53.  
  54.     move    x1,b            ;b=mono
  55.     move    x0,r3            ;r3=output buffer
  56.     move    x0,x:busy        ;set #busy# to non-zero
  57.  
  58.     move    #scale_tab,r1        ;r1=scale_tab_l
  59.     move    r1,r2            ;r2=scale_tab_r
  60.     move    x:adapl,n1        ;n1=adap_l
  61.     move    x:adapr,n2        ;n2=adap_r
  62.     move    #$7fff,r4        ;r4=$7fff
  63.     move    #88,r5            ;r5=88
  64.     move    #diff_tab,r6        ;r6=diff_tab  !!  ALIGN 16
  65.     movec    #$000f,m6
  66.     move    #adap_tab,r7        ;r7=adap_tab  !!  ALIGN 16
  67.     movec    #$000f,m7
  68.  
  69.     tst    b    #inbuf,r0    ;r0=input buffer
  70.     jeq    stereo
  71.  
  72. ;*** decode mono ***********************
  73.     move    y:(r0)+,y1        ;y1=input
  74.     do    #DELFINA_SAMPLES/6,mono_loop_0
  75.     do    #6,mono_loop_1
  76. ;decode_left
  77.     mpy    y1,#20,a
  78.     move    a0,y1            ;y1=shifted to next 4bit input
  79.     move    a1,n6            ;get 4bit code for table offset
  80.  
  81.     move    y:(r1+n1),y0        ;get scale
  82.     move    x:(r6+n6),x1        ;get diff  !!  m6=$000f
  83.     move    x:pcml,b
  84.     macr    x1,y0,b    r4,a        ;b=new pcm (raw)
  85.             ;        ;a=limit_high
  86.  
  87.     cmp    a,b    n6,n7
  88.     tgt    a,b            ;??b=limit_high??
  89.     neg    a    n1,x1        ;x1=adap
  90.     cmp    a,b    #0,y0        ;y0=0
  91.     tlt    a,b            ;??b=limit_low??
  92.  
  93.     move    x:(r7+n7),a        ;!!  m7=$000f
  94.     add    x1,a    r5,x0        ;a=new adap (raw)
  95.             ;        ;x0=limit_high
  96.     cmp    y0,a    b,x1
  97.     tlt    y0,a            ;??a=limit_low??
  98.     cmp    x0,a    b,x:pcml
  99.     tgt    x0,a            ;??a=limit_high??
  100.     move    a,n1            ;n1=new adap
  101.  
  102.     mpy    x1,#16,b        ;scale 16bit->24bit
  103.     move    b0,x:(r3)+
  104. mono_loop_1
  105.     move    y:(r0)+,y1        ;y1=input
  106. mono_loop_0
  107.     jmp    exit
  108.  
  109.  
  110. ;*** decode stereo *********************
  111. stereo
  112.     move    y:(r0)+,y1        ;y1=input
  113.     do    #DELFINA_SAMPLES/3,stereo_loop_0
  114.     do    #3,stereo_loop_1
  115. ;decode_left
  116.     mpy    y1,#20,a
  117.     move    a0,y1            ;y1=shifted to next 4bit input
  118.     move    a1,n6            ;get 4bit code for table offset
  119.  
  120.     move    y:(r1+n1),y0        ;get scale
  121.     move    x:(r6+n6),x1        ;get diff  !!  m6=$000f
  122.     move    x:pcml,b
  123.     macr    x1,y0,b    r4,a        ;b=new pcm (raw)
  124.             ;        ;a=limit_high
  125.  
  126.     cmp    a,b    n6,n7
  127.     tgt    a,b            ;??b=limit_high??
  128.     neg    a    n1,x1        ;x1=adap
  129.     cmp    a,b    #0,y0        ;y0=0
  130.     tlt    a,b            ;??b=limit_low??
  131.  
  132.     move    x:(r7+n7),a        ;!!  m7=$000f
  133.     add    x1,a    r5,x0        ;a=new adap (raw)
  134.             ;        ;x0=limit_high
  135.     cmp    y0,a    b,x1
  136.     tlt    y0,a            ;??a=limit_low??
  137.     cmp    x0,a    b,x:pcml
  138.     tgt    x0,a            ;??a=limit_high??
  139.     move    a,n1            ;n1=new adap
  140.  
  141.     mpy    x1,#16,b        ;scale 16bit->24bit
  142.     move    b0,x:(r3)
  143. ;decode_right
  144.     mpy    y1,#20,a
  145.     move    a0,y1            ;y1=shifted to next 4bit input
  146.     move    a1,n6            ;get 4bit code for table offset
  147.  
  148.     move    y:(r2+n2),y0        ;get scale
  149.     move    x:(r6+n6),x1        ;get diff  !!  m6=$000f
  150.     move    x:pcmr,b
  151.     macr    x1,y0,b    r4,a        ;b=new pcm (raw)
  152.             ;        ;a=limit_high
  153.  
  154.     cmp    a,b    n6,n7
  155.     tgt    a,b            ;??b=limit_high??
  156.     neg    a    n2,x1        ;x1=adap
  157.     cmp    a,b    #0,y0        ;y0=0
  158.     tlt    a,b            ;??b=limit_low??
  159.  
  160.     move    x:(r7+n7),a        ;!!  m7=$000f
  161.     add    x1,a    r5,x0        ;a=new adap (raw)
  162.             ;        ;x0=limit_high
  163.     cmp    y0,a    b,x1
  164.     tlt    y0,a            ;??a=limit_low??
  165.     cmp    x0,a    b,x:pcmr
  166.     tgt    x0,a            ;??a=limit_high??
  167.     move    a,n2            ;n2=new adap
  168.  
  169.     mpy    x1,#16,b        ;scale 16bit->24bit
  170.     move    b0,y:(r3)+
  171. stereo_loop_1
  172.     move    y:(r0)+,y1        ;y1=input
  173. stereo_loop_0
  174. exit
  175.     move    n1,x:adapl
  176.     move    n2,x:adapr
  177.     move    #0,x0
  178.     move    x0,x:busy        ;reset #busy# to zero
  179.     rts
  180.  
  181.  
  182.  
  183.  
  184.  
  185. ;*** initialize ************************
  186. init
  187.     move    #scale_tab_end,r0
  188.     move    #$7fffff,x1
  189.     move    #1/1.1,x0
  190.     move    x1,a
  191.     do    #89,precalc_loop
  192.     mpyr    x0,x1,a    a,y:-(r0)    ;precalc scale_tab
  193.     move    a,x1
  194. precalc_loop
  195.     rts
  196.  
  197.  
  198.  
  199.     org    x:
  200.     align    16
  201.  
  202. adap_tab
  203.     dc    -1,-1,-1,-1,2,4,6,8
  204.     dc    -1,-1,-1,-1,2,4,6,8
  205. diff_tab
  206.     dc     $001000, $003000, $005000, $007000
  207.     dc     $009000, $00b000, $00d000, $00f000
  208.     dc    -$001000,-$003000,-$005000,-$007000
  209.     dc    -$009000,-$00b000,-$00d000,-$00f000
  210.  
  211. pcml    dc    0
  212. pcmr    dc    0
  213. adapl    dc    0
  214. adapr    dc    0
  215.  
  216.  
  217.  
  218.  
  219.     org    y:
  220.  
  221. ;->ydata
  222. busy    dc    0
  223.  
  224. ;->ydata+1
  225. inbuf    ds    DELFINA_SAMPLES/3
  226.  
  227. scale_tab
  228.     ds    89
  229. scale_tab_end
  230.