home *** CD-ROM | disk | FTP | other *** search
- ; starthuf.a
- ;──────────────────────────────────────────────────────────────────────────────
- ; LHARChive self extraction module for C64/C128 - Copyright 1990 - Chris Smeets
- ;──────────────────────────────────────────────────────────────────────────────
- ; Initialize Huffman decoder
-
- INSTXT "sfx.i"
-
- EXT freq
- EXT son
- EXT prnt
-
- ;──────────────────────────────────────────
- ; void StartHuff()
- ; {
- ; static word i, j;
- ; for (i = 0; i < N_CHAR; i++) {
- ; freq[i] = 1;
- ; son[i] = i + T;
- ; prnt[i + T] = i;
- ; }
- ; i = 0; j = N_CHAR;
- ; while (j <= R) {
- ; freq[j] = freq[i] + freq[i + 1];
- ; son[j] = i;
- ; prnt[i] = prnt[i + 1] = j;
- ; i += 2; j++;
- ; }
- ; freq[T] = 0xffff;
- ; prnt[R] = 0;
- ; }
- ;──────────────────────────────────────────
-
- PUBLIC StartHuff
-
- I EQU T0
- J EQU T1
- FREQ EQU T2
- SON EQU T3
- PRNT EQU T4
- PNT EQU T5
-
- StartHuff
-
- ldx #<freq
- ldy #>freq
- stx FREQ
- sty FREQ+1
- ldx #<son
- ldy #>son
- stx SON
- sty SON+1
- clc ; Constant offset for prnt[]
- lda #<prnt
- adc #<Tstar2
- sta PRNT
- lda #>prnt
- adc #>Tstar2
- sta PRNT+1
-
- for1 lda #0 ; for(i=0;
- sta I
- sta I+1
- next1 lda I ; i<N_CHAR;
- cmp #<N_CHAR
- lda I+1
- sbc #>N_CHAR
- bcs endfor1
-
- ldx #0 ; freq[i] = 1;
- ldy #1
- tya
- sta (FREQ,x)
- txa
- sta (FREQ),y
- clc ; son[i] = i+T
- lda I
- sta (PRNT,x) ; prnt[i+T] = i
- adc #<T
- sta (SON,x)
- lda I+1
- sta (PRNT),y
- adc #>T
- sta (SON),y
-
- inc I ; i++
- bne lp1a
- inc I+1
- lp1a clc
- lda SON
- adc #2
- sta SON
- bcc lp1b
- inc SON+1
- lp1b clc
- lda PRNT
- adc #2
- sta PRNT
- bcc lp1c
- inc PRNT+1
- lp1c clc
- lda FREQ
- adc #2
- sta FREQ
- bcc lp1d
- inc FREQ+1
- lp1d jmp next1
-
-
- endfor1 lda #0 ; i=0; j=N_CHAR;
- sta I
- sta I+1
- lda #<N_CHAR
- sta J
- lda #>N_CHAR
- sta J+1
- asl J ; We'll work with offsets this time
- rol J+1
-
- while lda J ; while(j<=R) is same as while(j<T)
- cmp #<Tstar2
- lda J+1
- sbc #>Tstar2
- bcc w0
- jmp endwhile
-
- w0 clc ; freq[j] = freq[i]+freq[i+1];
- lda I
- adc #<freq
- sta FREQ
- lda I+1
- adc #>freq
- sta FREQ+1
- clc
- lda J
- adc #<freq
- sta PNT
- lda J+1
- adc #>freq
- sta PNT+1
- clc
- ldy #2
- lda (FREQ),y
- ldy #0
- adc (FREQ),y
- sta (PNT),y
- ldy #3
- lda (FREQ),y
- ldy #1
- adc (FREQ),y
- sta (PNT),y
-
- clc ; son[j] = i;
- lda #<son
- adc J
- sta SON
- lda #>son
- adc J+1
- sta SON+1
- lda I+1
- lsr a
- sta (SON),y
- lda I
- ror a
- sta (SON,x)
-
- clc ; prnt[i] = prnt[i+1] = j;
- lda I
- adc #<prnt
- sta PRNT
- lda I+1
- adc #>prnt
- sta PRNT+1
- lsr J+1
- ror J
- lda J
- sta (PRNT,x)
- ldy #2
- sta (PRNT),y
- lda J+1
- ldy #3
- sta (PRNT),y
- ldy #1
- sta (PRNT),y
-
- clc ; i+=2
- lda I
- adc #4
- sta I
- bcc w1
- inc I+1
- w1 inc J ; j++
- bne w2
- inc J+1
- w2 asl J ; Make it an offset again
- rol J+1
- jmp while
-
-
- endwhile clc ; freq[T] = 0xffff;
- lda #<freq
- adc #<Tstar2
- sta FREQ
- lda #>freq
- adc #>Tstar2
- sta FREQ+1
- ldy #1
- lda #$ff
- sta (FREQ,x)
- sta (FREQ),y
- clc ; prnt[R] = 0;
- lda #<prnt
- adc #<Rstar2
- sta PRNT
- lda #>prnt
- adc #>Rstar2
- sta PRNT+1
- txa
- sta (PRNT,x)
- sta (PRNT),y
- rts
-
-
-
- END
-