10 REM 'FASTBAK' 20 REM Speedy back-up of part or whole of one side 30 : 40 REM Change the beep 50 *FX213,10 60 *FX214,1 70 : 80 MODE7 90 ON ERROR PROCerror:END 100 HIMEM=&2C00:DIM block% 12 :REM data block for disk operations 110 : 120 PRINT CHR$(141);" DISK BACKUP UTILITY" 130 PRINT CHR$(141);" DISK BACKUP UTILITY" 140 PRINT''"Ensure SOURCE disk is write-protected" 150 VDU28,0,24,39,6,12 160 : 170 REPEAT *FX15,0 180 INPUT'"Enter SOURCE drive (0 to 3): [0x07] "sdr% 190 UNTIL sdr%>-1 AND sdr%<4 200 : 210 REPEAT *FX15,0 220 INPUT''"Enter DESTINATION drive (0 to 3): [0x07] "ddr% 230 UNTIL ddr%>-1 AND ddr%<4 240 : 250 PROCloadcat 260 PROCwhich_track 270 PROCcopy 280 PROCanother 290 END 300 : 310 DEF PROCloadcat :REM checking disk catalogue 320 ?block%=sdr% :REM source drive 330 block%!1=&900 :REM load address in RAM 340 block%?5=3 :REM number of parameters 350 block%?6=&53 :REM 'read' command byte 360 block%?7=0 :REM track /2nd page of- 370 block%?8=1 :REM sector /disk catalogue 380 block%?9=&21 :REM 1 sector of 256 bytes 390 A%=&7F :REM Read/Write operation required 400 X%=block% MOD &100 :REM address of- 410 Y%=block% DIV &100 :REM data block 420 CALL &FFF1 430 ENDPROC 440 : 450 DEF PROCwhich_track 460 B%=&90C 470 sectors%=(B%?2/&10 AND &3)*&100+(B%?1)+ABS(?B%>0)+(B%?2 AND &3)*&100+(B%?3) 480 trk%=sectors% DIV 10+ABS(sectors% MOD 10>-1) 490 IF trk%>80 trk%=80 500 ENDPROC 510 : 520 DEF PROCcopy 530 store%=0 540 IF trk%<8 GOTO 810 550 FOR main%=1 TO trk% DIV 8 560 track%=store% 570 buffer%=&2C00 580 CLS 590 PRINT TAB(0,4)"Number of tracks" 600 PRINT TAB(0,5)"to be backed up:-" 610 PRINT CHR$(141);" ";trk%-track% 620 PRINT CHR$(141);" ";trk%-track% 630 PROCinsert("SOURCE") 640 FOR loop%=0 TO 7 650 address%=buffer%+(loop%*&A00) 660 PROCtransfer(sdr%,address%,&53,track%) 670 track%=track%+1 680 NEXT 690 : 700 buffer%=&2C00 710 track%=store% 720 PROCinsert("DESTINATION") 730 FOR loop%=0 TO 7 740 address%=buffer%+(loop%*&A00) 750 PROCtransfer(ddr%,address%,&4B,track%) 760 track%=track%+1 770 NEXT 780 store%=track% 790 NEXT 800 IF trk% MOD 8=0 ENDPROC 810 track%=store% 820 buffer%=&2C00 830 CLS 840 PRINT TAB(0,4)"Number of tracks" 850 PRINT TAB(0,5)"to be backed up:-" 860 PRINT CHR$(141);" ";trk%-track% 870 PRINT CHR$(141);" ";trk%-track% 880 PROCinsert("SOURCE") 890 FOR loop%=1 TO trk% MOD 8 900 address%=buffer%+(loop%*&A00) 910 PROCtransfer(sdr%,address%,&53,track%) 920 track%=track%+1 930 NEXT 940 : 950 buffer%=&2C00 960 track%=store% 970 PROCinsert("DESTINATION") 980 FOR loop%=1 TO trk% MOD 8 990 address%=buffer%+(loop%*&A00) 1000 PROCtransfer(ddr%,address%,&4B,track%) 1010 track%=track%+1 1020 NEXT 1030 ENDPROC 1040 : 1050 DEF PROCinsert(A$) 1060 PRINT''"Please insert the ";A$;" disk and press a key":VDU7 1070 diskin=GET 1080 ENDPROC 1090 : 1100 DEF PROCtransfer(drive%,address%,command,track%) 1110 ?block%=drive% :REM sdr% or ddr% 1120 block%!1=address% :REM address in RAM 1130 block%?5=3 :REM number of parameters 1140 block%?6=command :REM &53 or &4B 1150 block%?7=track% :REM track 1160 block%?8=0 :REM sector(always zero) 1170 block%?9=&2A :REM 10 sectors of 256 bytes 1180 block%?10=0 :REM error-check byte 1190 A%=&7F :REM Read/Write operation required 1200 X%=block% MOD 256 :REM address of- 1210 Y%=block% DIV 256 :REM data block 1220 CALL&FFF1 1230 IF block%?10=18 PRINT''"Make certain that DESTINATION disk is not write-protected, and try again":END 1240 IF block%?10<>0 PRINT''"Disc error, please check and try again":END 1250 ENDPROC 1260 : 1270 DEF PROCanother 1280 CLS:VDU7:INPUT''''"Do you want to backup another disk?(Y/N)"repeat$ 1290 IF repeat$="Y" OR repeat$="y" RUN ELSE PRINT'''"Thank you" 1300 ENDPROC 1310 : 1320 DEF PROCerror 1330 CLOSE#0 1340 REPORT:PRINT" at line ";ERL 1350 ENDPROC