BitBuster decompressor

BitBuster decompressor. (last update: 07/07/21)

CODE: xxl
            mwa #packed_data BB_INPUT
            mwa #destination BB_OUTPUT
            jsr unBitBuster
; -------------------------------------

unBitBuster
        lda #$80
        sta token
        ldy #$00
depack_loop
	jsr getbits
	bcs output_compressed	;if set, we got lz77 compression
	jsr GET_BYTE
        jsr PUT_BYTE
	jmp depack_loop
output_compressed               ;handle compressed data
	jsr GET_BYTE
        sta offsL 		;get lowest 7 bits of offset, plus offset extension bit
output_match
	sty offsH
	asl @
	bcc output_match1	;no need to get extra bits if carry not set
	jsr getbits
	jsr rlbgetbits
	jsr rlbgetbits
	jsr rlbgetbits
	bcs output_match1	;since extension mark already makes bit 7 set
	asl offsL		;only clear it if the bit should be cleared
        lsr offsL
output_match1
	inc offsL
	bne @+
	inc offsH
@       lda #$00                ;return a gamma-encoded value
        sta lenH                ;initial length to 1
	ldx #$01                ;bitcount to 1
        stx lenL                ;determine number of bits used to encode value
get_gamma_value_size
	jsr getbits
	bcc get_gamma_value_size_end	;if bit not set, bitlength of remaining is known
	inx            			;increase bitcount
	bne get_gamma_value_size		;repeat...
get_gamma_value_bits
	jsr getbits
	rol lenL				;insert new bit
	rol lenH
get_gamma_value_size_end
	dex
        bne get_gamma_value_bits		;repeat if more bits to go
get_gamma_value_end
	inc lenL
        bne @+
        inc lenH		;length was stored as length-2 so correct this
@	bcs _ret               ; koniec
	lda BB_OUTPUT
	sec
	sbc #$ff
offsL   equ *-1
	sta copysrc
	lda BB_OUTPUT+1
	sbc #$ff
offsH   equ *-1
	sta copysrc+1
cop0    lda $ffff
copysrc equ *-2
        inw copysrc
        jsr PUT_BYTE
        lda #$ff
lenL    equ *-1
        bne @+
        dec lenH
@       dec lenL
        bne cop0
        lda #$ff
lenH    equ   *-1
        bne cop0
	jmp depack_loop
rlbgetbits
	rol offsH
getbits
	asl token               ; bez c
	bne _ret
	jsr GET_BYTE
        rol @                   ; c
	sta token
_ret	rts
token   .HE 00

GET_BYTE
	lda $ffff
BB_INPUT equ *-2
        inw BB_INPUT
        rts

PUT_BYTE
        sta $ffff
BB_OUTPUT equ *-2
        inw BB_OUTPUT
        rts