10 REM >BACKUP 20 REM Backup program 30 REM V1.15 28-12-97: More display, tidier program 40 REM V1.16 11-01-98: Countdown counts down (not up!) 50 REM V1.18 20-03-98: Command line parameters 55 REM V1.19 01-06-98: Num%OR&20 set 60 MODE&87:A$=FNOS_GetEnv:quit$=FNcl(" -q",1):ONERRORREPORT:PRINT:PROCend 70 IFFNcl("-?",0):PRINT"Syntax: "run$" ( ( ) (-s ) (-t )":PROCend 80 PROCinit:PRINT"BACKUP PROGRAM 1.18. Buffer size: &";~maxlen%' 90 PROCparams:PROCbackup:PROCend 100 END 110 : 120 DEFPROCinit:*K.10O.|MCLOSE#0:RUN|M 130 OSWORD=&FFF1:maxlen%=(HIMEM-LOMEM-3000)AND&FFFF00 140 DIM ctrl%30,data%maxlen%:X%=ctrl%:Y%=X%DIV256 150 ENDPROC 160 : 170 DEFFNh(A%,N%)=RIGHT$("0000000"+STR$~A%,N%) 180 DEFPROCDrd(Ad%,Dv%,Sc%,Nm%):PROCdsk(&53):ENDPROC 190 DEFPROCDwr(Ad%,Dv%,Sc%,Nm%):PROCdsk(&4B):ENDPROC 200 : 210 DEFPROCdsk(Cmd%):Nm0%=Nm%:A%=&7F:REPEAT 220 Num%=Nm%DIV256:IFNum%+(Sc%MOD10)>10:Num%=10-(Sc%MOD10) 230 try%=tries%:REPEAT 240 ?X%=Dv%:X%!1=Ad%:X%?5=3:X%?6=Cmd%:X%?7=Sc%DIV10:X%?8=Sc%MOD10 250 X%!9=Num%OR&20:IFX%?7>79:X%?7=X%?7-80:?X%=?X% OR 2:REM Side 2 260 VDU13:IFCmd%=&53:PRINT"Read "; ELSE PRINT"Write"; 270 PRINT" "FNh(Dv%,1)":"FNh(Sc%,6)"+"FNh(Nm%DIV256,2)" "FNh(tries%-try%,1)" "; 280 CALL OSWORD:Derr%=X%?10:try%=try%-1:UNTILDerr%=0 OR try%=0 290 IFDerr%:PRINTFNerr(Derr%);SPC(39-POS);:IFNm%=&100:PRINT 300 IFCmd%=&53 ANDDerr%=0:PRINT;read%+Nm0%-Nm%;" bytes read"; ELSE IFCmd%=&4B ANDDerr%=0 PRINT;write%-Nm0%+Nm%;" bytes left"; 310 PRINTSPC(39-POS);:Ad%=Ad%+Num%*256:Sc%=Sc%+Num%:Nm%=Nm%-Num%*256 320 UNTILNm%<1 OR Derr%:ENDPROC 330 : 340 DEFFNerr(A%):IFA%<&08 ORA%>&18:="Error "+FNh(A%,2) 350 =MID$("Clock errorID CRC errorData CRC errorNot readyWrite protectedTrack 0 not foundSector not found",VALMID$("010012243847620079",A%-7,2),VALMID$("110012140915170016",A%-7,2)) 360 : 370 DEFPROCseek 380 ?X%=Dv%:X%?5=1:X%?6=&69:X%?7=(Sc%DIV10)AND(Sc%>10) 390 CALL OSWORD:ENDPROC 400 : 410 DEFPROCparams:spt%=VALFNcl("-s",1):tries%=VALFNcl("-t",1) 420 IFLENA$<3:A$="":INPUT"Source drive: "sdrv%:INPUT"Dest. drive: "ddrv% ELSE sdrv%=VALA$:ddrv%=VALMID$(A$,3):A$=MID$(A$,5)+" " 430 same%=sdrv%=ddrv%:IFsame%:PRINT"Using same drive." 440 IFA$="":INPUT"Number of tracks (80) "trk%:INPUT"Number of sides (2) "sides% ELSE trk%=VALA$:sides%=VALMID$(A$,1+LENSTR$trk%) 450 trk%=trk%OR(80AND(trk%=0)):IFsides%<>1:sides%=2 460 IFA$="":INPUT"Sectors/track (10) "spt%:INPUT"Number of tries (10) "tries% 470 spt%=spt%OR(10AND(spt%=0)):tries%=tries%OR(10AND(tries%<2)) 480 ENDPROC 490 : 500 DEFPROCbackup 510 IF NOTsame% PRINT"Press a key to backup from :";sdrv%;" to :";ddrv%;:IFGETOR1 PRINT' 520 read%=0:write%=2560*trk%*sides%:FORs%=0TO(sides%-1)*2 STEP2 530 sect%=0:length%=trk%*2560:REPEAT:num%=maxlen%:IFnum%>length%:num%=length% 540 : 550 IFsame%:PRINTCHR$13"Insert source disk and press a key";:IFGETOR1:PRINTCHR$13;SPC(39);CHR$13; 560 REPEATPROCDrd(data%,sdrv%+s%,sect%,num%) 570 IFDerr%:num%=(num%AND&FFFE00)DIV2 580 UNTILDerr%=0 ORnum%<&100:IFnum%<&100:num%=&100 590 IFDerr%=0 ORnum%=&100:read%=read%+num% 600 : 610 IFsame%:PRINTCHR$13"Insert dest. disk and press a key";:IFGETOR1:PRINTCHR$13;SPC(39);CHR$13; 620 REPEATPROCDwr(data%,ddrv%+s%,sect%,num%) 630 IFDerr%:num%=(num%AND&FFFE00)DIV2 640 UNTILDerr%=0 ORDerr%=&12 ORnum%<&100:IFnum%<&100:num%=&100 650 IFDerr%=0 ORnum%=&100:write%=write%-num% 660 IFDerr%=&12:PRINT'"Destination disk write protected":length%=0:s%=99 670 : 680 sect%=sect%+num%DIV256:length%=length%-num% 690 UNTILlength%<1 ORDerr%=&12:NEXTs%:PRINTCHR$13;SPC(39) 700 ENDPROC 710 : 720 DEFFNOS_GetEnv:LOCALA$:A%=0:X%=1:os%=((USR&FFF4)AND&FF00)DIV256 730 IFos%=6ANDPAGE>&8000:LOADATN"OS_GetEnv"TOA$:A$=MID$(A$,1+INSTR(A$," ")) 740 IFos%=32:A$=$&100 750 IFLENA$=0:IF?(TOP-3):A$=$&600 ELSE IFLENA$=0:A$=$&3800 760 A%=INSTR(A$+" "," "):run$=LEFT$(A$,A%-1):=MID$(A$,A%+1) 770 : 780 DEFFNcl(l$,n%):IFASCl$=32 AND A$<>"":A$=" "+A$ 790 I%=INSTR(A$,l$):l$="":IFI%>0ANDn%>0:l$=MID$(A$,INSTR(A$," ",I%+1)+1):IFMID$(A$,I%,1)<>" ":l$=LEFT$(l$,INSTR(l$," ")-1) 800 IFI%:IFMID$(A$,I%,1)=" ":A$=MID$(A$,2+(ASCA$<>32),I%-1+(ASCA$=32)) ELSE IFI%:A$=LEFT$(A$,I%-1)+MID$(A$,INSTR(A$," ",INSTR(A$," ",I%)+LENl$)+1) 810 IFn%:=l$ ELSE =I%<>0 820 : 830 DEFPROCos(A$):IFA$=""ORASCA$=42:OSCLIA$:ENDPROC ELSE CHAINA$:ENDPROC 840 : 850 DEFPROCend 860 IFquit$<>"":A$=quit$:quit$="":PROCos(A$):END 870 END:ENDPROC