> SJFiler 0.13 9 19-Apr-2007 v0.10 Initial version based on CPMFiler ' 20-Apr-2007 v0.11 Testing on BBFW @( 21-Apr-2007 v0.12 Physical disk access on BBC+ADFS, RISCOS 82 27-Apr-2007 v0.13 Bugfix to gbpb() and CopyOneFile <: QFos%=fx(0,1)&FF:arc%=os%=6 >&8000:8:A%=:9,11:A%<80:&80:>&4000:&80 Pos%<32:arc%:=fx(132,0) 9Zinit:"SJFiler v"ver$" by J.G.Harston"': err: d:X%=ctrl%:Y%=X%256 .ndrv$="":(D%+48);"> "; "[";drv$;"] "; x""A$:do(A$) 0 : init:ver$="0.13" 3com$="QUITHELPFILECAT EX DIR TYPEDUMPINFOCOPY" Rhelp$=":::::: [CTRLS]: [7BIT]:: :" v ctrl% 127,name% 255,thisdir% 63,bitmap% 63,object% 63,dir% &3FF,alloc% &3FF,data% &3FF:X%=ctrl%:Y%=X%256:res%=0 NOSWORD=&FFF1:D%=0:drv$="":path$="":csd%=-1:valid$="SJ Research MDFS disk " /fs%=fs:d$=".":s$="/":os%=32:d$="\":s$="."  : 0ݤerr:"FX229"::fs<>fs%:"FX143,18,"+fs% 2CloseAll:" "+Þ,<128 <>17):=-1 <>17 -CloseAll:in%=in%:in%:A%=in%:in%=0:#A% 'out%=out%:out%:A%=out%:out%=0:#A%  : "do(A$):A$="?":A$="HELP" (, A$,1)=" ":A$=A$,2):A$,1)<>" " 6 A$,1)=";" A$="": @ A$,1)="*" A$: !J A$,1)="." A$="CAT "+A$,2) 2T A$=1 "0123",A$):drv$="":D%=A$:csd%=-1: 8^com%=0::B$=com$,com%*4+1,4):B$=B$,B$+" "," ")-1) 1hcom%=com%+1:uc(A$,B$))=B$ com%*4>=com$ 'ruc(A$,B$))<>B$ "Bad command": )|z%=("FN_"+B$+"(MID$(A$,2+LENB$))"): : :  Commands  ======== : ݤ_QUIT(A$):"Quit"  *QUIT  : ݤ_HELP(A$):ptr%=1:com%=0: T" "com$,com%*4+1,4);:A$=help$,ptr%):A$=A$,A$,":")-1):ptr%=ptr%+A$:" "A$; /:ptr%=ptr%+1:com%=com%+1:com%*4>=com$:=0 : (ݤ_FILE(A$):drv$=A$:D%=-1:csd%=-1:=0 : &ݤ_CAT(A$):LstDir(0):=0 0: :ݤ_EX(A$):LstDir(1):=0 D: $Nݤ_DIR(A$): A$="$":A%=Mount:=0 3Xcblk%=find(A$):cblk%=0:"'"A$"' not found":=0 5b(fptr%?&17 &20)=0:"'"A$"' not a directory":=0 *l A%=0 63 4:thisdir%!A%=cblk%!A%: 7vpath$=path$+"."+$(cblk%+1):csd%=thisdir%!32 &FFFF =0 : ,ݤ_DUMP(A$): ln%,p%,ptr%,cols%:cols%=16 N IF LEFT$(A$,1)="-" cols%=VAL(MID$(A$,2)):A$=MID$(A$,INSTR(A$+" "," ")+1) #A$="":"Syntax: DUMP ":= =src$=A$:ptr%=find(src$):ptr%=0:"'"src$"' not found":= ( A%=0 63 4:object%!A%=ptr%!A%: #ln%=object%!&14 &FFFFFF:p%=32  P%=0 ln%-1 cols%:B$="" 7h0(P%,6);" ";:(P%&3FF)=0:ReadData(P%):O%=data%  Q%=P% P%+cols%-1 Kh0(?O%,2);" ";:A$=(?O%&7F): A$>=" " A$<="~" B$=B$+A$ B$=B$+"." O%=O%+1:: B$: =0  : =ݤ_TYPE(A$): ln%,p%,ptr%:A$="":"Syntax: TYPE ":= ) msk%=A$," [")<>0:msk%=(msk%&80)&7F N*src$=A$,A$+" "," ")-1):ptr%=find(src$):ptr%=0:"'"src$"' not found":= (4 A%=0 63 4:object%!A%=ptr%!A%: +>ln%=object%!&14 &FFFFFF:p%=32:last%=0 6H P%=0 ln%-1:(P%&3FF)=0:ReadData(P%):O%=data% :RQ%=?O%msk%:msk%=255:Q% Q%=10 Q%=13 Q%>31 Q% '\(Q%=10 Q%=13) Q%<>last%:23-Q% fQ%=9:(8-( 8)); plast%=?O%:O%=O%+1::: z=0 : =ݤ_INFO(A$): ln%,p%,ptr%:A$="":"Syntax: INFO ":= =src$=A$:ptr%=find(src$):ptr%=0:"'"src$"' not found":= ( A%=0 63 4:object%!A%=ptr%!A%: #fptr%=object%:x%=0:ListFile(1) G p%=0 31 2:h0(object%?p%,2);h0(object%?(p%+1),2);" ";::8 2 p%=32 63 2:h0(object%!p%,4);" ";::8 =0 : Cݤ_COPY(A$):A$="":"Syntax: COPY ":=  copy * path  copy * inf:path  copy * zip:zipfile +p%=A$," "):src$=A$,p%-1):A$=A$,p%+1) zip%=0:inf%=0:dst$=A$ *uc(A$,4))="INF:":inf%=:dst$=A$,5) *$uc(A$,4))="ZIP:":zip%=:dst$=A$,5) _.src$="$":cblk%=Mount:cblk%=thisdir% cblk%=find(src$):cblk%=0:"'"src$"' not found":=0 )8 A%=0 63 4:object%!A%=cblk%!A%: ,B If src=directory, copy all recursively #L if src=file, copy single file NV((object%?&17)&20)=0:fptr%=object%:leaf$=src$:CopyOneFile(src$,dst$):=0 ` dst$<>"":cdir(dst$) j dst$<>"":dst$=dst$+d$ tCopyDirectory(dst$) ~=0 : :  File copying code  ================= : -CopyDirectory(dst$): entry%,bit%,fptr% * A%=0 63 4:thisdir%!A%=cblk%!A%: 'ptr%=32:cblk%=thisdir%!ptr% &FFFF NRdBlocks(dir%,cblk%,D%,1) : Read first directory block A A%=0 63 4:bitmap%!A%=dir%!A%: : Get occupied bitmap #bit%=?bitmap% 2:fptr%=dir%+64  entry%=1 255 )(entry%7)=0:bit%=bitmap%?(entry%8) e (entry%15)=0:ptr%=ptr%+2:cblk%=thisdir%!ptr%&FFFF:cblk%:RdBlocks(dir%,cblk%,D%,1):fptr%=dir% (bit%1)<>0:CopyObject 'bit%=bit%2:fptr%=fptr%+64: entry% ( 2: ?<CopyObject: ptr%,bit%,old_cblk%,thisdir$,bitmap$,object$ 7FFileInfo(fptr%):leaf$=fname$:fname$=clean(fname$) 7P(access%&20)=0:CopyOneFile(fname$,dst$+fname$): Z: d Descend into directory :nold_cblk%=cblk% : Save current directory block number Lx A%=0 63:thisdir$=thisdir$+thisdir%?A%: : Save current object info R A%=0 63:bitmap$ =bitmap$ +bitmap%?A% : : Save current dir. alloc bitmap L A%=0 63:object$ =object$ +fptr%?A% : : Save current object info ?cblk%=fptr% : Current block is this directory Bcdir(dst$+fname$) : Create matching destination directory <CopyDirectory(dst$+fname$+d$): Copy directory at cblk% C A%=0 63:object%?A%=object$,A%+1): : Restore object info NFileInfo(object%):SetInfo(dst$+fname$) : Set directory's metadata : - Restore into current (parent) directory M A%=0 63:thisdir%?A%=thisdir$,A%+1): : Restore current object info S A%=0 63:bitmap%?A% =bitmap$ ,A%+1): : Restore current dir. alloc bitmap Zcblk%=old_cblk%:RdBlocks(dir%,cblk%,D%,1) : Restore current directory block  : $CopyOneFile(src$,dst$): cblk% ("Copying ";src$;" to ";dst$;" "; )" A%=0 63 4:object%!A%=fptr%!A%: @,FileInfo(object%):file(dst$,5):X%!14=&33:A%=file(dst$,4) @6X%!2=load%:X%!6=exec%:X%!10=0:X%!14=length%:A%=file(dst$,7) *@length%:CopyData: Copy if length<>0 $JSetInfo(dst$):127;127;127: T: ^CopyData hout%=openout(dst$):P%=0: 5rReadData(P%):8;8;8;d(100*P%length%,2);"%"; .|num%=1024:P%+num%>length%:num%=length%-P% 5gbpb(2,out%,data%,num%,0):P%=P%+1024:P%>length% #out%:out%=0: : TSetInfo(dst$):X%!2=load%:X%!6=exec%:X%!10=length%:X%!14=attr%:A%=file(dst$,1) |A$=leaf$+11-leaf$," ")+h0(load%,8)+" "+h0(exec%,8)+" "+h0(length%,8)+13+10: +" "+FNh0(attr%,2)+" "+CHR$13+CHR$10 Oinf%:out%=(dst$+s$+"inf"): p%=1 A$:#out%,A$,p%,1)::#out%:out%=0 fs%<>5: @X%!8=cdate%:A%=NetFS_OpN(19,5,10,dst$) : Write create date 6X%!8=cdate%:X%!10=ctime%:X%!13=mdate%:X%!15=mtime% IA%=NetFS_OpN(19,64,18,dst$) : Write create&mod date&time 5A%=NetFS_Op(19,4+access%+dst$) : Write access >A%=NetFS_Op(0,"ACCOUNT "+dst$+" "+~acc%+" ("+~aux%+")")  : :  Object display routines & ======================= 0: ?:LstDir(cflg%):x%=0:csd%=-1:Mount:"Not an MDFS disk": !D cflg%=0 - CAT, cflg%=1 - EX !N "Path: :";title$;".";path$' 'Xptr%=32:cblk%=thisdir%!ptr% &FFFF NbRdBlocks(dir%,cblk%,D%,1) : Read first directory block Al A%=0 63 4:bitmap%!A%=dir%!A%: : Get occupied bitmap #vbit%=?bitmap% 2:fptr%=dir%+64  entry%=1 255 , (entry% 7)=0:bit%=bitmap%?(entry%8) j (entry% 15)=0:ptr%=ptr%+2:cblk%=thisdir%!ptr% &FFFF:cblk%:RdBlocks(dir%,cblk%,D%,1):fptr%=dir% $ (bit%1)<>0 ListFile(cflg%) 'bit%=bit%2:fptr%=fptr%+64: entry% (x%3):(cflg%1)=0:  : ListFile(cflg%) +FileInfo(fptr%):fname$;(11-fname$); E(cflg%1):h0(load%,8);" ";h0(exec%,8);" ";h0(length%,6);" "; attr(access%); F(cflg%1):date(cdate%);" ";date(mdate%);" ";time(mtime%);" "; 2(cflg%1):h0(acc%,3);" (";h0(aux%,3);")":  x%=x%+1:(x%3)=0: " ";   : *ݤattr(A%):A$="" 4(A%1):A$="r"+A$ >(A%2):A$="w"+A$ HA$="/"+A$ R(A%4):A$="R"+A$ \(A%8):A$="W"+A$ f(A%16):A$="L"+A$ p(A%32):A$="D"+A$ z(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),2) : .ݤtime(A%)=d0(A%255,2)+":"+d0(A%256,2) : : # Catalog manipulation routines # ============================= : ?ݤfind(A$):match$=uc(A$,10)):match%=0:csd%=-1:Mount:=0 'ptr%=32:cblk%=thisdir%!ptr% &FFFF N RdBlocks(data%,cblk%,D%,1) : Read first directory block A A%=0 63 4:bitmap%!A%=data%!A%: : Get occupied bitmap $ bit%=?bitmap% 2:fptr%=data%+64 $ entry%=1: ,. (entry% 7)=0:bit%=bitmap%?(entry%8) l8 (entry% 15)=0:ptr%=ptr%+2:cblk%=thisdir%!ptr% &FFFF:cblk%:RdBlocks(data%,cblk%,D%,1):fptr%=data% MB (bit%1)<>0 fptr%?11=13:fname$=$(fptr%+1):match%=(uc(fname$)=match$) 9L match%:bit%=bit%2:fptr%=fptr%+64:entry%=entry%+1 -V entry%>255 match%: match%:=fptr% =0 ` : j FileInfo(f%) t acc%=?f% -~ A%=f%?&B:f%?&B=13:fname$=$(f%+1):f%?&B=A%  load%=f%!&C:exec%=f%!&10  length%=f%!&14 &FFFFFF  access%=f%?&17 " cdate%=f%!&18 &FFFF:ctime%=0 / mdate%=f%!&1A &FFFF:mtime%=f%!&1C &FFFF  aux%=f%?&1E:vec%=f%?&1F 1 " acc%=acc% (f%?&1F &0E)*128 aux%=aux% (f%?&1F &70)*8 A attr%=(access%3)*16+(access%&C)/4+(access%16)/2+mdate%*256   :  :  Disk access routines  ====================  :  ݤMount "( res%=0:RdBlocks(data%,0,D%,1) N2 data%?&56=13:A$=$(data%+&40): A$<>valid$ res%=1:RdBlocks(data%,0,D%,1) F< data%?&56=13:A$=$(data%+&40): A$<>valid$ =-1: Not an MDFS disk MF A%=0 63 4:thisdir%!A%=data%!A%::path$="$":csd%=thisdir%!32 &FFFF =P data%?&61=13:title$=$(data%+&57):dsize%=data%!&62 &FFFF Z =0 d : 7n ReadData(ptr%): p%: vec%=(object%?&1F AND 1)<>0 Wx vec%=0:p%=32+(ptr%1024)*2:cblk%=object%!p% &FFFF:RdBlocks(data%,cblk%,D%,1): 3 p%=32+(ptr%(512*1024))*2 : Find 512K chunk 3 cblk%=object%!p% &FFFF : L3 block number 1 RdBlocks(alloc%,cblk%,D%,1): Fetch L3 block 6 p%=(ptr%(512*1024-1)) : Offset within 512K 1 p%=(p%1024)*2 : Find 1K block  cblk%=alloc%!p% &FFFF  RdBlocks(data%,cblk%,D%,1)   : 0 RdBlocks(addr%,block%,drive%,number%): p% D p%=0 number%-1:FDCrd(addr%+p%*1024,block%+res%+p%,drive%,1)  :  :  :  FDC routines  ============ " : %, FDCrd(ad%,sc%,dv%,nm%):dv%>1: 86 drv$<>"":in%=(drv$):in%=0:in%=(drv$+s$):in%=0: >@ drv$<>"":gbpb(3,in%,ad%,nm%*1024,sc%*1024):#in%:in%=0: J os%<6:FDCbbc: T os%=6:FDCarc: ^ os%=32:FDCdos: h "Unsupported": r : | FDCbbc:fs%<>8:*FX143,18,8 & trk%=sc%5:trk%=trk%2+80*(trk%1) # sc%=trk%*16+sc%5:A%=&72:try%=5 A :?X%=0:X%!1=ad%:X%?5=8:X%?8=sc%:X%?7=sc%256:X%?6=&80+dv%*32 7 X%!9=1:X%!11=0: OSWORD:try%=try%-1:?X%=0 try%=0 / ?X%:"Disk error &";~?X%" at ";dv%":";~sc%  fs%<>8:"FX143,18,"+fs%   : 9 FDCarc:trk%=sc%5:hd%=trk%1:trk%=trk%2:sec%=sc%5 L "XADFS_DiscOp",,1,((trk%*2+hd%)*5+sec%)*1024+0+(dv%<<29),ad%,1024 r%   :  FDCdos:"Unsupported":  :  : ) Translate leafname if saving to DOS )& =================================== 0 / \ ? < > become . ~ # { } : : !D ݤclean(A$): B%:os%<>32:=A$ N A%=1 A$ FX B%="/\?<>",A$,A%,1)):B%:A$=A$,A%-1)+".~#{}",B%+1,1)+A$,A%+1) b :=A$ l : v :  I/O routines  ============ % ݤh0(A%,N%):="00000000"+~A%,N%) $ ݤd(A%,N%):=" "+A%,N%) $ ݤd0(A%,N%):="00000000"+A%,N%)  ݤuc(A$):A$="":="" E A%=1A$:A$,A%,1)>"_":A$=A$,A%-1)+(A$,A%,1)&5F)+A$,A%+1) :=A$ 6 ݤfx(A%,X%): Y%:Y%=X%256:=(&FFF4 &FFFF00)256  :  File routines  ============= / ݤfs:os%<32: A%,Y%,E%:=(&FFDA)&FF =29 , gbpb(A%,chn%,addr%,num%,ptr%):?X%=chn% 4 X%!1=addr%:X%!5=num%:X%!9=ptr%:os%<32: &FFD1:  A%=1A%=3:#?X%=X%!9 5 :A%=1A%=2:#?X%,?X%!1 A%=3A%=4:?X%!1=#?X% .* X%!1=X%!1+1:X%!5=X%!5-1: #?X% X%!5<1: 4 : '> cdir(A$):os%=32:A%=file(A$,8): H file(A$,5)=0:"CDIR "+A$ R J\ ݤfile(A$,A%):$name%=A$:?X%=name%:X%?1=name%256:os%<32:=(&FFDD)&FF f A$,".")=0:A$=A$+"." ,p A%=7:"SAVE "+A$+" "+~+"+"+~X%!10:=1 =z A%=5:X%!2=(A$):X%!2:X%!10=#X%!2:#X%!2:=1 A%=5:=0 A%=8 :=2  "MKDIR "+A$:=2   =0 / ݤopenout(A$):os%=32:A$,".")=0:A$=A$+"." =(A$)  :  :  NetFS Operations  ================ : ݤNetFS_Op(A%,A$):O%,T%:X%!1=8+ A$:O%=X%+7-3*(os%=6) a ݤNetFS_OpN(A%,T%,O%,A$):X%!1=O%+1+A$:X%?7=T%:O%=X%+O%:os%=6:T%=X%+4O%:?T%=T%?3::O%=O%-3 n?X%=0:X%?3=A%:$O%=A$:os%<>6:A%=&14:&FFF1 "XNetFS_DoFSOp",X%?3,X%+4,X%?1,128 A%:X%?3=0:A%:X%?3=?A% =X%?3