home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / enterprs / c128 / util / sfxsrc.arc / STARTHUF.A < prev    next >
Encoding:
Text File  |  1990-02-12  |  5.3 KB  |  226 lines

  1. ; starthuf.a
  2. ;──────────────────────────────────────────────────────────────────────────────
  3. ; LHARChive self extraction module for C64/C128 - Copyright 1990 - Chris Smeets
  4. ;──────────────────────────────────────────────────────────────────────────────
  5. ; Initialize Huffman decoder
  6.  
  7.             INSTXT "sfx.i"
  8.  
  9.             EXT freq
  10.             EXT son
  11.             EXT prnt
  12.  
  13. ;──────────────────────────────────────────
  14. ; void StartHuff()
  15. ; {
  16. ;     static  word i, j;
  17. ;     for (i = 0; i < N_CHAR; i++) {
  18. ;         freq[i] = 1;
  19. ;         son[i] = i + T;
  20. ;         prnt[i + T] = i;
  21. ;     }
  22. ;     i = 0; j = N_CHAR;
  23. ;     while (j <= R) {
  24. ;         freq[j] = freq[i] + freq[i + 1];
  25. ;         son[j] = i;
  26. ;         prnt[i] = prnt[i + 1] = j;
  27. ;         i += 2; j++;
  28. ;     }
  29. ;     freq[T] = 0xffff;
  30. ;     prnt[R] = 0;
  31. ; }
  32. ;──────────────────────────────────────────
  33.  
  34.             PUBLIC StartHuff
  35.  
  36. I           EQU T0
  37. J           EQU T1
  38. FREQ        EQU T2
  39. SON         EQU T3
  40. PRNT        EQU T4
  41. PNT         EQU T5
  42.  
  43. StartHuff
  44.  
  45.             ldx #<freq
  46.             ldy #>freq
  47.             stx FREQ
  48.             sty FREQ+1
  49.             ldx #<son
  50.             ldy #>son
  51.             stx SON
  52.             sty SON+1
  53.             clc                     ; Constant offset for prnt[]
  54.             lda #<prnt
  55.             adc #<Tstar2
  56.             sta PRNT
  57.             lda #>prnt
  58.             adc #>Tstar2
  59.             sta PRNT+1
  60.  
  61. for1        lda #0                  ; for(i=0;
  62.             sta I
  63.             sta I+1
  64. next1       lda I                   ;     i<N_CHAR;
  65.             cmp #<N_CHAR
  66.             lda I+1
  67.             sbc #>N_CHAR
  68.             bcs endfor1
  69.  
  70.             ldx #0                  ; freq[i] = 1;
  71.             ldy #1
  72.             tya
  73.             sta (FREQ,x)
  74.             txa
  75.             sta (FREQ),y
  76.             clc                     ; son[i] = i+T
  77.             lda I
  78.             sta (PRNT,x)            ; prnt[i+T] = i
  79.             adc #<T
  80.             sta (SON,x)
  81.             lda I+1
  82.             sta (PRNT),y
  83.             adc #>T
  84.             sta (SON),y
  85.  
  86.             inc I                   ; i++
  87.             bne lp1a
  88.             inc I+1
  89. lp1a        clc
  90.             lda SON
  91.             adc #2
  92.             sta SON
  93.             bcc lp1b
  94.             inc SON+1
  95. lp1b        clc
  96.             lda PRNT
  97.             adc #2
  98.             sta PRNT
  99.             bcc lp1c
  100.             inc PRNT+1
  101. lp1c        clc
  102.             lda FREQ
  103.             adc #2
  104.             sta FREQ
  105.             bcc lp1d
  106.             inc FREQ+1
  107. lp1d        jmp next1
  108.  
  109.  
  110. endfor1     lda #0                  ; i=0; j=N_CHAR;
  111.             sta I
  112.             sta I+1
  113.             lda #<N_CHAR
  114.             sta J
  115.             lda #>N_CHAR
  116.             sta J+1
  117.             asl J                   ; We'll work with offsets this time
  118.             rol J+1
  119.  
  120. while       lda J                   ; while(j<=R) is same as while(j<T)
  121.             cmp #<Tstar2
  122.             lda J+1
  123.             sbc #>Tstar2
  124.             bcc w0
  125.             jmp endwhile
  126.  
  127. w0          clc                     ; freq[j] = freq[i]+freq[i+1];
  128.             lda I
  129.             adc #<freq
  130.             sta FREQ
  131.             lda I+1
  132.             adc #>freq
  133.             sta FREQ+1
  134.             clc
  135.             lda J
  136.             adc #<freq
  137.             sta PNT
  138.             lda J+1
  139.             adc #>freq
  140.             sta PNT+1
  141.             clc
  142.             ldy #2
  143.             lda (FREQ),y
  144.             ldy #0
  145.             adc (FREQ),y
  146.             sta (PNT),y
  147.             ldy #3
  148.             lda (FREQ),y
  149.             ldy #1
  150.             adc (FREQ),y
  151.             sta (PNT),y
  152.  
  153.             clc                     ; son[j] = i;
  154.             lda #<son
  155.             adc J
  156.             sta SON
  157.             lda #>son
  158.             adc J+1
  159.             sta SON+1
  160.             lda I+1
  161.             lsr a
  162.             sta (SON),y
  163.             lda I
  164.             ror a
  165.             sta (SON,x)
  166.  
  167.             clc                     ; prnt[i] = prnt[i+1] = j;
  168.             lda I
  169.             adc #<prnt
  170.             sta PRNT
  171.             lda I+1
  172.             adc #>prnt
  173.             sta PRNT+1
  174.             lsr J+1
  175.             ror J
  176.             lda J
  177.             sta (PRNT,x)
  178.             ldy #2
  179.             sta (PRNT),y
  180.             lda J+1
  181.             ldy #3
  182.             sta (PRNT),y
  183.             ldy #1
  184.             sta (PRNT),y
  185.  
  186.             clc                     ; i+=2
  187.             lda I
  188.             adc #4
  189.             sta I
  190.             bcc w1
  191.             inc I+1
  192. w1          inc J                   ; j++
  193.             bne w2
  194.             inc J+1
  195. w2          asl J                   ; Make it an offset again
  196.             rol J+1
  197.             jmp while
  198.  
  199.  
  200. endwhile    clc                     ; freq[T] = 0xffff;
  201.             lda #<freq
  202.             adc #<Tstar2
  203.             sta FREQ
  204.             lda #>freq
  205.             adc #>Tstar2
  206.             sta FREQ+1
  207.             ldy #1
  208.             lda #$ff
  209.             sta (FREQ,x)
  210.             sta (FREQ),y
  211.             clc                     ; prnt[R] = 0;
  212.             lda #<prnt
  213.             adc #<Rstar2
  214.             sta PRNT
  215.             lda #>prnt
  216.             adc #>Rstar2
  217.             sta PRNT+1
  218.             txa
  219.             sta (PRNT,x)
  220.             sta (PRNT),y
  221.             rts
  222.  
  223.  
  224.  
  225.             END
  226.