10 REM > QDCopy 1.17
   20 REM Quick & Dirty Copier
   30 REM Can't find original
   40 REM v1.10 ->DOS and <-DOS
   50 REM v1.11 Skips Directories
   60 REM v1.12 '`'->'_'
   70 REM v1.13 Full char conversion, recursive From DOS
   80 REM v1.14 19-Nov-98 Tweeked subdirs
   90 REM v1.15 05-Dec-98 Fuller ToDOS
  100 REM v1.16 07-Jan-99 Forces DOS dest to upper case
  110 REM v1.17 02-Feb-99 Avoid W9x name blocks
  120 :
  130 MODE7:VDU28,0,24,39,0:PRINT"Quick DOS Copier"
  140 IFHIMEM<>&7C00:PRINT"Screen not in language memory -"'"Can't proceed.":END
  150 Char0$="#`_#":Char1$="&++%pp~--$dd"
  160 INPUT"(T)o DOS or (F)rom DOS? "A$:A$=LEFT$(A$,1)
  170 IFA$="T":PROCToDos:PRINT:END
  180 IFA$="F":PROCFromDos:PRINT:END
  190 PRINT:END
  200 :
  210 DEFPROCFromDos
  220 ON ERROR REPORT:PROCvduOff:PRINT:END
  230 PROCvduAss
  240 *DOS
  250 PROCvduOn:OSCLI".":PROCvduOff
  260 INPUT"Destination filing system: "fs$
  270 OSCLIfs$:*.
  280 PRINT"Press SPACE to copy";:A%=GET
  290 PROCFrom(""):ENDPROC
  300 :
  310 DEFPROCCat:CLS:PROCvduOn:*.
  320 PROCvduOff:PRINT''"Dir: ";path$:ENDPROC
  330 :
  340 DEFPROCFrom(path$)
  350 LOCAL F$,Addr%
  360 CLS:*DOS
  370 PROCCat:Addr%=&7C00:REPEAT
  380   Addr%?8=13:Addr%?12=13:Addr%?16=13
  390   REM Get filename, extension, attribute
  400   F$=$Addr%:E$=$(Addr%+9):A$=$(Addr%+14)
  410   Addr%?8=47:Addr%?12=42:Addr%?16=32
  420   F$=LEFT$(F$,INSTR(F$+" "," ")-1)
  430   E$=LEFT$(E$,INSTR(E$+" "," ")-1)
  440   A$=LEFT$(A$,INSTR(A$+" "," ")-1)
  450   IFF$<>"":PROCFromObject
  460 Addr%=Addr%+20:UNTILF$="":ENDPROC
  470 :
  480 DEFPROCFromObject:IFE$<>"":F$=F$+"/"+E$
  490 IFINSTR(F$,"?"):ENDPROC
  500 F$=FNCheckName(F$,Char0$):D$=FNCheckName(LEFT$(F$,10),Char1$)
  510 IFINSTR(A$,"D"):PROCFromDir:ENDPROC
  520 PRINTTAB(0,VPOS);"Copying ";F$;" to -"fs$"-"D$;SPC(20-LEND$);CHR$11;CHR$13;
  530 OSCLI"MOVE "+F$+" -"+fs$+"-"+D$
  540 ENDPROC
  550 :
  560 DEFPROCFromDir
  570 OSCLI"DIR "+F$:OSCLIfs$:OSCLI"CDIR "+D$:OSCLI"DIR "+D$
  580 PROCFrom(path$+"."+F$):OSCLIfs$:OSCLI"Dir ^":*DOS
  590 OSCLI"DIR "+LEFT$(".",path$="")+path$:PROCCat:ENDPROC
  600 :
  610 DEFPROCToDos
  620 PROCvduAss
  630 OSCLI"DOS":*.
  640 INPUT"Source filing system: "fs$
  650 OSCLIfs$:*.
  660 PRINT"NB: Can't create DOS directories yet."
  670 PRINT"Press SPACE to copy";:A%=GET
  680 PROCTo(""):ENDPROC
  690 :
  700 DEFPROCTo(path$)
  710 LOCAL F$,Addr%
  720 OSCLIfs$:CLS:OSCLI".":Addr%=&7CA0:REPEAT
  730   Addr%?10=13:Addr%?19=13
  740   REM Get filename, attribute
  750   F$=$Addr%:A$=$(Addr%+11)
  760   Addr%?10=42:Addr%?19=32
  770   F$=LEFT$(F$,INSTR(F$+" "," ")-1)
  780   A$=LEFT$(A$,INSTR(A$+" "," ")-1)
  790   IFF$<>"":PROCToObject
  800 Addr%=Addr%+20:UNTILF$="":ENDPROC
  810 :
  820 DEFPROCToObject:F$=FNCheckName(F$,Char0$):D$=FNup(F$)
  830 IFINSTR(A$,"D"):PROCToDir:ENDPROC
  840 I%=INSTR(D$,"/"):IFI%=0:D$=LEFT$(D$,8)
  850 IFI%>0 AND I%<LEND$-3:D$=MID$(D$,I%+1)+"/"+LEFT$(D$,I%-1)
  860 REM Checks for HTM, TXT, COM, EXE, BBC
  870 IFMID$(D$,9,2)="/H":D$=D$+"TM"
  880 IFMID$(D$,8,3)="/HT":D$=D$+"M"
  890 IFMID$(D$,9,2)="/T":D$=D$+"XT"
  900 IFMID$(D$,8,3)="/TX":D$=D$+"T"
  910 IFMID$(D$,9,2)="/C":D$=D$+"OM"
  920 IFMID$(D$,8,3)="/CO":D$=D$+"M"
  930 IFMID$(D$,9,2)="/E":D$=D$+"XE"
  940 IFMID$(D$,8,3)="/EX":D$=D$+"E"
  950 IFMID$(D$,9,2)="/B":D$=D$+"BC"
  960 IFMID$(D$,8,3)="/BB":D$=D$+"C"
  970 *DISK
  980 PRINTTAB(0,VPOS);"Copying -"fs$"-"F$" to "D$;SPC(20-LENF$);CHR$11;CHR$13;
  990 OSCLI"MOVE -"+fs$+"-"+F$+" -DOS-"+D$
 1000 ENDPROC
 1010 :
 1020 DEFPROCToDir:ENDPROC
 1030 :
 1040 DEFFNCheckName(A$,C$):FOR I%=1 TO LEN A$
 1050   IFINSTR(C$,MID$(A$,I%,1)):A$=LEFT$(A$,I%-1)+MID$(C$,1+INSTR(C$,MID$(A$,I%,1)),1)+MID$(A$,I%+1)
 1060 NEXT:=A$
 1070 :
 1080 DEFFNup(A$):IFA$="":ENDPROC
 1090 LOCALz%:FORz%=1TOLENA$:IFMID$(A$,z%,1)>="`":A$=LEFT$(A$,z%-1)+CHR$(ASCMID$(A$,z%,1)-32)+MID$(A$,z%+1)
 1100 NEXT:=A$
 1110 :
 1120 DEFPROCvduAss
 1130 vduX%=vduX%:IFvduX%:ENDPROC
 1140 DIMvduX% 256:WRCHV=&20E
 1150 FORp=0TO1:P%=vduX%
 1160   [OPT p*2
 1170   .SwapVectors
 1180   LDA WRCHV:LDX oldWRCHV:STA oldWRCHV:STX WRCHV
 1190   LDA WRCHV+1:LDX oldWRCHV+1:STA oldWRCHV+1:STX WRCHV+1
 1200   RTS
 1210   .oldWRCHV
 1220   EQUW newWRCH
 1230   .newWRCH
 1240   CMP #12:BCS jmpOld
 1250   LDA #ASC"?"
 1260   .jmpOld
 1270   JMP (oldWRCHV)
 1280 ]NEXT:ENDPROC
 1290 :
 1300 DEFPROCvduOn:vduOn%=vduOn%:IFvduOn%:ENDPROC
 1310 CALLSwapVectors:vduOn%=TRUE:ENDPROC
 1320 :
 1330 DEFPROCvduOff:vduOn%=vduOn%:IFvduOn%:CALL SwapVectors:vduOn%=FALSE
 1340 ENDPROC