A2osX/SHARED/X.UNPAK.S.txt
2019-09-24 17:33:18 +02:00

316 lines
5.4 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
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----------------------------------
* STRINGn : 0 xxxx
* {
* BYTE8 : 0 xxxxxxxx
* SHORT8 : 10 xxx
* SHORT16 : 110 xxxx
* REPn : 111 xxxx (1-16)
* }
* BACKLINK : 1 oooooooo OOOO llllll (3-66)
*--------------------------------------
X.Unpak2 lda ZPInBufPtr
clc
adc #24 skip SHORTs
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