PR#3 PREFIX /A2OSX.BUILD NEW INC 1 AUTO 6 .LIST OFF *-------------------------------------- X.COPY.BUF.SIZE .EQ 4096 *-------------------------------------- ZPPtr1 .EQ ZPBIN ZPPtr2 .EQ ZPBIN+2 ZPFileName .EQ ZPBIN+4 ZPFileStat .EQ ZPBIN+6 *-------------------------------------- * 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 Code Length To Relocate .DA DS.END-DS.START Data Segment to Allocate .DA 0 .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 .DO X.COPY.TO.DEST=1 L.MSG.OVERWRTE .DA MSG.OVERWRTE .FIN L.MSG.OK .DA MSG.OK L.MSG.ERR .DA MSG.ERR L.MSG.DONE .DA MSG.DONE L.STAT .DA STAT .DA 0 *-------------------------------------- CS.INIT >SYSCALL GetArgC sta ArgCount cmp #1 beq .99 stz ArgIndex .1 dec ArgCount beq .7 inc ArgIndex lda ArgIndex >SYSCALL GetArgA >STYA ZPPtr1 lda (ZPPtr1) cmp #2 bne .4 ldy #1 lda (ZPPtr1),y cmp #'-' bne .4 iny lda (ZPPtr1),y ldx OptionList .2 cmp OptionList,x beq .3 dex bne .2 .99 >LDYA L.MSG.USAGE >SYSCALL CPrintFYA lda #SYSMGR.ERRSYN sec rts .3 ldy OptionVars-1,x lda #$80 sta (pData),y bra .1 .4 tax Save len ldy #index lda (pData),y .DO X.COPY.TO.DEST=1 bne .5 Already have a Src dir... .ELSE bne .99 .FIN jsr CS.INIT.Check.Wildcard >LDYA ZPPtr1 jsr InitSrcDirYA bcc .1 success, scan for any other args .9 rts .DO X.COPY.TO.DEST=1 .5 ldy #hDstBasePath lda (pData),y bne .99 we already have a second arg....error! >LDYA ZPPtr1 jsr InitDstDirYA bcc .1 success, scan for any other args rts .FIN .7 ldy #index processed all args lda (pData),y beq .99 , no src ? ERROR .DO X.COPY.TO.DEST=1 ldy #hDstBasePath lda (pData),y bne .8 we also have a Dst folder ldy #S.PS.hPREFIX no dst folder, use actual prefix lda (pPs),y >SYSCALL GetMemPtrA jsr InitDstDirYA bcs .99 .FIN .8 >PUSHWI 256 >PUSHBI 0 >SYSCALL GetMem bcs .9 txa ldy #hSrcFullPath sta (pData),y .DO X.COPY.TO.DEST=1 >PUSHWI 256 >PUSHBI 0 >SYSCALL GetMem bcs .9 txa ldy #hDstFullPath sta (pData),y .FIN * lda (pPs) * ora #S.PS.F.EVENT Now accept events * sta (pPs) clc rts *-------------------------------------- CS.INIT.Check.Wildcard ldy #0 ldx #0 .40 iny lda (ZPPtr1),y cmp #'?' beq .41 cmp #'*' bne .42 .41 lda #$ff tax .42 tya cmp (ZPPtr1) bne .40 txa ldy #bWildcard sta (pData),y rts *-------------------------------------- CS.RUN >SYSCALL GetC bcs .11 no char cmp #$03 Ctrl-C bne .10 sec rts Abort.... .10 cmp #$13 Ctrl-S bne .11 ldy #bPause lda (pData),y eor #$ff sta (pData),y .11 ldy #bPause lda (pData),y bpl .1 clc rts .1 .DO X.COPY.TO.DEST=1 ldy #bCopy lda (pData),y bpl .2 jmp CS.RUN.Copy .FIN .2 .DO X.DELETE.SOURCE=1 ldy #hToDelete lda (pData),y beq .3 >SYSCALL GetMemPtrA >SYSCALL RemoveYA php pha ldy #hToDelete lda (pData),y pha lda #0 sta (pData),y pla >SYSCALL FreeMemA pla plp jsr CS.RUN.CheckErr bcs .9 jmp CS.RUN.NEXT .FIN *--------------- .3 jsr GetEntry bcs CS.RUN.LEAVE ldy #hFilter lda (pData),y beq .4 No filter.... >SYSCALL GetMemPtrA >PUSHYA >PUSHW ZPFileName >SYSCALL PStrMatch bcs CS.RUN.NEXT no match, skip.... .4 ldy #S.STAT.P.DRIVE lda (ZPFileStat),y ProDOS Device ? bne .6 ldy #S.STAT.P.TYPE lda (ZPFileStat),y cmp #$0F Directory ? bne .5 ldy #bRecurse lda (pData),y bpl CS.RUN.NEXT ldy #1 lda (ZPFileName),y cmp #'.' beq CS.RUN.NEXT Skip "." & ".." jsr CS.RUN.BuildFilePath jmp CS.RUN.DIR .5 jsr CS.RUN.BuildFilePath jmp CS.RUN.FILE .6 lda #MLI.ERR.UNSUPST sec .9 rts *-------------------------------------- CS.RUN.CR.NEXT lda #13 >SYSCALL PutCA lda #10 >SYSCALL PutCA CS.RUN.NEXT jsr GetNextEntry bcs CS.RUN.LEAVE rts *-------------------------------------- CS.RUN.LEAVE jsr LeaveSubDir exit this sub dir.... bcs .99 base, we are done, exit jsr BasePath.. .DO X.DELETE.SOURCE=1 .DO X.COPY.TO.DEST=0 jsr GetEntry bcs * >PUSHW ZPFileName ldy #hSrcBasePath lda (pData),y >SYSCALL GetMemPtrA >PUSHYA >LDYA L.MSG.DIR >SYSCALL CPrintFYA bcs CS.RUN.LEAVE.RTS jsr CS.RUN.GetSrcFilePath >LDYAI UsrBuf256 >SYSCALL RemoveYA jsr CS.RUN.CheckErr bcs .99 .FIN .FIN jmp CS.RUN.NEXT .99 ldy #bQuiet lda (pData),y bmi .91 ldy #Count+1 >PUSHB (pData),y dey >PUSHB (pData),y >LDYA L.MSG.DONE >SYSCALL PPrintFYA .91 ldy #RC lda (pData),y get global RC in case of bContinue sec CS.RUN.LEAVE.RTS rts *-------------------------------------- CS.RUN.DIR .DO X.COPY.TO.DEST=1 ldy #hSrcFullPath lda (pData),y >SYSCALL GetMemPtrA >PUSHYA >LDYA L.MSG.DIR >SYSCALL CPrintFYA bcs CS.RUN.LEAVE.RTS >PUSHW L.STAT ldy #hDstFullPath lda (pData),y >SYSCALL GetMemPtrA >PUSHYA >SYSCALL Stat bcs .3 File Not exists...go create ldy #bNoConfirm lda (pData),y bmi .21 no prompt, nothing to create, enter subdir >LDYA L.MSG.OVERWRTE >SYSCALL CPrintFYA bcs CS.RUN.DIR.RTS .1 >SYSCALL Sleep >SYSCALL GetC bcs .1 cmp #3 beq .99 abort cmp #'N' bne .2 jmp CS.RUN.CR.NEXT no overwrite, nothing to do, no recurse .2 cmp #'Y' beq .21 no create, but recurse cmp #'A' bne .1 ldy #bNoConfirm lda #$ff sta (pData),y .21 clc lda #0 bra .4 .3 ldy #hDstFullPath lda (pData),y >SYSCALL GetMemPtrA >SYSCALL MKDirYA .4 jsr CS.RUN.CheckErr bcs CS.RUN.DIR.RTS .FIN .7 >LDYA ZPFileName jmp EnterSubDirYA .99 ldy #RC lda (pData),y get global RC in case of bContinue sec CS.RUN.DIR.RTS rts *-------------------------------------- CS.RUN.FILE ldy #bQuiet lda (pData),y bmi .14 jsr CS.RUN.FILE.MSG bcs CS.RUN.DIR.RTS .14 .DO X.COPY.TO.DEST=1 >PUSHW L.STAT ldy #hDstFullPath lda (pData),y >SYSCALL GetMemPtrA >PUSHYA >SYSCALL Stat bcs .2 File Not exists...go create ldy #bNoConfirm lda (pData),y bmi .2 no prompt, ovverwrite ldy #bQuiet lda (pData),y bpl .15 jsr CS.RUN.FILE.MSG bcs .90 .15 >LDYA L.MSG.OVERWRTE >SYSCALL CPrintFYA bcs .9 .1 >SYSCALL Sleep >SYSCALL GetC bcs .1 cmp #3 beq .99 abort cmp #'N' bne .11 jmp CS.RUN.CR.NEXT no overwrite exit .90 rts .11 cmp #'Y' beq .12 copy cmp #'A' bne .1 ldy #bNoConfirm lda #$ff sta (pData),y .12 jsr GetEntry get back current entry corrupted by SLEEP .2 .DO X.DELETE.SOURCE=1 mv file, check if srcbase=dstbase ldy #hSrcBasePath lda (pData),y >SYSCALL GetMemPtrA >PUSHYA ldy #hDstBasePath lda (pData),y >SYSCALL GetMemPtrA >PUSHYA >SYSCALL PStrMatch bcs .3 not same dir, go copy/delete jsr CS.RUN.Rename bra .9 .FIN .3 jsr CS.RUN.CopyStart bcc .4 jsr CS.RUN.CheckErr rts .FIN .4 .DO X.DELETE.SOURCE=1 ldy #hDstFullPath lda (pData),y >SYSCALL GetMemPtrA >SYSCALL NewPStrYA bcs .9 txa ldy #hToDelete sta (pData),y .FIN clc .9 rts .99 ldy #RC lda (pData),y get global RC in case of bContnue sec rts *-------------------------------------- CS.RUN.FILE.MSG .DO X.COPY.TO.DEST=1 ldy #hDstFullPath lda (pData),y >SYSCALL GetMemPtrA >PUSHYA .FIN ldy #hDstFullPath lda (pData),y >SYSCALL GetMemPtrA >PUSHYA >LDYA L.MSG.FILE >SYSCALL CPrintFYA rts *-------------------------------------- .DO X.COPY.TO.DEST=1 .DO X.DELETE.SOURCE=1 CS.RUN.Rename ldy #hDstFullPath lda (pData),y >SYSCALL GetMemPtrA >PUSHYA ldy #hSrcFullPath lda (pData),y >SYSCALL GetMemPtrA >PUSHYA >SYSCALL Rename rts .FIN .FIN *-------------------------------------- .DO X.COPY.TO.DEST=1 CS.RUN.CopyStart ldy #S.STAT.P.AUXTYPE+1 >PUSHB (ZPFileStat),y dey >PUSHB (ZPFileStat),y ldy #S.STAT.P.TYPE >PUSHB (ZPFileStat),y >PUSHBI SYS.FOpen.R ldy #hSrcFullPath lda (pData),y >SYSCALL GetMemPtrA >PUSHYA >SYSCALL FOpen bcs .99 ldy #hSrcFile sta (pData),y ldy #S.STAT.P.AUXTYPE+1 >PUSHB (ZPFileStat),y dey >PUSHB (ZPFileStat),y ldy #S.STAT.P.TYPE >PUSHB (ZPFileStat),y >PUSHBI SYS.FOpen.W+SYS.FOpen.X ldy #hDstFullPath lda (pData),y >SYSCALL GetMemPtrA >PUSHYA >SYSCALL FOpen bcs .9 ldy #hDstFile sta (pData),y ldy #bCopy lda #$ff sta (pData),y clc rts .9 pha ldy #hSrcFile lda (pData),y >SYSCALL FCloseA pla sec .99 rts *-------------------------------------- CS.RUN.Copy stz .90+1 >PUSHWI X.COPY.BUF.SIZE >PUSHBI 0 >SYSCALL GetMem bcs .9 >STYA ZPPtr1 stx .90+1 >PUSHW ZPPtr1 Dst Ptr >PUSHWI X.COPY.BUF.SIZE Bytes To Read ldy #hSrcFile >PUSHB (pData),y >SYSCALL FRead bcc .1 cmp #MLI.ERR.EOF bne .9 lda #0 bra .9 .1 >STYA ZPPtr2 >PUSHW ZPPtr1 Src Ptr >PUSHW ZPPtr2 Bytes To Write ldy #hDstFile >PUSHB (pData),y >SYSCALL FWrite bcs .9 lda .90+1 >SYSCALL FreeMemA ldy #bQuiet lda (pData),y bmi .8 lda #'.' >SYSCALL PutCA rts .8 clc rts .9 ldy #CopyRC sta (pData),y .90 lda #$00 beq CS.RUN.CopyEnd >SYSCALL FreeMemA *-------------------------------------- CS.RUN.CopyEnd ldy #hSrcFile lda (pData),y >SYSCALL FCloseA bcc .1 jsr CS.RUN.CheckErr .1 ldy #hDstFile lda (pData),y >SYSCALL FCloseA bcc .2 jsr CS.RUN.CheckErr .2 ldy #bCopy lda #$0 sta (pData),y clc ldy #CopyRC lda (pData),y beq .3 sec .3 jsr CS.RUN.CheckErr bcs .9 jmp CS.RUN.NEXT .9 rts .FIN *-------------------------------------- CS.RUN.CheckErr bcs .1 ldy #Count lda (pData),y inc sta (pData),y bne .10 iny lda (pData),y inc sta (pData),y .10 ldy #bQuiet lda (pData),y bmi .8 >LDYA L.MSG.OK >SYSCALL PPrintFYA rts .1 ldy #RC sta (pData),y pha ldy #bContinue lda (pData),y bpl .2 pla >PUSHA >LDYA L.MSG.ERR >SYSCALL PPrintFYA bcs .9 rts .2 lda #13 >SYSCALL PutCA lda #10 >SYSCALL PutCA pla sec .9 rts .8 clc rts *-------------------------------------- CS.RUN.BuildFilePath ldy #hSrcBasePath lda (pData),y >SYSCALL GetMemPtrA >PUSHYA ldy #hSrcFullPath lda (pData),y >SYSCALL GetMemPtrA >STYA ZPPtr1 >PUSHYA >SYSCALL PStrCpy >PUSHW ZPFileName >PUSHW ZPPtr1 >SYSCALL PStrCat .DO X.COPY.TO.DEST=1 ldy #hDstBasePath lda (pData),y >SYSCALL GetMemPtrA >PUSHYA ldy #hDstFullPath lda (pData),y >SYSCALL GetMemPtrA >STYA ZPPtr1 >PUSHYA >SYSCALL PStrCpy ldy #hDstFileName lda (pData),y beq .1 >SYSCALL GetMemPtrA >PUSHYA bra .2 .1 >PUSHW ZPFileName .2 >PUSHW ZPPtr1 >SYSCALL PStrCat .FIN rts *-------------------------------------- CS.DOEVENT sec rts *-------------------------------------- CS.QUIT jsr LeaveSubDir bcc CS.QUIT ldy #bCopy lda (pData),y bpl .1 ldy #hSrcFile lda (pData),y >SYSCALL FCloseA ldy #hDstFile lda (pData),y >SYSCALL FCloseA .1 ldy #hToDelete jsr CS.QUIT.FREE ldy #hDstFilename jsr CS.QUIT.FREE ldy #hFilter jsr CS.QUIT.FREE ldy #hDstFullPath jsr CS.QUIT.FREE ldy #hSrcFullPath jsr CS.QUIT.FREE clc rts *-------------------------------------- CS.QUIT.FREE lda (pData),y beq .9 >SYSCALL FreeMemA .9 rts *-------------------------------------- MAN SAVE /A2OSX.SRC/BIN/X.CPMVRM.S LOAD /A2OSX.SRC/BIN/MV.S ASM