' backup V1.0 ' RESERVE mem_top%=HIMEM RESERVE 25000 init backup("\","*.*",TRUE) PRINT AT(1,1);"Writing buffer to disk..." rstatus|=4 WHILE bufpoint%>=4608 @read("") @write WEND treshold%=0 WHILE bufpoint%>0 @read("") @write WEND PRINT AT(1,1);"Backup completed";SPACE$(30) CHDIR old_path$ RESERVE ' > PROCEDURE init dta%=HIMEM wbuf%=HIMEM+4400 ! max 100 levels of sub-directory nesting buf%=HIMEM+13000 bufsize%=mem_top%-buf% bufpoint%=0 IF bufsize%<4608 ALERT 1,"Not enough free memory|available!",1," OK ",d% EDIT ENDIF spc|=0 dnr|=1 dr$="A" format!=FALSE sides|=2 drive|=0 track|=0 side|=0 wstatus|=2 treshold%=4608 checkrom message(1) old_path$=DIR$(0) RETURN > PROCEDURE backup(path$,name$,r!) LOCAL e%,fnam$ ' ' first, search all files CHDIR path$ ~FSETDTA(dta%) e%=FSFIRST(path$+name$,-1) DO UNTIL e% IF (BYTE{dta%+21} AND 3)<>0 OR BYTE{dta%+21}=0 PRINT AT(1,spc|/3+1);TAB(spc|);CHAR{dta%+30};SPACE$(20) rstatus|=0 REPEAT read(CHAR{dta%+30}) @write UNTIL rstatus|=3 ENDIF e%=FSNEXT() LOOP ' ' next, search all directories and recursively search them IF r!=TRUE e%=FSFIRST(path$+"*.*",-1) DO UNTIL e% IF BTST(BYTE{dta%+21},4) fnam$=CHAR{dta%+30} IF BTST(BYTE{dta%+21},4) IF fnam$<>"." AND fnam$<>".." PRINT AT(1,spc|/3+1);TAB(spc|);">> ";fnam$;SPACE$(20) ADD dta%,44 ADD spc|,3 CHDIR fnam$ backup(path$+fnam$+"\",name$,r!) CHDIR ".." PRINT AT(1,spc|/3+1);SPACE$(60) SUB dta%,44 SUB spc|,3 ~FSETDTA(dta%) ENDIF ENDIF ENDIF e%=FSNEXT() LOOP ENDIF RETURN > PROCEDURE read(fnam$) LOCAL x$ ' bfree%=bufsize%-bufpoint%-512 ' IF rstatus|=0 OPEN "i",#1,fnam$ fsize%=LOF(#1) rstatus|=1 ENDIF ' IF rstatus|=1 AND bfree%>=132 x$=SPACE$(132) LSET x$=DIR$(0)+"\"+fnam$ MID$(x$,129,4)=MKL$(fsize%) BMOVE VARPTR(x$),buf%+bufpoint%,132 ADD bufpoint%,132 SUB bfree%,132 rstatus|=2 ENDIF ' IF rstatus|=2 AND bfree%>0 toread%=MIN(fsize%,bfree%) BGET #1,buf%+bufpoint%,toread% ADD bufpoint%,toread% SUB fsize%,toread% bufusage IF fsize%=0 rstatus|=3 CLOSE #1 ENDIF ENDIF ' IF rstatus|=4 AND bfree%>=132 x$="..."+SPACE$(129) BMOVE VARPTR(x$),buf%+bufpoint%,132 ADD bufpoint%,132 SUB bfree%,132 rstatus|=5 ENDIF RETURN > PROCEDURE write IF wstatus|=0 createboot wstatus|=1 ENDIF ' IF (wstatus|=1 AND bufpoint%>=treshold%) wrtrack ADD written%,4608 BMOVE buf%+4608,buf%,bufsize%-4608 SUB bufpoint%,4608 bufusage diskfull IF full!=TRUE wstatus|=2 message(1) ENDIF ENDIF ' IF wstatus|=2 AND PEEK(prot%)=255 wstatus|=3 message(2) INC dnr| ENDIF ' IF wstatus|=3 AND PEEK(prot%)<>255 wstatus|=0 track|=0 side|=0 format!=FALSE ENDIF RETURN > PROCEDURE wrtrack LOCAL ok!,d% IF format!=TRUE message(5) errproc(XBIOS(10,L:wbuf%,L:0,drive|,9,track|,side|,1,L:&H87654321,&HE5E5)) ENDIF ok!=FALSE WHILE ok!=FALSE message(4) IF XBIOS(9,L:buf%,L:0,drive|,1,track|,side|,9)<>0 IF format!=FALSE message(5) errproc(XBIOS(10,L:wbuf%,L:0,drive|,9,track|,side|,1,L:&H87654321,&HE5E5)) format!=TRUE ELSE ALERT 1,"Error occured!",1," OK ",d% EDIT ENDIF ELSE ok!=TRUE ENDIF WEND RETURN > PROCEDURE diskfull full!=FALSE IF track|=79 AND ((sides|=2 AND side|=1) OR sides|=1) full!=TRUE ELSE IF sides|=2 IF side|=0 INC side| ELSE side|=0 INC track| ENDIF ELSE INC track| ENDIF ENDIF RETURN > PROCEDURE bufusage PRINT AT(2,20); PRINT USING "Buffer size: ###### ",bufsize%; PRINT USING "Buffer pointer: ###### ",MAX(0,bufpoint%); PRINT USING "Buffer usage: ###%",MAX(0,CINT((bufpoint%/bufsize%)*100)) RETURN > PROCEDURE checkrom LOCAL buf%,but% ' buf%=LPEEK(&H4F2) IF DPEEK(buf%)<>&H601E prot%=&H9F8 ELSE prot%=&H9B2 ENDIF RETURN > PROCEDURE message(x|) IF x|<4 PRINT AT(2,21);SPACE$(78) ENDIF PRINT AT(2,21); SELECT x| CASE 1 PRINT "Remove disk from drive ";dr$ CASE 2 PRINT "Insert backup disk #";dnr|;" in drive ";dr$ CASE 3 PRINT "Creating bootsector..." CASE 4 PRINT USING " Writing track ##, side #, #####K written ",track|,side|,CINT(written%/1024) CASE 5 PRINT USING "Formatting track ##, side #, #####K written ",track|,side|,CINT(written%/1024) ENDSELECT RETURN > PROCEDURE createboot LOCAL boot% ' INLINE boot%,512 ~XBIOS(18,L:boot%,L:-1,1+sides|,0) BMOVE buf%,buf%+512,bufsize%-512 ADD bufpoint%,512 bufusage BMOVE boot%,buf%,512 RETURN > PROCEDURE errproc(e%) IF e%<>0 ALERT 1,"Error number "+STR$(e%)+" occured!",1," OK ",d% EDIT ENDIF RETURN