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 MODE&87:PROCinit:PRINT"BACKUP PROGRAM 1.16. Buffer size: &";~maxlen%' 60 PROCparams:PROCbackup:REM PROCend 70 END 80 : 90 DEFPROCinit:*K.10O.|MCLOSE#0:RUN|M 100 OSWORD=&FFF1:maxlen%=(HIMEM-LOMEM-3000)AND&FFFF00 110 DIM ctrl%30,data%maxlen%:X%=ctrl%:Y%=X%DIV256 120 ENDPROC 130 : 140 DEFFNh(A%,N%)=RIGHT$("0000000"+STR$~A%,N%) 150 DEFPROCDrd(Ad%,Dv%,Sc%,Nm%):PROCdsk(&53):ENDPROC 160 DEFPROCDwr(Ad%,Dv%,Sc%,Nm%):PROCdsk(&4B):ENDPROC 170 : 180 DEFPROCdsk(Cmd%):Nm0%=Nm%:A%=&7F:REPEAT 190 Num%=Nm%DIV256:IFNum%+(Sc%MOD10)>10:Num%=10-(Sc%MOD10) 200 try%=tries%:REPEAT 210 ?X%=Dv%:X%!1=Ad%:X%?5=3:X%?6=Cmd%:X%?7=Sc%DIV10:X%?8=Sc%MOD10 220 X%!9=Num%:IFX%?7>79:X%?7=X%?7-80:?X%=?X% OR 2:REM Side 2 230 VDU13:IFCmd%=&53:PRINT"Read "; ELSE PRINT"Write"; 240 PRINT" "FNh(Dv%,1)":"FNh(Sc%,6)"+"FNh(Nm%DIV256,2)" "FNh(tries%-try%,1)" "; 250 CALL OSWORD:Derr%=X%?10:try%=try%-1:UNTILDerr%=0 OR try%=0 260 IFDerr%:PRINTFNerr(Derr%);SPC(39-POS);:IFNm%=&100:PRINT 270 IFCmd%=&53 ANDDerr%=0:PRINT;read%+Nm0%-Nm%;" bytes read"; ELSE IFCmd%=&4B ANDDerr%=0 PRINT;write%-Nm0%+Nm%;" bytes left"; 280 PRINTSPC(39-POS);:Ad%=Ad%+Num%*256:Sc%=Sc%+Num%:Nm%=Nm%-Num%*256 290 UNTILNm%<1 OR Derr%:ENDPROC 300 : 310 DEFFNerr(A%):IFA%<&08 ORA%>&18:="Error "+FNh(A%,2) 320 =MID$("Clock errorID CRC errorData CRC errorNot readyWrite protectedTrack 0 not foundSector not found",VALMID$("010012243847620079",A%-7,2),VALMID$("110012140915170016",A%-7,2)) 330 : 340 DEFPROCseek 350 ?X%=Dv%:X%?5=1:X%?6=&69:X%?7=(Sc%DIV10)AND(Sc%>10) 360 CALL OSWORD:ENDPROC 370 : 380 DEFPROCparams 390 INPUT"Source drive: "sdrv% 400 INPUT"Dest. drive: "ddrv% 410 same%=sdrv%=ddrv%:IFsame%:PRINT"Using same drive." 420 INPUT"Number of tracks (80) "trk%:IFtrk%=0:trk%=80 430 INPUT"Number of sides (2) "sides%:IFsides%<>1:sides%=2 440 INPUT"Sectors/track (10) "sps%:IFsps%=0:sps%=10 450 IFsps%<>10:sps%=10:PRINTCHR$11;STRING$(19,CHR$9);" 10 " 460 INPUT"Number of tries (10) "tries%:IFtries%<2:tries%=10 470 ENDPROC 480 : 490 DEFPROCbackup 500 IF NOTsame% PRINT"Press a key to backup from :";sdrv%;" to :";ddrv%;:IFGETOR1 PRINT' 510 read%=0:write%=2560*trk%*sides%:FORs%=0TO(sides%-1)*2 STEP2 520 sect%=0:length%=trk%*2560:REPEAT:num%=maxlen%:IFnum%>length%:num%=length% 530 : 540 IFsame%:PRINTCHR$13"Insert source disk and press a key";:IFGETOR1:PRINTCHR$13;SPC(39);CHR$13; 550 REPEATPROCDrd(data%,sdrv%+s%,sect%,num%) 560 IFDerr%:num%=(num%AND&FFFE00)DIV2 570 UNTILDerr%=0 ORnum%<&100:IFnum%<&100:num%=&100 580 IFDerr%=0 ORnum%=&100:read%=read%+num% 590 : 600 IFsame%:PRINTCHR$13"Insert dest. disk and press a key";:IFGETOR1:PRINTCHR$13;SPC(39);CHR$13; 610 REPEATPROCDwr(data%,ddrv%+s%,sect%,num%) 620 IFDerr%:num%=(num%AND&FFFE00)DIV2 630 UNTILDerr%=0 ORDerr%=&12 ORnum%<&100:IFnum%<&100:num%=&100 640 IFDerr%=0 ORnum%=&100:write%=write%-num% 650 IFDerr%=&12:PRINT'"Destination disk write protected":length%=0:s%=99 660 : 670 sect%=sect%+num%DIV256:length%=length%-num% 680 UNTILlength%<1 ORDerr%=&12:NEXTs%:PRINTCHR$13;SPC(39) 690 ENDPROC