> TubeHost $ Simple Serial Tube Host System 4 v0.26 - Added client/host filename conversion (& v0.27 - Configurable .inf usage 2( v0.27a - "" is a wildcard filename <: F: P&A%=0:X%=1:os%=((&FFF4)&FF00)256 Z"_baud$="19200" : Default baud d#_debug$="0" : Default debug n+_PFX$="127" : Default escape prefix x4_RST$="0" : Send reset sequence on startup $_INF$="1" : Use .inf files : u ctrl0% 131,string% 255,escflg% 0:ctrl%=ctrl0%+2:ch%=0:in%=0:out%=0:ser%=0:serout%=0:serin%=0:fn$="":ver$="0.27" Cclient%=0:host%=2*(os%32)+4*(os%8): :close::exit():Ș mChoices_Init("J.G.Harston","TubeHost"):speed%=_baud$:dbg%=_debug$:_PFX%=_PFX$:_INF%=_INF$:inf%=_INF% ="Tube Host v";ver$;" at ";speed%:tmp$="." Kf_init:os%=32:ș "SetWindowText",@hwnd%,"Tube Host v"+ver$:tmp$=@tmp$ 1 report:_ERROR:close: err:exit():Ș Equit%=:open:"Couldn't open serial port":A%=(100):exit(-1): '_RST$:_RESET:_RST$="0":SerFlush , REPEAT:PRINTFNc(FNRdByte);:UNTIL quit% : RdByte: quit% close:exit(0) Ș : : " ݤopen ,fos%=32:serin%=("COM1: baud="+speed%+" parity=N data=8 stop=1 octs=on"):serout%=serin%:=serin%=0 61A%=speed%:A%>63:A%=(A%75)/2:A%<4:A%=A%+1 @""FX7,"+A%:"FX8,"+A%:*FX2,2 JGos%=6:serin%="Serial:":serout%="Serial:":=(serin%=0)(serout%=0) T=0 ^: h close rch% :A%=ch% :ch%=0 :#A% |in% :A%=in% :in%=0 :#A% out%:A%=out%:out%=0:#A% serout%=serin%:serout%=0 (serout%:A%=serout%:serout%=0:#A%: (serin% :A%=serin% :serin%=0 :#A%: *FX2  :  ݤerr (=-1 (<128 <>17 <>28 -1) : report:dbg%=0: os%=32:*OUTPUT 0 -:" at line "+Þ,<128 <>17 <>28)  : exit(A%) &) os%=32 Ș A% "FX1,"+(A%255):Ș 0 :: D#ݤd0(A%,N%)="00000000"+A%,N%) N#ݤh0(A%,N%)="0000000"+~A%,N%) X1ݤc(A%):A%=A%127:A%<32 A%=127:="." =A% b: l: v Inward  x VDU x ! esc,esc VDU esc = esc,n MOS function, control block follows  : :  OS_RDCH  ======= " Tube data &00 -- Carry Char 0ݤ_0 :dbg%2:"OS_RDCH "; EscOff:A%=:EscOn 7WrByte((A%=27)&80) :dbg%2:"-- "h0(&00,2)" "; .WrByte(A%) :dbg%2:h0(A%,2) =0  : :  OS_CLI * ====== 4- Tube data &02 string &0D -- &7F or &80 >,ݤ_2 :dbg%:"OS_CLI "; H-RdString :dbg%:$string%" "; RY%=string%:A%=mos_cli \. A%>=0:WrByte(A%) :dbg%:"-- "h0(A%,2) f=0 p: z:  SHORT_BYTE  ==========  Tube data &04 X A -- X %ݤ_4 :dbg%:"OS_BYTE "; )X%=RdByte :dbg%:h0(X%,2)" "; )A%=RdByte :dbg%:h0(A%,2)" "; A%=mos_byte (WrByte(X%) :dbg%:"-- "h0(X%,2) =0 :  LONG_BYTE  ========= $ Tube data &06 X Y A -- Cy Y X %ݤ_6 :dbg%:"OS_BYTE "; )X%=RdByte :dbg%:h0(X%,2)" "; )Y%=RdByte :dbg%:h0(Y%,2)" "; $)A%=RdByte :dbg%:h0(A%,2)" "; .A%=mos_byte 84 A%<0:=0 : Reply already sent, eg *FX142 B5WrByte((A%&100)2) :dbg%:"-- "h0(A%2,2)" "; L2WrByte(Y%) :dbg%:h0(Y%,2)" "; V.WrByte(X%) :dbg%:h0(X%,2) `=0 j: t: ~ OS_WORD  ======= 4 Tube data &08 A in_len block out_len -- block *ݤ_8 :dbg%:"OS_WORD "; .A%=RdByte :dbg%:h0(A%,2)" "; 2inlen%=RdByte :dbg%:h0(inlen%,2)" "; HRdBlock(inlen%) :dbg%:inlen%:D%=0inlen%-1:h0(ctrl%?D%,2);: 3outlen%=RdByte :dbg%:h0(outlen%,2)" "; #X%=ctrl%:Y%=X%256:A%=mos_word RWrBlock(outlen%) :dbg%:"-- ";:outlen%:D%=0outlen%-1:h0(ctrl%?D%,2);: ": :dbg%: =0 : :   OS_RDLINE  ========= 3 Tube data &0A block -- &FF or &7F string &0D (,ݤ_A :dbg%2:"OS_RDLN "; 2fRdBlock(5) :dbg%2:h0(ctrl%!0,4)" "h0(ctrl%?2,2)" "h0(ctrl%?3,2)" "h0(ctrl%?4,2)" "; <)X%=ctrl%:Y%=string%:A%=0:A%=mos_word F/(A%&100) :dbg%2:"-- "h0(&80,2) P(A%&100):WrByte(&80):=0 Z4WrByte(&7F) :dbg%2:"-- "h0(&7F,2)" "; d)WrString :dbg%2:$string% n=0 x: :  OS_ARGS  ======= : Tube data &0C handle block function -- result block *ݤ_C :dbg%:"OS_ARGS "; .X%=ctrl%:Y%=RdByte :dbg%:h0(Y%,2)" "; .RdBlock(4) :dbg%:h0(!X%,8);" "; .A%=RdByte :dbg%:h0(A%,2)" "; Y%=Y%&7F:A%=mos_args 1WrByte(A%) :dbg%:"-- "h0(A%,2)" "; )WrBlock(4) :dbg%:h0(!X%,8) =0 : :  OS_BGET  ======= ") Tube data &0E handle -- Carry byte ,,ݤ_E :dbg%1:"OS_BGET "; 60Y%=RdByte :dbg%1:h0(Y%,2)" "; @Y%=Y%&7F:A%=mos_bget J=WrByte((A%&100)2):dbg%1:"-- "h0((A%&100)2,2)" "; T*WrByte(A%) :dbg%1:h0(A%,2) ^=0 h: r: | OS_BPUT  ======= ' Tube data &10 handle byte -- &7F ,ݤ_10 :dbg%1:"OS_BPUT "; 0Y%=RdByte :dbg%1:h0(Y%,2)" "; 0A%=RdByte :dbg%1:h0(A%,2)" "; Y%=Y%&7F:A%=mos_bput 0WrByte(&7F) :dbg%1:"-- "h0(&7F,2) =0 : :  OS_FIND  ======= 2 Tube data &12 function string &0D -- handle & &12 &00 handle -- &7F *ݤ_12 :dbg%:"OS_FIND "; .A%=RdByte :dbg%:h0(A%,2)" "; & A%=0 0,Y%=RdByte :dbg%:h0(Y%,2)" "; :KY%=Y%&7F:A%=mos_find: Y%=0 Y%=serin%:A%=open: Reopen serial port D,WrByte(&7F) :dbg%:"-- "h0(&7F,2) N=0 X b+RdString :dbg%:$string%" "; l3Y%=string%-1:Y%=Y%+1:?Y%<33:?Y%=13:Y%=string% vNwildcardsNull:=0 : BB4W throws up a dialogue box with wildcards and "" &$Y%=fn_convert($Y%,client%,host%)  Y%=mos_find:Y%:Y%=Y% &80 -WrByte(Y%) :dbg%:"-- "h0(Y%,2) =0 : :  OS_FILE  ======= ? Tube data &14 block string function -- result block *ݤ_14 :dbg%:"OS_FILE "; DRdBlock(16) :dbg%: D%=0 12 4:h0(ctrl%!D%,8)" ";: ,RdString :dbg%:$string%;" "; .A%=RdByte :dbg%:h0(A%,2)" "; 3Y%=string%-1:Y%=Y%+1:?Y%<33:?Y%=13:Y%=string%  NwildcardsNull:=0 : BB4W throws up a dialogue box with wildcards and "" .fn$=$Y%:$Y%=fn_convert($Y%,client%,host%)  X%=ctrl%-2:A%=mos_file *.WrByte(A%) :dbg%:"-- "h0(A%,2); 4FWrBlock(16) :dbg%: D%=0 12 4:" "h0(ctrl%!D%,8);:: >=0 H: R: \ OS_GBPB f ======= p9 Tube data &16 block function -- block Carry result z*ݤ_16 :dbg%:"OS_GBPB "; VRdBlock(13) :dbg%:h0(?ctrl%,2)" ";: D%=1 9 4:h0(ctrl%!D%,8)" ";: .A%=RdByte :dbg%:h0(A%,2)" "; X%=ctrl%:?X%=?X%&7F A%=mos_gbpb `WrBlock(13) :dbg%:"-- "h0(?ctrl%,2)" ";: D%=1 9 4:h0(ctrl%!D%,8)" ";: 6WrByte((A%&100)2):dbg%:h0((A%&100)2,2)" "; -WrByte(A%) :dbg%:h0(A%,2) =0 : :  OS_FSC  ====== % Tube data &18 X Y A -- &FF Y X B -- &7F then string &0D -- &7F/&40/&80 +ݤ_18 :dbg%:"OS_FSC "; /X%=RdByte :dbg%:h0(X%,2)" "; $/Y%=RdByte :dbg%:h0(Y%,2)" "; ./A%=RdByte :dbg%:h0(A%,2)" "; 8Cdbg%:"OPTEOF*/ CMDRUNCATNEWHNDWRNEX INFRUNREN",A%*3+1,3)" "; B: L* A%>127 A%<2 A%=6 A%=7 A%=8 VA%=1:Y%=Y%127 : =EOF `A%=mos_fsc j1WrByte(&FF) :dbg%:"-- "h0(&FF,2)" "; t+WrByte(Y%) :dbg%:h0(Y%,2)" "; ~'WrByte(X%) :dbg%:h0(X%,2) =0  3WrByte(&7F) :dbg%:"-- "h0(&7F,2)" "; ,RdString :dbg%:$string%" "; Y%=string%:A%=mos_fsc ( A%>=0:WrByte(A%):dbg%:h0(A%,2) =0 : :  Null routines  ============= ݤ_1A=0 ݤ_1C=0 : L OS_RESYNC - Called within error handler to allow Host to resynchronise  ========= ( Tube data &1E -- &00 2+ݤ_1E :dbg%:"OS_SYNC "; 17 <>28)+$+" ("+Þ+")",<128 <>17 <>28)+0 xGWrCmd(&00) :dbg%:"ERROR "h0(_PFX%,2)" "h0(&00,2)" "; 0A%=: =28:A%=253:$string%="Bad address"+0 ,WrByte(A%) :dbg%:h0(A%,2)" "; B%=0  A%=string%?B% $WrByte(A%) :dbg%:c(A%); B%=B%+1 A%=0 :dbg%:  : : _RESET FWrCmd(&00) :dbg%:"RESET "h0(_PFX%,2)" "h0(&00,2)" "; -WrByte(&00) :dbg%:h0(&00,2)" "; )WrByte(&00) :dbg%:h0(&00,2) 8 REPEAT:A%=FNRdByte:IFA%:VDUA% :REM Startup string "= UNTILA%=0:PROCWrByte(&00) :REM Acknowledge startup , 6: @: JݤwildcardsNull:os%<>32:= T+?Y%=13 $Y%="""": 204,"Bad filename" ^ݤwildcards:os%<>32:= h-(client%96)=0:$Y%,"*")+$Y%,"#")=0:= r-(client%96) :$Y%,"*")+$Y%,"?")=0:= | 253,"Wildcards" = : : !EscOff:os%32:"ESC OFF": "FX229": EscOn:os%32:"ESC OFF": "FX229,1": : :  I/O routines  ============ : ݤRdByte  db%=SerIn:b%=_PFX%:b%=SerIn:b%<>_PFX%:(b%&81)=0:client%=b%&60:A%=("FN_"+~(b%&1E)):b%=-1  b%>=0 &=b% 0: :WrByte(A%) D&SerOut(A%): A%=_PFX%:SerOut(A%) N X: bWrCmd(A%) l SerOut(_PFX%):SerOut(A%): v: RdBlock(N%): N%=0: + D%=N%-1 0 -1:ctrl%?D%=RdByte:: : WrBlock(N%): N%=0: , D%=N%-1 0 -1:WrByte(ctrl%?D%):: : RdString 4D%=0::B%=RdByte:string%?D%=B%:D%=D%+1:B%=13: : WrString 5D%=0::B%=string%?D%:WrByte(B%):D%=D%+1:B%=13: : :  Low level routines  ================== : ݤSerIn:serin%:=#serin% *=0 4: >(SerOut(A%):serout%:#serout%,A%: H R: \2SerFlush:serin%:ȕ #serin%:B%=#serin%:: f p: z: ݤargs(A%,Y%,X%) 2"@ARGS "h0(A%,2)" "h0(Y%,2)" "h0(X%,8)" "; =0 : :  Choices System  ============== %Choices_Init(Pub$,App$): A$,A%  os%=32 &Choices_Rd(@dir$+"\"+App$+".ini") 5A$=Reg_Rd("Software\"+Pub$+"\"+App$+"\Settings") A$<>"":Choices_Rd(A$)   os%=6 ?ș "OS_GetEnv" A$:A$=A$,A$,"""")+1):A$=A$,A$,"""")-1) 4 A%=Pub$,"."):A%:Pub$=Pub$,A%-1)+Pub$,A%+1) $8A%=0:A%=Pub$," "):A%:Pub$=Pub$,A%-1)+Pub$,A%+1) .&A%=0:Choices_Rd(A$+".^.Choices") 84Choices_Rd("Choices:"+Pub$+"."+App$+".Choices") B L V: `Choices_Rd(file$): A$,A% jin%=(file$) t in% ~ A$=#in%: A$,1)="#":A$="" A%=A$,":"): A% &A%=A%-1::A%=A%+1: A$,A%,1)<>" " 6Var_Assign("_"+A$,A%-1)+"$",""""+A$,A%+1)+"""")   #in%:#in%:in%=0     > ByteTx a Assumes a reliable (all bytes get through) error-free (no bytes are corrupted) link channel c Within this library, all filenames are passed as internal filenames with external name in fn$ ( v0.27 OSFILE 1-4 2; <: F File load/save routines P ======================= Z> fn$ set by external caller to originally passed filename dݤhost_file nA%>0 A%<5 xL%=X%!2:E%=X%!6:T%=X%!14 %?X%=file_info($Y%): inf%=0:=?X% # A%=1:X%!2=L%:X%!6=E%:X%!14=T%  A%=2:X%!2=L%  A%=3:X%!6=E%  A%=4:X%!14=T% hY%=string%:A$=$Y%:$Y%=fn_leaf(A$)+" "+h0(X%!2,8)+" "+h0(X%!6,8)+" "+h0(X%!10,8)+" "+h0(X%!14,8) ="SAVE "+fn_noext(A$)+s$+"inf "+~Y%+"+"+~($Y%+1):=?X%  %A%=&FF:X%?6:?X%=file_info($Y%) 0A%=&FF:X%!2=0: 252,"No file load address" A%=&FF:A%=&40 A%=&80 ch%=mos_find 3A%=&40:ch%=0: 214,"File '"+fn$+"' not found" /A%=&80:ch%=0: 192,"Can't save '"+fn$+"'"  A%=&40 YY%=#ch%:WrCmd(&E0) : Send 'load' command "QWrByte(X%?5):WrByte(X%?4):WrByte(X%?3):WrByte(X%?2) : Send start address ,B Y%::WrByte(#ch%):#ch% : Send data 6_X%!2=0:X%!6=0:X%!10=Y%:X%!14=&33 : Update control block @ J[Y%=X%!14-X%!10:WrCmd(&F0) : Send 'save' command TTWrByte(X%?13):WrByte(X%?12):WrByte(X%?11):WrByte(X%?10): Send start address ^_X%!10=Y%:X%!14=&33 : Update control block hF Y%::#ch%,RdByte:Y%=Y%-1:Y%=0 : Read data r |VWrCmd(&B0) : End transfer  SerFlush:B%=(10):SerFlush #ch%:ch%=0 # A%=&80 (os%32) inf%<>0 FY%=string%:A$=$Y%:$Y%=fn_leaf(A$)+" "+h0(X%!2,8)+" "+h0(X%!6,8) 8"SAVE "+fn_noext(A$)+s$+"inf "+~Y%+"+"+~($Y%+1)  Z=1 : Return 'File' : :  File read/write routines  ======================== ݤhost_gbpb  X%=>control block BA%=0 A%>4:=host_info : Read filing system information )Y%=?X%:(A%1):#Y%=X%!9 : Set PTR 6 A%>2:WrCmd(&E0) WrCmd(&F0) : Load/Save data &0WrByte(X%?4) : Send address 0WrByte(X%?3) :WrByte(X%?2) DWrByte(X%?1) NZ A%>2: X%!5::WrByte(mos_bget):X%!1=X%!1+1:X%!5=X%!5-1:X%!5=0 #Y% : Send data X` A%<3: X%!5::A%=RdByte:A%=mos_bput:X%!1=X%!1+1:X%!5=X%!5-1:X%!5=0 : Fetch data b0WrCmd(&B0) : End transfer l SerFlush:A%=(10):SerFlush v7X%!9=#Y% : Return updated PTR Q=(#Y%)&100 : Return Carry in b8, 0 in b0-b7 for 'supported' : : $ File filing system information $ ============================== ݤhost_info  os%<>32:=A% % sh%,dir%,res%,ptr%: dir% 317  Ȏ A%  6: 5ș "GetCurrentDirectory",255,string%:A$=$$string% ,B$=A$,1):A$=fn_leaf(A$): A$="":A$="\" $A$=fn_convert(A$,host%,client%) &WrCmd(&E0) : Load data  )WrByte(X%?4) : Send address WrByte(X%?3)  WrByte(X%?2) *WrByte(X%?1) 4WrByte(1) >WrByte(B$) HWrByte(A$) R$string%=A$+0 \ WrString f)WrCmd(&B0) : End transfer pX%!1=X%!1+$string% z=0  8  ptr%=X%!9 @ș "FindFirstFile",".\*.*",dir% sh% : Initialise search  sh%<>-1  7A$=$$(dir%+44) : Get object name S A$="." A$=".." uc(A$,4))=".INF":ptr%=ptr%+1: Step past special objects  ptr%=0 ș "FindClose",sh% $A$=fn_convert(A$,host%,client%) &WrCmd(&E0) : Load data )WrByte(X%?4) : Send address WrByte(X%?3) WrByte(X%?2) WrByte(X%?1) &WrByte(A$) : name length $$string%=A$ .(WrString : Name string 8)WrCmd(&B0) : End transfer B1X%!1=X%!1+1+A$ : Update data address L=X%!5=X%!5-1 : Count=Count-number transfered V:X%!9=X%!9+1 : Increment returned pointer `=0 j t=ptr%=ptr%-1 : Decrement requested pointer ~=ș "FindNextFile",sh%,dir% res% : Step to next object B res%=0 : Loop until no more found ș "FindClose",sh%  @=0 : Return at end of directory  =A% : :  Filing control routines  ======================= ݤhost_fsc  0 - *OPT  1 - EOF - done by BBCMOS  2 - */ C 3 - *command - *command -> fsc/file translation already done  4 - *RUN ( 5 - *CAT 2 6 - New filing system < 7 - Handles F 8 - OSCLI warning P 9 - *EX Z 10 - *INFO d 11 - LIBRUN n 12 - *RENAME xosc%=A% 256:A%=A% 255  Ȏ A% @ 5,9: : CAT, *EX ?Y%<>13:$Y%=$Y%+"." Ewildcards:=0 : BB4W throws up a dialogue box with wildcards out%=(tmp$+"!") W(os%32): "OUTPUT "+out%: "DIR "+fn_convert($Y%,client%,host%)+"*.*":*OUTPUT 0 #out%:out%=0 4 osc%=0:WrByte(&40) :dbg%:h0(&40,2)" "; in%=(tmp$+"!")::A%=#in% %(host%64)=64 (client%96)=0 1 A%=46:A%=47 A%=47:A%=92 A%=92:A%=46  %(host%96)=0 (client%64)=64 1 A%=46:A%=92 A%=47:A%=46 A%=92:A%=47  J((host%96)<>0 (client%96)=0) ((host%96)=0 (client%96)<>0) "$ A%=35 A%=63:A%=A%28 : # ? ,$ A%=36 A%=60:A%=A%24 : < $ 6$ A%=61 A%=64:A%=A%125 : = @ @$ A%=62 A%=94:A%=A%96 : > ^ J TL((host%64)=64 (client%96)=32) ((host%96)=32 (client%64)=64) ^! A%=47:A%=92 A%=92:A%=47 h r osc%: A% WrByte(A%) |#in%:#in%:in%=0 ! in%=OPENIN(tmp$+"!"):REPEAT O PROCPrText(FNfn_convert(GET$#in%,host%,client%)):IF osc%=0:PROCWrByte(10) 5 UNTILEOF#in%:CLOSE#in%:in%=0:PROCPrText(CHR$10) =0 ? 7:X%=&80:Y%=&9F:=0 : Handles = 10: : *INFO Ewildcards:=0 : BB4W throws up a dialogue box with wildcards #X%=Y%-1:X%=X%+1:?X%<33:?X%=13 7fn$=$Y%:$Y%=fn_convert($Y%,client%,host%):X%=ctrl% >A%=file_info($Y%): A%=0: 214,"File '"+fn$+"' not found" 4A$=fn_convert(fn_leaf($Y%),host%,client%),12) 2A$=A$+13-A$," ")+h0(X%!2,8)+" "+h0(X%!6,8) IA$=A$+" "+h0(X%!10,8)+" "+f_access(X%?14,A%)+" "+f_date(X%!15)+10 0 osc%=0:WrByte(&40) :dbg%:h0(&40,2) PrText(A$) =0 &B 3: : *command 0@Y%=Y%-1::Y%=Y%+1:?Y%<>32 ?Y%<>"*" : Skip '*'s and ' 's :MX%=Y%:?Y%="\":Y%=Y%+1 : *\command -> *command D4A%=$Y%+" "," "):B%=$Y%,"."):B%:A%>B%+1:A%=B% N?A$=":"+uc($Y%,A%-1)):Y%=Y%+A%-1 : A$=command X<ȕ ?Y%=32:Y%=Y%+1: : Skip spaces b)A$,1)=".":A$=A$,A$-1) A$=A$+":" l;C$=":ACCESS:DIR:FREE:HELP:GO:LOAD:LIB:SAVE:":A%=C$,A$) v3 A%:=("FNhost_"+C$,A%+1,C$,":",A%+1)-A%-1)) ( A%=0:?X%="\": 254,"Bad command" UY%=X%:A%=3 : Fall through to */filename   A%=2 A%=3 A%=4 M: : */, *command, *RUN E ?Y%=13:=0 : Null string "X%=Y%::X%=X%+1:?X%<33:?X%=13 .fn$=$Y%:$Y%=fn_convert($Y%,client%,host%) .X%=ctrl%:X%!2=0:X%!6=0:?X%=file_info(fn$) = ?X%=0:A%=3: 254,"Bad command" : *command > ?X%=0: 214,"File '"+fn$+"' not found" : */, *RUN L X%!2=0 X%!6=0: 252,"Bad address" : No load or exec address A%=&40:ch%=mos_find + ch%=0: 214,"Couldn't open '"+fn$+"'"  YY%=#ch%:WrCmd(&E0) : Send 'load' command QWrByte(X%?5):WrByte(X%?4):WrByte(X%?3):WrByte(X%?2) : Send start address  B Y%::WrByte(#ch%):#ch% : Send data *TWrCmd(&B0) : End transfer 4 SerFlush:A%=(10):SerFlush >#ch%:ch%=0 H^WrCmd(&C0) : Send 'address' command RQWrByte(X%?9):WrByte(X%?8):WrByte(X%?7):WrByte(X%?6) : Send start address \[=&80 : Return 'execute' f p=0 z: :  Support *commands  ================= ݤhost_HELP %A%=uc($Y%,4))="TUBE" ?Y%="." 0 osc%=0:WrByte(&40) :dbg%:h0(&40,2) PrText(10) !PrText("TubeHost "+ver$+10)  A%=0:=0 !PrText(" CAT ()"+10) 'PrText(" CREATE "+10) PrText(" CDIR "+10) !PrText(" DELETE "+10) PrText(" DIR "+10) ( PROCPrText(" EX ()"+CHR$10) ! PROCPrText(" FREE"+CHR$10) $PrText(" GO "+10) .#PrText(" HELP ()"+10) 8PrText(" INFO "+10) B(PrText(" LOAD ()"+10) L& PROCPrText(" LIB "+CHR$10) V#PrText(" RUN "+10) `-PrText(" RENAME "+10) jFPrText(" SAVE /+ ( ())"+10) t=0 ~: ݤhost_ACCESS:=0 ݤhost_FREE:=0 ݤhost_LIB:=0 : 5ݤhost_DIR:?Y%=13:$Y%=fn_convert("&",0,client%) fn$=$Y%:wildcards:=0 8f_dir(fn_convert($Y%,client%,host%)):_INF%=inf%:=0 : ݤhost_GO  dbg%: ?Y%=13:  ?Y%=13:_RESET:=-1 !X%=("&"+$Y%) $WrCmd(&C0) : Set Address %WrByte(X%?3) : Send address WrByte(X%?2) WrByte(X%?1) (WrByte(X%?0) 2=&80 <: Fݤhost_LOAD PX%=Y%::X%=X%+1:?X%<33 ZA%=X%-1::A%=A%+1:?A%<>32 d-?X%=13:?A%=13:A%=-1 A%=("&"+uc($A%)) nX%=ctrl%:X%!2=A%:X%?6=A%=-1 xA%=&FF:=host_file : ݤhost_SAVE X%=Y% FX%=X%-1::X%=X%+1:?X%<33:A%=X%:$A%=uc($A%) : A%=end of filename FX%=X%-1::X%=X%+1:?X%<>32:S%=X%:?A%=13 : S%=start of START BX%=X%-1::X%=X%+1:?X%<"0":A%=X% : A%=end of START 3X%=X%-1::X%=X%+1:?X%="+" ?X%>"/" ?X%=13 &P%=?X%="+":P%::X%=X%+1:?X%<>32 QE%=X%:L%=S%:R%=S% : E%=start of END/LEN ,X%=X%-1::X%=X%+1:?X%<"0":?A%=13:A%=X% X%=X%-1::X%=X%+1:?X%<>32 e?X%<>13:R%=X%:X%=X%-1::X%=X%+1:?X%<"0":?A%=13:A%=X%:X%=X%-1::X%=X%+1:?X%<>32:?X%<>13:L%=X% 3?A%=13:X%=ctrl%:X%!2=("&"+$L%):X%!6=("&"+$R%) BX%!10=("&"+$S%):P%:X%!14=("&"+$E%)+X%!10 X%!14=("&"+$E%) A%=&00:=host_file : ": ,PrText(A$) 6osc%:A$;13;: @$string%=A$:WrString J T: ^: hݤfile_info(A$): A% r+I$=fn_noext(A$)+s$+"inf":X%!2=0:X%!6=0 | : :=f_info(A$) ! f_info(I$)=1 X%!10<120 2A%=X%!10:"LOAD "+I$+" "+~X%:X%!A%=&D20:A%=X% 7:A%=A%+1:?A%=32:A%=A%+1:?A%<>32:X%!2=("&"+$A%) 7:A%=A%+1:?A%=32:A%=A%+1:?A%<>32:X%!6=("&"+$A%)  =f_info(A$) : :  Convert filenames  ================= ݤfn_convert(A$,from%,to%) inf%=_INF% )uc(A$,5))=":INF:":inf%=:A$=A$,6) +uc(A$,7))=":NOINF:":inf%=:A$=A$,8) from%=to% A$="":=A$  x00xxxxx - BBC & x01xxxxx - Unix 0 x1xxxxxx - DOS :1(from%96)=0 :(to%64)=64:=fn_bbctodos(A$) D2(from%96)=0 :(to%96)=32:=fn_bbctounix(A$) N1(from%64)=64:(to%96)=0 :=fn_dostobbc(A$) X2(from%64)=64:(to%96)=32:=fn_dostounix(A$) b2(from%96)=32:(to%96)=0 :=fn_unixtobbc(A$) l2(from%96)=32:(to%64)=64:=fn_unixtodos(A$) v=A$ : 2 Support functions from BLib.File, BLib.FInfo 2 ============================================ 2f_dir(A$):os%40:A$="cd "+A$ A$="dir "+A$ A$: : *ݤf_access(A%,T%):A$:(A%128):A$="P" (T%2):A$=A$+"D" (A%8):A$=A$+"L" (A%2):A$=A$+"W" (A%1):A$=A$+"R" (A%5)=4:A$=A$+"E" A$=A$+"/":(A%32):A$=A$+"w" (A%16):A$=A$+"r" (A%80)=64:A$=A$+"e" =A$+" ",8) : *aݤf_date(A%)=d0(A%31,2)+"/"+d0((A%&F00)256,2)+"/"+d0((A%&F000)4096+(A%&E0)/2+1981,4)  > BBCMOS  BBC MOS Interface > Within this library, all filenames are locally formatted (; 2ݤmos_args <' Y%=0: A%=0:=fs : =FS F (Y%-512) P Ȏ A% Z' 0:!X%=0:=0 : =PTR#-1 d> 2:!X%=255-(-1):=0 : =EXT#-1, number in keyboard buffer n; 5:!X%=(-1)=0:=0 : =EOF#-1, keyboard buffer empty? x  Y% Ȏ A% " 0:!X%=#Y%:=0 : =PTR " 1:#Y%=!X%:=0 : PTR= " 2:!X%=#Y%:=0 : =EXT " 3:#Y%=!X%:=0 : EXT= $ 4:!X%=#Y%:=0 : =Alloc " 5:!X%=#Y%:=0 : =EOF $ 6:#Y%=!X%:=0 : Alloc=   < os%=6: >&8000:ș "OS_Args",A%,Y%,!X% A%,Y%,!X%:=A% !X%=args(A%,Y%,!X%) <=A% : Unchanged=unsupported : "ݤmos_bget ,8 Y%=0:= : =BGET#0 6/ os%32:=((#Y%=#Y%)256)+#Y% : =BGET#Y @ A%=&FFD7 J$=((A%&1000000)&10000)(A%&FF) T: ^ݤmos_bput h Y%=0: A% #Y%,A% r=A% |: ݤmos_find  A%=0:#Y%:=A% " (A%&C0)=&40:=f_openin($Y%) # (A%&C0)=&80:=f_openout($Y%) " (A%&C0)=&C0:=f_openup($Y%) =0 : ݤmos_file  A%<5 A%=&FF:=host_file T os%=6:ș "OS_File",A%,Y%,X%!2,X%!6,X%!10,X%!14 A%,,X%!2,X%!6,X%!10,X%!14:=A% I A%=5:X%!2=0:X%!6=0:X%!10=0:X%!14=0:A%=Y%:Y%=X%256:=file_info($A%) I A%=6:f_delete($Y%): inf%<>0 (os%32):f_delete($Y%+s$+"inf"):=1  A%=6:=1 ? A%=7:"SAVE "+f_name($Y%)+" "+~+"+"+~(X%!14-X%!10):=1  A%=8:f_cdir($Y%):=2 =A% &: 0ݤmos_gbpb:=host_gbpb :: D ݤmos_cli NDY%=Y%-1::Y%=Y%+1:?Y%<>32 ?Y%<>"*" : Skip '*'s and ' 's XQA%=&103: ?Y%="/":Y%=Y%+1:A%=&102 : Fall through into FSC b: l ݤmos_fsc vOosc%=A%256:A%=A%255 : b8=called from OSCLI  Ȏ A% = 1:A%=5:X%=ctrl%:A%=mos_args:X%=?X%:Y%=X%:=A% : =EOF B 3: : *command B ?Y%="|":=0 : *| comment M ?Y%="\":Y%=Y%+1 : *\command -> *command E ?Y%=13:=0 : Null string 6A%=$Y%+" "," "):B%=$Y%,"."):B%:A%>B%+1:A%=B%+1 ?A$=":"+uc($Y%,A%-1)):Y%=Y%+A%-1 : A$=command <ȕ ?Y%=32:Y%=Y%+1: : Skip spaces * A$,1)=".":A$=A$,A$-1) A$=A$+":" NA%=":CAT::::RUN::::CAT::::DELETE:CREATE:CDIR:::EX:::::INFO:::RENAME:",A$) * A%=0:A%=3osc%:Y%=string%:=host_fsc A%=3+A%7: A%=3:A%=5  A%>5 A%<9  @X%=Y%-1:X%=X%+1:?X%<33:?X%=13 : Terminate string  A%=7  EX%=X%-1::X%=X%+1:?X%<>32 : *CREATE filename length *ctrl%!14=("&"+$X%) 4"ctrl%!2=0:ctrl%!6=0:ctrl%!10=0 > HA$Y%=fn_convert($Y%,client%,host%):X%=ctrl%:!X%=Y%:=mos_file R \A%=A%osc% f p=host_fsc z: ݤmos_word  Ȏ A% & 0: ""A$:$Y%=A$:X%=Y%:Y%=A$:=0  1:!X%=:=0  2:=!X%:=0  5:X%?4=?!X%:=0  6:?!X%=X%?4:=0  7: !X%,X%!2,X%!4,X%!6:=0 V 8: X%?0,X%?1,X%?2,X%?3,X%?4,X%?5,X%?6,X%?7,X%?8,X%?9,X%?10,X%?11,X%?12,X%?13:=0  14:$X%=$:=0  15:$=$X%:=0  Y%=X%256:A%=(&FFF1)&FF  =A% : $ݤmos_byte . A%=0 82X%=(os%&D7)((client%64)2)((client%32)4) B X%<>os%:X%=X%&80 LB=0 : =HOST V `K A%>123:A%<127:?escflg%=128*(A%1):"FX15" : Clear/Set/Ack Escape jA A%=&7F:A%=5:X%=ctrl%:A%=mos_args:X%=?X%:Y%=X%:=&7F : =EOF tG A%=&81:X%=((X%255)+256*Y%):Y%=X%256:=A%+256*(X%=-1) : =INKEY ~L A%=&82:X%=membot%65536:Y%=X%256:=A% : high order address L A%=&83:X%=membot%:Y%=X%256:=A% : bottom of memory I A%=&84:X%=memtop%:Y%=X%256:=A% : top of memory D A%=&86:X%=:Y%=:=A% : =POS, =VPOS  os%=32 ? A%=&80:X%=7:ȗ X%,A%,A%:Y%=X%256:=&80 : =ADVAL(7) ? A%=&80:X%=8:ȗ A%,X%,A%:Y%=X%256:=&80 : =ADVAL(8) ? A%=&80:X%=9:ȗ A%,A%,X%:Y%=X%256:=&80 : =ADVAL(9) 7 A%=&87:X%=(,):Y%=:=A% : =MODE  A%=&A0  Ȏ X% 5 0,128:ș "GetRgnBox",@vdu%!60,ctrl%:X%=ctrl%!0 5 2,129:ș "GetRgnBox",@vdu%!60,ctrl%:X%=ctrl%!4 5 4,130:ș "GetRgnBox",@vdu%!60,ctrl%:X%=ctrl%!8  6 6,131:ș "GetRgnBox",@vdu%!60,ctrl%:X%=ctrl%!12 $ 8,132:X%=@vdu%!24 @vdu%!216 & 9,133:X%=@vdu%!36 @vdu%!220-1 (& 10,134:X%=@vdu%!28 @vdu%!216-1 2$ 11,135:X%=@vdu%!32 @vdu%!220 < 12,136:X%=2*@vdu%!0 F 14,137:X%=2*@vdu%!4 P 16,138:X%=2*@vdu%!8 ZE 18,139:ș "GetRgnBox",@vdu%!60,ctrl%:X%=2*(ctrl%!12-@vdu%!12-1) d 20,142:X%=@vdu%!16 nC 22,143:ș "GetRgnBox",@vdu%!60,ctrl%:X%=(ctrl%!12-@vdu%!20-1) x 36:X%=@vdu%!8 ? 38:ș "GetRgnBox",@vdu%!60,ctrl%:X%=(ctrl%!12-@vdu%!12-1)  87,155:X%=@vdu%?70  88,156:X%=@vdu%?71  89,153:X%=@vdu%?65  90,154:X%=@vdu%?67 + 91,151:X%=3-(@vdu%?64-7)2:X%<0:X%=1 + 92,152:X%=3-(@vdu%?66-7)2:X%<0:X%=1  96,3:X%=@vdu%?73  X%=0  Y%=X%256:=&A0   : A%=&80:X%=((X%255)+256*Y%):Y%=X%256:=A% : =ADVAL  A%=&A0 "@ X%<16: X%<>3:=A% : =VDU(n) , X%=3:X%=96 6Ȏ r%(1) @ 16:A%=138 J 18:A%=139 T 20:A%=142 ^ 22:A%=143 h 36:A%=144 r 38:A%=145 | 77:A%=148  80:A%=149  83:A%=150  87:A%=155  88:A%=156  89:A%=153  90:A%=154  91:A%=151  92:A%=152  96:A%=3  !A%=X%: A%<128:X%=0:Y%=0:=&A0  ?!ctrl%=A%:ctrl%!4=-1:ș "OS_ReadVduVariables",ctrl%,ctrl%+8 X%=ctrl%!8:Y%=X%256:=&A0  7A%=&FFF4:X%=(A%&FFFF00)256:Y%=(A%&FF0000)65536 &"=(A%&1000000)&10000+(A%&FF) 0: & > BLib.Filename 1.00 25-Jan-2011 A Convert between BBC, DOS/Windows and UNIX/ZIP/URL filenames K!Keep FNfn_frombbc(), FNfn_tobbc(), FNfn_unixtodos(), FNfn_dostounix() (: 2: <5ݤfn_bbctodos(A$):A%,B%,H%:H%=32::fn_frombbc() F5ݤfn_bbctounix(A$):A%,B%,H%:H%=8::fn_frombbc() P%ݤfn_frombbc(A$):A%,B%,H%:H%=os% ZA$=""(H%40)=0:=A$ dLA$,1)=":":A%=A$+".","."):A$=A$,2,A%-2)+":"+A$,A%-(A$,A%+1,1)="$")) n A%=0::A%=A%+1:B%=A$,A%,1) x7B%=35B%=63:A$=A$,A%-1)+(B%28)+A$,A%+1) : # ? 7B%=61B%=64:A$=A$,A%-1)+(B%125)+A$,A%+1): = @ 7B%=36B%=60:A$=A$,A%-1)+(B%24)+A$,A%+1) : < $ 7B%=62B%=94:A$=A$,A%-1)+(B%96)+A$,A%+1) : > ^ A$)) :B%="$":(H%32):A$=A$,A%-1)+"\"+A$,A%+1-(A%<>A$)) 'B%="@":A$=A$,A%-1)+"."+A$,A%+1) 0B%="^":A$=A$,A%-1)+".."+A$,A%+1):A%=A%+1 'B%="/":A$=A$,A%-1)+"."+A$,A%+1) 2B%=".":(H%40)=8:A$=A$,A%-1)+"/"+A$,A%+1) 0B%=".":(H%32):A$=A$,A%-1)+"\"+A$,A%+1) 0B%="\":(H%32):A$=A$,A%-1)+"/"+A$,A%+1) : IFB%=ASC"&":A$=LEFT$(A$,A%-1)+"%HOME%"+MID$(A$,A%+1) A%>A$:=A$ : Xݤfn_fromunix(A$):(os%40)=8:=A$ (os%40)=0:=fn_unixtobbc(A$)::fn_dostounix() Tݤfn_fromdos(A$):(os%32):=A$ (os%40)=0:=fn_dostobbc(A$)::fn_dostounix() "Vݤfn_tounix(A$):(os%40)=8:=A$ (os%40)=0:=fn_bbctounix(A$)::fn_dostounix() ,Rݤfn_todos(A$):(os%32):=A$ (os%40)=0:=fn_bbctodos(A$)::fn_dostounix() 6(ݤfn_unixtodos(A$)::fn_dostounix() @ݤfn_dostounix(A$) JA$,"/")+A$,"\")=0:=A$ TZ A%,B%:A%=0::A%=A%+1:B%=A$,A%,1):B%="/"B%="\":A$=A$,A%-1)+(B%115)+A$,A%+1) ^A%>=A$:=A$ h: r3ݤfn_dostobbc(A$):A%,B%,H%:H%=32::fn_tobbc() |3ݤfn_unixtobbc(A$):A%,B%,H%:H%=8::fn_tobbc() #ݤfn_tobbc(A$):A%,B%,H%:H%=os% A$=""(H%40)=0:=A$ A$="/":(H%40)=8:="$" A$="\":(H%32):="$"  A%=0::A%=A%+1:B%=A$,A%,1) 6B%=35B%=63:A$=A$,A%-1)+(B%28)+A$,A%+1): # ? ;A$,A%,2)="..":A$=A$,A%-1)+"^"+A$,A%+2):A%=A%-1:B%=0 &A$,A%)=".":A$=A$,A%-1)+"@":B%=0 >A$,A%,2)="./":(H%40)=8:A$=A$,A%-1)+"@"+A$,A%+1):B%=0 A$:=A$ 0: " > BLib.File 1.00 J.G.Harston + Platform-independant filing functions !Keep PROCf_cdir() (|Keep f_cdir() 2: <: F5 PROCf_init - initialise filing-system variables P5 ----------------------------------------------- Z f_init d6d$=".":s$="/":os%40:d$="/":s$=".":os%32:d$="\" n x: : , FNfn_root(path$) - return root of path , -------------------------------------- ;ݤfn_root(A$):A%,B%:A$,2)=d$+d$:=A$,A$+d$,d$,3)-1) 3A%=A$,":",2):B%=A$,d$,A%)(A%<>0):B%:A%=B%-1 A%:=A$,A%) +":$%&^@\-",A$,1)):=A$,A$+d$,d$)-1) ="" : : ) FNfn_leaf(path$) - returns leafname ) ----------------------------------- &ݤfn_leaf(A$):A%,B%:A%=A$,":",2) +B%=A%:A%=A$,d$,A%+1):A%=0:=A$,B%+1) : : ") FNfn_path(path$) - returns pathname ,) ----------------------------------- 6&ݤfn_path(A$):A%,B%:A%=A$,":",2) @)B%=A%:A%=A$,d$,A%+1):A%=0:=A$,B%) J: T: ^4 FNfn_ext(path$) - returns leafname's extension h4 ---------------------------------------------- rݤfn_ext(A$):A$,s$)=0:="" |1 A%:A%=A$+1:A%=A%-1:":"+d$+s$,A$,A%,1))  A$,A%,1)=s$:=A$,A%) ="" : : 8 FNfn_noext(path$) - returns path with no extension 8 -------------------------------------------------- !ݤfn_noext(A$):A$,s$)=0:=A$ 1 A%:A%=A$+1:A%=A%-1:":"+s$+d$,A$,A%,1)) "A$,A%,1)=s$:=A$,A%-1) =A$ : : = FNfn_fullpath(path$, file$) - return full absolute path = ------------------------------------------------------- ݤfn_fullpath(P$,A$) &"$%&^\-",A$,1)):(os%40)=0:=A$ A$,":")A$,1)=d$:=A$ =P$+d$,P$,1)<>d$)+A$ &: 0: :9 PROCf_gbpb() - multiple get-bytes or put-bytes call D9 --------------------------------------------------- N%f_gbpb(A%,chn%,addr%,num%,ptr%) X@?X%=chn%:X%!1=addr%:X%!5=num%:X%!9=ptr%:(os%32)=0:&FFD1: bA%=1A%=3:#?X%=X%!9 l5:A%=1A%=2:#?X%,?X%!1 A%=3A%=4:?X%!1=#?X% v5X%!1=X%!1+1:X%!5=X%!5-1:(#?X% A%>2) X%!5<1: : : - FNfs - get current filing system number - --------------------------------------- ,ݤfs:(os%32)=0:A%,Y%,E%:=(&FFDA)&FF =29 : : + PROCf_delete(object$) - delete object + ------------------------------------- Bf_delete(A$):(os%8):A$="rm "+A$ A$="delete "+f_name(A$) : D PROCf_cdir(dir$) - create a directory only if it doesn't exist D --------------------------------------------------------------  9f_cdir(A$):(os%40):A$="mkdir "+A$ A$="cdir "+A$   A$: * 4 : : >A$ H R: \: fE FNf_name(path$) - ensure no extension if no extension specified pE --------------------------------------------------------------- zݤf_name(A$) Ios%32:A%,B%:B%=A%:A%=A$,"\",A%+1):A%=0:A$,".",B%)=0:A$=A$+"." =A$ : : B FNf_openin(file$) - open an input file ensuring no extension B ------------------------------------------------------------ !ݤf_openin(A$)=(f_name(A$)) : : C FNf_openup(file$) - open an update file ensuring no extension C ------------------------------------------------------------- !ݤf_openup(A$)=(f_name(A$)) : : D FNf_openout(file$) - open an output file ensuring no extension D -------------------------------------------------------------- $"ݤf_openout(A$)=(f_name(A$)) .: 8: B@ FNf_info(object$) - returns file type, file info in X%!... L@ ---------------------------------------------------------- VRݤf_info(A$):(os%32)=0:$name%=A$:?X%=name%:X%?1=name%256:A%=5:=(&FFDD)&FF `dir%,sh%:dir%319 j*ș"FindFirstFile",f_name(A$),dir%sh% tLsh%=-1:ș"GetFileAttributes",f_name(A$)sh%:=((sh%16)16+1)(sh%<>-1) ~5ș"FindClose",sh%:X%!10=dir%!32:dir%!28:X%!10=-1 BX%?14=(dir%?01)*8+&33:ș "FileTimeToSystemTime",dir%+20,X%+16 BA%=(X%!16&FFFF)-1981:X%?15=X%?22+(A%&70)*2:X%?16=X%?18+A%*16 9X%?17=X%?24:X%?18=X%?26:X%?19=X%?28:=(dir%?016)16+1 : : 3 PROCf_settype(object%, type%) - set file type 3 --------------------------------------------- "f_settype(A$,A%):(os%32): ?f_info(A$):X%?3=A%:X%?4=(A%256)&F0:X%?5=&FF:A%=1:&FFDD  : : " > BLib.String 1.00 09Aug1998 : # String Manipulation Functions (# ============================= 2: <7 FNs() - strip spaces from start and end of string F7 ------------------------------------------------- P/ݤs(A$):A$,1)=" ":A$=A$,2):A$,1)<>" " Z+A$,1)=" ":A$=A$,A$-1):A$,1)<>" " d=A$ n: x+ FNuc() - convert string to upper case + ------------------------------------- ݤuc(A$): B$:A$="":="" 5B$=B$+(A$((A$<"@")&DF)):A$=A$,2):A$="":=B$ : + FNlc() - convert string to lower case + ------------------------------------- ݤlc(A$): B$:A$="":="" 5B$=B$+(A$((A$<"_")&20)):A$=A$,2):A$="":=B$ : 0 > BLib.Win.Reg v1.04 20Sep2010 J.G.Harston % v1.00 18May2006 Initial version 0 v1.01 09Feb2007 Finds required buffer size (" v1.02 13Aug2007 B% localised 2D v1.03 25Apr2009 Michael Hutton: uses $$B%, added PROCReg_Del() <. v1.04 20Sep2010 Shortened variable names F: P. Simple Windows registry access functions Z. ======================================== d: n/ Reg_Rd(Key$) - Read a user registry entry x/ ----------------------------------------- : 'ݤReg_Rd(K$): K%,R%,L%,T%,I$,V$,B% (I$=K$::K%=I$,"\"):K%:I$=I$,K%+1) K%=0:K$=K$,K$-I$-1) 4ș "RegOpenKeyEx",&80000001,K$,0,&20001,^K% R% R%=0 4ș "RegQueryValueEx",K%,I$,0,^T%,0,^L%: B% L% 0ș "RegQueryValueEx",K%,I$,0,^T%,B%,^L% R%  R%=0:B%?(L%-1)=0:V$=$$B% ș "RegCloseKey",K%  =V$ : : 7 Reg_Wr(Key$,Value$) - Write a user registry entry 7 ------------------------------------------------- ": ,!Reg_Wr(K$,V$): K%,D%,R%,I$ 6(I$=K$::K%=I$,"\"):K%:I$=I$,K%+1) @K%=0:K$=K$,K$-I$-1) JAș "RegCreateKeyEx",&80000001,K$,0,"",0,&F003F,0,^K%,^D% R% T R%=0 ^)ș "RegSetValueEx",K%,I$,0,1,V$,V$+1 hș "RegCloseKey",K% r | : : 2 Reg_Del(Key$) - delete a user registry entry 2 -------------------------------------------- : Reg_Del(K$): K%,R% ?ș "RegCreateKeyEx",&80000001,K$,0,"",0,&F003F,0,^K%,0 R%  R%=0  ș "RegDeleteTree",K%,0 R% ș "RegCloseKey",K%    > BLib.Variable # Variable assignment functions # ============================= (@!Keep FNVar_S(), FNVar_I(), FNVar_B(), FNVar_F(), FNVar_R() 2;|!Keep Var_S(); Var_I(); Var_B(); Var_F(); Var_R() <: F Var_Assign(Var$,Val$) P8 Sets the variable in 'Var$' to the value in 'Val$' Z8 -------------------------------------------------- d: nVar_Assign(Var$,Val$) x7 Var$,1)="$":A%=("FNVar_S("+Var$+","+Val$+")"): 7 Var$,1)="%":A%=("FNVar_I("+Var$+","+Val$+")"): 7 Var$,1)="&":A%=("FNVar_B("+Var$+","+Val$+")"): 7 Var$,1)="#":A%=("FNVar_F("+Var$+","+Val$+")"): (A%=("FNVar_R("+Var$+","+Val$+")"):  : ݤVar_S( a$,b$):a$=b$:=0 ݤVar_I( a%,b%):a%=b%:=0 ݤVar_B( a&,b&):a&=b&:=0 ݤVar_F( a#,b#):a#=b#:=0 ݤVar_R( a, b ):a =b :=0 :