mirror of
https://github.com/A2osX/A2osX.git
synced 2024-08-27 22:29:18 +00:00
167 lines
3.2 KiB
Plaintext
167 lines
3.2 KiB
Plaintext
NEW
|
||
PREFIX /A2OSX.BUILD
|
||
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 /A2OSX.SRC/LIB/LIBPAK.S.LZ
|
||
ASM
|