mirror of
https://github.com/A2osX/A2osX.git
synced 2024-11-28 10:52:33 +00:00
353 lines
6.0 KiB
Plaintext
353 lines
6.0 KiB
Plaintext
NEW
|
||
AUTO 3,1
|
||
*--------------------------------------
|
||
* ZPInBufPtr = Ptr to Shunk Data
|
||
* ZPOutBufPtr = Ptr to Uncompressed Data
|
||
*--------------------------------------
|
||
* ZPnCnt = !ZPULen
|
||
* ZPPtr1
|
||
* ZPPtr2
|
||
* ZPInMask
|
||
* ZPSTRLenBits
|
||
* ZPBLLenBits
|
||
* ZPBLOfsLBits
|
||
* ZPBLOfsHBits
|
||
* ZPTOPCnt
|
||
*--------------------------------------
|
||
X.UnArc jsr X.UnArc.GetByte ULEN LO
|
||
eor #$ff
|
||
sta ZPnCnt
|
||
|
||
jsr X.UnArc.GetByte ULEN HI
|
||
eor #$ff
|
||
sta ZPnCnt+1
|
||
|
||
jsr X.UnArc.GetByte TBLBITS LO
|
||
sta ZPPtr1
|
||
|
||
jsr X.UnArc.GetByte TBLBITS HI
|
||
sta ZPPtr1+1
|
||
ora ZPPtr1
|
||
bne X.UnArc.ARC
|
||
*--------------------------------------
|
||
X.UnArc.STORE ldx ZPnCnt !LEN LO
|
||
|
||
ldy #0
|
||
|
||
.1 inx
|
||
bne .2
|
||
|
||
inc ZPnCnt+1
|
||
beq .8
|
||
|
||
.2 lda (ZPInBufPtr),y
|
||
sta (ZPOutBufPtr),y
|
||
iny
|
||
bne .1
|
||
|
||
inc ZPInBufPtr+1
|
||
inc ZPOutBufPtr+1
|
||
|
||
bra .1
|
||
|
||
.8 clc
|
||
rts
|
||
*--------------------------------------
|
||
X.UnArc.ARC lda #$80
|
||
sta ZPTOPCnt Default to no TOP bytes...
|
||
sta ZPSTRLenBits ...and no long length for STR...
|
||
sta ZPBLLenBits ...and BL
|
||
sta ZPInMask Init Bit shifter
|
||
|
||
lda ZPPtr1+1
|
||
and #%01111111 -llloooo
|
||
beq .13 no BL/STR
|
||
|
||
lsr
|
||
lsr
|
||
lsr
|
||
lsr
|
||
sta ZPBLLenBits lll
|
||
|
||
lda ZPPtr1+1 ----oooo
|
||
and #%00001111
|
||
|
||
ldx #0
|
||
cmp #8
|
||
bcc .10
|
||
|
||
* sec
|
||
sbc #8
|
||
tax
|
||
lda #8
|
||
|
||
.10 sta ZPBLOfsLBits
|
||
stx ZPBLOfsHBits
|
||
|
||
lda ZPPtr1 sss-----
|
||
|
||
lsr
|
||
lsr
|
||
lsr
|
||
lsr
|
||
lsr
|
||
beq .13
|
||
|
||
sta ZPSTRLenBits
|
||
|
||
.13 lda ZPPtr1+1 c-------
|
||
asl
|
||
lda ZPPtr1 ---ccccc
|
||
and #%00011111
|
||
rol
|
||
beq X.UnArc.ARC.LOOP
|
||
|
||
sta ZPTOPCnt
|
||
|
||
ldx ZPInBufPtr ZPPtr1 = TOP table
|
||
stx ZPPtr1
|
||
ldx ZPInBufPtr+1
|
||
stx ZPPtr1+1
|
||
|
||
clc
|
||
adc ZPInBufPtr skip TOP table
|
||
sta ZPInBufPtr
|
||
bcc X.UnArc.ARC.LOOP
|
||
|
||
inc ZPInBufPtr+1
|
||
*--------------------------------------
|
||
X.UnArc.ARC.LOOP
|
||
bit ZPSTRLenBits
|
||
bpl X.UnArc.ARC.LOOPBL
|
||
|
||
.1 jsr X.UnArc.Single
|
||
bne .1
|
||
|
||
clc
|
||
rts
|
||
*--------------------------------------
|
||
X.UnArc.ARC.LOOPBL
|
||
jsr X.UnArc.GetBitInC
|
||
bcs .60 -> STRBL
|
||
|
||
jsr X.UnArc.Single
|
||
bne X.UnArc.ARC.LOOPBL
|
||
|
||
clc
|
||
rts
|
||
*--------------------------------------
|
||
* STRBL
|
||
*--------------------------------------
|
||
.60 jsr X.UnArc.GetBitInC
|
||
bcs .70 -> BL
|
||
*--------------------------------------
|
||
* STR
|
||
*--------------------------------------
|
||
* bit ZPSTRLenBits
|
||
* bmi .63 no long len
|
||
|
||
jsr X.UnArc.GetBitInC
|
||
bcs .61 -> Long Len
|
||
|
||
.63 ldx #ARC.B.SHORTSTR.W
|
||
jsr X.UnArc.GetXBitInA
|
||
|
||
clc
|
||
adc #STR.MIN
|
||
bra .62
|
||
|
||
.61 ldx ZPSTRLenBits
|
||
jsr X.UnArc.GetXBitInA
|
||
|
||
clc
|
||
adc #STR.MID
|
||
|
||
.62 pha STR len
|
||
|
||
jsr X.UnArc.Single
|
||
|
||
pla
|
||
dec
|
||
bne .62
|
||
|
||
.81 bra .80
|
||
*--------------------------------------
|
||
* BL
|
||
*--------------------------------------
|
||
.70 bit ZPBLLenBits
|
||
bmi .73 no long len
|
||
|
||
jsr X.UnArc.GetBitInC
|
||
bcs .71 -> Long Len
|
||
|
||
.73 ldx #ARC.B.SHORTBLL.W
|
||
jsr X.UnArc.GetXBitInA
|
||
|
||
clc
|
||
adc #BLL.MIN
|
||
bra .72
|
||
*--------------------------------------
|
||
.71 ldx ZPBLLenBits
|
||
jsr X.UnArc.GetXBitInA
|
||
|
||
clc
|
||
adc #BLL.MID
|
||
|
||
.72 sta ZPPtr2 save BL Len....
|
||
|
||
* BLOFS
|
||
pha
|
||
|
||
ldy #0
|
||
ldx ZPBLOfsHBits
|
||
beq .75
|
||
|
||
jsr X.UnArc.GetXBitInA
|
||
|
||
tay
|
||
|
||
.75 jsr X.UnArc.Get8BitInA YA=Offset
|
||
|
||
clc
|
||
adc ZPPtr2 ZPPtr2=BL Len+Offset
|
||
sta ZPPtr2
|
||
|
||
tya
|
||
adc #0
|
||
sta ZPPtr2+1
|
||
|
||
lda ZPOutBufPtr
|
||
sec
|
||
sbc ZPPtr2
|
||
sta ZPPtr2
|
||
|
||
lda ZPOutBufPtr+1
|
||
sbc ZPPtr2+1
|
||
sta ZPPtr2+1
|
||
|
||
plx Get Back BL Len
|
||
ldy #0
|
||
|
||
.76 lda (ZPPtr2),y
|
||
jsr X.UnArc.PutByte
|
||
|
||
iny
|
||
dex
|
||
bne .76
|
||
|
||
.80 lda ZPnCnt
|
||
and ZPnCnt+1
|
||
inc
|
||
beq .88
|
||
|
||
jmp X.UnArc.ARC.LOOPBL
|
||
|
||
.88 clc
|
||
rts
|
||
*--------------------------------------
|
||
X.UnArc.Single bit ZPTOPCnt
|
||
bmi .1 no TOP Table
|
||
|
||
jsr X.UnArc.GetBitInC
|
||
bcs .3 ->TOP0
|
||
*--------------------------------------
|
||
* RAW
|
||
*--------------------------------------
|
||
.1 jsr X.UnArc.Get8BitInA
|
||
bra X.UnArc.PutByte
|
||
*--------------------------------------
|
||
.3 jsr X.UnArc.GetBitInC
|
||
bcs .4 ->TOP8
|
||
*--------------------------------------
|
||
* TOP0/4
|
||
*--------------------------------------
|
||
ldx #ARC.B.TOP0.W-1
|
||
jsr X.UnArc.GetXBitInA
|
||
bra .51
|
||
*--------------------------------------
|
||
.4 jsr X.UnArc.GetBitInC
|
||
bcs .5 ->TOP16
|
||
*--------------------------------------
|
||
* TOP8
|
||
*--------------------------------------
|
||
ldx #ARC.B.TOP8.W-2
|
||
jsr X.UnArc.GetXBitInA
|
||
ora #%1000
|
||
bra .51
|
||
*--------------------------------------
|
||
* TOP16
|
||
*--------------------------------------
|
||
.5 ldx #ARC.B.TOP16.W-2
|
||
jsr X.UnArc.GetXBitInA
|
||
ora #%10000
|
||
|
||
.51 tay
|
||
lda (ZPPtr1),y
|
||
*--------------------------------------
|
||
* fall in PutByte
|
||
*--------------------------------------
|
||
X.UnArc.PutByte inc ZPnCnt
|
||
bne .1
|
||
|
||
inc ZPnCnt+1
|
||
beq .8
|
||
|
||
.1 sta (ZPOutBufPtr)
|
||
|
||
inc ZPOutBufPtr
|
||
bne .8
|
||
|
||
inc ZPOutBufPtr+1
|
||
|
||
.8 rts
|
||
*--------------------------------------
|
||
X.UnArc.Get8BitInA
|
||
ldx #8
|
||
X.UnArc.GetXBitInA
|
||
lda #0
|
||
|
||
.1 pha
|
||
jsr X.UnArc.GetBitInC
|
||
pla
|
||
rol
|
||
dex
|
||
bne .1
|
||
|
||
rts
|
||
*--------------------------------------
|
||
X.UnArc.GetBitInC
|
||
lda (ZPInBufPtr)
|
||
and ZPInMask
|
||
|
||
cmp #1 CC if bit=0
|
||
|
||
php
|
||
|
||
lsr ZPInMask
|
||
bcc .8
|
||
|
||
ror ZPInMask
|
||
|
||
jsr X.UnArc.NextByte
|
||
|
||
.8 plp
|
||
rts
|
||
*--------------------------------------
|
||
X.UnArc.GetByte lda (ZPInBufPtr)
|
||
X.UnArc.NextByte
|
||
inc ZPInBufPtr
|
||
bne .8
|
||
|
||
inc ZPInBufPtr+1
|
||
|
||
.8 rts
|
||
*--------------------------------------
|
||
.LIST ON
|
||
X.UnArc.Size .EQ *-X.UnArc
|
||
.LIST OFF
|
||
*--------------------------------------
|
||
MAN
|
||
SAVE usr/src/shared/x.unarc.s
|
||
LOAD usr/src/bin/unarc.s
|
||
ASM
|