home *** CD-ROM | disk | FTP | other *** search
/ Computer Club Elmshorn Atari PD / CCE_PD.iso / pc / 0600 / CCE_0689.ZIP / CCE_0689 / LHA3_SRC.LZH / SOURCE / DECODE5.S next >
Text File  |  1994-04-03  |  19KB  |  1,158 lines

  1.  
  2.             export        bitbuf
  3.             export        bitcount
  4.             export        subbitbuf
  5.             export        origsize
  6.             export        compsize
  7.             export        bad_tab
  8.             export        fill_buf
  9.  
  10.             export        fillbuf
  11.             export        getbits
  12.             export        decode_lh5
  13.             export        send_block
  14.             export        make_table
  15.             export        putbits
  16.  
  17.             import        outrec
  18.             import        heap
  19.             import        heapsize
  20.             import        freq
  21.             import        file1
  22.             import        file3
  23.             import        right
  24.             import        left
  25.             import        dad
  26.             import        blocksize
  27.             import        bufsize
  28.             import        pt_table
  29.             import        pt_len
  30.             import        c_len
  31.             import        crc
  32.             import        text_buf
  33.             import        flg_q
  34.             import        has_crc
  35.             import        ProcInd
  36.             import        errorlevel
  37.             import        c_code
  38.             import        c_freq
  39.             import        pt_code
  40.             import        p_freq
  41.             import        t_freq
  42.             import        M_BADTAB
  43.  
  44.             import        block_crc
  45.             import        read_c_len
  46.             import        read_pt_len
  47.             import        make_tree
  48.             import        count_t_freq
  49.             import        write_pt_len
  50.             import        write_c_len
  51.             import        _filbuf
  52.             import        make_buf
  53.             import        fwrite
  54.             import        error
  55.             import        shipout
  56.             import        print
  57.             import        decrypt
  58.             import        copy_to_view
  59.  
  60. NC            equ            510
  61. NT            equ            19
  62. NP            equ            14
  63.  
  64. WTERR        equ         14
  65.  
  66.  
  67. fillbuf:    move.w        d4,-(sp)
  68.             pea            (a2)
  69.  
  70.             move.w        d0,d1
  71.             lea.l        bitbuf(pc),a2
  72.  
  73.             move.w        (a2)+,d2
  74.             move.w        (a2)+,d0
  75.             move.w        (a2)+,d4
  76.  
  77.             lsl.w        d1,d2
  78.  
  79.             cmp.w        d1,d4
  80.             bge.s        fbuf_exitf
  81.  
  82.             move.l        file1(pc),a0
  83.             movea.l     4(a0),a1
  84.  
  85. fbuf_whilef:sub.b        d4,d1
  86.             moveq.l     #8,d4
  87.  
  88.             lsl.w        d1,d0
  89.             or.w        d0,d2
  90.  
  91.             moveq.l     #0,d0
  92.  
  93.             subq.l        #1,(a2)
  94.             bmi.s        fbuf_wendf
  95.  
  96.             subq.l        #1,(a0)
  97.             bmi.s        fbuf_fgetcf
  98.  
  99.             move.b        (a1)+,d0
  100.  
  101. fbuf_wendf: cmp.w        d1,d4
  102.             blt.s        fbuf_whilef
  103.  
  104.             move.l        a1,4(a0)
  105.  
  106. fbuf_exitf: sub.w        d1,d4
  107.             move.w        d0,d1
  108.             lsr.w        d4,d0
  109.             or.w        d2,d0
  110.  
  111.             movem.w     d0/d1/d4,-(a2)
  112.             move.l         (sp)+,a2
  113.             move.w        (sp)+,d4
  114.             rts
  115.  
  116.  
  117. fill_buf:    movem.l        d1/d2/a0/a1,-(sp)
  118.             bsr            _filbuf
  119.             moveq.l        #1,d0
  120.             jsr            decrypt
  121.             movem.l        (sp)+,d1/d2/a0/a1
  122.             rts
  123.  
  124.  
  125. fbuf_fgetcf:move.l        a1,4(a0)
  126.             bsr         fill_buf
  127.             move.l        4(a0),a1
  128.             bra.s        fbuf_wendf
  129.  
  130. fbuf_fgetcg:move.l        a1,4(a0)
  131.             bsr         fill_buf
  132.             move.l        4(a0),a1
  133.             bra.s        fbuf_wendg
  134.  
  135.  
  136. getbits:    move.w        d4,-(sp)
  137.             pea            (a2)
  138.  
  139.             lea.l        bitbuf(pc),a2
  140.             move.w        d0,d1
  141.  
  142.             move.w        (a2),d2
  143.             moveq.l     #16,d0
  144.             sub.w        d1,d0
  145.             lsr.w        d0,d2
  146.  
  147.             swap        d2
  148.             move.w        (a2)+,d2
  149.             move.w        (a2)+,d0
  150.             move.w        (a2)+,d4
  151.  
  152.             lsl.w        d1,d2
  153.  
  154.             cmp.w        d1,d4
  155.             bge.s        fbuf_exitg
  156.  
  157.             movea.l     file1(pc),a0
  158.             movea.l     4(a0),a1
  159.  
  160. fbuf_whileg:sub.w        d4,d1
  161.             moveq.l     #8,d4
  162.  
  163.             lsl.w        d1,d0
  164.             or.w        d0,d2
  165.  
  166.             moveq.l     #0,d0
  167.  
  168.             subq.l        #1,(a2)
  169.             bmi.s        fbuf_wendg
  170.  
  171.             subq.l        #1,(a0)
  172.             bmi.s        fbuf_fgetcg
  173.  
  174.             move.b        (a1)+,d0
  175.  
  176. fbuf_wendg: cmp.w        d1,d4
  177.             blt.s        fbuf_whileg
  178.  
  179.             move.l        a1,4(a0)
  180.  
  181. fbuf_exitg: sub.w        d1,d4
  182.             move.w        d0,d1
  183.             lsr.w        d4,d0
  184.             or.w        d2,d0
  185.  
  186.             movem.w     d0/d1/d4,-(a2)
  187.             move.l        (sp)+,a2
  188.             move.w        (sp)+,d4
  189.  
  190.             swap        d2
  191.             move.w        d2,d0
  192.  
  193.             rts
  194.  
  195.  
  196. make_table: movem.l     D3-D7/A2-A6,-(SP)
  197.             lea         -$78(SP),SP
  198.  
  199.             move.w        D0,$76(SP)    ; nchar
  200.             move.w        D1,D6        ; tablebits
  201.             move.l        A0,$72(SP)    ; bitlen
  202.             move.l        A1,A6        ; table
  203.             lea.l        left(PC),A3
  204.             lea.l        $2+2(SP),A4 ; &start[1]
  205.             lea         $4C(SP),A5    ; count
  206.  
  207.             lea.l        2(A5),A1    ; &count[1]
  208.             moveq.l     #0,D1
  209.             rept        8
  210.             move.l        D1,(A1)+
  211.             endm
  212.  
  213.             subq.w        #1,D0
  214.             bmi.s        no_init
  215.  
  216. init_count: moveq.l     #0,D1
  217.             move.b        (A0)+,D1
  218.             add.w        D1,D1
  219.             addq.w        #1,0(A5,D1.W)
  220.             dbra        d0,init_count
  221.  
  222. no_init:    move.l        A4,A0        ; &start[1]
  223.             lea.l        2(A5),A1    ; &count[1]
  224.             moveq.l     #0,d5        ; k=0
  225.             move.w        D5,(A0)+    ; start[1]=0
  226.             moveq.l     #15,D2
  227.  
  228. init_start:    REPT        4
  229.             move.w        (a1)+,D1
  230.             lsl.w        D2,D1
  231.             add.w        D1,D5
  232.             move.w        D5,(A0)+
  233.             subq.w        #1,d2
  234.             ENDM
  235.             bpl.s        init_start
  236.  
  237.             tst.w        D5            ; k==0
  238.             beq.s        table_ok
  239.  
  240.             ori.w        #1,errorlevel
  241.             addq.w        #1,bad_tab
  242.             tst.b        flg_q
  243.             bne.s        _bad_table
  244.  
  245.             lea         M_BADTAB(pc),A0
  246.             moveq.l        #1,d0
  247.             jsr         print
  248.  
  249. _bad_table: moveq.l     #0,d0
  250.             bra         make_exit
  251.  
  252. table_ok:    moveq.l     #16,D2
  253.             sub.w        D6,D2
  254.             move.w        D2,(SP) ; jutbits
  255.  
  256.             moveq.l     #1,D3
  257.             lea.l        $26+2(SP),A0; &weight[1]
  258.  
  259.             move.w        D6,D7
  260.             subq.w        #1,D7
  261.             bmi.s        no_start_weight
  262.  
  263.             move.l        A4,A1    ; &start[1]
  264.             add.w        D6,D3
  265.  
  266. start_weight:
  267.             move.w        (A1),D0     ; start[i] >>= jutbits
  268.             lsr.w        D2,D0
  269.             move.w        D0,(A1)+
  270.  
  271.             moveq.l     #1,D1
  272.             lsl.w        D7,D1
  273.             move.w        D1,(A0)+
  274.  
  275.             dbra        D7,start_weight
  276.  
  277. no_start_weight:
  278.             moveq.l     #16,D1
  279.             sub.w        D3,D1
  280.             bmi.s        no_while_weight
  281.  
  282.             moveq.l     #0,D0
  283.             bset        D1,D0
  284. while_weight:
  285.             move.w        D0,(A0)+
  286.             lsr.l        D0
  287.             dbra        D1,while_weight
  288.  
  289. no_while_weight:
  290.             move.w        D6,D0
  291.             add.w        D0,D0
  292.             move.w        0(A4,D0.w),D3
  293.             lsr.w        D2,D3
  294.             beq.s        i_equal
  295.  
  296.             moveq.l     #1,D5
  297.             lsl.w        D6,D5
  298.  
  299.             cmp.w        D3,D5
  300.             beq.s        i_equal
  301.  
  302.             moveq.l     #0,D0
  303.             movea.l     A6,A1    ; table
  304.             add.w        D3,A1
  305.             add.w        D3,A1
  306.  
  307.             sub.w        D5,D3
  308.             not.w        D3
  309.  
  310. while_i:    move.w        D0,(A1)+
  311.             dbra        D3,while_i
  312.  
  313. i_equal:    moveq.l     #1,D1
  314.             moveq.l     #15,D2
  315.             sub.w        D6,D2
  316.             lsl.w        D2,D1
  317.             move.w        D1,$4A(SP)        ; mask
  318.  
  319.             move.w        $76(SP),D1        ; avail=nchar
  320.             lea         $26(SP),A0        ; weight
  321.             movea.l     $72(SP),A1        ; bitlen
  322.             lea         right(PC),A5
  323.  
  324.             moveq.l     #0,d0            ; ch
  325.             bra         ch_wend
  326.  
  327. while_ch:    moveq.l     #0,D4
  328.             move.b        (A1)+,D4    ; len=bitlen[ch]
  329.             beq.b        next_ch
  330.  
  331.             move.w        D4,D7
  332.             add.w        D7,D7
  333.             move.w        -2(A4,D7.w),D2
  334.             move.w        D2,D5            ; k=start[len]
  335.             add.w        0(A0,D7.w),D2
  336.             move.w        D2,$48(SP)        ; nextcode
  337.             movea.l     A6,A2            ; table
  338.  
  339.             cmp.w        D6,D4            ; len<=tablebits
  340.             bgt.s        len_gt_tablebits
  341.  
  342.             cmp.w        D2,D5
  343.             bge.s        endif
  344.  
  345.             adda.w        D5,A2
  346.             adda.w        D5,A2
  347.  
  348.             sub.w        D5,D2
  349.             subq.w        #1,D2
  350.  
  351. for_i:        move.w        D0,(A2)+
  352.             dbra        D2,for_i
  353.             bra.s        endif
  354.  
  355. len_gt_tablebits:
  356.             move.w        (SP),D2 ; jutbits
  357.             move.w        D5,D7
  358.             lsr.w        D2,D7
  359.             add.w        D7,D7
  360.             adda.w        D7,A2
  361.  
  362.             move.w        D4,D3
  363.             sub.w        D6,D3
  364.             subq.w        #1,d3
  365.             bmi.s        i_endif
  366.  
  367. while_i_else:
  368.             move.w        (A2),D7
  369.             add.w        D7,D7
  370.             bne.s        table_ne
  371.  
  372.             moveq.l     #0,D2
  373.             move.w        D1,D7
  374.             add.w        D7,D7
  375.             move.w        D2,(A3,D7.W)
  376.             move.w        D2,(A5,D7.W)
  377.             move.w        D1,(A2)
  378.             addq.w        #1,D1
  379.  
  380. table_ne:    move.w        D5,D2
  381.             and.w        $4A(SP),D2
  382.             beq.s        no_mask
  383.  
  384.             lea         0(A5,D7.w),A2
  385.             bra.s        mask
  386.  
  387. no_mask:    lea         0(A3,D7.w),A2
  388. mask:        add.w        D5,D5
  389.  
  390.             dbra        d3,while_i_else
  391. i_endif:    move.w        D0,(A2)
  392.  
  393. endif:        add.w        D4,D4
  394.             move.w        $48(SP),-2(A4,D4.w) ; start[len]=nextcode
  395.  
  396. next_ch:    addq.w        #1,D0
  397. ch_wend:    cmp.w        $76(SP),D0    ; ch<nchar
  398.             blt         while_ch
  399.  
  400. make_ok:    moveq.l     #-1,D0
  401.  
  402. make_exit:    lea         $78(SP),SP
  403.             movem.l     (SP)+,D3-D7/A2-A6
  404.             rts
  405.  
  406.  
  407. decode_lh5: movem.l     D3-D7/A2-A6,-(SP)
  408.  
  409.             move.w        #$FF,d4     ; m
  410.             lea.l        dec_j(pc),a2
  411.  
  412.             moveq.l     #0,d6
  413.             moveq.l     #8,d7
  414.             move.w        d6,crc
  415.             move.w        d6,bsize-dec_j(a2)
  416.  
  417.             move.l        d6,(a2)+
  418.             move.l        d6,(a2)+
  419.             move.l        D1,(a2)+    ; pacsize
  420.             move.l        D0,(a2)     ; origsize
  421.  
  422.             moveq.l     #16,D0
  423.             bsr         fillbuf
  424.  
  425.             move.l        file3(pc),d5
  426.             lea         text_buf,A4
  427.  
  428.             moveq.l     #0,d3
  429.             bra         wend_orig
  430.  
  431. while_orig: move.w        #$2000,d3    ; n
  432.             cmp.l        d3,d0
  433.             bhs.s        dic_size
  434.  
  435.             move.w        d0,d3
  436.  
  437. dic_size:    move.l        file1(pc),a0
  438.             move.l        #12*1024,d0
  439.             jsr            make_buf
  440.  
  441.             move.l        file1(pc),a0
  442.             move.l        4(a0),-(sp)    ; file->_ptr
  443.  
  444.             bsr            decode5
  445.  
  446.             move.l        file1(pc),a0
  447.             move.l        4(a0),d1    ; file->_ptr
  448.             sub.l        (sp)+,d1
  449.             sub.l        d1,bufsize
  450.  
  451.             tst.w        d0
  452.             beq.s        bad_table
  453.  
  454.             tst.l        d5
  455.             beq.s        viewer
  456.  
  457.             move.l        d3,d1
  458.             movea.l     d5,a1
  459.             movea.l     a4,a0
  460.             moveq.l     #1,d0
  461.             bsr         fwrite
  462.  
  463.             cmp.l        d3,d0
  464.             bcc.s        no_error
  465.  
  466.             sub.l        a0,a0
  467.             moveq.l     #WTERR,d0
  468.             moveq.l        #-1,D1
  469.             jmp         error
  470.  
  471. viewer:        move.l        d3,d0
  472.             movea.l        a4,a0
  473.             jsr            copy_to_view
  474.  
  475. no_error:    sub.l        d3,(a2)
  476.             add.l        d3,d6
  477.  
  478.             tst.b        has_crc
  479.             beq.s        no_crc
  480.  
  481.             move.l        a4,a0
  482.             move.l        d3,d0
  483.             jsr            block_crc
  484.  
  485. no_crc:     tst.l        (a2)
  486.             beq.s        ind
  487.  
  488. proc_ind:    cmp.l        blocksize(pc),d6
  489.             blt.s        wend_orig
  490.  
  491. ind:        sub.l        blocksize(pc),d6
  492.  
  493.             jsr         ProcInd
  494.             bra.s        proc_ind
  495.  
  496. wend_orig:    move.l        (a2),d0
  497.             bne         while_orig
  498.  
  499.             moveq.l     #1,d0
  500.  
  501. bad_table:    movem.l     (SP)+,D3-D7/A2-A6
  502.             rts
  503.  
  504. ; *****
  505.  
  506.  
  507. decode5:    movem.l     d3-d7/a2/a4,-(sp)
  508.  
  509.             subq.w        #1,d3                ; count
  510.             move.w        bsize(pc),d6
  511.  
  512.             move.l         file1(pc),a0
  513.             move.l        4(a0),a6            ; file->_ptr
  514.  
  515.              lea.l        c_len(pc),a1
  516.             lea.l        pt_table,a2
  517.             move.l        dad(pc),a3
  518.             movea.l        a4,a5                ; text_buf
  519.  
  520.             lea.l         bitbuf(pc),a0
  521.             move.w        (a0)+,d2
  522.             move.w        (a0)+,d7
  523.             move.w        (a0),d5
  524.  
  525.             move.w        dec_j(pc),d1
  526.             subq.w        #1,d1
  527.             bmi.s        for
  528.  
  529.             move.w        #$1fff,d0            ; DICSIZ - 1
  530.             move.w        i(pc),d4
  531.  
  532. while_loop1:
  533.             and.w        d0,d4
  534.             move.b        (a4,d4.w),(a5)+
  535.             addq.w        #1,d4
  536.             subq.w        #1,d3
  537.             dbmi        d1,while_loop1
  538.             bpl.s        for
  539.  
  540.             move.w        d1,dec_j
  541.             bra            dc_return
  542.  
  543. for:        dbra        d6,dont_read_bsize
  544.  
  545.             move.w        d2,d6
  546.             subq.w        #1,d6
  547.             moveq.l        #0,d2
  548.  
  549.             sub.b        #16,d5
  550.             bpl.s        fbuf_exit1
  551.  
  552. fbuf_while1:
  553.             neg.b        d5
  554.             lsl.w        d5,d7
  555.             or.w        d7,d2
  556.             neg.b        d5
  557.  
  558.             moveq.l     #0,d7
  559.             move.b        (a6)+,d7
  560.  
  561.             addq.b        #8,d5
  562.             bmi.s        fbuf_while1
  563.  
  564. fbuf_exit1:
  565.             lea.l        bitbuf+6(pc),a0
  566.             move.w        d5,-(a0)
  567.             move.w        d7,-(a0)
  568.  
  569.             lsr.w        d5,d7
  570.             or.w        d2,d7
  571.             move.w        d7,-(a0)
  572.  
  573.             move.l        file1(pc),a0
  574.             move.l        a6,d0
  575.             sub.l        4(a0),d0
  576.             sub.l        d0,(a0)
  577.             move.l        a6,4(a0)
  578.  
  579.             moveq.l     #19,d0
  580.             moveq.l     #5,d1
  581.             moveq.l     #3,d2
  582.             jsr         read_pt_len
  583.             tst.w        d0
  584.             beq         dc_err
  585.  
  586.             jsr         read_c_len
  587.             tst.w        d0
  588.             beq         dc_err
  589.  
  590.             moveq.l     #14,d0
  591.             moveq.l     #4,d1
  592.             moveq.l     #-1,d2
  593.             jsr         read_pt_len
  594.             tst.w        d0
  595.             beq         dc_err
  596.  
  597.             move.l        file1(pc),a0
  598.             move.l        4(a0),a6        ; file->_ptr
  599.  
  600.             lea.l        bitbuf(pc),a0
  601.             move.w        (a0)+,d2
  602.             move.w        (a0)+,d7
  603.             move.w        (a0),d5
  604.  
  605.             lea.l        c_len(pc),a1
  606.             bra.s        dont_read_bsize
  607.  
  608. loop1:        moveq.l     #3,d1
  609.             move.w        #510,d0
  610.  
  611. do1:        add.w        d3,d3
  612.             btst        d1,d2
  613.             beq.s        do_else1
  614.  
  615.             lea.l        right(pc),a0
  616.             move.w        0(a0,d3.w),d3
  617.  
  618.             cmp.w        d0,d3
  619.             dblt        d1,do1
  620.             bra.s        no_do1
  621.  
  622. do_else1:    lea.l        left(pc),a0
  623.             move.w        0(a0,d3.w),d3
  624.  
  625.             cmp.w        d0,d3
  626.             dblt        d1,do1
  627.             bra.s        no_do1
  628.  
  629. dont_read_bsize:
  630.             move.w        d2,d1
  631.             lsr.w        #4,d1
  632.             add.w        d1,d1
  633.             swap        d3
  634.             move.w        0(a3,d1.w),d3
  635.  
  636.             cmp.w        #510,d3
  637.             bcc.s        loop1
  638.  
  639. no_do1:        move.b        0(a1,d3.w),d0
  640.             lsl.w        d0,d2
  641.  
  642.             sub.b        d0,d5
  643.             bpl.s        fbuf_exit2
  644.  
  645. fbuf_while2:
  646.             neg.b        d5
  647.             lsl.w        d5,d7
  648.             or.w        d7,d2
  649.             neg.b        d5
  650.  
  651.             moveq.l     #0,d7
  652.             move.b        (a6)+,d7
  653.  
  654.             addq.b        #8,d5
  655.             bmi.s        fbuf_while2
  656.  
  657. fbuf_exit2:
  658.             move.w        d7,d0
  659.             lsr.w        d5,d0
  660.             or.w        d0,d2
  661.  
  662.             cmpi.w        #255,d3
  663.             bhi.s        c_gt_ucmax
  664.  
  665.             move.b        d3,(a5)+
  666.             swap        d3
  667.             dbra        d3,for
  668.  
  669.             clr.w        dec_j
  670.             bra            dc_return
  671.  
  672. loop2:        moveq.l     #7,d1
  673.  
  674. do2:        add.w        d4,d4
  675.             btst        d1,d2
  676.             beq.s        do_else2
  677.  
  678.             lea.l        right(pc),a0
  679.             move.w        0(a0,d4.w),d4
  680.  
  681.             cmp.w        d0,d4
  682.             dblt        d1,do2
  683.             bra.s        no_do2
  684.  
  685. do_else2:    lea         left(PC),a0
  686.             move.w        0(a0,d4.w),d4
  687.  
  688.             cmp.w        d0,d4
  689.             dblt        d1,do2
  690.             bra.s        no_do2
  691.             
  692. c_gt_ucmax:
  693.             swap        d3
  694.  
  695.             move.w        d2,d1        ; count
  696.             lsr.w        #8,d1
  697.             add.w        d1,d1
  698.             move.w        0(a2,d1.w),d4
  699.  
  700.             moveq.l     #14,d0
  701.             cmp.w        d0,d4
  702.             bcc.s        loop2
  703.  
  704. no_do2:        lea         pt_len(pc),a0
  705.             move.b        0(a0,d4.w),d0
  706.             lsl.w        d0,d2
  707.  
  708.             sub.b        d0,d5
  709.             bpl.s        fbuf_exit3
  710.  
  711. fbuf_while3:
  712.             neg.b        d5
  713.             lsl.w        d5,d7
  714.             or.w        d7,d2
  715.             neg.b        d5
  716.  
  717.             moveq.l     #0,d7
  718.             move.b        (a6)+,d7
  719.  
  720.             addq.b        #8,d5
  721.             bmi.s        fbuf_while3
  722.  
  723. fbuf_exit3:
  724.             move.w        d7,d0
  725.             lsr.w        d5,d0
  726.             or.w        d0,d2
  727.  
  728.             dbra        d4,i_plus
  729.             bra.s        while_loop2
  730.  
  731. i_plus:        movea.w        d2,a0
  732.             lsl.w        d4,d2
  733.  
  734.             sub.b        d4,d5
  735.             bpl.s        fbuf_exit4
  736.  
  737. fbuf_while4:
  738.             neg.b        d5
  739.             lsl.w        d5,d7
  740.             or.w        d7,d2
  741.             neg.b        d5
  742.  
  743.             moveq.l     #0,d7
  744.             move.b        (a6)+,d7
  745.  
  746.             addq.b        #8,d5
  747.             bmi.s        fbuf_while4
  748.  
  749. fbuf_exit4:
  750.             move.w        d7,d0
  751.             lsr.w        d5,d0
  752.             or.w        d0,d2
  753.  
  754.             moveq.l        #-1,d0
  755.             bclr        d4,d0
  756.  
  757.             moveq.l     #16,d1
  758.             sub.w        d4,d1
  759.  
  760.             move.w        a0,d4
  761.             lsr.w        d1,d4
  762.             sub.w        d0,d4
  763.             neg.w        d4
  764.  
  765. while_loop2:
  766.             move.l        a5,d0
  767.             sub.l        a4,d0
  768.             add.w        d0,d4
  769.  
  770.             swap        d3
  771.             move.w        d3,d1
  772.             swap        d3
  773.  
  774.             move.w        #$1fff,d0    ; DICSIZ - 1
  775.  
  776.             subi.w        #254,d1
  777.             sub.w        d1,d3
  778.             bls.s        d1_gt_d3
  779.  
  780.             and.w        d0,d4
  781.             movea.w        d4,a0
  782.             adda.w        d1,a0
  783.  
  784.             subq.w        #2,d1
  785.  
  786.             cmp.w        a0,d0
  787.             blt.s        w_loop2c
  788.  
  789.             lea.l        0(a4,d4.w),a0
  790.             move.b        (a0)+,(a5)+
  791.             move.b        (a0)+,(a5)+
  792.  
  793. w_loop2a:    move.b        (a0)+,(a5)+
  794.             dbra        d1,w_loop2a
  795.             dbra        d3,for
  796.  
  797. w_loop2c:    move.b        0(a4,d4.w),(a5)+
  798.             addq.w        #1,d4
  799.             and.w        d0,d4
  800.             move.b        0(a4,d4.w),(a5)+
  801.             addq.w        #1,d4
  802.             and.w        d0,d4
  803. w_loop2d:    move.b        0(a4,d4.w),(a5)+
  804.             addq.w        #1,d4
  805.             and.w        d0,d4
  806.             dbra        d1,w_loop2d
  807.             dbra        d3,for
  808.  
  809. d1_gt_d3:    add.w        d1,d3
  810.             sub.w        d3,d1
  811.             move.w        d1,dec_j
  812.  
  813. w_loop2b:    and.w        d0,d4
  814.             move.b        0(a4,d4.w),(a5)+
  815.             addq.w        #1,d4
  816.             dbra        d3,w_loop2b
  817.  
  818. dc_return:    moveq.l     #1,d0
  819.  
  820.             lea.l        bitbuf+6(pc),a0
  821.             move.w        d5,-(a0)
  822.             move.w        d7,-(a0)
  823.             move.w        d2,-(a0)
  824.             move.w        d4,i-bitbuf(a0)
  825.             move.w        d6,bsize-bitbuf(a0)
  826.  
  827.             move.l        file1(pc),a0
  828.             move.l        a6,d1
  829.             sub.l        4(a0),d1
  830.             sub.l        d1,(a0)
  831.             move.l        a6,4(a0)
  832.  
  833.             movem.l     (sp)+,d3-d7/a2/a4
  834.             rts
  835.  
  836. dc_err:        moveq.l        #0,d0
  837.             movem.l     (sp)+,d3-d7/a2/a4
  838.             rts
  839.  
  840.  
  841. putbits:    lea.l        bitcount(pc),a1
  842.             sub.w        (a1),d0
  843.             bge.b        _n_ge_bitcount
  844.  
  845.             neg.w        d0
  846.             lsl.w        d0,d1
  847.             move.w        d0,(a1)
  848.             or.w        d1,-(a1)
  849.             rts
  850.  
  851. _n_ge_bitcount:
  852.             move.w        d1,d2
  853.             lsr.w        d0,d2
  854.             or.w        -(a1),d2
  855.  
  856.             lea         outrec(pc),a0
  857.             move.l        (a0),a1
  858.             move.b        d2,(a1)+
  859.  
  860.             subq.w        #8,d0
  861.             bge.b        _n_ge_charbit
  862.  
  863.             move.l        a1,(a0)+
  864.  
  865.             neg.w        d0
  866.             lsl.w        d0,d1
  867.  
  868.             lea.l        bitcount(pc),a1
  869.             move.w        d0,(a1)
  870.             move.w        d1,-(a1)
  871.  
  872.             subq.l        #1,(a0)
  873.             bpl.b        _no_ship
  874.             bra         shipout
  875.  
  876. _n_ge_charbit:
  877.             move.w        d1,d2
  878.             lsr.w        d0,d2
  879.  
  880.             move.b        d2,(a1)+
  881.             move.l        a1,(a0)+
  882.  
  883.             neg.w        d0
  884.             addq.w        #8,d0
  885.             lsl.w        d0,d1
  886.  
  887.             lea.l        bitcount(pc),a1
  888.             move.w        d0,(a1)
  889.             move.w        d1,-(a1)
  890.  
  891.             subq.l        #2,(a0)
  892.             bpl.b        _no_ship
  893.             bra         shipout
  894.  
  895. _no_ship:    rts
  896.  
  897.  
  898.             MACRO        putbits
  899.             LOCAL        _n_ge_bitcount
  900.             LOCAL        _n_ge_charbit
  901.             LOCAL        _exit
  902.  
  903.             lea.l        bitcount(pc),a1
  904.             sub.w        (a1),d0
  905.             bge.b        _n_ge_bitcount
  906.  
  907.             neg.w        d0
  908.             lsl.w        d0,d1
  909.             move.w        d0,(a1)
  910.             or.w        d1,-(a1)
  911.             bra.b        _exit
  912.  
  913. _n_ge_bitcount:
  914.             move.w        d1,d2
  915.             lsr.w        d0,d2
  916.             or.w        -(a1),d2
  917.  
  918.             lea         outrec(pc),a0
  919.             move.l        (a0),a2
  920.             move.b        d2,(a2)+
  921.  
  922.             subq.w        #8,d0
  923.             bge.b        _n_ge_charbit
  924.  
  925.             move.l        a2,(a0)+
  926.  
  927.             neg.w        d0
  928.             lsl.w        d0,d1
  929.  
  930.             move.w        d1,(a1)+
  931.             move.w        d0,(a1)
  932.  
  933.             subq.l        #1,(a0)
  934.             bpl.b        _exit
  935.             bsr         shipout
  936.             bra.b        _exit
  937.  
  938. _n_ge_charbit:
  939.             move.w        d1,d2
  940.             lsr.w        d0,d2
  941.  
  942.             move.b        d2,(a2)+
  943.             move.l        a2,(a0)+
  944.  
  945.             neg.w        d0
  946.             addq.w        #8,d0
  947.             lsl.w        d0,d1
  948.  
  949.             move.w        d1,(a1)+
  950.             move.w        d0,(a1)
  951.  
  952.             subq.l        #2,(a0)
  953.             bpl.b        _exit
  954.             bsr         shipout
  955. _exit:
  956.             ENDM
  957.  
  958.  
  959. send_block:    movem.l        D3-D7/A2-A6,-(SP)
  960.  
  961.             lea            c_freq(pc),A2
  962.             lea            text_buf,A3
  963.             lea            c_code(pc),A4
  964.             lea            c_len(pc),A5
  965.             lea               pt_code,A6
  966.  
  967.             pea            (A4)
  968.             movea.l        A5,A1
  969.             movea.l     A2,A0
  970.             move.w      #NC,D0
  971.             bsr               make_tree    ; make_tree(NC,freq,c_len,c_code)
  972.             addq.w        #4,SP
  973.  
  974.             move.w        D0,D3            ; k
  975.  
  976.             add.w       D0,D0
  977.             move.w      0(A2,D0.w),D4    ; size=c_freq[k]
  978.  
  979.             move.w      D4,D1
  980.             moveq.l     #16,D0
  981.             bsr            putbits            ; putbits(16,size)
  982.  
  983.             cmp.w       #NC,D3            ; k>=NC ?
  984.             bcs.s       k_lt_NC
  985.  
  986.             jsr               count_t_freq
  987.  
  988.             pea               (A6)
  989.             lea               pt_len(pc),A1
  990.             lea               t_freq,A0
  991.             moveq.l     #NT,D0
  992.             bsr            make_tree        ; make_tree(NT,t_freq,pt_len,pt_code)
  993.             addq.w        #4,SP
  994.  
  995.             move.w        D0,D3            ; k
  996.  
  997.             cmp.w        #NT,D3            ; k>=NT ?
  998.             bcs.s        k_lt_NT
  999.  
  1000.             moveq.l        #3,D2
  1001.             moveq.l        #5,D1
  1002.             moveq.l        #NT,D0
  1003.             jsr            write_pt_len    ; write_pt_len(NT,TBIT,3)
  1004.             jsr               write_c_len
  1005.             bra.s        _k_ge_NC
  1006.  
  1007. k_lt_NT:     moveq.l        #0,D1
  1008.             moveq.l     #5,D0
  1009.             bsr         putbits
  1010.  
  1011.             move.w        D3,D1
  1012.             moveq.l     #5,D0
  1013.             bsr         putbits
  1014.  
  1015.             jsr               write_c_len
  1016.             bra.s        _k_ge_NC
  1017.  
  1018. k_lt_NC:    moveq.l        #0,D1
  1019.             moveq.l        #8,D0
  1020.             bsr         putbits
  1021.  
  1022.             moveq.l        #0,D1
  1023.             moveq.l        #11,D0
  1024.             bsr            putbits
  1025.  
  1026.             move.w        D3,D1
  1027.             moveq.l     #9,D0
  1028.             bsr            putbits
  1029.  
  1030. _k_ge_NC:    pea            (A6)
  1031.             lea            pt_len(pc),A1
  1032.             lea         p_freq(pc),A0
  1033.             moveq.l     #NP,D0
  1034.             bsr         make_tree        ; make_tree(NP,p_freq,pt_len,pt_code)
  1035.             addq.w        #4,SP
  1036.  
  1037.             move.w        D0,D3            ; k
  1038.  
  1039.             cmp.w        #NP,D3            ; k>=NP ?
  1040.             bcs.s        k_lt_NP
  1041.  
  1042.             moveq.l        #-1,D2
  1043.             moveq.l        #4,D1
  1044.             moveq.l        #NP,D0
  1045.             jsr         write_pt_len    ; write_pt_len(NP,PBIT,-1)
  1046.             bra.s        _k_ge_NP
  1047.  
  1048. k_lt_NP:     moveq.l        #0,D1
  1049.             moveq.l        #4,D0
  1050.             bsr            putbits
  1051.  
  1052.             move.w        D3,D1
  1053.             moveq.l        #4,D0
  1054.             bsr            putbits
  1055.  
  1056. _k_ge_NP:    dbra        D4,i_loop
  1057.             bra            _send_exit
  1058.  
  1059. i_loop:        moveq.l        #0,d5        ; i
  1060.  
  1061. i_while:    add.w        D6,D6        ; flags<<=1
  1062.  
  1063.             moveq.l        #7,D0
  1064.             and.w        D5,D0
  1065.             bne.s        i_char_bit
  1066.  
  1067.             moveq.l        #0,D6
  1068.             move.b        (A3)+,D6    ; flags=*text_buf++
  1069.  
  1070. i_char_bit:    btst        #7,D6        ; flags&(1U<<(CHAR_BIT-1)) ?
  1071.             beq            _not_flags
  1072.  
  1073.             move.w        #256,D1
  1074.             move.b        (A3)+,D1        ; k=(*text_buf++)+(1U<<CHAR_BIT)
  1075.  
  1076.             moveq.l        #0,d0
  1077.             move.b        0(A5,D1.w),D0    ; c_len[k]
  1078.             add.w        D1,D1
  1079.             move.w        0(A4,D1.w),D1    ; c_code[k]
  1080.             bsr            putbits
  1081.  
  1082.             move.b        (A3)+,D3        ; k=(*text_buf++)<<CHAR_BIT
  1083.             lsl.w        #8,D3
  1084.             move.b        (A3)+,D3         ; k|=*text_buf++
  1085.  
  1086.             moveq.l        #15,d7            ; c
  1087. while_q:    btst        d7,d3            ; while (c>>=1)
  1088.             dbne        d7,while_q        ; c--
  1089.  
  1090.             addq.w        #1,d7
  1091.  
  1092.             move.w        D7,D0
  1093.             add.w        D0,D0
  1094.             move.w        0(A6,D0.w),D1    ; pt_code[c+1]
  1095.  
  1096.             moveq.l        #0,D0
  1097.             lea            pt_len(PC),A0
  1098.             move.b        0(A0,D7.w),D0    ; pt_len[c+1]
  1099.             putbits
  1100.  
  1101.             subq.w        #1,d7            ; c>1 ?
  1102.             bls            i_wend
  1103.  
  1104.             moveq.l        #-1,d1
  1105.             moveq.l        #16,d0
  1106.             sub.w        d7,d0
  1107.             lsr.w        D0,D1
  1108.             and.w        D3,D1            ; k&(0xFFFFU>>(17-c))
  1109.             move.w        d7,d0            ; c-1
  1110.             putbits
  1111.  
  1112.             addq.w        #1,D5            ; i++
  1113.             dbra        D4,i_while        ; i<size ?
  1114.             bra.s        _send_exit
  1115.  
  1116. _not_flags:    moveq.l        #0,D1
  1117.             move.b        (A3)+,D1        ; k=*text_buf++
  1118.  
  1119.             moveq.l        #0,D0
  1120.             move.b        0(A5,D1.w),D0    ; c_len[k]
  1121.             add.w        D1,D1
  1122.             move.w        0(A4,D1.w),D1    ; c_code[k]
  1123.             putbits
  1124.  
  1125. i_wend:        addq.w        #1,D5            ; i++
  1126.             dbra        D4,i_while        ; i<size ?
  1127.  
  1128. _send_exit:    move.w        #(NC>>2)-1,D5
  1129.             moveq.l        #0,D3
  1130.  
  1131.             lea            c_freq(pc),A2
  1132. c_freq_clr:    REPT        2
  1133.             move.l        D3,(A2)+
  1134.             ENDM
  1135.             dbra        D5,c_freq_clr
  1136.             move.l        D3,(A2)+
  1137.  
  1138.             lea         p_freq(pc),A2
  1139.             REPT        7
  1140.             move.l        D3,(A2)+
  1141.             ENDM
  1142.  
  1143.             movem.l        (SP)+,D3-D7/A2-A6
  1144.             rts
  1145.  
  1146. dec_j:        .DC.W    0
  1147. bitbuf:     .DC.W    0
  1148. subbitbuf:    .DC.W    0
  1149. bitcount:    .DC.W    0
  1150. compsize:    .DC.L    0
  1151. origsize:    .DC.L    0
  1152. i:            .DC.W    0
  1153. bsize:        .DC.W    0
  1154. bufptr:     .DC.L    0
  1155. bad_tab:    .DC.W    0
  1156.  
  1157.             .END
  1158.