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