A2osX/LIB/LIBPAK.S.LZ.txt
2018-11-17 18:17:13 +01:00

167 lines
3.2 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

NEW
PREFIX
AUTO 4,1
.LIST OFF
*--------------------------------------
* Sliding Window = 4096
*--------------------------------------
WSIZE .EQ 4096 power of 2
*--------------------------------------
* Output BITSTREAM :
* 0 : Lit (8)
* 1 : Copy, L (4), P.HI (4), P.LO (8)
*--------------------------------------
Pak.LZ jsr Pak.In.Init Init SrcPtr,SrcCnt
jsr Pak.Out.Init
* future optimization, make P grows from 2 to 12 while increasing W size
* lda #2 Ptr width starts at 2 bits
* sta Pak.LZ.PWidth
* lda #%00000011 Ptr Mask Starts at %000000000011
* sta Pak.LZ.PMaskLO
* stz Pak.LZ.PMaskHI
lda #$ff
sta Pak.LZ.WCnt
sta Pak.LZ.WCnt+1 WCnt=!0
.1 jsr Pak.In.GetRH Z if EOF
beq .80
cmp #3
bcc .8 no more than 2 bytes left....store
cmp #19 more than 18 bytes left, limit to 18
bcc .2
lda #18
.2 tax X = Read ahead max size
lda ZPSrcPtr make ZPSrcWPtr=ZPSrcPtr
sta ZPSrcWPtr
lda ZPSrcPtr
sta ZPSrcWPtr
lda Pak.LZ.WCnt
sta ZPCnt
lda Pak.LZ.WCnt+1
sta ZPCnt+1
stz Pak.LZ.BestLen
.3 inc ZPCnt
bne .4
inc ZPCnt+1
beq .7 reached begining of window....store
lda ZPSrcWPtr make ZPSrcWPtr-=1
sec
sbc #1
sta ZPSrcWPtr
bcs .4
dec ZPSrcWPtr+1
.4 ldy #0
phx save Read ahead max size
.5 lda (ZPSrcPtr),y Try to find a match
cmp (ZPSrcWPtr),y
bne .6
iny
dex don't exceed 18 or Src Buffer
bne .5
.6 plx get back Read ahead max size
cpy #3 matched a least 3 chars ?
bcc .3 no....try one char back in Wnd
cpy Pak.LZ.BestLen better than last match ?
bcc .3 no....try one char back in Wnd
sty Pak.LZ.BestLen
lda ZPSrcWPtr
sta Pak.LZ.BestPtr
lda ZPSrcWPtr+1
sta Pak.LZ.BestPtr+1
bra .3
.7 lda Pak.LZ.BestLen do we match something ?
beq .8
lda Pak.LZ.BestPtr
sec
sbc ZPSrcPtr
sta Pak.LZ.BestPtr
lda Pak.LZ.BestPtr+1
sbc ZPSrcPtr+1
sta Pak.LZ.BestPtr+1
tya get len
dec Adjust range 0-15
dec
dec
ora Pak.LZ.BestPtr+1 merge with P.HI
sec
jsr Pak.Out.PutCA Put 9 bits 1+LLLL+PPPP
bcs .99
lda Pak.LZ.BestPtr Put 8 bits pppppppp
jsr Pak.Out.PutA
bcs .99
tya
bra .81
.8 lda (ZPSrcPtr)
clc
jsr Pak.Out.PutCA Put 9 bits 0+xxxxxxxx
bcs .99
lda #1
.81 jsr Pak.In.MoveFWA
tya
jsr LZ.MoveWndY
bra .3
bra .71
.80 clc
.99 rts
*--------------------------------------
Unpak.LZ
clc
rts
*--------------------------------------
LZ.MoveWndY tya
sec
sbc Pak.LZ.WCnt
tax
lda #0
sbc Pak.LZ.WCnt+1
cpx #WSIZE^$FF
sbc /WSIZE^$FF
bcs .1
ldx #WSIZE^$FF
lda /WSIZE^$FF
.1 stx Pak.LZ.WCnt
sta Pak.LZ.WCnt+1
rts
*--------------------------------------
MAN
SAVE USR/SRC/LIB/LIBPAK.S.LZ
ASM