home *** CD-ROM | disk | FTP | other *** search
/ No Fragments Archive 4: The Falcon Archive / nf_archive_four_v1.0.iso / ARCHIVE / WORK / MSX / mp204a.ZIP / MP2AD / MP2.ASM < prev    next >
Assembly Source File  |  1996-04-21  |  17KB  |  953 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. BUFFER_SIZE    equ    2304   ; 2534
  22.  
  23.     include    "equates.asm"
  24.  
  25. HAN_SIZE    equ    512
  26. SCALE_RANGE    equ    64
  27. INFO_PADDING    equ    9-8
  28.  
  29.     org    L:$0
  30. fraction    ds    3*32
  31. bit_alloc    ds    32
  32. sample        ds    3*32
  33. scfsi        ds    32
  34.  
  35.     org    L:$800
  36. buf        ds    2*HAN_SIZE
  37. scale_index    ds    3*32
  38.  
  39.     org    X:$2000
  40. msb        ds    256    ; allign
  41. window        ds    32*16
  42. filter        ds    64*32
  43. multiple    ds    64
  44. fc        dc    0.9090909090,0.0909090909
  45.         dc    0.8181818181,0.1818181818
  46.         dc    0.7272727272,0.2727272727
  47.         dc    0.6363636363,0.3636363636
  48.         dc    0.5454545454,0.4545454545
  49.         dc    0.4545454545,0.5454545454
  50.         dc    0.3636363636,0.6363636363
  51.         dc    0.2727272727,0.7272727272
  52.         dc    0.1818181818,0.8181818181
  53.         dc    0.0909090909,0.9090909090
  54. c        ds    17
  55. d        ds    17
  56. alloc        ds    4*16*32+16*32
  57. mask        dc    $000000,$000001,$000003,$000007
  58.         dc    $00000f,$00001f,$00003f,$00007f
  59.         dc    $0000ff,$0001ff,$0003ff,$0007ff
  60.         dc    $000fff,$001fff,$003fff,$007fff
  61. divs        dc    $7fffff,$400000,$200000,$100000
  62.         dc    $080000,$040000,$020000,$010000
  63.         dc    $008000,$004000,$002000,$001000
  64.         dc    $000800,$000400,$000200,$000100
  65. bitm        dc    $000001,$00002,$000004,$000008
  66.         dc    $000010,$00020,$000040,$000080
  67.         dc    $000100,$00200,$000400,$000800
  68.         dc    $001000,$02000,$004000,$008000
  69. frame        ds    512
  70.  
  71.     org    Y:$2000
  72. buffer1        ds    BUFFER_SIZE
  73. buffer2        ds    BUFFER_SIZE
  74. buffer0        ds    2304
  75. logic        ds    1
  76. tmp_r6        ds    1
  77.  
  78. bufp        dc    buf+64
  79. sblimit        ds    1
  80. jsbound        ds    1
  81.  
  82.     org    X:$3f00
  83. getbit_cntl    dc    0,0,0,0,0,0,0,0
  84.         dc    1,1,1,1,1,1,1,1
  85.         dc    2,2,2,2,2,2,2,2
  86. getbit_mask    dc    $000000,$000001,$000003,$000007
  87.         dc    $00000f,$00001f,$00003f,$00007f
  88.         dc    $0000ff,$0001ff,$0003ff,$0007ff
  89.         dc    $000fff,$001fff,$003fff,$007fff
  90.  
  91.     org    Y:$3f00
  92.         dc    $000001,$000002,$000004,$000008
  93.         dc    $000010,$000020,$000040,$000080
  94.         ds    16
  95.         dc    $000000,$000001,$000002,$000004
  96.         dc    $000008,$000010,$000020,$000040
  97.         dc    $000080,$000100,$000200,$000400
  98.         dc    $000800,$001000,$002000,$004000
  99. getbit_cntlp    ds    1
  100. getbit_framep    ds    1
  101.  
  102.     org    P:$0
  103.     jmp    <start
  104.  
  105.     org p:$000c
  106.     nop
  107.  
  108.     org    P:$10
  109.     movep    Y:(r7)+,X:<<M_TX
  110.  
  111.     org    P:$40
  112. start    jsr    <init_tables
  113.  
  114.     move    #buffer1,r7
  115.     move    #2*BUFFER_SIZE-1,m7
  116.  
  117. ;    andi    #$fb,omr    ; initialize SSI port
  118. ;    movep    X:<<M_HRX,x0    ; clear host port
  119. ;    movep    #%000000000,x:<<M_PCC ; SSI reset
  120. ;    movep    #%0100000000000000,x:<<M_CRA
  121. ;    movep    #%0011010000000000,x:<<M_CRB
  122. ;    movep    #%111001000,x:<<M_PCC ; port C control register
  123. ;    movep    #%000110000,x:<<M_PCDDR
  124. ;    movep    #%000000000,x:<<M_PCD ; clear frame syncs
  125.  
  126. ;    movep    #%0000000000000000,x:<<M_PCD
  127. ;    movep    #%0000000101100000,x:<<M_PCDDR
  128. ;    movep    #%0100000000000000,x:<<M_CRA
  129. ;    movep    #%0001011000010000,x:<<M_CRB
  130. ;    movep    #%0000000101000000,x:<<M_PCC
  131.  
  132.     movec    #<0,SP
  133.     movep    #$0,X:<<M_BCR
  134.     movep    #$1,X:<<M_PBC
  135.     movep    #$0000,X:<<M_PCC
  136.     movep    #$01F8,X:<<M_PCC
  137.     movep    #$4100,X:<<M_CRA
  138.     movep    #$F800,X:<<M_CRB
  139. ;    movep    #$9800,X:<<M_CRB
  140.     btst    #4,X:<<M_SR
  141.     movep    #$3000,X:<<M_IPR
  142.     andi    #<$FC,MR
  143.  
  144.     move    #>$424344,x0
  145.     jsr    <Host_send
  146. ;    jsr    <Host_get    ; Get sync
  147.  
  148. main    move    #>buffer1,x0
  149.     move    #>buffer1+32,y0
  150. _wait1    move    r7,A
  151.     cmp    x0,A
  152.     jlt    _wait1
  153.     cmp    y0,A
  154.     jgt    _wait1
  155. ;    move    #>buffer0,x0    ;;;
  156.     move    #>buffer2,x0    ;;
  157.     move    x0,Y:logic
  158.     jsr    <_replay
  159. ;    move    #buffer2,r0    ;;;
  160. ;    jsr    <convert    ;;;
  161.  
  162.     move    #>buffer2,x0
  163.     move    #>buffer2+32,y0
  164. _wait2    move    r7,A
  165.     cmp    x0,A
  166.     jlt    _wait2
  167.     cmp    y0,A
  168.     jgt    _wait2
  169. ;    move    #>buffer0,x0    ;;;
  170.     move    #>buffer1,x0    ;;
  171.     move    x0,Y:logic
  172.     jsr    <_replay
  173. ;    move    #buffer1,r0    ;;;
  174. ;    jsr    <convert    ;;;
  175.     jmp    <main
  176.  
  177. _replay    move    #>$314159,x0
  178.     jsr    <Host_send
  179.  
  180.     jsr    <read_frame
  181.     jsr    <decode_bitalloc
  182.     jsr    <decode_scale
  183.  
  184.     do    #4,_l1
  185.     jsr    <buffer_sample
  186.     jsr    <dequantize_sample
  187.     move    #scale_index+0*32,r0
  188.     jsr    <denormalize_sample
  189.     jsr    <SubBandSynthesis
  190.     nop
  191. _l1    do    #4,_l2
  192.     jsr    <buffer_sample
  193.     jsr    <dequantize_sample
  194.     move    #scale_index+1*32,r0
  195.     jsr    <denormalize_sample
  196.     jsr    <SubBandSynthesis
  197.     nop
  198. _l2    do    #4,_l3
  199.     jsr    <buffer_sample
  200.     jsr    <dequantize_sample
  201.     move    #scale_index+2*32,r0
  202.     jsr    <denormalize_sample
  203.     jsr    <SubBandSynthesis
  204.     nop
  205. _l3    rts
  206.  
  207. convert    move    #buffer0,r2
  208.     move    #fc,r1
  209.     move    Y:(r2)+,y0
  210.     move    Y:(r2)+,y1
  211.     do    #115,_loop1
  212.     move    y0,Y:(r0)+
  213.     move    y1,Y:(r0)+
  214.     do    #10,_loop2
  215.     move    X:(r1)+,x0
  216.     move    X:(r1)+,x1
  217.     mpy    y0,x0,A Y:(r2)+,y0
  218.     mpy    y1,x0,B Y:(r2)+,y1
  219.     macr    y0,x1,A
  220.     macr    y1,x1,B A,Y:(r0)+
  221.     move            B,Y:(r0)+
  222. _loop2    move    #fc,r1
  223. _loop1
  224.     move    y0,Y:(r0)+
  225.     move    y1,Y:(r0)+
  226.     move    X:(r1)+,x0
  227.     move    X:(r1)+,x1
  228.     mpy    y0,x0,A Y:(r2)+,y0
  229.     mpy    y1,x0,B Y:(r2)+,y1
  230.     macr    y0,x1,A
  231.     macr    y1,x1,B
  232.     move    A,Y:(r0)+
  233.     move    B,Y:(r0)+
  234.     rts
  235.  
  236. get_bits
  237.     move    #-1,m5
  238.     move    x0,n5
  239.     move    x0,n4
  240.     move    X:(r5+n5),n6
  241.     move    x0,A
  242.     move    #>$7,y1
  243.     and    y1,A
  244.     move    A1,n5
  245.     move    Y:(r5),y1
  246.     move    X:(r6)+n6,A
  247.     lsr    A
  248.     move    A1,x1
  249.     mpy    x1,y1,A Y:(r4+n4),y1
  250.     move    #8-1,m5
  251.     move    A0,x1
  252.     mpy    x1,y1,A    X:(r4+n4),x1
  253.     and    x1,A (r5)+n5
  254.     move    A1,A
  255.     rts
  256.  
  257. denormalize_sample
  258.     ori    #%00001000,mr
  259.     move    #multiple,r1
  260.     move    #multiple,r2
  261.     move    #fraction,r3
  262.     move    #fraction,r4
  263.     move    #32,n3
  264.     move    #32,n4
  265.     move    #96-1,m3
  266.     move    #96-1,m4
  267.     move    Y:sblimit,x0
  268.     do    x0,_multiply
  269.     move    X:(r0),n1
  270.     move    Y:(r0)+,n2
  271.     move    X:(r1+n1),x0
  272.     move    X:(r2+n2),y0
  273.  
  274.     move    X:(r3)+n3,x1 Y:(r4),y1
  275.     mpyr    x0,x1,A X:(r3),x1
  276.     mpyr    y0,y1,B A,X:(r4)
  277.     move    B,Y:(r4)+n4
  278.     mpyr    x0,x1,A Y:(r4),y1
  279.     mpyr    y0,y1,B A,X:(r3)+n3
  280.     move    X:(r3),x1 B,Y:(r4)+n4
  281.     mpyr    x0,x1,A Y:(r4),y1
  282.     mpyr    y0,y1,B A,X:(r3)+n3
  283.     move    B,Y:(r4)+n4
  284. ;
  285. ;    do    #3,_loop
  286. ;    move    X:(r3),x1 Y:(r4),y1
  287. ;    mpyr    x0,x1,A
  288. ;    mpyr    y0,y1,B
  289. ;    move    A,X:(r3)+n3
  290. ;    move    B,Y:(r4)+n4
  291. ;_loop
  292.     move    (r3)+
  293.     move    (r4)+
  294. _multiply
  295.     move    #-1,m3
  296.     move    #-1,m4
  297.     andi    #%11110011,mr
  298.     rts
  299.  
  300. SubBandSynthesis
  301.     move    #64,n0
  302.     move    #32,n6
  303.     move    #$3ff,m0
  304.     move    Y:bufp,r0
  305.     move    #fraction,r6
  306.     do    #3,_loop
  307.     move    (r0)-n0
  308.  
  309.     move    r0,r1
  310.     move    r0,r5
  311.     move    #filter,r4
  312.     do    #64,_f1
  313.     move    r6,r2
  314.     move    X:(r4)+,x1
  315.     move    X:(r2),x0
  316.     move    Y:(r2)+,y0
  317.     mpy    x1,x0,A X:(r2),x0
  318.     mpy    x1,y0,B X:(r4)+,x1 Y:(r2)+,y0
  319.     do    #32-2,_f2
  320.     mac    x1,x0,A X:(r2),x0
  321.     mac    x1,y0,B X:(r4)+,x1 Y:(r2)+,y0
  322. _f2    macr    x1,x0,A
  323.     macr    x1,y0,B
  324.     move    A,X:(r1)+ B,Y:(r5)+
  325. _f1
  326.     ori    #%00001000,mr
  327.     move    #window,r2
  328.     move    #$3ff,m1
  329.     move    #$3ff,m3
  330.     move    #$3ff,m4
  331.     move    #$3ff,m5
  332.     move    #96,n3
  333.     move    r0,r3
  334.     move    r0,r1
  335.     move    (r3)+n3
  336.     move    #128,n4
  337.     move    #128,n5
  338.     move    r6,Y:tmp_r6
  339.     move    Y:logic,r6
  340.      do    #32,_w1
  341.      move    r1,r4
  342.      move    r3,r5
  343.      move    X:(r4),y0
  344.     move    X:(r2)+,x1 Y:(r4)+n4,y1
  345.     mpy    x1,y0,A X:(r5),y0
  346.     mpy    x1,y1,B X:(r2)+,x1 Y:(r5)+n5,y1
  347.     do    #(16-2)/2,_w2
  348.     mac    x1,y0,A X:(r4),y0
  349.     mac    x1,y1,B X:(r2)+,x1 Y:(r4)+n4,y1
  350.     mac    x1,y0,A X:(r5),y0
  351.     mac    x1,y1,B X:(r2)+,x1 Y:(r5)+n5,y1
  352. _w2     mac    x1,y0,A (r1)+
  353.     mac    x1,y1,B (r3)+
  354.     move    A,Y:(r6)+
  355.     move    B,Y:(r6)+
  356.  
  357. _w1    move    r6,Y:logic
  358.     move    Y:tmp_r6,r6
  359.     move    #-1,m1
  360.     move    #-1,m3
  361.     andi    #%11110011,mr
  362.     move    #-1,m4
  363.     move    #-1,m5
  364.     move    (r6)+n6
  365.  
  366. _loop    move    #-1,m0
  367.     move    r0,Y:bufp
  368.     rts
  369.  
  370. dequantize_sample
  371.     ; Clear fraction
  372.     move      #fraction,r0
  373.     clr    A #fraction,r4
  374.     do    #3*32,_clear
  375.     move    A,X:(r0)+ A,Y:(r4)+
  376. _clear
  377.     move    #$ff,m1
  378.     move    #96-1,m4
  379.     move    #32,n4
  380.     move    #msb,r1
  381.  
  382.     jsr    <dequantize_left
  383.     jsr    <dequantize_right
  384.  
  385.     move    #-1,m1
  386.     move    #-1,m4
  387.     rts
  388.  
  389. dequantize_left
  390.     move    #alloc,r0
  391.     move    #bit_alloc,r2
  392.     move    #sample,r3
  393.     move    #fraction,r4
  394.     move    Y:sblimit,x0
  395.     do    x0,_loop1
  396.     move    X:(r2)+,A
  397.     tst    A
  398.     jeq    _nope
  399.  
  400.     move    A,n0
  401.     move    #>$008000,x0
  402.     move    X:(r0+n0),x1
  403.     mpy    x0,x1,A #>8,B
  404.     move    A1,A
  405.     tst    A A,n1
  406.     jne    _ok
  407.     clr    B x1,n1
  408.     nop
  409. _ok    move    X:(r1+n1),x0
  410.     add    x0,B
  411.  
  412.     move    #3*16*32,n5
  413.     lua    (r0)+n0,r5
  414.     move    #d,r6
  415.     move    X:(r5+n5),n6
  416.     move    X:(r5+n5),n5
  417.     move    #c,r5
  418.     move    X:(r6+n6),y1    ; d
  419.     move    X:(r5+n5),y0    ; c
  420.  
  421.     move    B,n5
  422.     move    B,n6
  423.     move    #mask-1,r6
  424.     do    #3,_loop2
  425.     move    #bitm-1,r5
  426.     move    X:(r3),A
  427.     move    X:(r5+n5),x0
  428.     and    x0,A #$800000,x0
  429.     tst    A #0,A
  430.     teq    x0,A
  431.     move    A,A0
  432.     move    #divs,r5
  433.     move    X:(r6+n6),x0
  434.     move    X:(r3)+,B
  435.     and    x0,B X:(r5+n5),x1
  436.     move    B,x0
  437.     mac    x0,x1,A
  438.     move    A0,x1    ; fraction
  439.     move    y1,A    ; c*d
  440.     mac    y0,x1,A    ; c*fraction
  441.     asl    A
  442.     move    A,X:(r4)+n4
  443. _loop2
  444. _nope    move    #16,n0
  445.     move    (r4)+
  446.     move    (r0)+n0
  447. _loop1    rts
  448.  
  449. dequantize_right
  450.     move    #alloc,r0
  451.     move    #bit_alloc,r2
  452.     move    #sample,r3
  453.     move    #fraction,r4
  454.     move    Y:sblimit,x0
  455.     do    x0,_loop1
  456.     move    Y:(r2)+,A
  457.     tst    A
  458.     jeq    _nope
  459.  
  460.     move    A,n0
  461.     move    #>$008000,x0
  462.     move    X:(r0+n0),x1
  463.     mpy    x0,x1,A #>8,B
  464.     move    A1,A
  465.     tst    A A,n1
  466.     jne    _ok
  467.     clr    B x1,n1
  468.     nop
  469. _ok    move    X:(r1+n1),x0
  470.     add    x0,B
  471.  
  472.     move    #3*16*32,n5
  473.     lua    (r0)+n0,r5
  474.     move    #d,r6
  475.     move    X:(r5+n5),n6
  476.     move    X:(r5+n5),n5
  477.     move    #c,r5
  478.     move    X:(r6+n6),y1    ; d
  479.     move    X:(r5+n5),y0    ; c
  480.  
  481.     move    B,n5
  482.     move    B,n6
  483.     move    #mask-1,r6
  484.     do    #3,_loop2
  485.     move    #bitm-1,r5
  486.     move    Y:(r3),A
  487.     move    X:(r5+n5),x0
  488.     and    x0,A #$800000,x0
  489.     tst    A #0,A
  490.     teq    x0,A
  491.     move    A,A0
  492.     move    #divs,r5
  493.     move    X:(r6+n6),x0
  494.     move    Y:(r3)+,B
  495.     and    x0,B X:(r5+n5),x1
  496.     move    B,x0
  497.     mac    x0,x1,A
  498.     move    A0,x1    ; fraction
  499.     move    y1,A    ; c*d
  500.     mac    y0,x1,A    ; c*fraction
  501.     asl    A
  502.     move    A,Y:(r4)+n4
  503. _loop2
  504. _nope    move    #16,n0
  505.     move    (r4)+
  506.     move    (r0)+n0
  507. _loop1    rts
  508.  
  509. buffer_sample
  510.     jsr    <get_bits_init
  511.  
  512.     move    #bit_alloc,r0
  513.     move    #sample,r1
  514.     move    #3,n1
  515.     move    #alloc,r2
  516.     move    Y:jsbound,x0
  517.     do    x0,_loop1
  518.     move    X:(r0),A
  519.     tst    A
  520.     jeq    _not_right
  521.     jsr    _right
  522.     jmp    <_resume_right
  523. _not_right
  524.     clr    A
  525.     move    A,X:(r1)+
  526.     move    A,X:(r1)+
  527.     move    A,X:(r1)+
  528. _resume_right
  529.     move    (r1)-n1        ;;;
  530.  
  531.     move    Y:(r0)+,A
  532.     tst    A
  533.     jeq    _not_left
  534.     jsr    _left
  535.     jmp    <_resume_left
  536. _not_left
  537.     clr    A
  538.     move    A,Y:(r1)+
  539.     move    A,Y:(r1)+
  540.     move    A,Y:(r1)+
  541. _resume_left
  542.  
  543.     move    #16,n2
  544.     nop
  545.     move    (r2)+n2
  546. _loop1
  547.     move    Y:jsbound,x0
  548.     move    Y:sblimit,A
  549.     sub    x0,A
  550.     jeq    _nomono
  551.     do    A,_loop2
  552.     move    X:(r0)+,A
  553.     tst    A
  554.     jeq    _not_mono
  555.     jsr    _right
  556.     move    (r1)-n1        ;;;
  557.     move    X:(r1),x0
  558.     move    x0,Y:(r1)+
  559.     move    X:(r1),x0
  560.     move    x0,Y:(r1)+
  561.     move    X:(r1),x0
  562.     move    x0,Y:(r1)+
  563.     jmp    <_resume_mono
  564. _not_mono
  565.     clr    A
  566.     move    A,X:(r1)
  567.     move    A,Y:(r1)+
  568.     move    A,X:(r1)
  569.     move    A,Y:(r1)+
  570.     move    A,X:(r1)
  571.     move    A,Y:(r1)+
  572. _resume_mono
  573.  
  574.     move    #16,n2
  575.     nop
  576.     move    (r2)+n2
  577. _loop2
  578. _nomono    jsr    <get_bits_exit
  579.     rts
  580.  
  581. _right    move    A,n2
  582.     move    #32*16,n3
  583.     lua    (r2)+n2,r3
  584.     move    #>3,y0
  585.     move    (r3)+n3
  586.     move    X:(r3)+n3,x0
  587.     move    X:(r3)+n3,A
  588.     cmp    y0,A
  589.     jne    _right359
  590.     jsr    <get_bits
  591.     move    A,X:(r1)+
  592.     jsr    <get_bits
  593.     move    A,X:(r1)+
  594.     jsr    <get_bits
  595.     move    A,X:(r1)+
  596.     rts
  597. _right359
  598.     jsr    <get_bits
  599.     move    X:(r3+n3),y0    ; 1/nlevels
  600.     move    X:(r2+n2),y1    ; nlevels
  601.  
  602.     clr    A A,x1
  603.     mpy    x1,y0,B x1,A0
  604.     asl    A B,x1
  605.     mac    -y1,x1,A
  606.     move    A0,A
  607.     lsr    A
  608.     move    A,X:(r1)+
  609.  
  610.     clr    A
  611.     mpy    x1,y0,B x1,A0
  612.     asl    A B,x1
  613.     mac    -y1,x1,A
  614.     move    A0,A
  615.     lsr    A
  616.     move    A,X:(r1)+
  617.  
  618.     clr    A
  619.     mpy    x1,y0,B x1,A0
  620.     asl    A B,x1
  621.     mac    -y1,x1,A
  622.     move    A0,A
  623.     lsr    A
  624.     move    A,X:(r1)+
  625.     rts
  626.  
  627. _left    move    A,n2
  628.     move    #32*16,n3
  629.     lua    (r2)+n2,r3
  630.     move    #>3,y0
  631.     move    (r3)+n3
  632.     move    X:(r3)+n3,x0
  633.     move    X:(r3)+n3,A
  634.     cmp    y0,A
  635.     jne    _left359
  636.     jsr    <get_bits
  637.     move    A,Y:(r1)+
  638.     jsr    <get_bits
  639.     move    A,Y:(r1)+
  640.     jsr    <get_bits
  641.     move    A,Y:(r1)+
  642.     rts
  643. _left359
  644.     jsr    <get_bits
  645.     move    X:(r3+n3),y0    ; 1/nlevels
  646.     move    X:(r2+n2),y1    ; nlevels
  647.  
  648.     clr    A A,x1
  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,Y:(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,Y:(r1)+
  663.  
  664.     clr    A
  665.     mpy    x1,y0,B x1,A0
  666.     asl    A B,x1
  667.     mac    -y1,x1,A
  668.     move    A0,A
  669.     lsr    A
  670.     move    A,Y:(r1)+
  671.     rts
  672.  
  673. decode_bitalloc
  674.     jsr    <get_bits_init
  675.  
  676.     move    #16,n0
  677.     move    #alloc+1*32*16,r0
  678.     move    #bit_alloc,r1
  679.     move    Y:jsbound,y0
  680.     do    y0,_loop1
  681.     move    X:(r0)+n0,x0
  682.     jsr    <get_bits
  683.     move    A,X:(r1)
  684.     jsr    <get_bits
  685.     move    A,Y:(r1)+
  686. _loop1
  687.     move    Y:jsbound,y0
  688.     move    Y:sblimit,A
  689.     sub    y0,A
  690.     jeq    _loop2
  691.     do    A,_loop2
  692.     move    X:(r0)+n0,x0
  693.     jsr    <get_bits
  694.     move    A,X:(r1)
  695.     move    A,Y:(r1)+
  696. _loop2
  697.     jsr    <get_bits_exit
  698.     rts
  699.  
  700. decode_scale
  701.     jsr    <get_bits_init
  702.  
  703.     move    #>2,x0
  704.     move    #bit_alloc,r0
  705.     move    #scfsi,r1
  706.     move    Y:sblimit,y0
  707.     do    y0,_loop0
  708.     move    X:(r0),A
  709.     tst    A
  710.     jeq    _n1
  711.     jsr    <get_bits
  712.     move    A,X:(r1)
  713. _n1    move    Y:(r0)+,A
  714.     tst    A
  715.     jeq    _n2
  716.     jsr    <get_bits
  717.     move    A,Y:(r1)
  718. _n2    move    (r1)+
  719. _loop0
  720.     move    #32,n1
  721.     move    #3*32-1,m1
  722.     move    #bit_alloc,r0
  723.     move    #scale_index,r1
  724.     move    #scfsi,r2
  725.     move    Y:sblimit,y0
  726.     do    y0,_loop1
  727.  
  728.     move    X:(r0),A    ; Right
  729.     tst    A
  730.     jeq    <_not_right
  731.     move    X:(r2),A    ; Right
  732.     tst    A #>1,x0
  733.     jeq    _r0
  734.     cmp    x0,A #>2,x0
  735.     jeq    _r1
  736.     cmp    x0,A #>3,x0
  737.     jeq    _r2
  738.     cmp    x0,A
  739.     jeq    _r3
  740.     jmp    <_right
  741. _r0    move    #>6,x0
  742.     jsr    <get_bits
  743.     move    A,X:(r1)+n1    ; Right
  744.     jsr    <get_bits
  745.     move    A,X:(r1)+n1    ; Right
  746.     jsr    <get_bits
  747.     move    A,X:(r1)+n1    ; Right
  748.     jmp    <_right
  749. _r1    move    #>6,x0
  750.     jsr    <get_bits
  751.     move    A,X:(r1)+n1    ; Right
  752.     move    A,X:(r1)+n1    ; Right
  753.     jsr    <get_bits
  754.     move    A,X:(r1)+n1    ; Right
  755.     jmp    <_right
  756. _r3    move    #>6,x0
  757.     jsr    <get_bits
  758.     move    A,X:(r1)+n1    ; Right
  759.     jsr    <get_bits
  760.     move    A,X:(r1)+n1    ; Right
  761.     move    A,X:(r1)+n1    ; Right
  762.     jmp    <_right
  763. _r2    move    #>6,x0
  764.     jsr    <get_bits
  765.     move    A,X:(r1)+n1    ; Right
  766.     move    A,X:(r1)+n1    ; Right
  767.     move    A,X:(r1)+n1    ; Right
  768.     jmp    <_right
  769. _not_right
  770.     move    #>SCALE_RANGE-1,A
  771.     move    A,X:(r1)+n1    ; Right
  772.     move    A,X:(r1)+n1    ; Right
  773.     move    A,X:(r1)+n1    ; Right
  774. _right
  775.     move    Y:(r0),A    ; Left
  776.     tst    A
  777.     jeq    <_not_left
  778.     move    Y:(r2),A    ; Left
  779.     tst    A #>1,x0
  780.     jeq    _l0
  781.     cmp    x0,A #>2,x0
  782.     jeq    _l1
  783.     cmp    x0,A #>3,x0
  784.     jeq    _l2
  785.     cmp    x0,A
  786.     jeq    _l3
  787.     jmp    <_left
  788. _l0    move    #>6,x0
  789.     jsr    <get_bits
  790.     move    A,Y:(r1)+n1    ; Left
  791.     jsr    <get_bits
  792.     move    A,Y:(r1)+n1    ; Left
  793.     jsr    <get_bits
  794.     move    A,Y:(r1)+n1    ; Left
  795.     jmp    <_left
  796. _l1    move    #>6,x0
  797.     jsr    <get_bits
  798.     move    A,Y:(r1)+n1    ; Left
  799.     move    A,Y:(r1)+n1    ; Left
  800.     jsr    <get_bits
  801.     move    A,Y:(r1)+n1    ; Left
  802.     jmp    <_left
  803. _l3    move    #>6,x0
  804.     jsr    <get_bits
  805.     move    A,Y:(r1)+n1    ; Left
  806.     jsr    <get_bits
  807.     move    A,Y:(r1)+n1    ; Left
  808.     move    A,Y:(r1)+n1    ; Left
  809.     jmp    <_left
  810. _l2    move    #>6,x0
  811.     jsr    <get_bits
  812.     move    A,Y:(r1)+n1    ; Left
  813.     move    A,Y:(r1)+n1    ; Left
  814.     move    A,Y:(r1)+n1    ; Left
  815.     jmp    <_left
  816. _not_left
  817.     move    #>SCALE_RANGE-1,A
  818.     move    A,Y:(r1)+n1    ; Left
  819.     move    A,Y:(r1)+n1    ; Left
  820.     move    A,Y:(r1)+n1    ; Left
  821. _left
  822.     move    (r0)+
  823.     move    (r1)+
  824.     move    (r2)+
  825. _loop1
  826.     move    #-1,m1
  827.     jsr    <get_bits_exit
  828.     rts
  829.  
  830. read_frame
  831. _wait01    jclr    #0,X:<<M_HSR,_wait01
  832.     movep    X:<<M_HRX,Y:sblimit
  833. _wait02    jclr    #0,X:<<M_HSR,_wait02
  834.     movep    X:<<M_HRX,Y:jsbound
  835. _wait03    jclr    #0,X:<<M_HSR,_wait03
  836.     movep    X:<<M_HRX,y1     ; frame size
  837.  
  838.     ; read 32 bit header (12+20)
  839. _wait_1    jclr    #0,X:<<M_HSR,_wait_1
  840.     movep    X:<<M_HRX,x0
  841. _wait_2    jclr    #0,X:<<M_HSR,_wait_2
  842.     movep    X:<<M_HRX,x0
  843. _wait_3    jclr    #0,X:<<M_HSR,_wait_3
  844.     movep    X:<<M_HRX,x0
  845. _wait_4    jclr    #0,X:<<M_HSR,_wait_4
  846.     movep    X:<<M_HRX,x0
  847.  
  848.     clr    A #frame,r0
  849. _wait_5    jclr    #0,X:<<M_HSR,_wait_5
  850.     movep    X:<<M_HRX,x0
  851. _wait_6    jclr    #0,X:<<M_HSR,_wait_6
  852.     movep    X:<<M_HRX,x1
  853. _wait_7    jclr    #0,X:<<M_HSR,_wait_7
  854.     movep    X:<<M_HRX,A0
  855.     move    #>$008000,y0
  856.     mac    x0,y0,A #>$000080,y0
  857.     mac    x1,y0,A
  858.     move    A0,X:(r0)+
  859.  
  860.     move    #>$000080,y0
  861.     do    y1,_read
  862.     clr    A A0,x0
  863. _wait    jclr    #0,X:<<M_HSR,_wait
  864.     movep    X:<<M_HRX,A0
  865.     mac    x0,y0,A
  866.     move    A0,X:(r0)+
  867. _read
  868.     do    #8,_s1
  869.     asl    A
  870. _s1    move    A0,X:(r0)+
  871.     do    #8,_s2
  872.     asl    A
  873. _s2    move    A0,X:(r0)+
  874.  
  875.     move    #getbit_cntl,r5
  876.     move    #frame,r6
  877.     move    r5,Y:getbit_cntlp
  878.     move    r6,Y:getbit_framep
  879.     rts
  880. get_bits_init
  881.     move    #getbit_mask,r4
  882.     move    Y:getbit_cntlp,r5
  883.     move    Y:getbit_framep,r6
  884.     rts
  885. get_bits_exit
  886.     move    r5,Y:getbit_cntlp
  887.     move    r6,Y:getbit_framep
  888.     move    #-1,m5
  889.     rts
  890.  
  891. ; DMA handshake and Host DSP/030 I/O routines.
  892. Host_get    jclr    #0,X:<<M_HSR,Host_get
  893.         movep    X:<<M_HRX,x0
  894.         rts
  895. Host_send    jclr    #1,X:<<M_HSR,Host_send
  896.         movep    x0,X:<<M_HTX
  897.         rts
  898. DMA_send    bset    #5,x:<<M_PCD    ; start frame sync
  899.         movep    x0,x:<<M_TX
  900. _wait        jclr    #6,x:<<M_SR,_wait
  901.         bclr    #5,x:<<M_PCD    ; stop frame sync
  902.         rts
  903.  
  904. init_tables
  905.     move    #filter,r0
  906.     do    #64*32,_filter
  907. _f_wait    jclr    #0,X:<<M_HSR,_f_wait
  908.     movep    X:<<M_HRX,X:(r0)+
  909. _filter
  910.     move    #window,r0
  911.     do    #32*16,_window
  912. _w_wait    jclr    #0,X:<<M_HSR,_w_wait
  913.     movep    X:<<M_HRX,X:(r0)+
  914. _window
  915.     move    #alloc,r0
  916.     do    #2048+16*32,_alloc
  917. _a_wait    jclr    #0,X:<<M_HSR,_a_wait
  918.     movep    X:<<M_HRX,X:(r0)+
  919. _alloc
  920.     move    #multiple,r0
  921.     do    #64,_multiple
  922. _m_wait    jclr    #0,X:<<M_HSR,_m_wait
  923.     movep    X:<<M_HRX,X:(r0)+
  924. _multiple
  925.     move    #c,r0
  926.     do    #17,_c
  927. _c_wait    jclr    #0,X:<<M_HSR,_c_wait
  928.     movep    X:<<M_HRX,X:(r0)+
  929. _c
  930.     move    #d,r0
  931.     do    #17,_d
  932. _d_wait    jclr    #0,X:<<M_HSR,_d_wait
  933.     movep    X:<<M_HRX,X:(r0)+
  934. _d
  935.     move    #msb,r0
  936.     do    #256,_msb
  937. _s_wait    jclr    #0,X:<<M_HSR,_s_wait
  938.     movep    X:<<M_HRX,X:(r0)+
  939. _msb
  940.     move      #buf,r0
  941.     clr    A #buf,r4
  942.     rep    #2*HAN_SIZE
  943.     move    A,X:(r0)+ A,Y:(r4)+
  944.  
  945.     clr    A #buffer1,r0
  946.     rep    #BUFFER_SIZE
  947.     move    A,Y:(r0)+
  948.     rep    #BUFFER_SIZE
  949.     move    A,Y:(r0)+
  950.     rts
  951.  
  952.     end
  953.