10
20
30 DIM ctrl% 31,mem% &4FF:X%=ctrl%:Y%=X%DIV256
40 this%=&00000:found%=0
50 REPEAT:PRINTCHR$13;"Checking ";~this%;
60 PROCreadX(this%,0,mem%)
70 mem%?255=13:IF $(mem%+251)="Hugo":PROCRecover
80 this%=this%+1:UNTIL0
90 END
100 :
110 DEFPROCRecover
120 IF(mem%!214 AND&FFFFFF)<>2:ENDPROC
130 mem%?214=13:n$=$(mem%+204):PRINT" - found ";n$;
140 FOR S%=2 TO 6:PROCreadX(S%,0,mem%+S%*256-512):NEXT
150 $(mem%+5+26*found%)=n$:mem%!(27+26*found%)=this%-4
160 mem%?(8+26*found%)=mem%?(8+26*found%) OR 128
170 FOR S%=2 TO 6:PROCwriteX(S%,0,mem%+S%*256-512):NEXT
180 found%=found%+1:PRINT:ENDPROC
190 :
200 DEFPROCwriteX(sec%,drv%,mem%):A%=FNscsi(&0A,mem%,&100,sec%,drv%)
210 DEFPROCreadX(sec%,drv%,mem%):A%=FNscsi(&08,mem%,&100,sec%,drv%)
220 IF A%:PRINT"Disk error &";~A%;:PROCdelay(200)
230 ENDPROC
240 :
250 DEFPROCdelay(T%):T%=TIME+T%:REPEAT UNTIL TIME>T%:ENDPROC
260 :
270 DEFFNscsi(cmd%,addr%,num%,sect%,drv%):LOCAL fs%
280 fs%=FNfs:IF fs%<>8:OSCLI"FADFS"
290 X%?0=0:X%!1=addr%:X%?5=cmd%:X%?6=drv%*32+((sect%AND&1F0000)DIV65536)
300 X%?7=((sect%AND&FF00)DIV256):X%?8=sect%:X%!9=num%DIV256:X%!11=num%
310 A%=114:CALL&FFF1:A%=?X%:IF fs%<>8:OSCLI"FX143,18,"+STR$ fs%
320 =A%
330 :
340 DEFFNfs:LOCAL A%,E%,Y%:=(USR&FFDA)AND&FF