PackFire decompressor. (last update: 05/04/21)
CODE: xxl ENTRY: destination adress store in decompressing and compressed data addr in compressed_data
compressed_data equ $80
decompressing equ $82
copsrc equ $84
token equ $86
_IYL equ $87
_IYH equ $88
_L equ $89
_H equ $8a
_B equ $8b
PackFireTiny
lda compressed_data
sta sm_ix
clc
adc #$1a
sta compressed_data
lda compressed_data+1
sta sm_ix+1
adc #$00
sta compressed_data+1
ldy #$00
jsr _GET_BYTE
sta token
literal_copy
jsr _GET_BYTE
sta (decompressing),y
inw decompressing
main_loop jsr get_bit
bcs literal_copy
ldx #$ff
stx _IYL
get_index inc _IYL
jsr get_bit
bcc get_index
;c=1
ldx _IYL
cpx #$10
bne @+
rts ; koniec
@ jsr get_pair
ldx _IYL
stx sm_len_L
lda _IYH
sta sm_len_H
cpx #$02
beq r2
cpx #$01
beq r1
ldx #$10 ; 0 i >2
bne fin_cmp1
r1 ldx #$30 ; =1
lda #$02
bne fin_cmp
r2 ldx #$20 ; =2
fin_cmp1 lda #$04
fin_cmp stx sm_d0_L
sty sm_d0_H
sta _B
jsr get_bits
jsr get_pair
sec
lda decompressing
sbc _IYL
sta copsrc
lda decompressing+1
sbc _IYH
sta copsrc+1
ldx #$ff
sm_len_H equ *-1
beq Remainder
Page lda (copsrc),y
sta (decompressing),y
iny
bne Page
inc copsrc+1
inc decompressing+1
dex
bne Page
Remainder ldx #$ff
sm_len_L equ *-1
beq copyDone
copyByte lda (copsrc),y
sta (decompressing),y
iny
dex
bne copyByte
tya
clc
adc decompressing
sta decompressing
bcc copyDone
inc decompressing+1
copyDone ldy #$00
jmp main_loop
; ---------------------------------
get_pair inc _IYL ; zawsze < 256 ? y=0
calc_len_dist
tya
and #$0f
bne @+
sta _H
ldx #$01
stx _L
@ lsr @
php
tya
lsr @
tax
lda $ffff,x
sm_ix equ *-2
plp
bcc nibble
:4 lsr @
nibble and #$0f
sta _B
ldx _L
stx sm_d0_L
ldx _H
stx sm_d0_H
cmp #$08
bcc mn8
sbc #$08 ; c=1
tax
lda tab_bit,x ; D=n E=0
tax
lda #$00
beq @+
mn8 tax
lda tab_bit,x ; D=0 E=n
ldx #$00
@ clc
adc _L
sta _L
txa
adc _H
sta _H
iny
dec _IYL
bne calc_len_dist
ldy #$00
get_bits
sty _IYL
sty _IYH
inc _B
getting_bits
dec _B
beq _gb1
jsr get_bit
bcc @+
asl _IYL
rol _IYH
inc _IYL
bne getting_bits ; jmp
@ asl _IYL
rol _IYH
jmp getting_bits
_gb1 ;clc
lda #$ff
sm_d0_L equ *-1
adc _IYL
sta _IYL
lda #$ff
sm_d0_H equ *-1
adc _IYH
sta _IYH
rts
get_bit asl token
beq @+
rts
@ jsr _GET_BYTE
rol @
sta token
rts
_GET_BYTE lda (compressed_data),y
inw compressed_data
rts
tab_bit .byte $01,$02,$04,$08,$10,$20,$40,$80
zobacz:
https://www.pouet.net/prod.php?which=54840
https://www.cpcwiki.eu/forum/programming/dumb-question-15839-bitbuster-1-2/msg32069/#msg32069
