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 ZPFullPathPtr .BS 2 ZPRelPathPtr .BS 2 ZPInBufPtr .BS 2 ZPOutBufPtr .BS 2 ZPULen .BS 2 ZPnCnt .BS 2 ZPInMask .BS 1 ZPOutLastByte .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.ERR .DA MSG.ERR L.MSG.E.IARC .DA MSG.E.IARC L.MSG.E.OFS .DA MSG.E.OFS L.MSG.DEBUG .DA MSG.DEBUG .DA 0 *-------------------------------------- CS.INIT clc rts *-------------------------------------- CS.RUN >LDYAI CHNK.SIZE >SYSCALL getmem bcs .9 >STYA ZPInBufPtr txa >STA.G hInBuf lda #1 >SYSCALL Argv bcs .9 jsr CS.RUN.OpenArc bcs .9 >LDYAI 256 >SYSCALL getmem bcs .9 >STYA ZPFullPathPtr txa >STA.G hFullPath lda #2 >SYSCALL Argv bcc .1 ldy #S.PS.hCWD lda (pPS),y >SYSCALL getmemptr .1 jsr CS.RUN.SetupPath >LDYAI CHNK.SIZE >SYSCALL getmem bcs .9 txa >STA.G hOutBuf jsr CS.RUN.LOOP bcs .9 lda #0 sec .9 rts .99 >PUSHBI 0 >LDYA L.MSG.USAGE >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 .9 ldx #0 jsr CS.RUN.PrintFN jsr CS.RUN.CheckDir bcs .99 >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 .9 jsr CS.RUN.GetFileName bcs .9 ldx #2 jsr CS.RUN.PrintFN jsr CS.RUN.OpenFile bcs .9 *-------------------------------------- jsr CS.RUN.GetByte DATA bcs .8 eof .2 cmp #CHNK.T.DATA bne .3 Could be a 0 byte file .20 jsr CS.RUN.GetByte ALG bcs .9 cmp #0 STORE bne .9 jsr CS.RUN.GetByte ULEN LO bcs .9 sta ZPULen jsr CS.RUN.GetByte ULEN HI bcs .9 sta ZPULen+1 jsr CS.RUN.ReadData bcs .9 jsr CS.RUN.WriteFile bcs .9 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 >LDYA L.MSG.OK >SYSCALL puts rts *-------------------------------------- CS.RUN.PrintFN >PUSHW ZPFullPathPtr >PUSHBI 2 >LDYA L.MSG.DIR,x >SYSCALL printf rts *-------------------------------------- CS.RUN.OpenArc pha >PUSHWZ Aux type >PUSHBI $CF PAK >PUSHBI O.RDONLY pla >SYSCALL FOpen bcs .9 >STA.G hArcFile pha >PUSHWI 3 >PUSHW ZPInBufPtr pla >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 >LDYA L.MSG.E.IARC >SYSCALL puts lda #E.SYN sec rts *-------------------------------------- CS.RUN.GetFileType >PUSHWI 3 >PUSHEA.G FileType >LDA.G hArcFile >SYSCALL fread rts *-------------------------------------- CS.RUN.GetFileName jsr CS.RUN.GetByte bcs .9 tay lda #0 >PUSHYA >PUSHW ZPRelPathPtr >LDA.G hArcFile >SYSCALL fread bcs .9 lda #0 sta (ZPRelPathPtr),y * clc .9 rts *-------------------------------------- CS.RUN.ReadData >PUSHW ZPULen >PUSHW ZPInBufPtr >LDA.G hArcFile >SYSCALL fread rts *-------------------------------------- CS.RUN.GetByte >LDA.G hArcFile >SYSCALL getc rts *-------------------------------------- CS.RUN.CheckDir >PUSHEA.G STAT >LDYA ZPFullPathPtr >SYSCALL stat bcc .1 >LDYA ZPFullPathPtr >SYSCALL mkdir rts .1 ldy #STAT+S.STAT.P.TYPE lda (pData),y cmp #$F bne .99 clc rts .99 lda #MLI.E.INVPATH sec .9 rts *-------------------------------------- CS.RUN.OpenFile >PUSHW.G FileAuxType >PUSHB.G FileType >PUSHBI O.CREATE+O.WRONLY+O.TRUNC >LDYA ZPFullPathPtr >SYSCALL FOpen bcs .9 >STA.G hFile .9 rts *-------------------------------------- CS.RUN.WriteFile >PUSHW ZPULen >PUSHW ZPInBufPtr >LDA.G hFile >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 .AZ "Usage : UNPAK Archive [DstDir]\r\n" MSG.DIR .AZ "Creating Dir:%s..." MSG.FILE .AZ "Extracting File:%s..." MSG.OK .AZ "[OK]" MSG.ERR .AZ "[%h]\r\n" MSG.E.IARC .AZ "Invalid/corrupt archive" MSG.E.OFS .AZ "UnPak Error at Offset : %L\r\n" MSG.PAK .AS "PAK" *-------------------------------------- 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" *-------------------------------------- .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 STAT .BS S.STAT DS.END .ED *-------------------------------------- MAN SAVE USR/SRC/BIN/UNPAK.S ASM