> 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: ^com%=0: /hB$=com$,com%*4+1,4):B$=B$,A$+" "," ")-1) 1rcom%=com%+1:uc(A$,B$))=B$ com%*4>=com$ '|uc(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 &: 0ݤ_CAT(A$):LstDir(0):=0 :: Dݤ_EX(A$):LstDir(1):=0 N: $Xݤ_DIR(A$): A$="$":A%=Mount:=0 3bcblk%=find(A$):cblk%=0:"'"A$"' not found":=0 5l(fptr%?&17 &20)=0:"'"A$"' not a directory":=0 *v A%=0 63 4:thisdir%!A%=cblk%!A%: 7path$=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 N4src$=A$,A$+" "," ")-1):ptr%=find(src$):ptr%=0:"'"src$"' not found":= (> A%=0 63 4:object%!A%=ptr%!A%: +Hln%=object%!&14 &FFFFFF:p%=32:last%=0 6R P%=0 ln%-1:(P%&3FF)=0:ReadData(P%):O%=data% :\Q%=?O%msk%:msk%=255:Q% Q%=10 Q%=13 Q%>31 Q% 'f(Q%=10 Q%=13) Q%<>last%:23-Q% pQ%=9:(8-( 8)); zlast%=?O%:O%=O%+1::: =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) _8src$="$":cblk%=Mount:cblk%=thisdir% cblk%=find(src$):cblk%=0:"'"src$"' not found":=0 )B A%=0 63 4:object%!A%=cblk%!A%: ,L If src=directory, copy all recursively #V if src=file, copy single file N`((object%?&17)&20)=0:fptr%=object%:leaf$=src$:CopyOneFile(src$,dst$):=0 j dst$<>"":cdir(dst$) t dst$<>"":dst$=dst$+d$ ~CopyDirectory(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 <: ?FCopyObject: ptr%,bit%,old_cblk%,thisdir$,bitmap$,object$ 7PFileInfo(fptr%):leaf$=fname$:fname$=clean(fname$) 7Z(access%&20)=0:CopyOneFile(fname$,dst$+fname$): d: n Descend into directory :xold_cblk%=cblk% : Save current directory block number L 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%: @6FileInfo(object%):file(dst$,5):X%!14=&33:A%=file(dst$,4) @@X%!2=load%:X%!6=exec%:X%!10=0:X%!14=length%:A%=file(dst$,7) *Jlength%:CopyData: Copy if length<>0 $TSetInfo(dst$):127;127;127: ^: hCopyData rout%=openout(dst$):P%=0: 5|ReadData(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 ======================= :: ?DLstDir(cflg%):x%=0:csd%=-1:Mount:"Not an MDFS disk": !N cflg%=0 - CAT, cflg%=1 - EX !X "Path: :";title$;".";path$' 'bptr%=32:cblk%=thisdir%!ptr% &FFFF NlRdBlocks(dir%,cblk%,D%,1) : Read first directory block Av 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) 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: " ";   *: 4ݤattr(A%):A$="" >(A%1):A$="r"+A$ H(A%2):A$="w"+A$ RA$="/"+A$ \(A%4):A$="R"+A$ f(A%8):A$="W"+A$ p(A%16):A$="L"+A$ z(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),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: ,8 (entry% 7)=0:bit%=bitmap%?(entry%8) lB (entry% 15)=0:ptr%=ptr%+2:cblk%=thisdir%!ptr% &FFFF:cblk%:RdBlocks(data%,cblk%,D%,1):fptr%=data% ML (bit%1)<>0 fptr%?11=13:fname$=$(fptr%+1):match%=(uc(fname$)=match$) 9V match%:bit%=bit%2:fptr%=fptr%+64:entry%=entry%+1 -` entry%>255 match%: match%:=fptr% =0 j : t FileInfo(f%) ~ 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 "2 res%=0:RdBlocks(data%,0,D%,1) N< data%?&56=13:A$=$(data%+&40): A$<>valid$ res%=1:RdBlocks(data%,0,D%,1) FF data%?&56=13:A$=$(data%+&40): A$<>valid$ =-1: Not an MDFS disk MP A%=0 63 4:thisdir%!A%=data%!A%::path$="$":csd%=thisdir%!32 &FFFF =Z data%?&61=13:title$=$(data%+&57):dsize%=data%!&62 &FFFF d =0 n : 7x ReadData(ptr%): p%: vec%=(object%?&1F AND 1)<>0 W 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% A p%=0 number%-1:FDCrd(addr%+p%*1024,block%+res%,drive%,1)  :  :  :  FDC routines " ============ , : %6 FDCrd(ad%,sc%,dv%,nm%):dv%>1: 8@ drv$<>"":in%=(drv$):in%=0:in%=(drv$+s$):in%=0: >J drv$<>"":gbpb(3,in%,ad%,nm%*1024,sc%*1024):#in%:in%=0: T os%<6:FDCbbc: ^ os%=6:FDCarc: h os%=32:FDCdos: r "Unsupported": | : 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 : !N ݤclean(A$): B%:os%<>32:=A$ X A%=1 A$ Fb B%="/\?<>",A$,A%,1)):B%:A$=A$,A%-1)+".~#{}",B%+1,1)+A$,A%+1) l :=A$ 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:A%,X%,Y%:os%<32:=(&FFDA)&FF =29 : gbpb(A%,ch%,X%!1,X%!5,X%!9):?X%=ch%:os%<32:&FFD1:  (A%1):#?X%=X%!9 @ A%=1 A%=2:#?X%,?X%!1:X%!1=X%!1+1:X%!5=X%!5-1: X%!5<1: H* A%=3 A%=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  ================  : 2 ݤNetFS_Op(A%,A$):!X%=0:X%?1=8+ A$:$(X%+7)=A$ DݤNetFS_OpN(A%,T%,O%,A$):!X%=0:X%?1=O%+1+A$:X%?7=T%:$(X%+O%)=A$ HX%!3=A%:os%<6:A%=&14:&FFF1 "XNetFS_DoFSOp",X%?3,X%+7,X%?1,X%?1 =X%?3