> SerialServ 1.05 ver$="0.00": 11-Feb-1990 >ver$="0.01": 19-Aug-1996 Added TAPfile support on Loading (Lver$="0.02": 28-Jul-1997 Compact serial system won't receive zero bytes 2;ver$="1.00": 28-Mar-1998 Compact NUL-NUL problem fixed <.ver$="1.02": 30-Mar-1998 Main loop tidied FEver$="1.04": 02-Apr-1998 Was SpecServ, input scans for *commands P@ver$="1.05": 15-May-1998 Can specify new addresses for Save Z: dO&87:5"Spectrum/BBC fileserver "ver$'3"with local keyboard for Spectrum" nfx(0,1)=5:*SerFix xInit::err:end: '"Ready...":*FX15 on:do:end: : ݤerr:comm%:*FX3 F:comm%:'93; reply(,error,):<128 <>17:" at line "; "FX3":CloseOut:CloseIn =(<128 <>17)(=17 -1) : $CloseIn:in%:A%=in%:in%=0:#A%  (CloseOut:out%:A%=out%:out%=0:#A%  : end:nid%:?&D71=nid%  off:*FX4  *FX220,27 " ,: 6on:*FX2,1 @ *FX3 J *FX181,1 T ^: hoff:*FX2 r *FX3 | *FX181,1  : Init:*FX181,1 / ctrl%31,data%99,ft$(3):X%=ctrl%:Y%=X%256 Gft$(0)="Program":ft$(1)="Numbers":ft$(2)="Character":ft$(3)="Bytes" =out%=0:in%=0:P6502%=fx(132,0):P6502%<&8000:P6502%=&8000 P6502%=(P6502%?6 &F)=0 Inid%=0:A%=fx(0,1):A%>2 A%<6:fx(130,0)=&FFFF:nid%=?&D71:?&D71=64 K'4"f0 to clear, f0+Shift to quit"'3"Cursors send CHR$135 to CHR$139"  *FX7,7  *FX8,7  *FX15 *FX220,128  *FX4,1 *FX3  &: 05ݤfx(A%,X%):Y%:Y%=X%256:=((&FFF4)&FFFF00)256 :Bݤfile(A$,A%):$data%=A$:?X%=data%:X%?1=data%256:=(&FFDD)&FF D#ݤh0(A%,N%)="0000000"+~A%,N%) N: X2ݤdo:X%=ctrl%:Y%=X%256:":";:f$=input:A%=f$ bI%="*CDEHILMRSX",A%):I%>1:"*CATDIRERASEHELPINFOLOADMKDIRRENAMESAVEEXIT","0102050813172125303640",2*I%-1,2),"13354445644",I%,1)); lIA%>63:"FX2,1":"FX3,86":" "f$:"FX3":f$=fn_unspec(f$):f$:*FX2,2 vgI%="DEMR",A%):I%:f$="DIRDELETECDIRRENAME","01041014",2*I%-1,2),"3646",I%,1))+" "+f$:A%="D" 7A%="*":"FX3,3":comm%=:f$:93:comm%=:"FX3":=0 "A%="D":f$:reply(0,"",):=0 A%="C":Cat:=0 QA%="H":reply(0,"Cat Dir Erase Help Info Load Mkdir Rename Save eXit",):=0 A%="I":Info:=0 A%="L":Load:=0 A%="S":Save:=0 /A%="X":reply(0,"Exiting",):'"Exit:":= %reply(254,"Not recognised",):=0 : !ݤinput:A$="":"FX2,2":*FX3,3 :A%=(0):A%<>-1:A% (-2):"FX2,1":A%=:*FX2,2 ;A%>31 A%<127 A$<250:A$=A$+A%:A$>1 A$="*":A%  3(A%=127 A%=8) A$<>"":A$=A$,A$-1):8,32,8 1 A%=10 A%=13 (A$=1 A$<>"*"):A$=42:  *FX3 *=A$ 4: >" Needs to use INKEY, not GET: H& Also, how to specify TAP output? R "Sfilename" \< "Sfilename start prog auto type", specified in decimal fSave:*FX2,1 p:addr$="":A%=f$," "): A%:addr$=f$,A%+1):f$=f$,A%-1) z"": "Set addresses to: ";addr$ @ addr$<>"":start% =addr$:addr$=addr$+" ",addr$," ")+1) @ addr$<>"":prog% =addr$:addr$=addr$+" ",addr$," ")+1) @ addr$<>"":autoline%=addr$:addr$=addr$+" ",addr$," ")+1) @ addr$<>"":type% =addr$:addr$=addr$+" ",addr$," ")+1)  addr$="" 5load%=start%:exec%=prog%:type%=0:load%=autoline% /type%=1 type%=2:load%=prog%:exec%=start% 5load%=load%+type%*&10000:exec%=exec%+type%*&10000 %length%:z%=1length%:#out%,: E#out%:out%=0:A%=file(f$,5):X%!2=load%:X%!6=exec%:A%=file(f$,1)  *FX2,2  $: . Load 8Gfn$=f$:A%=file(f$,5): A%=0:TapName:A%=0: f$<>fn$:A%=file(f$,5) BHload%=X%!2:exec%=X%!6:length%=X%!10:tap%=(load%&FFFFFF00)=&FFF11D00 L1):A%<>1: `type%=(load%&30000)&10000 jin%=(f$):tap%:TapInfo t9start%=load%&FFFF:prog%=exec%&FFFF:autoline%=start% ~3type%=1 type%=2:start%=prog%:prog%=autoline% PrInfo:*FX3,7 *type%,length%;start%;prog%;autoline%; #length%:z%=1length%:#in%: #in%:in%=0:*FX3  :  PrInfo &"Type ";type%;" (";ft$(type%);")" :"Length: &"h0(length%,4);8"Start: &"h0(start%,4) 7"Program: &"h0(prog%,4);5"Autostart: ";autoline%  :  TapName  )A%=f$:A%=A%-1:A%=0 f$,A%,1)="." $f$=f$,A%)+f$,A%+1)+"/tap",10)  (: 2 TapInfo <$A%=#in%+#in%+#in%:type%=#in% FA%=112:prog%=#in%: P/load%=#in%+256*#in%:exec%=#in%+256*#in% Z/A%=#in%+#in%+#in%+#in%:length%=#in%-25 d n: xCat:*FX3,3 f$<>"":f$=" of "+f$  0;"Catalog";f$;(25- f$);  X%!9=0: !X%!1=data%:X%!5=1:A%=8:&FFD1 >X%!5=0:?(data%+?data%+1)=13:f$=$(data%+1):f$;(16- f$); X%!5<>0:13;:*FX3  :  Info Gfn$=f$:A%=file(f$,5): A%=0:TapName:A%=0: f$<>fn$:A%=file(f$,5) *A%=0:reply(214,fn$+" not found",): 4start%=X%!2:exec%=X%!6:length%=X%!10:attr%=X%!14 M(start%&FFFFFF00)=&FFF11D00 length%>25:in%=(f$):TapInfo:#in%:in%=0 2A%=2:reply(0,fn$+10," "),10)+" ",): Yreply(0,fn$+10," "),10)+" "+h0(start%,6)+" "+h0(exec%,6)+" "+h0(length%,6),):  ": ,(reply(err%,A$,F%):err%=13:err%=12 6F%:err%:"Error ";A$ @ *FX3,7 JF%:err%;A$; T13;:*FX3 ^ h: r[ݤerror: A%,A$:P6502%:A%=1+(!&FD &FFFF):A$=""::A$=A$+?A%:A%=A%+1:?A%=0:=A$ =$ |: KSetAddr(A$,ld%,ex%):X%!2=ld%:A%=file(A$,2):X%!6=ex%:A%=file(A$,3):  ݤfn_unspec(B$): B$="":="_" ?B%,C$:A$="""#$%&:<>*./@[\]^{|}~":C$="'?S;+;()+/.=(/)'(')'" # A%=1 B$:B%=A$,B$,A%,1)) ) B%:B$=B$,A%-1)+C$,B%,1)+B$,A%+1) > B$,A%,1)<"!" B$,A%,1)>"~":B$=B$,A%-1)+"_"+B$,A%+1)  :=B$ Dump:*FX2,1 ;A%=:" "h0(A%,2);:8,8,10:A%>31 A%<>127:A% 32 11,9,32:<1:  0:*FX2