home *** CD-ROM | disk | FTP | other *** search
/ M.u.C.S. Disc 2000 / MUCS2000.iso / sound / mp2_099 / src / dsp / mp2.asm < prev    next >
Encoding:
Assembly Source File  |  1998-09-27  |  21.1 KB  |  1,228 lines

  1.    ; mp2 - DSP 44.1kHz Stereo MPEG2 Audio decoder
  2. ; Copyright (C) 1996 Fredrik Noring
  3. ;
  4. ; This program is free software; you can redistribute it and/or modify
  5. ; it under the terms of the GNU General Public License as published by
  6. ; the Free Software Foundation; either version 2 of the License, or
  7. ; (at your option) any later version.
  8. ;
  9. ; This program is distributed in the hope that it will be useful,
  10. ; but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. ; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12. ; GNU General Public License for more details.
  13. ;
  14. ; You should have received a copy of the GNU General Public License
  15. ; along with this program; if not, write to the Free Software
  16. ; Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  17. ;
  18. ; Fredrik Noring
  19. ; noring@lysator.liu.se
  20.  
  21. EXT_CLK    equ    1
  22.  
  23.  IF    EXT_CLK
  24. BUFFER_SIZE    equ    2304    ; 2534    ; 2304
  25.  ELSE
  26. BUFFER_SIZE    equ    2534
  27.  ENDIF
  28.     
  29.  
  30.     include    "equates.asm"
  31.  
  32. HAN_SIZE    equ    512
  33. SCALE_RANGE    equ    64
  34.  
  35. INFO_BITRATE        equ    12-8
  36. INFO_FREQUENCY    equ    10-8
  37. INFO_PADDING        equ    9-8
  38. INFO_MODE        equ    6
  39. INFO_EXTMODE        equ    4
  40.  
  41. MPG_MD_STEREO        equ    0
  42. MPG_MD_JOINT_STEREO    equ    1
  43. MPG_MD_DUAL_CHANNEL    equ    2
  44. MPG_MD_MONO        equ    3
  45.  
  46.     org    L:$0
  47. fraction    ds    3*32
  48. bit_alloc    ds    32
  49. sample    ds    3*32
  50. scfsi    ds    32
  51.  
  52.     org    L:$800
  53. buf    ds    2*HAN_SIZE
  54. scale_index    ds    3*32
  55.  
  56. save_A    ds    1
  57. save_x    ds    1
  58.  
  59.     org    X:$2000
  60. msb        ds    256    ; align
  61. window        ds    32*16
  62. filter        ds    64*32
  63. multiple    ds    64
  64. fc        dc    0.9090909090,0.0909090909
  65.         dc    0.8181818181,0.1818181818
  66.         dc    0.7272727272,0.2727272727
  67.         dc    0.6363636363,0.3636363636
  68.         dc    0.5454545454,0.4545454545
  69.         dc    0.4545454545,0.5454545454
  70.         dc    0.3636363636,0.6363636363
  71.         dc    0.2727272727,0.7272727272
  72.         dc    0.1818181818,0.8181818181
  73.         dc    0.0909090909,0.9090909090
  74. c        ds    17
  75. d        ds    17
  76. alloc        ds    4*16*32+16*32
  77. mask        dc    $000000,$000001,$000003,$000007
  78.         dc    $00000f,$00001f,$00003f,$00007f
  79.         dc    $0000ff,$0001ff,$0003ff,$0007ff
  80.         dc    $000fff,$001fff,$003fff,$007fff
  81. divs        dc    $7fffff,$400000,$200000,$100000
  82.         dc    $080000,$040000,$020000,$010000
  83.         dc    $008000,$004000,$002000,$001000
  84.         dc    $000800,$000400,$000200,$000100
  85. bitm        dc    $000001,$00002,$000004,$000008
  86.         dc    $000010,$00020,$000040,$000080
  87.         dc    $000100,$00200,$000400,$000800
  88.         dc    $001000,$02000,$004000,$008000
  89. frame        ds    512
  90.  
  91.     org    Y:$2000
  92. buffer1        ds    BUFFER_SIZE
  93. buffer2        ds    BUFFER_SIZE
  94. buffer0        ds    2304
  95. logic        ds    1
  96. tmp_r6        ds    1
  97.  
  98. bufp        dc    buf+64
  99. sblimit        ds    1
  100. jsbound        ds    1
  101. frame_size        dc    0
  102. frame_okay        dc    0
  103. frame_x0        dc    0
  104. frame_x1        dc    0
  105. frame_y0        dc    0
  106. frame_got_byte    dc    0
  107. frame_the_byte    dc    0
  108.  
  109. state        dc    $c00000
  110.  
  111. fast_forwarding    dc    0
  112.  
  113.     org    X:$3f00
  114. getbit_cntl    dc    0,0,0,0,0,0,0,0
  115.         dc    1,1,1,1,1,1,1,1
  116.         dc    2,2,2,2,2,2,2,2
  117. getbit_mask    dc    $000000,$000001,$000003,$000007
  118.         dc    $00000f,$00001f,$00003f,$00007f
  119.         dc    $0000ff,$0001ff,$0003ff,$0007ff
  120.         dc    $000fff,$001fff,$003fff,$007fff
  121.  
  122.     org    Y:$3f00
  123.         dc    $000001,$000002,$000004,$000008
  124.         dc    $000010,$000020,$000040,$000080
  125.         ds    16
  126.         dc    $000000,$000001,$000002,$000004
  127.         dc    $000008,$000010,$000020,$000040
  128.         dc    $000080,$000100,$000200,$000400
  129.         dc    $000800,$001000,$002000,$004000
  130. getbit_cntlp    ds    1
  131. getbit_framep    ds    1
  132.  
  133. mode    ds    1
  134. stereo    ds    1
  135. sblimits_mono        dc    08,08,08,27,27,27,30,30,30,30,30,30,30,30,30,0
  136.         dc    08,08,08,27,27,27,27,27,27,27,27,27,27,27,27,0
  137.         dc    12,12,12,27,27,27,30,30,30,30,30,30,30,30,30,0
  138. sblimits_stereo    dc    08,08,08,08,08,08,08,27,27,27,30,30,30,30,30,0
  139.         dc    08,08,08,08,08,08,08,27,27,27,27,27,27,27,27,0
  140.         dc    12,12,12,12,12,12,12,27,27,27,30,30,30,30,30,0
  141. frame_sizes        dc    0,104,156,182,208,261,313,365,417,522,626,0731,0835,1044,1253,0
  142.         dc    0,096,144,168,192,240,288,336,384,480,576,0672,0768,0960,1152,0
  143.         dc    0,144,216,252,288,360,432,504,576,720,864,1008,1152,1440,1728,0
  144.  
  145.     org    P:$0
  146.     jmp    <start
  147.  
  148.     org p:$000c
  149.     nop
  150.  
  151.     org    P:$10
  152.     movep    Y:(r7)+,X:<<M_TX
  153.  
  154.     org    P:$40
  155. start    jsr    <init_tables
  156.  
  157.     move    #buffer1,r7
  158.     move    #2*BUFFER_SIZE-1,m7
  159.  
  160.     movep    #%000000000,x:<<M_PCC ; SSI reset
  161.     movep    #%0100000100000000,x:<<M_CRA
  162.     movep    #%0111100000001000,x:<<M_CRB
  163.     movep    #%111100000,x:<<M_PCC ; port C control register
  164.     movep    #%000010000,x:<<M_PCDDR
  165.     movep    #%000000000,x:<<M_PCD ; clear frame syncs
  166.     movep    #$3000,X:<<M_IPR
  167.     andi    #<$FC,MR
  168.  
  169. main    jsset    #3,X:$ffe9,pause
  170.  
  171.     move    #>buffer1,x0
  172.     move    #>buffer1+32,y0
  173. _wait1    move    r7,A
  174.     cmp    x0,A
  175.     jlt    _wait1
  176.     cmp    y0,A
  177.     jgt    _wait1
  178.  IF    EXT_CLK
  179.     move    #>buffer2,x0    ;;
  180.  ELSE
  181.     move    #>buffer0,x0    ;;;
  182.  ENDIF
  183.     move    x0,Y:logic
  184.     jsr    <_replay
  185.  IF    EXT_CLK
  186.  ELSE
  187.     move    #buffer2,r0    ;;;
  188.     jsr    <convert    ;;;
  189.  ENDIF
  190.  
  191.     move    #>buffer2,x0
  192.     move    #>buffer2+32,y0
  193. _wait2    move    r7,A
  194.     cmp    x0,A
  195.     jlt    _wait2
  196.     cmp    y0,A
  197.     jgt    _wait2
  198.  IF    EXT_CLK
  199.     move    #>buffer1,x0    ;;
  200.  ELSE
  201.     move    #>buffer0,x0    ;;;
  202.  ENDIF
  203.     move    x0,Y:logic
  204.     jsr    <_replay
  205.  IF    EXT_CLK
  206.  ELSE
  207.     move    #buffer1,r0    ;;;
  208.     jsr    <convert    ;;;
  209.  ENDIF
  210.     jmp    <main
  211.  
  212. _replay    jsr    <read_frame
  213.  
  214.     move    Y:frame_okay,A
  215.     tst    A
  216.     jmi    _no_sync
  217.  
  218.     jsr    <decode_bitalloc
  219.     jsr    <decode_scale
  220.  
  221.     do    #4,_l1
  222.     jsr    <buffer_sample
  223.     jsr    <dequantize_sample
  224.     move    #scale_index+0*32,r0
  225.     jsr    <denormalize_sample
  226.     jsr    <SubBandSynthesis
  227.     nop
  228. _l1    do    #4,_l2
  229.     jsr    <buffer_sample
  230.     jsr    <dequantize_sample
  231.     move    #scale_index+1*32,r0
  232.     jsr    <denormalize_sample
  233.     jsr    <SubBandSynthesis
  234.     nop
  235. _l2    do    #4,_l3
  236.     jsr    <buffer_sample
  237.     jsr    <dequantize_sample
  238.     move    #scale_index+2*32,r0
  239.     jsr    <denormalize_sample
  240.     jsr    <SubBandSynthesis
  241.     nop
  242. _l3
  243. _no_sync    rts
  244.  
  245. convert    move    #buffer0,r2
  246.     move    #fc,r1
  247.     move    Y:(r2)+,y0
  248.     move    Y:(r2)+,y1
  249.     do    #115,_loop1
  250.     move    y0,Y:(r0)+
  251.     move    y1,Y:(r0)+
  252.     do    #10,_loop2
  253.     move    X:(r1)+,x0
  254.     move    X:(r1)+,x1
  255.     mpy    y0,x0,A Y:(r2)+,y0
  256.     mpy    y1,x0,B Y:(r2)+,y1
  257.     macr    y0,x1,A
  258.     macr    y1,x1,B A,Y:(r0)+
  259.     move            B,Y:(r0)+
  260. _loop2    move    #fc,r1
  261. _loop1
  262.     move    y0,Y:(r0)+
  263.     move    y1,Y:(r0)+
  264.     move    X:(r1)+,x0
  265.     move    X:(r1)+,x1
  266.     mpy    y0,x0,A Y:(r2)+,y0
  267.     mpy    y1,x0,B Y:(r2)+,y1
  268.     macr    y0,x1,A
  269.     macr    y1,x1,B A,Y:(r0)+
  270.     move    B,Y:(r0)+
  271.     rts
  272.  
  273. get_bits
  274.     move    #-1,m5
  275.     move    x0,n5
  276.     move    x0,n4
  277.     move    x0,A
  278.     move    #>$7,y1
  279.     and    y1,A X:(r5+n5),n6
  280.     move    A1,n5
  281.     move    X:(r6)+n6,A
  282.     lsr    A Y:(r5),y1
  283.     move    A1,x1
  284.     mpy    x1,y1,A Y:(r4+n4),y1
  285.     move    #8-1,m5
  286.     move    A0,x1
  287.     mpy    x1,y1,A    X:(r4+n4),x1
  288.     and    x1,A (r5)+n5
  289.     move    A1,A
  290.     rts
  291.  
  292. denormalize_sample
  293.     ori    #%00001000,mr
  294.     move    #multiple,r1
  295.     move    #multiple,r2
  296.     move    #fraction,r3
  297.     move    #fraction,r4
  298.     move    #32,n3
  299.     move    #32,n4
  300.     move    #96-1,m3
  301.     move    #96-1,m4
  302.     move    Y:sblimit,x0
  303.     do    x0,_multiply
  304.     move    X:(r0),n1
  305.     move    Y:(r0)+,n2
  306.     move    X:(r1+n1),x0
  307.     move    X:(r2+n2),y0
  308.  
  309.     move    X:(r3)+n3,x1 Y:(r4),y1
  310.     mpyr    x0,x1,A X:(r3),x1
  311.     mpyr    y0,y1,B A,X:(r4)
  312.     move    B,Y:(r4)+n4
  313.     mpyr    x0,x1,A Y:(r4),y1
  314.     mpyr    y0,y1,B A,X:(r3)+n3
  315.     move    X:(r3),x1 B,Y:(r4)+n4
  316.     mpyr    x0,x1,A Y:(r4),y1
  317.     mpyr    y0,y1,B A,X:(r3)+n3
  318.     move    B,Y:(r4)+n4
  319. ;
  320. ;    do    #3,_loop
  321. ;    move    X:(r3),x1 Y:(r4),y1
  322. ;    mpyr    x0,x1,A
  323. ;    mpyr    y0,y1,B
  324. ;    move    A,X:(r3)+n3
  325. ;    move    B,Y:(r4)+n4
  326. ;_loop
  327.     move    (r3)+
  328.     move    (r4)+
  329. _multiply
  330.     move    #-1,m3
  331.     move    #-1,m4
  332.     andi    #%11110011,mr
  333.     rts
  334.  
  335. SubBandSynthesis
  336.     move    #64,n0
  337.     move    #32,n6
  338.     move    #$3ff,m0
  339.     move    Y:bufp,r0
  340.     move    #fraction,r6
  341.     do    #3,_loop
  342.     move    (r0)-n0
  343.  
  344.     move    r0,r1
  345.     move    r0,r5
  346.     move    #filter,r4
  347.     do    #64,_f1
  348.     move    r6,r2
  349.     move    X:(r4)+,x1
  350.     move    X:(r2),x0
  351.     move    Y:(r2)+,y0
  352.     mpy    x1,x0,A X:(r2),x0
  353.     mpy    x1,y0,B X:(r4)+,x1 Y:(r2)+,y0
  354.     do    #32-2,_f2
  355.     mac    x1,x0,A X:(r2),x0
  356.     mac    x1,y0,B X:(r4)+,x1 Y:(r2)+,y0
  357. _f2    macr    x1,x0,A
  358.     macr    x1,y0,B
  359.     move    A,X:(r1)+ B,Y:(r5)+
  360. _f1
  361.     ori    #%00001000,mr
  362.     move    #window,r2
  363.     move    #$3ff,m1
  364.     move    #$3ff,m3
  365.     move    #$3ff,m4
  366.     move    #$3ff,m5
  367.     move    #96,n3
  368.     move    r0,r3
  369.     move    r0,r1
  370.     move    (r3)+n3
  371.     move    #128,n4
  372.     move    #128,n5
  373.     move    r6,Y:tmp_r6
  374.     move    Y:logic,r6
  375.      do    #32,_w1
  376.      move    r1,r4
  377.      move    r3,r5
  378.      move    X:(r4),y0
  379.     move    X:(r2)+,x1 Y:(r4)+n4,y1
  380.     mpy    x1,y0,A X:(r5),y0
  381.     mpy    x1,y1,B X:(r2)+,x1 Y:(r5)+n5,y1
  382.     do    #(16-2)/2,_w2
  383.     mac    x1,y0,A X:(r4),y0
  384.     mac    x1,y1,B X:(r2)+,x1 Y:(r4)+n4,y1
  385.     mac    x1,y0,A X:(r5),y0
  386.     mac    x1,y1,B X:(r2)+,x1 Y:(r5)+n5,y1
  387. _w2     mac    x1,y0,A (r1)+
  388.     mac    x1,y1,B (r3)+
  389.     move    A,Y:(r6)+
  390.     move    B,Y:(r6)+
  391.  
  392. _w1    move    r6,Y:logic
  393.     move    Y:tmp_r6,r6
  394.     move    #-1,m1
  395.     move    #-1,m3
  396.     andi    #%11110011,mr
  397.     move    #-1,m4
  398.     move    #-1,m5
  399.     move    (r6)+n6
  400.  
  401. _loop    move    #-1,m0
  402.     move    r0,Y:bufp
  403.     rts
  404.  
  405. dequantize_sample
  406.     ; Clear fraction
  407.     move      #fraction,r0
  408.     clr    A #fraction,r4
  409.     do    #3*32,_clear
  410.     move    A,X:(r0)+ A,Y:(r4)+
  411. _clear
  412.     move    #$ff,m1
  413.     move    #96-1,m4
  414.     move    #32,n4
  415.     move    #msb,r1
  416.  
  417.     jsr    <dequantize_left
  418.     move    Y:stereo,x0
  419.     jset    #0,x0,_mono
  420.     jsr    <dequantize_right
  421. _mono
  422.     move    #-1,m1
  423.     move    #-1,m4
  424.     rts
  425.  
  426. dequantize_left
  427.     move    #alloc,r0
  428.     move    #bit_alloc,r2
  429.     move    #sample,r3
  430.     move    #fraction,r4
  431.     move    Y:sblimit,x0
  432.     do    x0,_loop1
  433.     move    X:(r2)+,A
  434.     tst    A
  435.     jeq    _nope
  436.  
  437.     move    A,n0
  438.     move    #>$008000,x0
  439.     move    X:(r0+n0),x1
  440.     mpy    x0,x1,A #>8,B
  441.     move    A1,A
  442.     tst    A A,n1
  443.     jne    _ok
  444.     clr    B x1,n1
  445.     nop
  446. _ok    move    X:(r1+n1),x0
  447.     add    x0,B
  448.  
  449.     move    #3*16*32,n5
  450.     lua    (r0)+n0,r5
  451.     move    #d,r6
  452.     move    X:(r5+n5),n6
  453.     move    X:(r5+n5),n5
  454.     move    #c,r5
  455.     move    X:(r6+n6),y1    ; d
  456.     move    X:(r5+n5),y0    ; c
  457.  
  458.     move    B,n5
  459.     move    B,n6
  460.     move    #mask-1,r6
  461.     do    #3,_loop2
  462.     move    #bitm-1,r5
  463.     move    X:(r3),A
  464.     move    X:(r5+n5),x0
  465.     and    x0,A #$800000,x0
  466.     tst    A #0,A
  467.     teq    x0,A
  468.     move    A,A0
  469.     move    #divs,r5
  470.     move    X:(r6+n6),x0
  471.     move    X:(r3)+,B
  472.     and    x0,B X:(r5+n5),x1
  473.     move    B,x0
  474.     mac    x0,x1,A
  475.     move    A0,x1    ; fraction
  476.     move    y1,A    ; c*d
  477.     mac    y0,x1,A    ; c*fraction
  478.     asl    A
  479.     move    A,X:(r4)+n4
  480. _loop2
  481. _nope    move    #16,n0
  482.     move    (r4)+
  483.     move    (r0)+n0
  484. _loop1    rts
  485.  
  486. dequantize_right
  487.     move    #alloc,r0
  488.     move    #bit_alloc,r2
  489.     move    #sample,r3
  490.     move    #fraction,r4
  491.     move    Y:sblimit,x0
  492.     do    x0,_loop1
  493.     move    Y:(r2)+,A
  494.     tst    A
  495.     jeq    _nope
  496.  
  497.     move    A,n0
  498.     move    #>$008000,x0
  499.     move    X:(r0+n0),x1
  500.     mpy    x0,x1,A #>8,B
  501.     move    A1,A
  502.     tst    A A,n1
  503.     jne    _ok
  504.     clr    B x1,n1
  505.     nop
  506. _ok    move    X:(r1+n1),x0
  507.     add    x0,B
  508.  
  509.     move    #3*16*32,n5
  510.     lua    (r0)+n0,r5
  511.     move    #d,r6
  512.     move    X:(r5+n5),n6
  513.     move    X:(r5+n5),n5
  514.     move    #c,r5
  515.     move    X:(r6+n6),y1    ; d
  516.     move    X:(r5+n5),y0    ; c
  517.  
  518.     move    B,n5
  519.     move    B,n6
  520.     move    #mask-1,r6
  521.     do    #3,_loop2
  522.     move    #bitm-1,r5
  523.     move    Y:(r3),A
  524.     move    X:(r5+n5),x0
  525.     and    x0,A #$800000,x0
  526.     tst    A #0,A
  527.     teq    x0,A
  528.     move    A,A0
  529.     move    #divs,r5
  530.     move    X:(r6+n6),x0
  531.     move    Y:(r3)+,B
  532.     and    x0,B X:(r5+n5),x1
  533.     move    B,x0
  534.     mac    x0,x1,A
  535.     move    A0,x1    ; fraction
  536.     move    y1,A    ; c*d
  537.     mac    y0,x1,A    ; c*fraction
  538.     asl    A
  539.     move    A,Y:(r4)+n4
  540. _loop2
  541. _nope    move    #16,n0
  542.     move    (r4)+
  543.     move    (r0)+n0
  544. _loop1    rts
  545.  
  546. buffer_sample
  547.     jsr    <get_bits_init
  548.  
  549.     move    #bit_alloc,r0
  550.     move    #sample,r1
  551.     move    #3,n1
  552.     move    #alloc,r2
  553.     move    Y:jsbound,x0
  554.     do    x0,_loop1
  555.     move    Y:stereo,A
  556.     jset    #0,A,_not_right
  557.     move    X:(r0),A
  558.     tst    A
  559.     jeq    _not_right
  560.     jsr    _right
  561.     jmp    <_resume_right
  562. _not_right
  563.     clr    A
  564.     move    A,X:(r1)+
  565.     move    A,X:(r1)+
  566.     move    A,X:(r1)+
  567. _resume_right
  568.     move    (r1)-n1        ;;;
  569.  
  570.     move    Y:(r0)+,A
  571.     tst    A
  572.     jeq    _not_left
  573.     jsr    _left
  574.     jmp    <_resume_left
  575. _not_left
  576.     clr    A
  577.     move    A,Y:(r1)+
  578.     move    A,Y:(r1)+
  579.     move    A,Y:(r1)+
  580. _resume_left
  581.  
  582.     move    #16,n2
  583.     nop
  584.     move    (r2)+n2
  585. _loop1
  586.     move    Y:stereo,A
  587.     jset    #0,A,_resume_mono
  588.  
  589.     move    Y:jsbound,x0
  590.     move    Y:sblimit,A
  591.     sub    x0,A
  592.     jeq    _nomono
  593.     do    A,_loop2
  594.     move    X:(r0)+,A
  595.     tst    A
  596.     jeq    _not_mono
  597.     jsr    _right
  598.     move    (r1)-n1        ;;;
  599.     move    X:(r1),x0
  600.     move    x0,Y:(r1)+
  601.     move    X:(r1),x0
  602.     move    x0,Y:(r1)+
  603.     move    X:(r1),x0
  604.     move    x0,Y:(r1)+
  605.     jmp    <_resume_mono
  606. _not_mono
  607.     clr    A
  608.     move    A,X:(r1)
  609.     move    A,Y:(r1)+
  610.     move    A,X:(r1)
  611.     move    A,Y:(r1)+
  612.     move    A,X:(r1)
  613.     move    A,Y:(r1)+
  614. _resume_mono
  615.  
  616.     move    #16,n2
  617.     nop
  618.     move    (r2)+n2
  619. _loop2
  620. _nomono    jsr    <get_bits_exit
  621.     rts
  622.  
  623. _right    move    A,n2
  624.     move    #32*16,n3
  625.     lua    (r2)+n2,r3
  626.     move    #>3,y0
  627.     move    (r3)+n3
  628.     move    X:(r3)+n3,x0
  629.     move    X:(r3)+n3,A
  630.     cmp    y0,A
  631.     jne    _right359
  632.     jsr    <get_bits
  633.     move    A,X:(r1)+
  634.     jsr    <get_bits
  635.     move    A,X:(r1)+
  636.     jsr    <get_bits
  637.     move    A,X:(r1)+
  638.     rts
  639. _right359
  640.     jsr    <get_bits
  641.     move    X:(r3+n3),y0    ; 1/nlevels
  642.     move    X:(r2+n2),y1    ; nlevels
  643.  
  644.     clr    A A,x1
  645.     mpy    x1,y0,B x1,A0
  646.     asl    A B,x1
  647.     mac    -y1,x1,A
  648.     move    A0,A
  649.     lsr    A
  650.     move    A,X:(r1)+
  651.  
  652.     clr    A
  653.     mpy    x1,y0,B x1,A0
  654.     asl    A B,x1
  655.     mac    -y1,x1,A
  656.     move    A0,A
  657.     lsr    A
  658.     move    A,X:(r1)+
  659.  
  660.     clr    A
  661.     mpy    x1,y0,B x1,A0
  662.     asl    A B,x1
  663.     mac    -y1,x1,A
  664.     move    A0,A
  665.     lsr    A
  666.     move    A,X:(r1)+
  667.     rts
  668.  
  669. _left    move    A,n2
  670.     move    #32*16,n3
  671.     lua    (r2)+n2,r3
  672.     move    #>3,y0
  673.     move    (r3)+n3
  674.     move    X:(r3)+n3,x0
  675.     move    X:(r3)+n3,A
  676.     cmp    y0,A
  677.     jne    _left359
  678.     jsr    <get_bits
  679.     move    A,Y:(r1)+
  680.     jsr    <get_bits
  681.     move    A,Y:(r1)+
  682.     jsr    <get_bits
  683.     move    A,Y:(r1)+
  684.     rts
  685. _left359
  686.     jsr    <get_bits
  687.     move    X:(r3+n3),y0    ; 1/nlevels
  688.     move    X:(r2+n2),y1    ; nlevels
  689.  
  690.     clr    A A,x1
  691.     mpy    x1,y0,B x1,A0
  692.     asl    A B,x1
  693.     mac    -y1,x1,A
  694.     move    A0,A
  695.     lsr    A
  696.     move    A,Y:(r1)+
  697.  
  698.     clr    A
  699.     mpy    x1,y0,B x1,A0
  700.     asl    A B,x1
  701.     mac    -y1,x1,A
  702.     move    A0,A
  703.     lsr    A
  704.     move    A,Y:(r1)+
  705.  
  706.     clr    A
  707.     mpy    x1,y0,B x1,A0
  708.     asl    A B,x1
  709.     mac    -y1,x1,A
  710.     move    A0,A
  711.     lsr    A
  712.     move    A,Y:(r1)+
  713.     rts
  714.  
  715. decode_bitalloc
  716.     jsr    <get_bits_init
  717.  
  718.     move    #16,n0
  719.     move    #alloc+1*32*16,r0
  720.     move    #bit_alloc,r1
  721.     move    Y:jsbound,y0
  722.     do    y0,_loop1
  723.     move    X:(r0)+n0,x0
  724.  
  725.     move    Y:stereo,A
  726.     jset    #0,A,_mono
  727.  
  728.     jsr    <get_bits
  729.     move    A,X:(r1)
  730. _mono    jsr    <get_bits
  731.     move    A,Y:(r1)+
  732. _loop1
  733.     move    Y:stereo,A
  734.     jset    #0,A,_loop2
  735.  
  736.     move    Y:jsbound,y0
  737.     move    Y:sblimit,A
  738.     sub    y0,A
  739.     jeq    _loop2
  740.     do    A,_loop2
  741.     move    X:(r0)+n0,x0
  742.     jsr    <get_bits
  743.     move    A,X:(r1)
  744.     move    A,Y:(r1)+
  745. _loop2
  746.     jsr    <get_bits_exit
  747.     rts
  748.  
  749. decode_scale
  750.     jsr    <get_bits_init
  751.  
  752.     move    #>2,x0
  753.     move    #bit_alloc,r0
  754.     move    #scfsi,r1
  755.     move    Y:sblimit,y0
  756.     do    y0,_loop0
  757.  
  758.     move    Y:stereo,A
  759.     jset    #0,A,_n1
  760.  
  761.     move    X:(r0),A
  762.     tst    A
  763.     jeq    _n1
  764.     jsr    <get_bits
  765.     move    A,X:(r1)
  766. _n1    move    Y:(r0)+,A
  767.     tst    A
  768.     jeq    _n2
  769.     jsr    <get_bits
  770.     move    A,Y:(r1)
  771. _n2    move    (r1)+
  772. _loop0
  773.     move    #32,n1
  774.     move    #3*32-1,m1
  775.     move    #bit_alloc,r0
  776.     move    #scale_index,r1
  777.     move    #scfsi,r2
  778.     move    Y:sblimit,y0
  779.     do    y0,_loop1
  780.     move    Y:stereo,A
  781.     jset    #0,A,_not_right
  782.  
  783.     move    X:(r0),A    ; Right
  784.     tst    A
  785.     jeq    <_not_right
  786.     move    X:(r2),A    ; Right
  787.     tst    A #>1,x0
  788.     jeq    _r0
  789.     cmp    x0,A #>2,x0
  790.     jeq    _r1
  791.     cmp    x0,A #>3,x0
  792.     jeq    _r2
  793.     cmp    x0,A
  794.     jeq    _r3
  795.     jmp    <_right
  796. _r0    move    #>6,x0
  797.     jsr    <get_bits
  798.     move    A,X:(r1)+n1    ; Right
  799.     jsr    <get_bits
  800.     move    A,X:(r1)+n1    ; Right
  801.     jsr    <get_bits
  802.     move    A,X:(r1)+n1    ; Right
  803.     jmp    <_right
  804. _r1    move    #>6,x0
  805.     jsr    <get_bits
  806.     move    A,X:(r1)+n1    ; Right
  807.     move    A,X:(r1)+n1    ; Right
  808.     jsr    <get_bits
  809.     move    A,X:(r1)+n1    ; Right
  810.     jmp    <_right
  811. _r3    move    #>6,x0
  812.     jsr    <get_bits
  813.     move    A,X:(r1)+n1    ; Right
  814.     jsr    <get_bits
  815.     move    A,X:(r1)+n1    ; Right
  816.     move    A,X:(r1)+n1    ; Right
  817.     jmp    <_right
  818. _r2    move    #>6,x0
  819.     jsr    <get_bits
  820.     move    A,X:(r1)+n1    ; Right
  821.     move    A,X:(r1)+n1    ; Right
  822.     move    A,X:(r1)+n1    ; Right
  823.     jmp    <_right
  824. _not_right
  825.     move    #>SCALE_RANGE-1,A
  826.     move    A,X:(r1)+n1    ; Right
  827.     move    A,X:(r1)+n1    ; Right
  828.     move    A,X:(r1)+n1    ; Right
  829. _right
  830. _mono
  831.     move    Y:(r0),A    ; Left
  832.     tst    A
  833.     jeq    <_not_left
  834.     move    Y:(r2),A    ; Left
  835.     tst    A #>1,x0
  836.     jeq    _l0
  837.     cmp    x0,A #>2,x0
  838.     jeq    _l1
  839.     cmp    x0,A #>3,x0
  840.     jeq    _l2
  841.     cmp    x0,A
  842.     jeq    _l3
  843.     jmp    <_left
  844. _l0    move    #>6,x0
  845.     jsr    <get_bits
  846.     move    A,Y:(r1)+n1    ; Left
  847.     jsr    <get_bits
  848.     move    A,Y:(r1)+n1    ; Left
  849.     jsr    <get_bits
  850.     move    A,Y:(r1)+n1    ; Left
  851.     jmp    <_left
  852. _l1    move    #>6,x0
  853.     jsr    <get_bits
  854.     move    A,Y:(r1)+n1    ; Left
  855.     move    A,Y:(r1)+n1    ; Left
  856.     jsr    <get_bits
  857.     move    A,Y:(r1)+n1    ; Left
  858.     jmp    <_left
  859. _l3    move    #>6,x0
  860.     jsr    <get_bits
  861.     move    A,Y:(r1)+n1    ; Left
  862.     jsr    <get_bits
  863.     move    A,Y:(r1)+n1    ; Left
  864.     move    A,Y:(r1)+n1    ; Left
  865.     jmp    <_left
  866. _l2    move    #>6,x0
  867.     jsr    <get_bits
  868.     move    A,Y:(r1)+n1    ; Left
  869.     move    A,Y:(r1)+n1    ; Left
  870.     move    A,Y:(r1)+n1    ; Left
  871.     jmp    <_left
  872. _not_left
  873.     move    #>SCALE_RANGE-1,A
  874.     move    A,Y:(r1)+n1    ; Left
  875.     move    A,Y:(r1)+n1    ; Left
  876.     move    A,Y:(r1)+n1    ; Left
  877. _left
  878.     move    (r0)+
  879.     move    (r1)+
  880.     move    (r2)+
  881. _loop1
  882.     move    #-1,m1
  883.     jsr    <get_bits_exit
  884.     rts
  885.  
  886. zero_buffers    clr    A #buffer1,r0
  887.     do    #BUFFER_SIZE,_zero
  888.     move    A,Y:(r0)+
  889.     move    A,Y:(r0)+
  890. _zero    rts
  891.  
  892. pause    jsr    zero_buffers
  893.     jset    #3,X:$ffe9,*
  894.     rts
  895.  
  896. fast_forward    jsset    #3,X:$ffe9,zero_buffers
  897.     bset    #0,Y:fast_forwarding
  898.     do    #20,_skip
  899.     jsr    read_frame
  900.     nop
  901. _skip    bclr    #0,Y:fast_forwarding
  902.     rts
  903.  
  904. read_frame    move    Y:fast_forwarding,x0
  905.     jset    #0,x0,_nope
  906.     jsset    #4,X:$ffe9,fast_forward
  907. _nope
  908.     move    Y:frame_okay,A
  909.     tst    A
  910.     jne    _again
  911.  
  912.     jsr    read_header
  913. _again    jsr    parse_header
  914.  
  915.     clr    A #frame,r0
  916.     jsr    DMA_r_x0
  917. ;_wait_5    jclr    #0,X:<<M_HSR,_wait_5
  918. ;    movep    X:<<M_HRX,x0
  919.     move    x0,y0
  920.     jsr    DMA_r_x0
  921.     move    x0,x1
  922.     jsr    DMA_r_x0
  923.     move    x0,A0
  924.     move    y0,x0
  925. ;_wait_6    jclr    #0,X:<<M_HSR,_wait_6
  926. ;    movep    X:<<M_HRX,x1
  927. ;_wait_7    jclr    #0,X:<<M_HSR,_wait_7
  928. ;    movep    X:<<M_HRX,A0
  929.     move    #>$008000,y0
  930.     mac    x0,y0,A #>$000080,y0
  931.     mac    x1,y0,A
  932.     move    A0,X:(r0)+
  933.  
  934.     move    #>$000080,y0
  935.     do    y1,_read
  936.     clr    A A0,x0
  937.     move    x0,y1
  938.     jsr    DMA_r_x0
  939.     move    x0,A0
  940.     move    y1,x0
  941. ;_wait    jclr    #0,X:<<M_HSR,_wait
  942. ;    movep    X:<<M_HRX,A0
  943.     mac    x0,y0,A
  944.     move    A0,X:(r0)+
  945. _read
  946.     ; Round off
  947.     do    #8,_s1
  948.     asl    A
  949. _s1    move    A0,X:(r0)+
  950.     do    #8,_s2
  951.     asl    A
  952. _s2    move    A0,X:(r0)+
  953.     ; Initialize pointers
  954.     move    #getbit_cntl,r5
  955.     move    #frame,r6
  956.     move    r5,Y:getbit_cntlp
  957.     move    r6,Y:getbit_framep
  958.  
  959.     jsr    read_header
  960.     rts
  961. get_bits_init
  962.     move    #getbit_mask,r4
  963.     move    Y:getbit_cntlp,r5
  964.     move    Y:getbit_framep,r6
  965.     rts
  966. get_bits_exit
  967.     move    r5,Y:getbit_cntlp
  968.     move    r6,Y:getbit_framep
  969.     move    #-1,m5
  970.     rts
  971.  
  972. read_header    move    #>1,x0
  973.     move    x0,Y:frame_okay
  974.  
  975.     ; read 32 bit header (12+20)
  976.     jsr    DMA_r_x0
  977.     move    x0,B
  978.     jsr    DMA_r_x0
  979. _again    move    x0,x1
  980.     jsr    DMA_r_x0
  981.     move    x0,y1
  982.     jsr    DMA_r_x0
  983.     move    x0,y0
  984.     move    y1,x0
  985. ;_wait_1    jclr    #0,X:<<M_HSR,_wait_1
  986. ;    movep    X:<<M_HRX,x0
  987. ;_wait_2    jclr    #0,X:<<M_HSR,_wait_2
  988. ;    movep    X:<<M_HRX,x1
  989. ;_wait_3    jclr    #0,X:<<M_HSR,_wait_3
  990. ;    movep    X:<<M_HRX,x0
  991. ;_wait_4    jclr    #0,X:<<M_HSR,_wait_4
  992. ;    movep    X:<<M_HRX,y0
  993.  
  994. ;    jclr    #1,X:<<M_HSR,*    ;;;;
  995. ;    movep    B,X:<<M_HTX        ;;;;
  996. ;    jclr    #1,X:<<M_HSR,*    ;;;;
  997. ;    movep    x1,X:<<M_HTX        ;;;;
  998. ;    jclr    #1,X:<<M_HSR,*    ;;;;
  999. ;    movep    x0,X:<<M_HTX        ;;;;
  1000. ;    jclr    #1,X:<<M_HSR,*    ;;;;
  1001. ;    movep    y0,X:<<M_HTX        ;;;;
  1002.  
  1003.     move    #>$ff,A
  1004.     cmp    A,B #>$f0,A
  1005.     jne    _sync_lost
  1006.     and    x1,A A,B
  1007.     cmp    A,B
  1008.     jne    _sync_lost
  1009.  
  1010.     move    x1,Y:frame_x1
  1011.     move    x0,Y:frame_x0
  1012.     move    y0,Y:frame_y0
  1013.  
  1014.     move    Y:frame_okay,A
  1015.     rts
  1016. _sync_lost    jsr    zero_buffers
  1017.  
  1018.     move    #>-1,x0
  1019.     move    x0,Y:frame_okay
  1020. _sync_detection
  1021. _get_ff    jsr    DMA_r_x0
  1022.     move    #>$ff,y0
  1023.     move    x0,A
  1024.     and    y0,A #>$42,y0
  1025.     cmp    y0,A #>$ff,y0
  1026.     jeq    _stop
  1027.     cmp    y0,A
  1028.     jne    _get_ff
  1029.  
  1030.     move    #>$f0,y0
  1031. _get_f0    jsr    DMA_r_x0
  1032.     move    x0,A
  1033.     and    y0,A
  1034.     cmp    y0,A
  1035.     jne    _sync_detection
  1036.  
  1037.     move    #>$ff,B
  1038.     jmp    <_again
  1039.  
  1040. _stop    do    #8,_wait_some
  1041.     jsr    DMA_r_x0
  1042.     move    #>$ff,y0
  1043.     move    x0,A
  1044.     and    y0,A #>$42,y0
  1045.     cmp    y0,A
  1046.     jne    _nope
  1047. _wait_some    jmp    _wait_some
  1048. _nope    enddo
  1049.     jmp    _sync_detection
  1050.  
  1051. parse_header    move    Y:frame_x1,x1
  1052.     move    Y:frame_x0,x0
  1053.     move    Y:frame_y0,y0
  1054.  
  1055. ;    jclr    #1,X:<<M_HSR,*    ;;;;
  1056. ;    movep    x1,X:<<M_HTX        ;;;;
  1057. ;    jclr    #1,X:<<M_HSR,*    ;;;;
  1058. ;    movep    x0,X:<<M_HTX        ;;;;
  1059. ;    jclr    #1,X:<<M_HSR,*    ;;;;
  1060. ;    movep    y0,X:<<M_HTX        ;;;;
  1061.  
  1062.     move    y0,A
  1063.     lsr    A
  1064.     lsr    A
  1065.     lsr    A
  1066.     lsr    A
  1067.     lsr    A
  1068.     lsr    A #>%11,x1
  1069.     and    x1,A #>2,x1
  1070.     move    #sblimits_stereo,r0
  1071.     move    #>MPG_MD_MONO,B
  1072.     cmp    A,B A,Y:mode
  1073.     jne    _no_mono
  1074.     move    #>1,x1
  1075.     move    #sblimits_mono,r0
  1076. _no_mono    move    x1,Y:stereo
  1077.  
  1078.     move    x0,A
  1079.     lsr    A
  1080.     lsr    A
  1081.     lsr    A
  1082.     lsr    A #>%001111,x1
  1083.     and    x1,A x0,B
  1084.     lsl    B
  1085.     lsl    B #>%110000,x1
  1086.     and    x1,B A,x1
  1087.     or    x1,B
  1088.     move    B,n0
  1089.     nop
  1090.     move    Y:(r0+n0),x1
  1091.     move    #frame_sizes,r0
  1092.     move    x1,Y:sblimit
  1093.     move    x1,Y:jsbound
  1094.     move    #>1,x1
  1095.     move    Y:(r0+n0),A
  1096.     jclr    #INFO_PADDING,x0,_no_padding
  1097.     add    x1,A
  1098. _no_padding    move    #>4+3,x1
  1099.  
  1100.     move    Y:frame_x1,x0
  1101.     jset    #0,x0,_no_crc
  1102.     jsr    DMA_r_x0
  1103.     jsr    DMA_r_x0
  1104. ;    jsr    DMA_r_x0
  1105. ;    jsr    DMA_r_x0
  1106.     move    #>2+4+3,x1
  1107. _no_crc
  1108.     sub    x1,A
  1109.     move    A,y1
  1110.  
  1111.     move    Y:mode,x1
  1112.     move    #>MPG_MD_JOINT_STEREO,B
  1113.     cmp    x1,B
  1114.     jne    _no_joint
  1115.     move    y0,A
  1116.     lsr    A
  1117.     lsr    A #>%1100,x1
  1118.     and    x1,A #>4,x1
  1119.     add    x1,A
  1120.     move    A,Y:jsbound
  1121. _no_joint    rts
  1122.  
  1123. ; DMA handshake and Host DSP/030 I/O routines.
  1124. Host_get    jclr    #0,X:<<M_HSR,*
  1125.     movep    X:<<M_HRX,x0
  1126.     rts
  1127. Host_send    jclr    #1,X:<<M_HSR,*
  1128.     movep    x0,X:<<M_HTX
  1129.     rts
  1130. DMA_send    bset    #5,x:<<M_PCD    ; start frame sync
  1131.     movep    x0,x:<<M_TX
  1132.     jclr    #6,x:<<M_SR,*
  1133.     bclr    #5,x:<<M_PCD    ; stop frame sync
  1134.     rts
  1135.  
  1136. DMA_r_x0    move    A,L:save_A
  1137.     move    x1,X:save_x
  1138.     move    Y:frame_got_byte,x1
  1139.     jset    #0,x1,_ok
  1140.  
  1141.     move    #>1,x0
  1142.     move    x0,Y:frame_got_byte
  1143.     jsr    _read
  1144.     move    x0,Y:frame_the_byte
  1145.     move    #>$008000,x1
  1146.     mpy    x0,x1,A
  1147.     move    A1,x0
  1148.     
  1149.     move    Y:frame_the_byte,x1
  1150.     move    #>$ff,A
  1151.     and    x1,A
  1152.     move    A1,Y:frame_the_byte
  1153.  
  1154.     move    X:save_x,x1
  1155.     move    L:save_A,A
  1156.     rts
  1157. _ok    move    #0,x0
  1158.     move    x0,Y:frame_got_byte
  1159.     move    Y:frame_the_byte,x0
  1160.     move    X:save_x,x1
  1161.     move    L:save_A,A
  1162.     rts
  1163.  
  1164. _read
  1165.  
  1166.     bset    #4,X:<<M_PCD    ; start frame sync
  1167.     jclr    #7,X:<<M_SR,*    ; RDF
  1168.     bclr    #4,X:<<M_PCD    ; stop frame sync
  1169.     movep    X:<<M_RX,A
  1170.     lsr    A
  1171.     lsr    A Y:<state,x0
  1172.     or    x0,A #>$010000,x1
  1173.     lsr    A
  1174.     move    A1,x0
  1175.     mpy    x0,x1,A #>$ffff,x0
  1176.     and    x0,A A0,Y:<state
  1177.     move    A1,x0
  1178.     rts
  1179.  
  1180. init_tables    move    #filter,r0
  1181.     do    #64*32,_filter
  1182. _f_wait    jclr    #0,X:<<M_HSR,_f_wait
  1183.     movep    X:<<M_HRX,X:(r0)+
  1184. _filter
  1185.     move    #window,r0
  1186.     do    #32*16,_window
  1187. _w_wait    jclr    #0,X:<<M_HSR,_w_wait
  1188.     movep    X:<<M_HRX,X:(r0)+
  1189. _window
  1190.     move    #alloc,r0
  1191.     do    #2048+16*32,_alloc
  1192. _a_wait    jclr    #0,X:<<M_HSR,_a_wait
  1193.     movep    X:<<M_HRX,X:(r0)+
  1194. _alloc
  1195.     move    #multiple,r0
  1196.     do    #64,_multiple
  1197. _m_wait    jclr    #0,X:<<M_HSR,_m_wait
  1198.     movep    X:<<M_HRX,X:(r0)+
  1199. _multiple
  1200.     move    #c,r0
  1201.     do    #17,_c
  1202. _c_wait    jclr    #0,X:<<M_HSR,_c_wait
  1203.     movep    X:<<M_HRX,X:(r0)+
  1204. _c
  1205.     move    #d,r0
  1206.     do    #17,_d
  1207. _d_wait    jclr    #0,X:<<M_HSR,_d_wait
  1208.     movep    X:<<M_HRX,X:(r0)+
  1209. _d
  1210.     move    #msb,r0
  1211.     do    #256,_msb
  1212. _s_wait    jclr    #0,X:<<M_HSR,_s_wait
  1213.     movep    X:<<M_HRX,X:(r0)+
  1214. _msb
  1215.     move      #buf,r0
  1216.     clr    A #buf,r4
  1217.     rep    #2*HAN_SIZE
  1218.     move    A,X:(r0)+ A,Y:(r4)+
  1219.  
  1220.     clr    A #buffer1,r0
  1221.     rep    #BUFFER_SIZE
  1222.     move    A,Y:(r0)+
  1223.     rep    #BUFFER_SIZE
  1224.     move    A,Y:(r0)+
  1225.     rts
  1226.  
  1227.     end
  1228.