NEW AUTO 3,1 .LIST OFF .OP 65C02 .OR $2000 .TF ROOT/UNPAK *-------------------------------------- .INB INC/MACROS.I .INB INC/A2OSX.I .INB INC/LIBPAK.I *-------------------------------------- ZPPakHdrPtr .EQ ZPBIN ZPPakDataPtr .EQ ZPBIN+2 ZPPakSrcPtr .EQ ZPBIN+4 *-------------------------------------- UNPAK.Mask .EQ ZPBIN+8 UNPAK.LastByte .EQ ZPBIN+9 UNPAK.Cnt .EQ ZPBIN+10 UNPAK.Ofs .EQ ZPBIN+12 UNPAK.BLOfs .EQ ZPBIN+14 *-------------------------------------- * File Header (16 Bytes) *-------------------------------------- CS.START cld jmp (.1,x) .DA #$61 6502,Level 1 (65c02) .DA #1 BIN Layout Version 1 .DA 0 .DA CS.END-CS.START CS .DA DS.END-DS.START DS .DA #64 SS .DA #16 ZP .DA 0 *-------------------------------------- * Relocation Table *-------------------------------------- .1 .DA CS.INIT .DA CS.RUN .DA CS.DOEVENT .DA CS.QUIT L.MSG.USAGE .DA MSG.USAGE L.MSG.DEBUG .DA MSG.DEBUG L.MSG.UnpakErr .DA MSG.UnpakErr L.MSG.DEBUG.S3 .DA MSG.DEBUG.S3 .DA 0 *-------------------------------------- CS.INIT clc rts *-------------------------------------- CS.RUN ldy #S.PS.ARGC lda (pPs),y bne CS.RUN.Pak >PUSHBI 0 >LDYA L.MSG.USAGE >SYSCALL printf lda #E.SYN sec rts *-------------------------------------- .8 sec .9 rts .1 >PUSHW.G PAK.Stat+S.PAKSTAT.STORE >PUSHW.G PAK.Stat+S.PAKSTAT.S4 >PUSHW.G PAK.Stat+S.PAKSTAT.S3 >PUSHW.G PAK.Stat+S.PAKSTAT.REP >PUSHW.G PAK.Stat+S.PAKSTAT.BL >PUSHW.G PAK.Stat+S.PAKSTAT.PASS2 >PUSHW.G PAK.Stat+S.PAKSTAT.PASS1 >PUSHW.G PAK.FileSize >PUSHBI 16 >LDYA L.MSG.DEBUG >SYSCALL printf *-------------------------------------- * Y,A = Ptr to Shunk Header: * +0 : Flags * 10000000 : LZ8 encoded, 1 byte (ESC) follow * 01000000 : BS *-------------------------------------- CS.RUN.Unpak lda ZPPakHdrPtr clc adc #S.PAKSTAT sta ZPPakDataPtr lda ZPPakHdrPtr+1 adc /S.PAKSTAT sta ZPPakDataPtr+1 lda (ZPPakHdrPtr) eor #$ff sta UNPAK.Cnt ldy #1 lda (ZPPakHdrPtr),y eor #$ff sta UNPAK.Cnt+1 lda #$80 sta UNPAK.Mask >LDA.G PAK.hFileBuf >SYSCALL GetMemPtr >STYA ZPPakSrcPtr stz UNPAK.Ofs stz UNPAK.Ofs+1 .1 inc UNPAK.Cnt bne .2 inc UNPAK.Cnt+1 bne .2 lda #0 sec rts .2 lda #'>' >SYSCALL PutChar jsr CS.RUN.UnpakGetBitInC bcs .3 *-------------------------------------- * SHORT3 ldx #3 jsr CS.RUN.UnpakGetXBitInA clc adc #S.PAKHDR.SHORT3 tay lda (ZPPakHdrPtr),y sta UNPAK.LastByte jsr DEBUG.S3 jsr CS.RUN.UnpakCmpA bcs .9 bra .1 .3 jsr CS.RUN.UnpakGetBitInC bcs .4 *-------------------------------------- * SHORT4 ldx #4 jsr CS.RUN.UnpakGetXBitInA clc adc #S.PAKHDR.SHORT4 tay lda (ZPPakHdrPtr),y sta UNPAK.LastByte jsr CS.RUN.UnpakCmpA bcs .9 bra .1 .4 jsr CS.RUN.UnpakGetBitInC bcs .5 *-------------------------------------- * REPn ldx #4 jsr CS.RUN.UnpakGetXBitInA tay tax lda UNPAK.LastByte .41 jsr CS.RUN.UnpakCmpA bcs .9 dey bne .41 .42 txa clc adc UNPAK.Cnt sta UNPAK.Cnt bcc .2 inc UNPAK.Cnt+1 bra .2 .5 jsr CS.RUN.UnpakGetBitInC bcs .6 *-------------------------------------- * BACKLINK ldx #4 jsr CS.RUN.UnpakGetXBitInA sta UNPAK.BLOfs+1 jsr CS.RUN.UnpakGetByteInA sta UNPAK.BLOfs jsr CS.RUN.UnpakGetByteInA tax tay .51 bra .42 *-------------------------------------- * STOREn .6 ldx #4 jsr CS.RUN.UnpakGetXBitInA tay tax .61 jsr CS.RUN.UnpakGetByteInA dey bne .61 sta UNPAK.LastByte bra .42 .9 >PUSHW UNPAK.Ofs >PUSHBI 2 >LDYA L.MSG.UnpakErr >SYSCALL printf lda #0 sec rts *-------------------------------------- CS.RUN.UnpakGetByteInA ldx #8 *-------------------------------------- CS.RUN.UnpakGetXBitInA lda #0 .1 jsr CS.RUN.UnpakGetBitInC rol dex bne .1 rts *-------------------------------------- CS.RUN.UnpakGetBitInC pha clc lda (ZPPakDataPtr) and UNPAK.Mask beq .1 sec .1 php lsr UNPAK.Mask bne .8 lda #$80 sta UNPAK.Mask inc ZPPakDataPtr bne .8 inc ZPPakDataPtr+1 .8 plp pla rts *-------------------------------------- CS.RUN.UnpakCmpA cmp (ZPPakSrcPtr) bne .9 inc ZPPakSrcPtr bne .1 inc ZPPakSrcPtr+1 .1 inc UNPAK.Ofs bne .8 inc UNPAK.Ofs+1 .8 clc rts .9 sec rts *-------------------------------------- DEBUG.S3 pha phx phy >PUSHA >PUSHBI 1 >LDYA L.MSG.DEBUG.S3 >SYSCALL printf ply plx pla rts lda #0 sec rts *-------------------------------------- CS.DOEVENT sec rts *-------------------------------------- CS.QUIT >LDA.G PAK.hFileName beq .1 >SYSCALL FreeMem .1 >LDA.G PAK.hFileBuf beq .2 >SYSCALL FreeMem .2 >LDA.G PAK.hOutBuf beq .8 >SYSCALL FreeMem .8 clc rts *-------------------------------------- CS.END MSG.USAGE .AS "Usage : UNPAK Archive [DstDir]\r\n" *-------------------------------------- MSG.DEBUG .AS "Src Length : %D\r\n" .AS "Pass #1 : %D\r\n" .AS "Pass #2 : %D\r\n" .AS "BL Count : %D\r\n" .AS "REP Count : %D\r\n" .AS "S3 Count : %D\r\n" .AS "S4 Count : %D\r\n" .AZ "STO Count : %D\r\n" MSG.UnpakErr .AZ "UnPak Error at Offset : %H\r\n" MSG.DEBUG.S3 .AZ "S3:%h\r\n" *-------------------------------------- .DUMMY .OR 0 DS.START PAK.hFileName .BS 1 PAK.FileSize .BS 2 PAK.hFileBuf .BS 1 PAK.hOutBuf .BS 1 PAK.Stat .BS S.PAKSTAT DS.END .ED *-------------------------------------- MAN SAVE BIN/UNPAK.S ASM