> USBFiler 1.31 8 24-Nov-2009 v0.10 Initial version based on SJFiler < 18-Nov-2010 v0.11 Uses fast machine code data transfer (? 05-Apr-2018 v1.30 Bring all Filers to same version number 21 31-Mar-2020 v1.31 Optimised Syntax checking <: FRos%=fx(0,1)&FF:os%<6:fx(130,0)=&FFFF "Must run on BBC I/O processor": P:10,8:A%=:13:A%<50:&87:>&7C00:&83:>&4000:&80 Z <&FFFF:=fx(132,0) d:init:"USBFiler v"ver$" by J.G.Harston"': err: n2:X%=ctrl%:Y%=X%256:D%=37:path$="":path$="\" x+drv$="":(D%+48)"> "; "["drv$"] "; ""A$:do(s(A$)) 0 : init:ver$="1.31" B ctrl% 127,name% 255,result% 63,data% &1FF:X%=ctrl%:Y%=X%256 2 fn$(255):D%=0:drv$="":path$="\":title$="USB" /fs%=fs:d$=".":s$="/":os%=32:d$="\":s$="." 5cmd$=":DIR:CD:TYPE:DUMP:COPY:INFO:BYE:HELP:QUIT:" Nhlp$="::: [CTRLS]: [7BIT]: :::::" $usb_Init:usb_Sync:usb_Flush: : ݤerr:"FX229"::usb_Flush 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" 6 A$,1)=";" A$="": @ A$,1)="*" A$: J! A$,1)="." A$="CAT "+A$,2) T6A%=A$+" "," "):B$=uc(A$,A%-1)):A$=s(A$,A%+1)) ^2 B$=1 "0123",B$):drv$="":D%=B$:csd%=-1: h0A%=cmd$,":"+B$+":"): A%=0:"Bad command": rA%=("FN_"+B$+"(A$)"): |: 1ݤsyn(S$): A$="": "Syntax: "B$" "S$:= = :  Commands  ======== : $ݤ_QUIT(A$):"Quit":A%=_BYE("")   os%>5:*QUIT  : ݤ_HELP(A$):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 : ݤ_DIR(A$):LstDir(0):=0 &ݤ_EX(A$):LstDir(1):=0 0: :ݤ_CD(A$):A$=".":=0 D":":path$="\":=0 N0A$=cl("",0):usb_Cmd("CD "+A$):usb_Err:= X#A$<>"..":path$=path$+A$+"\":=0 b1path$=path$,path$-1):"\"+path$,1)="\":=0 l: v?ݤ_DUMP(A$): ln%,p%,ptr%,cols%:cols%=16: syn(""):= AA$=cl("",0):usb_Sync:ln%=usb_Size(A$):ln%=0 usb_Err:= usb_WrStr("RD "+A$+13)  P%=0 ln%-1 cols%:B$="" :h0(P%,6)" ";:(P%&1FF)=0:ReadData(P%,ln%):O%=data%  Q%=P% P%+cols%-1 * Q%=" " A$<="~" B$=B$+A$ B$=B$+"." O%=O%+1:: B$: =0 : 0ݤ_TYPE(A$): ln%,p%,ptr%: syn(""):= )msk%=A$," [")<>0:msk%=(msk%&80)&7F 9A$=cl("",0):usb_Sync:ln%=usb_Size(A$):usb_Err:= usb_WrStr("RD "+A$+13)  Blast%=0: P%=0 ln%-1:(P%&1FF)=0:ReadData(P%,ln%):O%=data% :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)); 4last%=?O%:O%=O%+1::: >=0 H: R"ݤ_INFO(A$): syn(""):= \BA$=cl("",0):usb_Sync:A%=usb_Info(A$):X%!10=0 usb_Err:= f:A$;(15-A$);h0(X%!2,8)" "h0(X%!6,8)" "h0(X%!10,8) p=0 z: 6ݤ_BYE(A$):usb_Cmd("SUD"):usb_Sync:usb_Flush:=0 : 0ݤ_COPY(A$): syn(" "):= !src$=cl("",0):dst$=cl("",0) 8uc(dst$,4))="USB:":dst$=dst$,5):CopyBBCtoUSB:=0 'uc(src$,4))="USB:":src$=src$,5) 9dst$,"::")dst$,1)="-":"FS prefix unsupported":= CopyUSBtoBBC:=0 : G COPY USB: - copies all from current USB directory D COPY USB:\ - copies all from USB root directory E COPY USB: - copies all from USB directory T COPY USB: - copies all from USB to BBC current directory : 1CopyUSBtoBBC:src$="\":A%=_CD("\"):src$="" :src$<>"":usb_Info(src$)=1:CopyOneFile(src$,dst$): $src$<>"":_CD(src$): .&dst$<>"":cdir(dst$):dst$=dst$+d$ 8CopyDirectory(dst$) B L: V1CopyBBCtoUSB:"BBCtoUSB: not implemented": `: j: t File copying code ~ ================= : 6CopyDirectory(dst$): fn%,n%:usb_RdDir:fn%<2: " n%=0 fn%-2:CopyObject:: : @CopyObject:leaf$=fn$(n%):leaf$=". DIR" leaf$=".. DIR": fname$=undos(leaf$),10) YA%=leaf$," "):A%=0:A%=_INFO(leaf$):11;42,9);:CopyOneFile(leaf$,dst$+fname$): +leaf$=leaf$,A%-1):fname$=fname$,A%-1) 0file(dst$+fname$,5)=0:"CDir "+dst$+fname$ ?A%=_CD(leaf$):CopyDirectory(dst$+fname$+d$):A%=_CD("..") usb_RdDir: : CopyOneFile(src$,dst$)  dst$="":" missing": $"Copying "src$" to "dst$" "; /load%=X%!2:exec%=X%!6:ln%=X%!10:attr%=X%!14 (-file(dst$,5):X%!14=&33:A%=file(dst$,4) 20 FSetInfo(dst$):3,127): P: ZCopyData d(usb_Sync:usb_WrStr("RD "+src$+13) nout%=(dst$):P%=0: x>ReadData(P%,ln%):(P%1023)=0:3,8)d(100*P%ln%,2)"%"; %num%=512:P%+num%>ln%:num%=ln%-P% 0gbpb(2,out%,data%,num%,0):P%=P%+512:P%>ln% #out%:out%=0: : PSetInfo(dst$):X%!2=load%:X%!6=exec%:X%!10=ln%:X%!14=attr%:A%=file(dst$,1)  : :  Object display routines  ======================= : 1LstDir(cflg%): cflg%=0 - CAT, cflg%=1 - EX  "Path: "title$":"path$' )usb_Sync:usb_Cmd("DIR"):usb_Err: x%=0:(?usbS 128)=0 +A%=?usbD: A%=13 (20-( 20)); A% "A%=":":x%=1 ,"A%=13 x%=1:20,127);:: 6 @: JReadData(ptr%,ext%): p% T!ptr%+512<=ext%: usbRdData: ^3:data%?p%=usbRd:p%=p%+1:ptr%+p%>=ext%p%>511 h'p%<512:data%?p%=0:p%=p%+1:p%>511 r |: :  USB access routines  =================== : )usb_Sync:A%=?usbD:(?usbS 128): :  usb_Flush:(?usbS 128): 0'"Flushing USB";::A%=?usbD:(?usbS 128) #A%=+20:>A%:(?usbS 128): : Jݤusb_Err:?result%=13 result%?1=":":=0 "USB Error: "$result%:= : 1usb_Cmd(A$):usb_WrStr(A$+13):usb_RdStr: : 6ݤusb_Size(A$):usb_Cmd("IPH"):usb_Cmd("DIR "+A$) (?usbS 128)=0 &@A%=result%-1:A%=A%+1:?A%=?usbD:(?usbS 128):A%?-1<>62:=0 0-A%=$result%," "):?result%=13:=result%!A% :: DFݤusb_Info(A$): L%,X$:X%!2=0:X%!6=0:X%!14=&33:X%!10=usb_Size(A$) NA$,".") ?result%<>13:=1 XAL%=usb_Size(A$+".INF"):L%>512 ?result%<>13:?result%=13:=1 b#usb_WrStr("RD "+A$+".INF"+13) l6ReadData(0,L%):data%?L%=13:A$=$data%:X$=cl("",0) v1X$=cl("",0):X$<>"":X%!2=("&"+X$):X%!6=X%!2 'X$=cl("",0):X$<>"":X%!6=("&"+X$) =1 : ;usb_RdDir:fn%=0:usb_Sync:usb_Cmd("DIR"):usb_Err: <:usb_RdStr:fn$(fn%)=$result%:fn%=fn%+1:(?usbS 128) #A%=+20:>A%:(?usbS 128): : 2usb_WrStr(A$): A%=1 A$:(?usbS 64)=0 ?usbD=A$,A%,1):: : ;usb_RdStr:A%=result%-1:A%=A%+1:?A%=usb_Rd:?A%=13: : %ݤusb_Rd:(?usbS 128)=0:=?usbD :  usb_Init 3usbD=&FCF8:usbS=&FCF9:OSASCI=&FFE3:OSBPUT=&FFD4  & mc% 39: P=0 1:P%=mc%:[OPT P*2 *F.usbRdData:LDX #0:.usbRdLp1:JSR usbRd:STA data%,X:INX:BNE usbRdLp1 4<.usbRdLp2:JSR usbRd:STA data%+256,X:INX:BNE usbRdLp2:RTS >0.usbRd:BIT usbS:BPL usbRd2:BIT &FF:BPL usbRd H.usbRd2:LDA usbD:RTS:] R \: f: p- Translate leafname if not saving to DOS z- ======================================= ( $ ^ # . \ ~ @ become < > ? / . \ = %ݤfn_undos(A$):B%:(os%-32):=A$ SA%=1 A$:B%="#$^&@%~",A$,A%,1)):B%:A$=A$,A%-1)+"?<>+=;\",B%,1)+A$,A%+1)  :=A$ : :  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 . ============= 8!ݤfs: A%,Y%,E%:=(&FFDA)&FF B,gbpb(A%,chn%,addr%,num%,ptr%):?X%=chn% L,X%!1=addr%:X%!5=num%:X%!9=ptr%: &FFD1: V)cdir(A$):file(A$,5)=0:"CDIR "+A$ ` jBݤfile(A$,A%):$name%=A$:?X%=name%:X%?1=name%256:=(&FFDD)&FF t: ~:  Command Line Parsing  ~~~~~~~~~~~~~~~~~~~~ cݤcl(l$,n%):l$="":A$=s(A$):A$=34:A%=A$+" "" ",""" ",2):l$=A$,2,A%-2):A$=s(A$,A%+1)):=l$ "":A%=A$,l$):A%:A$=s(A$,A%-1)+A$,A$," ",A%)+1)):= n%=0:l$<>"":= %A%=" ",l$=32)+A$,l$):A%=0:="" 'A$=A$,A%-1)+s(A$,A$," ",A%)+1)) (Cl$=32:l$=A$,A%):A$=A$,A%-1):=l$,1-(l$=34),l$+2*(l$=34)) 2PA$,A%,1)<>34:l$=A$,A%,A$+" "," ",A%)-A%):A$=A$,A%-1)+A$,A%+l$+1):=l$ " " P+A$,1)=" ":A$=A$,A$-1):A$,1)<>" " Z=A$