10
80 MODE&87:A$=FNOS_GetEnv:quit$=FNcl(" -q",1):ONERRORREPORT:PRINT:PROCend
90 IFFNcl("-?",0):PRINT"Syntax: "run$" (<src> <dst> (<trks> <sides>) (-t <tries>)":PROCend
100 PROCinit:PRINT"BACKUP PROGRAM 1.20. Buffer size: &";~maxlen%'
110 ONERRORREPORT:PROCClose:PROCend
120 fs%=FNfs:PROCparams:PROCbackup:PROCend
130 END
150 DEFPROCinit:OSWORD=&FFF1:OSGBPB=&FFD1:maxlen%=(HIMEM-LOMEM-3000)AND&FFFF00
160 DIMctrl%30,data%maxlen%:X%=ctrl%:Y%=X%DIV256:name%=data%
170 ENDPROC
190 DEFPROCClose:IFfs%<>FNfs:OSCLI"FX143,18,"+STR$fs%
200 ch%=ch%:IFch%:A%=ch%:ch%=0:CLOSE#A%
210 ENDPROC
230 DEFPROCDrd(Ad%,Dv%,Sc%,Nm%):PROCdsk(&53,sdrv$):ENDPROC
240 DEFPROCDwr(Ad%,Dv%,Sc%,Nm%):PROCdsk(&4B,ddrv$):ENDPROC
250 DEFPROCdsk(Cmd%,fn$):Derr%=0:IFDv%=-1:PROCgpb:ENDPROC
260 OSCLI"FX143,18,4":Nm0%=Nm%:A%=&7F:REPEAT
270 Num%=Nm%DIV256:IFNum%+(Sc%MOD10)>10:Num%=10-(Sc%MOD10)
280 try%=tries%:REPEAT
290 ?X%=Dv%:X%!1=Ad%:X%?5=3:X%?6=Cmd%:X%?7=Sc%DIV10:X%?8=Sc%MOD10
300 X%!9=Num%OR32:IFX%?7>79:X%?7=X%?7-80:?X%=?X%OR2
310 VDU13:IFCmd%=&53:PRINT"Read ";ELSEPRINT"Write";
320 PRINT" "FNh0(Dv%,1)":"FNh0(Sc%,6)"+"FNh0(Nm%DIV256,2)" "FNh0(tries%-try%,1)" ";
330 CALLOSWORD:Derr%=X%?10:try%=try%-1:UNTILDerr%=0ORtry%=0
340 IFDerr%:PRINTFNerr(Derr%);SPC(39-POS);:IFNm%=&100:PRINT
350 IFCmd%=&53ANDDerr%=0:PRINT;read%+Nm0%-Nm%;" bytes read";ELSEIFCmd%=&4BANDDerr%=0PRINT;write%-Nm0%+Nm%;" bytes left";
360 PRINTSPC(39-POS);:Ad%=Ad%+Num%*256:Sc%=Sc%+Num%:Nm%=Nm%-Num%*256
370 UNTILNm%<1ORDerr%:OSCLI"FX143,18,"+STR$fs%:ENDPROC
390 DEFFNerr(A%):IFA%<&08ORA%>&18:="Error "+FNh0(A%,2)
400 =MID$("Clock errorID CRC errorData CRC errorNot readyWrite protectedTrack 0 not foundSector not found",VALMID$("010012243847620079",A%-7,2),VALMID$("110012140915170016",A%-7,2))
440 DEFPROCgpb:Sc%=Sc%*256:A%=INSTR(fn$,":",2):IFA%:OSCLILEFT$(fn$,A%-1):fn$=MID$(fn$,A%+1)
450 IFCmd%=&53:A%=3:ch%=OPENIN(fn$)ELSEA%=1:IFSc%=0:ch%=OPENOUT(fn$)ELSEch%=OPENUP(fn$)
460 ?X%=ch%:X%!1=Ad%:X%!5=Nm%:X%!9=Sc%:CALLOSGBPB:CLOSE#ch%:ch%=0:IFFNfs<>fs%:OSCLI"FX143,18,"+STR$fs%
470 ENDPROC
490 DEFPROCparams
500 spt%=VALFNcl("-s",1):tries%=VALFNcl("-t",1):sdrv$=FNcl("",1)
510 ddrv$=FNcl("",1):trk%=VALFNcl("",1):sides%=VALFNcl("",1)
520 IFsdrv$="":trk%=-1:INPUT"Source drive: "sdrv$:INPUT"Dest. drive: "ddrv$
530 sdrv$=FNfsn(sdrv$):sdrv%=-1:IFLENsdrv$=1:sdrv%=VALsdrv$
540 ddrv$=FNfsn(ddrv$):ddrv%=-1:IFLENddrv$=1:ddrv%=VALddrv$
550 same%=(sdrv%=ddrv%)ANDsdrv%>-1:IFsame%:PRINT"Using same drive."
560 IFtrk%=-1:INPUT"Number of tracks (80) "trk%:INPUT"Number of sides (2) "sides%:INPUT"Number of tries (10) "tries%:PRINT"Press a key to backup from "sdrv$" to "ddrv$;:IFGETOR1PRINT'
570 IFspt%=0:spt%=10
580 IFtrk%=0:trk%=80
590 IFsides%=0:sides%=2
600 IFtries%=0:tries%=10
610 ENDPROC
630 DEFPROCbackup
640 read%=0:write%=2560*trk%*sides%:FORs%=0TO(sides%-1)*2STEP2
650 sect%=0:length%=trk%*2560:REPEAT:num%=maxlen%:IFnum%>length%:num%=length%
670 IFsame%:PRINTCHR$13"Insert source disk and press a key";:IFGETOR1:PRINTCHR$13;SPC(39);CHR$13;
680 REPEATPROCDrd(data%,(sdrv%+s%)OR(sdrv%<0),sect%-(spt%*trk%)*(s%=2ANDsdrv%<0),num%)
690 IFDerr%:num%=(num%AND&FFFE00)DIV2
700 UNTILDerr%=0ORnum%<&100:IFnum%<&100:num%=&100
710 IFDerr%=0ORnum%=&100:read%=read%+num%
730 IFsame%:PRINTCHR$13"Insert dest. disk and press a key";:IFGETOR1:PRINTCHR$13;SPC(39);CHR$13;
740 REPEATPROCDwr(data%,(ddrv%+s%)OR(ddrv%<0),sect%-(spt%*trk%)*(s%=2ANDddrv%<0),num%)
750 IFDerr%:num%=(num%AND&FFFE00)DIV2
760 UNTILDerr%=0ORDerr%=&12ORnum%<&100:IFnum%<&100:num%=&100
770 IFDerr%=0ORnum%=&100:write%=write%-num%
780 IFDerr%=&12:PRINT'"Destination disk write protected":length%=0:s%=99
790 sect%=sect%+num%DIV256:length%=length%-num%
800 UNTILlength%<1ORDerr%=&12:NEXTs%:PRINTCHR$13;SPC(39)
810 IFddrv%>-1:ENDPROC
820 ONERRORONERROROFF:PROCClose:PROCend
830 A%=INSTR(ddrv$,":",2):IFA%:OSCLILEFT$(ddrv$,A%-1):ddrv$=MID$(ddrv$,A%+1)
840 X%!2=&FFFB2200:A%=FNfile(ddrv$,2):OSCLI"Stamp "+ddrv$
850 PROCClose:ENDPROC
870 DEFFNfsn(A$):IFLEFT$(A$,1)="-":A%=INSTR(A$,"-",2):IFA%:B%=INSTR(A$,"."):IFB%=0ORB%>A%:A$=MID$(A$,2,A%-2)+":"+MID$(A$,A%+1)
880 =A$
890 DEFFNh0(A%,N%)=RIGHT$("0000000"+STR$~A%,N%)
900 DEFFNfs:LOCALA%,X%,Y%,E%:=(USR&FFDA)AND&FF
910 DEFFNfile(A$,A%):$name%=A$:?X%=data%:X%?1=data%DIV256:=(USR&FFDD)AND&FF
920 DEFFNOS_GetEnv:IFHIMEM>&FFFF:run$=$&8100:SYS16TOA$,,A%:SYS72,"",A%:A$=MID$(A$,1+INSTR(A$+" "," ",1+INSTR(A$," "))):IFLENA$=0:A$=run$
930 IFLENA$=0:IF?(TOP-3):A$=$&600ELSEIFLENA$=0:A$=$(PAGE-&300)
940 FORY%=-1TO0:A$=" "+A$:REPEATA$=MID$(A$,2):UNTILASCA$<>32
950 IFY%:IFASCA$=34:A%=INSTR(A$,"""",2)+1ELSEIFY%:A%=INSTR(A$+" "," ")
960 IFY%:run$=MID$(A$,1-(ASCA$=34),A%-1+2*(ASCA$=34)):IFrun$<>"":A$=MID$(A$,A%+1)
970 NEXT:=A$
980 DEFFNcl(l$,n%):IFl$="":A$=FNs(A$):IFASCA$=34:A%=INSTR(A$+" "" ",""" ",2):l$=MID$(A$,2,A%-2):A$=FNs(MID$(A$,A%+1)):=l$
990 IFl$="":A%=INSTR(A$+" "," "):l$=LEFT$(A$,A%-1):A$=FNs(MID$(A$,A%+1)):=l$
1000 IFn%=0:IFl$<>"":A%=INSTR(A$,l$):IFA%:A$=FNs(LEFT$(A$,A%-1)+MID$(A$,INSTR(A$," ",A%)+1))+" ":=TRUE
1010 IFn%=0:IFl$<>"":=FALSE
1020 A%=INSTR(LEFT$(" ",ASCl$=32)+A$,l$):IFA%=0:=""
1030 A$=LEFT$(A$,A%-1)+FNs(MID$(A$,INSTR(A$," ",A%)+1))
1040 IFASCl$=32:l$=MID$(A$,A%):A$=LEFT$(A$,A%-1):=MID$(l$,1-(ASCl$=34),LENl$+2*(ASCl$=34))
1050 IFASCMID$(A$,A%,1)<>34:l$=MID$(A$,A%,INSTR(A$+" "," ",A%)-A%):A$=LEFT$(A$,A%-1)+MID$(A$,A%+LENl$+1):=l$
1060 l$=MID$(A$,A%+1,INSTR(A$+""" ",""" ",A%+1)-A%-1):A$=LEFT$(A$,A%-1)+MID$(A$,A%+LENl$+3):=l$
1070 DEFFNs(A$):IFLEFT$(A$,1)=" ":REPEATA$=MID$(A$,2):UNTILLEFT$(A$,1)<>" "
1080 IFRIGHT$(A$,1)=" ":REPEATA$=LEFT$(A$,LENA$-1):UNTILRIGHT$(A$,1)<>" "
1090 =A$
1100 DEFPROCos(A$):IFA$=""ORASCA$=42:OSCLIA$:ENDPROCELSECHAINA$:ENDPROC
1110 DEFPROCend:IFquit$<>"":A$=quit$:quit$="":PROCos(A$)
1120 A$=CHR$13:END:ENDPROC
65449
162 CLGOSCLIPOSPROCATN