1  REM  ****  HP BASIC PROGRAM LIBRARY  *******************************
2  REM
3  REM        MESSAG:   INTERTERMINAL COMMUNICATOR
4  REM
5  REM        36284 REV  A   6/73
6  REM
7  REM  ****  CONTRIBUTED PROGRAM  ************************************
10  REM MESSAG - INTERTERMINAL COMMUNICATOR
20  DIM M[127],M$[72],T$[14],F$[14],X$[10],Z$[6],T[127],G$[72]
30  FILES MSFILE
40  DEF FNW()=INT((+3)/2)
50  X$="0123456789"
70  D0=180
80  PRINT "INTERTERMINAL COMMUNICATOR"
90  REM DETERMINE NUMBER OF RECORDS IN FILE
100  IF  END #1 THEN 140
110  FOR R0=1 TO 128
120  READ #1,R0
130  NEXT R0
140  R0=R0-1
150  IF R0#1 THEN 180
160  PRINT "FILE TOO SMALL - MUST BE AT LEAST 2 RECORDS"
170  STOP 
180  REM DETERMINE NUMBER OF WORDS PER RECORD
190  READ #1,R0
200  IF  END #1 THEN 240
210  FOR W0=0 TO 254 STEP 2
220  PRINT #1;0
230  NEXT W0
240  GOSUB 1630
250  F1=0
260  PRINT '10'10"OPTION";
270  IF F1 THEN 310
280  PRINT "?  0 = STOP, 1 = RECEIVE MESSAGE, 2 = ENTER MESSAGE,"
290  PRINT "3 = RECEIVE LIST OF AVAILABLE MESSAGES - ";
300  F1=1
310  INPUT F2
320  IF F2<0 OR F2>3 OR F2#INT(F2) THEN 250
330  GOTO F2+1 OF 1980,340,1020,1520
340  PRINT '10"TYPE THE NUMBER OF THE MESSAGE YOU WANT. - ";
350  INPUT M1
360  F0=0
370  FOR R1=1 TO R0-1
380  READ #1,R1
390  IF TYP(-1)#1 THEN 770
400  READ #1;M0
410  IF M1#M0 THEN 770
420  READ #1,R1
430  IF F0 THEN 730
440  F0=1
450  READ #1;M0,T$,F$,T0,T1,T2,T3,M$
460  T9=T2
470  PRINT '10'10"FOR: ";T$;"    FROM: ";F$;"    ";
480  RESTORE 1970
490  FOR T4=1 TO 12
500  READ T5
510  T5=T5+(T4=2 AND T3/4=INT(T3/4))
520  IF T5 >= T2 THEN 550
530  T2=T2-T5
540  NEXT T4
550  Z0=10000*T4+100*T2+T3
560  GOSUB 1850
570  PRINT Z$[1,Z1-3];"/";Z$[Z1-2,Z1-1];"/";Z$[Z1,Z1+1];"    ";
580  Z0=100*(T1-12*INT((T1-1)/12))+T0
590  GOSUB 1850
600  PRINT Z$[1,Z1-1];":";Z$[Z1,Z1+1];
610  IF T1=0 AND T0=0 THEN 700
620  IF T1=12 AND T0=0 THEN 680
630  IF T1<12 THEN 660
640  PRINT " PM"
650  GOTO 710
660  PRINT " AM"
670  GOTO 710
680  PRINT " NOON"
690  GOTO 710
700  PRINT " MIDNIGHT"
710  PRINT 
720  GOTO 750
730  IF TYP(-1)=4 THEN 770
740  READ #1;M0,T0,T1,M$
750  PRINT M$
760  GOTO 430
770  NEXT R1
780  IF F0 THEN 840
790  PRINT "THERE IS NO MESSAGE NUMBER";M1
800  PRINT "POSSIBLY IT HAS BEEN REMOVED FROM THE FILE SINCE THE LAST"
810  PRINT "LISTING OF AVAILABLE MESSAGES WAS PRODUCED.  OPTION 3 WILL"
820  PRINT "GIVE A LISTINF OF AVAILABLE MESSAGES."
830  GOTO 260
840  T=60*TIM(1)+TIM(0)-60*T1-T0
845  T[M1]=0
850  IF T >= 0 AND T <= 4 AND T9=TIM(2) AND  NOT T[M1] THEN 1000
860  PRINT "END OF MESSAGE.  DO YOU WANT IT REMOVED FROM THE FILE";
870  INPUT Y$[1,1]
880  IF Y$="N" THEN 260
890  IF Y$#"Y" THEN 860
900  FOR R1=1 TO R0-1
910  READ #1,R1
920  IF TYP(-1)#1 THEN 960
930  READ #1;M0
940  IF M0#M1 THEN 960
950  PRINT #1,R1
960  NEXT R1
970  T[M1]=0
980  READ #1,R0
990  GOTO 260
1000  PRINT '10"MESSAGE ENTERED RECENTLY - POSSIBLY NOT COMPLETE"
1010  GOTO 260
1020  R2=0
1030  PRINT "THIS MESSAGE IS FOR";
1040  INPUT T$
1050  PRINT "AND IS FROM";
1060  INPUT F$
1070  PRINT '10"ENTER MESSAGE (ANY NUMBER OF LINES, 3 MINUTE TIME LIMIT PER"
1080  PRINT "LINE).  TYPE  END  FOR LAST LINE TO STOP INPUT."
1090  F3=0
1100  PRINT '10"? ";
1110  ENTER D0,D1,M$
1120  IF D1#-256 THEN 1150
1130  PRINT '13'10"TIME OUT - INPUT TERMINATED"
1140  GOTO 260
1150  IF M$="END" THEN 260
1160  IF F3 THEN 1360
1170  REM FIND AN AVAILABLE MESSAGE NUMBER
1180  MAT M=ZER
1190  FOR R1=1 TO R0-1
1200  READ #1,R1
1210  IF TYP(-1)#1 THEN 1240
1220  READ #1;M0
1230  M[M0]=1
1240  NEXT R1
1250  FOR M1=1 TO 127
1260  IF  NOT M[M1] THEN 1290
1270  NEXT M1
1280  GOTO 1500
1290  GOSUB 1540
1300  IF R2=0 THEN 1500
1310  PRINT #1,R2;M1,T$,F$,TIM(0),TIM(1),TIM(2),TIM(3),M$
1320  W1=10+FNW(LEN(T$))+FNW(LEN(F$))+FNW(LEN(M$))
1330  F3=1
1340  T[M1]=1
1350  GOTO 1480
1360  IF W1+6+FNW(LEN(M$)) <= W0 THEN 1400
1370  GOSUB 1540
1380  IF R2=0 THEN 1500
1390  W1=0
1400  READ #1,R2
1410  GOTO TYP(-1) OF 1420,1440,1460,1460
1420  READ #1;G0
1430  GOTO 1410
1440  READ #1;G$
1450  GOTO 1410
1460  PRINT #1;M1,TIM(0),TIM(1),M$
1470  W1=W1+6+FNW(LEN(M$))
1480  READ #1,R0
1490  GOTO 1100
1500  PRINT '10"FILE FULL - LAST LINE LOST - INPUT TERMINATED"
1510  GOTO 260
1520  GOSUB 1630
1530  GOTO 260
1540  REM FIND AN AVAILABLE RECORD
1550  FOR R1=R2+1 TO R0-1
1560  READ #1,R1
1570  IF TYP(-1)#1 THEN 1610
1580  NEXT R1
1590  R2=0
1600  RETURN 
1610  R2=R1
1620  RETURN 
1630  REM PRINT LISTING OF AVAILABLE MESSAGES
1640  MAT M=ZER
1650  F0=0
1660  FOR R1=1 TO R0-1
1670  READ #1,R1
1680  IF TYP(-1)#1 THEN 1730
1690  READ #1;M0
1700  IF M[M0] THEN 1730
1710  F0=1
1720  M[M0]=R1
1730  NEXT R1
1740  IF F0 THEN 1770
1750  PRINT '10"THERE ARE NO MESSAGES."
1760  RETURN 
1770  PRINT '10'10"THERE ARE MESSAGES FOR:"'10
1780  FOR M1=1 TO 127
1790  IF  NOT M[M1] THEN 1830
1800  READ #1,M[M1];Z0,M$
1810  GOSUB 1850
1820  PRINT TAB(3-Z1);Z$;". ";M$
1830  NEXT M1
1840  RETURN 
1850  REM NUMBER FORMAT SUBROUTINE
1860  IF Z0 <= 1 THEN 1890
1870  Z1=INT(LOG(Z0)/LOG(10))
1880  GOTO 1900
1890  Z1=0
1900  Z$=""
1910  FOR Z2=Z1 TO 0 STEP -1
1920  Z3=INT(Z0/10^Z2)
1930  Z$[LEN(Z$)+1]=X$[Z3+1,Z3+1]
1940  Z0=Z0-Z3*10^Z2
1950  NEXT Z2
1960  RETURN 
1970  DATA 31,28,31,30,31,30,31,31,30,31,30,31
1980  END 
