home *** CD-ROM | disk | FTP | other *** search
- ;
- ; Copyright © 1991, 1992 by Walter Rothe. You may freely use and modify this
- ; program, but not for commercial profit. A modest fee for distribution is
- ; allowed. Derivative works must be released with source along with the
- ; executable or provisions made to provide the user source, if requested.
- ; Uploading source to a major bulletin board system within 6 months of the
- ; time of the request satisfies this requirement. This copyright notice
- ; must not be deleted from the source.
- ;
- ;:ts=8
- far data
- machine mc68020
- ;#include "lh5.h"
- ;
- ;int make_table(nchar, bitlen, tablebits, table)
- ;int nchar;
- ;uchar bitlen[];
- ;int tablebits;
- ;ushort table[];
- ;{
- xdef _make_table
- _make_table:
- link a5,#.2
- movem.l .3,-(sp)
- ; ushort count[17], weight[17], start[18], *p;
- ; uint i, k, len, jutbits, avail, nextcode, mask;
- ; register uint ch;
- ; register ushort *nxtcptr, *endcptr;
- ; register uchar *blp = &bitlen[0];
- ; register uchar *blpend = &bitlen[nchar];
- ;
- ; for (i = 1; i <= 16; i++) count[i] = 0;
- move.l 12(a5),d3
- move.l 8(a5),d4
- add.l 12(a5),d4
- move.l #1,-112(a5)
- .10003
- move.l -112(a5),d0
- add.l d0,d0
- lea -34(a5),a0
- clr.w (a0,d0.l)
- .10001
- add.l #1,-112(a5)
- cmp.l #16,-112(a5)
- bls .10003
- .10002
- ; for (; blp < blpend;) count[ *blp++ ]++;
- lea -34(a5),a0
- move.l #0,d0
- move.l d3,a1
- bra .10007
- .10006
- move.b (a1)+,d0
- add.l d0,d0
- add.w #1,(a0,d0.w)
- .10004
- .10007
- cmp.l d4,a1
- bcs .10006
- .10005
- ;
- ; start[1] = 0;
- clr.w -102(a5)
- ; for (i = 1; i <= 16; i++)
- move.l #1,-112(a5)
- .10010
- ; start[i + 1] = start[i] + (count[i] << (16 - i));
- move.l -112(a5),d0
- add.l d0,d0
- lea -34(a5),a0
- move.l #0,d1
- move.w (a0,d0.l),d1
- move.l #16,d0
- sub.l -112(a5),d0
- asl.l d0,d1
- move.l -112(a5),d0
- add.l d0,d0
- lea -104(a5),a0
- move.l d1,-(sp)
- move.l #0,d1
- move.w (a0,d0.l),d1
- move.l (sp)+,d0
- add.l d1,d0
- move.l -112(a5),d1
- add.l d1,d1
- lea -102(a5),a0
- move.w d0,(a0,d1.l)
- .10008
- add.l #1,-112(a5)
- cmp.l #16,-112(a5)
- bls .10010
- .10009
- ; if (start[17] != (ushort)((unsigned) 1 << 16))
- ; message( "Bad decode table\n","");
- tst.w -70(a5)
- beq .10011
- pea .1+18
- pea .1+0
- jsr _message
- ;
- ; jutbits = 16 - tablebits;
- add.w #8,sp
- .10011
- move.l #16,d0
- sub.l 16(a5),d0
- move.l d0,-124(a5)
- ; for (i = 1; i <= tablebits; i++) {
- move.l #1,-112(a5)
- bra .10015
- .10014
- ; start[i] >>= jutbits;
- move.l -112(a5),d0
- add.l d0,d0
- lea -104(a5),a0
- move.l d0,a1
- add.l a0,a1
- move.l #0,d0
- move.w (a1),d0
- move.l -124(a5),d1
- asr.l d1,d0
- move.w d0,(a1)
- ; weight[i] = (unsigned) 1 << (tablebits - i);
- move.l 16(a5),d0
- sub.l -112(a5),d0
- move.l #1,d1
- asl.l d0,d1
- move.l -112(a5),d0
- add.l d0,d0
- lea -68(a5),a0
- move.w d1,(a0,d0.l)
- ; }
- .10012
- add.l #1,-112(a5)
- .10015
- move.l -112(a5),d0
- cmp.l 16(a5),d0
- bls .10014
- .10013
- ; while (i <= 16) {
- .10016
- cmp.l #16,-112(a5)
- bhi .10017
- ; weight[i] = (unsigned) 1 << (16 - i);
- move.l #16,d0
- sub.l -112(a5),d0
- move.l #1,d1
- asl.l d0,d1
- move.l -112(a5),d0
- add.l d0,d0
- lea -68(a5),a0
- move.w d1,(a0,d0.l)
- ; i++;
- add.l #1,-112(a5)
- ; }
- bra .10016
- .10017
- ;
- ; i = start[tablebits + 1] >> jutbits;
- move.l 16(a5),d0
- add.l d0,d0
- lea -102(a5),a0
- move.l #0,d1
- move.w (a0,d0.l),d1
- move.l -124(a5),d0
- asr.l d0,d1
- move.l d1,-112(a5)
- ; if (i != (ushort)((unsigned) 1 << 16)) {
- tst.l -112(a5)
- beq .10018
- ; k = 1 << tablebits;
- move.l #1,d0
- move.l 16(a5),d1
- asl.l d1,d0
- move.l d0,-116(a5)
- ; while (i != k) table[i++] = 0;
- .10019
- move.l -112(a5),d0
- cmp.l -116(a5),d0
- beq .10020
- move.l -112(a5),d0
- add.l #1,-112(a5)
- add.l d0,d0
- move.l 20(a5),a0
- clr.w (a0,d0.l)
- bra .10019
- .10020
- ; }
- ;
- ; avail = nchar;
- .10018
- move.l 8(a5),-128(a5)
- ; mask = (unsigned) 1 << (15 - tablebits);
- move.l #15,d0
- sub.l 16(a5),d0
- move.l #1,d1
- asl.l d0,d1
- move.l d1,-136(a5)
- ; for (ch = 0; ch < nchar; ch++) {
- move.l #0,d2
- bra .10024
- .10023
- ; if ((len = bitlen[ch]) == 0) continue;
- move.l 12(a5),a0
- move.l #0,d0
- move.b (a0,d2.l),d0
- move.l d0,-120(a5)
- beq .10021
- ; nextcode = start[len] + weight[len];
- move.l -120(a5),d0
- add.l d0,d0
- lea -104(a5),a0
- move.l #0,d1
- move.w (a0,d0.l),d1
- move.l -120(a5),d0
- add.l d0,d0
- lea -68(a5),a0
- move.l d1,-(sp)
- move.l #0,d1
- move.w (a0,d0.l),d1
- move.l (sp)+,d0
- add.l d1,d0
- move.l d0,-132(a5)
- ; if (len <= tablebits) {
- move.l -120(a5),d0
- cmp.l 16(a5),d0
- bhi .10025
- ; nxtcptr = table + start[len];
- move.l -120(a5),d0
- add.l d0,d0
- lea -104(a5),a0
- move.l #0,d1
- move.w (a0,d0.l),d1
- add.l d1,d1
- move.l d1,a2
- add.l 20(a5),a2
- ; endcptr = table + nextcode;
- move.l -132(a5),d0
- add.l d0,d0
- move.l d0,a3
- add.l 20(a5),a3
- ; for ( ; nxtcptr < endcptr;) *nxtcptr++ = ch;
- bra .10029
- .10028
- move.w d2,(a2)+
- .10026
- .10029
- cmp.l a3,a2
- bcs .10028
- .10027
- ; } else {
- bra .10030
- .10025
- ; k = start[len];
- move.l -120(a5),d0
- add.l d0,d0
- lea -104(a5),a0
- move.l #0,d1
- move.w (a0,d0.l),d1
- move.l d1,-116(a5)
- ; p = &table[k >> jutbits];
- move.l -116(a5),d0
- move.l -124(a5),d1
- lsr.l d1,d0
- add.l d0,d0
- add.l 20(a5),d0
- move.l d0,-108(a5)
- ; i = len - tablebits;
- move.l -120(a5),d0
- sub.l 16(a5),d0
- move.l d0,-112(a5)
- ; while (i != 0) {
- .10031
- tst.l -112(a5)
- beq .10032
- ; if (*p == 0) {
- move.l -108(a5),a0
- tst.w (a0)
- bne .10033
- ; right[avail] = left[avail] = 0;
- move.l -128(a5),d0
- add.l d0,d0
- lea _left,a0
- clr.w (a0,d0.l)
- move.l -128(a5),d0
- add.l d0,d0
- lea _right,a0
- clr.w (a0,d0.l)
- ; *p = avail++;
- move.l -128(a5),d0
- add.l #1,-128(a5)
- move.l -108(a5),a0
- move.w d0,(a0)
- ; }
- ; if (k & mask) p = &right[*p];
- .10033
- move.l -116(a5),d0
- and.l -136(a5),d0
- beq .10034
- move.l -108(a5),a0
- move.l #0,d0
- move.w (a0),d0
- add.l d0,d0
- lea _right,a0
- add.l a0,d0
- move.l d0,-108(a5)
- ; else p = &left[*p];
- bra .10035
- .10034
- move.l -108(a5),a0
- move.l #0,d0
- move.w (a0),d0
- add.l d0,d0
- lea _left,a0
- add.l a0,d0
- move.l d0,-108(a5)
- .10035
- ; k <<= 1; i--;
- move.l -116(a5),d0
- add.l d0,d0
- move.l d0,-116(a5)
- sub.l #1,-112(a5)
- ; }
- bra .10031
- .10032
- ; *p = ch;
- move.l -108(a5),a0
- move.w d2,(a0)
- ; }
- .10030
- ; start[len] = nextcode;
- move.l -120(a5),d0
- add.l d0,d0
- lea -104(a5),a0
- move.w -130(a5),(a0,d0.l)
- ; }
- .10021
- add.l #1,d2
- .10024
- cmp.l 8(a5),d2
- bcs .10023
- .10022
- ;}
- .4
- movem.l (sp)+,.3
- unlk a5
- rts
- .2 equ -136
- .3 reg d2/d3/d4/a2/a3
- .1
- dc.b 66,97,100,32,100,101,99,111,100,101,32,116,97,98,108
- dc.b 101,10,0,0
- ds 0
- ;
- xref _message
- xref .begin
- dseg
- xref _right
- xref _left
- end
-