PR#3 PREFIX /A2OSX.BUILD NEW INC 1 AUTO 6 .LIST OFF *-------------------------------------- * Uses: (pData) * hDIRs .BS X.MAX.RECURSE+1 * hDIRENTs .BS X.MAX.RECURSE+1 * hSrcBasePath .BS 1 * hDstBasePath .BS 1 (optional) *-------------------------------------- X.MAX.RECURSE .EQ 8 *-------------------------------------- InitSrcDirYA >SYSCALL GetFullPath.YA bcc .10 rts .10 >STYA ZPPtr1 txa >STA.G hFullPath ldy #1 lda (ZPPtr1),y beq .5 we have '/' >LEA.G STAT >PUSHYA >PUSHW ZPPtr1 >SYSCALL Stat ror >STA.G bExists save file exists for later..... bmi .1 File/DIR does not exists, go extract pattern >LDA.G STAT+S.STAT.P.TYPE cmp #$0f beq .5 TYPE=DIR, do not extract wildcard ldy #0 .1 iny lda (ZPPtr1),y Get Src Path Len bne .1 dey ldx #0 Init Wildcard count .2 lda (ZPPtr1),y search backward for a / cmp #'/' beq .3 cmp #'?' Test if some wildcard chars.... beq .21 cmp #'*' bne .22 .21 inx inc wildcard count .22 dey bne .2 .3 tya * cmp (ZPPtr1) * beq .5 Make sure at least one char txa bne .4 we have wc, go extract.... .30 lda #$ff no wc, remember if file exists? bmi .91 no, file not found.... .4 tya save / pos to trunk string later >STA.G index tya clc adc ZPPtr1 tay lda ZPPtr1+1 adc #0 >SYSCALL Newstr.YA bcs .9 txa >STA.G hFilter .5 >LDYAI 256 >SYSCALL GetMem.YA Get a 256 buffer to store BasePath bcs .9 >STYA ZPPtr2 txa >STA.G hSrcBasePath >LDA.G index tay dey lda #'/' cmp (ZPPtr1),y beq .51 iny sta (ZPPtr1),y .51 lda #0 sta (ZPPtr1),y Trunk before filter string ldy #$ff .6 iny lda (ZPPtr1),y sta (ZPPtr2),y bne .6 >LDYA ZPPtr2 >SYSCALL OpenDir.YA bcs .9 ldy #hDIRs sta (pData),y set hDIRs[0] = Src Hdir ldy #index lda #1 sta (pData),y index=hDIRs[0] jsr .9 Cleanup clc rts .91 lda #MLI.ERR.FNOTFND .9 pha .90 >LDA.G hFullPath >SYSCALL FreeMem.A pla sec InitSrcDirYA.RTS rts *-------------------------------------- .DO X.COPY.TO.DEST=1 InitDstDirYA >SYSCALL GetFullPath.YA bcs InitSrcDirYA.RTS stx .90+1 >STYA ZPPtr1 >LEA.G STAT >PUSHYA >PUSHW ZPPtr1 >SYSCALL Stat bcs .1 File/DIR does not exists, go extract DstFileName >LDA.G STAT+S.STAT.P.TYPE cmp #$0f beq .5 Dst is a directory...no destfilename .1 lda (ZPPtr1) tay .2 lda (ZPPtr1),y search backward for a / cmp #'/' beq .3 dey bne .2 .3 tya cmp (ZPPtr1) beq .5 Make sure at least one char ldx #0 phy save / pos to trunk string later .4 iny inx lda (ZPPtr1),y sta UsrBuf256,x tya cmp (ZPPtr1) bne .4 pla get back / pos sta (ZPPtr1) trunk it for Opendir stx UsrBuf256 >LDYAI UsrBuf256 >SYSCALL NewPstrYA bcs .9 txa ldy #hDstFileName sta (pData),y .5 >LDYAI 256 >SYSCALL GetMem.YA Get a 256 buffer to store DstBasePath bcs .9 >STYA ZPPtr2 txa ldy #hDstBasePath sta (pData),y lda (ZPPtr1) sta (ZPPtr2) tay .6 lda (ZPPtr1),y sta (ZPPtr2),y dey bne .6 lda (ZPPtr2) tay lda #'/' cmp (ZPPtr2),y beq .7 iny sta (ZPPtr2),y tya sta (ZPPtr2) .7 jsr .9 Cleanup clc .99 rts .9 pha .90 lda #$ff self modified >SYSCALL FreeMem.A pla sec rts .FIN *-------------------------------------- GetNextEntry jsr GetEntry bcs .9 ldy #0 .10 iny lda (ZPFileName),y Save actual file len for setting up bne .10 phy new offset later lda ZPFileStat clc adc #S.STAT sta ZPFileName lda ZPFileStat+1 adc /S.STAT sta ZPFileName+1 Make nDIRENTs[i] point to next DIRENT lda (ZPFileName) are we at end of this buffer ? beq .1 yes, go read next one ... sec adc ZPFileName sta ZPFileStat lda ZPFileName+1 adc #0 sta ZPFileStat+1 ldy #index lda (pData),y asl clc adc #oDIRENTs-1 tay pla Get back previous file len sec adc (pData),y sta (pData),y iny lda #0 adc (pData),y sta (pData),y dey lda #S.STAT clc adc (pData),y sta (pData),y iny lda /S.STAT adc (pData),y sta (pData),y clc rts .1 pla jsr GetEntry.ReadDir bcs .9 lda (ZPFileName) beq .99 ldy #0 .2 iny lda (ZPFileName),y bne .2 tya sec adc ZPFileName sta ZPFileStat lda ZPFileName+1 adc #0 sta ZPFileStat+1 clc .9 rts .99 sec rts *-------------------------------------- GetEntry ldy #index lda (pData),y clc adc #hDIRENTs-1 tay lda (pData),y bne .1 we have a buffer to scan jsr GetEntry.ReadDir First run, get first block bcs .9 ZPFileName = start of buffer lda (ZPFileName) Empty !!! bne .8 * txa * >SYSCALL FreeMem.A sec rts .1 >SYSCALL GetMemPtr.A >STYA ZPFileName ldy #index lda (pData),y asl clc adc #oDIRENTs-1 tay lda ZPFileName clc adc (pData),y sta ZPFileName iny lda ZPFileName+1 adc (pData),y sta ZPFileName+1 ZPFileName=ZPFileName+oDIRENT .8 lda ZPFileName sec adc (ZPFileName) sta ZPFileStat lda ZPFileName+1 adc #0 sta ZPFileStat+1 clc .9 rts *-------------------------------------- GetEntry.ReadDir ldy #index lda (pData),y clc adc #hDIRENTs-1 tay lda (pData),y beq .1 pha lda #0 sta (pData),y reset hDIRENT pla >SYSCALL FreeMem.A discard previous hDIRENT .1 ldy #index lda (pData),y clc adc #hDIRs-1 tay lda (pData),y >SYSCALL ReadDir.A bcs .9 >STYA ZPFileName ldy #index lda (pData),y clc adc #hDIRENTs-1 tay txa get hDIRENT in A sta (pData),y ldy #index lda (pData),y asl clc adc #oDIRENTs-1 and reset offset for this buffer tay lda #0 sta (pData),y iny sta (pData),y clc .9 rts *-------------------------------------- EnterSubDirYA >STYA ZPPtr2 save SUBDIR for StrCat ldy #index lda (pData),y cmp #X.MAX.RECURSE beq .9 ldy #hSrcBasePath jsr EnterSubDirYA.1 >LDYA ZPPtr1 >SYSCALL OpenDir.YA bcs .9 pha ldy #index lda (pData),y inc sta (pData),y tax * clc from BCS adc #hDIRs-1 tay pla sta (pData),y txa make sure hDIRENTs[i] is closed adc #hDIRENTs-1 tay lda #0 sta (pData),y .DO X.COPY.TO.DEST=1 ldy #hDstBasePath jsr EnterSubDirYA.1 .FIN clc .9 rts EnterSubDirYA.1 lda (pData),y >SYSCALL GetMemPtr.A >STYA ZPPtr1 save full path >PUSHW ZPPtr2 >PUSHW ZPPtr1 >SYSCALL StrCat lda (ZPPtr1) inc tay sta (ZPPtr1) lda #'/' sta (ZPPtr1),y rts *-------------------------------------- LeaveSubDir ldy #index lda (pData),y beq .9 ldy #index lda (pData),y clc adc #hDIRENTs-1 tay lda (pData),y beq .1 pha lda #0 sta (pData),y pla >SYSCALL FreeMem.A .1 ldy #index lda (pData),y clc adc #hDIRs-1 tay lda (pData),y pha lda #0 sta (pData),y pla >SYSCALL CloseDir.A ldy #index lda (pData),y dec sta (pData),y bne .8 ldy #hSrcBasePath lda (pData),y >SYSCALL FreeMem.A .DO X.COPY.TO.DEST=1 ldy #hDstBasePath lda (pData),y >SYSCALL FreeMem.A .FIN .9 sec rts .8 clc rts *-------------------------------------- BasePath.. .DO X.COPY.TO.DEST=1 ldy #hDstBasePath jsr BasePath..1 .FIN ldy #hSrcBasePath BasePath..1 lda (pData),y >SYSCALL GetMemPtr.A >STYA ZPPtr1 save full path lda (ZPPtr1) get len tay .1 dey At first run, discard ending / lda (ZPPtr1),y cmp #'/' bne .1 tya sta (ZPPtr1) cut DIR2/ from /dir1/DIR2/ rts *-------------------------------------- MAN SAVE /A2OSX.SRC/BIN/X.FILEENUM.S LOAD /A2OSX.SRC/BIN/LS.S ASM