mirror of
https://github.com/A2osX/A2osX.git
synced 2025-02-18 00:30:40 +00:00
Kernel 0.9.1 : LIBPAK rewrite...
This commit is contained in:
parent
22719fb7cc
commit
1bf5d26ffd
Binary file not shown.
Binary file not shown.
@ -6,14 +6,15 @@ AUTO 6
|
|||||||
.LIST OFF
|
.LIST OFF
|
||||||
.OP 65C02
|
.OP 65C02
|
||||||
*--------------------------------------
|
*--------------------------------------
|
||||||
S.PAKSTAT.SIZE .EQ 0
|
S.PAKSTAT.PASS1 .EQ 0
|
||||||
S.PAKSTAT.BL .EQ 2
|
S.PAKSTAT.PASS2 .EQ 2
|
||||||
S.PAKSTAT.REP .EQ 4
|
S.PAKSTAT.BL .EQ 4
|
||||||
S.PAKSTAT.S3 .EQ 6
|
S.PAKSTAT.REP .EQ 6
|
||||||
S.PAKSTAT.S4 .EQ 8
|
S.PAKSTAT.S3 .EQ 8
|
||||||
S.PAKSTAT.STORE .EQ 10
|
S.PAKSTAT.S4 .EQ 10
|
||||||
|
S.PAKSTAT.STORE .EQ 12
|
||||||
*
|
*
|
||||||
S.PAKSTAT .EQ 12
|
S.PAKSTAT .EQ 14
|
||||||
*--------------------------------------
|
*--------------------------------------
|
||||||
LIBPAK.Pak .EQ 4
|
LIBPAK.Pak .EQ 4
|
||||||
LIBPAK.UnPak .EQ 6
|
LIBPAK.UnPak .EQ 6
|
||||||
|
774
LIB/LIBPAK.S.txt
774
LIB/LIBPAK.S.txt
@ -7,55 +7,66 @@ AUTO 4,1
|
|||||||
.TF /A2OSX.BUILD/LIB/LIBPAK.O
|
.TF /A2OSX.BUILD/LIB/LIBPAK.O
|
||||||
*--------------------------------------
|
*--------------------------------------
|
||||||
* File Header :
|
* File Header :
|
||||||
* SFX :
|
*--------------------------------------
|
||||||
* - BIN must begin with CLD (QCODE)
|
S.PAKFILE.LEN .EQ 0 File Length (uncomp)
|
||||||
* - BIN must be relocatable
|
S.PAKFILE.CRC .EQ 4 CRC of Target File
|
||||||
* - BIN must overwrite itself
|
S.PAKFILE.VER .EQ 8
|
||||||
* (well, best way is moving CODE to $200)
|
S.PAKFILE.TF .EQ 9 Target File (C-String)
|
||||||
*--------------------------------------
|
*--------------------------------------
|
||||||
* Shunk Header :
|
* Shunk Header :
|
||||||
* WORD : !Target Length
|
* WORD : !Target UNCompressed Length
|
||||||
* USED TO STOP UNPACK
|
* USED TO STOP UNPACK
|
||||||
* !!!NO EOF TOKEN!!!
|
* !!!NO EOF TOKEN!!!
|
||||||
* Short4 : [0..15]
|
|
||||||
* Short3 : [0..7]
|
* Short3 : [0..7]
|
||||||
|
* Short4 : [0..15]
|
||||||
*--------------------------------------
|
*--------------------------------------
|
||||||
S.PAKHDR.LEN .EQ 0
|
S.PAKHDR.LEN .EQ 0
|
||||||
S.PAKHDR.SHORT4 .EQ 2
|
S.PAKHDR.SHORT3 .EQ 2
|
||||||
S.PAKHDR.SHORT3 .EQ 18
|
S.PAKHDR.SHORT4 .EQ 10
|
||||||
*
|
*
|
||||||
S.PAKHDR .EQ 26
|
S.PAKHDR .EQ 26
|
||||||
*--------------------------------------
|
*--------------------------------------
|
||||||
PIPELEN .EQ 18
|
|
||||||
*--------------------------------------
|
|
||||||
* BITSTREAM :
|
* BITSTREAM :
|
||||||
* 0 = STORE : 1 byte follow (9 bits)
|
*--------------------------------------
|
||||||
*--------------
|
* 0 : SHORT3 (1)+3=4 bits
|
||||||
* 1 = CMD :
|
* 3 bits : index in Short3 Table
|
||||||
*---SHORT4 --- (3)+4=7 bits --------
|
*--------------------------------------
|
||||||
* 100 : SHORT4
|
* 10 : SHORT4 (2)+4=6 bits
|
||||||
* xxxx = index in Short4 Table
|
* 4 bits : index in Short4 Table
|
||||||
*---SHORT3 --- (3)+3=6 bits --------
|
*--------------------------------------
|
||||||
* 101 : SHORT3
|
* 110 : REPn (3)+5=8 bits
|
||||||
* xxx = index in Short3 Table
|
* 5 bits count (1+n)
|
||||||
*--- BACKLINK : (3)+9+4=16 bits ----
|
*--------------------------------------
|
||||||
* 110 : BackLink
|
* 1110 = BACKLINK : (4)+12+8=24 bits
|
||||||
* 9 bits : Offset (LO8,HI1)
|
* 12 bits : Offset (HI-4,LO-8)
|
||||||
* 4 bits : 3 + n (4 bits count) (18 max)
|
* 8 bits : 4 + n (8 bits count) (259 max)
|
||||||
*--- REP : (3)+1, (3)+1+4 =4/8 bits ----
|
*--------------------------------------
|
||||||
* 111 : REP
|
* 1111 : STOREn (4) + 4 cnt + 8n....
|
||||||
* 0 : repeat last byte
|
*--------------------------------------
|
||||||
* 1 : repeat 2 + n (4 bits count)
|
PAK.L.SHORT3 .EQ 1
|
||||||
|
PAK.B.SHORT3 .EQ %00000000
|
||||||
|
PAK.L.SHORT4 .EQ 2
|
||||||
|
PAK.B.SHORT4 .EQ %10000000
|
||||||
|
PAK.L.REPn .EQ 3
|
||||||
|
PAK.B.REPn .EQ %11000000
|
||||||
|
PAK.L.BACKLINK .EQ 4
|
||||||
|
PAK.B.BACKLINK .EQ %11100000
|
||||||
|
PAK.L.STOREn .EQ 4
|
||||||
|
PAK.B.STOREn .EQ %11110000
|
||||||
|
*--------------------------------------
|
||||||
|
WSIZE .EQ 4096
|
||||||
|
REPMAX .EQ 32
|
||||||
*--------------------------------------
|
*--------------------------------------
|
||||||
.INB /A2OSX.BUILD/INC/MACROS.I
|
.INB /A2OSX.BUILD/INC/MACROS.I
|
||||||
.INB /A2OSX.BUILD/INC/A2OSX.I
|
.INB /A2OSX.BUILD/INC/A2OSX.I
|
||||||
.INB /A2OSX.BUILD/INC/LIBPAK.I
|
.INB /A2OSX.BUILD/INC/LIBPAK.I
|
||||||
*--------------------------------------
|
*--------------------------------------
|
||||||
Pak.SrcPtr .EQ ZPLIB
|
ZPSrcWPtr .EQ ZPLIB
|
||||||
Pak.SrcBlPtr .EQ ZPLIB+2
|
ZPSrcPtr .EQ ZPLIB+2
|
||||||
Pak.SrcBlPtrT .EQ ZPLIB+4
|
|
||||||
Pak.DstPtr .EQ ZPLIB+6
|
ZPHdrPtr .EQ ZPLIB+14
|
||||||
Pak.StatPtr .EQ ZPLIB+8
|
ZPDstPtr .EQ ZPLIB+16
|
||||||
|
ZPStatPtr .EQ ZPLIB+18
|
||||||
*--------------------------------------
|
*--------------------------------------
|
||||||
* File Header (16 Bytes)
|
* File Header (16 Bytes)
|
||||||
*--------------------------------------
|
*--------------------------------------
|
||||||
@ -88,83 +99,300 @@ LIB.UNLOAD clc
|
|||||||
* PUSHW = Dst PTR Output Buffer
|
* PUSHW = Dst PTR Output Buffer
|
||||||
* PUSHW = Dst PTR S.PAKSTAT
|
* PUSHW = Dst PTR S.PAKSTAT
|
||||||
*\--------------------------------------
|
*\--------------------------------------
|
||||||
Pak >PULLW Pak.StatPtr
|
* PASS #1 : BL+REP dryrun with raw BYTE store (no bit prefix) -> Dst
|
||||||
|
* if BL stat=0, disable BL in PASS #2
|
||||||
|
* BuildShortTable with DST
|
||||||
|
* PASS #2 : BL with store real prefixed S3,S4,REP & STORE -> Dst
|
||||||
|
*--------------------------------------
|
||||||
|
Pak >PULLW ZPStatPtr
|
||||||
|
|
||||||
>PULLW Pak.DstPtr
|
>PULLA
|
||||||
|
sta ZPHdrPtr
|
||||||
|
clc
|
||||||
|
adc #S.PAKHDR
|
||||||
|
sta Pak.DstPtr
|
||||||
|
|
||||||
>PULLA Get Src Len LO
|
>PULLA
|
||||||
|
sta ZPHdrPtr+1
|
||||||
|
adc /S.PAKHDR
|
||||||
|
sta Pak.DstPtr+1
|
||||||
|
|
||||||
|
>PULLW Pak.Hdr+S.PAKHDR.LEN
|
||||||
|
|
||||||
|
>PULLW Pak.SrcPtr
|
||||||
|
|
||||||
|
* PASS #1 : REP & BL, raw store
|
||||||
|
|
||||||
|
Pak.1 jsr Pak.InitPass
|
||||||
|
|
||||||
|
stz Pak.StoreMode
|
||||||
|
|
||||||
|
.1 jsr Pak.GetReadAheadLen
|
||||||
|
beq .8 0 byte left...
|
||||||
|
|
||||||
|
.2 cmp #4 less than 4 chars t
|
||||||
|
bcc .4
|
||||||
|
|
||||||
|
pha
|
||||||
|
jsr Pak.ScanBL
|
||||||
|
bcc .3
|
||||||
|
pla
|
||||||
|
dec
|
||||||
|
bra .2
|
||||||
|
|
||||||
|
.3 ora #PAK.B.BACKLINK %1110 + Ofs.HI
|
||||||
|
jsr Pak.PutA
|
||||||
|
bcs .91 if failed, pop len
|
||||||
|
tya push Ofs.LO
|
||||||
|
jsr Pak.PutA
|
||||||
|
bcs .91 if failed, pop len
|
||||||
|
pla get back len
|
||||||
|
pha
|
||||||
|
jsr Pak.PutA
|
||||||
|
bcs .91
|
||||||
|
pla
|
||||||
|
|
||||||
|
jsr Pak.SrcForward
|
||||||
|
|
||||||
|
ldx #S.PAKSTAT.BL
|
||||||
|
jsr Pak.UpdateStats
|
||||||
|
|
||||||
|
bra .1
|
||||||
|
|
||||||
|
.4 lda (ZPSrcPtr)
|
||||||
|
|
||||||
|
jsr Pak.PutA
|
||||||
|
bcs .90
|
||||||
|
|
||||||
|
lda #1
|
||||||
|
jsr Pak.SrcForward
|
||||||
|
|
||||||
|
ldx #S.PAKSTAT.STORE
|
||||||
|
jsr Pak.UpdateStats
|
||||||
|
bra .1
|
||||||
|
|
||||||
|
.91 pla
|
||||||
|
.90 rts
|
||||||
|
|
||||||
|
.8 >LDYA Pak.Stat+S.PAKSTAT.PASS2
|
||||||
|
>STYA Pak.Stat+S.PAKSTAT.PASS1
|
||||||
|
|
||||||
|
bra Pak.Exit
|
||||||
|
* PASS #2a : Count occurence for each value...
|
||||||
|
|
||||||
|
Pak.2a jsr Pak.BuildShortTable
|
||||||
|
|
||||||
|
* PASS #2b : REP & BL, true store with S3,S4
|
||||||
|
|
||||||
|
Pak.2b jsr Pak.InitPass
|
||||||
|
|
||||||
|
dec Pak.StoreMode
|
||||||
|
|
||||||
|
lda #8
|
||||||
|
sta Pak.PutBit+1 Initialize properly for
|
||||||
|
stz Pak.Byte first "PutBit" Call
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Pak.Exit
|
||||||
|
|
||||||
|
ldy #S.PAKSTAT-1
|
||||||
|
|
||||||
|
.80 lda Pak.Stat,y
|
||||||
|
sta (ZPStatPtr),y
|
||||||
|
dey
|
||||||
|
bpl .80
|
||||||
|
|
||||||
|
clc
|
||||||
|
rts
|
||||||
|
|
||||||
|
.9 lda #K.E.OOM
|
||||||
|
sec
|
||||||
|
rts
|
||||||
|
*--------------------------------------
|
||||||
|
Pak.InitPass >LDYA Pak.SrcPtr
|
||||||
|
>STYA ZPSrcPtr
|
||||||
|
>STYA Pak.WPtr
|
||||||
|
|
||||||
|
>LDYA Pak.DstPtr
|
||||||
|
>STYA ZPDstPtr
|
||||||
|
|
||||||
|
lda Pak.Hdr+S.PAKHDR.LEN
|
||||||
eor #$ff
|
eor #$ff
|
||||||
sta Pak.SrcCnt
|
sta Pak.SrcCnt
|
||||||
sta Pak.Cnt Init for pass #1
|
|
||||||
sta Pak.DstCnt
|
lda Pak.Hdr+S.PAKHDR.LEN+1
|
||||||
tax
|
|
||||||
|
|
||||||
>PULLA Get Src Len HI
|
|
||||||
eor #$ff
|
eor #$ff
|
||||||
sta Pak.SrcCnt+1
|
sta Pak.SrcCnt+1
|
||||||
sta Pak.Cnt+1 Init for pass #1
|
|
||||||
sta Pak.DstCnt+1
|
lda #$ff RepChar invalid
|
||||||
|
sta Pak.RepCnt
|
||||||
|
|
||||||
|
ldx #S.PAKSTAT.BL
|
||||||
|
|
||||||
|
.1 stz Pak.Stat,x Reset Stats
|
||||||
|
inx
|
||||||
|
cpx #S.PAKSTAT
|
||||||
|
bne .1
|
||||||
|
|
||||||
|
rts
|
||||||
|
*--------------------------------------
|
||||||
|
Pak.GetReadAheadLen
|
||||||
|
lda #$ff
|
||||||
|
cmp Pak.SrcCnt+1 return 255 if not $ffxx
|
||||||
|
bne .9
|
||||||
|
|
||||||
|
lda Pak.SrcCnt
|
||||||
|
eor #$ff return !xx if $ffxx
|
||||||
|
.9 rts
|
||||||
|
*--------------------------------------
|
||||||
|
Pak.SrcForward pha Len
|
||||||
|
clc
|
||||||
|
adc ZPSrcPtr
|
||||||
|
sta ZPSrcPtr
|
||||||
|
bcc .1
|
||||||
|
clc
|
||||||
|
inc ZPSrcPtr+1
|
||||||
|
|
||||||
|
.1 pla
|
||||||
|
adc Pak.SrcCnt
|
||||||
|
sta Pak.SrcCnt
|
||||||
|
bcc .2
|
||||||
|
clc
|
||||||
|
inc Pak.SrcCnt+1
|
||||||
|
|
||||||
|
.2 sec
|
||||||
|
lda ZPSrcPtr
|
||||||
|
sbc #WSIZE
|
||||||
tay
|
tay
|
||||||
|
lda ZPSrcPtr+1
|
||||||
|
sbc /WSIZE
|
||||||
|
tax
|
||||||
|
|
||||||
txa
|
cpy Pak.WPtr
|
||||||
jsr Pak.PutByte
|
sbc Pak.WPtr+1
|
||||||
tya
|
bcs .8
|
||||||
jsr Pak.PutByte
|
|
||||||
|
sty Pak.WPtr
|
||||||
|
stx Pak.WPtr+1
|
||||||
|
.8 rts
|
||||||
|
*--------------------------------------
|
||||||
|
* Scan between Pak.WPtr & ZPSrcPtr-A
|
||||||
|
* Byte string at ZPSrcPtr (len A)
|
||||||
|
* IN : A = Byte string length
|
||||||
|
* OUT : CC: Y,A=offset to BL
|
||||||
|
*--------------------------------------
|
||||||
|
Pak.ScanBL sta Pak.WStrLen
|
||||||
|
|
||||||
>PULLYA Get Src PTR
|
sec
|
||||||
>STYA Pak.Src Init for pass #1
|
lda ZPSrcPtr WLimit=ZPSrcPtr-WStrLen
|
||||||
>STYA Pak.SrcPtr
|
sbc Pak.WStrLen
|
||||||
|
sta Pak.WLimit
|
||||||
|
|
||||||
ldx #S.PAKSTAT-1
|
lda ZPSrcPtr+1
|
||||||
|
sbc #0
|
||||||
|
sta Pak.WLimit+1
|
||||||
|
|
||||||
.1 stz PakStat,x Reset Stats
|
lda Pak.WLimit
|
||||||
dex
|
sec
|
||||||
bpl .1
|
sbc Pak.WPtr
|
||||||
|
eor #$ff
|
||||||
* PASS #1 : Count occurence for each value...
|
sta Pak.Cnt
|
||||||
|
|
||||||
Pak.1 ldx #0
|
lda Pak.WLimit+1
|
||||||
|
sbc Pak.WPtr+1
|
||||||
|
eor #$ff
|
||||||
|
sta Pak.Cnt+1
|
||||||
|
|
||||||
|
bcc .9 WLimit < Pak.WPtr
|
||||||
|
|
||||||
|
lda Pak.WPtr
|
||||||
|
sta ZPSrcWPtr
|
||||||
|
|
||||||
|
lda Pak.WPtr+1
|
||||||
|
sta ZPSrcWPtr+1
|
||||||
|
|
||||||
|
ldy #0
|
||||||
|
|
||||||
|
.1 lda (ZPSrcWPtr),y
|
||||||
|
cmp (ZPSrcPtr),y
|
||||||
|
bne .6
|
||||||
|
iny
|
||||||
|
cpy Pak.WStrLen
|
||||||
|
bne .1
|
||||||
|
sec
|
||||||
|
lda ZPSrcPtr
|
||||||
|
sbc ZPSrcWPtr
|
||||||
|
tay
|
||||||
|
lda ZPSrcPtr+1
|
||||||
|
sbc ZPSrcWPtr+1
|
||||||
|
|
||||||
|
clc
|
||||||
|
rts
|
||||||
|
|
||||||
|
.6 inc ZPSrcWPtr
|
||||||
|
bne .7
|
||||||
|
inc ZPSrcWPtr+1
|
||||||
|
|
||||||
|
.7 inc Pak.Cnt
|
||||||
|
bne .1
|
||||||
|
inc Pak.Cnt+1
|
||||||
|
bne .1
|
||||||
|
|
||||||
|
.9 sec
|
||||||
|
rts
|
||||||
|
*--------------------------------------
|
||||||
|
Pak.BuildShortTable
|
||||||
|
ldx #0
|
||||||
|
|
||||||
.1 stz Pak.CntL,x
|
.1 stz Pak.CntL,x
|
||||||
stz Pak.CntH,x
|
stz Pak.CntH,x
|
||||||
inx
|
inx
|
||||||
bne .1
|
bne .1
|
||||||
|
|
||||||
|
lda Pak.Stat+S.PAKSTAT.PASS1
|
||||||
|
eor #$ff
|
||||||
|
sta Pak.Cnt
|
||||||
|
lda Pak.Stat+S.PAKSTAT.PASS1+1
|
||||||
|
eor #$ff
|
||||||
|
sta Pak.Cnt+1
|
||||||
|
|
||||||
ldy #0
|
ldy #0
|
||||||
|
|
||||||
.2 inc Pak.Cnt
|
.2 inc Pak.Cnt
|
||||||
bne .3
|
bne .3
|
||||||
inc Pak.Cnt+1
|
inc Pak.Cnt+1
|
||||||
beq .5
|
beq .5
|
||||||
|
|
||||||
.3 lda (Pak.SrcPtr),y
|
.3 lda (ZPSrcPtr),y
|
||||||
tax
|
tax
|
||||||
inc Pak.CntL,x
|
inc Pak.CntL,x
|
||||||
bne .4
|
bne .4
|
||||||
inc Pak.CntH,x
|
inc Pak.CntH,x
|
||||||
.4 iny
|
.4 iny
|
||||||
bne .2
|
bne .2
|
||||||
inc Pak.SrcPtr+1
|
inc ZPSrcPtr+1
|
||||||
bra .2
|
bra .2
|
||||||
|
|
||||||
* ...Search for Top 24
|
* ...Search for Top 24
|
||||||
.5 ldy #23
|
.5 ldy #0
|
||||||
|
|
||||||
.6 stz Pak.Cnt Init best score to 0
|
.6 stz Pak.Cnt Init best score to 0
|
||||||
stz Pak.Cnt+1
|
stz Pak.Cnt+1
|
||||||
|
|
||||||
stz Pak.Byte
|
|
||||||
ldx #0
|
ldx #0
|
||||||
|
|
||||||
.7 lda Pak.CntL,x is it better at X
|
.7 lda Pak.Cnt
|
||||||
cmp Pak.Cnt
|
cmp Pak.CntL,x is it better at X
|
||||||
lda Pak.CntH,x
|
lda Pak.Cnt+1
|
||||||
sbc Pak.Cnt+1
|
sbc Pak.CntH,x
|
||||||
bcs .8 not better
|
bcc .8 not better or equal...
|
||||||
|
|
||||||
|
stx Pak.Byte save new score index...
|
||||||
|
|
||||||
stx Pak.Byte
|
|
||||||
lda Pak.CntL,x
|
lda Pak.CntL,x
|
||||||
sta Pak.Cnt
|
sta Pak.Cnt ...and value
|
||||||
lda Pak.CntH,x
|
lda Pak.CntH,x
|
||||||
sta Pak.Cnt+1
|
sta Pak.Cnt+1
|
||||||
|
|
||||||
@ -172,263 +400,67 @@ Pak.1 ldx #0
|
|||||||
bne .7
|
bne .7
|
||||||
|
|
||||||
lda Pak.Byte
|
lda Pak.Byte
|
||||||
sta PakHdr+S.PAKHDR.SHORT4,y
|
sta Pak.Hdr+S.PAKHDR.SHORT3,y
|
||||||
|
tax
|
||||||
stz Pak.CntL,x Discard this entry
|
stz Pak.CntL,x Discard this entry
|
||||||
stz Pak.CntH,x
|
stz Pak.CntH,x
|
||||||
dey
|
iny
|
||||||
bpl .6
|
cpy #24
|
||||||
|
bne .6
|
||||||
|
|
||||||
ldx #15
|
|
||||||
|
|
||||||
.9 lda PakHdr+S.PAKHDR.SHORT4,x Store SHORT4 in reverse order
|
|
||||||
jsr Pak.PutByte
|
|
||||||
dex
|
|
||||||
bpl .9
|
|
||||||
|
|
||||||
ldx #7
|
|
||||||
|
|
||||||
.10 lda PakHdr+S.PAKHDR.SHORT3,x Store SHORT3 in reverse order
|
|
||||||
jsr Pak.PutByte
|
|
||||||
dex
|
|
||||||
bpl .10
|
|
||||||
|
|
||||||
>LDYAI S.PAKHDR Total Header Size
|
|
||||||
>STYA PakHdr+S.PAKHDR.LEN
|
|
||||||
* PASS #2 :
|
|
||||||
Pak.2 >LDYA Pak.Src Init for pass #2
|
|
||||||
>STYA Pak.SrcPtr
|
|
||||||
>STYA Pak.SrcBlPtr
|
|
||||||
|
|
||||||
>LDYA Pak.SrcCnt
|
|
||||||
>STYA Pak.Cnt
|
|
||||||
|
|
||||||
lda #8
|
|
||||||
sta Pak.PutBit+1 Initialize properly for first "PutBit" Call
|
|
||||||
stz Pak.Byte
|
|
||||||
|
|
||||||
stz Pak.PipeLen
|
|
||||||
|
|
||||||
Pak.2.LOOP ldx Pak.PipeLen Always fill Bytes in the PIPE until full
|
|
||||||
|
|
||||||
.1 jsr Pak.GetByte Load PIPE....
|
|
||||||
bcs .2 end of Buffer ?
|
|
||||||
sta Pak.Pipe,x
|
|
||||||
inx
|
|
||||||
cpx #PIPELEN PIPE Full ?
|
|
||||||
bne .1
|
|
||||||
|
|
||||||
.2 stx Pak.PipeLen
|
|
||||||
|
|
||||||
txa
|
|
||||||
beq Pak.2.EXIT PIPE empty ....exit
|
|
||||||
dex
|
|
||||||
bne Pak.2.REP more than one char in PIPE...REP?
|
|
||||||
|
|
||||||
jmp Pak.2.Store only one....store it
|
|
||||||
|
|
||||||
Pak.2.EXIT ldy #S.PAKSTAT-1
|
|
||||||
|
|
||||||
.1 lda PakStat,y
|
|
||||||
* sta (Pak.StatPtr),y
|
|
||||||
dey
|
|
||||||
bpl .1
|
|
||||||
|
|
||||||
clc
|
|
||||||
rts
|
rts
|
||||||
|
*--------------------------------------
|
||||||
|
Pak.PutA bit Pak.RepCnt
|
||||||
|
bpl .1
|
||||||
|
|
||||||
* try finding REPeating same bytes.....
|
stz Pak.RepCnt LastByte invalid...
|
||||||
Pak.2.REP ldx #0
|
sta Pak.LastByte
|
||||||
lda Pak.Pipe
|
bra Pak.PutA.1 send first byte.
|
||||||
|
|
||||||
.1 cmp Pak.Pipe+1,x
|
.1 cmp Pak.LastByte
|
||||||
bne .2
|
|
||||||
inx
|
|
||||||
cpx Pak.PipeLen
|
|
||||||
bne .1
|
|
||||||
|
|
||||||
.2 dex if one char.....no REP
|
|
||||||
beq Pak.2.BL
|
|
||||||
dex if 2, -> REP ONE (not 2)
|
|
||||||
phx REP 1 + 0 or more....save REP count for later....
|
|
||||||
|
|
||||||
jsr Pak.PutA a = byte to store
|
|
||||||
bcs .91
|
|
||||||
|
|
||||||
lda #%11100000
|
|
||||||
plx
|
|
||||||
phx
|
|
||||||
beq .3
|
beq .3
|
||||||
|
|
||||||
ora #%00010000
|
sta Pak.LastByte save new byte
|
||||||
|
lda Pak.RepCnt do we have a pending REP ?
|
||||||
|
beq .2
|
||||||
|
|
||||||
.3 ldy #4
|
ora #PAK.B.REPn yes, send it
|
||||||
jsr Pak.PutYBits
|
jsr Pak.PutA.1
|
||||||
bcs .91
|
bcs .9
|
||||||
|
|
||||||
|
ldx #S.PAKSTAT.REP
|
||||||
|
jsr Pak.UpdateStats
|
||||||
|
stz Pak.RepCnt
|
||||||
|
|
||||||
txa
|
.2 lda Pak.LastByte
|
||||||
beq .4 if not REP 2 or more no extra count
|
bra Pak.PutA.1
|
||||||
ldy #4
|
|
||||||
jsr Pak.PutYBits
|
|
||||||
bcs .90
|
|
||||||
|
|
||||||
.4 pla
|
.3 inc Pak.RepCnt
|
||||||
clc
|
lda Pak.RepCnt
|
||||||
adc #2
|
cmp #REPMAX
|
||||||
tay
|
bne .8
|
||||||
jsr Pak.StripPipe Remove REP bytes from PIPE
|
|
||||||
|
dec
|
||||||
|
ora #PAK.B.REPn
|
||||||
|
jsr Pak.PutA.1
|
||||||
|
bcs .9
|
||||||
|
|
||||||
|
lda #1
|
||||||
|
sta Pak.RepCnt
|
||||||
|
|
||||||
ldx #S.PAKSTAT.REP
|
ldx #S.PAKSTAT.REP
|
||||||
jsr Pak.UpdateStats
|
jsr Pak.UpdateStats
|
||||||
jmp Pak.2.LOOP
|
|
||||||
|
|
||||||
.91 pla
|
|
||||||
.90 lda #K.E.OOM
|
|
||||||
sec
|
|
||||||
rts
|
|
||||||
Pak.2.BL
|
|
||||||
* Try finding best matching BackLink between SrcBlPtr and SrcPtr (max 512)
|
|
||||||
.4 lda Pak.SrcPtr
|
|
||||||
sec
|
|
||||||
sbc Pak.PipeLen
|
|
||||||
sta Pak.Limit setup Limit to SrcPtr-PIPE
|
|
||||||
lda Pak.SrcPtr+1
|
|
||||||
sbc #0
|
|
||||||
sta Pak.Limit+1
|
|
||||||
|
|
||||||
.40 lda Pak.SrcBlPtr
|
.8 clc
|
||||||
sta Pak.SrcBlPtrT
|
.9 rts
|
||||||
lda Pak.SrcBlPtr+1
|
|
||||||
sta Pak.SrcBlPtrT+1
|
Pak.PutA.1 bit Pak.StoreMode
|
||||||
|
bpl Pak.PutByte
|
||||||
.5 txa Get PIPE Len
|
|
||||||
|
|
||||||
clc make sure SrcBlPtrT+PIPE < Limit
|
|
||||||
adc Pak.SrcBlPtrT
|
|
||||||
tay
|
|
||||||
lda Pak.SrcBlPtrT+1
|
|
||||||
adc #0
|
|
||||||
cpy Pak.Limit
|
|
||||||
sbc Pak.Limit+1
|
|
||||||
bcc .10 not enough room
|
|
||||||
|
|
||||||
txa
|
|
||||||
dec
|
|
||||||
tay
|
|
||||||
.8 lda (Pak.SrcBlPtrT),y
|
|
||||||
cmp Pak.Pipe,y
|
|
||||||
bne .9
|
|
||||||
dey
|
|
||||||
bpl .8
|
|
||||||
|
|
||||||
* Found a BL at Pak.SrcBlPtrT, Store it and remove X bytes from PIPE
|
|
||||||
phx save BL length
|
|
||||||
|
|
||||||
lda #%1100000
|
|
||||||
ldy #3
|
|
||||||
jsr Pak.PutYBits
|
|
||||||
bcs .91
|
|
||||||
|
|
||||||
lda Pak.Limit
|
|
||||||
sec
|
|
||||||
sbc Pak.SrcBlPtrT
|
|
||||||
php save C
|
|
||||||
|
|
||||||
ldy #8
|
ldy #8
|
||||||
jsr Pak.PutYBits
|
|
||||||
bcs .92
|
|
||||||
|
|
||||||
plp
|
|
||||||
lda Pak.Limit+1
|
|
||||||
sec
|
|
||||||
sbc Pak.SrcBlPtrT+1
|
|
||||||
|
|
||||||
jsr Pak.PutBit
|
|
||||||
bcs .91
|
|
||||||
ply Get back BL len
|
|
||||||
phy
|
|
||||||
|
|
||||||
jsr Pak.StripPipe Remove LEN bytes from PIPE
|
|
||||||
|
|
||||||
pla Get back BL len
|
|
||||||
sec
|
|
||||||
sbc #3 Adjust Range..3-18 to 0->15
|
|
||||||
asl
|
|
||||||
asl
|
|
||||||
asl
|
|
||||||
asl
|
|
||||||
ldy #4 store 4 bits len
|
|
||||||
jsr Pak.PutYBits
|
|
||||||
bcs .90
|
|
||||||
|
|
||||||
ldx #S.PAKSTAT.BL
|
|
||||||
jsr Pak.UpdateStats
|
|
||||||
jmp Pak.2.LOOP
|
|
||||||
|
|
||||||
.92 pla
|
|
||||||
.91 pla
|
|
||||||
.90 lda #K.E.OOM
|
|
||||||
sec
|
|
||||||
rts
|
|
||||||
* No match...try starting at next byte
|
|
||||||
.9 inc Pak.SrcBlPtrT
|
|
||||||
bne .5
|
|
||||||
inc Pak.SrcBlPtrT+1
|
|
||||||
bra .5
|
|
||||||
.10 dex reduce PIPE
|
|
||||||
cpx #2 2 bytes remaining? no need to BL, a BL is 16bits wide.....
|
|
||||||
bne .40 and start over from BLPtr
|
|
||||||
|
|
||||||
* NO Bl Found, STORE
|
|
||||||
Pak.2.Store lda Pak.Pipe
|
|
||||||
ldx #23
|
|
||||||
|
|
||||||
.1 cmp PakHdr+S.PAKHDR.SHORT4,x
|
|
||||||
beq .2
|
|
||||||
dex
|
|
||||||
bpl .1
|
|
||||||
|
|
||||||
lda #0
|
|
||||||
ldy #1
|
|
||||||
jsr Pak.PutYBits write 0
|
|
||||||
bcs .9
|
|
||||||
|
|
||||||
lda Pak.Pipe ...and byte
|
|
||||||
jsr Pak.PutA
|
|
||||||
bcs .9
|
|
||||||
|
|
||||||
ldy #1
|
|
||||||
jsr Pak.StripPipe
|
|
||||||
jmp Pak.2.LOOP
|
|
||||||
|
|
||||||
.2 cpx #16 16-23 -> SHORT3
|
|
||||||
bcs .3
|
|
||||||
|
|
||||||
txa 0-15, SHORT4
|
|
||||||
asl move to BIT 000xxxx0
|
|
||||||
|
|
||||||
ora #10000000 SHORT4
|
|
||||||
ldy #7
|
|
||||||
bra .8
|
|
||||||
|
|
||||||
.3 txa
|
|
||||||
and #7 make it xxx
|
|
||||||
asl
|
|
||||||
asl and 000xxx00
|
|
||||||
ora #10100000 SHORT3
|
|
||||||
ldy #6
|
|
||||||
|
|
||||||
.8 jsr Pak.PutYBits write 100xxxx
|
|
||||||
bcs .9
|
|
||||||
|
|
||||||
ldy #1
|
|
||||||
jsr Pak.StripPipe
|
|
||||||
jmp Pak.2.LOOP
|
|
||||||
|
|
||||||
.9 lda #K.E.OOM
|
|
||||||
sec
|
|
||||||
rts
|
|
||||||
*--------------------------------------
|
|
||||||
Pak.PutA ldy #8
|
|
||||||
*--------------------------------------
|
*--------------------------------------
|
||||||
Pak.PutYBits asl
|
Pak.PutYBits asl
|
||||||
jsr Pak.PutBit
|
jsr Pak.PutBit
|
||||||
@ -475,20 +507,14 @@ Pak.PutByte inc Pak.DstCnt
|
|||||||
inc Pak.DstCnt+1
|
inc Pak.DstCnt+1
|
||||||
beq .9
|
beq .9
|
||||||
|
|
||||||
bra .8
|
.1 sta (ZPDstPtr)
|
||||||
|
inc ZPDstPtr
|
||||||
.1 sta (Pak.DstPtr)
|
|
||||||
inc Pak.DstPtr
|
|
||||||
bne .2
|
bne .2
|
||||||
inc Pak.DstPtr+1
|
inc ZPDstPtr+1
|
||||||
|
|
||||||
.2 inc PakHdr+S.PAKHDR.LEN
|
.2 inc Pak.Stat+S.PAKSTAT.PASS2
|
||||||
bne .3
|
|
||||||
inc PakHdr+S.PAKHDR.LEN+1
|
|
||||||
|
|
||||||
.3 inc PakStat+S.PAKSTAT.SIZE
|
|
||||||
bne .8
|
bne .8
|
||||||
inc PakStat+S.PAKSTAT.SIZE+1
|
inc Pak.Stat+S.PAKSTAT.PASS2+1
|
||||||
|
|
||||||
.8 clc
|
.8 clc
|
||||||
rts
|
rts
|
||||||
@ -496,67 +522,30 @@ Pak.PutByte inc Pak.DstCnt
|
|||||||
.9 sec
|
.9 sec
|
||||||
rts
|
rts
|
||||||
*--------------------------------------
|
*--------------------------------------
|
||||||
* Y = count to remove from PIPE
|
Pak.UpdateStats inc Pak.Stat,x
|
||||||
*--------------------------------------
|
|
||||||
Pak.StripPipe ldx Pak.PipeLen
|
|
||||||
beq .9
|
|
||||||
|
|
||||||
ldx #0
|
|
||||||
|
|
||||||
.1 lda Pak.Pipe+1,x
|
|
||||||
sta Pak.Pipe,x
|
|
||||||
inx
|
|
||||||
cpx Pak.PipeLen
|
|
||||||
bne .1
|
|
||||||
dec Pak.PipeLen
|
|
||||||
dey
|
|
||||||
bne Pak.StripPipe
|
|
||||||
|
|
||||||
.9 rts
|
|
||||||
*--------------------------------------
|
|
||||||
Pak.UpdateStats inc PakStat,x
|
|
||||||
bne .8
|
bne .8
|
||||||
inc PakStat+1,x
|
inc Pak.Stat+1,x
|
||||||
.8 rts
|
.8 rts
|
||||||
*--------------------------------------
|
*/--------------------------------------
|
||||||
Pak.GetByte inc Pak.Cnt
|
|
||||||
bne .1
|
|
||||||
inc Pak.Cnt+1
|
|
||||||
beq .9
|
|
||||||
|
|
||||||
.1 lda (Pak.SrcPtr)
|
|
||||||
|
|
||||||
inc Pak.SrcPtr
|
|
||||||
bne .2
|
|
||||||
inc Pak.SrcPtr+1
|
|
||||||
|
|
||||||
.2 clc
|
|
||||||
rts
|
|
||||||
|
|
||||||
.9 sec
|
|
||||||
rts
|
|
||||||
*--------------------------------------
|
|
||||||
* UNPACK code as short as possible
|
|
||||||
* For Self Extract
|
|
||||||
*--------------------------------------
|
|
||||||
* UnPak
|
* UnPak
|
||||||
* In :
|
* In :
|
||||||
* PULLW = Src PTR Compressed Buffer
|
* PUSHW = Src PTR Compressed Buffer
|
||||||
* PULLW = Dst PTR
|
* PUSHW = Dst PTR
|
||||||
*--------------------------------------
|
*/--------------------------------------
|
||||||
UnPak.SrcPtr .EQ ZPLIB
|
UnZPSrcPtr .EQ ZPLIB
|
||||||
UnPak.DstPtr .EQ ZPLIB+2
|
UnZPDstPtr .EQ ZPLIB+2
|
||||||
UnPak.ShrtTbl .EQ ZPLIB+4
|
UnPak.ShrtTbl .EQ ZPLIB+4
|
||||||
UnPak.Cnt .EQ ZPLIB+6
|
UnPak.Cnt .EQ ZPLIB+6
|
||||||
*--------------------------------------
|
*--------------------------------------
|
||||||
UnPak >PULLW UnPak.SrcPtr
|
UnPak >PULLA Get Dst PTR LO
|
||||||
>PULLA Get Dst PTR LO
|
|
||||||
sec
|
sec
|
||||||
sbc #1
|
sbc #1
|
||||||
sta UnPak.DstPtr
|
sta UnZPDstPtr
|
||||||
>PULLA Get Dst PTR HI
|
>PULLA Get Dst PTR HI
|
||||||
sbc #0
|
sbc #0
|
||||||
sta UnPak.DstPtr+1 setup Dst PTR-1
|
sta UnZPDstPtr+1 setup Dst PTR-1
|
||||||
|
|
||||||
|
>PULLW UnZPSrcPtr
|
||||||
|
|
||||||
jsr UnPak.GetByte Get !LEN for counting up to $0000
|
jsr UnPak.GetByte Get !LEN for counting up to $0000
|
||||||
sta UnPak.Cnt
|
sta UnPak.Cnt
|
||||||
@ -564,7 +553,7 @@ UnPak >PULLW UnPak.SrcPtr
|
|||||||
jsr UnPak.GetByte
|
jsr UnPak.GetByte
|
||||||
sta UnPak.Cnt+1
|
sta UnPak.Cnt+1
|
||||||
|
|
||||||
>LDYA UnPak.SrcPtr Get PTR to Short Table.....
|
>LDYA UnZPSrcPtr Get PTR to Short Table.....
|
||||||
>STYA UnPak.ShrtTbl and save it for SHORTx
|
>STYA UnPak.ShrtTbl and save it for SHORTx
|
||||||
|
|
||||||
lda #8
|
lda #8
|
||||||
@ -620,9 +609,9 @@ UnPak >PULLW UnPak.SrcPtr
|
|||||||
*---- CMD : BACKLINK
|
*---- CMD : BACKLINK
|
||||||
jsr UnPak.Get8Bits get Offset LO, (CC)
|
jsr UnPak.Get8Bits get Offset LO, (CC)
|
||||||
eor #$ff !offset LO
|
eor #$ff !offset LO
|
||||||
adc UnPak.DstPtr equiv. SUB offset
|
adc UnZPDstPtr equiv. SUB offset
|
||||||
sta .7+1 PTR to Backlink LO
|
sta .7+1 PTR to Backlink LO
|
||||||
lda UnPak.DstPtr+1
|
lda UnZPDstPtr+1
|
||||||
bcs .61 if ADC sets C, no need to dec HI
|
bcs .61 if ADC sets C, no need to dec HI
|
||||||
dec
|
dec
|
||||||
.61 jsr UnPak.GetBit get Offset HI in C
|
.61 jsr UnPak.GetBit get Offset HI in C
|
||||||
@ -650,7 +639,7 @@ UnPak >PULLW UnPak.SrcPtr
|
|||||||
adc #2 range is 2->17
|
adc #2 range is 2->17
|
||||||
tax
|
tax
|
||||||
|
|
||||||
.9 lda (UnPak.DstPtr) Get Last Byte
|
.9 lda (UnZPDstPtr) Get Last Byte
|
||||||
jsr UnPak.PutByte
|
jsr UnPak.PutByte
|
||||||
dex
|
dex
|
||||||
bne .9
|
bne .9
|
||||||
@ -676,41 +665,50 @@ UnPak.GetBit ldx #$ff Self Modified code
|
|||||||
stx UnPak.GetBit+1
|
stx UnPak.GetBit+1
|
||||||
|
|
||||||
pha Don't trash A
|
pha Don't trash A
|
||||||
lda (UnPak.SrcPtr)
|
lda (UnZPSrcPtr)
|
||||||
and UnPak.BitMask,x
|
and UnPak.BitMask,x
|
||||||
cmp #1 if 0:CC, i>0 CS
|
cmp #1 if 0:CC, i>0 CS
|
||||||
|
|
||||||
pla
|
pla
|
||||||
rts Bit is in C
|
rts Bit is in C
|
||||||
*--------------------------------------
|
*--------------------------------------
|
||||||
UnPak.GetByte lda (UnPak.SrcPtr)
|
UnPak.GetByte lda (UnZPSrcPtr)
|
||||||
UnPak.NxtByte inc UnPak.SrcPtr
|
UnPak.NxtByte inc UnZPSrcPtr
|
||||||
bne .8
|
bne .8
|
||||||
inc UnPak.SrcPtr+1
|
inc UnZPSrcPtr+1
|
||||||
.8 rts
|
.8 rts
|
||||||
*--------------------------------------
|
*--------------------------------------
|
||||||
UnPak.PutByte inc UnPak.DstPtr
|
UnPak.PutByte inc UnZPDstPtr
|
||||||
bne .8
|
bne .8
|
||||||
inc UnPak.DstPtr+1
|
inc UnZPDstPtr+1
|
||||||
.8 sta (UnPak.DstPtr)
|
.8 sta (UnZPDstPtr)
|
||||||
rts
|
rts
|
||||||
*--------------------------------------
|
*--------------------------------------
|
||||||
CS.END
|
CS.END
|
||||||
Pak.Src .BS 2
|
Pak.SrcPtr .BS 2
|
||||||
Pak.SrcCnt .BS 2
|
Pak.SrcCnt .BS 2
|
||||||
Pak.Cnt .BS 2
|
Pak.DstPtr .BS 2
|
||||||
Pak.DstCnt .BS 2
|
Pak.DstCnt .BS 2
|
||||||
|
|
||||||
|
Pak.RepCnt .BS 1
|
||||||
|
Pak.LastByte .BS 1
|
||||||
|
|
||||||
|
Pak.Byte .BS 1
|
||||||
|
|
||||||
|
Pak.Cnt .BS 2
|
||||||
|
|
||||||
|
Pak.StoreMode .BS 1
|
||||||
|
Pak.WPtr .BS 2
|
||||||
|
Pak.WLimit .BS 2
|
||||||
|
Pak.WStrLen .BS 1
|
||||||
|
*--------------------------------------
|
||||||
|
Pak.StoreBuf .BS 16
|
||||||
Pak.CntL .BS 256
|
Pak.CntL .BS 256
|
||||||
Pak.CntH .BS 256
|
Pak.CntH .BS 256
|
||||||
Pak.Byte .BS 1
|
Pak.Hdr .BS S.PAKHDR
|
||||||
Pak.Limit .BS 2
|
Pak.Stat .BS S.PAKSTAT
|
||||||
Pak.PipeLen .BS 1
|
*--------------------------------------
|
||||||
Pak.Pipe .BS PIPELEN
|
|
||||||
Pak.BitMask .HS 0102040810204080
|
Pak.BitMask .HS 0102040810204080
|
||||||
*--------------------------------------
|
|
||||||
PakHdr .BS S.PAKHDR
|
|
||||||
PakStat .BS S.PAKSTAT
|
|
||||||
*--------------------------------------
|
|
||||||
UnPak.BitMask .HS 8040201008040201
|
UnPak.BitMask .HS 8040201008040201
|
||||||
MAN
|
MAN
|
||||||
SAVE /A2OSX.SRC/LIB/LIBPAK.S
|
SAVE /A2OSX.SRC/LIB/LIBPAK.S
|
||||||
|
@ -104,7 +104,8 @@ CS.RUN.Pak >PUSHWI 0 Aux type
|
|||||||
>PUSHW.G PAK.Stat+S.PAKSTAT.S3
|
>PUSHW.G PAK.Stat+S.PAKSTAT.S3
|
||||||
>PUSHW.G PAK.Stat+S.PAKSTAT.REP
|
>PUSHW.G PAK.Stat+S.PAKSTAT.REP
|
||||||
>PUSHW.G PAK.Stat+S.PAKSTAT.BL
|
>PUSHW.G PAK.Stat+S.PAKSTAT.BL
|
||||||
>PUSHW.G PAK.Stat+S.PAKSTAT.SIZE
|
>PUSHW.G PAK.Stat+S.PAKSTAT.PASS2
|
||||||
|
>PUSHW.G PAK.Stat+S.PAKSTAT.PASS1
|
||||||
>PUSHW.G PAK.FileSize
|
>PUSHW.G PAK.FileSize
|
||||||
|
|
||||||
>LDYA L.MSG6
|
>LDYA L.MSG6
|
||||||
@ -213,7 +214,8 @@ MSG3 .AZ "COS(PI/3)=%e\r\n"
|
|||||||
MSG4 .AZ "Long=%L\r\n"
|
MSG4 .AZ "Long=%L\r\n"
|
||||||
MSG5 .AZ "Float=%e\r\n"
|
MSG5 .AZ "Float=%e\r\n"
|
||||||
MSG6 .AS "Src Length : %D\r\n"
|
MSG6 .AS "Src Length : %D\r\n"
|
||||||
.AS "Compressed : %D\r\n"
|
.AS "Pass #1 : %D\r\n"
|
||||||
|
.AS "Pass #2 : %D\r\n"
|
||||||
.AS "BL Count : %D\r\n"
|
.AS "BL Count : %D\r\n"
|
||||||
.AS "REP Count : %D\r\n"
|
.AS "REP Count : %D\r\n"
|
||||||
.AS "S3 Count : %D\r\n"
|
.AS "S3 Count : %D\r\n"
|
||||||
|
Loading…
x
Reference in New Issue
Block a user