A2osX/SHARED/X.UNPAK.S.txt

316 lines
5.4 KiB
Plaintext
Raw Normal View History

2019-09-24 15:25:07 +00:00
NEW
AUTO 3,1
.LIST OFF
*--------------------------------------
* ZPInBufPtr = Ptr to Shunk Data
* Header : 16 SHORT4
* 8 SHORT3
* ZPOutBufPtr = Ptr to Uncompressed Data
* ZPULen = Uncompressed length
*--------------------------------------
* ZPPtr1
* ZPPtr2
* ZPnCnt = !ZPULen
* ZPInMask
* ZPOutLastByte
*-OLD----------------------------------
* SHORT3 : 0 xxx
* SHORT4 : 10 xxxx
* REPn : 110 xxxx (1-16)
* BACKLINK : 1110 oooooooo OO llllll (3-66)
* STOREn : 1111 xxxx (1-16)
*--------------------------------------
X.Unpak lda ZPInBufPtr
clc
adc #24 skip SHORT4 & SHORT3
sta ZPPtr1
lda ZPInBufPtr+1
adc #0
sta ZPPtr1+1
lda ZPULen
eor #$ff
sta ZPnCnt
lda ZPULen+1
eor #$ff
sta ZPnCnt+1
lda #$80
sta ZPInMask
.1 lda ZPnCnt
ora ZPnCnt+1
bne .2
clc
rts
*--------------------------------------
.2 jsr X.Unpak.GetBitInC
bcs .3
* SHORT3 : 0 xxx
ldx #3
jsr X.Unpak.GetXBitInA
ora #$16 Skip SHORT4 (16 bytes)
bra .31
*--------------------------------------
.3 jsr X.Unpak.GetBitInC
bcs .4
* SHORT4 : 10 xxxx
ldx #4
jsr X.Unpak.GetXBitInA
.31 tay
lda (ZPInBufPtr),y
jsr X.Unpak.PutByte
bne .2
clc
rts
*--------------------------------------
.4 jsr X.Unpak.GetBitInC
bcs .5
* REPn : 110 xxxx
ldx #4
jsr X.Unpak.GetXBitInA
tay
lda ZPOutLastByte
.41 jsr X.Unpak.PutByte.1
beq .99
dey
bpl .41 +1
bra .1
.99 sec
rts
*--------------------------------------
.5 jsr X.Unpak.GetBitInC
bcs .6
* BACKLINK : 1110 oooooooo OO llllll
jsr X.Unpak.GetByteInA
clc
adc ZPOutBufPtr
sta ZPPtr2
php
ldx #2
jsr X.Unpak.GetXBitInA
plp
adc ZPOutBufPtr+1
sta ZPPtr2+1
jsr X.Unpak.GetByteInA
inc +1
inc +1
* inc +1
tay
.51 lda (ZPPtr2),y
jsr X.Unpak.PutByte
beq .99
dey
bpl .51 +1
bra .1
*--------------------------------------
* STOREn : 1111 cccc Byte Byte Byte ...
.6 ldx #4
jsr X.Unpak.GetXBitInA
tay
.61 jsr X.Unpak.GetByteInA
jsr X.Unpak.PutByte
beq .99
dey
bpl .61 +1
bra .1
.9 sec
rts
*-NEW----------------------------------
2019-09-24 15:33:18 +00:00
* STRINGn : 0 xxxx
2019-09-24 15:25:07 +00:00
* {
* BYTE8 : 0 xxxxxxxx
2019-09-24 15:33:18 +00:00
* SHORT8 : 10 xxx
* SHORT16 : 110 xxxx
* REPn : 111 xxxx (1-16)
2019-09-24 15:25:07 +00:00
* }
* BACKLINK : 1 oooooooo OOOO llllll (3-66)
*--------------------------------------
X.Unpak2 lda ZPInBufPtr
clc
2019-09-24 15:33:18 +00:00
adc #24 skip SHORTs
2019-09-24 15:25:07 +00:00
sta ZPPtr1
lda ZPInBufPtr+1
adc #0
sta ZPPtr1+1
lda ZPULen
eor #$ff
sta ZPnCnt
lda ZPULen+1
eor #$ff
sta ZPnCnt+1
lda #$80
sta ZPInMask
.1 lda ZPnCnt
ora ZPnCnt+1
bne .2
clc
rts
*--------------------------------------
.2 jsr X.Unpak.GetBitInC
bcs .3
* SHORT3 : 0 xxx
ldx #3
jsr X.Unpak.GetXBitInA
ora #$16 Skip SHORT4 (16 bytes)
bra .31
*--------------------------------------
.3 jsr X.Unpak.GetBitInC
bcs .4
* SHORT4 : 10 xxxx
ldx #4
jsr X.Unpak.GetXBitInA
.31 tay
lda (ZPInBufPtr),y
jsr X.Unpak.PutByte
bne .2
clc
rts
*--------------------------------------
.4 jsr X.Unpak.GetBitInC
bcs .5
* REPn : 110 xxxx
ldx #4
jsr X.Unpak.GetXBitInA
tay
lda ZPOutLastByte
.41 jsr X.Unpak.PutByte.1
beq .99
dey
bpl .41 +1
bra .1
.99 sec
rts
*--------------------------------------
.5 jsr X.Unpak.GetBitInC
bcs .6
* BACKLINK : 1110 oooooooo OO llllll
jsr X.Unpak.GetByteInA
clc
adc ZPOutBufPtr
sta ZPPtr2
php
ldx #2
jsr X.Unpak.GetXBitInA
plp
adc ZPOutBufPtr+1
sta ZPPtr2+1
jsr X.Unpak.GetByteInA
inc +1
inc +1
* inc +1
tay
.51 lda (ZPPtr2),y
jsr X.Unpak.PutByte
beq .99
dey
bpl .51 +1
bra .1
*--------------------------------------
* STOREn : 1111 cccc Byte Byte Byte ...
.6 ldx #4
jsr X.Unpak.GetXBitInA
tay
.61 jsr X.Unpak.GetByteInA
jsr X.Unpak.PutByte
beq .99
dey
bpl .61 +1
bra .1
.9 sec
rts
*--------------------------------------
X.Unpak.GetByteInA
ldx #8
X.Unpak.GetXBitInA
lda #0
.1 jsr X.Unpak.GetBitInC
rol
dex
bne .1
rts
*--------------------------------------
X.Unpak.GetBitInC
pha
clc
lda (ZPPtr1)
and ZPInMask
beq .1
sec
.1 php
lsr ZPInMask
bne .8
ror ZPInMask
inc ZPPtr1
bne .8
inc ZPPtr1+1
.8 plp
pla
rts
*--------------------------------------
X.Unpak.PutByte sta ZPOutLastByte
X.Unpak.PutByte.1
sta (ZPOutBufPtr)
inc ZPOutBufPtr
bne .1
inc ZPOutBufPtr+1
.1 inc ZPnCnt
bne .2
inc ZPnCnt+1
.2 rts
*--------------------------------------
.LIST ON
X.Unpak.Size .EQ *-X.Unpak
.LIST OFF
*--------------------------------------
MAN
SAVE USR/SRC/SHARED/X.UNPAK.S
LOAD USR/SRC/BIN/UNPAK.S
ASM