Kernel 0.9.1 : LIBPAK rewrite...

This commit is contained in:
Rémy GIBERT 2018-02-08 16:39:56 +00:00
parent 22719fb7cc
commit 1bf5d26ffd
5 changed files with 398 additions and 397 deletions

Binary file not shown.

Binary file not shown.

View File

@ -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

View File

@ -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

View File

@ -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"