mirror of
https://github.com/A2osX/A2osX.git
synced 2024-11-26 13:49: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
|