PR#3 PREFIX /A2OSX.SRC NEW INC 1 AUTO 6 .LIST OFF .OP 65C02 .OR $2000 .TF /A2OSX.BOOT/BIN/CP *-------------------------------------- * -R recurse * -Y no confirm * -C continue on error *-------------------------------------- .INB INC/MACROS.I .INB INC/A2OSX.I *-------------------------------------- MAX.RECURSE .EQ 8 COPY.BUF.SIZE .EQ 4096 *-------------------------------------- ZPPtr1 .EQ ZPBIN ZPPtr2 .EQ ZPBIN+2 ZPPtr3 .EQ ZPBIN+4 *-------------------------------------- * 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.CP .DA MSG.CP L.MSG.OK .DA MSG.OK L.MSG.ERR .DA MSG.ERR L.FullSrcPath .DA FullSrcPath L.FullDstPath .DA FullDstPath L.FINFO .DA FINFO .DA 0 *-------------------------------------- CS.INIT ldy #hS.LISTDIR.IDX tya sta (pData),y ldy #S.PS.hARGS lda (pPs),y bne .1 >LDYA L.MSG.USAGE >SYSCALL PStrOutYA lda #SYSMGR.ERRSYN sec .99 rts .1 >PUSHA >PUSHBI $20 Push SEP=' ' >PUSHBI 0 >SYSCALL PStrGetTkn bcs .99 sta hSrcPath stx hDstPath >SYSCALL GetMemPtrA >STYA ZPPtr1 stz FullSrcPath ldy #1 lda (ZPPtr1),y cmp #'/' beq .2 jsr CS.INIT.SrcPfx .2 lda (ZPPtr1) tay clc adc FullSrcPath sta FullSrcPath tax .3 lda (ZPPtr1),y sta FullSrcPath,x dex dey bne .3 >LDYA L.FullSrcPath jsr NewDirListYA bcs .99 lda hDstPath bne .4 jsr CS.INIT.DstPfx bra .7 .4 >SYSCALL GetMemPtrA >STYA ZPPtr1 stz FullDstPath ldy #1 lda (ZPPtr1),y cmp #'/' beq .5 jsr CS.INIT.DstPfx .5 lda (ZPPtr1) tay clc adc FullDstPath sta FullDstPath tax .6 lda (ZPPtr1),y sta FullDstPath,x dex dey bne .6 .7 >LDYA L.FullDstPath >SYSCALL MLIGetFileInfoYA bcs .71 File not found....must be /path/file >STYA ZPPtr3 ldy #S.FINFO.TYPE lda (ZPPtr3),y cmp #$f Directory ? bne .71 ldy FullDstPath lda FullDstPath,y cmp #'/' beq .71 inc FullDstPath iny lda #'/' sta FullDstPath,y .71 lda FullDstPath sta (pData) tay .8 lda FullDstPath,y sta (pData),y dey bne .8 lda (pPs) ora #S.PS.F.EVENT Now accept events sta (pPs) clc rts *-------------------------------------- CS.INIT.SrcPfx ldy #S.PS.hPREFIX lda (pPs),y >SYSCALL GetMemPtrA >STYA ZPPtr2 lda (ZPPtr2) sta FullSrcPath tay .1 lda (ZPPtr2),y sta FullSrcPath,y dey bne .1 rts *-------------------------------------- CS.INIT.DstPfx ldy #S.PS.hPREFIX lda (pPs),y >SYSCALL GetMemPtrA >STYA ZPPtr2 lda (ZPPtr2) sta FullDstPath tay .1 lda (ZPPtr2),y sta FullDstPath,y dey bne .1 rts *-------------------------------------- CS.RUN ldy #bCANCEL lda (pData),y beq .98 sec rts .98 ldy #bSTOP lda (pData),y beq .1 clc .99 rts .1 jsr GetDirList bcs .99 >SYSCALL ListDirNextA bcc .15 jsr CloseDirList rts if not back to first level, CC, if CS, quit! .15 pha >SYSCALL GetMemPtrA >STYA ZPPtr1 lda (ZPPtr1) get File type/len and #$E0 cmp #$E0 Volume ($F) or Dir ($E) HEADER ? bne .10 jmp .8 .10 lda (ZPPtr1) and #$0F sta (ZPPtr1) Adjust Filename len jsr GetDirList >SYSCALL GetMemPtrA >STYA ZPPtr2 ldy #S.LISTDIR.hPATH get Src path lda (ZPPtr2),y >SYSCALL GetMemPtrA >STYA ZPPtr2 lda (ZPPtr2) tay tax .11 lda (ZPPtr2),y sta FullSrcPath,y dey bne .11 ldy #0 .12 inx append filename iny lda (ZPPtr1),y sta FullSrcPath,x tya cmp (ZPPtr1) bne .12 stx FullSrcPath lda (pData) tay tax .2 lda (pData),y copy dest path sta FullDstPath,y dey bne .2 ldy #0 .3 inx append filename iny lda (ZPPtr1),y sta FullDstPath,x tya cmp (ZPPtr1) bne .3 stx FullDstPath >PUSHW L.FullDstPath >PUSHW L.FullSrcPath >LDYA L.MSG.CP >SYSCALL PStrOutYA jsr CS.RUN.COPY bcs .5 >LDYA L.MSG.OK bra .7 .5 >PUSHA >LDYA L.MSG.ERR .7 >SYSCALL PStrOutYA .8 pla >SYSCALL FreeMemA clc rts *-------------------------------------- CS.RUN.COPY >LDYA L.FullSrcPath >SYSCALL MLIGetFileInfoYA bcs .9 >STYA ZPPtr1 ldy #S.FINFO-1 Save File info for applying to new file later .1 lda (ZPPtr1),y sta FINFO,y dey bpl .1 lda FINFO+S.FINFO.TYPE cmp #$f dir ? bne .2 jsr CS.RUN.COPY.DIR bcc .3 rts .2 jsr CS.RUN.COPY.FILE bcc .3 rts .3 >PUSHW L.FullDstPath >PUSHW L.FINFO >SYSCALL MLISetFileInfo .9 rts *-------------------------------------- CS.RUN.COPY.DIR >LDYA L.FullDstPath >SYSCALL MLICreateDirYA bcc .10 cmp #$47 bne CS.RUN.COPY.ERR CS .10 ldx FullSrcPath inx lda #'/' sta FullSrcPath,x stx FullSrcPath >LDYA L.FullSrcPath jsr NewDirListYA bcs .9 lda FullDstPath inc sta (Pdata) tay lda #'/' sta (Pdata),y dey .1 lda FullDstPath,y sta (Pdata),y dey bne .1 clc .9 rts CS.RUN.COPY.ERR sec CS.RUN.COPY.RTS rts *-------------------------------------- CS.RUN.COPY.FILE >PUSHW FINFO+S.FINFO.AUXTYPE >PUSHB FINFO+S.FINFO.TYPE >PUSHBI $C3 R/W, we will setup attrs later >PUSHW L.FullDstPath >SYSCALL MLICreateFile bcc .10 cmp #$47 bne CS.RUN.COPY.ERR .10 >LDYA L.FullSrcPath >SYSCALL MLIOpenYA bcs CS.RUN.COPY.RTS sta hSrcFile stx hSrcBuf >LDYA L.FullDstPath >SYSCALL MLIOpenYA bcs .19 sta hDstFile stx hDstBuf >PUSHWI COPY.BUF.SIZE >PUSHBI 0 >SYSCALL GetMem .19 bcs .98 >STYA ZPPtr2 stx hCopyBuf .2 >PUSHWI COPY.BUF.SIZE >PUSHW ZPPtr2 >PUSHB hSrcFile >SYSCALL MLIRead bcs .97 >STYA ZPPtr3 Bytes Read >PUSHYA >PUSHW ZPPtr2 >PUSHB hDstFile >SYSCALL MLIWrite lda ZPPtr3 cmp #COPY.BUF.SIZE lda ZPPtr3+1 sbc /COPY.BUF.SIZE bcs .2 jsr .97 clc rts .97 pha lda hCopyBuf >SYSCALL FreeMemA pla .98 pha lda hSrcFile >SYSCALL MLICloseA lda hSrcBuf >SYSCALL FreeMemA pla .99 pha lda hDstFile >SYSCALL MLICloseA lda hDstBuf >SYSCALL FreeMemA pla sec rts *-------------------------------------- CS.DOEVENT ldy #S.EVT.hDEV is Event from active IN device? lda (pEvent),y ldy #S.PS.hINDEV cmp (pPs),y bne .9 lda (pEvent) and #S.EVT.F.KEY is it a KEY event? beq .9 ldy #S.EVT.DATAHI is it an O or SAPPLE key ? lda (pEvent),y bne .9 ldy #S.EVT.DATALO lda (pEvent),y cmp #$03 Ctrl-C bne .1 lda #$FF ldy #bCANCEL sta (pData),y bra .8 .1 cmp #$13 Ctrl-S bne .8 ldy #bSTOP lda (pData),y eor #$FF sta (pData),y .8 clc rts .9 sec rts *-------------------------------------- CS.QUIT jsr CloseDirList bcc CS.QUIT lda hSrcPath beq .1 >SYSCALL FreeMemA .1 lda hDstPath beq .8 >SYSCALL FreeMemA .8 clc rts *-------------------------------------- * PRIVATE *-------------------------------------- NewDirListYA >SYSCALL ListDirInitYA bcs .9 tax ldy #hS.LISTDIR.IDX lda (pData),y inc cmp #hS.LISTDIR.IDX+MAX.RECURSE+1 beq .9 CS sta (pData),y tay txa sta (pData),y clc .9 rts *-------------------------------------- CloseDirList jsr GetDirList bcs .9 >SYSCALL ListDirCloseA ldy #hS.LISTDIR.IDX lda (pData),y tay lda #0 sta (pData),y tya ldy #hS.LISTDIR.IDX dec sta (pData),y cmp #hS.LISTDIR.IDX beq .9 CS lda (pData) tay .1 dey lda (pData),y cmp #'/' bne .1 tya sta (pData) cut DIR2/ from /dir1/DIR2/ clc .9 rts *-------------------------------------- GetDirList ldy #hS.LISTDIR.IDX lda (pData),y cmp #hS.LISTDIR.IDX beq .9 CS tay lda (pData),y clc .9 rts *-------------------------------------- CS.END MSG.USAGE >PSTR "Usage : CP [-R -C] [Dest Dir]\n -R recurse subdirs\n -C resume on error\n" MSG.CP >PSTR "cp: %S to %S " MSG.OK >PSTR "[Ok]\n" MSG.ERR >PSTR "[%h]\n" hSrcPath .BS 1 hDstPath .BS 1 FullSrcPath .BS 64 FullDstPath .BS 64 FINFO .BS S.FINFO hSrcFile .BS 1 hSrcBuf .BS 1 hDstFile .BS 1 hDstBuf .BS 1 hCopyBuf .BS 1 *-------------------------------------- .DUMMY .OR 0 DS.START DstPath .BS 64 (pData) hS.LISTDIR.IDX .BS 1 hS.LISTDIRS .BS MAX.RECURSE bSTOP .BS 1 bCANCEL .BS 1 bRECURSE .BS 1 bCONTINUEONERR .BS 1 DS.END .ED *-------------------------------------- MAN SAVE BIN/CP.S ASM