4 ----------------------------------------------  RESCUE : disk recovery 4 ---------------------------------------------- ( 7 2 cat 511 : catalogue <) param 13 : OSWORD parameter block F fnam$(32) : filenames P! load%(32) : load addresses Z! exec%(32) : exec addresses d strt%(32) : start sectors n leng%(32) : lengths x fini%(32) : end sectors  colr$(32) : colours  #init : which drive, etc. readcat : read catalogue (extract : extract from catalogue eof : check eof newfiles : revise files !printcat : print catalogue $newcat : make new catalogue !writecat : write catalogue   eof  fini%(1)=snum%-1: insert(1) fini%(1)=snum%-1 " leng%(1)=fini%(1)-strt%(1)+1 ,leng%(1)=256*leng%(1) 6 @ J extract T' extract fields from the catalogue ^ get number of files hfnum%=cat?&105 8 r get number of sectors |'snum%=cat?&107 + 256*(cat?&106 3)  if no files, leave  fnum%=0:  get file details  I%=1 fnum% / fnst% = cat+8*I% : start of filename 0 adst% = fnst%+&100 : start of addresses  get file name  J%=0 7 ' fnam$(I%)=fnam$(I%)+(fnst%?J%)   get load address  load%(I%)=adst%!0 &FFFF 7 load%(I%)=load%(I%) + &10000*((adst%?6 &C) 4)  get exec address  exec%(I%)=adst%!2 &FFFF 9 exec%(I%)=exec%(I%) + &10000*((adst%?6 &C0) 64) & get length 0 leng%(I%)=adst%!4 &FFFF :9 leng%(I%)=leng%(I%) + &10000*((adst%?6 &30) 16) D get start sector N strt%(I%)=adst%?7 X/ strt%(I%)=strt%(I%) + &100*(adst%?6 &3) b calculate end sector l- fini%(I%)=strt%(I%)+(leng%(I%)-1) 256 v    head  screen title   15,2);141;131;"RESCUE"  15,3);141;131;"RESCUE"    init # initialise num of dummy files  dumm%=0  initials DIMs  I%=0 31   colr$(I%)=130 : green + fnam$(I%)="" : initial filename   * 4 which drive > head H R 4,8);35," ") \( 4,8);134;"which drive (0-3) "; f "> " drive% p drive%>-1 drive%<4 z "DRIVE "+drive%   get user ready  head / 4,8);134;"insert disk in drive ";drive% 0 4,9);134;"press SPACE when ready to go";  (100)=32   insert(J%) makeroom(J%+1) dumm%=dumm%+1 dumm$="0"+dumm%,2) fnam$(J%)="DUMMY"+dumm$+"$" fini%(J%)=strt%(J%-1)-1 strt%(J%)=fini%(J%+1)+1 #leng%(J%)=fini%(J%)-strt%(J%)+1 $leng%(J%)=leng%(J%)*256 .colr$(J%)=129 8load%(J%)=&31900 Bexec%(J%)=0 L V ` newcat j.cat?&105=fnum%*8 : number of files * 8 t I%=1 fnum% ~, fnst%=cat + 8*I% : start of filename - adst%=fnst%+&100 : start of addresses  J%=1 fnam$(I%) & fnst%?(J%-1)=fnam$(I%),J%,1)   adst%!0 = load%(I%)  adst%!2 = exec%(I%)  adst%!4 = leng%(I%)  adst%?7 = strt%(I%) " lo% = load%(I%) &10000 " ex% = exec%(I%) &10000 " le% = leng%(I%) &10000  st% = strt%(I%) &100 - adst%?6 = 64*ex% + 16*le% + 4*lo% + st%     (newfiles 2 fnum%=0: <I%=1 F P I%=I%+1 Z& gap%=strt%(I%-1) - fini%(I%) - 1 d gap%<>0:insert(I%) n I%=fnum% I%>31 x  makeroom(J%) % shift filenames up to make room fnum%=fnum%+1  K%=fnum% J% -1  fnam$(K%)=fnam$(K%-1)  load%(K%)=load%(K%-1)  exec%(K%)=exec%(K%-1)  leng%(K%)=leng%(K%-1)  strt%(K%)=strt%(K%-1)  fini%(K%)=fini%(K%-1)  colr$(K%)=colr$(K%-1)     osword " A%=&7F , X%=param 6Y%=X% 256 @ &FFF1 J T ^printcat h r head |  fnum%=0:  I%=1 fnum%  colr$(I%);  dir$=fnam$(I%),1)  dir%=(dir$) &7F  lok%=(dir$) &80  dir$=(dir%)  lok$="L"  lok%=0:lok$=" "  nam$=fnam$(I%),7)  dir$;".";  nam$;" ";  lok$;" ";  @%=5  ~load%(I%);" ";  ~exec%(I%);" "; & @%=3 0 ~strt%(I%);" - "; : ~fini%(I%);" "; D @%=5 N ~leng%(I%);8;8 X b l v readcat ) read two catalogue sectors into cat ¶m?0 = drive% : drive number (param!1 = cat : buffer address +param?5 = 3 : num of parameters ¶m?6 = &53 : read command ¶m?7 = 0 : track number 'param?8 = 0 : sector number /param?9 = &22 : 2 sectors x 256 bytes ,osword : read the disk sectors  param?10=0:  4,10);129; / "error reading catalogue = &";~param?10:    writecat " update two catalogue sectors  ¶m?0 = drive% : drive number *(param!1 = cat : buffer address 4+param?5 = 3 : num of parameters >'param?6 = &4B : write command H¶m?7 = 0 : track number R'param?8 = 0 : sector number \/param?9 = &22 : 2 sectors x 256 bytes f-osword : write the disk sectors p param?10=0: z5 '129;"error writing catalogue = &";~param?10: