10 REM > CPMCOPY - Buffered file copy
   20 REM J.G.Harston
   30 :
   40 usr0%=0:ON ERROR PROCpr:REPORT:PROCClose_All:PROCusr(usr0%):*BYE
   50 max%=(HIMEM-LOMEM-2048)AND-512:DIM mem% max%:*FX229
   60 IF?5=&C3:P%=mem%:[OPT 0:CALL5:LD L,A:EXX:RET:]:C%=32:E%=255:usr0%=(USRmem%)AND&FF
   70 ?(&81+?&80)=13:?&80=0:cmd$=FNs($&81)
   80 A%=INSTR(cmd$+" "," "):in$=LEFT$(cmd$,A%-1):out$=FNs(MID$(cmd$,A%+1))
   90 IFcmd$="":INPUTLINE"Source file: "in$:INPUTLINE"Dest. file:  "out$
  100 IFcmd$="-?"ORin$=""ORout$="":PRINT"COPY (DU:)infile (DU:)outfile";:PROCusr(usr0%):*BYE
  110 PROCcopy:PROCusr(usr0%):*BYE
  120 :
  130 DEFPROCcopy
  140 iusr%=-1:ousr%=-1
  150 A%=INSTR(in$, ":"):IFA%>2:iusr%=VALMID$(in$, 2,A%-2):in$ =LEFT$(in$, 1)+MID$(in$, A%):ousr%=usr0%
  160 A%=INSTR(out$,":"):IFA%>2:ousr%=VALMID$(out$,2,A%-2):out$=LEFT$(out$,1)+MID$(out$,A%):IFiusr%=-1:iusr%=usr0%
  170 :
  180 PROCusr(iusr%):in%=OPENIN(in$):IF in%=0:PRINT"File '"in$;"' not found";:ENDPROC
  190 ext%=EXT#in%:ptr%=0
  200 PROCusr(ousr%):out%=OPENOUT(out$):IF out%=0:PRINT"Can't open '"out$"'";:PROCusr(iusr%):CLOSE#in%:in%=0:ENDPROC
  210 :
  220 REPEAT
  230   num%=ext%-ptr%:IF num%>max%:num%=max%
  240   PROCusr(iusr%):FOR A%=0 TO num%-1
  250     IF (A%AND&FF)=0:PRINTCHR$13;"Reading ";~ptr%+A%;"+";~num%-A%;", ";ext%-ptr%-A%;" bytes to go ";CHR$8;
  260     IF num%:mem%?A%=BGET#in%
  270   NEXT A%
  280   PROCusr(ousr%):FOR A%=0 TO num%-1
  290     IF (A%AND&FF)=0:PRINTCHR$13;"Writing ";~ptr%+A%;"+";~num%-A%;", ";ptr%+A%;" bytes so far ";CHR$8;
  300     IF num%:BPUT#out%,mem%?A%
  310   NEXT A%
  320   ptr%=ptr%+num%
  330   PRINTCHR$13;"Writing ";~ptr%;"+0, ";ptr%;" bytes done";SPC5;STRING$(5,CHR$8);
  340 UNTIL ptr%>=ext%
  350 CLOSE#out%:out%=0
  360 PROCusr(iusr%):CLOSE#in%:in%=0
  370 ENDPROC
  380 :
  390 DEFPROCusr(A%)
  400 IFA%>-1:IF?5=&C3:C%=32:E%=A%:CALL 5
  410 ENDPROC
  420 :
  430 DEFPROCpr:IFPOS:PRINT
  440 ENDPROC
  450 :
  460 DEFPROCClose_All
  470 in%=in%:IFin%:A%=in%:in%=0:PROCusr(iusr%):CLOSE#A%
  480 out%=out%:IFout%:A%=out%:out%=0:PROCusr(ousr%):CLOSE#A%
  490 ENDPROC
  500 :
  510 DEFFNs(A$):IFLEFT$(A$,1)=" ":REPEATA$=MID$(A$,2):UNTILLEFT$(A$,1)<>" "
  520 IFRIGHT$(A$,1)=" ":REPEATA$=LEFT$(A$,LENA$-1):UNTILRIGHT$(A$,1)<>" "
  530 =A$