& > AFSFiler/src v1.32 J.G.Harston 9 19-Nov-2010 v0.14 Initial version based on SJFiler D 05-Aug-2012 v0.15 L3FS disks done, sequential and interleaved (Z 28-May-2017 v0.16 Checks JesMap for file allocation blocks, updated os%, FNfn_todos 2U 30-May-2018 v0.17 (C)onfirm option, OPT command, checks for outside image file &7C00:&83:>&4000:&80 <&FFFF:=fx(132,0) init:hdr:: err: 8curr%=-1:inmem%=0::fs%=fs:X%=ctrl%:Y%=X%256: :  8:wdt%=+1: )drv$="":(D%+48)">"; "["drv$"]"; "csd%=home%:" "A$:do(s(A$)) "0 ,: 6init:ver$="1.32c" @_ ctrl% 127,name% 255,data% 255,thisdir% &19FF,alloc% 511:diskrec%=0: os%=6: diskrec% 255 JQD%=0:drv$="":path$="":title$="":csd%=0:home%=0:valid%=&30534641:map$="JesMap" TQfsv%=0:opt%=0:fullinf%=:d$=".":s$="/":os%-24:d$="/":s$=".":os%-32:d$="\" ^Ecmd$=":MOUNT:DIR:CAT:EX:INFO:TYPE:DUMP:COPY:BLOCK:INF:HELP:QUIT:" hhlp$=":|:|&:::(): [CTRLS]: [7BIT]: ()::FULL|SHORT::::" r |.hdr:"AFSFiler v"ver$" by J.G.Harston": : ݤerr:"FX229": : !:fs<>fs%:"FX143,18,"+fs% ECloseAll:A%=<>17 <>28:" at line "+Þ,<128 A%):=-1 A% 4CloseAll: in%=in%:IFin%:A%=in%:in%=0:CLOSE#A% 'out%=out%:out%:A%=out%:out%=0:#A% 'dsk%=dsk%:dsk%:A%=dsk%:dsk%=0:#A%  : do(A$):A$="?":A$="HELP"  A$,1)=";" A$="":  A$,1)="*":A$,2): ! A$,1)=".":A$="CAT "+A$,2) 6A%=A$+" "," "):B$=uc(A$,A%-1)):A$=s(A$,A%+1)) F B$=1 "01234567",B$):drv$="":D%=B$(((os%<6)3)7):home%=0: 0A%=cmd$,":"+B$+":"): A%=0:"Bad command": &A%=("FN_"+B$+"(A$)"): 0: :1ݤsyn(S$): A$="": "Syntax: "B$" "S$:= = D: N Commands X ======== bH; _INFO, _COPY, _QUIT, _INF, _MOUNT, _OPT : Prevent crunching l9; _HELP, _TYPE, _DUMP, _CAT, _BLOCK, _DIR, _EX v: ݤ_QUIT(A$):"Quit"   os%>5:*QUIT  :  ݤ_HELP(A$):hdr:p%=2:q%=2: 1A%=cmd$,":",p%): 2cmd$,p%,A%-p%);:p%=A%+1 1A%=hlp$,":",q%): 8)hlp$,q%,A%-q%):q%=A%+1  p%>cmd$:=0 : Aݤ_OPT(A$): IF A$="":PRINT"OPT=";opt%'"1:"'"2:"'"4:"'"8:":=0 fsv%=(A$):=0 : Tݤ_INF(A$):A$="":"Output ""FULL",fullinf%);"SHORT",fullinf%)" .inf info":=0  fullinf%=uc(A$)="S":=0 :  Bݤ_MOUNT(A$):home%=0: A$<2:do(A$):=0 drv$=s(A$):D%=-1:=0 *ݤ_CAT(A$):LstDir(0):=0 4ݤ_EX(A$):LstDir(1):=0 >: H6ݤ_DIR(A$):curr%=-1: syn("|&"):= RE A$,1)="&":A%=Mount:home%=(uc(A$)):path$="&"+h0(home%,6):=0 \/ A$="$":A%=Mount:home%=root%:path$="$":=0 f look:= p7(fptr%?&14 &20)=0:"'"src$"' not a directory":= zFA%=fptr%?&C:fptr%?&C=13:path$=path$+"."+s($(fptr%+2)):fptr%?&C=A% X path$,2)=".^":A%=path$-1:A%=A%-1:path$,A%,1)="."A%<2:path$=path$,A%+(A%>1)) home%=fptr%!&17 &FFFFFF =0 : (ݤ_BLOCK(A$): syn(""):= ]blk%=("&"+uc(A$))&FFFFFF:RdBlocks(data%,blk%,D%,1):S%=blk%*256:O%=data%:ln%=256:dump =0 : "ݤ_DUMP(A$): syn(""):=  look:= 3FileInfo(fptr%,1):S%=0::ReadData:dump:eof% =0 : %dump:cols%=16: wdt%<80:cols%=8  P%=0 ln%-1 cols%:B$="" + h0(P%+S%,8)" ";: Q%=P% P%+cols%-1 $, Q%=" " A$<="~" B$=B$+A$ B$=B$+"." 8 O%=O%+1:: B$::S%=S%+ln%: B: L"ݤ_TYPE(A$): syn(""):= V@msk%=A$," [")<>0:msk%=(msk%&80)&7F:A$=A$,A$+" "," ")-1) ` look:= j/FileInfo(fptr%,1):S%=0:last%=0::ReadData tI P%=0 ln%-1:Q%=?O%msk%:msk%=255:Q% Q%=10 Q%=13 Q%>31 Q% ~'(Q%=10 Q%=13) Q%<>last%:23-Q% Q%=9:(8-( 8)); !last%=?O%:O%=O%+1::S%=S%+ln%  eof%:: =0 : ݤ_INFO(A$)  A$<>"": look:= ! A$<>"":x%=0:ListFile(1):=0  Mount:= DHdr:(18-title$);"SEQINTMUX",(fsv%3)*3+1,3)" DEN=";fsv%4+1 3"Root: &"h0(root%,6)" CrDate: "date(idate%) 6"MapA: &"h0(mapa%,6);"* ",(mapa%=map%)+2,1)" "; 6"MapB: &"h0(mapb%,6);"* ",(mapb%=map%)+2,1)" ";  V"MapSz: ";mapsz%'"Size: &"h0(dsize%,6)" ";dsize%4;"K ";(dsize%-512)/4096;"M" =0 : (Hݤ_COPY(A$): syn(" (inf:) (onfirm)"):= 2 copy * path < copy * inf:path F5A%=A$+" "," "):src$=A$,A%-1):dst$=s(A$,A%+1)) P:cnf%=uc(dst$,2))=" C": cnf%:dst$=s(dst$,dst$-2)) Z1inf%=uc(dst$,4))="INF:":inf%:dst$=dst$,5) d!dst$="":" missing":= n@os%<6:dst$,"::")dst$,1)="-":"FS prefix unsupported":= x A$=src$: A$<>"$": look:= Tsrc$="$":A%=Mount:fptr%=data%:fptr%?&14=&20:fptr%!&17=root%:curr%=-1: A%<0:= Q((fptr%?&14)&20)=0:leaf$=src$:CopyOneFile(src$,dst$):=0: copy single file : ) src=directory, copy all recursively ;A%=file(dst$,8):dst$=dst$+d$: Create target directory Voldcsd%=csd%:oldfptr%=fptr%:curr%=-1:csd%=fptr%!&17 &FFFFFF:CopyDirectory(dst$)  Set info on top directory YA%=dst$:A%=A%-1: dst$,A%,1)=d$ A%<1:leaf$=dst$,A%+1,dst$-A%-1):dst$=dst$,A%) Xsrc$="$":load%=0:exec%=0:length%=&200:attr%=8:mdate%=idate%:SetInfo(dst$+leaf$):=0 SetDir:=0 : :  File copying code  ================= : (CopyDirectory(dst$): entry%,leaf$ "+RdDir:fptr%=thisdir%: thisdir%?15=0: ,! FOR entry%=1 TO thisdir%?15 66 fptr%=thisdir%+(!fptr% AND &FFFF):PROCCopyObject @ NEXT entry% J:entry%=1::fptr%=thisdir%+(!fptr% &FFFF):CopyObject T(entry%=entry%+1: entry%>thisdir%?15 ^ h: r#CopyObject: oldcsd%,oldfptr% |3FileInfo(fptr%,1): fname$="":: Broken entry ;cnf%:"Copy "fname$;:cnf%=yna(cnf%):cnf%>0:: 13 )leaf$=fname$:fname$=fn_todos(fname$) ;((fptr%?&14)&20)=0:CopyOneFile(fname$,dst$+fname$): :  Descend into directory 4"Copying "fname$;(10-fname$)" to "dst$+fname$ Coldcsd%=csd%:oldfptr%=fptr% : Save current directory ?curr%=-1:csd%=fptr%!&17 &FFFFFF : Select new directory QA%=file(dst$+fname$,8) : Create matching destination directory ACopyDirectory(dst$+fname$+d$) : Copy directory at cblk%  SetDir: :  SetDir Ccurr%=-1:csd%=oldcsd%:RdDir:fptr%=oldfptr% : Restore previous HFileInfo(fptr%,1):SetInfo(dst$+fname$) : Set directory's metadata  &: 0CopyOneFile(src$,dst$) :-"Copying "src$;(10-src$)" to "dst$;4; D@FileInfo(fptr%,1):file(dst$,5):X%!14=&33:A%=file(dst$,4) N>X%!2=load%:X%!6=exec%:X%!10=0:X%!14=&4000:A%=file(dst$,7) X*length%:CopyData: Copy if length<>0 bSetInfo(dst$):3,127) l v: CopyData 5out%=f_openout(dst$):S%=0::ReadData: =0:4; 2(S%1023)=0: 3,8)d0(100*S%length%,2)"%"; ,ln%:gbpb(2,out%,data%,ln%,0):S%=S%+ln% # eof%:#out%:out%=0:length%=S%  : TSetInfo(dst$):X%!2=load%:X%!6=exec%:X%!10=length%:X%!14=attr%:A%=file(dst$,1) MA$=leaf$+11-leaf$," ")+h0(load%,8)+" "+h0(exec%,8)+" "+h0(length%,8) :fullinf%:A$=A$+" "+h0(attr%255,2)+" "+h0(mdate%,4) A$=A$+13+10 Oinf%:out%=(dst$+s$+"inf"): p%=1 A$:#out%,A$,p%,1)::#out%:out%=0  fs%<>5: 5A%=NetFS_Op(19,4+access%+dst$) : Write access  KX%!8=mdate%:A%=NetFS_OpN(19,5,10,dst$) : Write create date from mdate E NetFS_Op(18,64+dst$): : create&mod date&time don't exist  ,X%!8=mdate%:X%!10=0:X%!13=mdate%:X%!15=0 *IA%=NetFS_OpN(19,64,18,dst$) : Write create&mod date&time 4 >: H: R Object display routines \ ======================= f: p-Hdr:"Disk: L";fsv%4+2;"FS::"title$;: z: 7LstDir(cflg%):x%=0: Mount:"Not an AFS0 disk": ! cflg%=0 - CAT, cflg%=1 - EX Hdr: "."path$' +RdDir:fptr%=thisdir%: thisdir%?15=0:  entry%=1 thisdir%?15 4fptr%=thisdir%+(!fptr% &FFFF):ListFile(cflg%) 5 entry%: :: IF(x%AND3):IF(cflg%AND1)=0:PRINT  : ListFile(cflg%) 1FileInfo(fptr%,cflg%):fname$;(11-fname$); @(cflg%1):h0(load%,8)" "h0(exec%,8)" "h0(length%,6)" "; attr(access%); -(cflg%1):date(mdate%)" "h0(sin%,6): .x%=x%+1: x%<(wdt%+1) 20: " "; x%=0:  $: .ݤattr(A%):A$="" 8(A%1):A$="r"+A$ B(A%2):A$="w"+A$ L A$="/"+A$ V(A%4):A$="R"+A$ `(A%8):A$="W"+A$ j(A%16):A$="L"+A$ t(A%32):A$="D"+A$ ~(A%64):A$="P"+A$ (A%128):A$="M"+A$ =A$+8-A$," ") : Yݤdate(A%)=d0(A%31,2)+"/"+d0((A%256)15,2)+"/"+d0(1981+(A%4096)+((A%&E0)/2),4) : .ݤtime(A%)=d0(A%255,2)+":"+d0(A%256,2) : : # Catalog manipulation routines # ============================= : .ݤlook:src$=A$:fptr%=find(src$):fptr%:= "'"src$"' not found":= : 6ݤfind(A$):match$=uc(A$,10)):match%=0:Mount:=0 VRdDir:match$="^":thisdir%!17=&FFFF:thisdir%!19=&D5E:thisdir%?37=32:=thisdir%+17 (-fptr%=thisdir%:entry%=1:thisdir%?15=0:=0 2%:fptr%=thisdir%+(!fptr% &FFFF) <=A%=fptr%?&C:fptr%?&C=13:fname$=s($(fptr%+2)):fptr%?&C=A% F/match%=(uc(fname$)=match$):entry%=entry%+1 P! entry%>thisdir%?15 match% Z match%:=fptr% =0 d: nFileInfo(f%,i%) x1A%=f%?&C:f%?&C=13:fname$=s($(f%+2)):f%?&C=A% G A%=1 fname$: fname$,A%,1)<"!" fname$,A%,1)>"~":fname$=""  A% Xload%=f%!&0C:exec%=f%!&10:access%=f%?&14:mdate%=f%!&15 &FFFF:sin%=f%!&17 &FFFFFF Klength%=0:attr%=(access%3)*16+(access%&C)/4+(access%16)/2+mdate%*256  (i%1)=0 sin%=0: & fsv%<4:FileLen1: FileLen2: : FileLen1 offset%=sin%: Loffset%=(offset%&FFF)*2+5 : Offset to allocation map entry ^RdAlloc(map%+offset%256,2) : Read sectors of allocation map allowing for overlap Ioffset%=alloc%!(offset%255) &FFFF : Get next allocation map entry )length%=length%+256: offset% &4000 EA%=offset% 255: A%:length%=length%+A%-256: Low byte of length  : "FileLen2 ,2RdAlloc(sin%,1):ChkMap(alloc%):"Bad map": 6AB%=alloc%?8: B%:length%=B%-256 : Low byte of length @ JMA%=12::B%=alloc%!A% &FFFF00:length%=length%+B%:A%=A%+5: B%=0 A%>&F9 T8 A%>&F9:B%=alloc%!250 &FFFFFF: B%:RdAlloc(B%,1) ^ B%=0 h r: |RdDir:curr%=csd%: fsv%<4:RdDir1 RdDir2 curr%=csd%: : RdDir1 addr%=thisdir%:fptr%=csd%: FRdBlocks(addr%,fptr% &FFF,D%,1) : Read a directory sector Poffset%=(fptr%&FFF)*2+5 : Offset to allocation map entry MRdAlloc(map%+offset%256,2) : Read sectors of allocation map Mfptr%=alloc%!(offset%255) &FFFF : Get next allocation map entry %addr%=addr%+256: (fptr% &4000)  : RdDir2 ARdAlloc(csd%,1): ChkMap(alloc%):"Bad map":thisdir%?15=0: $addr%=thisdir%:fptr%=alloc%+10: 8RdBlocks(addr%,!fptr% &FFFFFF,D%,fptr%!3 &FFFF) &3addr%=addr%+256*(fptr%!3 &FFFF):fptr%=fptr%+5 0 (!fptr% &FFFFFF)=0 : D: N: X Disk access routines b ==================== l Internal disk errors are: v& -1 Unsupported on this hardware -2 Disk/image not present  -3 Past end of image -4  -5 Not a recognised disk * -6 Can only do subset of disk types : ݤMount:csd%:=0 bcurr%=-1:home%=0:inmem%=0:bps%=256:fsv%=8::fsv%=fsv%+((fsv%3)=0)-1:fsv%<4:spt%=10 spt%=16 NfdcInit(diskrec%,8,spt%,2,fsv%4+1,80,0):!data%=0:RdBlocks(data%,0,D%,1) : A L2FS, follow pointer from disk info block to root directory y fsv%<4:root%=data%!22 &FFFFFF: !data%=valid%:dib%=0:RdBlocks(data%,root%,D%,1): root%3:!data%=-1:dib%=data%!&F6 &FFFFFF:RdBlocks(data%,dib%,D%,1): fetch info block ] fsv%>3:!data%=-1:root%=data%!&1F &FFFFFF:RdBlocks(data%,root%,D%,1): fetch root map Q fsv%>3:!data%=-1:RdBlocks(data%,data%!&0A &FFFFFF,D%,1): fetch root dir *: 4/?data%=-1: data%!3=&20202024:!data%=valid% > fsv%=0 !data%=valid% H: R6!data%=0:drv$<>"":err%=-2: Disk image not found \5err%=-2: "Disk error: image file not found":=-2 f3!data%<>valid%:=-5 : Not an AFS0 disk p(RdBlocks(data%,dib%,D%,1):path$="$" z=A%=data%?20:data%?20=13:title$=s($(data%+4)):data%?20=A% :  Level3FS: [freec%=data%!36 &FFFF:idate%=data%!34 &FFFF:root%=data%!31 &FFFFFF:dnxt%=data%?29 Tmapsz%=data%?28:nsec%=data%!26 &FFFF:ndsks%=data%?25:dsize%=data%!22 &FFFFFF Hntrk%=data%!20 &FFFF:mapb%=0:mapa%=0:map%=0:home%=root%:csd%=home%  fsv%>3:=0 :  Level2FS: Emapsz%=data%?33:mapb%=data%!30 &FFFFFF:mapa%=data%!27 &FFFFFF Pidate%=data%!25 &FFFF:root%=data%!22 &FFFFFF:dsize%=(data%!20 &FFFF)*2 %map%=mapa%:home%=root%:csd%=home% )RdBlocks(data%,mapa%,D%,1):f%=?data% ARdBlocks(data%,mapb%,D%,1):((f%-?data%)255)=255:map%=mapb% =0 : ReadData $Esin%=0:ln%=0:eof%=: : length%=0 or past end of file .#fsv%<4:ReadData1 ReadData2 8O%=data%: B: LReadData1 V?RdBlocks(data%,sin% &FFF,D%,1) : Read a file sector `Noffset%=(sin%&FFF)*2+5 : Offset to allocation map entry jKRdAlloc(map%+offset%256,2) : Read sectors of allocation map tKsin%=alloc%!(offset%255) &FFFF : Get next allocation map entry ~eof%=sin%&4000:ln%=256 9eof%:ln%=sin%255:ln%=0:ln%=256 : Last sector  : ReadData2 eof%=0:S%=0:aptr%=0 J aptr%=0:RdAlloc(sin%,1): ChkMap(alloc%):"Bad map":eof%=:ln%=0: &ln%=alloc%?8:: aptr%<10:aptr%=10 Ksec%=alloc%!aptr% &FFFFFF : Get sector start Pnum%=alloc%!(aptr%+3) &FFFF : Get number of sectors U aptr%=250:RdAlloc(sec%,1):alloc%?8=ln%:aptr%=0 : Chain to next allocation map H aptr%:RdBlocks(data%,sec%,D%,1) : Read a file sector -sec%=sec%+1:num%=num%-1:alloc%!aptr%=sec% 3alloc%?(aptr%+3)=num%:alloc%?(aptr%+4)=num%256  Tln%=256:num%=0:aptr%=aptr%+5:alloc%!aptr%=0:eof%=:ln%=alloc%?8:ln%=0:ln%=256  : ((RdAlloc(sin%,num%): sin%=inmem%: 21RdBlocks(alloc%,sin%,D%,num%):inmemX%=sin%: <: FNݤChkMap(B%):A%=B%?6:B%?6=13: $B%=map$:B%?6=A%:=B%?6<>B%?255 B%?6=A%:= P: Z$RdBlocks(ad%,bl%,dv%,nm%): p% dBerr%=0: p%=0 nm%-1:fdcRd(ad%+p%*256,bl%+p%,dv%,1,fsv%4+1) n: x: :  FDC routines  ============ : 6fdcInit(dskrec%,bps%,spt%,hds%,den%,trks%,sec0%)  i%:os%<>6: Sdskrec%?0=bps%:dskrec%?1=spt%:dskrec%?2=hds%:dskrec%?3=den%:den%=1:dskrec%?2=1 L i%=4 59 4:dskrec%!i%=0::dskrec%!60=&20000000:dskrec%!64=&20000000 7dskrec%?8=sec0%:dskrec%!16=trks%*spt%*(2^bps%)*hds%  : &fdcRd(addr%,sec%,drv%,num%,den%) .A%=02554:addr%!A%=0::drv%>7:err%=-1: :  fsv%=  0=L2FS SEQ " 1=L2FS INT , 2=L2FS MUX 6 4=L3FS SEQ @ 5=L3FS INT J 6=L3FS MUX TA%=sec%spt% ^5fsv%1:sec%=((A%80)*2+(A%80))*spt%+(sec%spt%) h4fsv%2:sec%=((A%2)*80+(A%2))*spt%+(sec%spt%) rJdrv$=""::fdcOp(1):addr%=addr%+256:sec%=sec%+1:num%=num%-1:num%<1: |*dsk%=f_openin(drv$):dsk%=0:err%=-2: bsec%*256>#dsk%:#dsk%:dsk%=0:err%=-3:"Disk error: past end of image"+10+13,curr%<>-1);: 7gbpb(3,dsk%,addr%,num%*256,sec%*256):#dsk%:dsk%=0  : fdcOp(op%) \os%=6: "XADFS_DiscOp",0,op%+64+(diskrec%<<6),sec%*bps%+((drv%3)<<29),addr%,bps% err% aos%<6:den%=1:op%=1:err%=disk(addr%,&53,(drv%3)+2*(sec%800),(sec%10)80,sec%10,1,den%) ;os%<6:den%>1:op%=1:err%=scsi(addr%,&08,drv%,sec%,1)  csd%=0: err%:: err%=-1:"Unsupported": =err%:"Disk error &"h0(err%,2)" at ";drv%":"h0(sec%,6)  : : ) Translate leafname if saving to DOS &) =================================== 0. / ? < > + = ; \ = become . # $ ^ & @ % ~ :(ݤfn_todos(A$): B%:(os%-32)=0:=A$ DTA%=1A$:B%="/?<>+=;\",A$,A%,1)):B%:A$=A$,A%-1)+".#$^&@%~",B%,1)+A$,A%+1) N :=A$ X: bݤyna(A%):A%=0:=0 l+"? (Y/N/A)";::A%="YAN",(&DF)):A% v+7,127);"YesAllNo ",A%*3-2,3);:=A%-2 :