NEW AUTO 3,1 .LIST OFF .OP 65C02 .OR $2000 .TF bin/unpak *-------------------------------------- .INB inc/macros.i .INB inc/a2osx.i .INB inc/mli.e.i .INB inc/pak.i *-------------------------------------- .DUMMY .OR ZPBIN ZS.START ZPPtr1 .BS 2 ZPPtr2 .BS 2 ZPInBufPtr .BS 2 ZPOutBufPtr .BS 2 ZPnCnt .BS 2 ZPInMask .BS 1 ZPBLOfsLBits .BS 1 ZPBLOfsHBits .BS 1 ZPBLLenBits .BS 1 ZPInBufLen .BS 2 ZPOutBufLen .BS 2 ZPFullPathPtr .BS 2 ZPRelPathPtr .BS 2 ZPProgress .BS 1 ZS.END .ED *-------------------------------------- * 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 #ZS.END-ZS.START Zero Page Size .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.DIR .DA MSG.DIR L.MSG.FILE .DA MSG.FILE L.MSG.OK .DA MSG.OK L.MSG.E.IARC .DA MSG.E.IARC L.MSG.SPINNER .DA MSG.SPINNER .DA 0 *-------------------------------------- CS.INIT clc rts *-------------------------------------- CS.RUN stz ZPProgress >LDYAI CHNK.SIZE >SYSCALL GetMem bcc s1 rts s1 >STYA ZPInBufPtr txa >STA.G hInBuf lda #1 >SYSCALL ArgV bcs .99 >STYA ZPPtr1 See if first arg is -p pha lda (ZPPtr1) cmp #'-' bne .1 No dash-arguments pla ldy #$01 lda (ZPPtr1),y cmp #'p' bne .99 -p is only valid argument sty ZPProgress lda #2 >SYSCALL ArgV bcs .99 bra .11 .1 pla .11 jsr CS.RUN.OpenArc bcs .9 >LDYAI 256 >SYSCALL GetMem bcc .15 rts .15 >STYA ZPFullPathPtr txa >STA.G hFullPath lda ZPProgress See if -p was provided beq .2 lda #' ' Space for spinner to eat >SYSCALL PutChar lda #3 Have dash-args, check arg #3 bra .3 .2 lda #2 No dash-args, check arg #2 .3 >SYSCALL ArgV bcc .4 ldy #S.PS.hCWD lda (pPS),y >SYSCALL GetMemPtr .4 jsr CS.RUN.SetupPath >LDYAI CHNK.SIZE >SYSCALL GetMem bcs .9 txa >STA.G hOutBuf jsr CS.RUN.LOOP bcs .9 jsr CS.RUN.TidyUp lda #0 sec .9 rts .99 >PUSHW L.MSG.USAGE >PUSHBI 0 >SYSCALL PrintF lda #E.SYN sec rts *-------------------------------------- CS.RUN.SetupPath >STYA ZPPtr1 ldy #$ff .2 iny lda (ZPPtr1),y sta (ZPFullPathPtr),y bne .2 dey lda #'/' cmp (ZPFullPathPtr),y beq .3 iny sta (ZPFullPathPtr),y .3 tya sec adc ZPFullPathPtr sta ZPRelPathPtr lda #0 adc ZPFullPathPtr+1 sta ZPRelPathPtr+1 rts *-------------------------------------- CS.RUN.LOOP jsr CS.RUN.GetByte bcs .9 .10 cmp #CHNK.T.DIR bne .1 jsr CS.RUN.GetFileName bcs .99 ldx #0 jsr CS.RUN.PrintFN jsr CS.RUN.CheckDir bcs .99 lda ZPProgress bne CS.RUN.LOOP >LDYA L.MSG.OK >SYSCALL PutS bra CS.RUN.LOOP clc .99 rts .9 jmp CS.RUN.E.IARC .1 cmp #CHNK.T.FILE bne .9 jsr CS.RUN.GetFileType bcs .99 jsr CS.RUN.GetFileName bcs .99 ldx #2 jsr CS.RUN.PrintFN jsr CS.RUN.OpenFile bcs .99 *-------------------------------------- jsr CS.RUN.GetByte DATA bcs .8 eof .2 cmp #CHNK.T.DATA bne .3 Could be a 0 byte file .20 lda ZPProgress beq .21 jsr CS.RUN.Spinner bra .22 .21 lda #'.' >SYSCALL PutChar .22 jsr CS.RUN.GetByte DataLen LO bcs .99 sta ZPInBufLen jsr CS.RUN.GetByte DataLen HI bcs .99 sta ZPInBufLen+1 jsr CS.RUN.ReadData bcs .99 ldy #1 lda (ZPInBufPtr),y sta ZPOutBufLen iny lda (ZPInBufPtr),y sta ZPOutBufLen+1 >LDA.G hOutBuf >SYSCALL GetMemPtr >STYA ZPOutBufPtr jsr X.Unpak bcs .9 jsr CS.RUN.WriteFile bcs .99 jsr CS.RUN.GetByte bcs .8 cmp #CHNK.T.DATA beq .20 .3 pha jsr .8 pla jmp .10 .8 >LDA.G hFile >SYSCALL FClose LDA ZPProgress bne S1 >LDYA L.MSG.OK >SYSCALL PutS S1 rts *-------------------------------------- CS.RUN.PrintFN lda ZPProgress bne .9 >PUSHW L.MSG.DIR,x >PUSHW ZPFullPathPtr >PUSHBI 2 >SYSCALL PrintF .9 rts *-------------------------------------- CS.RUN.Spinner lda #8 Backspace >SYSCALL PutChar >LDYA L.MSG.SPINNER >STYA ZPPtr2 >LDA.G SpinState tay lda (ZPPtr2),y >SYSCALL PutChar >INC.G SpinState cmp #4 bne .9 >STZ.G SpinState .9 rts *-------------------------------------- CS.RUN.NewLine LDA #C.CR >SYSCALL PutChar LDA #C.LF >SYSCALL PutChar rts *-------------------------------------- CS.RUN.TidyUp lda ZPProgress beq .9 lda #8 >SYSCALL PutChar lda #' ' >SYSCALL PutChar jsr CS.RUN.NewLine .9 rts *-------------------------------------- CS.RUN.OpenArc >PUSHYA >PUSHBI O.RDONLY >PUSHBI $CF PAK >PUSHWZ Aux type >SYSCALL FOpen bcs .9 >STA.G hArcFile >PUSHA >PUSHW ZPInBufPtr >PUSHWI 3 >SYSCALL FRead bcs .9 cpy #3 bne .99 dey .1 lda MSG.PAK,y cmp (ZPInBufPtr),y bne .99 dey bpl .1 clc .9 rts .99 CS.RUN.E.IARC >PUSHW L.MSG.E.IARC >PUSHBI 0 >SYSCALL PrintF lda #E.SYN sec rts *-------------------------------------- CS.RUN.GetFileType >PUSHB.G hArcFile >PUSHEA.G FileType >PUSHWI 3 >SYSCALL FRead rts *-------------------------------------- CS.RUN.GetFileName jsr CS.RUN.GetByte bcs .9 pha >PUSHB.G hArcFile >PUSHW ZPRelPathPtr ply lda #0 >PUSHYA >SYSCALL FRead bcs .9 lda #0 sta (ZPRelPathPtr),y * clc .9 rts *-------------------------------------- CS.RUN.ReadData >PUSHB.G hArcFile >LDA.G hInBuf >SYSCALL GetMemPtr >STYA ZPInBufPtr >PUSHYA >PUSHW ZPInBufLen >SYSCALL FRead rts *-------------------------------------- CS.RUN.GetByte >LDA.G hArcFile >SYSCALL GetC rts *-------------------------------------- CS.RUN.CheckDir >PUSHW ZPFullPathPtr >PUSHEA.G STAT >SYSCALL Stat bcc .1 >PUSHW ZPFullPathPtr >PUSHWI S.STAT.MODE.FO+S.STAT.MODE.FG+S.STAT.MODE.FU >SYSCALL MKDir rts .1 ldy #STAT+S.STAT.MODE+1 lda (pData),y and #$F0 cmp /S.STAT.MODE.DIR bne .99 clc rts .99 lda #MLI.E.INVPATH sec .9 rts *-------------------------------------- CS.RUN.OpenFile >PUSHW ZPFullPathPtr >PUSHBI O.CREATE+O.WRONLY+O.TRUNC >PUSHB.G FileType >PUSHW.G FileAuxType >SYSCALL FOpen bcs .9 >STA.G hFile .9 rts *-------------------------------------- CS.RUN.WriteFile >PUSHB.G hFile >LDA.G hOutBuf >SYSCALL GetMemPtr >PUSHYA >PUSHW ZPOutBufLen >SYSCALL FWrite rts *-------------------------------------- CS.DOEVENT sec rts *-------------------------------------- CS.QUIT >LDA.G hFile beq .1 >SYSCALL FClose .1 >LDA.G hFullPath beq .2 >SYSCALL FreeMem .2 >LDA.G hOutBuf beq .3 >SYSCALL FreeMem .3 >LDA.G hInBuf beq .4 >SYSCALL FreeMem .4 >LDA.G hArcFile beq .8 >SYSCALL FClose .8 clc rts *-------------------------------------- .INB usr/src/shared/x.unpak.s *-------------------------------------- CS.END MSG.USAGE .AS "Usage : UNPAK [-p] Archive [DstDir]\r\n" .AZ " -p: Show progress spinner\r\n" MSG.DIR .AZ "Creating Dir:%s..." MSG.FILE .AZ "Extracting File:%s..." MSG.OK .AZ "[OK]" MSG.E.IARC .AZ "\r\nInvalid/corrupt archive" MSG.PAK .AS "PAK" MSG.SPINNER .AS "|/-\" *-------------------------------------- .DUMMY .OR 0 DS.START hArcFile .BS 1 hFullPath .BS 1 hInBuf .BS 1 hOutBuf .BS 1 hFile .BS 1 FileType .BS 1 FileAuxType .BS 2 SpinState .BS 1 STAT .BS S.STAT DS.END .ED *-------------------------------------- MAN SAVE usr/src/bin/unpak.s ASM