LZ4 decompressor

LZ4 I/O stream decompressor (132 bytes long, no ZeroPage use or 118 bytes using ZeroPage).

CODE: xxl, fox
ENTRY: destination adress store in DEST
unlz4
                  jsr    xBIOS_GET_BYTE                  ; length of literals
                  sta    token
               :4 lsr
                  beq    read_offset                     ; there is no literal
                  cmp    #$0f
                  jsr    getlength
literals          jsr    xBIOS_GET_BYTE
                  jsr    store
                  bne    literals
read_offset       jsr    xBIOS_GET_BYTE
                  tay
                  sec
                  eor    #$ff
                  adc    dest
                  sta    src
                  tya
                  php
                  jsr    xBIOS_GET_BYTE
                  plp
                  bne    not_done
                  tay
                  beq    unlz4_done
not_done          eor    #$ff
                  adc    dest+1
                  sta    src+1
                  ; c=1
                  lda    #$ff
token             equ    *-1
                  and    #$0f
                  adc    #$03                            ; 3+1=4
                  cmp    #$13
                  jsr    getLength

@                 lda    $ffff
src               equ    *-2
                  inw    src
                  jsr    store
                  bne    @-
                  beq    unlz4                           ; zawsze
store             sta    $ffff
dest              equ    *-2
                  inw    dest
                  dec    lenL
                  bne    unlz4_done
                  dec    lenH
unlz4_done        rts
getLength_next    jsr    xBIOS_GET_BYTE
                  tay
                  clc
                  adc    #$00
lenL              equ    *-1
                  bcc    @+
                  inc    lenH
@                 iny
getLength         sta    lenL
                  beq    getLength_next
                  tay
                  beq    @+
                  inc    lenH
@                 rts
lenH              .byte    $00


Jeśli dane znajdują się w pamięci a nie w pliku należy wymienić odwołania:
jsr xBIOS_GET_BYTE na jsr GET_BYTE
get_byte          lda    $ffff
source            equ    *-2
                  inw    source
                  rts

Jest to wariant dekompresora bez użycia komórek na stronie zerowej.

WAŻNE: Pomijamy nagłówek spakowanych danych (11 bajtów) oraz 6 bajtów z końca pliku.

                  opt    h- ; nie potrzeba naglowka DOS
                  ins    'TEST.LZ4',$0b,.FILESIZE 'TEST.LZ4'-$0b-$06