NEW AUTO 3,1 .LIST OFF *-------------------------------------- * ZPInBufPtr = Ptr to Shunk Data * ZPOutBufPtr = Ptr to Uncompressed Data *-------------------------------------- * ZPnCnt = !ZPULen * ZPPtr1 * ZPPtr2 * ZPInMask,ZPOutLastByte *-------------------------------------- X.Unpak 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.T beq X.Unpak.T.STORE 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 ZPInBufPtr = TOPs adc #0 sta ZPPtr1+1 ZPPtr1 = DATA lda #$80 sta ZPInMask .1 lda ZPnCnt ora ZPnCnt+1 bne .2 clc rts *-------------------------------------- .2 jsr X.Unpak.GetBitInC bcs .7 ->BACKLINK jsr X.Unpak.GetBitInC bcs .3 ->TOP * BYTE8 jsr X.Unpak.GetByteInA 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 ->TOP24 * TOP16 ldx #3 jsr X.Unpak.GetXBitInA ora #8 bra .51 *-------------------------------------- .5 jsr X.Unpak.GetBitInC bcs .6 ->REPn * TOP24 ldx #3 jsr X.Unpak.GetXBitInA ora #16 .51 tay lda (ZPInBufPtr),y .52 jsr X.Unpak.PutByte bne .2 clc rts *-------------------------------------- * REPn .6 lda ZPOutLastByte .61 jsr X.Unpak.PutByte.1 beq .99 dey bpl .61 +1 bra .1 .99 sec rts *-------------------------------------- * BACKLINK : 1 oooooooo OOOO llllll .7 jsr X.Unpak.GetByteInA clc adc ZPOutBufPtr sta ZPPtr2 php ldx #4 jsr X.Unpak.GetXBitInA plp adc ZPOutBufPtr+1 sta ZPPtr2+1 jsr X.Unpak.GetByteInA inc +1 inc +1 * inc +1 tay .71 lda (ZPPtr2),y jsr X.Unpak.PutByte beq .99 dey bpl .71 +1 bra .1 *-------------------------------------- X.Unpak.GetByteInA ldx #8 X.Unpak.GetXBitInA lda #0 .1 jsr X.Unpak.GetBitInC rol dex bne .1 rts *-------------------------------------- X.Unpak.GetBitInC pha clc lda (ZPPtr1) 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 ZPPtr1 bne .8 inc ZPPtr1+1 .8 rts *-------------------------------------- X.Unpak.PutByte sta ZPOutLastByte X.Unpak.PutByte.1 sta (ZPOutBufPtr) 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