> SerialServ 1.04 ver$="0.00": 11/2/90 :ver$="0.01": 19/8/96 Added TAPfile support on Loading (Hver$="0.02": 28-7-97 Compact serial system won't receive zero bytes 28ver$="1.00": 28-03-98 Compact NUL-NUL problem fixed <+ver$="1.02": 30-03-98 Main loop tidied FBver$="1.04": 02-04-98 Was SpecServ; input scans for *commands PO&87:5"Spectrum/BBC fileserver "ver$'3"with local keyboard for spectrum" Z *|SerTerm d*FX3 nInit::err:end: x'"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:off:*FX4  *FX220,27  : "on:*FX2,1 , *FX3 6 *FX181,1 @ J: Toff:*FX2 ^ *FX3 h *FX181,1 r |: Init:*FX181,1 0 ctrl%30,data%100,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 K'4"f0 to clear, f0+Shift to quit"'3"Cursors send CHR$135 to CHR$139"  *FX15 *FX220,128  *FX4,1  : 5ݤfx(A%,X%):Y%:Y%=X%256:=((&FFF4)&FFFF00)256 Bݤfile(A$,A%):$data%=A$:?X%=data%:X%?1=data%256:=(&FFDD)&FF #ݤh0(A%,N%)="0000000"+~A%,N%) : 2ݤdo:X%=ctrl%:Y%=X%256:":";:f$=input:A%=f$ &I%="*CDEHILRSX",A%):I%>1:"*CATDIRERASEHELPINFOLOADRENAMESAVEEXIT","01020508131721253135",2*I%-1,2),"1335444644",I%,1)); 0"A%>63:"FX2,1":" "f$:*FX2,2 :_I%="DER",A%):I%:f$="DIRDELETERENAME","010410",2*I%-1,2),"366",I%,1))+" "+f$:A%="D" D7A%="*":"FX3,3":comm%=:f$:93:comm%=:"FX3":=0 NA%="D":f$:=0 XA%="C":Cat:=0 bKA%="H":reply(0,"Cat Dir Erase Help Info Load Rename Save eXit",):=0 lA%="I":Info:=0 vA%="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$ : " Needs to use INKEY, not GET:  & Also, how to specify TAP output? Save:*FX2,1  .start%=+256*:8"Start: &"h0(start%,4) H,prog%=+256*:"Program: &"h0(prog%,4); R0autoline%=+256*:5"Autostart: ";autoline% \5load%=start%:exec%=prog%:type%=0:load%=autoline% f/type%=1 type%=2:load%=prog%:exec%=start% p5load%=load%+type%*&10000:exec%=exec%+type%*&10000 z%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 6A%=file(f$,5):load%=X%!2:exec%=X%!6:length%=X%!10 $tap%=(load%&FFFFFF00)=&FFF11D00 ;A%=1:tap%:length%<25:reply(214,f$+" too short",): .reply(214,f$+" not found",A%<>1):A%<>1: type%=(load%&30000)&10000 in%=(f$):tap%:TapInfo 9start%=load%&FFFF:prog%=exec%&FFFF:autoline%=start% 3type%=1 type%=2:start%=prog%:prog%=autoline% &"Type ";type%;" (";ft$(type%);")" :"Length: &"h0(length%,4);8"Start: &"h0(start%,4) 7"Program: &"h0(prog%,4);5"Autostart: ";autoline% $ *FX3,7 .*type%,length%;start%;prog%;autoline%; 8#length%:z%=1length%:#in%: B#in%:in%=0:*FX3 L V: ` TapInfo j$A%=#in%+#in%+#in%:type%=#in% tA%=112:prog%=#in%: ~/load%=#in%+256*#in%:exec%=#in%+256*#in% /A%=#in%+#in%+#in%+#in%:length%=#in%-25  : Cat:*FX3,3 f$<>"":f$=" of "+f$  0;"Catalog";f$;(21- 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  : ; Needs to interrogate TAP files for "real" information  Info 8A%=file(f$,5):A%=0:reply(214,f$+" 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 2"A%=2:reply(0,"Dir. "+f$,): <]reply(0,f$,10)+10," "),10)+" "+h0(start%,6)+" "+h0(exec%,6)+" "+h0(length%,6),): F P: Z(reply(err%,A$,F%):err%=13:err%=14 d *FX3,7 nF%:err%;A$; x13;:*FX3  : [ݤ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): Dump:*FX2,1 ;A%=:" "h0(A%,2);:8,8,10:A%>31 A%<>127:A% 32 11,9,32:<1:  0:*FX2