diff --git a/BIN/PAK.S.txt b/BIN/PAK.S.txt index 5b36e5ae..2c198bad 100644 --- a/BIN/PAK.S.txt +++ b/BIN/PAK.S.txt @@ -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 diff --git a/INC/LIBPAK.I.txt b/INC/LIBPAK.I.txt index 13182266..87df861e 100644 --- a/INC/LIBPAK.I.txt +++ b/INC/LIBPAK.I.txt @@ -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 diff --git a/INC/PAK.I.txt b/INC/PAK.I.txt index d2454ddf..a13151b9 100644 --- a/INC/PAK.I.txt +++ b/INC/PAK.I.txt @@ -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 diff --git a/LIB/LIBPAK.S.txt b/LIB/LIBPAK.S.txt index 8e746210..550705a4 100644 --- a/LIB/LIBPAK.S.txt +++ b/LIB/LIBPAK.S.txt @@ -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 diff --git a/SHARED/X.UNPAK.S.txt b/SHARED/X.UNPAK.S.txt index a61d33b8..ed78f062 100644 --- a/SHARED/X.UNPAK.S.txt +++ b/SHARED/X.UNPAK.S.txt @@ -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