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 od 2 do 6 bajtów z końca pliku w zależności od kompresora.

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

zobacz:
https://lz4.github.io/lz4/
https://github.com/lz4/lz4/releases/tag/v1.9.2
https://create.stephan-brumme.com/smallz4/
https://github.com/emmanuel-marty/lz4ultra