10  REM ****  CHAT  Real-Time, Multi-User communications program ****
20  REM ****  Written by Brad Zaller, SMUHSD  July/August '82    ****
30  FILES *,*
40  DIM A$[84],B$[84],I$[128],I1$[128],N$[21],N1$[21],O$[100],T$[67]
50  DIM F0$[11],F1$[11],Z0$[5],M[32,8],N[32,8],S[8]
60  DIM F$[11],D$[42],M$[36]
70  Z0$=".A101"
75  L=0
80  MAT S=ZER
90  MAT M=ZER
100  MAT N=ZER
120  SYSTEM T$,"TIM"
130  ENTER #P
150  S[6]=(POS("A0A1X0X3Q4Q5",T$[1,2]) <> 0)
230  PRINT LIN(1);"*** CHAT 2.1 ***"
260  F1$="CINFOF"
270  F1$[LEN(F1$)+1]=Z0$
280  ASSIGN F1$,1,R, NR 
290  IF R THEN 390
300  PRINT LIN(1);"Info (Y/N): ";
310  LINPUT I$
320  I$=UOS$(I$)
330  IF I$[1,3]="//S" THEN 9999
340  IF I$[1,1]#"Y" THEN 390
350  IF  END #1 THEN 390
360  READ #1;I$
370  PRINT I$
380  GOTO 360
390  REM
400  F1$="MCF"
410  F1$[LEN(F1$)+1]=Z0$
420  ASSIGN F1$,1,R, NR 
430  IF R=0 THEN 460
440  PRINT "Cannot assign file ";F1$;".  Code:";R
450  GOTO 9999
460  LOCK #1,R
462  IF R THEN 460
463  F=1
464  GOSUB 6000
465  F=0
466  MAT N=M
468  UNLOCK #1,R
469  PRINT LIN(1);"Name or Handle: ";
470  LINPUT I$
480  GOSUB 5000
490  IF POS(I$[1,3],"//S//s") THEN 9999
500  IF LEN(I$)>0 AND LEN(I$)<15 THEN 540
510  PRINT LIN(1);"Please input the name or handle you want to use, not exceeding"
520  PRINT "14 characters in length."
530  GOTO 460
540  N1$=T$[15,16]
542  N1$[3]=I$
543  N1$[LEN(N1$)+1]=T$[1,4]
544  N1$[LEN(N1$)+1]='1
545  IF LEN(N1$)=21 THEN 549
546  FOR X=LEN(N1$)+1 TO 21
547  N1$[X,X]=" "
548  NEXT X
549  LOCK #1,R
560  IF R THEN 549
570  GOSUB 6000
580  GOSUB 7000
590  UNLOCK #1,R
600  PRINT "Select channel (1-4): ";
610  LINPUT I$
615  IF LEN(I$)=0 THEN 700
620  I$=UOS$(I$)
630  IF I$[1,3]="//S" THEN 9999
640  CONVERT I$ TO S[1],700
650  IF S[1]=0 OR S[1]>5 OR S[1]>4 AND S[6]=0 OR S[1]#INT(S[1]) THEN 700
660  IF S[1]<0 AND S[6]=0 THEN 700
670  IF S[1]>0 THEN 690
680  S[7]=1
685  S[1]=ABS(S[1])
690  GOTO 770
700  PRINT LIN(1);"Input the channel you wish to communicate on as an"
710  PRINT "integer between 1 and 4 inclusive.";
720  IF S[6]=0 THEN 750
730  PRINT "  Negate the channel"
740  PRINT "to login invisibly.  Channel 5 is priviliged."
750  PRINT LIN(2);
760  GOTO 600
770  S[1]=S[1]+S[1]/10
785  S[5]=1
790  LOCK #1,R
800  IF R THEN 790
810  S[2]=TIM(1)
820  S[3]=TIM(0)
830  S[4]=TIM(4)
840  GOSUB 6000
842  R2=R1
844  I2=I1
850  FOR X=1 TO 8
860  M[P+1,X]=S[X]
870  NEXT X
875  CONVERT P TO F0$
890  F0$[LEN(F0$)+1]=Z0$
900  PURGE R,F0$
910  CREATE R,F0$,5
920  IF R=0 THEN 950
930  PRINT '7"Cannot create file ";F0$;".  Code:";R
940  GOTO 9999
950  ASSIGN F0$,2,R, PR 
960  IF R=0 THEN 990
970  PRINT '7"Cannot assign file ";F0$;".  Code:";R
980  GOTO 9999
990  READ #1,1
995  MAT  PRINT #1;M
1000  PRINT #1;R1,I1
1010  READ #1,4
1030  ADVANCE #1;P,R
1060  UPDATE #1;N1$
1070  UNLOCK #1,R
1080  A$="Time in: 00:00:00"
1090  CONVERT S[2] TO A$[10+(S[2]<10),11]
1100  CONVERT S[3] TO A$[13+(S[3]<10),14]
1110  CONVERT S[4] TO A$[16+(S[4]<10),17]
1120  PRINT A$
2000  IF  END #1 THEN 2600
2010  LOCK #1,R
2020  IF R THEN 2010
2030  GOSUB 6000
2040  UNLOCK #1,R
2050  IF R1=R2 AND I1=I2 THEN 2500
2060  REM
2070  READ #1,R2
2090  ADVANCE #1;I2,R
2095  IF R THEN 2600
2100  READ #1;A$
2102  R2=REC(1)
2103  I2=ITM(1)
2104  GOTO 2120
2120  B$=CHR$(INT(M[P+1,1]+48))
2125  IF A$[1,2]=T$[15,16] THEN 2050
2127  IF POS(A$,'20) AND POS(A$[4,5],T$[15,16]) THEN 2220
2130  IF POS(A$[POS(A$,'1)-1,POS(A$,'1)-1],B$)=0 AND POS(A$[POS(A$,'1)-1,POS(A$,'1)-1],"0")=0 AND M[P+1,8]=0 THEN 2050
2140  READ #1,4
2150  IF A$[1,2]="00" THEN 2190
2155  CONVERT A$[1,2] TO X1
2160  FOR X=1 TO X1
2170  READ #1;B$
2180  NEXT X
2190  READ #1;N$
2200  PRINT N$[3,POS(N$,'1)-5];": ";A$[3,POS(A$,'1)-2]
2210  GOTO 2050
2220  REM *** Remote command handler ***
2230  GOTO NUM(A$[POS(A$,'1)-1,POS(A$,'1)-1])-48 OF 2240,2240,2290,2310
2240  A=BRK(0)
2250  PRINT '7":::User purged by System Operator:::"
2260  L=0
2270  IF A$[POS(A$,'1)-1,POS(A$,'1)-1]="1" THEN 9000
2280  L=1
2285  GOTO 9000
2290  A=BRK(0)
2300  L=-1
2305  GOTO 2050
2310  A=BRK(1)
2320  L=0
2330  GOTO 2050
2500  ENTER 4,R,I$
2510  IF R>-1 THEN 3000
2520  GOTO 2000
2600  REM *** End-Of-File occured - rewind ***
2610  READ #1,6
2620  GOTO 2100
3000  REM *** Transmit mode ***
3050  READ #2,1
3055  T=0
3060  I$="  "
3062  PRINT ":";
3065  ENTER 90,R,I$[3]
3070  PRINT 
3075  IF R=-256 OR LEN(I$)=2 THEN 3250
3076  IF R>-256 THEN 3080
3077  PRINT LIN(1);'7"Transmission error - Reenter."
3078  GOTO 3060
3080  GOSUB 5000
3090  I1$=UOS$(I$)
3110  IF LEN(I$)<79 THEN 3140
3120  PRINT LIN(1);'7"Input cannot exceed 78 characters - Reenter."
3130  GOTO 3060
3140  IF I$[3,4]="//" THEN 4000
3150  I$[1,2]=T$[15,16]
3160  I$[LEN(I$)+1]=CHR$(INT(M[P+1,1]+48))
3170  I$[LEN(I$)+1]='1
3180  IF LEN(I$)=82 THEN 3220
3190  FOR X=LEN(I$)+1 TO 82
3200  I$[X,X]=" "
3210  NEXT X
3220  PRINT #2;I$
3230  T=T+1
3240  IF T<10 THEN 3060
3250  GOSUB 3800
3255  GOTO 2000
3800  REM *** Enter transmission into MCF ***
3805  IF T=0 THEN 3949
3810  READ #2,1
3820  LOCK #1,R
3830  IF R THEN 3820
3840  READ #1,1
3845  MAT  READ #1;M
3850  READ #1;R1,I1
3860  IF  END #1 THEN 3950
3870  READ #1,R1
3880  ADVANCE #1;I1,R
3890  IF R THEN 3950
3900  IF  END #2 THEN 3930
3902  IF  END #1 THEN 3990
3905  READ #2;I$
3910  UPDATE #1;I$
3920  GOTO 3905
3930  R1=REC(1)
3935  I1=ITM(1)
3940  READ #1,1
3941  MAT  PRINT #1;M
3942  PRINT #1;R1,I1
3944  UNLOCK #1,R
3945  FOR X=1 TO 5
3946  PRINT #2,X; END 
3947  NEXT X
3948  UNLOCK #1,R
3949  RETURN 
3950  REM *** End-Of-File MCF - Rewind it ***
3960  READ #1,6
3970  ADVANCE #1;R,R
3980  GOTO 3900
3990  READ #1,6
3995  GOTO 3910
4000  REM *** //-Command handler ***
4003  IF LEN(I1$)<7 THEN 4018
4006  I1$=I1$[3]
4009  GOTO INT((POS("//CHA//TIM//NAM//WHO//SHO//STO//HEL",I1$[1,5])+4)/5) OF 4033,4072,4090,4180,4201,9000,4750
4012  IF M[P+1,6]=0 THEN 4018
4015  GOTO INT((POS("//DIS//SPY//HOL//BRE//ALL//VIS",I1$[1,5])+4)/5) OF 4240,4306,4345,4402,4462,4600
4018  PRINT LIN(1);'7"Illegal //-command."
4021  GOTO 2000
4024  PRINT LIN(1);'7"Illegal format."
4027  GOTO 2000
4030  STOP 
4033  REM *** Change channel ***
4036  IF POS(I$,"-") AND LEN(I$)#POS(I$,"-") THEN 4057
4039  IF ABS(INT(S[1]))#S[1] OR S[1]>4 THEN 4063
4042  PRINT LIN(1);"Channel (1-4): ";
4045  LINPUT I$
4048  I$=UOS$(I$)
4051  IF LEN(I$)=0 THEN 2000
4054  IF I$[1,3]="//S" THEN 4000
4057  CONVERT I$[POS(I$,"-")+1] TO S[1],4063
4059  IF S[1]=5 AND S[6]=0 THEN 4067
4060  IF ABS(INT(S[1]))#S[1] OR S[1]>5 OR S[1]=0 THEN 4063
4061  S[1]=S[1]+S[1]/10
4062  GOTO 4480
4063  PRINT LIN(1);"Input the channel you wish to change to as an integral"
4066  PRINT "value between 1 and 4 inclusive.  ";
4067  PRINT "Channel 5 is priviliged."
4069  GOTO 4042
4072  REM *** Print time stats ***
4075  SYSTEM T$,"TIM"
4078  PRINT LIN(1);T$
4081  GOSUB 8100
4084  PRINT D$
4087  GOTO 2000
4090  REM *** Change Name/Handle ***
4093  IF POS(I$,"-")=0 OR LEN(I$)=POS(I$,"-") THEN 4105
4096  I$=I$[POS(I$,"-")+1,LEN(I$)]
4099  GOTO 4123
4102  PRINT LIN(1);'7"Name cannot exceed 14 characters - Reenter."
4105  PRINT LIN(1);"Name: ";
4108  LINPUT I$
4111  GOSUB 5000
4114  I1$=UOS$(I$)
4117  IF LEN(I$)=0 THEN 2000
4120  IF I1$[1,3]="//S" THEN 4000
4123  IF LEN(I$)>14 THEN 4102
4126  N$=T$[15,16]
4129  N$[3]=I$
4132  N$[LEN(N$)+1]=T$[1,4]
4135  N$[LEN(N$)+1]='1
4138  IF LEN(N$)=21 THEN 4150
4141  FOR X=LEN(N$)+1 TO 21
4144  N$[X,X]=" "
4147  NEXT X
4150  LOCK #1,R
4153  IF R THEN 4150
4156  READ #1,4
4159  IF P=0 THEN 4171
4162  FOR X=1 TO P
4165  READ #1;A$
4168  NEXT X
4171  UPDATE #1;N$
4174  UNLOCK #1,R
4177  GOTO 2000
4180  REM *** Who vector ***
4183  LOCK #1,R
4186  IF R THEN 4183
4189  GOSUB 6000
4192  GOSUB 7000
4195  UNLOCK #1,R
4198  GOTO 2000
4201  REM *** Set SHOw parameter ***
4204  IF POS(I1$,"-OFF") OR POS(I1$,"-ON") THEN 4234
4207  PRINT LIN(1);"Show (On/Off): ";
4210  LINPUT I$
4213  GOSUB 5000
4216  IF LEN(I$)=0 THEN 2000
4219  I$=UOS$(I$)
4222  IF POS(I$,"ON") OR POS(I$,"OFF") THEN 4234
4225  PRINT LIN(1);"Select ON or OFF to choose whether or not you want"
4228  PRINT "to view the logins and logouts as they occur."
4231  GOTO 4207
4234  S[5]=(POS(I$,"ON")#0)
4237  GOTO 4480
4240  REM *** Purge a user (BYE optional) ***
4243  IF POS(I$,"-") AND LEN(I$)#POS(I$,"-") THEN 4264
4246  PRINT LIN(1);"Disconnect port (0-31): ";
4249  LINPUT I$
4252  I$=UOS$(I$)
4255  GOSUB 5000
4258  IF LEN(I$)=0 THEN 2000
4261  IF I$[1,3]="//S" THEN 4000
4264  CONVERT I$[POS(I$,"-")+1,LEN(I$) MIN (POS(I$,",")-1)+256*(POS(I$,",")=0)] TO X,4246
4267  IF X=INT(ABS(X)) AND X<32 THEN 4279
4270  PRINT LIN(1);"Input the number of the port you wish to purge from"
4273  PRINT "the program.  Add ',BYE' to disconnect from system."
4276  GOTO 4246
4279  O$=T$[15,16]
4282  O$[3]='20"001"'1"                                                                             "
4285  CONVERT X TO O$[4+(X<10),5]
4288  IF POS(I$,",BYE")=0 THEN 4294
4291  O$[6,6]="2"
4294  PRINT #2,1;O$
4297  T=1
4300  GOSUB 3800
4303  GOTO 2000
4306  REM *** Set SPY parameter ***
4309  IF POS(I1$,"-OFF") OR POS(I1$,"-ON") THEN 4339
4312  PRINT LIN(1);"Spy (On/Off): ";
4315  LINPUT I$
4318  GOSUB 5000
4321  IF LEN(I$)=0 THEN 2000
4324  I$=UOS$(I$)
4327  IF POS(I$,"ON") OR POS(I$,"OFF") THEN 4339
4330  PRINT LIN(1);"Select ON or OFF to choose whether or not you want"
4333  PRINT "to receive transmissions from all channels."
4336  GOTO 4312
4339  S[8]=(POS(I$,"ON")#0)
4342  GOTO 4480
4345  REM *** Hold a user ***
4348  IF POS(I$,"-") AND LEN(I$)#POS(I$,"-") THEN 4369
4351  PRINT LIN(1);"Hold port (0-31): ";
4354  LINPUT I$
4357  I$=UOS$(I$)
4360  GOSUB 5000
4366  IF I$[1,3]="//S" THEN 4000
4369  CONVERT I$[POS(I$,"-")+1] TO X,4375
4372  IF X=INT(ABS(X)) AND X<32 THEN 4384
4375  PRINT LIN(1);"Input the number of the port which you want"
4378  PRINT "to prevent from exiting CHAT (0-31)."
4381  GOTO 4351
4384  O$=T$[15,16]
4385  O$[3]='20"003"'1"                                                                             "
4387  CONVERT X TO O$[4+(X<10),5]
4390  PRINT #2,1;O$
4393  T=1
4396  GOSUB 3800
4399  GOTO 2000
4402  REM *** Break a user ***
4405  IF POS(I$,"-") AND LEN(I$)#POS(I$,"-") THEN 4426
4408  PRINT LIN(1);"Break port (0-31): ";
4411  LINPUT I$
4414  I$=UOS$(I$)
4417  GOSUB 5000
4420  IF LEN(I$)=0 THEN 2000
4423  IF I$[1,3]="//S" THEN 4000
4426  CONVERT I$[POS(I$,"-")+1] TO X,4432
4429  IF X=INT(ABS(X)) AND X<32 THEN 4441
4432  PRINT LIN(1);"Input the number of the port for which you"
4435  PRINT "wish to re-enable the logout routine (0-31)."
4438  GOTO 4408
4441  O$=T$[15,16]
4444  O$[3]='20"004"'1"                                                                             "
4447  CONVERT X TO O$[4+(X<10),5]
4450  PRINT #2,1;O$
4453  T=1
4456  GOSUB 3800
4459  GOTO 2000
4462  REM *** Transmit message to all users ***
4465  IF I$[8,8]#"-" THEN 4024
4468  I$[3]=I$[9]
4471  I$[1,2]=T$[15,16]
4474  I$[LEN(I$)+1]="0"'1
4477  GOTO 3180
4480  REM *** Write matrix S to MCF file ***
4483  LOCK #1,R
4486  IF R THEN 4483
4489  GOSUB 6000
4492  FOR X=1 TO 8
4495  M[P+1,X]=S[X]
4498  NEXT X
4501  READ #1,1
4504  MAT  PRINT #1;M
4507  PRINT #1;R1,I1
4510  UNLOCK #1,R
4513  GOTO 2000
4600  REM *** Set invisibility flag ***
4610  IF POS(I1$,"-OFF") OR POS(I1$,"-ON") THEN 4700
4620  PRINT "Visibility (On/Off): ";
4630  LINPUT I$
4640  GOSUB 5000
4650  IF LEN(I$)=0 THEN 2000
4660  I1$=UOS$(I$)
4670  IF POS(I1$,"ON") OR POS(I$,"OFF") THEN 4700
4680  PRINT LIN(1);"Select ON or OFF to choose whether or not you want"
4690  PRINT "to be visible to other non-priviliged users."
4695  GOTO 4620
4700  S[7]=(POS(I1$,"OFF")#0)
4710  GOTO 4480
4750  REM *** Print valid commands ***
4760  PRINT LIN(1);"   Legal commands:";LIN(1)
4770  PRINT "   //CHAnnel-<new channel>           //NAMe-<new name/handle>"
4780  PRINT "   //SHOw-<on/off>                   //STOp"
4790  PRINT "   //TIMe                            //WHO"
4795  PRINT 
4800  IF M[P+1,6]=0 THEN 3060
4810  PRINT "   Priviliged commands:";LIN(1)
4820  PRINT "   //ALL-<message>                   //BREak-<port #>"
4830  PRINT "   //DISconnect-<port #><,BYE>       //HOLd-<port #>"
4840  PRINT "   //SPY-<on/off>                    //VISibility-<on/off>";LIN(1)
4850  GOTO 3060
5000  REM *** FILTER - Subroutine to filter out control characters ***
5010  REM *** except control-g (Bell) from i$.                     ***
5020  E=0
5030  FOR X=1 TO LEN(I$)
5040  IF NUM(I$[X,X])<32 AND NUM(I$[X,X])#7 THEN 5070
5050  I$[X-E,X-E]=I$[X,X]
5060  GOTO 5080
5070  E=E+1
5080  NEXT X
5090  I$=I$[1,LEN(I$)-E]
5100  RETURN 
6000  REM *** Adjust files ***
6030  READ #1,1
6035  MAT  READ #1;M
6040  READ #1;R1,I1
6050  READ #1,4
6052  IF F#1 THEN 6060
6054  FOR X=1 TO 8
6056  M[P+1,X]=0
6058  NEXT X
6060  FOR X=1 TO 32
6070  READ #1;N$
6080  IF INT(M[X,1])=0 AND INT(N[X,1]) THEN 6150
6090  IF INT(M[X,1])=0 OR X=P+1 AND F#1 THEN 6300
6100  CONVERT X-1 TO F$
6110  F$[LEN(F$)+1]=Z0$
6120  PURGE R,F$
6125  IF R=1 AND INT(M[X,1])#0 AND INT(N[X,1])=0 AND M[P+1,5]=1 THEN 6280
6130  IF R=1 THEN 6300
6140  M[X,1]=INT(M[X,1])/10
6150  IF M[P+1,5]=0 THEN 6300
6160  IF M[X,7]=1 AND M[X,6]=0 THEN 6300
6170  O$="** Logout "
6180  O$[11]=N$[3,POS(N$,'1)-5]
6190  O$[LEN(O$)+1]=" (Port "
6200  O$[LEN(O$)+1]=N$[1,2]
6210  O$[LEN(O$)+1]=", Ch. "
6220  CONVERT INT((M[X,1]-INT(M[X,1]))*10+.0001) TO O$[LEN(O$)+1]
6230  O$[LEN(O$)+1]=")"
6240  PRINT O$
6250  GOTO 6300
6260  IF M[P+1,5]=0 OR M[X,7]=1 AND M[P+1,6]=0 THEN 6300
6280  O$='7"** Login  "
6290  GOTO 6180
6300  NEXT X
6310  MAT N=M
6312  READ #1,1
6313  MAT  PRINT #1;M
6314  PRINT #1;R1,I1
6320  RETURN 
7000  REM *** WHO subroutine - Prints roster of current users ***
7010  REM *** with respect to VISIBILITY and PRIVILIGE flags. ***
7020  REM *** ADJUST subroutine should be executed prior to   ***
7030  REM *** the execution of this subroutine for accuracy.  ***
7040  READ #1,1
7045  MAT  READ #1;M
7050  READ #1;R1,I1
7060  PRINT LIN(1);"Port Chn Name/Handle    Acct Time in";
7070  IF S[6]=1 THEN 7100
7080  PRINT 
7090  GOTO 7110
7100  PRINT "  Options"
7110  READ #1,4
7120  FOR X=1 TO 32
7130  READ #1;N$
7140  IF INT(M[X,1])=0 OR INT(M[X,1])#0 AND M[X,7]=1 AND M[P+1,6]=0 THEN 7330
7150  O$=" 00   0  N              A000 00:00:00"
7160  O$[2,3]=N$[1,2]
7170  CONVERT INT(M[X,1]) TO O$[7,7]
7180  O$[10,POS(N$,'1)+2]=N$[3,POS(N$,'1)-5]
7190  O$[25,28]=N$[POS(N$,'1)-4,POS(N$,'1)-1]
7200  CONVERT M[X,2] TO O$[30+(M[X,2]<10),31]
7210  CONVERT M[X,3] TO O$[33+(M[X,3]<10),34]
7220  CONVERT M[X,4] TO O$[36+(M[X,4]<10),37]
7230  IF S[6]=0 THEN 7320
7240  IF M[X,6]=0 THEN 7260
7250  O$[LEN(O$)+1]=" Priv"
7260  IF M[X,5]=0 THEN 7280
7270  O$[LEN(O$)+1]=" Show"
7280  IF M[X,7]=0 THEN 7300
7290  O$[LEN(O$)+1]=" Invis"
7300  IF M[X,8]=0 THEN 7320
7310  O$[LEN(O$)+1]=" Spy"
7320  PRINT O$
7330  NEXT X
7340  PRINT 
7350  RETURN 
8100  REM *** Subroutine to calculate time and day and ***
8110  REM *** return it through D$.                    ***
8120  DATA 31,28,31,30,31,30,31,31,30,31,30,31
8130  RESTORE 8120
8140  D$="Day  Mon 00, 1900   00:00:00 AM   0000/000"
8150  D1=(TIM(2)+365*TIM(3)+INT((TIM(3)-1)/4))/7
8160  D1=INT(7*(D1-INT(D1))+1.5)
8170  M$="SunMonTueWedThuFriSat"
8180  D$[1,3]=M$[D1*3-2,D1*3]
8190  D=TIM(2)
8200  FOR X=1 TO 12
8210  READ M
8220  M=M+((X=2) MIN (TIM(3)/4=INT(TIM(3)/4)))
8230  IF D <= M THEN 8260
8240  D=D-M
8250  NEXT X
8260  M$="JanFebMarAprMayJunJulAugSepOctNovDec"
8270  D$[6,8]=M$[X*3-2,X*3]
8280  CONVERT D TO D$[11-(D>9),11]
8290  CONVERT TIM(3) TO D$[16,17]
8300  T=TIM(1)-(12*(TIM(1)>12))
8310  CONVERT T TO D$[22-(T>9),22]
8320  CONVERT TIM(0) TO D$[25-(TIM(0)>9),25]
8330  CONVERT TIM(4) TO D$[28-(TIM(4)>9),28]
8340  D$[30,30]=CHR$(65+(15*(TIM(1)>11)))
8350  CONVERT TIM(1)*100+TIM(0) TO D$[36-(TIM(1)>9),38]
8360  CONVERT TIM(2) TO D$[42-(TIM(2)>9)-(TIM(2)>99),42]
8370  RETURN 
9000  REM *** Exit CHAT ***
9010  IF L#-1 THEN 9040
9020  PRINT LIN(1);'7"Exit from CHAT prevented by System Operator.";LIN(1)
9030  GOTO 2000
9040  LOCK #1,R
9045  IF R THEN 9040
9050  READ #1,1
9055  MAT  READ #1;M
9060  READ #1;R1,I1
9080  FOR X=2 TO 8
9090  M[P+1,X]=0
9100  NEXT X
9105  M[P+1,1]=M[P+1,1]-INT(M[P+1,1])
9110  READ #1,1
9115  MAT  PRINT #1;M
9120  PRINT #1;R1,I1
9125  UNLOCK #1,R
9130  ASSIGN *,1
9140  ASSIGN *,2
9150  PURGE R,F0$
9170  A$="Time in : 00:00:00"
9180  CONVERT N[P+1,2] TO A$[11+(N[P+1,2]<10),12]
9190  CONVERT N[P+1,3] TO A$[14+(N[P+1,3]<10),15]
9200  CONVERT N[P+1,4] TO A$[17+(N[P+1,4]<10),18]
9210  PRINT LIN(2);TAB(4);A$
9220  A$="Time out: 00:00:00"
9230  T0=TIM(0)
9240  T1=TIM(1)
9250  T4=TIM(4)
9260  CONVERT T1 TO A$[11+(T1<10),12]
9270  CONVERT T0 TO A$[14+(T0<10),15]
9280  CONVERT T4 TO A$[17+(T4<10),18]
9290  PRINT TAB(4);A$
9300  A$="Total   : 00:00:00"
9310  U4=ABS(T4-N[P+1,4])
9312  IF T4>N[P+1,4] THEN 9320
9314  U4=60-U4
9320  U0=ABS(T0-N[P+1,3])-(T4<N[P+1,4])
9330  U1=ABS(T1-N[P+1,2])-(T0<N[P+1,3])
9370  CONVERT U1 TO A$[11+(U1<10),12]
9380  CONVERT U0 TO A$[14+(U0<10),15]
9390  CONVERT U4 TO A$[17+(U4<10),18]
9400  PRINT TAB(4);A$
9410  PRINT LIN(2);"+++ End Of Session +++"
9420  IF L=0 THEN 9500
9430  SYSTEM X,"BYE"
9500  CHAIN R,"$HELLO",350
9999  END 
