NEW AUTO 3,1 .LIST OFF *-------------------------------------- * ZPInBufPtr = Ptr to Shunk Data * ZPOutBufPtr = Ptr to Uncompressed Data *-------------------------------------- * ZPnCnt = !ZPULen * ZPPtr1 * ZPPtr2 * ZPInMask,ZPBLOfsLBits,ZPBLOfsHBits,ZPBLLenBits *-------------------------------------- X.Unpak >DEBUG lda (ZPInBufPtr) CHNK.DATA.T bne X.Unpak.PAK *-------------------------------------- X.Unpak.STORE ldy #0 .1 iny bne .2 inc ZPInBufPtr+1 .2 lda (ZPInBufPtr),y jsr X.Unpak.PutByte bne .1 X.Unpak.STORE.8 clc rts *-------------------------------------- X.Unpak.PAK pha A = BLBITS and #$70 lsr lsr lsr lsr sta ZPBLLenBits pla ldx #8 and #$0f tax cmp #8 bcc .10 ldx #8 and #7 .10 stx ZPBLOfsLBits sta ZPBLOfsHBits jsr X.Unpak.NextByte get TOPCNT lda (ZPInBufPtr) ULEN LO eor #$ff sta ZPnCnt jsr X.Unpak.NextByte lda (ZPInBufPtr) ULEN HI eor #$ff sta ZPnCnt+1 jsr X.Unpak.NextByte lda (ZPInBufPtr) CHNK.DATA.PAK.TOPLEN tax jsr X.Unpak.NextByte get TOPCNT lda ZPInBufPtr sta ZPPtr1 lda ZPInBufPtr+1 sta ZPPtr1+1 txa clc adc ZPInBufPtr skip TOP table sta ZPInBufPtr bcc .11 inc ZPInBufPtr+1 .11 lda #$80 sta ZPInMask *-------------------------------------- .1 lda ZPnCnt ora ZPnCnt+1 beq X.Unpak.STORE.8 *-------------------------------------- .2 jsr X.Unpak.GetBitInC bcs .3 ->TOP * BYTE8 ldx #8 jsr X.Unpak.GetXBitInA bra .52 *-------------------------------------- .3 jsr X.Unpak.GetBitInC bcs .4 ->TOP16 * TOP8 ldx #3 jsr X.Unpak.GetXBitInA bra .51 *-------------------------------------- .4 jsr X.Unpak.GetBitInC bcs .5 ->TOP32 * TOP16 ldx #3 jsr X.Unpak.GetXBitInA ora #%1000 bra .51 *-------------------------------------- .5 jsr X.Unpak.GetBitInC bcs .6 ->BACKLINK * TOP32 ldx #4 jsr X.Unpak.GetXBitInA ora #%10000 .51 tay lda (ZPPtr1),y .52 jsr X.Unpak.PutByte bne .2 clc rts *-------------------------------------- * BACKLINK : 1111 OfsLBits OfsHBits LenBits .6 ldx ZPBLOfsLBits jsr X.Unpak.GetXBitInA tay eor #$ff sec adc ZPOutBufPtr sta ZPPtr2 lda ZPBLOfsHBits beq .61 php tax jsr X.Unpak.GetXBitInA plp .61 pha >PUSHYA pla eor #$ff adc ZPOutBufPtr+1 sta ZPPtr2+1 ldx ZPBLLenBits jsr X.Unpak.GetXBitInA inc +1 inc +1 inc +1 >PUSHA pha >PUSHBI 3 >LDYA L.DBG >SYSCALL printf pla tax ldy #0 .62 lda (ZPPtr2),y jsr X.Unpak.PutByte beq .99 iny dex bne .62 lda #'\' >SYSCALL putchar lda #C.CR >SYSCALL putchar lda #C.LF >SYSCALL putchar jmp .1 .99 sec rts *-------------------------------------- X.Unpak.GetXBitInA lda #0 .1 jsr X.Unpak.GetBitInC rol dex bne .1 rts *-------------------------------------- X.Unpak.GetBitInC pha clc lda (ZPInBufPtr) and ZPInMask beq .1 sec .1 php lsr ZPInMask bcc .8 ror ZPInMask jsr X.Unpak.NextByte .8 plp pla rts *-------------------------------------- X.Unpak.NextByte inc ZPInBufPtr bne .8 inc ZPInBufPtr+1 .8 rts *-------------------------------------- X.Unpak.PutByte sta (ZPOutBufPtr) pha phx phy lda (ZPOutBufPtr) >SYSCALL putchar lda (ZPOutBufPtr) cmp #C.CR bne .6 lda #C.LF >SYSCALL putchar .6 ply plx pla inc ZPOutBufPtr bne .1 inc ZPOutBufPtr+1 .1 inc ZPnCnt bne .2 inc ZPnCnt+1 .2 rts *-------------------------------------- .LIST ON X.Unpak.Size .EQ *-X.Unpak .LIST OFF *-------------------------------------- MAN SAVE USR/SRC/SHARED/X.UNPAK.S LOAD USR/SRC/BIN/UNPAK.S ASM