home *** CD-ROM | disk | FTP | other *** search
/ The Fred Fish Collection 1.5 / ffcollection-1-5-1992-11.iso / ff_progs / fileutil / scan.lha / src / maketbl.asm < prev    next >
Encoding:
Assembly Source File  |  1992-05-21  |  9.1 KB  |  360 lines

  1. ;
  2. ; Copyright © 1991, 1992 by Walter Rothe. You may freely use and modify this
  3. ; program, but not for commercial profit. A modest fee for distribution is
  4. ; allowed. Derivative works must be released with source along with the
  5. ; executable or provisions made to provide the user source, if requested.
  6. ; Uploading source to a major bulletin board system within 6 months of the
  7. ; time of the request satisfies this requirement. This copyright notice
  8. ; must not be deleted from the source.
  9. ;
  10. ;:ts=8
  11.         far     data
  12.         machine mc68020
  13. ;#include "lh5.h"
  14. ;
  15. ;int make_table(nchar, bitlen, tablebits, table)
  16. ;int nchar;
  17. ;uchar bitlen[];
  18. ;int tablebits;
  19. ;ushort table[];
  20. ;{
  21.         xdef    _make_table
  22. _make_table:
  23.         link    a5,#.2
  24.         movem.l .3,-(sp)
  25. ;        ushort count[17], weight[17], start[18], *p;
  26. ;        uint i, k, len, jutbits, avail, nextcode, mask;
  27. ;        register uint ch;
  28. ;        register ushort *nxtcptr, *endcptr;
  29. ;        register uchar *blp = &bitlen[0];
  30. ;        register uchar *blpend = &bitlen[nchar];
  31. ;
  32. ;        for (i = 1; i <= 16; i++) count[i] = 0;
  33.         move.l  12(a5),d3
  34.         move.l  8(a5),d4
  35.         add.l   12(a5),d4
  36.         move.l  #1,-112(a5)
  37. .10003
  38.         move.l  -112(a5),d0
  39.         add.l   d0,d0
  40.         lea     -34(a5),a0
  41.         clr.w   (a0,d0.l)
  42. .10001
  43.         add.l   #1,-112(a5)
  44.         cmp.l   #16,-112(a5)
  45.         bls     .10003
  46. .10002
  47. ;        for (; blp < blpend;) count[ *blp++ ]++;
  48.         lea     -34(a5),a0
  49.         move.l  #0,d0
  50.         move.l  d3,a1
  51.         bra     .10007
  52. .10006
  53.         move.b  (a1)+,d0
  54.         add.l   d0,d0
  55.         add.w   #1,(a0,d0.w)
  56. .10004
  57. .10007
  58.         cmp.l   d4,a1
  59.         bcs     .10006
  60. .10005
  61. ;
  62. ;        start[1] = 0;
  63.         clr.w   -102(a5)
  64. ;        for (i = 1; i <= 16; i++)
  65.         move.l  #1,-112(a5)
  66. .10010
  67. ;                start[i + 1] = start[i] + (count[i] << (16 - i));
  68.         move.l  -112(a5),d0
  69.         add.l   d0,d0
  70.         lea     -34(a5),a0
  71.         move.l  #0,d1
  72.         move.w  (a0,d0.l),d1
  73.         move.l  #16,d0
  74.         sub.l   -112(a5),d0
  75.         asl.l   d0,d1
  76.         move.l  -112(a5),d0
  77.         add.l   d0,d0
  78.         lea     -104(a5),a0
  79.         move.l  d1,-(sp)
  80.         move.l  #0,d1
  81.         move.w  (a0,d0.l),d1
  82.         move.l  (sp)+,d0
  83.         add.l   d1,d0
  84.         move.l  -112(a5),d1
  85.         add.l   d1,d1
  86.         lea     -102(a5),a0
  87.         move.w  d0,(a0,d1.l)
  88. .10008
  89.         add.l   #1,-112(a5)
  90.         cmp.l   #16,-112(a5)
  91.         bls     .10010
  92. .10009
  93. ;        if (start[17] != (ushort)((unsigned) 1 << 16))
  94. ;                message( "Bad decode table\n","");
  95.         tst.w   -70(a5)
  96.         beq     .10011
  97.         pea     .1+18
  98.         pea     .1+0
  99.         jsr     _message
  100. ;
  101. ;        jutbits = 16 - tablebits;
  102.         add.w   #8,sp
  103. .10011
  104.         move.l  #16,d0
  105.         sub.l   16(a5),d0
  106.         move.l  d0,-124(a5)
  107. ;        for (i = 1; i <= tablebits; i++) {
  108.         move.l  #1,-112(a5)
  109.         bra     .10015
  110. .10014
  111. ;                start[i] >>= jutbits;
  112.         move.l  -112(a5),d0
  113.         add.l   d0,d0
  114.         lea     -104(a5),a0
  115.         move.l  d0,a1
  116.         add.l   a0,a1
  117.         move.l  #0,d0
  118.         move.w  (a1),d0
  119.         move.l  -124(a5),d1
  120.         asr.l   d1,d0
  121.         move.w  d0,(a1)
  122. ;                weight[i] = (unsigned) 1 << (tablebits - i);
  123.         move.l  16(a5),d0
  124.         sub.l   -112(a5),d0
  125.         move.l  #1,d1
  126.         asl.l   d0,d1
  127.         move.l  -112(a5),d0
  128.         add.l   d0,d0
  129.         lea     -68(a5),a0
  130.         move.w  d1,(a0,d0.l)
  131. ;        }
  132. .10012
  133.         add.l   #1,-112(a5)
  134. .10015
  135.         move.l  -112(a5),d0
  136.         cmp.l   16(a5),d0
  137.         bls     .10014
  138. .10013
  139. ;        while (i <= 16) {
  140. .10016
  141.         cmp.l   #16,-112(a5)
  142.         bhi     .10017
  143. ;           weight[i] = (unsigned) 1 << (16 - i);
  144.         move.l  #16,d0
  145.         sub.l   -112(a5),d0
  146.         move.l  #1,d1
  147.         asl.l   d0,d1
  148.         move.l  -112(a5),d0
  149.         add.l   d0,d0
  150.         lea     -68(a5),a0
  151.         move.w  d1,(a0,d0.l)
  152. ;           i++;
  153.         add.l   #1,-112(a5)
  154. ;        }
  155.         bra     .10016
  156. .10017
  157. ;
  158. ;        i = start[tablebits + 1] >> jutbits;
  159.         move.l  16(a5),d0
  160.         add.l   d0,d0
  161.         lea     -102(a5),a0
  162.         move.l  #0,d1
  163.         move.w  (a0,d0.l),d1
  164.         move.l  -124(a5),d0
  165.         asr.l   d0,d1
  166.         move.l  d1,-112(a5)
  167. ;        if (i != (ushort)((unsigned) 1 << 16)) {
  168.         tst.l   -112(a5)
  169.         beq     .10018
  170. ;                k = 1 << tablebits;
  171.         move.l  #1,d0
  172.         move.l  16(a5),d1
  173.         asl.l   d1,d0
  174.         move.l  d0,-116(a5)
  175. ;                while (i != k) table[i++] = 0;
  176. .10019
  177.         move.l  -112(a5),d0
  178.         cmp.l   -116(a5),d0
  179.         beq     .10020
  180.         move.l  -112(a5),d0
  181.         add.l   #1,-112(a5)
  182.         add.l   d0,d0
  183.         move.l  20(a5),a0
  184.         clr.w   (a0,d0.l)
  185.         bra     .10019
  186. .10020
  187. ;        }
  188. ;
  189. ;        avail = nchar;
  190. .10018
  191.         move.l  8(a5),-128(a5)
  192. ;        mask = (unsigned) 1 << (15 - tablebits);
  193.         move.l  #15,d0
  194.         sub.l   16(a5),d0
  195.         move.l  #1,d1
  196.         asl.l   d0,d1
  197.         move.l  d1,-136(a5)
  198. ;        for (ch = 0; ch < nchar; ch++) {
  199.         move.l  #0,d2
  200.         bra     .10024
  201. .10023
  202. ;                if ((len = bitlen[ch]) == 0) continue;
  203.         move.l  12(a5),a0
  204.         move.l  #0,d0
  205.         move.b  (a0,d2.l),d0
  206.         move.l  d0,-120(a5)
  207.         beq     .10021
  208. ;                nextcode = start[len] + weight[len];
  209.         move.l  -120(a5),d0
  210.         add.l   d0,d0
  211.         lea     -104(a5),a0
  212.         move.l  #0,d1
  213.         move.w  (a0,d0.l),d1
  214.         move.l  -120(a5),d0
  215.         add.l   d0,d0
  216.         lea     -68(a5),a0
  217.         move.l  d1,-(sp)
  218.         move.l  #0,d1
  219.         move.w  (a0,d0.l),d1
  220.         move.l  (sp)+,d0
  221.         add.l   d1,d0
  222.         move.l  d0,-132(a5)
  223. ;                if (len <= tablebits) {
  224.         move.l  -120(a5),d0
  225.         cmp.l   16(a5),d0
  226.         bhi     .10025
  227. ;                        nxtcptr = table + start[len];
  228.         move.l  -120(a5),d0
  229.         add.l   d0,d0
  230.         lea     -104(a5),a0
  231.         move.l  #0,d1
  232.         move.w  (a0,d0.l),d1
  233.         add.l   d1,d1
  234.         move.l  d1,a2
  235.         add.l   20(a5),a2
  236. ;                        endcptr = table + nextcode;
  237.         move.l  -132(a5),d0
  238.         add.l   d0,d0
  239.         move.l  d0,a3
  240.         add.l   20(a5),a3
  241. ;                        for ( ; nxtcptr < endcptr;) *nxtcptr++ = ch;
  242.         bra     .10029
  243. .10028
  244.         move.w  d2,(a2)+
  245. .10026
  246. .10029
  247.         cmp.l   a3,a2
  248.         bcs     .10028
  249. .10027
  250. ;                } else {
  251.         bra     .10030
  252. .10025
  253. ;                        k = start[len];
  254.         move.l  -120(a5),d0
  255.         add.l   d0,d0
  256.         lea     -104(a5),a0
  257.         move.l  #0,d1
  258.         move.w  (a0,d0.l),d1
  259.         move.l  d1,-116(a5)
  260. ;                        p = &table[k >> jutbits];
  261.         move.l  -116(a5),d0
  262.         move.l  -124(a5),d1
  263.         lsr.l   d1,d0
  264.         add.l   d0,d0
  265.         add.l   20(a5),d0
  266.         move.l  d0,-108(a5)
  267. ;                        i = len - tablebits;
  268.         move.l  -120(a5),d0
  269.         sub.l   16(a5),d0
  270.         move.l  d0,-112(a5)
  271. ;                        while (i != 0) {
  272. .10031
  273.         tst.l   -112(a5)
  274.         beq     .10032
  275. ;                                if (*p == 0) {
  276.         move.l  -108(a5),a0
  277.         tst.w   (a0)
  278.         bne     .10033
  279. ;                                        right[avail] = left[avail] = 0;
  280.         move.l  -128(a5),d0
  281.         add.l   d0,d0
  282.         lea     _left,a0
  283.         clr.w   (a0,d0.l)
  284.         move.l  -128(a5),d0
  285.         add.l   d0,d0
  286.         lea     _right,a0
  287.         clr.w   (a0,d0.l)
  288. ;                                        *p = avail++;
  289.         move.l  -128(a5),d0
  290.         add.l   #1,-128(a5)
  291.         move.l  -108(a5),a0
  292.         move.w  d0,(a0)
  293. ;                                }
  294. ;                                if (k & mask) p = &right[*p];
  295. .10033
  296.         move.l  -116(a5),d0
  297.         and.l   -136(a5),d0
  298.         beq     .10034
  299.         move.l  -108(a5),a0
  300.         move.l  #0,d0
  301.         move.w  (a0),d0
  302.         add.l   d0,d0
  303.         lea     _right,a0
  304.         add.l   a0,d0
  305.         move.l  d0,-108(a5)
  306. ;                                else          p = &left[*p];
  307.         bra     .10035
  308. .10034
  309.         move.l  -108(a5),a0
  310.         move.l  #0,d0
  311.         move.w  (a0),d0
  312.         add.l   d0,d0
  313.         lea     _left,a0
  314.         add.l   a0,d0
  315.         move.l  d0,-108(a5)
  316. .10035
  317. ;                                k <<= 1;  i--;
  318.         move.l  -116(a5),d0
  319.         add.l   d0,d0
  320.         move.l  d0,-116(a5)
  321.         sub.l   #1,-112(a5)
  322. ;                        }
  323.         bra     .10031
  324. .10032
  325. ;                        *p = ch;
  326.         move.l  -108(a5),a0
  327.         move.w  d2,(a0)
  328. ;                }
  329. .10030
  330. ;                start[len] = nextcode;
  331.         move.l  -120(a5),d0
  332.         add.l   d0,d0
  333.         lea     -104(a5),a0
  334.         move.w  -130(a5),(a0,d0.l)
  335. ;        }
  336. .10021
  337.         add.l   #1,d2
  338. .10024
  339.         cmp.l   8(a5),d2
  340.         bcs     .10023
  341. .10022
  342. ;}
  343. .4
  344.         movem.l (sp)+,.3
  345.         unlk    a5
  346.         rts
  347. .2      equ     -136
  348. .3      reg     d2/d3/d4/a2/a3
  349. .1
  350.         dc.b    66,97,100,32,100,101,99,111,100,101,32,116,97,98,108
  351.         dc.b    101,10,0,0
  352.         ds      0
  353. ;
  354.         xref    _message
  355.         xref    .begin
  356.         dseg
  357.         xref    _right
  358.         xref    _left
  359.         end
  360.