home *** CD-ROM | disk | FTP | other *** search
/ Nibble Magazine / nib33a.dsk / JANUARY.1988 / MESSAGE.CENTER.bas < prev    next >
BASIC Source File  |  2023-02-26  |  35KB  |  591 lines

  1. 10  REM :::::::::::::::::::::::::::::
  2. 20  REM ::     MESSAGE CENTER      ::
  3. 30  REM ::     BY RUDY A. GUY      ::
  4. 40  REM ::  COPYRIGHT (C)  1988    ::
  5. 50  REM ::  BY MICROSPARC,  INC    ::
  6. 60  REM ::  CONCORD,  MA  01742    ::
  7. 70  REM :::::::::::::::::::::::::::::
  8. 80  GOTO 860
  9. 90  REM  MAIN INPUT ROUTINE
  10. 100 L = 60: FOR I = 1 TO 8:M$(I) = "": NEXT 
  11. 110  VTAB 9: POKE 1403,9: INVERSE : FOR I = 1 TO 62: PRINT " ";: NEXT : PRINT : REM 1 SPACE
  12. 120  FOR I = 1 TO 8: POKE 1403,9: PRINT " ";: POKE 1403,70: PRINT " ":: NEXT : REM 1 SPACE
  13. 130  POKE 1403,9: FOR I = 1 TO 62: PRINT " ";: NEXT : NORMAL : REM 1 SPACE
  14. 140  POKE 32,10: POKE 33,60: POKE 34,9: POKE 35,17: HOME 
  15. 150  FOR I = 1 TO 420: PRINT "_";: NEXT : VTAB 9: POKE 1403,10: PRINT 
  16. 160 V = 10: FOR I = 1 TO 8:M$ = "": IF I = 8  THEN  POKE 33,62
  17. 170 P = 0:FL = 0: IF  PEEK(64448) = 234  THEN  POKE 32,5
  18. 180  IF FL  THEN  NORMAL : VTAB V: POKE 1403,P: PRINT " ";: GOTO 200
  19. 190  INVERSE : VTAB V: POKE 1403,P: PRINT " ";: NORMAL 
  20. 200 X =  PEEK( -16384): IF X >127  THEN  POKE  -16368,0: GOTO 220
  21. 210 FL =  ABS(FL -1): GOTO 180
  22. 220  IF X = 149  THEN X = 160: GOTO 290
  23. 230  IF X = 136  OR X = 255  THEN 320
  24. 240  IF X = 141  THEN 390
  25. 250  IF X = 155  THEN  RETURN 
  26. 260  IF X = 162  THEN X = 167
  27. 270  IF X <156  THEN 180
  28. 280  IF F2  AND M$ < > CHR$(160)  THEN  GOSUB 430
  29. 290 M$ = M$ + CHR$(X): VTAB V: POKE 1403,P: PRINT  CHR$(X);: IF P = 59  AND I = 8  THEN  INVERSE : PRINT " ";: NORMAL : POKE 33,60
  30. 300  IF P <59  THEN P = P +1: GOTO 180
  31. 310  IF P = 59  THEN V = V +1:P = 0:M$(I) = M$:F2 = 1: GOTO 410
  32. 320  IF P = 0  AND I = 1  THEN 180
  33. 330  IF P = 0  THEN M$(I) = "": VTAB V: POKE 1403,P: PRINT "_";:I = I -1:V = V -1: VTAB V: PRINT :P =  LEN(M$(I)):M$ = M$(I): IF P < >60  THEN 180
  34. 340  IF P = 60  THEN P = 59:M$ =  LEFT$(M$,59): GOTO 180
  35. 350  IF I <8  THEN  VTAB V: POKE 1403,P: PRINT "_";:P = P -1: VTAB V: POKE 1403,P: PRINT " ";: GOTO 370
  36. 360  VTAB V: POKE 1403,P: PRINT " ";:P = P -1: POKE 1403,P: PRINT " ";
  37. 370  IF P = 0  THEN M$ = "": GOTO 180
  38. 380 M$ =  LEFT$(M$,P): GOTO 180
  39. 390 M$(I) = M$: IF I = 8  THEN  POKE 33,60: VTAB V: POKE 1403,P: PRINT " ";: GOTO 420
  40. 400  POKE 1403,P: POKE 33,60: PRINT "_":V = V +1
  41. 410  IF F2  AND  RIGHT$(M$(I),1) =  CHR$(160)  THEN F2 = 0
  42. 420  NEXT : RETURN 
  43. 430 L = 59
  44. 440  IF  MID$ (M$(I -1),L,1) =  CHR$(160)  THEN T$ =  RIGHT$(M$(I -1),60 -L):M$(I -1) =  LEFT$(M$(I -1),L): GOTO 480
  45. 450 L = L -1
  46. 460  IF L = 0  THEN F2 = 0: RETURN 
  47. 470  GOTO 440
  48. 480 M$ = T$ +M$: IF I = 8  THEN  POKE 33,60
  49. 490  VTAB V -1: POKE 1403,0: CALL  -868: VTAB V -1: PRINT M$(I -1)
  50. 500  VTAB V: POKE 1403,0: PRINT M$;:P =  LEN(M$):F2 = 0
  51. 510  IF I = 8  THEN  POKE 33,62
  52. 520  RETURN 
  53. 530  REM INPUT ROUTINE FOR CHANGES  
  54. 540 L = 60: POKE  -16368,0
  55. 550  VTAB 20: POKE 1403,9: INVERSE : FOR J = 1 TO 62: PRINT " ";: NEXT : PRINT : REM 1 SPACE
  56. 560  POKE 1403,9: PRINT " ";: POKE 1403,70: PRINT " ": REM 1 SPACE
  57. 570  POKE 1403,9: INVERSE : FOR J = 1 TO 62: PRINT " ";: NEXT : NORMAL : REM 1 SPACE
  58. 580  POKE 32,10 -(( PEEK(64448) = 234) *5: POKE 33,60: POKE 34,20: POKE 35,21: HOME : POKE 33,61
  59. 590 V = 21:P = 0:FL = 0:M$ = ""
  60. 600  IF FL  THEN  NORMAL : VTAB V: POKE 1403,P: PRINT " ";: GOTO 620
  61. 610  INVERSE : VTAB V: POKE 1403,P: PRINT " ";: NORMAL 
  62. 620 X =  PEEK( -16384): IF X >127  THEN  POKE  -16368,0: GOTO 640
  63. 630 FL =  ABS(FL -1): GOTO 600
  64. 640  IF X = 149  THEN X = 160: GOTO 710
  65. 650  IF X = 136  OR X = 255  THEN 740
  66. 660  IF X = 141  THEN 790
  67. 670  IF X = 152  THEN  POKE  -16368,0: VTAB VT: POKE 1403,0: CALL  -868: VTAB VT: POKE 1403,0: GOTO 800
  68. 680  IF X = 155  THEN 830
  69. 690  IF X = 162  THEN X = 167
  70. 700  IF X <156  THEN 600
  71. 710 M$ = M$ + CHR$(X): VTAB V: POKE 1403,P: PRINT  CHR$(X);: IF P = 59  THEN  INVERSE : PRINT " ";: NORMAL : POKE 33,60
  72. 720  IF P <59  THEN P = P +1: GOTO 600
  73. 730  IF P = 59  THEN 790
  74. 740  IF P = 0  THEN 600
  75. 750  IF P = 60  THEN P = 59:M$ =  LEFT$(M$,59): GOTO 600
  76. 760  VTAB V: POKE 1403,P: PRINT " ";:P = P -1: VTAB V: POKE 1403,P: PRINT " ";: REM 1 SPACE
  77. 770  IF P = 0  THEN M$ = "": GOTO 600
  78. 780 M$ =  LEFT$(M$,P): GOTO 600
  79. 790 M$(I) = M$: VTAB VT: POKE 1403,0: CALL  -868: VTAB VT: POKE 1403,0
  80. 800  IF  LEN(M$(I)) = 60  THEN  POKE 33,62: PRINT M$(I);: INVERSE : PRINT " ";: NORMAL : POKE 33,60: GOTO 830
  81. 810  IF ED  THEN  PRINT M$(I);: FOR J =  LEN(M$(I)) +1 TO 60: PRINT " ";: NEXT : GOSUB 5900: GOTO 830: REM 1 SPACE
  82. 820  PRINT M$(I);: FOR J =  LEN(M$(I)) +1 TO 60: PRINT "_";: NEXT : INVERSE : PRINT " ";: NORMAL 
  83. 830  TEXT : VTAB 20: POKE 1403,1: CALL  -958
  84. 840 I = 1: RETURN 
  85. 850  REM  PROGRAM STARTS HERE
  86. 860 D$ =  CHR$(4):Q$ =  CHR$(34): DIM DS(100),T$(100)
  87. 870  IF  PEEK(64435) < >6  THEN 5690: REM CHECK FOR //E, IIC OR GS 
  88. 880  IF  PEEK(64435) = 6  AND  PEEK(64448) = 244  THEN GS = 1
  89. 890  HOME : POKE 49153,0: POKE 49237,0: POKE 1024,123:F8 =  PEEK(1024) < >123: POKE 49236,0: POKE 49152,0: IF F8 GOTO 5690: REM CHECK FOR 80 COLUMN CARD 
  90. 900  ONERR  GOTO 5730
  91. 910  PRINT D$"PREFIX": INPUT PR$
  92. 920 CH = 1: PRINT D$"VERIFY /RAM"
  93. 930 CH = 2: PRINT D$"VERIFY MESSAGE.BASE":CH = 0
  94. 940  PRINT D$"OPEN MESSAGE.BASE,L575": PRINT D$"READ MESSAGE.BASE,R0": INPUT NU: PRINT D$"CLOSE"
  95. 950  PRINT D$"PREFIX": INPUT PF$
  96. 960  GOSUB 5640:CL = 1: IF HR$ = "00"  AND DA$ = "00"  AND MN$ = "00"  AND MI$ = "00"  THEN CL = 0
  97. 970  PRINT D$"PR#3": PRINT :A$ = "* Message Center *": GOSUB 5710
  98. 980 A$ = "By Rudy A. Guy": GOSUB 5710:A$ = "Copyright (c) 1988 By MicroSparc, Inc.": GOSUB 5710: GOSUB 5520
  99. 990  VTAB 7:A$ = "Main Menu": GOSUB 5710
  100. 1000  FOR I = 1 TO 7: READ A$(I): NEXT 
  101. 1010  DATA  "1. Add Messages to Message.Base","2. Delete Messages from Message.Base","3. Prepare Display Sequence","4. Display Messages"
  102. 1020  DATA   "5. Display Personal Messages","6. Edit a Message","7. Return to BASIC"
  103. 1030  VTAB 9: FOR I = 1 TO 7: POKE 1403,25: PRINT A$(I): PRINT : NEXT 
  104. 1040  GOSUB 5570: POKE  -16368,0
  105. 1050 VT = 9:HT = 25:I = 1:T = 49:FL = 0
  106. 1060  GOSUB 2380: INVERSE : PRINT A$(I): NORMAL 
  107. 1070 X =  PEEK( -16384):T = T +1
  108. 1080  IF X = 138  OR X = 149  THEN  GOSUB 1150: GOTO 1120
  109. 1090  IF X = 136  OR X = 139  THEN  GOSUB 1180: GOTO 1120
  110. 1100  IF X >176  AND X <184  THEN X = X -176: GOSUB 1210: GOTO 1120
  111. 1110  IF X = 141  THEN 1240
  112. 1120  IF CL  AND T = 50  THEN  GOSUB 5550:T = 0
  113. 1130  GOTO 1070
  114. 1140  REM  HANDLE DOWN ARROW
  115. 1150  POKE  -16368,0: IF I = 7  THEN  GOSUB 2380: PRINT A$(I):I = 1:VT = 9: INVERSE : GOSUB 2380: PRINT A$(I): NORMAL : RETURN 
  116. 1160  GOSUB 2380: PRINT A$(I):I = I +1:VT = VT +2: INVERSE : GOSUB 2380: PRINT A$(I): NORMAL : RETURN 
  117. 1170  REM  HANDLE UP ARROW
  118. 1180  POKE  -16368,0: IF I = 1  THEN  GOSUB 2380: PRINT A$(I):I = 7:VT = 21: INVERSE : GOSUB 2380: PRINT A$(I): NORMAL : RETURN 
  119. 1190  GOSUB 2380: PRINT A$(I):I = I -1:VT = VT -2: INVERSE : GOSUB 2380: PRINT A$(I): NORMAL : RETURN 
  120. 1200  REM  HANDLE KEY PRESS
  121. 1210  POKE  -16368,0: GOSUB 2380: PRINT A$(I):I = X:VT = 7 +(X *2): INVERSE : GOSUB 2380: PRINT A$(I): NORMAL 
  122. 1220  RETURN 
  123. 1230  REM  HANDLE A RETURN
  124. 1240  POKE  -16368,0: IF I = 2  THEN SL = 1
  125. 1250  ON I GOSUB 1290,2410,2630,2930,3640,4320,4830
  126. 1260  IF SL = 1  AND DE = 1  THEN SL = 0:DE = 0: GOSUB 3860: REM DO A PURGE IF A FILE HAS BEEN DELETED.
  127. 1270 ED = 0:R = 0: RESTORE : GOTO 970
  128. 1280  REM   ADD MESSAGE TO MESSAGE.BASE
  129. 1290 A$ = "ADD MESSAGES": GOSUB 5500
  130. 1300  IF NU = 100  THEN  VTAB 12: PRINT  CHR$(7)"Message.base is full.": PRINT : PRINT "Press a key for the menu.";: GET A$: PRINT A$: RETURN 
  131. 1310  GOSUB 100: IF X = 155  THEN  TEXT : HOME : RETURN 
  132. 1320  TEXT : VTAB 1: POKE 1403,0: PRINT "                       ";: REM  23 spaces
  133. 1330  POKE 34,19: HOME 
  134. 1340  VTAB 21: POKE 1403,20: PRINT "'A' to cancel message.": VTAB 20: POKE 1403,20: POKE  -16368,0: INPUT "Is this message correct?";YN$: TEXT 
  135. 1350  IF  LEFT$(YN$,1) = "Y"  OR  LEFT$(YN$,1) = "y"  THEN 1660
  136. 1360  IF  LEFT$(YN$,1) = "N"  OR  LEFT$(YN$,1) = "n"  THEN  VTAB 20: CALL  -958: GOTO 1400
  137. 1370  IF ED = 1  AND ( LEFT$(YN$,1) = "A"  OR  LEFT$(YN$,1) = "a")  THEN  POP : RETURN 
  138. 1380  IF  LEFT$(YN$,1) = "A"  OR  LEFT$(YN$,1) = "a"  THEN  RETURN 
  139. 1390  VTAB 20: CALL  -958: PRINT  CHR$(7): GOTO 1340
  140. 1400  INVERSE : VTAB 10: FOR I = 1 TO 8: POKE 1403,8: PRINT I: NEXT : NORMAL 
  141. 1410  VTAB 20: CALL  -868:VT = 10:HT = 5:I = 1:A$ = "-->":B$ = "   ":T = 49: REM  B$ = 3 spaces
  142. 1420  VTAB 1: POKE 1403,0: PRINT "ESC to exit edit mode";: GOSUB 5570
  143. 1430  GOSUB 2380: PRINT A$;
  144. 1440 X =  PEEK( -16384):T = T +1
  145. 1450  IF X = 155  THEN 1630
  146. 1460  IF X = 138  OR X = 149  THEN  GOSUB 1520: GOTO 1500
  147. 1470  IF X = 136  OR X = 139  THEN  GOSUB 1540: GOTO 1500
  148. 1480  IF X >176  AND X <185  THEN X = X -176: GOSUB 1560: GOTO 1500
  149. 1490  IF X = 141  THEN 1580
  150. 1500  IF CL  AND T = 50  THEN  GOSUB 5550:T = 0
  151. 1510  GOTO 1440
  152. 1520  POKE  -16368,0: IF I = 8  THEN  GOSUB 2380: PRINT B$;:I = 1:VT = 10: GOSUB 2380: PRINT A$;: RETURN 
  153. 1530  GOSUB 2380: PRINT B$;:I = I +1:VT = VT +1: GOSUB 2380: PRINT A$;: RETURN 
  154. 1540  POKE  -16368,0: IF I = 1  THEN  GOSUB 2380: PRINT B$;:I = 8:VT = 17: GOSUB 2380: PRINT A$;: RETURN 
  155. 1550  GOSUB 2380: PRINT B$;:I = I -1:VT = VT -1: GOSUB 2380: PRINT A$;: RETURN 
  156. 1560  POKE  -16368,0: GOSUB 2380: PRINT B$;:I = X:VT = 9 +X: GOSUB 2380: PRINT A$;
  157. 1570  RETURN 
  158. 1580  POKE  -16368,0: VTAB 24: POKE 1403,0: PRINT "Please enter new text and press RETURN.";: CALL  -868
  159. 1590  VTAB 1: POKE 1403,0: PRINT "ESC to restore original line";
  160. 1600  GOSUB 540
  161. 1610  VTAB 1: POKE 1403,0: PRINT "ESC to exit edit mode       ";: REM   7 spaces   
  162. 1620  FOR I = 1 TO 8:VT = I +9: GOSUB 2380: PRINT B$;: NEXT : GOSUB 5570: GOTO 1440
  163. 1630  POKE  -16368,0: GOSUB 2380: PRINT B$;
  164. 1640  INVERSE : VTAB 10: FOR I = 1 TO 8: POKE 1403,8: PRINT I: NEXT : NORMAL 
  165. 1650  GOTO 1320
  166. 1660  TEXT : POKE 34,2: VTAB 20: CALL  -958
  167. 1670  FOR J = 1 TO 8: PRINT : NEXT 
  168. 1680  VTAB 16: POKE 1403,20: PRINT "Topic:";: FOR J = 1 TO 25: PRINT "_";: NEXT 
  169. 1690  VTAB 16: POKE 1403,26: INPUT "";T$
  170. 1700  IF  LEN(T$) <1  OR  LEN(T$) >25  THEN  PRINT  CHR$(7): VTAB 16: CALL  -958: GOTO 1680
  171. 1710  VTAB 17: POKE 1403,20: PRINT "To:ALL";: FOR I = 1 TO 17: PRINT "_";: NEXT 
  172. 1720  VTAB 17: POKE 1403,23: INPUT "";TW$
  173. 1730  IF  LEN(TW$) >20  THEN  PRINT  CHR$(7): VTAB 17: CALL  -958: GOTO 1710
  174. 1740  IF TW$ = ""  THEN  VTAB 17: POKE 1403,23: PRINT "ALL":TW$ = "ALL"
  175. 1750  IF   NOT CL  THEN SD$ = "000000":ED$ = SD$:ST$ = "0000":ET$ = ST$: IF ED  THEN  RETURN 
  176. 1760  IF   NOT CL  THEN 2170
  177. 1770  FOR J = 1 TO 2
  178. 1780  IF J = 1  THEN B$ = "Starting date:__/__/__":VT = 18
  179. 1790  IF J = 2  THEN B$ = "Ending date:  __/__/__":VT = 19
  180. 1800  VTAB VT: POKE 1403,20: PRINT B$ +" Use the form MM/DD/YY"
  181. 1810 P = 34:A$ = "": VTAB VT +2: POKE 1403,20: PRINT "ESC to restart date entry, RETURN to accept"
  182. 1820 X =  PEEK( -16384): IF X = 155  THEN  POKE  -16368,0: VTAB VT: CALL  -958: GOTO 1800
  183. 1830  IF X = 141  AND P = 34  THEN A$ = "000000": POKE  -16368,0: VTAB VT: POKE 1403,P: PRINT "00/00/00": GOTO 1920
  184. 1840  IF X <176  OR X >185  THEN 1820
  185. 1850  POKE  -16368,0: VTAB VT: POKE 1403,P: PRINT  CHR$(X);
  186. 1860 A$ = A$ + CHR$(X -128)
  187. 1870 P = P +1: IF P = 36  OR P = 39  THEN P = P +1
  188. 1880  IF P = 42  THEN 1900
  189. 1890  GOTO 1820
  190. 1900 X =  PEEK( -16384): IF X = 155  THEN  POKE  -16368,0: VTAB VT: CALL  -958: GOTO 1800
  191. 1910  IF X < >141  THEN 1900
  192. 1920  POKE  -16368,0: VTAB VT +1: CALL  -958: GOSUB 2290: IF FL  THEN FL = 0: POKE  -16368,0: VTAB VT: CALL  -958: GOTO 1800
  193. 1930  IF J = 1  THEN SD$ = A$: GOTO 1960
  194. 1940  IF  VAL(A$) < VAL(SD$)  THEN  CALL  -198: POKE  -16368,0: VTAB VT: CALL  -958: GOTO 1800
  195. 1950 ED$ = A$
  196. 1960  NEXT 
  197. 1970  FOR J = 1 TO 2:P = 34
  198. 1980  IF J = 1  THEN B$ = "Starting time:__:__":VT = 20
  199. 1990  IF J = 2  THEN B$ = "Ending time:  __:__":VT = 21
  200. 2000  VTAB VT: POKE 1403,20: PRINT B$
  201. 2010 A$ = "": VTAB VT +2: POKE 1403,20: PRINT "ESC to restart time entry, RETURN to accept"
  202. 2020 X =  PEEK( -16384): IF X = 155  THEN  POKE  -16368,0: VTAB VT: CALL  -958:P = 34: GOTO 2000
  203. 2030  IF X = 141  AND P = 34  THEN A$ = "0000": POKE  -16368,0: VTAB VT: POKE 1403,P: PRINT "00:00": GOTO 2120
  204. 2040  IF X <176  OR X >185  THEN 2020
  205. 2050  POKE  -16368,0: VTAB VT: POKE 1403,P: PRINT  CHR$(X);
  206. 2060 A$ = A$ + CHR$(X -128)
  207. 2070 P = P +1: IF P = 36  THEN P = P +1
  208. 2080  IF P = 39  THEN 2100
  209. 2090  GOTO 2020
  210. 2100 X =  PEEK( -16384): IF X = 155  THEN  POKE  -16368,0: VTAB VT: CALL  -958:P = 34: GOTO 2000
  211. 2110  IF X < >141  THEN 2100
  212. 2120  POKE  -16368,0: VTAB VT +1: CALL  -958: GOSUB 2350: IF FL  THEN FL = 0: POKE  -16368,0: VTAB VT: CALL  -958:P = 34: GOTO 2000
  213. 2130  IF J = 1  THEN ST$ = A$: GOTO 2150
  214. 2140  IF SD$ = ED$  AND  VAL(ST$) > VAL(A$)  THEN  CALL  -198: VTAB VT: CALL  -958:P = 34: GOTO 2000
  215. 2150 ET$ = A$
  216. 2160  NEXT : IF ED  THEN  RETURN 
  217. 2170  PRINT : POKE 1403,20: PRINT "Is this information correct? (Y/N/ESC to cancel) ";
  218. 2180 X =  PEEK( -16384)
  219. 2190  IF X = 155  THEN  POKE  -16368,0: RETURN 
  220. 2200  IF X = 217  OR X = 249  THEN  POKE  -16368,0: GOTO 2230
  221. 2210  IF X = 206  OR X = 238  THEN  POKE  -16368,0: VTAB 16: CALL  -958: GOTO 1680
  222. 2220  GOTO 2180
  223. 2230 NU = NU +1: PRINT D$"OPEN MESSAGE.BASE,L575": PRINT D$"WRITE MESSAGE.BASE,R"NU
  224. 2240  PRINT Q$;T$: PRINT Q$;TW$: PRINT SD$: PRINT ED$: PRINT ST$: PRINT ET$: FOR I = 1 TO 8: PRINT Q$;M$(I): NEXT 
  225. 2250  PRINT D$"WRITE MESSAGE.BASE,R0": PRINT NU: PRINT D$"CLOSE": IF MB  THEN F1 = 1: GOSUB 4720:F1 = 0
  226. 2260  PRINT : POKE 1403,20: INPUT "Do you want to add another message ?";YN$
  227. 2270  IF  LEFT$(YN$,1) = "y"  OR  LEFT$(YN$,1) = "Y"  THEN  TEXT : HOME : GOTO 1290
  228. 2280  RETURN 
  229. 2290 FL = 0: IF  VAL( LEFT$(A$,2)) >12  THEN  GOSUB 2400: RETURN 
  230. 2300  IF ( LEFT$(A$,2) = "04"  OR  LEFT$(A$,2) = "06"  OR  LEFT$(A$,2) = "09"  OR  LEFT$(A$,2) = "11")  AND  VAL( MID$ (A$,3,2)) >30  THEN  GOSUB 2400: RETURN 
  231. 2310  IF  LEFT$(A$,2) = "02"  AND  MID$ (A$,3,2) = "29"  AND  INT( VAL( RIGHT$(A$,2))/4) < > VAL( RIGHT$(A$,2))/4  THEN  GOSUB 2400: RETURN 
  232. 2320  IF  LEFT$(A$,2) = "02"  AND  VAL( MID$ (A$,3,2)) >29  THEN  GOSUB 2400: RETURN 
  233. 2330  IF  VAL( MID$ (A$,3,2)) >31  THEN  GOSUB 2400: RETURN 
  234. 2340  RETURN 
  235. 2350 FL = 0: IF  VAL( LEFT$(A$,2)) >23  THEN  GOSUB 2400: RETURN 
  236. 2360  IF  VAL( RIGHT$(A$,2)) >59  THEN  GOSUB 2400: RETURN 
  237. 2370  RETURN 
  238. 2380  VTAB VT: POKE 1403,HT: RETURN 
  239. 2390  REM  DELETE MESSAGES
  240. 2400  CALL  -198:FL = 1: RETURN 
  241. 2410  HOME : VTAB 12: PRINT "If any files are deleted, any existing DISPLAY.LIST will be destroyed.": PRINT 
  242. 2420  INPUT "Do you wish to continue ?";YN$: IF  LEFT$(YN$,1) = "y"  OR  LEFT$(YN$,1) = "Y"  THEN 2450
  243. 2430  IF  LEFT$(YN$,1) = "n"  OR  LEFT$(YN$,1) = "N"  THEN  RETURN 
  244. 2440  PRINT  CHR$(7): GOTO 2410
  245. 2450 A$ = "DELETE MESSAGES": GOSUB 5500: VTAB 1: POKE 1403,68: PRINT "Q to Quit";
  246. 2460  GOSUB 5620
  247. 2470  IF NU = 0  THEN  GOTO 4310
  248. 2480  IF   NOT MB  THEN  GOSUB 4900: REM  READ MESSAGE.BASE
  249. 2490  VTAB 12: CALL  -958
  250. 2500  GOSUB 5530: GOSUB 5590
  251. 2510  VTAB 5:B = 1:FL = 1:I = 0
  252. 2520 I = I +1: POKE 1403,0: IF I >NU  THEN  GOSUB 5600: GOTO 2580
  253. 2530  IF I <10  THEN  PRINT "  ";: GOTO 2550: REM 2 SPACES
  254. 2540  IF I <100  THEN  PRINT " ";: REM 1 SPACE
  255. 2550  PRINT I". "; LEFT$(T$(I),74)
  256. 2560  IF  PEEK(37) = 21  AND I < >NU  THEN 2590
  257. 2570  IF I < = NU  THEN 2520
  258. 2580 I = I -1: IF FL < >2  THEN  GOSUB 5000: IF I <NU  THEN  VTAB 5: POKE 1403,0: CALL  -958: GOSUB 5530: GOSUB 5590: GOTO 2610
  259. 2590  GOSUB 5610
  260. 2600  GOSUB 5000:B = I +1: VTAB 5: POKE 1403,0: CALL  -958: GOSUB 5530: GOSUB 5590
  261. 2610  VTAB 5: GOTO 2570
  262. 2620  REM  MAKE DISPLAY.LIST
  263. 2630 A$ = "MAKE DISPLAY LIST": GOSUB 5500: VTAB 1: POKE 1403,68: PRINT "Q to Quit";
  264. 2640  GOSUB 5620
  265. 2650 C = 0:CT = 0
  266. 2660  IF NU = 0  THEN  GOTO 4310
  267. 2670  IF   NOT MB  THEN  GOSUB 4900: REM  READ MESSAGE.BASE
  268. 2680  IF MB  THEN  FOR I = 1 TO NU:T$(I) =  LEFT$(T$(I),74): NEXT 
  269. 2690  VTAB 12: CALL  -868
  270. 2700  GOSUB 5530: GOSUB 5590
  271. 2710  VTAB 5:B = 1:I = 0
  272. 2720 I = I +1: POKE 1403,0: IF I >NU  THEN  GOSUB 5600: GOTO 2790
  273. 2730  IF I <10  THEN  PRINT "  ";: GOTO 2750: REM  2 SPACES
  274. 2740  IF I <100  THEN  PRINT " ";: REM 1 SPACE
  275. 2750  PRINT I". ";: IF  RIGHT$(T$(I),1) = "_"  THEN  INVERSE : PRINT  LEFT$(T$(I),74): NORMAL : GOTO 2770
  276. 2760  PRINT  LEFT$(T$(I),74)
  277. 2770  IF  PEEK(37) = 21  AND I < >NU  THEN 2810
  278. 2780  IF I < = NU  THEN 2720
  279. 2790 I = I -1: IF FL < >2  THEN  GOSUB 5000: IF I <NU  THEN  VTAB 5: POKE 1403,0: CALL  -958: GOSUB 5530: GOSUB 5590: GOTO 2840
  280. 2800  GOTO 2850
  281. 2810  GOSUB 5610: GOTO 2820
  282. 2820  GOSUB 5000:B = I +1: VTAB 5: POKE 1403,0: CALL  -958: GOSUB 5530: GOSUB 5590
  283. 2830  IF FL = 2  THEN I = NU
  284. 2840  GOSUB 5420: VTAB 5: GOTO 2780
  285. 2850  REM  WRITE NEW DISPLAY.LIST
  286. 2860  IF C = 0  THEN  RETURN 
  287. 2870  VTAB 23: POKE 1403,0: CALL  -958: PRINT "Creating DISPLAY.LIST. Please wait...";
  288. 2880  PRINT D$"OPEN DISPLAY.LIST": PRINT D$"WRITE DISPLAY.LIST"
  289. 2890  FOR I = 1 TO CT: IF DS(I) >0  THEN  PRINT DS(I)
  290. 2900  NEXT : PRINT  -1
  291. 2910  PRINT D$"CLOSE": RETURN 
  292. 2920  REM  DISPLAY MESSAGES
  293. 2930  TEXT : HOME :A$ = "*** MESSAGE CENTER ***": GOSUB 5710
  294. 2940  PRINT D$"OPEN "PF$",TDIR": PRINT D$"READ "PF$
  295. 2950  INPUT A$: IF  MID$ (A$,2,12) = "DISPLAY.LIST"  THEN  PRINT D$"CLOSE": GOSUB 3520:DL = 1: GOTO 3100
  296. 2960  IF  LEFT$(A$,6) = "BLOCKS"  THEN  PRINT D$"CLOSE": GOTO 2980
  297. 2970  GOTO 2950
  298. 2980  IF NU = 0  THEN  GOTO 4310
  299. 2990  VTAB 12:A$ = "Please wait, creating a display list.": GOSUB 5710
  300. 3000  IF CL  THEN  GOSUB 5640:S1 =  VAL(MN$ +DA$):T1 =  VAL(HR$ +MI$)
  301. 3010  PRINT D$"OPEN MESSAGE.BASE,L575":C = 0
  302. 3020  FOR I = 1 TO NU: PRINT D$"READ MESSAGE.BASE,R"I
  303. 3030  INPUT T$,TW$,SD$,ED$,ST$,ET$
  304. 3040  IF  LEFT$(TW$,3) < >"ALL"  THEN 3090
  305. 3050  IF CL = 0  THEN  GOSUB 3480: GOTO 3090
  306. 3060  IF SD$ = "000000"  AND ED$ = SD$  THEN  GOSUB 3480: GOTO 3090
  307. 3070  IF SD$ = "000000"  AND  VAL( LEFT$(ED$,4)) > = S1  THEN  GOSUB 3480: GOTO 3090
  308. 3080  IF  VAL( LEFT$(SD$,4)) < = S1  AND  VAL( LEFT$(ED$,4)) > = S1  THEN  GOSUB 3480
  309. 3090  NEXT : PRINT D$"CLOSE"
  310. 3100 A = 0: VTAB 1: POKE 1403,0: PRINT "ESC to Quit": PRINT "TAB for Next Message": GOSUB 5520
  311. 3110 D = 0: FOR I = 1 TO C: IF CL  THEN  GOSUB 5640: TEXT : VTAB 1: POKE 1403,65: PRINT MN$"/"DA$"/"YR" "HR$":"MI$;: VTAB 3
  312. 3120  PRINT D$"OPEN /RAM/MSG,L575": PRINT D$"READ /RAM/MSG,R"I
  313. 3130  INPUT SD$,ED$,ST$,ET$: IF SD$ = ""  THEN  GOSUB 3300: GOTO 3190
  314. 3140  IF   NOT CL  THEN  GOSUB 3300: GOTO 3190
  315. 3150  IF SD$ = "000000"  AND ST$ = "0000"  AND ET$ = ST$  THEN  GOSUB 3300: GOTO 3190
  316. 3160  IF SD$ = "000000"  AND (ST$ < = HR$ +MI$  AND ET$ > = HR$ +MI$)  THEN  GOSUB 3300: GOTO 3190
  317. 3170  IF ( LEFT$(SD$,4) < = MN$ +DA$  AND MN$ +DA$ < =  LEFT$(ED$,4))  THEN  IF (ST$ = "0000"  AND ET$ = ST$)  THEN  GOSUB 3300: GOTO 3190
  318. 3180  IF (ST$ < = HR$ +MI$  AND ET$ > = HR$ +MI$)  AND  LEFT$(ED$,4) > = MN$ +DA$  THEN  GOSUB 3300
  319. 3190  PRINT D$"CLOSE": NEXT : IF D = 0  THEN 3210
  320. 3200  GOTO 3110
  321. 3210  IF DL = 1  THEN  PRINT D$"DELETE DISPLAY.LIST"
  322. 3220 DL = 0: PRINT D$"DELETE /RAM/MSG": RETURN 
  323. 3230  PRINT D$"CLOSE": PRINT D$"DELETE /RAM/MSG": IF   NOT DL  THEN  RETURN 
  324. 3240  VTAB 4: POKE 1403,0: CALL  -958
  325. 3250  VTAB 12: INPUT "Do you want to delete the current DISPLAY.LIST file?";YN$
  326. 3260  IF  LEFT$(YN$,1) = "n"  OR  LEFT$(YN$,1) = "N"  THEN 3290
  327. 3270  IF  LEFT$(YN$,1) = "y"  OR  LEFT$(YN$,1) = "Y"  THEN  PRINT D$"DELETE DISPLAY.LIST": GOTO 3290
  328. 3280  PRINT  CHR$(7): VTAB 12: CALL  -958: GOTO 3250
  329. 3290 DL = 0: RETURN 
  330. 3300  FOR J = 1 TO 8: INPUT M$(J): NEXT 
  331. 3310 D = D +1:A = A +1: IF A = 3  THEN A = 1
  332. 3320  TEXT : ON A GOSUB 3400,3440: FOR J = 1 TO 8: IF  PEEK(64448) = 234  AND A = 1  THEN  PRINT " ";: REM  1 SPACE
  333. 3330  FOR J = 1 TO 8: IF J = 8  THEN  PRINT M$(J);: GOTO 3350
  334. 3340  PRINT M$(J)
  335. 3350  NEXT : VTAB 12: IF GS  THEN T = 6000: GOTO 3370
  336. 3360 T = 2000
  337. 3370  FOR J = 1 TO T:X =  PEEK( -16384): IF X = 155  THEN  POKE  -16368,0: POP : TEXT : GOTO 3230
  338. 3380  IF X = 137  THEN J = T
  339. 3390  NEXT : POKE  -16368,0: RETURN 
  340. 3400  VTAB 4: POKE 1403,0: INVERSE : FOR J = 1 TO 64: PRINT " ";: NEXT : PRINT : REM 1 SPACE
  341. 3410  FOR J = 1 TO 8: POKE 1403,0: PRINT " ";: POKE 1403,65: PRINT " ": NEXT : REM 1 SPACE
  342. 3420  POKE 1403,0: FOR J = 1 TO 66: PRINT " ";: NEXT : NORMAL : REM 1 SPACE
  343. 3430  POKE 32,3: POKE 33,62: POKE 34,4: POKE 35,12: HOME : RETURN 
  344. 3440  VTAB 15: POKE 1403,13: INVERSE : FOR J = 1 TO 66: PRINT " ";: NEXT : PRINT : REM 1 SPACE
  345. 3450  FOR J = 1 TO 8: POKE 1403,13: PRINT " ";: POKE 1403,78: PRINT " ": NEXT : REM 1 SPACE
  346. 3460  POKE 1403,13: FOR J = 1 TO 66: PRINT " ";: NEXT : NORMAL : REM 1 SPACE
  347. 3470  POKE 32,16: POKE 33,62: POKE 34,15: POKE 35,23: HOME : RETURN 
  348. 3480  FOR J = 1 TO 8: INPUT M$(J): NEXT 
  349. 3490 C = C +1: PRINT D$"OPEN /RAM/MSG,L575": PRINT D$"WRITE /RAM/MSG,R"C
  350. 3500  PRINT SD$: PRINT ED$: PRINT ST$: PRINT ET$: FOR J = 1 TO 8: PRINT Q$;M$(J): NEXT 
  351. 3510  PRINT D$"CLOSE /RAM/MSG": RETURN 
  352. 3520  REM  READ DISPLAY.LIST
  353. 3530 C = 0
  354. 3540  VTAB 12:A$ = "Please wait, retrieving messages.": GOSUB 5710
  355. 3550  PRINT D$"OPEN DISPLAY.LIST": PRINT D$"READ DISPLAY.LIST"
  356. 3560  INPUT A: IF A =  -1  THEN 3580
  357. 3570 C = C +1:DS(C) = A: GOTO 3560
  358. 3580  PRINT D$"CLOSE"
  359. 3590  FOR I = 1 TO C:A = DS(I)
  360. 3600  PRINT D$"OPEN MESSAGE.BASE,L575": PRINT D$"READ MESSAGE.BASE,R"A: INPUT T$,TW$,SD$,ED$,ST$,ET$: FOR J = 1 TO 8: INPUT M$(J): NEXT : PRINT D$"CLOSE MESSAGE.BASE"
  361. 3610  PRINT D$"OPEN /RAM/MSG,L575": PRINT D$"WRITE /RAM/MSG,R"I: PRINT SD$: PRINT ED$: PRINT ST$: PRINT ET$: FOR J = 1 TO 8: PRINT Q$;M$(J): NEXT : PRINT D$"CLOSE /RAM/MSG"
  362. 3620  NEXT : RETURN 
  363. 3630  REM  PERSONAL MESSAGES
  364. 3640  TEXT : HOME :A$ = "*** PERSONAL MESSAGES ***": GOSUB 5710
  365. 3650  IF NU = 0  THEN  GOTO 4310
  366. 3660  VTAB 12: INPUT "Please enter your name:";YN$: IF  LEN(YN$) >20  THEN  VTAB 12: PRINT  CHR$(7): CALL  -958: GOTO 3660
  367. 3670  IF  LEN(YN$) = 0  THEN  RETURN 
  368. 3680  VTAB 12: CALL  -958: VTAB 12: PRINT "Searching for messages to ";: INVERSE : PRINT YN$: NORMAL 
  369. 3690  IF CL  THEN  GOSUB 5640:S1 =  VAL(MN$ +DA$):T1 =  VAL(HR$ +MI$)
  370. 3700  PRINT D$"OPEN MESSAGE.BASE,L575":C = 0
  371. 3710  FOR I = 1 TO NU: PRINT D$"READ MESSAGE.BASE,R"I
  372. 3720  INPUT T$,TW$,SD$,ED$,ST$,ET$
  373. 3730  IF  LEFT$(TW$,3) = "ALL"  THEN 3790
  374. 3740  IF  LEFT$(TW$, LEN(YN$)) < >YN$  THEN 3790
  375. 3750  IF SD$ = "000000"  AND ED$ = SD$  THEN  GOSUB 3480: GOTO 3790
  376. 3760  IF SD$ = "000000"  AND  VAL( LEFT$(ED$,4)) > = S1  THEN  GOSUB 3480: GOTO 3790
  377. 3770  IF ( LEFT$(SD$,4) < = MN$ +DA$  AND MN$ +DA$ < =  LEFT$(ED$,4))  THEN  IF (ST$ = "0000"  AND ET$ = ST$)  THEN  GOSUB 3480: GOTO 3790
  378. 3780  IF  VAL( LEFT$(SD$,4)) < = S1  AND  VAL( LEFT$(ED$,4)) > = S1  THEN  GOSUB 3480
  379. 3790  NEXT : PRINT D$"CLOSE"
  380. 3800  IF C >0  THEN  VTAB 12: CALL  -958: GOTO 3100
  381. 3810  VTAB 14: PRINT  CHR$(7)"There are no messages for "YN$".": PRINT 
  382. 3820  PRINT "Press RETURN for the main menu."
  383. 3830 X =  PEEK( -16384): IF X = 141  THEN  POKE  -16368,0: RETURN 
  384. 3840  GOTO 3830
  385. 3850  REM  PURGE DELETED MESSAGES
  386. 3860  TEXT : HOME :A$ = "Purge Deleted Messages": GOSUB 5510
  387. 3870 FL = 0: IF NU = 0  THEN 4310
  388. 3880  VTAB 10: CALL  -958: VTAB 12:A$ = "Purging deleted messages. Please wait.": GOSUB 5710
  389. 3890  PRINT D$"OPEN "PF$",TDIR": PRINT D$"READ "PF$
  390. 3900  INPUT A$
  391. 3910  IF  MID$ (A$,2,12) = "MESSAGE.BASE"  THEN B =  VAL( MID$ (A$,25,4))
  392. 3920  IF  MID$ (A$,2,12) = "DISPLAY.LIST"  THEN FL = 1
  393. 3930  IF  LEFT$(A$,5) = "BLOCK"  THEN BF =  VAL( MID$ (A$,14,4)): PRINT D$"CLOSE": GOTO 3950
  394. 3940  GOTO 3900
  395. 3950  IF B >BF  THEN 4090: REM  NOT ENOUGH SPACE ON DISK
  396. 3960 C = 0
  397. 3970  PRINT D$"OPEN MESSAGE.BASE,L575": PRINT D$"OPEN TEMP,L575"
  398. 3980  FOR I = 1 TO NU: PRINT D$"READ MESSAGE.BASE,R"I
  399. 3990  INPUT T$: IF  LEFT$(T$,8) = "_DELETED"  THEN 4040
  400. 4000  INPUT TW$,SD$,ED$,ST$,ET$: FOR J = 1 TO 8: INPUT M$(J): NEXT 
  401. 4010 C = C +1
  402. 4020  PRINT D$"WRITE TEMP,R"C
  403. 4030  PRINT Q$;T$: PRINT Q$;TW$: PRINT SD$: PRINT ED$: PRINT ST$: PRINT ET$: FOR J = 1 TO 8: PRINT Q$;M$(J): NEXT 
  404. 4040  NEXT : PRINT D$"WRITE TEMP,R0": PRINT C: PRINT D$"CLOSE"
  405. 4050  PRINT D$"DELETE MESSAGE.BASE"
  406. 4060  PRINT D$"RENAME TEMP,MESSAGE.BASE"
  407. 4070  IF FL  THEN FL = 0: PRINT D$"DELETE DISPLAY.LIST"
  408. 4080 NU = C:MB = 0: RETURN 
  409. 4090  VTAB 12: CALL  -958
  410. 4100 A$ = "Using /RAM to purge the message data base.": GOSUB 5710
  411. 4110 C = 0
  412. 4120  PRINT D$"OPEN MESSAGE.BASE,L575": PRINT D$"OPEN /RAM/TEMP,L575"
  413. 4130  FOR I = 1 TO NU: PRINT D$"READ MESSAGE.BASE,R"I
  414. 4140  INPUT T$: IF  LEFT$(T$,8) = "_DELETED"  THEN 4190
  415. 4150  INPUT TW$,SD$,ED$,ST$,ET$: FOR J = 1 TO 8: INPUT M$(J): NEXT 
  416. 4160 C = C +1
  417. 4170  PRINT D$"WRITE /RAM/TEMP,R"C
  418. 4180  PRINT Q$;T$: PRINT Q$;TW$: PRINT SD$: PRINT ED$: PRINT ST$: PRINT ET$: FOR J = 1 TO 8: PRINT Q$;M$(J): NEXT 
  419. 4190  NEXT : PRINT D$"WRITE /RAM/TEMP,R0": PRINT C: PRINT D$"CLOSE"
  420. 4200  PRINT D$"DELETE MESSAGE.BASE"
  421. 4210  VTAB 12: CALL  -958:A$ = "Rewriting purged message data base to main disk.": GOSUB 5710
  422. 4220  PRINT D$"OPEN /RAM/TEMP,L575": PRINT D$"OPEN MESSAGE.BASE,L575"
  423. 4230  FOR I = 1 TO C: PRINT D$"READ /RAM/TEMP,R"I
  424. 4240  INPUT T$,TW$,SD$,ED$,ST$,ET$: FOR J = 1 TO 8: INPUT M$(J): NEXT 
  425. 4250  PRINT D$"WRITE MESSAGE.BASE,R"I
  426. 4260  PRINT Q$;T$: PRINT Q$;TW$: PRINT SD$: PRINT ED$: PRINT ST$: PRINT ET$: FOR J = 1 TO 8: PRINT Q$;M$(J): NEXT 
  427. 4270  NEXT : PRINT D$"WRITE MESSAGE.BASE,R0": PRINT C: PRINT D$"CLOSE"
  428. 4280  PRINT D$"DELETE /RAM/TEMP"
  429. 4290  GOTO 4070
  430. 4300  REM  NO MESSAGES IN DATA BASE
  431. 4310  IF NU = 0  THEN  VTAB 12: PRINT  CHR$(7)"There are no messages in the data base.": PRINT : PRINT "Press a key for the program menu.";: GET A$: PRINT A$: RETURN 
  432. 4320  REM  EDIT A MESSAGE
  433. 4330 A$ = "EDIT A MESSAGE": GOSUB 5500: VTAB 1:ED = 1:FL = 0
  434. 4340  GOSUB 5620
  435. 4350  IF NU = 0  THEN  GOTO 4310
  436. 4360  IF R >0  THEN 4380
  437. 4370  IF   NOT MB  THEN  GOSUB 4900: REM READ MESSAGE.BASE 
  438. 4380  VTAB 12: CALL  -868
  439. 4390  GOSUB 5530: GOSUB 5590
  440. 4400  VTAB 5:B = 1:I = 0
  441. 4410 I = I +1: POKE 1403,0: IF I >NU  THEN  GOSUB 5600: GOTO 4470
  442. 4420  IF I <10  THEN  PRINT "  ";: GOTO 4440: REM 2 SPACES
  443. 4430  IF I <100  THEN  PRINT " ";: REM 1 SPACE
  444. 4440  PRINT I". "; LEFT$(T$(I),74)
  445. 4450  IF  PEEK(37) = 21  AND I < >NU  THEN 4490
  446. 4460  IF I < = NU  THEN 4410
  447. 4470 I = I -1: IF FL < >2  THEN  GOSUB 5000: IF I <NU  THEN  VTAB 5: POKE 1403,0: CALL  -958: GOSUB 5530: GOSUB 5590: GOTO 4520
  448. 4480  GOTO 4530
  449. 4490  GOSUB 5610
  450. 4500  GOSUB 5000: IF FL = 2  THEN 4530
  451. 4510 B = I +1: VTAB 5: POKE 1403,0: CALL  -958: GOSUB 5530: GOSUB 5590
  452. 4520  VTAB 5: GOTO 4460
  453. 4530  VTAB 9: POKE 1403,8: INVERSE : FOR I = 1 TO 63: PRINT " ";: NEXT : PRINT : REM 1 SPACE
  454. 4540  FOR I = 1 TO 8: POKE 1403,8: PRINT " ";: POKE 1403,70: PRINT " ":: NEXT : REM 1 SPACE
  455. 4550  POKE 1403,8: FOR I = 1 TO 63: PRINT " ";: NEXT : NORMAL : REM 1 SPACE
  456. 4560  VTAB 22: POKE 1403,0: CALL  -958
  457. 4570  POKE 32,10: POKE 33,60: POKE 34,9: POKE 35,17: HOME 
  458. 4580  FOR I = 1 TO 8: IF  LEN(M$(I)) = 60  AND I < >8  THEN  POKE 33,62: PRINT M$(I);: INVERSE : PRINT " ": NORMAL : POKE 33,60: GOTO 4620
  459. 4590  IF  LEN(M$(I)) = 60  AND I = 8  THEN  POKE 33,62: PRINT M$(I);: INVERSE : PRINT " ";: NORMAL : POKE 33,60: GOTO 4620
  460. 4600  IF I = 8  THEN  PRINT M$(I);: GOTO 4620
  461. 4610  PRINT M$(I)
  462. 4620  NEXT : TEXT : GOSUB 1400
  463. 4630  PRINT : POKE 1403,20: PRINT "Is this information correct? (Y/N/ESC to cancel) ";
  464. 4640 X =  PEEK( -16384)
  465. 4650  IF X = 155  THEN  POKE  -16368,0: RETURN 
  466. 4660  IF X = 217  OR X = 249  THEN  POKE  -16368,0: GOTO 4690
  467. 4670  IF X = 206  OR X = 238  THEN  POKE  -16368,0: VTAB 16: CALL  -958: GOSUB 1680: GOTO 4630
  468. 4680  GOTO 4640
  469. 4690  PRINT D$"OPEN MESSAGE.BASE,L575": PRINT D$"WRITE MESSAGE.BASE,R"R
  470. 4700  PRINT Q$;T$: PRINT Q$;TW$: PRINT SD$: PRINT ED$: PRINT ST$: PRINT ET$: FOR I = 1 TO 8: PRINT Q$;M$(I): NEXT 
  471. 4710  PRINT D$"CLOSE": IF  LEFT$(TW$,3) < >"ALL"  THEN TW$ = "PERSONAL"
  472. 4720  IF  LEN(T$) <25  THEN T$ = T$ +" ": GOTO 4720: REM  1 SPACE
  473. 4730  IF  LEN(TW$) <20  THEN TW$ = TW$ +" ": GOTO 4730: REM  1 SPACE
  474. 4740 SD$ =  LEFT$(SD$,2) +"/" + MID$ (SD$,3,2) +"/" + RIGHT$(SD$,2) +" ": REM 1 SPACE  
  475. 4750 ED$ =  LEFT$(ED$,2) +"/" + MID$ (ED$,3,2) +"/" + RIGHT$(ED$,2) +" ": REM 1 SPACE
  476. 4760 ST$ =  LEFT$(ST$,2) +":" + RIGHT$(ST$,2) +" ": REM  1 SPACE
  477. 4770 ET$ =  LEFT$(ET$,2) +":" + RIGHT$(ET$,2): IF F1  THEN R = NU
  478. 4780 T$(R) = T$ +TW$ +SD$ +ED$ +ST$ +ET$: IF F1  THEN  RETURN 
  479. 4790  TEXT : HOME : VTAB 12: INPUT "Do you want to edit another message?";YN$: IF  LEFT$(YN$,1) = "n"  OR  LEFT$(YN$,1) = "N"  THEN  RETURN 
  480. 4800  IF  LEFT$(YN$,1) = "y"  OR  LEFT$(YN$,1) = "Y"  THEN  HOME : GOTO 4330
  481. 4810  PRINT  CHR$(7): GOTO 4790
  482. 4820  REM  EXIT TO BASIC
  483. 4830  VTAB 24: POKE 1403,0: CALL  -958
  484. 4840  PRINT "Press 'Q' to quit, any other key for the menu.";
  485. 4850 X =  PEEK( -16384): IF X = 209  OR X = 241  THEN  POKE  -16368,0: GOTO 4880
  486. 4860  IF X >128  THEN  POKE  -16368,0: GOTO 1270
  487. 4870  GOTO 4850
  488. 4880  TEXT : HOME : PRINT D$"PREFIX"PR$: END 
  489. 4890  REM  READ TOPICS FROM MESSAGE.BASE
  490. 4900  VTAB 12:A$ = "Please wait. Message topics being retrieved.": GOSUB 5710
  491. 4910  PRINT D$"OPEN MESSAGE.BASE,L575": FOR I = 1 TO NU: PRINT D$"READ MESSAGE.BASE,R"I: INPUT A$,B$,C$,E$,F$,G$: IF  LEFT$(B$,3) < >"ALL"  THEN B$ = "PERSONAL"
  492. 4920  IF  LEN(A$) <25  THEN A$ = A$ +" ": GOTO 4920
  493. 4930  IF  LEN(B$) <20  THEN B$ = B$ +" ": GOTO 4930
  494. 4940 C$ =  LEFT$(C$,2) +"/" + MID$ (C$,3,2) +"/" + RIGHT$(C$,2) +" ": REM  1 SPACE
  495. 4950 E$ =  LEFT$(E$,2) +"/" + MID$ (E$,3,2) +"/" + RIGHT$(E$,2) +" ": REM  1 SPACE    
  496. 4960 F$ =  LEFT$(F$,2) +":" + RIGHT$(F$,2) +" ": REM   1 SPACE  
  497. 4970 G$ =  LEFT$(G$,2) +":" + RIGHT$(G$,2)
  498. 4980 T$(I) = A$ +B$ +C$ +E$ +F$ +G$: NEXT I: PRINT D$"CLOSE":MB = 1: RETURN 
  499. 4990  REM MOVE CURSOR FOR DELETE & DISPLAY.LIST SEQ.
  500. 5000 VT = 5:HT = 0:T = B:E = I:P = 1: POKE  -16368,0
  501. 5010  GOSUB 2380: INVERSE :A$ =  STR$(T): GOSUB 5470
  502. 5020  PRINT A$;: NORMAL 
  503. 5030 X =  PEEK( -16384): IF X = 155  THEN  POKE  -16368,0: POP : FOR I = 1 TO CT:DS(I) = 0: NEXT : RETURN 
  504. 5040  IF (X = 209  OR X = 241)  AND FL  THEN  POKE  -16368,0: POP : RETURN 
  505. 5050  IF (X = 209  OR X = 241)  AND   NOT FL  THEN  POKE  -16368,0:FL = 2: RETURN 
  506. 5060  IF ( PEEK(49249) >127  OR  PEEK(49250) >127)  AND X = 137  THEN  POKE  -16368,0: GOTO 5130
  507. 5070  IF X = 137  AND NU >E  THEN  POKE  -16368,0: RETURN 
  508. 5080  IF X = 137  THEN  POKE  -16368,0:X = 0
  509. 5090  IF X = 138  OR X = 149  THEN  GOSUB 5160: GOTO 5120
  510. 5100  IF X = 136  OR X = 139  THEN  GOSUB 5180: GOTO 5120
  511. 5110  IF X = 141  THEN 5200
  512. 5120  GOTO 5030
  513. 5130  IF I -34 <0  THEN 5090
  514. 5140  IF I = NU  THEN I = I -((NU -(17 * INT(NU/17))) +17):B = I +1: RETURN 
  515. 5150 I = I -34:B = B -34: RETURN 
  516. 5160  POKE  -16368,0: IF (P +B) -1 = E  THEN  GOSUB 2380:A$ =  STR$(E): GOSUB 5470: PRINT A$;:P = (T -B) +1:VT = 5: INVERSE :A$ =  STR$(T): GOSUB 5470: GOSUB 2380: PRINT A$;: NORMAL : RETURN 
  517. 5170 A$ =  STR$(P +B -1): GOSUB 5470: GOSUB 2380: PRINT A$:P = P +1:VT = VT +1:A$ =  STR$(P +B -1): GOSUB 5470: GOSUB 2380: INVERSE : PRINT A$;: NORMAL : RETURN 
  518. 5180  POKE  -16368,0: IF (P +B) -1 = T  THEN  GOSUB 2380:A$ =  STR$(T): GOSUB 5470: PRINT A$;:P = (E -B) +1:VT = (E -B) +5: INVERSE :A$ =  STR$(E): GOSUB 5470: GOSUB 2380: PRINT A$;: NORMAL : RETURN 
  519. 5190 A$ =  STR$(P +B -1): GOSUB 5470: GOSUB 2380: PRINT A$:P = P -1:VT = VT -1:A$ =  STR$(P +B -1): GOSUB 5470: GOSUB 2380: INVERSE : PRINT A$;: NORMAL : RETURN 
  520. 5200  POKE  -16368,0
  521. 5210  IF ED  THEN 5430
  522. 5220  IF   NOT FL  THEN  GOSUB 5350: GOTO 5030
  523. 5230  VTAB 23: CALL  -958: VTAB 23: POKE 1403,0: PRINT "Press the DELETE key to confirm, any other key to abort.";
  524. 5240 X =  PEEK( -16384): IF X = 255  THEN  POKE  -16368,0: GOTO 5270
  525. 5250  IF X >128  THEN  POKE  -16368,0: GOTO 5300
  526. 5260  GOTO 5240
  527. 5270  VTAB 24: POKE 1403,0: CALL  -958: VTAB 24: PRINT "Message being deleted.";
  528. 5280 T$(P +B -1) = "_DELETED":DE = 1
  529. 5290  PRINT D$"OPEN MESSAGE.BASE,L575": PRINT D$"WRITE MESSAGE.BASE,R"(P +B -1): PRINT T$(P +B -1): FOR J = 1 TO 13: PRINT : NEXT : PRINT D$"CLOSE"
  530. 5300  GOSUB 2380:A$ =  STR$(P +B -1): GOSUB 5470
  531. 5310  INVERSE : PRINT A$;: NORMAL : CALL  -868: PRINT ". "T$(P +B -1)
  532. 5320  VTAB 23: CALL  -958: GOSUB 5530: GOSUB 5590: IF I = NU  THEN  GOSUB 5600: GOTO 5030
  533. 5330  IF NU >I  THEN  PRINT "TAB for more";: IF I -17 >0  THEN  PRINT ", OPEN-APPLE-TAB to go back";
  534. 5340  GOTO 5030
  535. 5350 C = C +1:CT = CT +1:SS = 0
  536. 5360  IF  MID$ (T$(P +B -1),26,3) < >"ALL"  THEN C = C -1:CT = CT -1: RETURN 
  537. 5370 SS = SS +1: IF SS >CT  THEN 5400
  538. 5380  IF DS(SS) = P +B -1  THEN C = C -2:DS(SS) = 0: VTAB VT: POKE 1403,5:T$(P +B -1) =  LEFT$(T$(P +B -1),74): PRINT T$(P +B -1): GOTO 5420
  539. 5390  GOTO 5370
  540. 5400  IF  RIGHT$(T$(P +B -1),1) = "_"  THEN C = C -1:CT = CT -1: RETURN 
  541. 5410 DS(CT) = P +B -1: INVERSE : VTAB VT: POKE 1403,5: PRINT T$(P +B -1): NORMAL :T$(P +B -1) = T$(P +B -1) +"_"
  542. 5420  VTAB 24: POKE 1403,60: PRINT "Topics selected:";: INVERSE : PRINT C;: NORMAL : RETURN 
  543. 5430 R = P +B -1: PRINT D$"OPEN MESSAGE.BASE,L575": PRINT D$"READ MESSAGE.BASE,R"R
  544. 5440  INPUT T$,TW$,SD$,ED$,ST$,ET$: FOR J = 1 TO 8: INPUT M$(J): NEXT 
  545. 5450  PRINT D$"CLOSE"
  546. 5460  HOME :A$ = "EDIT A MESSAGE": GOSUB 5500:FL = 2: RETURN 
  547. 5470  IF  LEN(A$) <3  THEN A$ = " " +A$: GOTO 5470
  548. 5480  RETURN 
  549. 5490  REM  Header Line
  550. 5500  TEXT : HOME : PRINT "ESC to cancel";
  551. 5510  GOSUB 5710
  552. 5520  PRINT "================================================================================";: RETURN : REM  80 '='
  553. 5530  VTAB 22: POKE 1403,0: GOSUB 5520: RETURN 
  554. 5540  REM  PRINT DATE & TIME
  555. 5550  POKE  -16368,0: GOSUB 5640: VTAB 24: POKE 1403,60
  556. 5560  PRINT MN$"/"DA$"/"YR"  "HR$":"MI$;: RETURN 
  557. 5570  VTAB 22: POKE 1403,0: VTAB 23: GOSUB 5520: PRINT "Use arrows or enter number and press RETURN";
  558. 5580  RETURN 
  559. 5590  PRINT "Use arrow and press RETURN to select.": RETURN 
  560. 5600  VTAB 24: PRINT "OPEN-APPLE-TAB to go back";: RETURN 
  561. 5610  VTAB 24: PRINT "TAB for more, OPEN-APPLE-TAB to go back.";: RETURN 
  562. 5620  VTAB 3: POKE 1403,0: PRINT "NO.  TOPIC"; SPC( 20);"TO"; SPC( 18);"S.DATE   E.DATE   S.T.  E.T.": VTAB 4: GOSUB 5520: RETURN 
  563. 5630  REM  Read Clock Using MLI
  564. 5640  POKE 768,32: POKE 769,0: POKE 770,191: POKE 771,130: POKE 774,96: CALL 768
  565. 5650 HR = 100 + PEEK(49043):MI = 100 + PEEK(49042):DA =  PEEK(49040) - INT( PEEK(49040)/32) *32:DA = DA +100
  566. 5660 YR =  INT( PEEK(49041)/2):MN = ( INT( PEEK(49040)/32) +( PEEK(49041) -(YR *2)) *8) +100
  567. 5670 HR$ =  RIGHT$( STR$(HR),2):MI$ =  RIGHT$( STR$(MI),2):DA$ =  RIGHT$( STR$(DA),2):MN$ =  RIGHT$( STR$(MN),2)
  568. 5680  RETURN 
  569. 5690  HOME : VTAB 12: PRINT "THIS PROGRAM REQUIRES AN APPLE //E, //C OR GS WITH AN 80 COLUMN CARD.": END 
  570. 5700  REM  Center Text
  571. 5710 HT = 40 - LEN(A$)/2: POKE 1403,HT: PRINT A$: RETURN 
  572. 5720  REM  ERROR HANDLING ROUTINES
  573. 5730 ER =  PEEK(222):EL =  PEEK(218) + PEEK(219) *256: PRINT  CHR$(4)"CLOSE": POKE 216,0
  574. 5740  IF ER = 6  AND CH = 1  THEN 5880
  575. 5750  IF ER = 6  AND CH = 2  THEN 5890
  576. 5760  TEXT : HOME : VTAB 12: PRINT  CHR$(7)
  577. 5770  IF ER = 4  THEN  PRINT "DISK IS WRITE PROTECTED!": GOTO 5860
  578. 5780  IF ER = 5  THEN  PRINT "DATA BASE FILE IS DAMAGED!": GOTO 5860
  579. 5790  IF ER = 6  THEN  PRINT "PATH NOT FOUND!": GOTO 5860
  580. 5800  IF ER = 8  THEN  PRINT "I/O ERROR!": GOTO 5860
  581. 5810  IF ER = 9  THEN  PRINT "DISK IS FULL. MOVE PROGRAM AND MESSAGE.BASE FILE TO A NEW DISK!": GOTO 5860
  582. 5820  IF ER = 10  THEN  PRINT "DATA BASE FILES ARE LOCKED!": GOTO 5860
  583. 5830  IF ER = 11  OR ER = 16  THEN  PRINT "SYNTAX ERROR IN LINE "EL".": GOTO 5860
  584. 5840  IF ER = 21  THEN  PRINT D$"CLOSE": PRINT D$"PREFIX"PR$: RESTORE : GOTO 950
  585. 5850  PRINT "ERROR #"ER" HAS OCCURRED IN LINE "EL". PLEASE REFER TO YOUR APPLESOFT OR": PRINT "PRODOS MANUAL.": PRINT D$"CLOSE": PRINT D$"PREFIX"PR$: END 
  586. 5860  PRINT : PRINT "INSERT YOUR DISK AND PRESS RETURN.": ONERR  GOTO 5730
  587. 5870  GET A$: PRINT A$: PRINT D$"PREFIX"PR$: RESTORE : GOTO 950
  588. 5880  HOME : VTAB 12: PRINT "THIS PROGRAM REQUIRES THE PRODOS RAM DISK, /RAM.": PRINT D$"PREFIX"PR$: END 
  589. 5890  PRINT D$"OPEN MESSAGE.BASE,L575": PRINT D$"WRITE MESSAGE.BASE,R0": PRINT 0: PRINT D$"CLOSE": GOTO 930
  590. 5900  IF  PEEK(64448) < >234  THEN  INVERSE : PRINT " ";: NORMAL 
  591. 5910  RETURN