> BBCHost $ Simple Serial Tube Host System : (: 2&A%=0:X%=1:os%=((&FFF4)&FF00)256 <speed%=19200 : Baud Fdbg%=-2 : Debug P _PFX=127 Z: da ctrl0% 131,string% 255:ctrl%=ctrl0%+2:ch%=0:in%=0:out%=0:ser%=0:fn$="":"HostFS Host v1.00" nJ :" at line "+Þ,<128 <>17):_ERROR:close: err:exit(): x;quit%=:open:"Couldn't open serial port":exit(-1): :c(RdByte);: quit% close:exit  : : ݤopen Sos%=32:ser%=("COM1: baud="+speed%+" parity=N data=8 stop=1 octs=on"):=ser%=0 "os%=6:ser%="Serial:":=ser%=0 #A%=speed%:A%>63:A%=(A%75)/2 %"FX7,"+A%:"FX8,"+STR%A%:*FX2,2 =0 : close ch% :A%=ch% :ch%=0 :#A% in% :A%=in% :in%=0 :#A% out%:A%=out%:out%=0:#A% "ser%:A%=ser%:ser%=0:#A%: ,*FX2 6 @: J ݤerr T =-1 (<128 <>17 -1) ^: hexit(A%) r | : #ݤh0(A%,N%)="0000000"+~A%,N%) 1ݤc(A%):A%=A%127:A%<32 A%=127:="." =A% : :  Inward  x VDU x ! esc,esc VDU esc = esc,n MOS function, control block follows  : :  OS_RDCH  ======= " Tube data &00 -- Carry Char %ݤ_0 :dbg%:"OS_RDCH "; &A%= 0.WrByte(0) :dbg%:"-- "h0(&00,2)" "; :#WrByte(A%) :dbg%:h0(A%,2) D=0 N: X: b OS_CLI l ====== v- Tube data &02 string &0D -- &7F or &80 %ݤ_2 :dbg%:"OS_CLI "; &RdString :dbg%:$string%" "; Y%=string%:A%=mos_cli )SerOut(&7F) :dbg%:"-- "h0(&7F,2) =0 : :  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((A%&FF00)&100) /: :dgb%:"-- "h0(A%256,2)  =0 *: 4 LONG_BYTE > ========= H$ Tube data &06 X Y A -- Cy Y X Rݤ_6 :"OS_BYTE "; \)X%=RdByte :dbg%:h0(X%,2)" "; f)Y%=RdByte :dbg%:h0(Y%,2)" "; p)A%=RdByte :dbg%:h0(A%,2)" "; zA%=mos_byte CWrByte((A%&1000000)&20000) :dgb%:"-- "h0(A%&20000,2)" "; >WrByte((A%&FF0000)&10000) :dgb%:h0(A%&10000,2)" "; 8WrByte((A%&FF00)&100) :dgb%:h0(A%&100,2) =0 : :  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(B%) :dbg%:inlen%:D%=0inlen%-1:h0(ctrl%?D%,2);: 3outlen%=RdByte :dbg%:h0(outlen%,2)" "; X%=ctrl%:A%=mos_word QWrBlock(outlen%) :dbg%:"-- ";:outlen%:D%=0inlen%-1:h0(ctrl%?D%,2);: $": :dbg%: .=0 8: B: L OS_RDLINE V ========= `3 Tube data &0A block -- &FF or &7F string &0D j*ݤ_A :dbg%:"OS_RDLN "; t^RdBlock(5) :dbg%:h0(ctrl%!0,4)" "h0(ctrl%?2)" "h0(ctrl%?3)" "h0(ctrl%?4)" "; ~X%=ctrl%:A%=mos_word .(A%&1000000) :dbg%:"-- "h0(&80,2) "(A%&1000000):WrByte(&80):=0 2WrByte(&7F) :dbg%:"-- "h0(&7F,2)" "; 'WrString :dbg%:$string% =0 : :  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) 2=0 <: F: P OS_BGET Z ======= d) Tube data &0E handle -- Carry byte n,ݤ_E :dbg%1:"OS_BGET "; x0Y%=RdByte :dbg%1:h0(Y%,2)" "; Y%=Y%&7F:A%=mos_bget =WrByte((A%&100)2):dbg%1:"-- "h0((A%&100)2,2)" "; *WrByte(A%) :dbg%1:h0(A%,2) =0 : :  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 6 ======= @2 Tube data &12 function string &0D -- handle J& &12 &00 handle -- &7F T*ݤ_12 :dbg%:"OS_FIND "; ^.A%=RdByte :dbg%:h0(A%,2)" "; h A%=0 r,Y%=RdByte :dbg%:h0(Y%,2)" "; |>Y%=Y%&7F:A%=mos_find:Y%=0:A%=open: Reopen serial port ,WrByte(&7F) :dbg%:"-- "h0(&7F,2) =0  +RdString :dbg%:$string%" "; 3Y%=string%-1:Y%=Y%+1:?Y%<33:?Y%=13:Y%=string% Gwildcards:=0 : BB4W throws up a dialogue box with wildcards $Y%=fn_frombbc($Y%)  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)" ";: 0,RdString :dbg%:$string%;" "; :.A%=RdByte :dbg%:h0(A%,2)" "; D3Y%=string%-1:Y%=Y%+1:?Y%<33:?Y%=13:Y%=string% NGwildcards:=0 : BB4W throws up a dialogue box with wildcards X fn$=$Y%:$Y%=fn_frombbc($Y%) bX%=ctrl%-2:A%=mos_file l.WrByte(A%) :dbg%:"-- "h0(A%,2); vFWrBlock(16) :dbg%: D%=0 12 4:" "h0(ctrl%!D%,8);:: =0 : :  OS_GBPB  ======= 9 Tube data &16 block function -- block Carry result *ݤ_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 4 ====== >% Tube data &18 X Y A -- &FF Y X HB -- &7F then string &0D -- &7F/&40/&80 R*ݤ_18 :dbg%:"OS_FSC "; \.X%=RdByte :dbg%:h0(X%,2)" "; f.Y%=RdByte :dbg%:h0(Y%,2)" "; p.A%=RdByte :dbg%:h0(A%,2)" "; zCdbg%:"OPTEOF*/ CMDRUNCATNEWHNDWRNEX INFRUNREN",A%*3+1,3)" "; : * A%>127 A%<2 A%=6 A%=7 A%=8 A%=1:Y%=Y%127 : =EOF A%=mos_fsc 0WrByte(&FF) :dbg%:"-- "h0(&FF,2)" "; *WrByte(X%) :dbg%:h0(X%,2)" "; &WrByte(Y%) :dbg%:h0(Y%,2) =0  2WrByte(&7F) :dbg%:"-- "h0(&7F,2)" "; +RdString :dbg%:$string%" "; Y%=string%:A%=mos_fsc )WrByte(&00) :dbg%:h0(&00,2) =0 : : $ _ERROR .G$string%="HostFS error: ",<128)+$+" ("+Þ+")",<128 <>17)+0 8EWrCmd(&00) :dbg%:"ERROR "h0(_PFX,2)" "h0(&00,2)" "; B)WrByte() :dbg%:h0(,2)" "; LB%=0 V `A%=string%?B% j$SerOut(A%) :dbg%:c(A%); t B%=B%+1 ~A%=0 :dbg%:  : : ݤwildcards:os%<>32:= $Y%,"*")+$Y%,"#")=0:=  253,"Wildcards" = : :  I/O routines  ============ : ݤRdByte  Tb%=SerIn: b%=_PFX:b%=SerIn:b%<>_PFX:(b%1)=0:b%<&19:A%=("FN_"+~b%):b%=-1  b%>=0 (=b% 2: <WrByte(A%) F%SerOut(A%): A%=_PFX:SerOut(A%) P Z: dWrCmd(A%) nSerOut(_PFX):SerOut(A%): x: RdBlock(N%) + D%=N%-1 0 -1:ctrl%?D%=RdByte:: : WrBlock(N%) , 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:ser%:=#ser% ,=0 6: @"SerOut(A%):ser%:#ser%,A%: J T: ^,SerFlush:ser%:ȕ #ser%:A%=#ser%:: h r: |: ݤargs(A%,Y%,X%) 2"@ARGS "h0(A%,2)" "h0(Y%,2)" "h0(X%,8)" "; =0 :  > PacketTx 0 Encapsulates data in error-checked packets : (' Working on: GBPB write (incoming) 2: < File load/save routines F ----------------------- P: Zݤhost_file d.A%=&FF:X%?6: 252,"No file load address" nA%=&FF:A%=&40 A%=&80 xch%=mos_find 4A%=&40:ch%=0: 214,"File '"+$fn%+"' not found" 0A%=&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 _X%!2=0:X%!6=0:X%!10=Y%:X%!14=&33 : Update control block  [Y%=X%!14-X%!10:WrCmd(&F0) : Send 'save' command TWrByte(X%?13):WrByte(X%?12):WrByte(X%?11):WrByte(X%?10): Send start address _X%!10=Y%:X%!14=&33 : Update control block F Y%::#ch%,RdByte:Y%=Y%-1:Y%=0 : Read data  VWrCmd(&B0) : End transfer  SerFlush:A%=(10):SerFlush #ch%:ch%=0 "Z=1 : Return 'File' ,: 6: @ݤhost_gbpb J X%=>control block T:A%=0 A%>4:=A% : Unchanged=unsupported ^)Y%=?X%:(A%1):#Y%=X%!9 : Set PTR h6 A%>2:WrCmd(&E0) WrCmd(&F0) : Load/Save data r0WrByte(X%?4) : Send address |WrByte(X%?3) WrByte(X%?2) WrByte(X%?1) Z A%>2: X%!5::WrByte(mos_bget):X%!1=X%!1+1:X%!5=X%!5-1:X%!5=0 #Y% : Send data  A%<3  X%!5  N X%!5>255 len%=256 len%=X%?5 : 256 bytes or <256 for final portion JWrByte(len%) : Send required packet length Achk%=0: cnt%=1 len%:A%=RdByte:chk%=chk%+A%:A%=mos_bput: BA%=RdByte : Wait for checksum _ A%=(chk%255):WrByte(chk%):X%!5=X%!5-len%:X%!1=X%!1+len% WrByte(chk%):#Y%=#Y%-len%  X%!5=0   0WrCmd(&B0) : End transfer  SerFlush:A%=(10):SerFlush &7X%!9=#Y% : Return updated PTR 0Q=(#Y%)&100 : Return Carry in b8, 0 in b0-b7 for 'supported' ::  > BBCMOS  BBC MOS Interface ; (ݤmos_args 2' Y%=0: A%=0:=fs : =FS < (Y%-512) F Ȏ A% P' 0:!X%=0:=0 : =PTR#-1 Z> 2:!X%=255-(-1):=0 : =EXT#-1, number in keyboard buffer d; 5:!X%=(-1)=0:=0 : =EOF#-1, keyboard buffer empty? n 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 ,/ os%32:=((#Y%=#Y%)256)+#Y% : =BGET#Y 6 A%=&FFD7 @$=((A%&1000000)&10000)(A%&FF) J: Tݤmos_bput ^ Y%=0: A% #Y%,A% h=A% r: |ݤ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%=0 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% F A%=5:X%!2=0:X%!6=0:X%!10=0:X%!14=0:A%=Y%:Y%=X%256:=f_info($A%)  A%=6:f_delete($Y%):=1 ? A%=7:"SAVE "+f_name($Y%)+" "+~+"+"+~(X%!14-X%!10):=1  A%=8:f_cdir($Y%):=2 =A% : ݤmos_gbpb:=host_gbpb &: 0 ݤmos_fsc : Ȏ A% D= 1:A%=5:X%=ctrl%:A%=mos_args:X%=?X%:Y%=X%:=A% : =EOF NB 3: : *command XM?Y%="\":Y%=Y%+1 : *\command -> *command b/A%=$Y%," "):A%=0:A%=$Y%,"."):A%:A%=A%+1 l?A$=":"+uc($Y%,A%-1)):Y%=Y%+A%-1 : A$=command v<ȕ ?Y%=32:Y%=Y%+1: : Skip spaces )A$,1)=".":A$=A$,A$-1) A$=A$+":" @A%=":CAT::::DELETE:CREATE:CDIR:::EX:::::INFO:::RENAME:",A$) % A%=0:A%=3:Y%=string%:=host_fsc  A%=5+A%7  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%) "ctrl%!2=0:ctrl%!6=0:ctrl%!10=0  X%=ctrl%:!X%=Y%:=mos_file    =host_fsc :  ݤmos_word * Ȏ A% 4& 0: ""A$:$Y%=A$:X%=Y%:Y%=A$:=0 > 1:!X%=:=0 H 2:=!X%:=0 R 5:X%?4=?!X%:=0 \ 6:?!X%=X%?4:=0 f 7: !X%,X%!2,X%!4,X%!6:=0 pV 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 z 14:$X%=$:=0  15:$=$X%:=0  Y%=X%256:A%=(&FFF1)&FF  =A% : ݤmos_byte K A%>123:A%<127:?escflg%=128*(A%1):"FX15" : Clear/Set/Ack Escape A A%=&7F:A%=5:X%=ctrl%:A%=mos_args:X%=?X%:Y%=X%:=&7F : =EOF G 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:=&A0 : =ADVAL(7) $? A%=&80:X%=8:ȗ A%,X%,A%:Y%=X%256:=&A0 : =ADVAL(8) .? A%=&80:X%=9:ȗ A%,A%,X%:Y%=X%256:=&A0 : =ADVAL(9) 8A A%=0:X%=32:=A% : =HOST B7 A%=&87:X%=(,):Y%=:=A% : =MODE L A%=&A0 V Ȏ X% `5 0,128:ș "GetRgnBox",@vdu%!60,ctrl%:X%=ctrl%!0 j5 2,129:ș "GetRgnBox",@vdu%!60,ctrl%:X%=ctrl%!4 t5 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 $ 11,135:X%=@vdu%!32 @vdu%!220  12,136:X%=2*@vdu%!0  14,137:X%=2*@vdu%!4  16,138:X%=2*@vdu%!8 E 18,139:ș "GetRgnBox",@vdu%!60,ctrl%:X%=2*(ctrl%!12-@vdu%!12-1)  20,142:X%=@vdu%!16 C 22,143:ș "GetRgnBox",@vdu%!60,ctrl%:X%=(ctrl%!12-@vdu%!20-1)  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 2+ 92,152:X%=3-(@vdu%?66-7)2:X%<0:X%=1 < 96,3:X%=@vdu%?73 F PX%=0 Z dY%=X%256:=&A0 n x : 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 Ȏ r%(1)  16:A%=138  18:A%=139  20:A%=142  22:A%=143  36:A%=144  38:A%=145  77:A%=148  80:A%=149  83:A%=150  87:A%=155  88:A%=156 " 89:A%=153 , 90:A%=154 6 91:A%=151 @ 92:A%=152 J 96:A%=3 T ^!A%=X%: A%<128:X%=0:Y%=0:=&A0 h r?!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) : & > 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() (F;Keep fn_frombbc(), fn_tobbc(), fn_unixtodos(), fn_dostounix() 2: <: F%ݤfn_bbctodos(A$):A%,B%,H%:H%=32 P%ݤfn_bbctounix(A$):A%,B%,H%:H%=8 Z%ݤfn_frombbc(A$):A%,B%,H%:H%=os% dA$=""(H%40)=0:=A$ nLA$,1)=":":A%=A$+".","."):A$=A$,2,A%-2)+":"+A$,A%-(A$,A%+1,1)="$")) x A%=0::A%=A%+1:B%=A$,A%,1) 2(B%=35B%=63):A$=A$,A%-1)+(B%28)+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) ,B%="&":A$=A$,A%-1)+"%HOME%"+A$,A%+1) A%>A$:=A$ : Fݤfn_fromunix(A$):(os%40)=8:=A$ (os%40)=0:=fn_unixtobbc(A$) Bݤfn_fromdos(A$):(os%32):=A$ (os%40)=0:=fn_dostobbc(A$) Dݤfn_tounix(A$):(os%40)=8:=A$ (os%40)=0:=fn_bbctounix(A$) @ݤfn_todos(A$):(os%32):=A$ (os%40)=0:=fn_bbctodos(A$) "ݤfn_unixtodos(A$) ,ݤfn_dostounix(A$) 6A$,"/")+A$,"\")=0:=A$ @Z A%,B%:A%=0::A%=A%+1:B%=A$,A%,1):B%="/"B%="\":A$=A$,A%-1)+(B%115)+A$,A%+1) JA%>=A$:=A$ T: ^%ݤfn_dostobbc(A$):A%,B%,H%:H%=32 h%ݤfn_unixtobbc(A$):A%,B%,H%:H%=8 r#ݤ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) 2(B%=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$ : " > 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 , -------------------------------------- 7ݤfn_root: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 j5ș"FindFirstFile",f_name(A$),dir%sh%:sh%=-1:=0 t5ș"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$ :