home *** CD-ROM | disk | FTP | other *** search
- ; update.a
- ;──────────────────────────────────────────────────────────────────────────────
- ; LHARC self extraction code for C64/C128 - Copyright 1990 Chris Smeets
- ;──────────────────────────────────────────────────────────────────────────────
- ; Update() is the function responsible for the majority of the execution time
- ; during extraction.
-
- INSTXT "sfx.i"
-
- EXT freq
- EXT prnt
- EXT son
- EXT Reconst
-
- PUBLIC Update
-
- PNT EQU T0 ; Zpage temps
- I EQU T1
- C EQU T2
- J EQU T3
- K EQU T4
- L EQU T5
- C2 EQU T6 ; 2*c
- L2 EQU T7 ; 2*l
-
- Update
- lda freq+Rstar2 ; if (freq[R] == 0x8000)
- cmp #<MAX_FREQ ; reconst();
- bne upd0
- lda freq+Rstar2+1
- cmp #>MAX_FREQ
- bne upd0
- txa
- pha
- tya
- pha
- jsr Reconst
- pla
- tay
- pla
- tax
-
- upd0 stx C
- sty C+1
- ldx #0
- ldy #1
- asl C
- rol C+1
- clc ; C = prnt[T+c]
- lda #<prnt+Tstar2
- adc C
- sta PNT
- lda #>prnt+Tstar2
- adc C+1
- sta PNT+1
- lda (PNT,x)
- asl a
- sta C
- lda (PNT),y
- rol a
- sta C+1
-
- do clc ; k = ++freq[c]
- lda #<freq
- adc C
- sta PNT
- lda #>freq
- adc C+1
- sta PNT+1
- clc
- lda (PNT,x)
- adc #1
- sta (PNT,x)
- sta K
- lda (PNT),y
- adc #0
- sta (PNT),y
- sta K+1
-
- if clc ; l = c+1
- lda C
- adc #2
- sta L
- lda C+1
- adc #0
- sta L+1
-
- clc
- lda L
- adc #<freq
- sta PNT ; if (k>freq[l])
- lda L+1
- adc #>freq
- sta PNT+1
- upd1 lda (PNT,x)
- cmp K
- lda (PNT),y
- sbc K+1
- bcc while
- jmp endif
-
- while clc ; while(k>freq[++l])
- lda L ; ;
- adc #2
- sta L
- bcc upd2
- inc L+1
- upd2 clc
- lda L
- adc #<freq
- sta PNT
- lda L+1
- adc #>freq
- sta PNT+1
- lda (PNT,x)
- cmp K
- lda (PNT),y
- sbc K+1
- bcc while
-
- sec
- lda L ; l--
- sbc #2
- sta L
- lda L+1
- sbc #0
- sta L+1
-
- clc ; freq[c] = freq[l]
- lda C
- adc #<freq
- sta C2
- lda C+1
- adc #>freq
- sta C2+1
- clc
- lda L
- adc #<freq
- sta L2
- lda L+1
- adc #>freq
- sta L2+1
- lda (L2,x)
- sta (C2,x)
- lda (L2),y
- sta (C2),y
-
- lda K ; freq[l] = k
- sta (L2,x)
- lda K+1
- sta (L2),y
-
- clc ; i=son[c]
- lda C
- adc #<son
- sta C2
- lda C+1
- adc #>son
- sta C2+1
- lda (C2,x)
- asl a
- sta I
- lda (C2),y
- rol a
- sta I+1
-
- clc ; prnt[i] = l
- lda I
- adc #<prnt
- sta PNT
- lda I+1
- adc #>prnt
- sta PNT+1
- lda L+1
- lsr a
- sta (PNT),y
- lda L
- ror a
- sta (PNT,x)
-
- lda I ; if (i<T)
- cmp #<Tstar2
- lda I+1
- sbc #>Tstar2
- bcs upd5 ; its not
- ldy #3 ; prnt[i+1] = l
- lda L+1
- lsr a
- sta (PNT),y
- dey
- lda L
- ror a
- sta (PNT),y
- dey
-
- upd5 clc ; j=son[l]
- lda L
- adc #<son
- sta L2
- lda L+1
- adc #>son
- sta L2+1
- lda (L2,x)
- asl a
- sta J
- lda (L2),y
- rol a
- sta J+1
-
- lda I+1 ; son[l] = i
- lsr a
- sta (L2),y
- lda I
- ror a
- sta (L2,x)
-
- clc ; prnt[j] = c
- lda J
- adc #<prnt
- sta PNT
- lda J+1
- adc #>prnt
- sta PNT+1
- lda C+1
- lsr a
- sta (PNT),y
- lda C
- ror a
- sta (PNT,x)
-
- lda J ; if (j<T)
- cmp #<Tstar2
- lda J+1
- sbc #>Tstar2
- bcs upd6
- ldy #3 ; prnt[j+1] = c
- lda C+1
- lsr a
- sta (PNT),y
- dey
- lda C
- ror a
- sta (PNT),y
- dey
-
- upd6 clc ; son[c] = j
- lda C
- adc #<son
- sta C2
- lda C+1
- adc #>son
- sta C2+1
- lda J+1
- lsr a
- sta (C2),y
- lda J
- ror a
- sta (C2,x)
-
- lda L+1 ; c = l
- sta C+1
- lda L
- sta C
- endif clc ; do { .. } while (c=prnt[c] != 0)
- lda C
- adc #<prnt
- sta C2
- lda C+1
- adc #>prnt
- sta C2+1
- lda (C2,x)
- sta C
- lda (C2),y
- sta C+1
- ora C
- beq finally
- asl C
- rol C+1
- jmp do
-
- finally rts
-
- END
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-