; ÍÕØÃÈÁÔ®ÁÃÔ v.0.0››; Multi-user chat sample program for›; the Multiplexer!››; Original BASIC code by:›; Robert Puff (?)›; Computer Software Services, 1990››; Action! conversion and more features:›; Bill Kendrick›; New Breed Software, 1995›››; Chat commands:›; Msg Send Msg to all›; /User Msg Send Msg to User›; /W Show who is online›; /Q Quit››INCLUDE "D3:RUNTIME.ACT"›››; Çìïâáìóº›Char Array Name(21),Msg(128),Q(130),› Who(21)›Byte Node,Done›Card OError›Byte KeyCode=764,BufLen=747›Byte Chn=[1],MsgPipe=[20],› NamePipe=[28],LocPipe=[36]››Proc MuxErr()› Byte ErrV=195›› Print("Error ")› PrintB(ErrV)› PrintE(" accessing M: device!")› Error=OError›Return››; ͺ ØÉÏ ãáìì›Proc MXIO(Byte Cmd, Aux1, Aux2)› XIO(Chn,0,Cmd,Aux1,Aux2,"M:")›Return››; ͺ Óôáôõó ãáìì›Proc MStatus()› MXIO(13,0,0)›Return››; ͺ ¢×èáô îïäå áí É¿¢ ãáìì››Byte Func GetNode(Byte A Byte B Byte C)›Return(C-1)››Byte Func MNodeNum()› Byte N›› MXIO(13,0,0)› N=GetNode()›Return(N)››; Ãáóå­éçîïòéîç óôòéîç ãïíðáòå›Char Func UCase(Char C)› If C>='a And C<='z Then› C=C-32› Fi›Return(C)››Byte Func SUCCompare(Char Array S1, S2)› Byte V› Char Array X1(130), X2(130)›› For V=0 To S1(0) Do› X1(V)=UCase(S1(V))› Od› For V=0 To S2(0) Do› X2(V)=UCase(S2(V))› Od›› V=SCompare(X1,X2)›Return(V)›››; Óðåãéáì íåóóáçå›Proc SpecialMsg()› Byte X›› For X=0 To 7 Do›; If X<>Node Then› ; It's not us› MXIO(LocPipe+X,0,0)› MStatus()› If BufLen<>0 Then› InputSD(Chn,Q)› If SCompare(Q,"In chat")=0 Then› ; They're in chat› MXIO(MsgPipe+X,0,128)› PrintD(Chn,Name)› PutD(Chn,32)› PrintDE(Chn,Msg)›; MXIO(18,0,0)› Fi› Fi›; Fi› Od›Return››; Óåîä íåóóáçå›Proc SendMsg()› Byte X,Ok,Sent›› Sent=0› For X=0 To 7 Do› If X<>Node Then› ; It's not us› Ok=0› If Who(0)=0 Then› ; Ok if we talk to all› Ok=1› Else› ; And ok if it's our dest user› MXIO(NamePipe+X,0,0)› MStatus()› If BufLen<>0 Then› InputSD(Chn,Q)› If SUCCompare(Q,Who)=0 Then› Ok=1› Fi› Fi› Fi›› ; Ok to send it?› If Ok=1 Then› MXIO(LocPipe+X,0,0)› MStatus()› If BufLen<>0 Then› InputSD(Chn,Q)› If SCompare(Q,"In chat")=0 Then› ; They're in chat› Sent=1› MXIO(MsgPipe+X,0,128)› ; *privt* specl› If Who(0)=0 Then› PrintD(Chn,"<")› Else› PrintD(Chn,"*")› Fi› PrintD(Chn,Name)› If Who(0)=0 Then› PrintD(Chn,"> ")› Else› PrintD(Chn,"* ")› Fi› PrintDE(Chn,Msg)›; MXIO(18,0,0)› Fi› Fi› Fi› Fi› Od› ; Did we even send it?› If Sent=0 Then› If Who(0)=0 Then› PrintE("Nobody else is here!")› Else› Print(Who)› PrintE(" isn't here!")› Fi› Fi› Put('>)›Return››; Óåôõð›Proc Setup()› Byte Ok,X›› Graphics(0)› PokeC(82,9984)› PokeC(709,15)› Poke(712,2)›› PrintE("×åìãïíå ôï ÍÕØÃèáô")› PrintE("Original BASIC code: CSS 1990")› PrintE("Action! conversion: NBS 1995")› PutE()›› Close(Chn)› OError=Error› Error=MuxErr› Open(Chn,"M:",12,0)› Node=MNodeNum()›› ; Flush our pipes (just in case)› MXIO(LocPipe+Node,0,0)› MXIO(18,0,0)› MXIO(NamePipe+Node,0,0)› MXIO(18,0,0)› MXIO(MsgPipe+Node,0,0)› MXIO(18,0,0)›› Print("Your node is:")› PrintBE(Node+1)› PutE()›› Do› ; Get your username› PrintE("What is your name?")› InputS(Name)›› Ok=1› For X=1 To Name(0) Do› If Name(X)=32 Then› PrintE("No spaces allowed!")› PutE()› Ok=0› X=254› ElseIf Name(X)='/ Then› PrintE("No slashes allowed!")› PutE()› Ok=0› X=254› Fi› Od›› If Ok=1 Then› ; Make sure that username doesn't› ; already exist!› For X=0 To 7 Do› MXIO(NamePipe+X,0,0)› MStatus()› If BufLen<>0 Then› InputSD(Chn,Q)› If SUCCompare(Q,Name)=0 Then› PrintE("Sorry! That name is in use!")› PutE()› Ok=0› X=254› Fi› Fi› Od› Fi› Until Ok=1 Od›› ; Store your username› MXIO(NamePipe+Node,0,128)› PrintDE(Chn,Name)› MXIO(18,0,0)›› ; You're in the chat area› MXIO(LocPipe+Node,0,128)› PrintDE(Chn,"In chat")› MXIO(18,0,0)›› Done=0›› PutE()› SCopy(Msg,"has joined!")› SpecialMsg()›Return››; ×èï éó ïî›Proc WhoIsOn()› Byte X›› PrintE("The following people are online:")›› For X=0 To 7 Do› MXIO(NamePipe+X,0,0)› MStatus()› If BufLen<>0 Then› ; Get name› InputSD(Chn,Q)› MXIO(LocPipe+X,0,0)› MStatus()› If BufLen<>0 Then› ; Get location› InputSD(Chn,Msg)› › Print("Node #")› PrintB(X+1)› Print(": ")› Print(Q)› Print(" is ")› PrintE(Msg)› Fi› Fi› Od› PutE()› Put('>)›Return››; Çåô íåóóáçå æòïí Íº›Proc GetAnyMessage()› MXIO(MsgPipe+Node,0,0)› MStatus()› If BufLen<>0 Then› Put('~)› InputSD(Chn,Msg)› PrintE(Msg)› Put('>)› Fi›Return››; Óåîä íåóóáçå æòïí ëåùâïáòä›Proc SendAnyMessage()› Byte A,L,NameDone,Ok› Char Array Msg2(128)›› If KeyCode<255 Then› InputS(Msg)› If Msg(0)<>0 Then› If SCompare(Msg,"/q")=0 Or› SCompare(Msg,"/Q")=0 Then› ; /Q = quit› Done=1› ElseIf SCompare(Msg,"/w")=0 Or› SCompare(Msg,"/W")=0 Then› ; /W = who is on› WhoIsOn()› Else› Who(0)=0› If Msg(1)='/ Then› ; /name = private› NameDone=0› L=0› For A=2 To Msg(0) Do› If Msg(A)=32 And NameDone=0 Then› NameDone=1› L=0› Else› If NameDone=0 Then› L=L+1› Who(L)=Msg(A)› Who(0)=L› Else› L=L+1› Msg2(L)=Msg(A)› Msg2(0)=L› Fi› Fi› Od› SCopy(Msg,Msg2)› Fi›› ; Don't let them send private› ; messages to themselves!!› Ok=1› MXIO(NamePipe+Node,0,0)› MStatus()› If BufLen<>0 Then› InputSD(Chn,Q)› If SUCCompare(Q,Who)=0 Then› Ok=0› PrintE("Don't talk to yourself!")› Fi› Fi› If Ok=1 Then› SendMsg()› Else› Put('>)› Fi› Fi› Else› Put('>)› Fi› Fi›Return››; Åøéô›Proc Xit()› SCopy(Msg,"has left!")› SpecialMsg()›› ; Flush our pipes› MXIO(LocPipe+Node,0,0)› MXIO(18,0,0)› MXIO(NamePipe+Node,0,0)› MXIO(18,0,0)› MXIO(MsgPipe+Node,0,0)› MXIO(18,0,0)› Close(Chn)›Return›››; Íáéî›Proc Main()› Setup()› WhoIsOn()›› Do› GetAnyMessage()› SendAnyMessage()› Until Done=1 Od›› Xit()›Return››