home *** CD-ROM | disk | FTP | other *** search
/ PC World 1997 November / PCWorld_1997-11_cd.bin / software / sharware / utility / PACKERS / LZH / LHASRC.EXE / MAKETBL_.ASM < prev    next >
Assembly Source File  |  1991-02-11  |  3KB  |  198 lines

  1. ;***********************************************
  2. ;    maketbl_.asm -- makes decoding table
  3. ;***********************************************
  4.             page    0, 128
  5.  
  6. include    amscls.inc
  7. $_init    GEN
  8.  
  9. TEXT    segment    byte    public    'CODE'
  10. TEXT    ends
  11.  
  12. DATA    segment word    public    'DATA'
  13. DATA    ends
  14.  
  15. BSS        segment word    public    'DATA'
  16. extrn    nchar:word
  17. extrn    bitlen:word
  18. extrn    tablebits:word
  19. extrn    table:word
  20. extrn    avail_mt:word
  21. extrn    len_cnt:word
  22. extrn    start:word
  23. extrn    weight:word
  24.  
  25. extrn    right_:word
  26. extrn    left_:word
  27. extrn    BROKENARC_:byte
  28. extrn    error_:near
  29. BSS        ends
  30.  
  31. DGROUP    group    DATA, BSS
  32.  
  33. TEXT    segment    byte    public    'CODE'
  34.         assume    cs:TEXT, ds:DGROUP
  35. ;---------------------------------------------------------------
  36. ;    void make_table(short nchar, uchar bitlen[],
  37. ;                             ax            bx
  38. ;                    short tablebits, ushort table[])
  39. ;                                 cx            dx
  40. ;---------------------------------------------------------------
  41.     public    make_table_
  42. make_table_    proc    near
  43.     push    cx
  44.     push    dx
  45.     push    si
  46.     push    di
  47.     push    bp
  48.  
  49.     mov        nchar, ax
  50.     shl        ax, 1
  51.     mov        avail_mt, ax
  52.     mov        bitlen, bx
  53.     mov        tablebits, cx
  54.     mov        table, dx
  55.  
  56.     push    ds
  57.     pop        es
  58.     cld
  59.  
  60. ;    /* clear len_cnt */
  61.     xor        ax, ax
  62.     mov        cx, 16
  63.     mov        di, offset DGROUP:len_cnt + 2
  64.     rep        stosw
  65.  
  66. ;    /* count bitlen into len_cnt */
  67.     xor        bx, bx
  68.     mov        cx, nchar
  69.     mov        si, bitlen
  70.     $_do
  71.         mov        bl, [si]
  72.         inc        si
  73.         shl        bx, 1
  74.         inc        len_cnt[bx]
  75.     $_until <LOOP>
  76.  
  77. ;    /* initialize weight, start, table */
  78.     mov        cx, tablebits
  79.     mov        bp, 1
  80.     shl        bp, cl
  81.     mov        bx, offset DGROUP:len_cnt + 2
  82.     mov        si, offset DGROUP:weight + 2
  83.     mov        di, offset DGROUP:start + 2
  84.     mov        ax, table
  85.     $_do
  86.         stosw
  87.         mov        dx, [bx]
  88.         add        bx, 2
  89.         shl        dx, cl
  90.         add        ax, dx
  91.         shr        bp, 1
  92.         mov        [si], bp
  93.         add        si, 2
  94.     $_until <LOOP>
  95.     push    ax
  96.     sub        ax, table
  97.     mov        cl, 15
  98.     sub        cx, tablebits
  99.     shl        ax, cl
  100.     shl        bp, cl
  101.     $_do
  102.         stosw
  103.         mov        dx, [bx]
  104.         add        bx, 2
  105.         shl        dx, cl
  106.         add        ax, dx
  107.         mov        [si], bp
  108.         add        si, 2
  109.         dec        cx
  110.     $_until <shr bp, 1>, Z
  111.     $_if <or ax, ax>, NZ
  112.         mov        ax, offset DGROUP:BROKENARC_
  113.         xor        bx, bx
  114.         call    error_
  115.     $_endif
  116.     pop        di
  117.     mov        ax, di
  118.     sub        ax, table
  119.     shr        ax, 1
  120.     mov        bx, 1
  121.     mov        cx, tablebits
  122.     shl        bx, cl
  123.     mov        cx, bx
  124.     sub        cx, ax
  125.     xor        ax, ax
  126.     rep        stosw
  127.  
  128. ;    /* make table & additional tree */
  129.     xor        ax, ax
  130.     $_do
  131.         mov        si, ax
  132.         add        si, bitlen
  133.         mov        bl, [si]
  134.  
  135.         or        bl, bl
  136.         jz        make_table_1
  137.         xor        bh, bh
  138.  
  139.         mov        dx, bx
  140.         shl        bx, 1
  141.         mov        di, start[bx]
  142.         mov        cx, weight[bx]
  143.         $_if <cmp dx, tablebits>, BE
  144.             rep        stosw
  145.             mov        start[bx], di
  146.         $_else
  147.             add        start[bx], cx
  148.  
  149.             mov        si, di
  150.             mov        bx, tablebits
  151.             mov        cl, 16
  152.             sub        cl, bl
  153.  
  154.             shr        di, cl
  155.             shl        di, 1
  156.             add        di, table
  157.  
  158.             mov        cl, bl
  159.             shl        si, cl
  160.  
  161.             xor        cx, cx
  162.             mov        cl, dl
  163.             sub        cx, tablebits
  164. ;        /* ìéé│ n é╠ tree é≡ì∞éΘ */
  165.             $_do
  166.                 $_if <cmp word ptr [di], 0>, E
  167. ;                /* Ä}é¬é▄é╛ëäé╤é─éóé╚é»éΩé╬ì∞éΘ */
  168.                     mov        bx, avail_mt
  169.                     mov        right_[bx], 0
  170.                     mov        left_[bx], 0
  171. ;;                    shr        bx, 1
  172.                     mov        [di], bx
  173.                     add        avail_mt, 2
  174.                 $_endif
  175.                 mov        di, [di]
  176. ;;                shl        di, 1
  177.                 $_if <shl si, 1>, C
  178.                     add        di, offset DGROUP:right_
  179.                 $_else
  180.                     add        di, offset DGROUP:left_
  181.                 $_endif
  182.             $_until <LOOP>
  183.             mov        [di], ax
  184.         $_endif
  185. make_table_1:
  186.         inc        ax
  187.     $_until <cmp ax, nchar>, AE
  188.  
  189.     pop        bp
  190.     pop        di
  191.     pop        si
  192.     pop        dx
  193.     pop        cx
  194.     ret
  195. make_table_    endp
  196. TEXT    ends
  197.         end
  198.