home *** CD-ROM | disk | FTP | other *** search
/ M.u.C.S. Disc 2000 / MUCS2000.iso / sound / mp2 / src / dsp / mp2.asm < prev    next >
Encoding:
Assembly Source File  |  1996-11-30  |  20.8 KB  |  1,210 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    ; allign
  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
  270.     move    A,Y:(r0)+
  271.     move    B,Y:(r0)+
  272.     rts
  273.  
  274. get_bits
  275.     move    #-1,m5
  276.     move    x0,n5
  277.     move    x0,n4
  278.     move    X:(r5+n5),n6
  279.     move    x0,A
  280.     move    #>$7,y1
  281.     and    y1,A
  282.     move    A1,n5
  283.     move    Y:(r5),y1
  284.     move    X:(r6)+n6,A
  285.     lsr    A
  286.     move    A1,x1
  287.     mpy    x1,y1,A Y:(r4+n4),y1
  288.     move    #8-1,m5
  289.     move    A0,x1
  290.     mpy    x1,y1,A    X:(r4+n4),x1
  291.     and    x1,A (r5)+n5
  292.     move    A1,A
  293.     rts
  294.  
  295. denormalize_sample
  296.     ori    #%00001000,mr
  297.     move    #multiple,r1
  298.     move    #multiple,r2
  299.     move    #fraction,r3
  300.     move    #fraction,r4
  301.     move    #32,n3
  302.     move    #32,n4
  303.     move    #96-1,m3
  304.     move    #96-1,m4
  305.     move    Y:sblimit,x0
  306.     do    x0,_multiply
  307.     move    X:(r0),n1
  308.     move    Y:(r0)+,n2
  309.     move    X:(r1+n1),x0
  310.     move    X:(r2+n2),y0
  311.  
  312.     move    X:(r3)+n3,x1 Y:(r4),y1
  313.     mpyr    x0,x1,A X:(r3),x1
  314.     mpyr    y0,y1,B A,X:(r4)
  315.     move    B,Y:(r4)+n4
  316.     mpyr    x0,x1,A Y:(r4),y1
  317.     mpyr    y0,y1,B A,X:(r3)+n3
  318.     move    X:(r3),x1 B,Y:(r4)+n4
  319.     mpyr    x0,x1,A Y:(r4),y1
  320.     mpyr    y0,y1,B A,X:(r3)+n3
  321.     move    B,Y:(r4)+n4
  322. ;
  323. ;    do    #3,_loop
  324. ;    move    X:(r3),x1 Y:(r4),y1
  325. ;    mpyr    x0,x1,A
  326. ;    mpyr    y0,y1,B
  327. ;    move    A,X:(r3)+n3
  328. ;    move    B,Y:(r4)+n4
  329. ;_loop
  330.     move    (r3)+
  331.     move    (r4)+
  332. _multiply
  333.     move    #-1,m3
  334.     move    #-1,m4
  335.     andi    #%11110011,mr
  336.     rts
  337.  
  338. SubBandSynthesis
  339.     move    #64,n0
  340.     move    #32,n6
  341.     move    #$3ff,m0
  342.     move    Y:bufp,r0
  343.     move    #fraction,r6
  344.     do    #3,_loop
  345.     move    (r0)-n0
  346.  
  347.     move    r0,r1
  348.     move    r0,r5
  349.     move    #filter,r4
  350.     do    #64,_f1
  351.     move    r6,r2
  352.     move    X:(r4)+,x1
  353.     move    X:(r2),x0
  354.     move    Y:(r2)+,y0
  355.     mpy    x1,x0,A X:(r2),x0
  356.     mpy    x1,y0,B X:(r4)+,x1 Y:(r2)+,y0
  357.     do    #32-2,_f2
  358.     mac    x1,x0,A X:(r2),x0
  359.     mac    x1,y0,B X:(r4)+,x1 Y:(r2)+,y0
  360. _f2    macr    x1,x0,A
  361.     macr    x1,y0,B
  362.     move    A,X:(r1)+ B,Y:(r5)+
  363. _f1
  364.     ori    #%00001000,mr
  365.     move    #window,r2
  366.     move    #$3ff,m1
  367.     move    #$3ff,m3
  368.     move    #$3ff,m4
  369.     move    #$3ff,m5
  370.     move    #96,n3
  371.     move    r0,r3
  372.     move    r0,r1
  373.     move    (r3)+n3
  374.     move    #128,n4
  375.     move    #128,n5
  376.     move    r6,Y:tmp_r6
  377.     move    Y:logic,r6
  378.      do    #32,_w1
  379.      move    r1,r4
  380.      move    r3,r5
  381.      move    X:(r4),y0
  382.     move    X:(r2)+,x1 Y:(r4)+n4,y1
  383.     mpy    x1,y0,A X:(r5),y0
  384.     mpy    x1,y1,B X:(r2)+,x1 Y:(r5)+n5,y1
  385.     do    #(16-2)/2,_w2
  386.     mac    x1,y0,A X:(r4),y0
  387.     mac    x1,y1,B X:(r2)+,x1 Y:(r4)+n4,y1
  388.     mac    x1,y0,A X:(r5),y0
  389.     mac    x1,y1,B X:(r2)+,x1 Y:(r5)+n5,y1
  390. _w2     mac    x1,y0,A (r1)+
  391.     mac    x1,y1,B (r3)+
  392.     move    A,Y:(r6)+
  393.     move    B,Y:(r6)+
  394.  
  395. _w1    move    r6,Y:logic
  396.     move    Y:tmp_r6,r6
  397.     move    #-1,m1
  398.     move    #-1,m3
  399.     andi    #%11110011,mr
  400.     move    #-1,m4
  401.     move    #-1,m5
  402.     move    (r6)+n6
  403.  
  404. _loop    move    #-1,m0
  405.     move    r0,Y:bufp
  406.     rts
  407.  
  408. dequantize_sample
  409.     ; Clear fraction
  410.     move      #fraction,r0
  411.     clr    A #fraction,r4
  412.     do    #3*32,_clear
  413.     move    A,X:(r0)+ A,Y:(r4)+
  414. _clear
  415.     move    #$ff,m1
  416.     move    #96-1,m4
  417.     move    #32,n4
  418.     move    #msb,r1
  419.  
  420.     jsr    <dequantize_left
  421.     jsr    <dequantize_right
  422.  
  423.     move    #-1,m1
  424.     move    #-1,m4
  425.     rts
  426.  
  427. dequantize_left
  428.     move    #alloc,r0
  429.     move    #bit_alloc,r2
  430.     move    #sample,r3
  431.     move    #fraction,r4
  432.     move    Y:sblimit,x0
  433.     do    x0,_loop1
  434.     move    X:(r2)+,A
  435.     tst    A
  436.     jeq    _nope
  437.  
  438.     move    A,n0
  439.     move    #>$008000,x0
  440.     move    X:(r0+n0),x1
  441.     mpy    x0,x1,A #>8,B
  442.     move    A1,A
  443.     tst    A A,n1
  444.     jne    _ok
  445.     clr    B x1,n1
  446.     nop
  447. _ok    move    X:(r1+n1),x0
  448.     add    x0,B
  449.  
  450.     move    #3*16*32,n5
  451.     lua    (r0)+n0,r5
  452.     move    #d,r6
  453.     move    X:(r5+n5),n6
  454.     move    X:(r5+n5),n5
  455.     move    #c,r5
  456.     move    X:(r6+n6),y1    ; d
  457.     move    X:(r5+n5),y0    ; c
  458.  
  459.     move    B,n5
  460.     move    B,n6
  461.     move    #mask-1,r6
  462.     do    #3,_loop2
  463.     move    #bitm-1,r5
  464.     move    X:(r3),A
  465.     move    X:(r5+n5),x0
  466.     and    x0,A #$800000,x0
  467.     tst    A #0,A
  468.     teq    x0,A
  469.     move    A,A0
  470.     move    #divs,r5
  471.     move    X:(r6+n6),x0
  472.     move    X:(r3)+,B
  473.     and    x0,B X:(r5+n5),x1
  474.     move    B,x0
  475.     mac    x0,x1,A
  476.     move    A0,x1    ; fraction
  477.     move    y1,A    ; c*d
  478.     mac    y0,x1,A    ; c*fraction
  479.     asl    A
  480.     move    A,X:(r4)+n4
  481. _loop2
  482. _nope    move    #16,n0
  483.     move    (r4)+
  484.     move    (r0)+n0
  485. _loop1    rts
  486.  
  487. dequantize_right
  488.     move    #alloc,r0
  489.     move    #bit_alloc,r2
  490.     move    #sample,r3
  491.     move    #fraction,r4
  492.     move    Y:sblimit,x0
  493.     do    x0,_loop1
  494.     move    Y:(r2)+,A
  495.     tst    A
  496.     jeq    _nope
  497.  
  498.     move    A,n0
  499.     move    #>$008000,x0
  500.     move    X:(r0+n0),x1
  501.     mpy    x0,x1,A #>8,B
  502.     move    A1,A
  503.     tst    A A,n1
  504.     jne    _ok
  505.     clr    B x1,n1
  506.     nop
  507. _ok    move    X:(r1+n1),x0
  508.     add    x0,B
  509.  
  510.     move    #3*16*32,n5
  511.     lua    (r0)+n0,r5
  512.     move    #d,r6
  513.     move    X:(r5+n5),n6
  514.     move    X:(r5+n5),n5
  515.     move    #c,r5
  516.     move    X:(r6+n6),y1    ; d
  517.     move    X:(r5+n5),y0    ; c
  518.  
  519.     move    B,n5
  520.     move    B,n6
  521.     move    #mask-1,r6
  522.     do    #3,_loop2
  523.     move    #bitm-1,r5
  524.     move    Y:(r3),A
  525.     move    X:(r5+n5),x0
  526.     and    x0,A #$800000,x0
  527.     tst    A #0,A
  528.     teq    x0,A
  529.     move    A,A0
  530.     move    #divs,r5
  531.     move    X:(r6+n6),x0
  532.     move    Y:(r3)+,B
  533.     and    x0,B X:(r5+n5),x1
  534.     move    B,x0
  535.     mac    x0,x1,A
  536.     move    A0,x1    ; fraction
  537.     move    y1,A    ; c*d
  538.     mac    y0,x1,A    ; c*fraction
  539.     asl    A
  540.     move    A,Y:(r4)+n4
  541. _loop2
  542. _nope    move    #16,n0
  543.     move    (r4)+
  544.     move    (r0)+n0
  545. _loop1    rts
  546.  
  547. buffer_sample
  548.     jsr    <get_bits_init
  549.  
  550.     move    #bit_alloc,r0
  551.     move    #sample,r1
  552.     move    #3,n1
  553.     move    #alloc,r2
  554.     move    Y:jsbound,x0
  555.     do    x0,_loop1
  556.     move    X:(r0),A
  557.     tst    A
  558.     jeq    _not_right
  559.     jsr    _right
  560.     jmp    <_resume_right
  561. _not_right
  562.     clr    A
  563.     move    A,X:(r1)+
  564.     move    A,X:(r1)+
  565.     move    A,X:(r1)+
  566. _resume_right
  567.     move    (r1)-n1        ;;;
  568.  
  569.     move    Y:(r0)+,A
  570.     tst    A
  571.     jeq    _not_left
  572.     jsr    _left
  573.     jmp    <_resume_left
  574. _not_left
  575.     clr    A
  576.     move    A,Y:(r1)+
  577.     move    A,Y:(r1)+
  578.     move    A,Y:(r1)+
  579. _resume_left
  580.  
  581.     move    #16,n2
  582.     nop
  583.     move    (r2)+n2
  584. _loop1
  585.     move    Y:jsbound,x0
  586.     move    Y:sblimit,A
  587.     sub    x0,A
  588.     jeq    _nomono
  589.     do    A,_loop2
  590.     move    X:(r0)+,A
  591.     tst    A
  592.     jeq    _not_mono
  593.     jsr    _right
  594.     move    (r1)-n1        ;;;
  595.     move    X:(r1),x0
  596.     move    x0,Y:(r1)+
  597.     move    X:(r1),x0
  598.     move    x0,Y:(r1)+
  599.     move    X:(r1),x0
  600.     move    x0,Y:(r1)+
  601.     jmp    <_resume_mono
  602. _not_mono
  603.     clr    A
  604.     move    A,X:(r1)
  605.     move    A,Y:(r1)+
  606.     move    A,X:(r1)
  607.     move    A,Y:(r1)+
  608.     move    A,X:(r1)
  609.     move    A,Y:(r1)+
  610. _resume_mono
  611.  
  612.     move    #16,n2
  613.     nop
  614.     move    (r2)+n2
  615. _loop2
  616. _nomono    jsr    <get_bits_exit
  617.     rts
  618.  
  619. _right    move    A,n2
  620.     move    #32*16,n3
  621.     lua    (r2)+n2,r3
  622.     move    #>3,y0
  623.     move    (r3)+n3
  624.     move    X:(r3)+n3,x0
  625.     move    X:(r3)+n3,A
  626.     cmp    y0,A
  627.     jne    _right359
  628.     jsr    <get_bits
  629.     move    A,X:(r1)+
  630.     jsr    <get_bits
  631.     move    A,X:(r1)+
  632.     jsr    <get_bits
  633.     move    A,X:(r1)+
  634.     rts
  635. _right359
  636.     jsr    <get_bits
  637.     move    X:(r3+n3),y0    ; 1/nlevels
  638.     move    X:(r2+n2),y1    ; nlevels
  639.  
  640.     clr    A A,x1
  641.     mpy    x1,y0,B x1,A0
  642.     asl    A B,x1
  643.     mac    -y1,x1,A
  644.     move    A0,A
  645.     lsr    A
  646.     move    A,X:(r1)+
  647.  
  648.     clr    A
  649.     mpy    x1,y0,B x1,A0
  650.     asl    A B,x1
  651.     mac    -y1,x1,A
  652.     move    A0,A
  653.     lsr    A
  654.     move    A,X:(r1)+
  655.  
  656.     clr    A
  657.     mpy    x1,y0,B x1,A0
  658.     asl    A B,x1
  659.     mac    -y1,x1,A
  660.     move    A0,A
  661.     lsr    A
  662.     move    A,X:(r1)+
  663.     rts
  664.  
  665. _left    move    A,n2
  666.     move    #32*16,n3
  667.     lua    (r2)+n2,r3
  668.     move    #>3,y0
  669.     move    (r3)+n3
  670.     move    X:(r3)+n3,x0
  671.     move    X:(r3)+n3,A
  672.     cmp    y0,A
  673.     jne    _left359
  674.     jsr    <get_bits
  675.     move    A,Y:(r1)+
  676.     jsr    <get_bits
  677.     move    A,Y:(r1)+
  678.     jsr    <get_bits
  679.     move    A,Y:(r1)+
  680.     rts
  681. _left359
  682.     jsr    <get_bits
  683.     move    X:(r3+n3),y0    ; 1/nlevels
  684.     move    X:(r2+n2),y1    ; nlevels
  685.  
  686.     clr    A A,x1
  687.     mpy    x1,y0,B x1,A0
  688.     asl    A B,x1
  689.     mac    -y1,x1,A
  690.     move    A0,A
  691.     lsr    A
  692.     move    A,Y:(r1)+
  693.  
  694.     clr    A
  695.     mpy    x1,y0,B x1,A0
  696.     asl    A B,x1
  697.     mac    -y1,x1,A
  698.     move    A0,A
  699.     lsr    A
  700.     move    A,Y:(r1)+
  701.  
  702.     clr    A
  703.     mpy    x1,y0,B x1,A0
  704.     asl    A B,x1
  705.     mac    -y1,x1,A
  706.     move    A0,A
  707.     lsr    A
  708.     move    A,Y:(r1)+
  709.     rts
  710.  
  711. decode_bitalloc
  712.     jsr    <get_bits_init
  713.  
  714.     move    #16,n0
  715.     move    #alloc+1*32*16,r0
  716.     move    #bit_alloc,r1
  717.     move    Y:jsbound,y0
  718.     do    y0,_loop1
  719.     move    X:(r0)+n0,x0
  720.     jsr    <get_bits
  721.     move    A,X:(r1)
  722.     jsr    <get_bits
  723.     move    A,Y:(r1)+
  724. _loop1
  725.     move    Y:jsbound,y0
  726.     move    Y:sblimit,A
  727.     sub    y0,A
  728.     jeq    _loop2
  729.     do    A,_loop2
  730.     move    X:(r0)+n0,x0
  731.     jsr    <get_bits
  732.     move    A,X:(r1)
  733.     move    A,Y:(r1)+
  734. _loop2
  735.     jsr    <get_bits_exit
  736.     rts
  737.  
  738. decode_scale
  739.     jsr    <get_bits_init
  740.  
  741.     move    #>2,x0
  742.     move    #bit_alloc,r0
  743.     move    #scfsi,r1
  744.     move    Y:sblimit,y0
  745.     do    y0,_loop0
  746.     move    X:(r0),A
  747.     tst    A
  748.     jeq    _n1
  749.     jsr    <get_bits
  750.     move    A,X:(r1)
  751. _n1    move    Y:(r0)+,A
  752.     tst    A
  753.     jeq    _n2
  754.     jsr    <get_bits
  755.     move    A,Y:(r1)
  756. _n2    move    (r1)+
  757. _loop0
  758.     move    #32,n1
  759.     move    #3*32-1,m1
  760.     move    #bit_alloc,r0
  761.     move    #scale_index,r1
  762.     move    #scfsi,r2
  763.     move    Y:sblimit,y0
  764.     do    y0,_loop1
  765.  
  766.     move    X:(r0),A    ; Right
  767.     tst    A
  768.     jeq    <_not_right
  769.     move    X:(r2),A    ; Right
  770.     tst    A #>1,x0
  771.     jeq    _r0
  772.     cmp    x0,A #>2,x0
  773.     jeq    _r1
  774.     cmp    x0,A #>3,x0
  775.     jeq    _r2
  776.     cmp    x0,A
  777.     jeq    _r3
  778.     jmp    <_right
  779. _r0    move    #>6,x0
  780.     jsr    <get_bits
  781.     move    A,X:(r1)+n1    ; Right
  782.     jsr    <get_bits
  783.     move    A,X:(r1)+n1    ; Right
  784.     jsr    <get_bits
  785.     move    A,X:(r1)+n1    ; Right
  786.     jmp    <_right
  787. _r1    move    #>6,x0
  788.     jsr    <get_bits
  789.     move    A,X:(r1)+n1    ; Right
  790.     move    A,X:(r1)+n1    ; Right
  791.     jsr    <get_bits
  792.     move    A,X:(r1)+n1    ; Right
  793.     jmp    <_right
  794. _r3    move    #>6,x0
  795.     jsr    <get_bits
  796.     move    A,X:(r1)+n1    ; Right
  797.     jsr    <get_bits
  798.     move    A,X:(r1)+n1    ; Right
  799.     move    A,X:(r1)+n1    ; Right
  800.     jmp    <_right
  801. _r2    move    #>6,x0
  802.     jsr    <get_bits
  803.     move    A,X:(r1)+n1    ; Right
  804.     move    A,X:(r1)+n1    ; Right
  805.     move    A,X:(r1)+n1    ; Right
  806.     jmp    <_right
  807. _not_right
  808.     move    #>SCALE_RANGE-1,A
  809.     move    A,X:(r1)+n1    ; Right
  810.     move    A,X:(r1)+n1    ; Right
  811.     move    A,X:(r1)+n1    ; Right
  812. _right
  813.     move    Y:(r0),A    ; Left
  814.     tst    A
  815.     jeq    <_not_left
  816.     move    Y:(r2),A    ; Left
  817.     tst    A #>1,x0
  818.     jeq    _l0
  819.     cmp    x0,A #>2,x0
  820.     jeq    _l1
  821.     cmp    x0,A #>3,x0
  822.     jeq    _l2
  823.     cmp    x0,A
  824.     jeq    _l3
  825.     jmp    <_left
  826. _l0    move    #>6,x0
  827.     jsr    <get_bits
  828.     move    A,Y:(r1)+n1    ; Left
  829.     jsr    <get_bits
  830.     move    A,Y:(r1)+n1    ; Left
  831.     jsr    <get_bits
  832.     move    A,Y:(r1)+n1    ; Left
  833.     jmp    <_left
  834. _l1    move    #>6,x0
  835.     jsr    <get_bits
  836.     move    A,Y:(r1)+n1    ; Left
  837.     move    A,Y:(r1)+n1    ; Left
  838.     jsr    <get_bits
  839.     move    A,Y:(r1)+n1    ; Left
  840.     jmp    <_left
  841. _l3    move    #>6,x0
  842.     jsr    <get_bits
  843.     move    A,Y:(r1)+n1    ; Left
  844.     jsr    <get_bits
  845.     move    A,Y:(r1)+n1    ; Left
  846.     move    A,Y:(r1)+n1    ; Left
  847.     jmp    <_left
  848. _l2    move    #>6,x0
  849.     jsr    <get_bits
  850.     move    A,Y:(r1)+n1    ; Left
  851.     move    A,Y:(r1)+n1    ; Left
  852.     move    A,Y:(r1)+n1    ; Left
  853.     jmp    <_left
  854. _not_left
  855.     move    #>SCALE_RANGE-1,A
  856.     move    A,Y:(r1)+n1    ; Left
  857.     move    A,Y:(r1)+n1    ; Left
  858.     move    A,Y:(r1)+n1    ; Left
  859. _left
  860.     move    (r0)+
  861.     move    (r1)+
  862.     move    (r2)+
  863. _loop1
  864.     move    #-1,m1
  865.     jsr    <get_bits_exit
  866.     rts
  867.  
  868. zero_buffers    clr    A #buffer1,r0
  869.     do    #BUFFER_SIZE,_zero
  870.     move    A,Y:(r0)+
  871.     move    A,Y:(r0)+
  872. _zero    rts
  873.  
  874. pause    jsr    zero_buffers
  875.     jset    #3,X:$ffe9,*
  876.     rts
  877.  
  878. fast_forward    jsset    #3,X:$ffe9,zero_buffers
  879.     bset    #0,Y:fast_forwarding
  880.     do    #20,_skip
  881.     jsr    read_frame
  882.     nop
  883. _skip    bclr    #0,Y:fast_forwarding
  884.     rts
  885.  
  886. read_frame    move    Y:fast_forwarding,x0
  887.     jset    #0,x0,_nope
  888.     jsset    #4,X:$ffe9,fast_forward
  889. _nope
  890.     move    Y:frame_okay,A
  891.     tst    A
  892.     jne    _again
  893.  
  894.     jsr    read_header
  895. _again    jsr    parse_header
  896.  
  897.     clr    A #frame,r0
  898.     jsr    DMA_r_x0
  899. ;_wait_5    jclr    #0,X:<<M_HSR,_wait_5
  900. ;    movep    X:<<M_HRX,x0
  901.     move    x0,y0
  902.     jsr    DMA_r_x0
  903.     move    x0,x1
  904.     jsr    DMA_r_x0
  905.     move    x0,A0
  906.     move    y0,x0
  907. ;_wait_6    jclr    #0,X:<<M_HSR,_wait_6
  908. ;    movep    X:<<M_HRX,x1
  909. ;_wait_7    jclr    #0,X:<<M_HSR,_wait_7
  910. ;    movep    X:<<M_HRX,A0
  911.     move    #>$008000,y0
  912.     mac    x0,y0,A #>$000080,y0
  913.     mac    x1,y0,A
  914.     move    A0,X:(r0)+
  915.  
  916.     move    #>$000080,y0
  917.     do    y1,_read
  918.     clr    A A0,x0
  919.     move    x0,y1
  920.     jsr    DMA_r_x0
  921.     move    x0,A0
  922.     move    y1,x0
  923. ;_wait    jclr    #0,X:<<M_HSR,_wait
  924. ;    movep    X:<<M_HRX,A0
  925.     mac    x0,y0,A
  926.     move    A0,X:(r0)+
  927. _read
  928.     ; Round off
  929.     do    #8,_s1
  930.     asl    A
  931. _s1    move    A0,X:(r0)+
  932.     do    #8,_s2
  933.     asl    A
  934. _s2    move    A0,X:(r0)+
  935.     ; Initialize pointers
  936.     move    #getbit_cntl,r5
  937.     move    #frame,r6
  938.     move    r5,Y:getbit_cntlp
  939.     move    r6,Y:getbit_framep
  940.  
  941.     jsr    read_header
  942.     rts
  943. get_bits_init
  944.     move    #getbit_mask,r4
  945.     move    Y:getbit_cntlp,r5
  946.     move    Y:getbit_framep,r6
  947.     rts
  948. get_bits_exit
  949.     move    r5,Y:getbit_cntlp
  950.     move    r6,Y:getbit_framep
  951.     move    #-1,m5
  952.     rts
  953.  
  954. read_header    move    #>1,x0
  955.     move    x0,Y:frame_okay
  956.  
  957.     ; read 32 bit header (12+20)
  958.     jsr    DMA_r_x0
  959.     move    x0,B
  960.     jsr    DMA_r_x0
  961. _again    move    x0,x1
  962.     jsr    DMA_r_x0
  963.     move    x0,y1
  964.     jsr    DMA_r_x0
  965.     move    x0,y0
  966.     move    y1,x0
  967. ;_wait_1    jclr    #0,X:<<M_HSR,_wait_1
  968. ;    movep    X:<<M_HRX,x0
  969. ;_wait_2    jclr    #0,X:<<M_HSR,_wait_2
  970. ;    movep    X:<<M_HRX,x1
  971. ;_wait_3    jclr    #0,X:<<M_HSR,_wait_3
  972. ;    movep    X:<<M_HRX,x0
  973. ;_wait_4    jclr    #0,X:<<M_HSR,_wait_4
  974. ;    movep    X:<<M_HRX,y0
  975.  
  976. ;    jclr    #1,X:<<M_HSR,*    ;;;;
  977. ;    movep    B,X:<<M_HTX        ;;;;
  978. ;    jclr    #1,X:<<M_HSR,*    ;;;;
  979. ;    movep    x1,X:<<M_HTX        ;;;;
  980. ;    jclr    #1,X:<<M_HSR,*    ;;;;
  981. ;    movep    x0,X:<<M_HTX        ;;;;
  982. ;    jclr    #1,X:<<M_HSR,*    ;;;;
  983. ;    movep    y0,X:<<M_HTX        ;;;;
  984.  
  985.     move    #>$ff,A
  986.     cmp    A,B #>$f0,A
  987.     jne    _sync_lost
  988.     and    x1,A A,B
  989.     cmp    A,B
  990.     jne    _sync_lost
  991.  
  992.     move    x1,Y:frame_x1
  993.     move    x0,Y:frame_x0
  994.     move    y0,Y:frame_y0
  995.  
  996.     move    Y:frame_okay,A
  997.     rts
  998. _sync_lost    jsr    zero_buffers
  999.  
  1000.     move    #>-1,x0
  1001.     move    x0,Y:frame_okay
  1002. _sync_detection
  1003. _get_ff    jsr    DMA_r_x0
  1004.     move    #>$ff,y0
  1005.     move    x0,A
  1006.     and    y0,A #>$42,y0
  1007.     cmp    y0,A #>$ff,y0
  1008.     jeq    _stop
  1009.     cmp    y0,A
  1010.     jne    _get_ff
  1011.  
  1012.     move    #>$f0,y0
  1013. _get_f0    jsr    DMA_r_x0
  1014.     move    x0,A
  1015.     and    y0,A
  1016.     cmp    y0,A
  1017.     jne    _sync_detection
  1018.  
  1019.     move    #>$ff,B
  1020.     jmp    <_again
  1021.  
  1022. _stop    do    #8,_wait_some
  1023.     jsr    DMA_r_x0
  1024.     move    #>$ff,y0
  1025.     move    x0,A
  1026.     and    y0,A #>$42,y0
  1027.     cmp    y0,A
  1028.     jne    _nope
  1029. _wait_some    jmp    _wait_some
  1030. _nope    enddo
  1031.     jmp    _sync_detection
  1032.  
  1033. parse_header    move    Y:frame_x1,x1
  1034.     move    Y:frame_x0,x0
  1035.     move    Y:frame_y0,y0
  1036.  
  1037. ;    jclr    #1,X:<<M_HSR,*    ;;;;
  1038. ;    movep    x1,X:<<M_HTX        ;;;;
  1039. ;    jclr    #1,X:<<M_HSR,*    ;;;;
  1040. ;    movep    x0,X:<<M_HTX        ;;;;
  1041. ;    jclr    #1,X:<<M_HSR,*    ;;;;
  1042. ;    movep    y0,X:<<M_HTX        ;;;;
  1043.  
  1044.     move    y0,A
  1045.     lsr    A
  1046.     lsr    A
  1047.     lsr    A
  1048.     lsr    A
  1049.     lsr    A
  1050.     lsr    A #>%11,x1
  1051.     and    x1,A #>2,x1
  1052.     move    #sblimits_stereo,r0
  1053.     move    #>MPG_MD_MONO,B
  1054.     cmp    A,B A,Y:mode
  1055.     jne    _no_mono
  1056.     move    #>1,x1
  1057.     move    #sblimits_mono,r0
  1058. _no_mono    move    x1,Y:stereo
  1059.  
  1060.     move    x0,A
  1061.     lsr    A
  1062.     lsr    A
  1063.     lsr    A
  1064.     lsr    A #>%001111,x1
  1065.     and    x1,A x0,B
  1066.     lsl    B
  1067.     lsl    B #>%110000,x1
  1068.     and    x1,B A,x1
  1069.     or    x1,B
  1070.     move    B,n0
  1071.     nop
  1072.     move    Y:(r0+n0),x1
  1073.     move    #frame_sizes,r0
  1074.     move    x1,Y:sblimit
  1075.     move    x1,Y:jsbound
  1076.     move    #>1,x1
  1077.     move    Y:(r0+n0),A
  1078.     jclr    #INFO_PADDING,x0,_no_padding
  1079.     add    x1,A
  1080. _no_padding    move    #>4+3,x1
  1081.  
  1082.     move    Y:frame_x1,x0
  1083.     jset    #0,x0,_no_crc
  1084.     jsr    DMA_r_x0
  1085.     jsr    DMA_r_x0
  1086. ;    jsr    DMA_r_x0
  1087. ;    jsr    DMA_r_x0
  1088.     move    #>2+4+3,x1
  1089. _no_crc
  1090.     sub    x1,A
  1091.     move    A,y1
  1092.  
  1093.     move    Y:mode,x1
  1094.     move    #>MPG_MD_JOINT_STEREO,B
  1095.     cmp    x1,B
  1096.     jne    _no_joint
  1097.     move    y0,A
  1098.     lsr    A
  1099.     lsr    A #>%1100,x1
  1100.     and    x1,A #>4,x1
  1101.     add    x1,A
  1102.     move    A,Y:jsbound
  1103. _no_joint    rts
  1104.  
  1105. ; DMA handshake and Host DSP/030 I/O routines.
  1106. Host_get    jclr    #0,X:<<M_HSR,*
  1107.     movep    X:<<M_HRX,x0
  1108.     rts
  1109. Host_send    jclr    #1,X:<<M_HSR,*
  1110.     movep    x0,X:<<M_HTX
  1111.     rts
  1112. DMA_send    bset    #5,x:<<M_PCD    ; start frame sync
  1113.     movep    x0,x:<<M_TX
  1114.     jclr    #6,x:<<M_SR,*
  1115.     bclr    #5,x:<<M_PCD    ; stop frame sync
  1116.     rts
  1117.  
  1118. DMA_r_x0    move    A,L:save_A
  1119.     move    x1,X:save_x
  1120.     move    Y:frame_got_byte,x1
  1121.     jset    #0,x1,_ok
  1122.  
  1123.     move    #>1,x0
  1124.     move    x0,Y:frame_got_byte
  1125.     jsr    _read
  1126.     move    x0,Y:frame_the_byte
  1127.     move    #>$008000,x1
  1128.     mpy    x0,x1,A
  1129.     move    A1,x0
  1130.     
  1131.     move    Y:frame_the_byte,x1
  1132.     move    #>$ff,A
  1133.     and    x1,A
  1134.     move    A1,Y:frame_the_byte
  1135.  
  1136.     move    X:save_x,x1
  1137.     move    L:save_A,A
  1138.     rts
  1139. _ok    move    #0,x0
  1140.     move    x0,Y:frame_got_byte
  1141.     move    Y:frame_the_byte,x0
  1142.     move    X:save_x,x1
  1143.     move    L:save_A,A
  1144.     rts
  1145.  
  1146. _read
  1147.  
  1148.     bset    #4,X:<<M_PCD    ; start frame sync
  1149.     jclr    #7,X:<<M_SR,*    ; RDF
  1150.     bclr    #4,X:<<M_PCD    ; stop frame sync
  1151.     movep    X:<<M_RX,A
  1152.     lsr    A
  1153.     lsr    A Y:<state,x0
  1154.     or    x0,A #>$010000,x1
  1155.     lsr    A
  1156.     move    A1,x0
  1157.     mpy    x0,x1,A #>$ffff,x0
  1158.     and    x0,A A0,Y:<state
  1159.     move    A1,x0
  1160.     rts
  1161.  
  1162. init_tables    move    #filter,r0
  1163.     do    #64*32,_filter
  1164. _f_wait    jclr    #0,X:<<M_HSR,_f_wait
  1165.     movep    X:<<M_HRX,X:(r0)+
  1166. _filter
  1167.     move    #window,r0
  1168.     do    #32*16,_window
  1169. _w_wait    jclr    #0,X:<<M_HSR,_w_wait
  1170.     movep    X:<<M_HRX,X:(r0)+
  1171. _window
  1172.     move    #alloc,r0
  1173.     do    #2048+16*32,_alloc
  1174. _a_wait    jclr    #0,X:<<M_HSR,_a_wait
  1175.     movep    X:<<M_HRX,X:(r0)+
  1176. _alloc
  1177.     move    #multiple,r0
  1178.     do    #64,_multiple
  1179. _m_wait    jclr    #0,X:<<M_HSR,_m_wait
  1180.     movep    X:<<M_HRX,X:(r0)+
  1181. _multiple
  1182.     move    #c,r0
  1183.     do    #17,_c
  1184. _c_wait    jclr    #0,X:<<M_HSR,_c_wait
  1185.     movep    X:<<M_HRX,X:(r0)+
  1186. _c
  1187.     move    #d,r0
  1188.     do    #17,_d
  1189. _d_wait    jclr    #0,X:<<M_HSR,_d_wait
  1190.     movep    X:<<M_HRX,X:(r0)+
  1191. _d
  1192.     move    #msb,r0
  1193.     do    #256,_msb
  1194. _s_wait    jclr    #0,X:<<M_HSR,_s_wait
  1195.     movep    X:<<M_HRX,X:(r0)+
  1196. _msb
  1197.     move      #buf,r0
  1198.     clr    A #buf,r4
  1199.     rep    #2*HAN_SIZE
  1200.     move    A,X:(r0)+ A,Y:(r4)+
  1201.  
  1202.     clr    A #buffer1,r0
  1203.     rep    #BUFFER_SIZE
  1204.     move    A,Y:(r0)+
  1205.     rep    #BUFFER_SIZE
  1206.     move    A,Y:(r0)+
  1207.     rts
  1208.  
  1209.     end
  1210.