A2osX/SHARED/X.ARC.S.txt
2023-11-12 14:20:15 +01:00

1558 lines
26 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
*--------------------------------------
* ZPInBufPtr = Ptr to Uncompressed Data
* ZPOutBufPtr = Ptr to Shunk Data
* Y,A = ULEN
*--------------------------------------
* ZPInBufPtr
* ZPOutBufPtr
* ZPBackPtr
* ZPStrPtr
*--------------------------------------
X.Arc >STYA X.Arc.ShnkOut+S.ARCSHNK.ULEN
eor #$ff
sta X.Arc.nCnt+1
sta X.Arc.nCntOut+1
tya
eor #$ff
sta X.Arc.nCnt
sta X.Arc.nCntOut
stz X.Arc.ShnkOut+S.ARCSHNK.TBLBITS
stz X.Arc.ShnkOut+S.ARCSHNK.TBLBITS+1
>LDYA ZPInBufPtr
>STYA X.Arc.InBufPtr
>LDYA ZPOutBufPtr
>STYA X.Arc.OutBufPtr
jsr X.Arc.Reset Reset counters
* PASS #1
stz X.Arc.STRLen
jsr X.Arc.Run1
lda #32 4 Bytes header
sta X.Arc.TBits
sta X.Arc.BLBits
sta X.Arc.TBLBits
jsr X.Arc.ComputeTBits
lda X.Arc.BLL.Max
beq .1
jsr X.Arc.ComputeBLBits
jsr X.Arc.ComputeTBLBits
.1 .DO DBG
jsr X.Arc.PrintDBG1
jsr X.Arc.PrintDBG2
.FIN
jsr X.Arc.Select
bcs .9
sta X.Arc.Alg
* PASS #2
>LDYA X.Arc.InBufPtr
>STYA ZPInBufPtr
>LDYA X.Arc.nCntOut
>STYA X.Arc.nCnt
stz X.Arc.STRLen
jsr X.Arc.Out.Init2 Initialize properly for first "PutBit" Call
bcs .9
jsr X.Arc.Run2
bcs .9
.DO DBG
jsr X.Arc.ComputeDBG3 Get exact output bit count...
.FIN
jsr X.Arc.Close ...before sending last FULL byte
bcs .9
.DO DBG
jsr X.Arc.PrintDBG3
>DEBUG
.FIN
jsr X.Arc.RestorePtrs
>LDYA X.Arc.CLen
ldx X.Arc.Alg
clc
rts
.9 jsr X.Arc.RestorePtrs
>LDYA X.Arc.ShnkOut+S.ARCSHNK.ULEN
ldx #0
sec
rts
*--------------------------------------
X.Arc.RestorePtrs
>LDYA X.Arc.InBufPtr
>STYA ZPInBufPtr
>LDYA X.Arc.OutBufPtr
>STYA ZPOutBufPtr
rts
*--------------------------------------
X.Arc.Reset ldx #X.Arc.ResetCnt
.1 stz X.Arc.ResetData-1,x
dex
bne .1
* ldx #0
.2 stz X.Arc.TopCntL,x
stz X.Arc.TopCntH,x
stz X.Arc.TopCntBLL,x
stz X.Arc.TopCntBLH,x
inx
bne .2
lda X.Arc.ShnkOut+S.ARCSHNK.ULEN+1
sta X.Arc.Bits+1
lda X.Arc.ShnkOut+S.ARCSHNK.ULEN
ldx #3
.3 asl
rol X.Arc.Bits+1
rol X.Arc.Bits+2
dex
bne .3
sta X.Arc.Bits
rts
*--------------------------------------
X.Arc.Run1 inc X.Arc.nCnt
bne .1
inc X.Arc.nCnt+1
beq X.Arc.StrStat 0 byte left, flush pending string
.1 jsr X.Arc.ScanBL
bcc .5
lda (ZPInBufPtr)
tax
inc X.Arc.TopCntBLL,x
bne .2
inc X.Arc.TopCntBLH,x
.2 inc X.Arc.TopCntL,x
bne .3
inc X.Arc.TopCntH,x
.3 inc X.Arc.STRLen
lda X.Arc.STRLen
cmp #STR.MAX
bcc .4
jsr X.Arc.StrStat Max Len string, flush
.4 inc ZPInBufPtr
bne X.Arc.Run1
inc ZPInBufPtr+1
bra X.Arc.Run1
*--------------------------------------
.5 jsr X.Arc.StrStat flush pending string
jsr X.Arc.BlStat
ldy X.Arc.BLLen
jsr X.Arc.StrSkipY
bcc .1
clc End Of InBuf
rts
*--------------------------------------
X.Arc.StrStat lda X.Arc.STRLen
tay
beq .8
cmp #STR.MIN
bcs .1
* clc
adc X.Arc.S.TB.Cnt
sta X.Arc.S.TB.Cnt
bcc .5
inc X.Arc.S.TB.Cnt+1
bra .5
.1 clc
adc X.Arc.STR.TB.Cnt
sta X.Arc.STR.TB.Cnt
bcc .2
inc X.Arc.STR.TB.Cnt+1
.2 lda X.Arc.STRLen
cmp X.Arc.STR.Max
bcc .3
sta X.Arc.STR.Max
.3 cmp #STR.MID
bcc .4
inc X.Arc.STR.LL.Cnt
bne .5
inc X.Arc.STR.LL.Cnt+1
bra .5
.4 inc X.Arc.STR.SL.Cnt
bne .5
inc X.Arc.STR.SL.Cnt+1
.5 ldy #0
.6 lda (ZPStrPtr),y
tax
inc X.Arc.TopCntL,x
bne .7
inc X.Arc.TopCntH,x
.7 iny
cpy X.Arc.STRLen
bne .6
stz X.Arc.STRLen
.8 rts
*--------------------------------------
X.Arc.StrSkipY tya
clc
adc ZPInBufPtr
sta ZPInBufPtr
bcc .1
inc ZPInBufPtr+1
.1 tya
clc
adc X.Arc.nCnt
sta X.Arc.nCnt
bcc .8
inc X.Arc.nCnt+1
beq .8 CS
clc
.8 rts
*--------------------------------------
X.Arc.BlStat lda X.Arc.BLLen
clc
adc X.Arc.BL.TB.Cnt
sta X.Arc.BL.TB.Cnt
bcc .10
inc X.Arc.BL.TB.Cnt+1
.10 lda X.Arc.BLLen
cmp X.Arc.BLL.Max
bcc .11
sta X.Arc.BLL.Max
.11 cmp #BLL.MID
bcc .12
inc X.Arc.BLL.LL.Cnt
bne .20
inc X.Arc.BLL.LL.Cnt+1
bra .20
.12 inc X.Arc.BLL.SL.Cnt
bne .20
inc X.Arc.BLL.SL.Cnt+1
* BLOFS
.20 >LDYA X.Arc.Ofs
cpy X.Arc.BLO.Max
pha
sbc X.Arc.BLO.Max+1
pla
bcc .21
>STYA X.Arc.BLO.Max
.21 jsr X.Arc.GetYABitCntInX
inc X.Arc.BLO.LO.cnt-1,x
bne .30
inc X.Arc.BLO.HI.cnt-1,x
.30 lda X.Arc.BLLen
.33 clc
adc X.Arc.Ofs
sta ZPBackPtr
lda #0
adc X.Arc.Ofs+1
sta ZPBackPtr+1
ldy #0
.34 lda (ZPBackPtr),y
tax
inc X.Arc.TopCntL,x
bne .35
inc X.Arc.TopCntH,x
.35 iny
cpy X.Arc.BLLen
bne .34
.8 rts
*--------------------------------------
X.Arc.ComputeTBits
ldy #0
.1 stz X.Arc.Cnt Init best score to 0
stz X.Arc.Cnt+1
sec
ror X.Arc.bStop
ldx #0
.2 lda X.Arc.TopCntH,x
bne .20
lda X.Arc.TopCntL,x
cmp #TOP.MIN.CNT
bcc .3
.20 stz X.Arc.bStop
lda X.Arc.Cnt
cmp X.Arc.TopCntL,x is it better at X
lda X.Arc.Cnt+1
sbc X.Arc.TopCntH,x
bcs .3 not better or equal...
stx X.Arc.Best save new score index...
lda X.Arc.TopCntL,x
sta X.Arc.Cnt ...and value
lda X.Arc.TopCntH,x
sta X.Arc.Cnt+1
.3 inx
bne .2
bit X.Arc.bStop
bmi .6
ldx X.Arc.Best
lda X.Arc.TOP.Widths,y
clc
adc #ARC.B.RAWTOP.W add ARC.B.TOP bits
.4 pha
lda X.Arc.TopCntL,x
clc
adc X.Arc.TBits
sta X.Arc.TBits
lda X.Arc.TopCntH,x
adc X.Arc.TBits+1
sta X.Arc.TBits+1
bcc .5
inc X.Arc.TBits+2
.5 pla
dec
bne .4
lda X.Arc.Best
sta X.Arc.TopT,y
tax
stz X.Arc.TopCntL,x Discard this entry
stz X.Arc.TopCntH,x
iny
cpy #TOP.MAX
bne .1
.6 sty X.Arc.TopTSize
lda #0
ldx #8 Add Top Table Size
jsr X.Arc.AddXtYA2TBits
ldx #0
.7 lda X.Arc.TopCntL,x
tay
ora X.Arc.TopCntH,x
beq .10
lda X.Arc.TopCntH,x
phx
ldx #ARC.B.RAWTOP.W+8 add ARC.B.RAW bit
jsr X.Arc.AddXtYA2TBits
plx
.10 inx
bne .7
rts
*--------------------------------------
X.Arc.AddXtYA2TBits
pha
txa
beq .9
.1 tya
clc
adc X.Arc.TBits
sta X.Arc.TBits
pla
pha
adc X.Arc.TBits+1
sta X.Arc.TBits+1
bcc .2
inc X.Arc.TBits+2
.2 dex
bne .1
.9 pla
rts
*--------------------------------------
X.Arc.ComputeBLBits
lda X.Arc.STR.Max
beq .10
sec
sbc #STR.MID
bcc .10
bne .13
inc
.13 jsr X.Arc.GetABitCntInX
stx X.Arc.STR.Bits
.10 lda X.Arc.BLL.Max
beq .40
sec
sbc #BLL.MID
bcc .30
bne .12
inc
.12 jsr X.Arc.GetABitCntInX
stx X.Arc.BLL.Bits
.30 >LDYA X.Arc.BLO.Max
jsr X.Arc.GetYABitCntInX
stx X.Arc.BLO.Bits
*--------------------------------------
.40 ldx #ARC.B.PREFIX.W+8
>LDYA X.Arc.S.TB.Cnt
jsr X.Arc.AddXtYA2BLBits
ldx #8
>LDYA X.Arc.STR.TB.Cnt
jsr X.Arc.AddXtYA2BLBits
* SLEN
lda X.Arc.STR.Bits
bne .50
ldx #ARC.B.PREFIX.W+ARC.B.STRBL.W+ARC.B.SHORTSTR.W
>LDYA X.Arc.STR.SL.Cnt
jsr X.Arc.AddXtYA2BLBits
bra .51
.50 clc
adc #ARC.B.PREFIX.W+ARC.B.STRBL.W+ARC.B.LEN.W
tax
>LDYA X.Arc.STR.LL.Cnt
jsr X.Arc.AddXtYA2BLBits
ldx #ARC.B.PREFIX.W+ARC.B.STRBL.W+ARC.B.LEN.W+ARC.B.SHORTSTR.W
>LDYA X.Arc.STR.SL.Cnt
jsr X.Arc.AddXtYA2BLBits
* BLLEN
.51 lda X.Arc.BLL.Bits
bne .60
ldx #ARC.B.PREFIX.W+ARC.B.STRBL.W+ARC.B.SHORTBLL.W
>LDYA X.Arc.BLL.SL.Cnt
jsr X.Arc.AddXtYA2BLBits
bra .61
.60 clc
adc #ARC.B.PREFIX.W+ARC.B.STRBL.W+ARC.B.LEN.W
tax
>LDYA X.Arc.BLL.LL.Cnt
jsr X.Arc.AddXtYA2BLBits
ldx #ARC.B.PREFIX.W+ARC.B.STRBL.W+ARC.B.LEN.W+ARC.B.SHORTBLL.W
>LDYA X.Arc.BLL.SL.Cnt
jsr X.Arc.AddXtYA2BLBits
* BLOFS
.61 ldx #12
.62 phx
ldy X.Arc.BLO.LO.cnt-1,x
lda X.Arc.BLO.HI.cnt-1,x
ldx X.Arc.BLO.Bits
jsr X.Arc.AddXtYA2BLBits
plx
dex
bne .62
rts
X.Arc.AddXtYA2BLBits
pha
txa
beq .9
.1 tya
clc
adc X.Arc.BLBits
sta X.Arc.BLBits
pla
pha
adc X.Arc.BLBits+1
sta X.Arc.BLBits+1
bcc .2
inc X.Arc.BLBits+2
.2 dex
bne .1
.9 pla
rts
*--------------------------------------
X.Arc.ComputeTBLBits
ldy #0
.1 stz X.Arc.Cnt Init best score to 0
stz X.Arc.Cnt+1
sec
ror X.Arc.bStop
ldx #0
.2 lda X.Arc.TopCntBLH,x
bne .20
lda X.Arc.TopCntBLL,x
cmp #TOP.MIN.CNT
bcc .3
.20 stz X.Arc.bStop
lda X.Arc.Cnt
cmp X.Arc.TopCntBLL,x is it better at X
lda X.Arc.Cnt+1
sbc X.Arc.TopCntBLH,x
bcs .3 not better or equal...
stx X.Arc.Best save new score index...
lda X.Arc.TopCntBLL,x
sta X.Arc.Cnt ...and value
lda X.Arc.TopCntBLH,x
sta X.Arc.Cnt+1
.3 inx
bne .2
bit X.Arc.bStop
bmi .6
ldx X.Arc.Best
lda X.Arc.TOP.Widths,y
clc
adc #ARC.B.RAWTOP.W add ARC.B.TOP bit
.4 pha
lda X.Arc.TopCntBLL,x
clc
adc X.Arc.TBLBits
sta X.Arc.TBLBits
lda X.Arc.TopCntBLH,x
adc X.Arc.TBLBits+1
sta X.Arc.TBLBits+1
bcc .5
inc X.Arc.TBLBits+2
.5 pla
dec
bne .4
lda X.Arc.Best
sta X.Arc.TopTBL,y
tax
stz X.Arc.TopCntBLL,x Discard this entry
stz X.Arc.TopCntBLH,x
iny
cpy #TOP.MAX
bne .1
.6 sty X.Arc.TopTBLSize
lda #0
ldx #8
jsr X.Arc.AddXtYA2TBLBits
ldx #0
.7 lda X.Arc.TopCntBLL,x
tay
ora X.Arc.TopCntBLH,x
beq .10
lda X.Arc.TopCntBLH,x
phx
ldx #ARC.B.RAWTOP.W+8 add ARC.B.RAW bit
jsr X.Arc.AddXtYA2TBLBits
plx
.10 inx
bne .7
X.Arc.ComputeBLBits4TBL
ldx #ARC.B.PREFIX.W add ARC.B.SINGLE bits
>LDYA X.Arc.S.TB.Cnt
jsr X.Arc.AddXtYA2TBLBits
* SLEN
lda X.Arc.STR.Bits
bne .50
ldx #ARC.B.PREFIX.W+ARC.B.STRBL.W+ARC.B.SHORTSTR.W
>LDYA X.Arc.STR.SL.Cnt
jsr X.Arc.AddXtYA2TBLBits
bra .51
.50 clc
adc #ARC.B.PREFIX.W+ARC.B.STRBL.W+ARC.B.LEN.W
tax
>LDYA X.Arc.STR.LL.Cnt
jsr X.Arc.AddXtYA2TBLBits
ldx #ARC.B.PREFIX.W+ARC.B.STRBL.W+ARC.B.LEN.W+ARC.B.SHORTSTR.W
>LDYA X.Arc.STR.SL.Cnt
jsr X.Arc.AddXtYA2TBLBits
* BLLEN
.51 lda X.Arc.BLL.Bits
bne .60
ldx #ARC.B.PREFIX.W+ARC.B.STRBL.W+ARC.B.SHORTBLL.W
>LDYA X.Arc.BLL.SL.Cnt
jsr X.Arc.AddXtYA2TBLBits
bra .61
.60 clc
adc #ARC.B.PREFIX.W+ARC.B.STRBL.W+ARC.B.LEN.W
tax
>LDYA X.Arc.BLL.LL.Cnt
jsr X.Arc.AddXtYA2TBLBits
ldx #ARC.B.PREFIX.W+ARC.B.STRBL.W+ARC.B.LEN.W+ARC.B.SHORTBLL.W
>LDYA X.Arc.BLL.SL.Cnt
jsr X.Arc.AddXtYA2TBLBits
* BLOFS
.61 ldx #12
.62 phx
ldy X.Arc.BLO.LO.cnt-1,x
lda X.Arc.BLO.HI.cnt-1,x
ldx X.Arc.BLO.Bits
jsr X.Arc.AddXtYA2TBLBits
plx
dex
bne .62
rts
*--------------------------------------
X.Arc.AddXtYA2TBLBits
pha
txa
beq .9
.1 tya
clc
adc X.Arc.TBLBits
sta X.Arc.TBLBits
pla
pha
adc X.Arc.TBLBits+1
sta X.Arc.TBLBits+1
bcc .2
inc X.Arc.TBLBits+2
.2 dex
bne .1
.9 pla
rts
*--------------------------------------
X.Arc.Select stz X.Arc.bScanBL
ldx #0
ldy #4
.1 lda X.Arc.Bits,y
cmp X.Arc.Bits,x
lda X.Arc.Bits+1,y
sbc X.Arc.Bits+1,x
lda X.Arc.Bits+2,y
sbc X.Arc.Bits+2,x
bcs .2
tya
tax
.2 iny
iny
iny
iny
cpy #16
bne .1
* ldx #4
txa
beq .9 CS
lda #0
cpx #8 < BL,TBL ?
bcc .3 only T
lda X.Arc.BLL.Bits
asl
asl
asl
asl
ora X.Arc.BLO.Bits
sta X.Arc.ShnkOut+S.ARCSHNK.TBLBITS+1
lda X.Arc.STR.Bits
asl
asl
asl
asl
asl
sta X.Arc.ShnkOut+S.ARCSHNK.TBLBITS
dec X.Arc.bScanBL
cpx #8 only BL ?
beq .8
bra .5 TBL
.3 ldy X.Arc.TopTSize
.4 lda X.Arc.TopT-1,y
sta X.Arc.ShnkOut+S.ARCSHNK.TOPBYTES-1,y
dey
bne .4
lda X.Arc.TopTSize
bra .7
.5 ldy X.Arc.TopTBLSize
.6 lda X.Arc.TopTBL-1,y
sta X.Arc.ShnkOut+S.ARCSHNK.TOPBYTES-1,y
dey
bne .6
lda X.Arc.TopTBLSize
.7 sta X.Arc.TopSize
lsr
tsb X.Arc.ShnkOut+S.ARCSHNK.TBLBITS
lda #0
ror
tsb X.Arc.ShnkOut+S.ARCSHNK.TBLBITS+1
.8 txa X=4,8 or 12
lsr
clc
rts
.9 lda #E.BUF
* sec
rts
*--------------------------------------
X.Arc.Out.Init2 ldy #0
.1 lda X.Arc.ShnkOut,y
jsr X.Arc.PutByte
bcs .9
iny
cpy #S.ARCSHNK.TOPBYTES
bne .1
ldx X.Arc.TopSize
beq .8
.2 lda X.Arc.ShnkOut,y
jsr X.Arc.PutByte
bcs .9
iny
dex
bne .2
.8 lda #$80
sta X.Arc.OutMask
stz X.Arc.OutByte
clc
.9 rts
*--------------------------------------
X.Arc.Run2
* >DEBUG
bit X.Arc.bScanBL
bmi X.Arc.Run2BLTBL
X.Arc.Run2T inc X.Arc.nCnt
bne .1
inc X.Arc.nCnt+1
beq .8 0 byte left...
.1 lda (ZPInBufPtr)
jsr X.Arc.PutByte8
bcs .9
inc ZPInBufPtr
bne X.Arc.Run2T
inc ZPInBufPtr+1
bra X.Arc.Run2T
.8 clc
.9 rts
X.Arc.Run2BLTBL inc X.Arc.nCnt
bne .1
inc X.Arc.nCnt+1
beq .8
.1 jsr X.Arc.ScanBL
bcc .5
lda X.Arc.STRLen
bne .2
lda ZPInBufPtr
sta ZPStrPtr
lda ZPInBufPtr+1
sta ZPStrPtr+1
inc X.Arc.STRLen
bra .3
.2 inc
sta X.Arc.STRLen
cmp #STR.MAX
bcc .3
jsr X.Arc.PutSTR
bcs .9
.3 inc ZPInBufPtr
bne X.Arc.Run2BLTBL
inc ZPInBufPtr+1
bra X.Arc.Run2BLTBL
*--------------------------------------
.5 jsr X.Arc.PutSTR
bcs .9
jsr X.Arc.PutBL
bcs .9
lda X.Arc.BLLen
clc
adc ZPInBufPtr
sta ZPInBufPtr
bcc .6
inc ZPInBufPtr+1
.6 lda X.Arc.BLLen
clc
adc X.Arc.nCnt
sta X.Arc.nCnt
bcc .1
inc X.Arc.nCnt+1
bmi .1
.8 jmp X.Arc.PutSTR
.9 rts
*--------------------------------------
X.Arc.ScanBL lda ZPInBufPtr
sec
sbc #BLO.WINDOW
tax
lda ZPInBufPtr+1
sbc /BLO.WINDOW
pha
cpx X.Arc.InBufPtr
sbc X.Arc.InBufPtr+1
pla
bcs .10
ldx X.Arc.InBufPtr Start at beginning of Src buf
lda X.Arc.InBufPtr+1
.10 stx ZPBackPtr
sta ZPBackPtr+1
stz X.Arc.BLLen Nothing found yet
.1 lda ZPBackPtr
sec
sbc ZPInBufPtr
sta X.Arc.OfsWnCnt
lda ZPBackPtr+1
sbc ZPInBufPtr+1
sta X.Arc.OfsWnCnt+1 ZPBackPtr < !OfsWnCnt < ZPInBufPtr
bcs .8 ZPBackPtr = ZPInBufPtr, exit
>LDYA X.Arc.nCnt make sure not going past End Buffer
>STYA X.Arc.OfsBnCnt while reading ahead...
ldy #0 ...or Y = BL.MAX
.2 inc X.Arc.OfsWnCnt
bne .3
inc X.Arc.OfsWnCnt+1
beq .6 ZPBackPtr = ZPInBufPtr
.3 inc X.Arc.OfsBnCnt
bne .4
inc X.Arc.OfsBnCnt+1
beq .6 Last Src Data
.4 lda (ZPInBufPtr),y
cmp (ZPBackPtr),y
bne .6 End of string matching
.5 iny
cpy #BLL.MAX
bne .2 Max BL len
.6 cpy #BLL.MIN
bcc .7 not long enough
cpy X.Arc.BLLen
bcc .7 not better ...
* beq .7 !!! same...but closer !!!
sty X.Arc.BLLen
tya
clc
adc ZPBackPtr
sta X.Arc.Ofs
lda ZPBackPtr+1
adc #0
sta X.Arc.Ofs+1 Make X.Arc.Ofs pointing to the END
lda ZPInBufPtr
sec
sbc X.Arc.Ofs
sta X.Arc.Ofs
lda ZPInBufPtr+1
sbc X.Arc.Ofs+1
sta X.Arc.Ofs+1
.7 inc ZPBackPtr
bne .1
inc ZPBackPtr+1
bra .1
.8 lda X.Arc.BLLen exit with result flag in C
beq .9 no BL CS
clc
.9 rts
*--------------------------------------
X.Arc.GetYABitCntInX
tax
beq .2
ldx #17 BitCnt = bc(A) + 8
.1 dex
asl
bcc .1
.9 rts
.2 tya BitCnt = bc(Y)
beq .9
*--------------------------------------
X.Arc.GetABitCntInX
ldx #9
.1 dex
asl
bcc .1
rts
*--------------------------------------
X.Arc.PutSTR lda X.Arc.STRLen
beq .8
cmp #STR.MIN
bcs .3
.1 ldx #ARC.B.PREFIX.W
lda #ARC.B.SINGLE
jsr X.Arc.PutXBits
bcs .9
lda (ZPStrPtr)
jsr X.Arc.PutByte8
bcs .9
inc ZPStrPtr
bne .2
inc ZPStrPtr+1
.2 dec X.Arc.STRLen
bne .1
* clc
rts
*--------------------------------------
.3 ldx #ARC.B.PREFIX.W
lda #ARC.B.STRBL
jsr X.Arc.PutXBits
bcs .9
ldx #ARC.B.STRBL.W
lda #ARC.B.STR
jsr X.Arc.PutXBits
bcs .9
lda X.Arc.STR.Bits
beq .5
lda X.Arc.STRLen
cmp #STR.MID
bcc .4
ldx #ARC.B.LEN.W
lda #ARC.B.LONG.B
jsr X.Arc.PutXBits
bcs .9
lda X.Arc.STRLen
sec
sbc #STR.MID
ldx X.Arc.STR.Bits
jsr X.Arc.PutXBits
bcs .9
bra .6
*--------------------------------------
.4 ldx #ARC.B.LEN.W
lda #ARC.B.SHORT.B
jsr X.Arc.PutXBits
bcs .9
.5 ldx #ARC.B.SHORTSTR.W
lda X.Arc.STRLen
sec
sbc #STR.MIN
jsr X.Arc.PutXBits
bcs .9
.6 lda (ZPStrPtr)
jsr X.Arc.PutByte8
bcs .9
inc ZPStrPtr
bne .7
inc ZPStrPtr+1
.7 dec X.Arc.STRLen
bne .6
.8 clc
.9 rts
*--------------------------------------
X.Arc.PutBL ldx #ARC.B.PREFIX.W
lda #ARC.B.STRBL
jsr X.Arc.PutXBits
bcs .9
ldx #ARC.B.STRBL.W
lda #ARC.B.BL
jsr X.Arc.PutXBits
bcs .9
* BLLen
lda X.Arc.BLL.Bits
beq .2 no long len...
lda X.Arc.BLLen
cmp #BLL.MID
bcc .1 this one is short
ldx #ARC.B.LEN.W
lda #ARC.B.LONG.B
jsr X.Arc.PutXBits
bcs .9
lda X.Arc.BLLen
sec
sbc #BLL.MID
ldx X.Arc.BLL.Bits
jsr X.Arc.PutXBits
bcc .3
.9 rts
*--------------------------------------
.1 ldx #ARC.B.LEN.W
lda #ARC.B.SHORT.B
jsr X.Arc.PutXBits
bcs .9
.2 ldx #ARC.B.SHORTBLL.W
lda X.Arc.BLLen
sec
sbc #BLL.MIN
jsr X.Arc.PutXBits
bcs .9
* BLOFS
.3 ldx X.Arc.BLO.Bits
cpx #9
bcc .4
txa
* sec
sbc #8
tax
lda X.Arc.Ofs+1
jsr X.Arc.PutXBits
bcs .9
ldx #8
.4 lda X.Arc.Ofs
bra X.Arc.PutXBits
*--------------------------------------
X.Arc.PutByte8 ldy X.Arc.TopSize
beq .4 No TOP Table
dey Range 0-63
.1 cmp X.Arc.ShnkOut+S.ARCSHNK.TOPBYTES,y
beq .5
dey
bpl .1
tay
ldx #ARC.B.RAWTOP.W
lda #ARC.B.RAW
jsr X.Arc.PutXBits
bcs .9
tya
.4 ldx #8
bra X.Arc.PutXBits
.9 rts
.5 ldx #ARC.B.RAWTOP.W
lda #ARC.B.TOP
jsr X.Arc.PutXBits
bcs .9
tya
and X.Arc.TOP.Masks,y
ora X.Arc.TOP.Bits,y
ldx X.Arc.TOP.Widths,y
*--------------------------------------
X.Arc.PutXBits phx
.1 cpx #8
beq .2
asl
inx
bra .1
.2 plx
.3 asl
pha
bcc .4
lda X.Arc.OutMask
tsb X.Arc.OutByte
.4 lsr X.Arc.OutMask
bcc .5
ror X.Arc.OutMask
lda X.Arc.OutByte
stz X.Arc.OutByte
jsr X.Arc.PutByte
.5 pla
bcs .9
dex
bne .3
* clc
rts
.9 lda #E.BUF
* sec
rts
*--------------------------------------
X.Arc.PutByte inc X.Arc.nCntOut
bne .1
inc X.Arc.nCntOut+1
beq .9
.1 sta (ZPOutBufPtr)
inc ZPOutBufPtr
bne .2
inc ZPOutBufPtr+1
.2 inc X.Arc.CLen
bne .8
inc X.Arc.CLen+1
.8 clc
rts
.9 lda #E.BUF
sec
rts
*--------------------------------------
X.Arc.Close lda X.Arc.OutMask
bmi .8
lda X.Arc.OutByte
bra X.Arc.PutByte
.8 clc
rts
*--------------------------------------
.DO DBG
X.Arc.PrintDBG1 >PUSHW L.MSG.DBG1
>PUSHL X.Arc.Bits
>PUSHL X.Arc.TBits
>PUSHL X.Arc.BLBits
>PUSHL X.Arc.TBLBits
>PUSHB X.Arc.TopTSize
>PUSHB X.Arc.TopTBLSize
>PUSHB X.Arc.STR.Max
>PUSHB X.Arc.BLL.Max
>PUSHW X.Arc.BLO.Max
>PUSHBI 22
>SYSCALL2 PrintF
rts
X.Arc.PrintDBG2 >PUSHW L.MSG.DBG2
>PUSHW X.Arc.S.TB.Cnt
>PUSHW X.Arc.STR.TB.Cnt
>PUSHW X.Arc.BL.TB.Cnt
>PUSHW X.Arc.STR.SL.Cnt
>PUSHW X.Arc.STR.LL.Cnt
>PUSHBI ARC.B.SHORTSTR.W
>PUSHB X.Arc.STR.Bits
>PUSHW X.Arc.BLL.SL.Cnt
>PUSHW X.Arc.BLL.LL.Cnt
>PUSHBI ARC.B.SHORTBLL.W
>PUSHB X.Arc.BLL.Bits
>PUSHB X.Arc.BLO.Bits
ldx #0
.1 >PUSHB X.Arc.BLO.HI.cnt,x
>PUSHB X.Arc.BLO.LO.cnt,x
inx
cpx #12
bne .1
>PUSHBI 43
>SYSCALL2 PrintF
rts
X.Arc.ComputeDBG3
stz X.Arc.Bits+3
stz X.Arc.Bits+2
lda X.Arc.CLen+1
sta X.Arc.Bits+1
lda X.Arc.CLen
asl
rol X.Arc.Bits+1
rol X.Arc.Bits+2
asl
rol X.Arc.Bits+1
rol X.Arc.Bits+2
asl
rol X.Arc.Bits+1
rol X.Arc.Bits+2
sta X.Arc.Bits
ldx #0
lda X.Arc.OutMask
bmi .3
.1 inx
asl
bpl .1
.2 txa
clc
adc X.Arc.Bits
sta X.Arc.Bits
bcc .3
inc X.Arc.Bits+1
bne .3
inc X.Arc.Bits+2
.3 rts
X.Arc.PrintDBG3 >PUSHW L.MSG.DBG3
>PUSHL X.Arc.Bits
>PUSHW X.Arc.CLen
>PUSHB X.Arc.Alg
>PUSHBI 7
>SYSCALL2 PrintF
rts
.FIN
*--------------------------------------
CS.END
*--------------------------------------
* from 1 to 12 (1 to 4095)
*--------------------------------------
BLO.LenBits .DA #%11 bc= 1
.DA #%11 bc= 1
.DA #%11 bc= 3
.DA #%11 bc= 4 : Range 0..15 (4 bits ofs)
.DA #%10 bc= 5
.DA #%10 bc= 6
.DA #%10 bc= 7
.DA #%10 bc= 8 : Range 0..255 (8 bits ofs)
.DA #%0 bc= 9
.DA #%0 bc=10
.DA #%0 bc=11
.DA #%0 bc=12 : Range 0..4095 (12 bits ofs)
*--------------------------------------
X.Arc.TOP.Masks .DA #ARC.B.TOP0.M,#ARC.B.TOP0.M,#ARC.B.TOP0.M,#ARC.B.TOP0.M
.DA #ARC.B.TOP0.M,#ARC.B.TOP0.M,#ARC.B.TOP0.M,#ARC.B.TOP0.M
.DA #ARC.B.TOP8.M,#ARC.B.TOP8.M,#ARC.B.TOP8.M,#ARC.B.TOP8.M
.DA #ARC.B.TOP8.M,#ARC.B.TOP8.M,#ARC.B.TOP8.M,#ARC.B.TOP8.M
.DA #ARC.B.TOP16.M,#ARC.B.TOP16.M,#ARC.B.TOP16.M,#ARC.B.TOP16.M
.DA #ARC.B.TOP16.M,#ARC.B.TOP16.M,#ARC.B.TOP16.M,#ARC.B.TOP16.M
.DA #ARC.B.TOP16.M,#ARC.B.TOP16.M,#ARC.B.TOP16.M,#ARC.B.TOP16.M
.DA #ARC.B.TOP16.M,#ARC.B.TOP16.M,#ARC.B.TOP16.M,#ARC.B.TOP16.M
X.Arc.TOP.Widths
.DA #ARC.B.TOP0.W,#ARC.B.TOP0.W,#ARC.B.TOP0.W,#ARC.B.TOP0.W
.DA #ARC.B.TOP0.W,#ARC.B.TOP0.W,#ARC.B.TOP0.W,#ARC.B.TOP0.W
.DA #ARC.B.TOP8.W,#ARC.B.TOP8.W,#ARC.B.TOP8.W,#ARC.B.TOP8.W
.DA #ARC.B.TOP8.W,#ARC.B.TOP8.W,#ARC.B.TOP8.W,#ARC.B.TOP8.W
.DA #ARC.B.TOP16.W,#ARC.B.TOP16.W,#ARC.B.TOP16.W,#ARC.B.TOP16.W
.DA #ARC.B.TOP16.W,#ARC.B.TOP16.W,#ARC.B.TOP16.W,#ARC.B.TOP16.W
.DA #ARC.B.TOP16.W,#ARC.B.TOP16.W,#ARC.B.TOP16.W,#ARC.B.TOP16.W
.DA #ARC.B.TOP16.W,#ARC.B.TOP16.W,#ARC.B.TOP16.W,#ARC.B.TOP16.W
X.Arc.TOP.Bits .DA #ARC.B.TOP0.B,#ARC.B.TOP0.B,#ARC.B.TOP0.B,#ARC.B.TOP0.B
.DA #ARC.B.TOP0.B,#ARC.B.TOP0.B,#ARC.B.TOP0.B,#ARC.B.TOP0.B
.DA #ARC.B.TOP8.B,#ARC.B.TOP8.B,#ARC.B.TOP8.B,#ARC.B.TOP8.B
.DA #ARC.B.TOP8.B,#ARC.B.TOP8.B,#ARC.B.TOP8.B,#ARC.B.TOP8.B
.DA #ARC.B.TOP16.B,#ARC.B.TOP16.B,#ARC.B.TOP16.B,#ARC.B.TOP16.B
.DA #ARC.B.TOP16.B,#ARC.B.TOP16.B,#ARC.B.TOP16.B,#ARC.B.TOP16.B
.DA #ARC.B.TOP16.B,#ARC.B.TOP16.B,#ARC.B.TOP16.B,#ARC.B.TOP16.B
.DA #ARC.B.TOP16.B,#ARC.B.TOP16.B,#ARC.B.TOP16.B,#ARC.B.TOP16.B
*--------------------------------------
X.Arc.nCnt .BS 2
X.Arc.nCntOut .BS 2
X.Arc.InBufPtr .BS 2
X.Arc.OutBufPtr .BS 2
X.Arc.Best .EQ * ComputeXXXbits
X.Arc.STRLen .BS 1
X.Arc.BLLen .BS 1
X.Arc.bStop .EQ *
X.Arc.Ofs .BS 2
X.Arc.Cnt .EQ *
X.Arc.OfsWnCnt .BS 2
X.Arc.OfsBnCnt .BS 2
X.Arc.OutMask .BS 1
X.Arc.OutByte .BS 1
X.Arc.ShnkOut .BS S.ARCSHNK
*--------------------------------------
X.Arc.ResetData .EQ *
X.Arc.CLen .BS 2
X.Arc.Alg .BS 1
X.Arc.Bits .BS 4
X.Arc.TBits .BS 4
X.Arc.BLBits .BS 4
X.Arc.TBLBits .BS 4
X.Arc.TopT .BS TOP.MAX
X.Arc.TopTSize .BS 1
X.Arc.TopTBL .BS TOP.MAX
X.Arc.TopTBLSize .BS 1
X.Arc.S.TB.Cnt .BS 2
X.Arc.STR.TB.Cnt .BS 2
X.Arc.BL.TB.Cnt .BS 2
X.Arc.STR.Max .BS 1
X.Arc.STR.Bits .BS 1
X.Arc.STR.SL.Cnt .BS 2
X.Arc.STR.LL.Cnt .BS 2
X.Arc.TopSize .BS 1
X.Arc.bScanBL .BS 1
X.Arc.BLL.Max .BS 1
X.Arc.BLL.Bits .BS 1
X.Arc.BLL.SL.Cnt .BS 2
X.Arc.BLL.LL.Cnt .BS 2
X.Arc.BLO.Max .BS 2
X.Arc.BLO.Bits .BS 1
X.Arc.BLO.LO.cnt .BS 12
X.Arc.BLO.HI.cnt .BS 12
X.Arc.ResetCnt .EQ *-X.Arc.ResetData
*--------------------------------------
X.Arc.TopCntL .BS 256
X.Arc.TopCntH .BS 256
X.Arc.TopCntBLL .BS 256
X.Arc.TopCntBLH .BS 256
*--------------------------------------
MAN
SAVE usr/src/shared/x.arc.s
LOAD usr/src/bin/arc.s
ASM