> 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 28 27-Apr-2007 v0.13 Bugfix to gbpb() and CopyOneFile <: FQos%=fx(0,1)&FF:arc%=os%=6 >&8000:8:A%=:9,11:A%<80:&80:>&4000:&80 Pos%<32:arc%:=fx(132,0) Z9init:"SJFiler v"ver$" by J.G.Harston"': err: d:X%=ctrl%:Y%=X%256 n.drv$="":(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) T2 A$=1 "0123",A$):drv$="":D%=A$:csd%=-1: ^8com%=0::B$=com$,com%*4+1,4):B$=B$,B$+" "," ")-1) h1com%=com%+1:uc(A$,B$))=B$ com%*4>=com$ r'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 : &ݤ_CAT(A$):LstDir(0):=0 0: :ݤ_EX(A$):LstDir(1):=0 D: N$ݤ_DIR(A$): A$="$":A%=Mount:=0 X3cblk%=find(A$):cblk%=0:"'"A$"' not found":=0 b5(fptr%?&17 &20)=0:"'"A$"' not a directory":=0 l* A%=0 63 4:thisdir%!A%=cblk%!A%: v7path$=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 *Nsrc$=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 H6 P%=0 ln%-1:(P%&3FF)=0:ReadData(P%):O%=data% R:Q%=?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 VN((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: 0 J$SetInfo(dst$):127;127;127: T: ^CopyData hout%=openout(dst$):P%=0: r5ReadData(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$' X'ptr%=32:cblk%=thisdir%!ptr% &FFFF bNRdBlocks(dir%,cblk%,D%,1) : Read first directory block lA A%=0 63 4:bitmap%!A%=dir%!A%: : Get occupied bitmap v#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: " ";   : *ݤattr(A%):A$="" 4(A%1):A$="r"+A$ >(A%2):A$="w"+A$ H A$="/"+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 NRdBlocks(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) 8l (entry% 15)=0:ptr%=ptr%+2:cblk%=thisdir%!ptr% &FFFF:cblk%:RdBlocks(data%,cblk%,D%,1):fptr%=data% BM (bit%1)<>0 fptr%?11=13:fname$=$(fptr%+1):match%=(uc(fname$)=match$) L9 match%:bit%=bit%2:fptr%=fptr%+64:entry%=entry%+1 V-entry%>255 match%: match%:=fptr% =0 `: jFileInfo(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 Aattr%=(access%3)*16+(access%&C)/4+(access%16)/2+mdate%*256  : :  Disk access routines  ==================== :  ݤMount ("res%=0:RdBlocks(data%,0,D%,1) 2Ndata%?&56=13:A$=$(data%+&40): A$<>valid$ res%=1:RdBlocks(data%,0,D%,1) valid$ =-1: Not an MDFS disk FM 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: n7ReadData(ptr%): p%: vec%=(object%?&1F AND 1)<>0 xW vec%=0:p%=32+(ptr%1024)*2:cblk%=object%!p% &FFFF:RdBlocks(data%,cblk%,D%,1): 3p%=32+(ptr%(512*1024))*2 : Find 512K chunk 3cblk%=object%!p% &FFFF : L3 block number 1RdBlocks(alloc%,cblk%,D%,1): Fetch L3 block 6p%=(ptr%(512*1024-1)) : Offset within 512K 1p%=(p%1024)*2 : Find 1K block cblk%=alloc%!p% &FFFF RdBlocks(data%,cblk%,D%,1)  : 0RdBlocks(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: 68drv$<>"":in%=(drv$):in%=0:in%=(drv$+s$):in%=0: @>drv$<>"":gbpb(3,in%,ad%,nm%*1024,sc%*1024):#in%:in%=0: Jos%<6:FDCbbc: Tos%=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 7X%!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%  : 9FDCarc:trk%=sc%5:hd%=trk%1:trk%=trk%2:sec%=sc%5 Mș "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$ XFB%="/\?<>",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$="":="" EA%=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% 4X%!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): Hfile(A$,5)=0:"CDIR "+A$ R \Jݤfile(A$,A%):$name%=A$:?X%=name%:X%?1=name%256:os%<32:=(&FFDD)&FF fA$,".")=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 o?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