Kernel 0.93+

This commit is contained in:
Rémy GIBERT 2019-10-02 17:21:03 +02:00
parent 1431388c45
commit 8c9c506d61
5 changed files with 306 additions and 201 deletions

View File

@ -27,7 +27,9 @@ ZPFileStat .BS 2
ZPFullPath .BS 2
ZPRelPath .BS 2
ZPBufPtr .BS 2
ZPSrcBufPtr .BS 2
ZPDstBufPtr .BS 2
bAppend .BS 1
bRecurse .BS 1
bPause .BS 1
@ -137,15 +139,21 @@ CS.RUN >INC.G ArgIndex
sta ZPRelPath+1
jsr CS.RUN.OpenArc
bcs .99
.98 bcs .99
>LDYAI CHNK.SIZE
>SYSCALL getmem
bcs .99
>STYA ZPBufPtr
>STYA.G Shunk
>STYA ZPSrcBufPtr
txa
>STA.G hMem
>STA.G hSrcBuf
>LDYAI CHNK.SIZE
>SYSCALL getmem
bcs .98
>STYA ZPDstBufPtr
txa
>STA.G hDstBuf
*--------------------------------------
CS.RUN.LOOP ldy #S.PS.hStdIn
lda (pPS),y
@ -278,7 +286,8 @@ CS.RUN.FILE jsr FilterMatch
bra .9
.2 jsr CS.RUN.WriteArcData
.2 jsr CS.RUN.Pak
jsr CS.RUN.WriteArcData
bcc .1
.4 pha
@ -334,12 +343,12 @@ CS.RUN.OpenFile >PUSHWZ Aux type
.9 rts
*--------------------------------------
CS.RUN.ReadFile >PUSHWI CHNK.SIZE
>PUSHW ZPBufPtr
>PUSHW ZPSrcBufPtr
>LDA.G hFile
>SYSCALL fread
bcs .9
>STYA.G Shunk+2
>STYA.G Shunk.SrcSize
.9 rts
*--------------------------------------
@ -351,6 +360,16 @@ CS.RUN.CloseFile
>STZ.G hFile
.9 rts
*--------------------------------------
CS.RUN.Pak >PUSHEA.G PAKSTAT
>PUSHW ZPDstBufPtr
>PUSHW.G Shunk.SrcSize
>PUSHW ZPSrcBufPtr
>LIBCALL hLIB,LIBPAK.Pak
>STYA.G Shunk.DstSize
txa
>STA.G Shunk.Alg
rts
*--------------------------------------
CS.RUN.OpenArc >PUSHWZ Aux type
>PUSHBI $CF PAK
@ -381,7 +400,7 @@ CS.RUN.OpenArc >PUSHWZ Aux type
pha
>PUSHWI 3
>PUSHW ZPBufPtr
>PUSHW ZPSrcBufPtr
pla
>SYSCALL fread
bcs .9
@ -392,7 +411,7 @@ CS.RUN.OpenArc >PUSHWZ Aux type
dey
.2 lda ARC.Header,y
cmp (ZPBufPtr),y
cmp (ZPSrcBufPtr),y
bne .99
dey
bpl .2
@ -460,20 +479,20 @@ CS.RUN.WriteArcData
jsr CS.RUN.WriteArcByteA
bcs .9
lda #CHNK.ALG.STORE
>LDA.G Shunk.DstSize
jsr CS.RUN.WriteArcByteA
bcs .9
>LDA.G Shunk+2 Len LO
jsr CS.RUN.WriteArcByteA
bcs .9 Len HI
>LDA.G Shunk+3
>LDA.G Shunk.DstSize+1
jsr CS.RUN.WriteArcByteA
bcs .9
>PUSHW.G Shunk+2
>PUSHW ZPBufPtr
lda Shunk.Alg
jsr CS.RUN.WriteArcByteA
bcs .9
>PUSHW.G Shunk.DstSize
>PUSHW ZPDstBufPtr
>LDA.G hArcFile
>SYSCALL fwrite
.9 rts
@ -505,11 +524,15 @@ CS.QUIT jsr LeaveSubDir
beq .3
>SYSCALL fclose
.3 >LDA.G hMem
.3 >LDA.G hDstBuf
beq .4
>SYSCALL FreeMem
.4 lda hLIB
.4 >LDA.G hSrcBuf
beq .5
>SYSCALL FreeMem
.5 lda hLIB
beq .8
>SYSCALL UnloadLib
@ -562,15 +585,19 @@ DS.START
ArgIndex .BS 1
ArcName .BS 1
hSrcFullPath .BS 1
hArcFile .BS 1
hFile .BS 1
hMem .BS 1
Shunk .BS 2 SrcPtr
.BS 2 SrcSize
.BS 2 DstPtr
.BS 2 DstSize
hFile .BS 1
hArcFile .BS 1
hSrcBuf .BS 1
hDstBuf .BS 1
Shunk.SrcSize .BS 2
Shunk.DstSize .BS 2
Shunk.Alg .BS 1
PAKSTAT .BS S.PAKSTAT
.INB USR/SRC/BIN/X.FILEENUM.G
DS.END
.ED

View File

@ -2,11 +2,12 @@ NEW
AUTO 3,1
.LIST OFF
*--------------------------------------
REPMAX .EQ 16
STRINGMAX .EQ 16
REP.MAX .EQ 16
STRING.MAX .EQ 16
BL.MAX .EQ 66
WSIZE .EQ 4096
*--------------------------------------
PAK.B.STOREn .EQ %0
PAK.B.STRING .EQ %0
PAK.B.BYTE8 .EQ %0
PAK.B.TOP8 .EQ %10
PAK.B.TOP16 .EQ %110
@ -22,7 +23,7 @@ PAK.B.BACKLINK .EQ %1
* TOP24 : 1110 xxx
* REPn : 1111 xxxx (1-16)
* }
* BACKLINK : 1 !oooooooo !OOOO llllll (3-66)
* BACKLINK : 1 !BitCntWidePtr llllll (3-66)
*--------------------------------------
* Shunk Header :
* WORD : Target UNCompressed Length

View File

@ -9,15 +9,18 @@ CHNK.T.DIR .EQ 1
CHNK.T.FILE .EQ 2
CHNK.T.DATA .EQ 128
*
CHNK.TYPE .EQ 1 FILE/DIR
CHNK.AUXTYPE .EQ 2
CHNK.FNLEN .EQ 4
CHNK.FILE.TYPE .EQ 1
CHNK.FILE.AUXT .EQ 2
CHNK.FILE.FNLEN .EQ 4
*
CHNK.ALG .EQ 1 DATA
CHNK.ALG.STORE .EQ 0
CHNK.ULEN .EQ 2
CHNK.DIR.FNLEN .EQ 1
*
CHNK.CLEN .EQ 4
CHNK.DATA.ULEN .EQ 1
CHNK.DATA.T .EQ 3
CHNK.DATA.T.STORE .EQ 0
CHNK.DATA.T.PAK .EQ $C0
*
CHNK.DATA.PAK.TOPLEN .EQ 3
*--------------------------------------
MAN
SAVE INC/PAK.I

View File

@ -10,8 +10,10 @@ NEW
.INB INC/LIBPAK.I
*--------------------------------------
ZPSrcPtr .EQ ZPLIB
ZPSrcWPtr .EQ ZPLIB+2
ZPCnt .EQ ZPLIB+4
ZPCnt .EQ ZPLIB+2
ZPSrcBLPtr .EQ ZPLIB+4
ZPBLCnt .EQ ZPLIB+6
ZPCntTmp .EQ ZPLIB+8
ZPDstPtr .EQ ZPLIB+16
ZPStatPtr .EQ ZPLIB+18
@ -33,6 +35,8 @@ CS.START cld
.1 .DA LIB.LOAD
.DA LIB.UNLOAD
.DA Pak
L.MSG.Stats .DA MSG.Stats
L.MSG.Top24 .DA MSG.Top24
.DA 0
*--------------------------------------
LIB.LOAD
@ -40,12 +44,15 @@ LIB.UNLOAD clc
rts
*/--------------------------------------
* # Pak
* **In:**
* ##ASM
* PUSHW = S.PAKSTAT Ptr
* PUSHW = Output Buffer Ptr
* PUSHW = Input Buffer Len
* PUSHW = Input Buffer Ptr
* `>PUSHW StatPtr`
* `>PUSHW DstPtr`
* `>PUSHW SrcLen`
* `>PUSHW SrcPtr`
* `>LIBCALL hLIBPAK,Pak`
* ## RETURN VALUE
* CC, Y,A = CLEN
* CS, Pak failure
*\--------------------------------------
Pak >PULLW Pak.SrcPtr
>PULLW Pak.SrcLen
@ -60,7 +67,32 @@ Pak >PULLW Pak.SrcPtr
stz Pak.CntH,x
inx
bne .1
* Select best BL.BitCnt
ldx #8
ldy #0
lda Pak.SrcLen+1
beq .22
ldy #8
.2 asl
bcs .4
dey
bra .2
.22 lda Pak.SrcLen
.3 asl
bcs .4
dex
bra .3
.4 stx Pak.BL.BitCntL
sty Pak.BL.BitCntH
* PASS #1 : no store, update byte counters
stz Pak.bPass2
@ -69,8 +101,10 @@ Pak >PULLW Pak.SrcPtr
jsr Pak.Run
bcs .9
jsr Pak.BuildTOPTable
jsr Pak.PrintStats
* PASS #2 : store with TOP bytes
@ -84,31 +118,28 @@ Pak >PULLW Pak.SrcPtr
jsr Pak.Run
bcs .9
jsr Pak.PrintStats
ldy #S.PAKSHNK-1
.2 lda Pak.Shnk,y
.6 lda Pak.Shnk,y
dey
bpl .2
bpl .6
ldy #S.PAKSTAT-1
.3 lda Pak.Stat,y
.7 lda Pak.Stat,y
sta (ZPStatPtr),y
dey
bpl .3
bpl .7
clc
rts
.9 lda #E.OOM
sec
rts
.9 rts
*--------------------------------------
Pak.InitPass >LDYA Pak.SrcPtr
>STYA ZPSrcPtr
>STYA Pak.WPtr
lda Pak.SrcLen
eor #$ff
@ -117,8 +148,9 @@ Pak.InitPass >LDYA Pak.SrcPtr
lda Pak.SrcLen+1
eor #$ff
sta Pak.SrcCnt+1
stz Pak.RepCnt
sec
ror Pak.RepCnt
stz Pak.LastByte
ldx #S.PAKSTAT.PASS1
@ -135,168 +167,134 @@ Pak.InitPass >LDYA Pak.SrcPtr
rts
*--------------------------------------
Pak.Run lda #$ff
cmp Pak.SrcCnt+1 return 255 if not $ffxx
Pak.Run
Pak.Run.1 inc Pak.SrcCnt
bne .1
lda Pak.SrcCnt
eor #$ff return !xx if $ffxx
inc Pak.SrcCnt+1
beq .8 0 byte left...
.1 cmp #4 less than 4 chars, give up BL
bcc .4
.1 jsr Pak.ScanBL
bcs .4
sta Pak.MaxReadAhead
stz Pak.BestBLLen
bit Pak.bPass2
bpl .11
ldx #3
.2 inx
jsr Pak.ScanBL
bcs .3
>STYA Pak.BestBL
stx Pak.BestBLLen
cpx Pak.MaxReadAhead
bne .2
.3 lda Pak.BestBLLen
beq .4 NO BL found....
lda Pak.BestBL+1
ora #PAK.B.BACKLINK %1110 + Ofs.HI
jsr Pak.PutA
bcs .9
lda Pak.BestBL get Ofs.LO
jsr Pak.PutA
bcs .9
lda Pak.BestBLLen get back len
jsr Pak.PutA
bcs .9
lda Pak.BestBLLen
jsr Pak.SrcForward
ldx #S.PAKSTAT.BL
ldx #S.PAKSTAT.PASS1
jsr Pak.UpdateStats
jsr Pak.UpdateStats
jsr Pak.UpdateStats
bra Pak.Run
.4 lda (ZPSrcPtr)
jsr Pak.PutA
bcs .9
bra .3
lda #1
jsr Pak.SrcForward
.11 sec
lda Pak.Out.PutBitC
bra Pak.Run
ldy Pak.BL.BitCntH
beq .2
.8 lda Pak.RepCnt do we have a pending REP ?
beq .80
lda Pak.BestBL+1
jsr Pak.Out.PutYBits
ora #PAK.B.REPn yes, add it
jmp Pak.PutA.1
.2 ldy Pak.BL.BitCntL
lda Pak.BestBL
jsr Pak.Out.PutYBits
.80 clc
.9 rts
*--------------------------------------
Pak.SrcForward pha Len
ldy #6
lda Pak.BestBLLen
jsr Pak.Out.PutYBits
lda Pak.BestBLLen
clc
adc ZPSrcPtr
sta ZPSrcPtr
bcc .1
clc
bcc .3
inc ZPSrcPtr+1
.1 pla
.3 ldx #S.PAKSTAT.BL
jsr Pak.UpdateStats
lda Pak.BestBLLen
clc
adc Pak.SrcCnt
sta Pak.SrcCnt
bcc .2
bcc .1
inc Pak.SrcCnt+1
bmi .1
.8 clc
.9 rts
.2 sec
lda ZPSrcPtr
sbc #WSIZE
tay
lda ZPSrcPtr+1
sbc /WSIZE
tax
.4 lda (ZPSrcPtr)
jsr Pak.PutA
cpy Pak.WPtr
sbc Pak.WPtr+1
bcc .8
sty Pak.WPtr
stx Pak.WPtr+1
.8 rts
inc ZPSrcPtr
bne Pak.Run.1
inc ZPSrcPtr+1
bra Pak.Run.1
*--------------------------------------
* Scan between Pak.WPtr & ZPSrcPtr-A
* Byte string at ZPSrcPtr (len A)
* IN : X = Byte string length
* OUT : CC: Y,A=offset to BL
*--------------------------------------
Pak.ScanBL stx Pak.WStrLen
Pak.ScanBL >LDYA Pak.SrcPtr
>LDYA ZPSrcBLPtr
sec
lda ZPSrcPtr WLimit=ZPSrcPtr-WStrLen
sbc Pak.WStrLen
sta Pak.WLimit
ror Pak.bBLFound
lda ZPSrcPtr+1
sbc #0
sta Pak.WLimit+1
.1 sec
lda ZPSrcBLPtr
sbc ZPSrcPtr
sta ZPBLCnt
lda Pak.WLimit
sec
sbc Pak.WPtr
eor #$ff
sta Pak.Cnt
lda ZPSrcBLPtr+1
sbc ZPSrcPtr+1
sta ZPBLCnt+1 ZPSrcBLPtr < !BlCnt < ZPSrcPtr
bcs .8 ZPSrcBLPtr = ZPSrcPtr, exit
>LDYA ZPCnt
>STYA ZPCntTmp Stop at end of Src Data
ldy #0 ...or Y = BL.MAX
lda Pak.WLimit+1
sbc Pak.WPtr+1
eor #$ff
sta Pak.Cnt+1
.2 inc ZPBLCnt
bne .3
bcc .9 WLimit < Pak.WPtr
inc ZPBLCnt+1
beq .4 ZPSrcBLPtr = ZPSrcPtr
lda Pak.WPtr
sta ZPSrcWPtr
.3 lda (ZPSrcPtr),y
cmp (ZPSrcBLPtr),y
bne .4 End of string matching
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
cpy #BL.MAX
beq .4 Max BL len
clc
rts
inc ZPCntTmp
bne .2
inc ZPCntTmp+1
bne .2 Last Src Data
.6 inc ZPSrcWPtr
bne .7
inc ZPSrcWPtr+1
.4 dey Adjust BL len Range
dey (0 = 3 matching chars...etc..)
.7 inc Pak.Cnt
bne .1
inc Pak.Cnt+1
bne .1
bmi .5 not long enough
cpy Pak.BestBLLen
bcs .5 not better ...
sty Pak.BestBLLen
>LDYA ZPBLCnt
>STYA Pak.BestBL
stz Pak.bBLFound
.5 inc ZPSrcBLPtr
bne .1
inc ZPSrcBLPtr+1
bra .1
.8 rol Pak.bBLFound
.9 sec
rts
*--------------------------------------
Pak.BuildTOPTable
@ -310,8 +308,8 @@ Pak.BuildTOPTable
ldx #0
.2 lda Pak.Cnt
ora Pak.Cnt+1
.2 lda Pak.CntL,x
ora Pak.CntH,x
beq .3
stz Pak.bStop
@ -344,11 +342,28 @@ Pak.BuildTOPTable
cpy #24
bne .1
.8 sty Pak.TopCnt
.8 sty Pak.Shnk+S.PAKSHNK.TOPCNT
rts
*--------------------------------------
Pak.PutA bit Pak.RepCnt
Pak.PutA bit Pak.bPass2
bmi Pak.PutA.2
tax
inc Pak.CntL,x
bne .1
inc Pak.CntH,x
.1 ldx #S.PAKSTAT.PASS1
jsr Pak.UpdateStats
ldx #S.PAKSTAT.BYTE8
jsr Pak.UpdateStats
clc
rts
Pak.PutA.2 bit Pak.RepCnt
bpl .1
stz Pak.RepCnt LastByte invalid...
@ -375,7 +390,7 @@ Pak.PutA bit Pak.RepCnt
.3 inc Pak.RepCnt
lda Pak.RepCnt
cmp #REPMAX
cmp #REP.MAX
bne .8
dec
@ -441,7 +456,7 @@ Pak.PutA.1 bit Pak.bPass2
Pak.Flush ldx Pak.StringLen
beq .8
lda #PAK.B.STOREn
lda #PAK.B.STRING
ldy #4
jsr Pak.Out.PutYBits
bcs .9
@ -472,11 +487,43 @@ Pak.UpdateStats inc Pak.Stat,x
inc Pak.Stat+1,x
.8 rts
*--------------------------------------
Pak.PrintStats ldx #14
.1 >PUSHW Pak.Stat,x
dex
dex
bpl .1
>PUSHBI 16
>LDYA L.MSG.Stats
>SYSCALL printf
ldx #24
.2 >PUSHB Pak.Shnk+S.PAKSHNK.TOPCNT,x
dex
bpl .2
>PUSHBI 25
>LDYA L.MSG.Top24
>SYSCALL printf
>DEBUG
rts
*--------------------------------------
* .INB USR/SRC/LIB/LIBPAK.S.IN
.INB USR/SRC/LIB/LIBPAK.S.OUT
*--------------------------------------
CS.END
*--------------------------------------
MSG.Stats .AS "\r\nPass 1 : %5D\r\n"
.AS "Pass 2 : %5D\r\n"
.AS "Byte 8 : %5D\r\n"
.AS "Top 8 : %5D\r\n"
.AS "Top 16 : %5D\r\n"
.AS "Top 24 : %5D\r\n"
.AS "Rep N : %5D\r\n"
.AZ "BLNK : %5D\r\n"
MSG.Top24 .AZ "Top24 : %d\r\n%h%h%h%h%h%h%h%h%h%h%h%h%h%h%h%h%h%h%h%h%h%h%h%h\r\n"
TOP.Bits .DA #%10000,#%110000,#%1110000
TOP.BitCnt .DA #5,#6,#7
TOP.Stat .DA #S.PAKSTAT.TOP8,S.PAKSTAT.TOP16,S.PAKSTAT.TOP24
@ -490,18 +537,22 @@ Pak.DstCnt .BS 2
Pak.RepCnt .BS 1
Pak.LastByte .BS 1
Pak.StringLen .BS 1
Pak.StringBuf .BS STRINGMAX
Pak.BL.BitCntL .BS 1
Pak.BL.BitCntH .BS 1
Pak.bBLFound .BS 1
Pak.BestBLLen .BS 1
Pak.BestBL .BS 2
Pak.StringLen .BS 1
Pak.StringBuf .BS STRING.MAX
Pak.TopCnt .BS 1
Pak.Cnt .BS 2
Pak.bStop .BS 1
Pak.bPass2 .BS 1
Pak.MaxReadAhead .BS 1
Pak.BestBLLen .BS 1
Pak.BestBL .BS 2
Pak.WPtr .BS 2
Pak.WLimit .BS 2
Pak.WStrLen .BS 1

View File

@ -5,9 +5,9 @@ NEW
* ZPInBufPtr = Ptr to Shunk Data
* ZPOutBufPtr = Ptr to Uncompressed Data
*--------------------------------------
* ZPnCnt = !ZPULen
* ZPPtr1
* ZPPtr2
* ZPnCnt = !ZPULen
* ZPInMask,ZPOutLastByte
*--------------------------------------
X.Unpak lda (ZPInBufPtr) ULEN LO
@ -17,22 +17,45 @@ X.Unpak lda (ZPInBufPtr) ULEN LO
jsr X.Unpak.NextByte
lda (ZPInBufPtr) ULEN HI
eor #$ff
sta ZPnCnt+1
jsr X.Unpak.NextByte
lda (ZPInBufPtr) TOPLEN
lda (ZPInBufPtr) CHNK.DATA.T
beq X.Unpak.T.STORE
cmp #CHNK.DATA.T.PAK
beq X.Unpak.T.PAK
sec
rts
X.Unpak.T.STORE ldy #0 start at 1 to skip CHNK.DATA.T
.1 iny
bne .2
inc ZPInBufPtr+1
.2 lda (ZPInBufPtr),y
jsr X.Unpak.PutByte.1
bne .1
clc
rts
X.Unpak.T.PAK jsr X.Unpak.NextByte skip CHNK.DATA.T
lda (ZPInBufPtr) CHNK.DATA.PAK.TOPLEN
clc
adc ZPInBufPtr skip TOP table
sta ZPPtr1
lda ZPInBufPtr+1
lda ZPInBufPtr+1 ZPInBufPtr = TOPs
adc #0
sta ZPPtr1+1
sta ZPPtr1+1 ZPPtr1 = DATA
jsr X.Unpak.NextByte
lda #$80
sta ZPInMask