> 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: ^ com%=0: h/B$=com$,com%*4+1,4):B$=B$,A$+" "," ")-1) r1com%=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 b3cblk%=find(A$):cblk%=0:"'"A$"' not found":=0 l5(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 4Nsrc$=A$,A$+" "," ")-1):ptr%=find(src$):ptr%=0:"'"src$"' not found":= >( A%=0 63 4:object%!A%=ptr%!A%: H+ln%=object%!&14 &FFFFFF:p%=32:last%=0 R6 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) 8_src$="$":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 <: F?CopyObject: ptr%,bit%,old_cblk%,thisdir$,bitmap$,object$ P7FileInfo(fptr%):leaf$=fname$:fname$=clean(fname$) Z7(access%&20)=0:CopyOneFile(fname$,dst$+fname$): d: n Descend into directory x:old_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 0 T$SetInfo(dst$):127;127;127: ^: hCopyData rout%=openout(dst$):P%=0: |5ReadData(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 ======================= :: D?LstDir(cflg%):x%=0:csd%=-1:Mount:"Not an MDFS disk": N! cflg%=0 - CAT, cflg%=1 - EX X! "Path: :";title$;".";path$' b'ptr%=32:cblk%=thisdir%!ptr% &FFFF lNRdBlocks(dir%,cblk%,D%,1) : Read first directory block vA 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$ R A$="/"+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 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: 8, (entry% 7)=0:bit%=bitmap%?(entry%8) Bl (entry% 15)=0:ptr%=ptr%+2:cblk%=thisdir%!ptr% &FFFF:cblk%:RdBlocks(data%,cblk%,D%,1):fptr%=data% LM (bit%1)<>0 fptr%?11=13:fname$=$(fptr%+1):match%=(uc(fname$)=match$) V9 match%:bit%=bit%2:fptr%=fptr%+64:entry%=entry%+1 `-entry%>255 match%: match%:=fptr% =0 j: tFileInfo(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 Aattr%=(access%3)*16+(access%&C)/4+(access%16)/2+mdate%*256  : :  Disk access routines  ==================== : ( ݤMount 2"res%=0:RdBlocks(data%,0,D%,1) valid$ res%=1:RdBlocks(data%,0,D%,1) FFdata%?&56=13:A$=$(data%+&40): A$<>valid$ =-1: Not an MDFS disk PM 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: x7ReadData(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): 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% A p%=0 number%-1:FDCrd(addr%+p%*1024,block%+res%,drive%,1) : : :  FDC routines " ============ ,: 6%FDCrd(ad%,sc%,dv%,nm%):dv%>1: @8drv$<>"":in%=(drv$):in%=0:in%=(drv$+s$):in%=0: J>drv$<>"":gbpb(3,in%,ad%,nm%*1024,sc%*1024):#in%:in%=0: Tos%<6:FDCbbc: ^os%=6:FDCarc: hos%=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 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: N!ݤclean(A$): B%:os%<>32:=A$ X A%=1 A$ bFB%="/\?<>",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$="":="" 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%,?X%,addr%,num%,ptr%) 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% 4.X%!1=X%!1+1:X%!5=X%!5-1: #?X% X%!5<1: >: H'cdir(A$):os%=32:A%=file(A$,8): Rfile(A$,5)=0:"CDIR "+A$ \ fJݤfile(A$,A%):$name%=A$:?X%=name%:X%?1=name%256:os%<32:=(&FFDD)&FF pA$,".")=0:A$=A$+"." z,A%=7:"SAVE "+A$+" "+~+"+"+~X%!10:=1 =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