home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / simtel / sigm / vols100 / vol128 / entrbbs.bas < prev    next >
Encoding:
BASIC Source File  |  1994-07-13  |  28.8 KB  |  1,008 lines

  1. 5 '    ------------->> ENTERBBS V3.2 17/Jul/83 <<-------------
  2. 10 '
  3. 11 '  As run on Software Tools/RCPM, Australia (61-2)-997-1836)
  4. 12 '
  5. 13 '   : Entry/name-logging module of RBBS version 2.2,    :
  6. 14 '   : from Howard Moulton's original SJBBS (in Xitan    :
  7. 15 '   : Basic), converted to MBASIC and called RBBS or    :
  8. 16 '   : RIBBS by Bruce Ratoff, and extensively revised/   :
  9. 17 '   : expanded by Ron Fowler to become RBBS22.          :
  10. 18 '   :---------------------------------------------------:
  11. 19 '   : The Fowler version, RBBS22, was split into 2 mod- :
  12. 20 '   : ules, ENTERBBS and MINIRBBS, by Ben Bronson.      :
  13. 21 '   :---------------------------------------------------:
  14. 22 '   : Both were revised and given RBBS-compatible ver-  :
  15. 23 '   : sion nos. in 03/81 by Tim Nicholas, to incorporate:
  16. 24 '   : updates from his version 2.4 of RBBS.             :
  17. 25 '  ------------------------------------------------------
  18. 26 '     Added test for "*" in CALLERS file (from RBBS) and
  19. 27 '     if CALLERS file finds "*" in beginning of caller's
  20. 28 '     name, it will not allow him system access, and log
  21. 29 '     him off immediately. (For those who persist in log-
  22. 30 '     ging in with fictitious names, e.g. BUG BYTE). Also
  23. 31 '     added "PWDS" file (from RBBS) for "P2$" only. So
  24. 32 '     Sysop can get msgs for "SYSOP" or his name.
  25. 33 '     by Tim Nicholas  05/Mar/81
  26. 34 '    ------------------------------------------------------
  27. 35 '     Changed sequence of response to question "Did I mis-
  28. 36 '     anything?", so that a response other than "Y" or "y"
  29. 37 '     or "N"/"n" will re-ask the question. So in noisy line
  30. 38 '     conditions it won't automaticaly default to "N"/"n".
  31. 39 '     Added suggestion by Ben Bronson to move printing of
  32. 40 '     "BULLETIN" file to after name-taking, and other sign
  33. 41 '     in procedures.  by Tim Nicholas 12/Mar/81.
  34. 42 '    ------------------------------------------------------ 
  35. 43 '  More modifications by BB (14/Mar/81): checking-for-msgs
  36. 44 '  code transferred from MINIRBBS, lines 810-965.  No new
  37. 45 '  version number.  AND sysop now drops direct to disk
  38. 46 '  without incrementing COUNTERS.
  39. 47 ' -------------------------------------------------------- 
  40. 48 '  Modifications by Bill Bolton (up to 01/Jun/82). Godbout
  41. 49 '  System Support 1 clock routines, DATA file read moved to
  42. 50 '  before menus and BULLETIN choice so it can be used to show
  43. 51 '  date of latest update to BULLETIN, code "structured" for
  44. 52 '  easier reading/maintenance (but now MUST use MBASIC editor).
  45. 53 '  MAGIC$ added for SYSOP password . Password no longer echoed for
  46. 54 '  more secure remote use. SUMMARY check for new callers
  47. 55 '  too. Numerous other small changes. Version to 2.7A (for Australia)
  48. 56 ' --------------------------------------------------------
  49. 57 '  Twit log out changed. Twits are written out to LASTCALR with
  50. 58 '  TW tag. Then logged out through EXITRBBS for consistancy. Note
  51. 59 '  that EXITRBBS and RBBSUTIL have been simultaneously updated to
  52. 60 '  make use of this TW status in LASTCALR. ST$ reset if something was
  53. 61 '  misspelled in name log to stop redundant info getting into CALLERS
  54. 62 '  If comma entered between town and state it is changed to a period
  55. 63 '  to make life easier for EXITRBBS. RESET statement added at
  56. 64 '  start to allow for changes to disk between calls without having
  57. 65 '  to cold boot. Version to 2.7D, Bill Bolton
  58. 66 '----------------------------------------------------------------------
  59. 67 '  10/Apr/81 additions: another PWD step for SYSOP to go
  60. 68 '     thru, to discourage villians...
  61. 69 '  11/Apr/81: Change "SYSOP" to another word, to ditto..
  62. 70 '    (see lines 600-610)
  63. 71 '  02/May/81: add Y/N for skipping BULLETIN
  64. 72 '  09/May/81: add routine for reading special user messages (=SPECIAL) 
  65. 73 '  20/Jun/81: add putting P$ (SP or RG) into LASTCALR so user 
  66. 74 '    privilege status can be passed to MINIRBBS
  67. 75 '  08/Aug/81: change special user introduction
  68. 76 '  18/Aug/81: insert Bill Earnest's routines for counting
  69. 77 '    callers & putting times in USERS, CALLERS, & LASTCALR
  70. 78 '  01/Sep/81: add Brian Kantor's CHAIN MINIRBBS & system user quiz
  71. 79 '  07/Sep/81: drop re-caller straight to CP/M
  72. 80 '  09/Sep/81: CALL TIMEX added (Dummy routine compiled with M80 and
  73. 81 '    linked to the BASCOMed pgm with L80, calling an ASM
  74. 82 '    pgm above CP/M for reading the MH clock; other clocks
  75. 83 '      can probably be handled with direct port reads)
  76. 84 '  19/Sep/81: Give special (SP) users a command menu 
  77. 85 '  10/Sep/81: Improve twit sign-out; POKE reset bits for PMMI
  78. 86 '  27/Sep/81: Add Hank Szyszka's time interval stuff.
  79. 87 '  9/Oct/81: Add 3rd user category, NW, without direct MINIRBBS access
  80. 88 '  10/Oct/81: And add cp/m knowledge test at 390 & 32000
  81. 89 '  24/Oct/81: Limited command menu for RG users too.
  82. 90 '  01/Jun/82: Numerous Aussie changes, see above. Bill Bolton
  83. 91 '  15/Jun/82: Twit logout changed, see above. Bill Bolton
  84. 92 '  26/Mar/83: More demanding user name check added. 24 hour elapsed
  85. 93 '  time bug fixed. Version 2.8 Bill Bolton
  86. 94 '  04/Apr/83: Added SYSOP access logging into DIRECT file, closing
  87. 95 '  of LASTCALR wasn't handled properly for SYSOP. Ver 2.8A. Bill Bolton
  88. 96 '  06/Apr/83: Added MAXTRY tests so that turkeys can't monopolise the
  89. 97 '  by writing programs that just send occasional carriage return as
  90. 98 '  endless answers to prompts (BYE 7.2K also fixed). Ver 2.9 Bill Bolton
  91. 99 '---------------------------------------------------------------------
  92. 100 ' 19/Jun/83: Added Code at 20000 to write current caller to status
  93. 101 ' line of terminal directly (bypassing BYE) so SYSOP can know who
  94. 102 ' is on the system and how long they have been there when not running
  95. 103 ' a hardcopy log. Very useful for deciding if you want to CHAT or
  96. 104 ' not. Put a RETURN at 20000 if you dont need this. Ver 3.0 Bill Bolton 
  97. 105 '---------------------------------------------------------------------
  98. 106 ' 02/Jul/83: Moved SYSOP password check to subroutine at 21000 and
  99. 107 ' added code to incorporate day of the month as part of the password
  100. 108 ' to be entered. Use line 20145 instead of 21040 if you dont have a
  101. 109 ' real time clock in your system.  Ver 3.1 Bill Bolton 
  102. 110 '---------------------------------------------------------------------
  103. 111 ' 17/Jul/83: Added code to New User Survey routine to count the number
  104. 112 ' of questions skipped. If more than 2 are <ommitted> the caller is
  105. 113 ' given a message about being co-operative and given temporary TW
  106. 114 ' (twit) status which gets them kicked off the system immediately.
  107. 115 ' The caller will have already been logged into USERS but the
  108. 116 ' USERS record counter is decremented and written back to USERS.
  109. 117 ' Decrementing the USERS record counter means that the last record in
  110. 118 ' the USERS file is effectively ignored by the whole ENTRBBS program.
  111. 119 ' The record for the next new caller will be written over the data in
  112. 120 ' the last record under these circumstances, effectively erasing the
  113. 121 ' entry for the unwelcome caller. The message displayed to the
  114. 122 ' unwelcome caller is contained in the GOODBYE file for easy customis-
  115. 123 ' ation. The New User Survey is now done straight after the display
  116. 124 ' of NEWCON (line 690) so that the status of the new caller can be
  117. 125 ' changed to TW if necessary before logging to CALLERS and LASTCALR
  118. 126 ' and can be processed (i.e. chucked off the system) by the TW trapping
  119. 127 ' routines. Vers 3.2 Bill Bolton
  120. 199 '---------------------------------------------------------------------
  121. 200 ' NOTE that user privilege status is read from the USERS file, where
  122. 201 ' the following characters are inserted (with an editor) in the first
  123. 202 ' space of the line:  * = 'Twit',  + = 'Special User',  - = 'Regular
  124. 203 ' User', and (space) = 'New User'
  125. 204 ' NOTE ALSO that the code for other clocks made to run with this program
  126. 205 ' will be welcomed.  Use similar line #s if you can but separate the
  127. 206 ' relevant lines and call the result RBBTIME1.BAS, RBBTIME2.BAS, etc.
  128. 207 '----------------------------------------------------------------------
  129. 208 ' Howard Booker's suggested additions at 13030 were removed as they
  130. 209 ' didn't work and even when corrected were no better than the INKEY$
  131. 210 ' when running under BYE. Bill Bolton
  132. 211 '----------------------------------------------------------------------
  133. 300 '
  134. 310    POKE 0,&HCD '<-- Change "JMP" to "CALL" to prevent Ctl-C
  135. 315    VERS$ = "3.2"  '<---- Current version number
  136. 320    DEFINT A-Z
  137. 325    MODEMPORT=&H5C:
  138.  
  139.     CONSOLEPORT=&H0:
  140.  
  141.     MAXTRY = 4
  142. 330    DIM A$(17),M(200,2),H(6),HT(6),HD(6),TOD(5),DOY(5)
  143. 335    RESET        '<----- In case disk was changed between calls
  144. 340    INC=1
  145. 350    ON ERROR GOTO 15000
  146. 355    XX=0:
  147.  
  148.     YY=0
  149. 358    MAGIC$="SUPER"    'The magic sysop pasword
  150. 360    'TIMEX=&HE800  -disabled Call to MHTIME.COM; unnecessary for most non-MH
  151. 365    'CALL TIMEX     clocks, but you'll have have to modify 14000- & 44000-.
  152. 370     '    
  153. 372    GOSUB 14000:
  154.  
  155.     GOSUB 14200   'Set time counters (HK routine)
  156. 374    HT(1)=H(1):
  157.  
  158.     HT(2)=H(2):
  159.  
  160.     HT(3)=H(3):
  161.  
  162.     HT(4)=H(4):
  163.  
  164.     HT(5)=H(5):
  165.  
  166.     HT(6)=H(6)
  167. 376    M=74:
  168.  
  169.     FOR I=1 TO 6:
  170.  
  171.         POKE M,HT(I):
  172.  
  173.         M=M+1:
  174.  
  175.     NEXT I   'Save the time in lo memory
  176. 379    '
  177. 380    '  Signon Functions...
  178. 381    '
  179. 385    PRINT:
  180.  
  181.     PRINT "Version ";VERS$
  182. 390    GOSUB 32000    'CP/M familiarity test
  183. 400    MSGS=1:
  184.  
  185.     CALLS=MSGS+1:
  186.  
  187.     MNUM=CALLS+1
  188. 425    BK=0
  189. 430    OPEN "I",1,"A:P"+CHR$(&HD7)+"DS. "+CHR$(&HA0):
  190.  
  191.     IF EOF(1) THEN
  192.  
  193.         450  '<-- Password file
  194. 440    INPUT #1,P1$,P2$   'use editor to make the file. e.g.: BANANA,APPLE,COW
  195. 450    CLOSE #1
  196. 460    BEL=-1:
  197.  
  198.     XPR=0      ' (initial bell on, not expert)
  199. 470    GOSUB 13020
  200. 480    SAV$=""
  201. 510    OPEN "I",1,"A:LASTCALR":
  202.  
  203.     INPUT #1,Y$,Z$,F$:
  204.  
  205.     CLOSE
  206. 530    GOSUB 4050:
  207.  
  208.     GOSUB 13020   ' Print WELCOME File
  209. 540    BK = 0:
  210.  
  211.     A$ = "(Prompting bell means system is ready for input).":
  212.  
  213.     GOSUB 13020:
  214.  
  215.     GOSUB 13020:
  216.  
  217.     XX = 0:
  218.  
  219.     COUNT1 = 0:
  220.  
  221.     COUNT2 = 0
  222. 545    N$ = "":
  223.  
  224.     O$ = "":
  225.  
  226.     ST$ = "":
  227.  
  228.     COUNT2 = COUNT2 + 1:
  229.  
  230.     IF COUNT2 = MAXTRY THEN
  231.  
  232.         GOTO 18080
  233. 550    COUNT1 = COUNT1 + 1:
  234.  
  235.     IF COUNT1 = MAXTRY THEN
  236.  
  237.         GOTO 18080
  238. 560    A$ = "What is your FIRST name ?":
  239.  
  240.     GOSUB 13020:
  241.  
  242.     C = 1:
  243.  
  244.     GOSUB 13260:
  245.  
  246.     C = 0:
  247.  
  248.     N$ = B$:
  249.  
  250.     IF N$ = "" THEN
  251.  
  252.         GOTO 550
  253. 570    IF N$<"A" OR LEN(N$)=1 THEN 
  254.  
  255.         550
  256. 575    COUNT1 = 0
  257. 580    COUNT1 = COUNT1 + 1:
  258.  
  259.     IF COUNT1 = MAXTRY THEN
  260.  
  261.         GOTO 18080
  262. 585    A$ = "What is your LAST name ?":
  263.  
  264.     GOSUB 13020:
  265.  
  266.     C = 1:
  267.  
  268.     GOSUB 13260:
  269.  
  270.     C = 0:
  271.  
  272.     O$ = B$:
  273.  
  274.     IF O$ = "" THEN
  275.  
  276.         GOTO 580
  277. 590    IF O$<"A" OR LEN(O$)=1 THEN 
  278.  
  279.         580
  280. 591 '
  281. 595 '
  282. 598    IF N$<>MAGIC$ THEN 
  283.  
  284.         610  
  285. 600    IF N$=MAGIC$ AND O$<>P1$ THEN 
  286.  
  287.         GOTO 545
  288. 605    IF N$=MAGIC$ AND O$=P1$ THEN 
  289.  
  290.         GOSUB 21000:
  291.  
  292.         IF SYSOP = 1 THEN
  293.  
  294.             GOTO 730
  295.  
  296.         ELSE
  297.  
  298.             GOTO 545
  299. 610    IF INSTR(N$,"SYSOP") THEN 
  300.  
  301.         PRINT:
  302.  
  303.         PRINT "You know you're not the SYSOP!!!":
  304.  
  305.         PRINT:
  306.  
  307.         GOTO 545
  308. 612 '
  309. 620    A$="Checking user file...":
  310.  
  311.     GOSUB 13020:
  312.  
  313.     V=0:
  314.  
  315.     OPEN "R",1,"A:U"+CHR$(&HD3)+"ERS. "+CHR$(&HA0),62:
  316.  
  317.     FIELD#1,50 AS RZ$,4 AS NC$,6 AS DT$:
  318.  
  319.     GET#1,1:
  320.  
  321.     NU=VAL(RZ$)
  322. 625    FIELD #1,62 AS RR$
  323. 628    NT$ = N$ + " " + O$
  324. 630    FOR I=2 TO NU+1:
  325.  
  326.         GET#1,I:
  327.  
  328.         J = INSTR(RZ$,NT$):
  329.  
  330.         IF J  > 0 THEN 
  331.  
  332.             LENGTH = LEN(NT$):
  333.  
  334.             IF MID$(RZ$,J+LENGTH,1) = " " THEN
  335.  
  336.                 MF$=LEFT$(RZ$,1):
  337.  
  338.                 GOSUB 15990:
  339.  
  340.                 PUT#1,I:
  341.  
  342.                 CLOSE:
  343.  
  344.                 GOSUB 13020:
  345.  
  346.                 XX=1:
  347.  
  348.                 GOTO 700
  349. 640    NEXT I   ' If recognized, caller is passed to CALLER-logging routine
  350. 649    ' But a caller not in the USER file gets quizzed further...
  351. 650    V=1:
  352.  
  353.     A1$="Where (Suburb/Town AND State) are you calling from ?":
  354.  
  355.     GOSUB 13020:
  356.  
  357.     C=1:
  358.  
  359.     GOSUB 13260:
  360.  
  361.     C=0:
  362.  
  363.     ST$=B$:
  364.  
  365.     IF ST$="" THEN 
  366.  
  367.         545
  368. 655    POINTER = INSTR(ST$,","):
  369.  
  370.     IF POINTER THEN
  371.  
  372.         MID$(ST$,POINTER,1) = "."
  373. 660    A$="Hello "+N$+" "+O$+" from "+ST$:
  374.  
  375.     GOSUB 13020
  376. 662    A1$="Is any of this misspelled ?":
  377.  
  378.     GOSUB 13020:
  379.  
  380.     C=1:
  381.  
  382.     GOSUB 13260:
  383.  
  384.     C=0
  385. 665    IF LEFT$(B$,1) = "Y" THEN 
  386.  
  387.         GOTO 545
  388. 667    IF LEFT$(B$,1) <> "N" THEN 
  389.  
  390.         545
  391. 670    PRINT:
  392.  
  393.     A1$="This checking is only done the first time you call.":
  394.  
  395.     GOSUB 13020
  396. 680    LSET NC$ = MKI$(0):
  397.  
  398.     LSET RZ$="  "+N$+" "+O$+" "+ST$+SPACE$(44):
  399.  
  400.     GOSUB 15990:
  401.  
  402.     NU=NU+1:
  403.  
  404.     PUT#1,NU+1:
  405.  
  406.     S$=STR$(NU):
  407.  
  408.     GOSUB 16000:
  409.  
  410.     PUT#1,1:
  411.  
  412.     CLOSE
  413. 690    MF$ = " ":
  414.  
  415.     FIL$ = "NEWCOM":
  416.  
  417.     GOSUB 18000:
  418.  
  419.     PRINT:
  420.  
  421.     GOSUB 35000  '...and made to read the NEWCOMer file
  422. 695    PRINT
  423. 700    GOSUB 14200    '  Now everybody gets logged to CALLERS
  424. 705    A$="Logging "+N$+" "+O$+" to disk...":
  425.  
  426.     N=1:
  427.  
  428.     GOSUB 13020:
  429.  
  430.     OPEN "R",1,"A:C"+CHR$(&HC1)+"LLERS. "+CHR$(&HA0),60:
  431.  
  432.     FIELD#1,60 AS RR$:
  433.  
  434.     GET#1,1
  435. 710    RE=VAL(RR$)+1:
  436.  
  437.     S$=STR$(RE):
  438.  
  439.     RL=60:
  440.  
  441.     GOSUB 16000:
  442.  
  443.     PUT#1,1:
  444.  
  445.     RE=RE+1
  446. 715    S$=N$+" "+O$+" "+ST$+" "+TI$:
  447.  
  448.     GOSUB 16000:
  449.  
  450.     PUT#1,RE:
  451.  
  452.     CLOSE#1
  453. 720    '  Recallers (who are not "twits") go straight to CP/M
  454. 723    IF N$=Y$ AND O$=Z$ AND MF$ <> "*" AND XX<>0 THEN 
  455.  
  456.         GOSUB 13020:
  457.  
  458.         A$="Welcome back.  Since you just signed off, go straight to CP/M":
  459.  
  460.         GOSUB 13020:
  461.  
  462.         F$ = F$ + " Rentered":
  463.  
  464.         GOSUB 20000:
  465.  
  466.         GOTO 2240
  467. 724    '
  468. 725    '  User privilege level (from USERS) & date (DT$) is added to LASTCALR...
  469. 726    IF MF$="*" THEN
  470.  
  471.         F$="TW"
  472. 727    IF MF$="+" THEN 
  473.  
  474.         F$="SP"
  475. 728    IF MF$=" " THEN 
  476.  
  477.         F$="NW"
  478. 729    IF MF$="-" THEN 
  479.  
  480.         F$="RG"
  481. 730    OPEN "O",1,"A:L"+CHR$(&HC1)+"STCALR. "+CHR$(&HA0):
  482.  
  483.     PRINT #1,N$;",";O$;",";F$;",";DZ$:
  484.  
  485.     CLOSE#1:
  486.  
  487.     GOSUB 20000:
  488.  
  489.     IF N$=MAGIC$ THEN 
  490.  
  491.         GOSUB 19000:
  492.  
  493.         GOTO 2240
  494. 736    ' Now log out the twits through exit routines
  495. 737    IF MF$="*" THEN
  496.  
  497.         PRINT:
  498.  
  499.         PRINT:
  500.  
  501.         PRINT "You have lost access privileges to this system":
  502.  
  503.         PRINT:
  504.  
  505.         CHAIN "BYE"
  506. 740    BK=0:
  507.  
  508.     GOSUB 13020:
  509.  
  510.     OPEN "R",1,"A:C"+CHR$(&HCF)+"UNTERS. "+CHR$(&HA0),5:
  511.  
  512.     FIELD#1,5 AS RR$
  513. 750    PRINT
  514. 760    A$="You are caller # : ":
  515.  
  516.     N=1:
  517.  
  518.     GOSUB 13020:
  519.  
  520.     GET#1,CALLS
  521. 770    CN=VAL(RR$)+INC:
  522.  
  523.     A$=STR$(CN):
  524.  
  525.     LSET RR$=A$:
  526.  
  527.     GOSUB 13020:
  528.  
  529.     PUT#1,CALLS
  530. 790    CLOSE:
  531.  
  532.     GOSUB 13020
  533. 792    'And now the user gets to choose whether to answer the survey at 35000,
  534. 793    IF XX=0 THEN 
  535.  
  536.         GOTO 800   'except that new users have no choice
  537. 795    A1$="Have you answered the user survey questions yet?":
  538.  
  539.     GOSUB 13020:
  540.  
  541.     C=1:
  542.  
  543.     GOSUB 13260:
  544.  
  545.     C=0
  546. 798    IF LEFT$(B$,1)="N" THEN 
  547.  
  548.         GOSUB 35000
  549. 799    '
  550. 800    ' The SUMMARY file is now checked for messages to the caller
  551. 830    '
  552. 835    GOSUB 13020:
  553.  
  554.     A1$="Wait while I check to see if you have messages waiting ...":
  555.  
  556.     GOSUB 13020:
  557.  
  558.     GOSUB 13020
  559. 838    L=0
  560. 840    FT=1:
  561.  
  562.     MX=0:
  563.  
  564.     MZ=0:
  565.  
  566.     IU=0:     ' (Flag first time for printing heading)
  567. 850    OPEN "R",1,"A:S"+CHR$(&HD5)+"MMARY. "+CHR$(&HA0),30:
  568.  
  569.     RE=1:
  570.  
  571.     FIELD#1,28 AS RR$
  572. 860    BK=0:
  573.  
  574.     GET#1,RE:
  575.  
  576.     IF EOF(1) THEN 
  577.  
  578.         960
  579. 870    G=VAL(RR$):
  580.  
  581.     MZ=MZ+1:
  582.  
  583.     M(MZ,1)=G:
  584.  
  585.     IF G=0 THEN 
  586.  
  587.         950
  588. 880    IF IU=0 THEN 
  589.  
  590.         IU=G
  591. 890    IF G>9998 THEN 
  592.  
  593.         MZ=MZ-1:
  594.  
  595.         GOTO 960
  596. 900    GET#1,RE+3:
  597.  
  598.     GOSUB 16500:
  599.  
  600.     IF INSTR(S$,N$)>0 AND INSTR(S$,O$)>0 THEN 
  601.  
  602.         930
  603. 910    IF N$<>MAGIC$ THEN 
  604.  
  605.         950  
  606. 920    IF INSTR(S$,"BILL")=0 THEN 
  607.  
  608.         950
  609. 930    IF FT THEN 
  610.  
  611.         L=L+1
  612. 931    IF FT THEN 
  613.  
  614.         A$="The following messages for "+N$+" "+O$+" are waiting in MINIRBBS: ":
  615.  
  616.         GOSUB 13020:
  617.  
  618.         FT=0
  619. 940    A$=STR$(G):
  620.  
  621.     N=1:
  622.  
  623.     GOSUB 13020:
  624.  
  625.     GOSUB 13020
  626. 950    GET#1,RE+5:
  627.  
  628.     M(MZ,2)=VAL(RR$):
  629.  
  630.     MX=MX+M(MZ,2)+6:
  631.  
  632.     RE=RE+6:
  633.  
  634.     GOTO 860
  635. 960    IF L=0 THEN 
  636.  
  637.         PRINT "No, there aren't any messages for you, "+N$+".":
  638.  
  639.         PRINT "But check MINIRBBS anyway for public messages.":
  640.  
  641.         GOSUB 13020
  642. 965    CLOSE
  643. 2000 '
  644. 2020 '  Everyone comes here, to get ready to go to CP/M
  645. 2040 '
  646. 2045    GOSUB 4070    'Everyone sees the DATA file before menus
  647. 2046 '
  648. 2049 '  They get menus according to their status....
  649. 2050 '
  650. 2051    IF MF$<>"+" THEN 
  651.  
  652.         2100
  653. 2052    GOSUB 13020:
  654.  
  655.     A$="As a special user, you have the following options:":
  656.  
  657.     GOSUB 13020:
  658.  
  659.     GOSUB 13020
  660. 2053    A$=" CON  Read CONFIDENTIAL msgs    MIN  Go to MINIRBBS":
  661.  
  662.     GOSUB 13020
  663. 2054    A$=" NEW  Latest system data        CPM  Go straight to CP/M":
  664.  
  665.     GOSUB 13020
  666. 2055    A$=" OFF  Log Off immediately":
  667.  
  668.     GOSUB 13020:
  669.  
  670.     COUNT1 = 0
  671. 2056    GOSUB 13020:
  672.  
  673.     A1$="Which ?":
  674.  
  675.     GOSUB 13020:
  676.  
  677.     C=1:
  678.  
  679.     GOSUB 13260:
  680.  
  681.     C=0
  682. 2060    IF B$="CON" THEN 
  683.  
  684.         4100   'the SPECIAL file
  685. 2065    IF B$="MIN" THEN 
  686.  
  687.         CHAIN "MINIRBBS"  'to the message module
  688. 2070    IF B$="NEW" THEN 
  689.  
  690.         2220   'the BULLETIN file
  691. 2075    IF B$="CPM" THEN 
  692.  
  693.         2230   'the DATA file, then CP/M
  694. 2076    IF B$="OFF" THEN 
  695.  
  696.         CHAIN "BYE"  'straight to log-off module
  697. 2078    COUNT1 = COUNT1 + 1:
  698.  
  699.     IF COUNT1 = MAXTRY THEN
  700.  
  701.         GOTO 18080
  702. 2080    GOTO 2056
  703. 2099    '
  704. 2100    IF MF$=" " THEN 
  705.  
  706.         2200    ' Note that new callers don't get a menu
  707. 2110    GOSUB 13020:
  708.  
  709.     A$="Now you can do one of the following:":
  710.  
  711.     GOSUB 13020:
  712.  
  713.     GOSUB 13020
  714. 2120    A$=" NEW  Latest system data         CPM  Go straight to CP/M":
  715.  
  716.     GOSUB 13020
  717. 2125    A$=" MIN  Go to message subsystem    OFF  Log Off immediately":
  718.  
  719.     GOSUB 13020
  720. 2127    COUNT1 = 0
  721. 2130    GOSUB 13020:
  722.  
  723.     A1$="Which do you want ?":
  724.  
  725.     GOSUB 13020:
  726.  
  727.     C=1:
  728.  
  729.     GOSUB 13260:
  730.  
  731.     C=0
  732. 2135    IF B$="MIN" THEN 
  733.  
  734.         CHAIN "MINIRBBS"
  735. 2140    IF B$="NEW" THEN 
  736.  
  737.         2220    ' RG callers can do everything SP callers can
  738. 2145    IF B$="CPM" THEN 
  739.  
  740.         2230    ' except read the SPECIAL file
  741. 2150    IF B$="OFF" THEN 
  742.  
  743.         CHAIN "BYE"
  744. 2155    COUNT1 = COUNT1 + 1:
  745.  
  746.     IF COUNT1 = MAXTRY THEN
  747.  
  748.         GOTO 18080
  749. 2160    GOTO 2130
  750. 2170 '
  751. 2197 ' To discourage new callers from thinking this is a bulletin board system,
  752. 2198 ' this is the only choice they get
  753. 2199 '
  754. 2200    COUNT1 = 0
  755. 2202    COUNT1 = COUNT1 + 1:
  756.  
  757.     IF COUNT1 = MAXTRY THEN
  758.  
  759.         GOTO 18080
  760. 2205    A1$ = "Want latest system information before entering CP/M ?":
  761.  
  762.     GOSUB 13020:
  763.  
  764.     C = 1:
  765.  
  766.     GOSUB 13260:
  767.  
  768.     C = 0
  769. 2210    IF LEFT$(B$,1) = "N" THEN 
  770.  
  771.         2230
  772. 2215    IF LEFT$(B$,1) <> "Y" THEN 
  773.  
  774.         2202
  775. 2220    GOSUB 3040 ' Print BULLETIN file
  776. 2225    IF MF$="+" THEN 
  777.  
  778.         2052
  779. 2226    IF MF$="-" THEN 
  780.  
  781.         2110
  782. 2230 '            Used to be DATA file read, moved to 2045
  783. 2235    CLOSE ' (just in case any files are still open)
  784. 2236    PRINT
  785. 2237    GOTO 44620  ' Then to the time-on-system routine, and then...
  786. 2240    GOSUB 13020:
  787.  
  788.     POKE 4,0:
  789.  
  790.     A$="Entering CP/M...":
  791.  
  792.     GOSUB 13020
  793. 2260    POKE 0,&HC3:
  794.  
  795.     SYSTEM ' we restore the "JMP" and go to CP/M.
  796. 3000 '
  797. 3010 ' The main program has now ended.  It's just subroutines from here on
  798. 3015 '
  799. 3020 ' The display BULLETIN file subroutine
  800. 3040 '
  801. 3050    PRINT:
  802.  
  803.     GOSUB 13000
  804. 3060    GOSUB 12220
  805. 3080    FIL$="BULLETIN":
  806.  
  807.     GOSUB 18000:
  808.  
  809.     PRINT:
  810.  
  811.     RETURN
  812. 4000 '
  813. 4020 ' The display WELCOME file subroutine
  814. 4030 '
  815. 4050    GOSUB 12220
  816. 4060    FIL$="WELCOME":
  817.  
  818.     GOSUB 18000:
  819.  
  820.     RETURN
  821. 4065 '
  822. 4070 ' The display DATA file subroutine*
  823. 4075 '
  824. 4080    GOSUB 12220
  825. 4090    FIL$="DATA":
  826.  
  827.     GOSUB 18000:
  828.  
  829.     RETURN
  830. 4095 '
  831. 4100 ' The display SPECIAL file subroutine*
  832. 4120 '
  833. 4140    GOSUB 12220
  834. 4160    FIL$="SPECIAL":
  835.  
  836.     GOSUB 18000:
  837.  
  838.     GOTO 2052
  839. 5000 '
  840. 12220    RETURN
  841. 12999 '
  842. 13000    A$="Use ctl-K to abort, ctl-S to pause."
  843. 13020 '
  844. 13040 ' Routine to print string from A$ on console
  845. 13060 '
  846. 13080    IF SAV$<>"" AND A1$<>"" THEN 
  847.  
  848.         A1$="":
  849.  
  850.         RETURN
  851. 13100    IF A1$<>"" THEN 
  852.  
  853.         A$=A1$:
  854.  
  855.         A1$=""
  856. 13120    IF RIGHT$(A$,1)="?" OR N=1 THEN 
  857.  
  858.         PRINT A$;:
  859.  
  860.         PP$=A$:
  861.  
  862.         GOTO 13180
  863. 13140    BI=ASC(INKEY$+" "):
  864.  
  865.     IF BI=19 THEN 
  866.  
  867.         BI=ASC(INPUT$(1))
  868. 13160    IF BI=11 THEN 
  869.  
  870.         BK=-1:
  871.  
  872.         GOTO 13220 
  873.  
  874.     ELSE 
  875.  
  876.         PRINT A$
  877. 13180    A=A+LEN(A$)
  878. 13220    A$="":
  879.  
  880.     N=0
  881. 13240    RETURN
  882. 13260 '
  883. 13280 ' Routine to accept string into B$ from console
  884. 13300 '
  885. 13320    IF BEL AND SAV$="" THEN 
  886.  
  887.         PRINT CHR$(7);
  888. 13340    B$="":
  889.  
  890.     BK=0
  891. 13360    IF SAV$="" THEN 
  892.  
  893.         LINE INPUT SAV$
  894. 13380    SP=INSTR(SAV$,";"):
  895.  
  896.     IF SP=0 THEN 
  897.  
  898.         B$=SAV$:
  899.  
  900.         SAV$="":
  901.  
  902.         GOTO 13420
  903. 13400    B$=LEFT$(SAV$,SP-1):
  904.  
  905.     SAV$=MID$(SAV$,SP+1)
  906. 13420    IF LEN(B$)=0 THEN 
  907.  
  908.         RETURN
  909. 13440    IF C=0 THEN 
  910.  
  911.         13480
  912. 13460    FOR ZZ=1 TO LEN(B$):
  913.  
  914.         MID$(B$,ZZ,1)=CHR$(ASC(MID$(B$,ZZ,1))+32*(ASC(MID$(B$,ZZ,1))>96)):
  915.  
  916.     NEXT ZZ
  917. 13480    IF LEN(B$)<63 THEN 
  918.  
  919.         13580
  920. 13500    A$="Input line too long - would be truncated to:":
  921.  
  922.     GOSUB 13020
  923. 13520    B$=LEFT$(B$,62):
  924.  
  925.     PRINT B$
  926. 13540    LINE INPUT "Retype line (Y/N)?";QQ$:
  927.  
  928.     GOSUB 35600:
  929.  
  930.     QQ$=LEFT$(QQ$,1)
  931. 13560    IF QQ$="Y" OR QQ$="y" THEN 
  932.  
  933.         PRINT PP$;:
  934.  
  935.         SAV$="":
  936.  
  937.         GOTO 13260
  938. 13580    D=D+LEN(B$):
  939.  
  940.     RETURN
  941. 13600    RETURN
  942. 13620 '
  943. 14000 ' Date getting subroutine
  944. 14010    BASEPORT = &H50
  945. 14013    CMDPORT = BASEPORT + 10
  946. 14016    DATAPORT = CMDPORT + 1
  947. 14019 '**********************************************************
  948. 14022 '*        READ THE DATE DIGITS            *
  949. 14025 '**********************************************************
  950. 14028    FOR DIGIT = 12 TO 7 STEP -1
  951. 14031        OUT CMDPORT,(&H10 + DIGIT)
  952. 14034        DOY(DIGIT - 7) = INP(DATAPORT)
  953. 14037    NEXT DIGIT
  954. 14040    YEAR= (DOY(5) * 10) + DOY(4)
  955. 14043    MONTH10 = DOY(3)
  956. 14046    MONTH1  = DOY(2)
  957. 14049    DAY10 = DOY(1)
  958. 14052    DAY1  = DOY(0)
  959. 14055 '**********************************************************
  960. 14058 '*        FORMAT THE FIRST DATE STRING        *
  961. 14061 '**********************************************************
  962. 14064    DATE1$="        "
  963. 14067    MID$(DATE1$,1,1) = RIGHT$(STR$(DAY10),1)
  964. 14070    MID$(DATE1$,2,1) = RIGHT$(STR$(DAY1),1)
  965. 14073    MID$(DATE1$,3,1) = "/"
  966. 14076    MID$(DATE1$,4,1) = RIGHT$(STR$(MONTH10),1)
  967. 14079    MID$(DATE1$,5,1) = RIGHT$(STR$(MONTH1),1)
  968. 14082    MID$(DATE1$,6,1) = "/"
  969. 14085    MID$(DATE1$,7,2) = RIGHT$(STR$(YEAR),2)
  970. 14088    DZ$ = DATE1$
  971. 14091    DT$ = LEFT$(DATE1$,5)
  972. 14093    DD$ = MID$(DATE1$,1,2)
  973. 14095    DM$ = MID$(DATE1$,4,2)
  974. 14100    RETURN
  975. 14190 '
  976. 14200 ' Time-finding subroutine
  977. 14205    FOR DIGIT = 5 TO 0 STEP -1
  978. 14210        OUT CMDPORT,(&H10 + DIGIT)
  979. 14215        TOD(DIGIT) = INP(DATAPORT)
  980. 14220        IF DIGIT = 5 THEN TOD(DIGIT) = TOD(DIGIT) AND 3
  981. 14225    NEXT DIGIT
  982. 14230    H(1) = TOD(5)
  983. 14235    H(2) = TOD(4)
  984. 14240    H(3) = TOD(3)
  985. 14245    H(4) = TOD(2)
  986. 14250    H(5) = TOD(1)
  987. 14255    H(6) = TOD(0)
  988. 14260    DH$ = "  ":
  989.  
  990.     DI$ = "  ":
  991.  
  992.     DS$ = "  "
  993. 14265    MID$(DH$,1,1) = RIGHT$(STR$(H(1)),1):
  994.  
  995.     MID$(DH$,2,1) = RIGHT$(STR$(H(2)),1):
  996.  
  997.     MID$(DI$,1,1) = RIGHT$(STR$(H(3)),1):
  998.  
  999.     MID$(DI$,2,1) = RIGHT$(STR$(H(4)),1):
  1000.  
  1001.     MID$(DS$,1,1) = RIGHT$(STR$(H(5)),1):
  1002.  
  1003.     MID$(DS$,2,1) = RIGHT$(STR$(H(6)),1)
  1004. 14280    TI$=DD$+"-"+DH$+":"+DI$
  1005. 14285    TD$=DH$+":"+DI$+":"+DS$
  1006. 14290    RETURN
  1007. 14999 '
  1008. 15000 ' The ON-ERROR handler...
  1009. 15001 '
  1010. 15020    IF ERL=18030 THEN 
  1011.  
  1012.         RESUME 18050
  1013. 15030    IF ERL=700 THEN 
  1014.  
  1015.         RE=0:
  1016.  
  1017.         RESUME 710
  1018. 15100    RESUME NEXT
  1019. 15887 '
  1020. 15888 ' Small routine for writing date, etc., to USERS file (see lines 630 & 680))
  1021. 15889 '
  1022. 15990    S$=LEFT$(RZ$,50)+RIGHT$("   "+STR$(VAL(NC$)+1),4)+" "+RIGHT$("0"+DD$,2)
  1023. 15992    S$=S$+"/"+RIGHT$("0"+DM$,2):RL=62   ' (now fall thru...).
  1024. 16000 '
  1025. 16010 ' Fill and store disk record...
  1026. 16020 '
  1027. 16030    LSET RR$=LEFT$(S$+SPACE$(RL-2),RL-2)+CHR$(13)+CHR$(10)
  1028. 16040    RETURN
  1029. 16500 '
  1030. 16510 ' Unpack disk record...
  1031. 16520 '
  1032. 16530    ZZ=LEN(RR$)-2
  1033. 16540    WHILE MID$(RR$,ZZ,1)=" "
  1034. 16550        ZZ=ZZ-1:
  1035.  
  1036.         IF ZZ=1 THEN 
  1037.  
  1038.             16570
  1039. 16560    WEND
  1040. 16570    S$=LEFT$(RR$,ZZ)
  1041. 16580    IF MID$(S$,ZZ,1)="?" THEN S$=S$+" "
  1042. 16590    RETURN
  1043. 17000 '
  1044. 17010 ' Toggle expert user mode
  1045. 17020 '
  1046. 17030 ' XPR=NOT XPR:RETURN  (inactivated here but kept for future use)
  1047. 17040 '
  1048. 17050 ' Toggle bell prompt
  1049. 17060 '
  1050. 17070 ' BEL=NOT BEL:RETURN  (ditto)
  1051. 18000 '
  1052. 18010 ' Subroutine to print a file
  1053. 18020 '
  1054. 18030    OPEN "I",1,"A:"+FIL$:
  1055.  
  1056.     BK=0
  1057. 18040    IF EOF(1) OR BK THEN 
  1058.  
  1059.         18050 
  1060.  
  1061.     ELSE 
  1062.  
  1063.         LINE INPUT #1,A$:
  1064.  
  1065.         GOSUB 13020:
  1066.  
  1067.         GOTO 18040
  1068. 18050    CLOSE #1:
  1069.  
  1070.     RETURN
  1071. 18060 '
  1072. 18070 '
  1073. 18080 ' Subroutine to log off an unwanted caller
  1074. 18090 '
  1075. 18100 '
  1076. 18110    'POKE 0,&HC3    '<-----Restore "Jump" at BASE for CP/M (doesn't
  1077.  
  1078.              really matter if this isn't done if you use BYE
  1079.  
  1080.              to load this program
  1081. 18120    RUN "A:SUPER.COM" 'Neatest log off is through BYE
  1082. 18140    END
  1083. 18150 '
  1084. 19000    GOSUB 14200    'Now log SYSOP acceses for later check
  1085. 19020    OPEN "R",1,"A:D"+CHR$(&HC9)+"RECT. "+CHR$(&HA0),40:
  1086.  
  1087.     FIELD#1,40 AS RR$:
  1088.  
  1089.     GET#1,1
  1090. 19040    RE = VAL(RR$)+1:
  1091.  
  1092.     S$ = STR$(RE):
  1093.  
  1094.     RL = 40:
  1095.  
  1096.     GOSUB 16000:
  1097.  
  1098.     PUT#1,1:
  1099.  
  1100.     RE = RE + 1
  1101. 19060    IF N$ = MAGIC$ THEN
  1102.  
  1103.         N$ = "SYSOP"
  1104. 19080    S$ = N$ + " " + TI$ + " " + MID$(X$,7,2):
  1105.  
  1106.     GOSUB 16000:
  1107.  
  1108.     PUT#1,RE:
  1109.  
  1110.     CLOSE #1
  1111. 19100    RETURN
  1112. 19110 '
  1113. 20000 '
  1114. 20020 ' Optional HARDWARE DEPENDENT routine to write caller
  1115. 20040 ' data to status line of your terminal if it has one
  1116. 20060 ' This routine must access the console directly (bypassing
  1117. 20080 ' BYE) so is necessarily hardware dependent
  1118. 20100 '
  1119. 20120    STATUS$ = CHR$(27) + "g" + CHR$(27) + "f" + N$ + " " + O$ + " " + ST$ + ", " + TD$ + ", " + DZ$ + ", " + F$ + CHR$(13) + CHR$(10)
  1120. 20140    FOR I = 1 TO LEN(STATUS$)
  1121. 20160        CHAR = ASC(MID$(STATUS$,I,1))
  1122. 20180        WHILE (INP(CONSOLEPORT+1) AND &H1) <> 1
  1123. 20200        WEND
  1124. 20220        OUT CONSOLEPORT,CHAR
  1125. 20240    NEXT I
  1126. 20260    RETURN
  1127. 20280 '
  1128. 21000 '  SYSOP password check
  1129. 21010 '
  1130. 21020    O$ = "":
  1131.  
  1132.     A1$ = "2nd Codeword?":
  1133.  
  1134.     GOSUB 13020:
  1135.  
  1136.     C = 1:
  1137.  
  1138.     B$ = INPUT$(10):
  1139.  
  1140.     GOSUB 13420:
  1141.  
  1142.     C = 0:
  1143.  
  1144.     X$ = B$:
  1145. 21030    PRINT
  1146. 21040    IF INSTR(X$,P2$) THEN
  1147.  
  1148.         IF (MID$(DT$,1,1) = MID$(X$,10,1)) AND (MID$(DT$,2,1) = MID$(X$,9,1)) THEN
  1149.  
  1150.             F$ = "":
  1151.  
  1152.             SYSOP = 1:
  1153.  
  1154.             RETURN
  1155. 21045    'Use this in place of 21040 if you dont have a real time clock
  1156.  
  1157.     IF INSTR(X$,P$) THEN
  1158.  
  1159.         F$ = "":
  1160.  
  1161.         SYSOP = 1:
  1162.  
  1163.         RETURN
  1164. 21050    SYSOP = 0:
  1165.  
  1166.     RETURN
  1167. 21060 '
  1168. 32000 '  The CP/M familiarity testing routine  (feel free to make changes)
  1169. 32001 '
  1170. 32010    XX=0
  1171. 32020    GOSUB 13020:
  1172.  
  1173.     A1$="What is the name of Digital Research's standard debugger?":
  1174.  
  1175.     GOSUB 13020:
  1176.  
  1177.     C=1:
  1178.  
  1179.     GOSUB 13260:
  1180.  
  1181.     C=0
  1182. 32040    IF INSTR(B$,"DDT") THEN 
  1183.  
  1184.         32400
  1185. 32050    IF INSTR(B$,"ddt") THEN 
  1186.  
  1187.         32400
  1188. 32055    IF INSTR(B$,"SID") THEN
  1189.  
  1190.         PRINT "Not ";B$;", try the other one...":
  1191.  
  1192.         GOTO 32020
  1193. 32060    XX=XX+1:
  1194.  
  1195.      IF XX=3 THEN 
  1196.  
  1197.         18080   ' Log the caller off...
  1198. 32070    IF XX=1 THEN
  1199.  
  1200.         PRINT "You only get 3 tries...":
  1201.  
  1202.         GOTO 32020
  1203. 32080    IF XX=2 THEN
  1204.  
  1205.         PRINT "One last try...":
  1206.  
  1207.         GOTO 32020
  1208. 32400    RETURN
  1209. 32499 '
  1210. 35000 '   BK's system user survey module  (again, make changes)
  1211. 35001 '
  1212. 35002    PRINT:
  1213.  
  1214.     PRINT "     ***   SYSTEM USER SURVEY  ***"
  1215. 35005    OPEN "R",1,"A:S"+CHR$(&HD5)+"RVEY.B"+CHR$(&HC2)+"S",40:
  1216.  
  1217.     FIELD#1,40 AS RR$:
  1218.  
  1219.     GET#1,1
  1220. 35006    RE = VAL(RR$)+1
  1221. 35007    IF RE = 1 THEN 
  1222.  
  1223.         RE = 2
  1224. 35008    S$=N$+" "+O$+" "+DZ$
  1225. 35009    GOSUB 35200
  1226. 35010    GOSUB 13020:
  1227.  
  1228.     GOSUB 13020:
  1229.  
  1230.     A$="Please answer all the following questions. The data"
  1231. 35020    GOSUB 13020:
  1232.  
  1233.     A$="about what you are doing helps to ensure that this":
  1234.  
  1235.     GOSUB 13020:
  1236.  
  1237.     A$="system takes your needs into account as it develops.":
  1238.  
  1239.     GOSUB 13020
  1240. 35023    NOANSW = 0
  1241. 35025    PRINT:
  1242.  
  1243.     PRINT "(Keep each answer to 35 characters maximum.)"
  1244. 35026    PRINT "(There are 8 questions in all)":
  1245.  
  1246.     PRINT
  1247. 35030    PRINT "What kind of computer (or terminal) are you using? (S-100, Osborne,"
  1248. 35035    PRINT "  NEC-APC, IBM-PC etc.; if S-100, which controller & CPU card?":
  1249.  
  1250.     GOSUB 35600:
  1251.  
  1252.     Q$=" 1":
  1253.  
  1254.     GOSUB 35100
  1255. 35040    PRINT "With which operating systems? (CP/M-80?  CP/M-86?  CP/M-68K?"
  1256. 35045    PRINT "  MSDOS, P-system?  More than one?)":
  1257.  
  1258.     GOSUB 35600:
  1259.  
  1260.     Q$=" 2":
  1261.  
  1262.     GOSUB 35100
  1263. 35050    PRINT "How about the modem?  What brand & baud rate(s)?":
  1264.  
  1265.     GOSUB 35600:
  1266.  
  1267.     Q$=" 3":
  1268.  
  1269.     GOSUB 35100
  1270. 35060    PRINT "Where did you learn of this system":
  1271.  
  1272.     PRINT " (If an RCPM or BBS, which one)? ":
  1273.  
  1274.     GOSUB 35600:
  1275.  
  1276.     Q$=" 4":
  1277.  
  1278.     GOSUB 35100
  1279. 35070    PRINT "Do you work with computers professionally?  Which kind?":
  1280.  
  1281.     GOSUB 35600:
  1282.  
  1283.     Q$=" 5":
  1284.  
  1285.     GOSUB 35100
  1286. 35080    PRINT "How long have you been involved with microcomputers?":
  1287.  
  1288.     GOSUB 35600:
  1289.  
  1290.     Q$=" 6":
  1291.  
  1292.     GOSUB 35100
  1293. 35085    PRINT "If you write your own programs, which languages do you usually use?":
  1294.  
  1295.     GOSUB 35600:
  1296.  
  1297.     Q$=" 7":
  1298.  
  1299.     GOSUB 35100
  1300. 35090    PRINT "Are you interested in 16/32 bit CPUs or other"
  1301. 35091    PRINT "  leading-edge equipment & software?  Which?":
  1302.  
  1303.     GOSUB 35600:
  1304.  
  1305.     Q$=" 8":
  1306.  
  1307.     GOSUB 35100
  1308. 35092    PRINT:
  1309.  
  1310.     PRINT "If you'd care to give further details, leave a msg in MINIRBBS"
  1311. 35094    S$=STR$(RE)
  1312. 35095    GOSUB 16000:
  1313.  
  1314.     PUT#1,1:
  1315.  
  1316.     CLOSE
  1317. 35096    IF NOANSW >= 3 THEN
  1318.  
  1319.         GOSUB 35700:
  1320.  
  1321.         RETURN        'Get rid of the nusiance callers
  1322. 35099    PRINT:
  1323.  
  1324.     PRINT "Thanks for the information.  Now back to the log-in routine...":
  1325.  
  1326.     PRINT:
  1327.  
  1328.     RETURN
  1329. 35100 ' PUT IN FILE
  1330. 35120    GOSUB 13280:
  1331.  
  1332.     IF B$="" THEN 
  1333.  
  1334.         S$="<omitted>":
  1335.  
  1336.         NOANSW = NOANSW + 1
  1337.  
  1338.     ELSE 
  1339.  
  1340.         S$=B$
  1341. 35140    S$=Q$+": "+S$
  1342. 35200    RL=40
  1343. 35220    GOSUB 16000
  1344. 35240    PUT#1,RE
  1345. 35260    RE = RE + 1
  1346. 35280    RETURN
  1347. 35290 '
  1348. 35300 ' Display a ruler line to show how long answer may be
  1349. 35310 '
  1350. 35600    PRINT "---------10---------20--------30----|"
  1351. 35620    RETURN
  1352. 35630 '
  1353. 35640 ' Throw away callers who wont answer questions
  1354. 35650 '
  1355. 35700    FIL$ = "GOODBYE":
  1356.  
  1357.     GOSUB 18000
  1358. 35710    OPEN "R",1,"A:U"+CHR$(&HD3)+"ERS. "+CHR$(&HA0),62:
  1359.  
  1360.     FIELD#1,50 AS RZ$:
  1361.  
  1362.     GET#1,1:
  1363.  
  1364.     NU = VAL(RZ$):
  1365.  
  1366.     NU = NU - 1:
  1367.  
  1368.     S$ = STR$(NU):
  1369.  
  1370.     RL = 62:
  1371.  
  1372.     GOSUB 16000:
  1373.  
  1374.     PUT#1,1:
  1375.  
  1376.     CLOSE:
  1377.  
  1378.     MF$ = "*":
  1379.  
  1380.     RETURN
  1381. 35720 '
  1382. 44620 '  Routines for printing the time & time-on-system 
  1383. 44625 '   (for MH clock, but adaptable for other clocks)
  1384. 44630 '    a. Print just time
  1385. 44640    GOSUB 14200  
  1386. 44650    PRINT "The time now is (Hrs:Mins:Secs).... "TD$
  1387. 44659 '    b. Print elapsed time too
  1388. 44660    GOSUB 44940
  1389. 44670    GOTO 2240
  1390. 44830 '    (calculate the time difference...)
  1391. 44835    IF H(1) < HT(1) THEN
  1392.  
  1393.         H(1) = H(1) + 2:
  1394.  
  1395.         H(2) = H(2) + 4
  1396. 44840    IF H(6)<HT(6) THEN 
  1397.  
  1398.         H(6)=H(6)+10:
  1399.  
  1400.         H(5)=H(5)-1
  1401. 44850    IF H(5)<HT(5) THEN 
  1402.  
  1403.         H(5)=H(5)+6:
  1404.  
  1405.         H(4)=H(4)-1
  1406. 44860    IF H(4)<HT(4) THEN 
  1407.  
  1408.         H(4)=H(4)+10:
  1409.  
  1410.         H(3)=H(3)-1
  1411. 44870    IF H(3)<HT(3) THEN 
  1412.  
  1413.         H(3)=H(3)+6:
  1414.  
  1415.         H(2)=H(2)-1
  1416. 44880    IF H(2)<HT(2) THEN 
  1417.  
  1418.         H(2)=H(2)+10:
  1419.  
  1420.         H(1)=H(1)-1
  1421. 44890    HD(6)=H(6)-HT(6):
  1422.  
  1423.     HD(5)=H(5)-HT(5):
  1424.  
  1425.     HD(4)=H(4)-HT(4)
  1426. 44900    HD(3)=H(3)-HT(3):
  1427.  
  1428.     HD(2)=H(2)-HT(2):
  1429.  
  1430.     HD(1)=H(1)-HT(1)
  1431. 44910    RETURN
  1432. 44920    INPUT "TIME= H,H,M,M,S,S ";HT(1),HT(2),HT(3),HT(4),HT(5),HT(6)
  1433. 44930    INPUT "LATER TIME H,H,M,M,S,S ";H(1),H(2),H(3),H(4),H(5),H(6)
  1434. 44940    GOSUB 44830
  1435. 44950    PRINT "You've been on the system for...... ";
  1436. 44960    TF$="#"
  1437. 44970    FOR I=1 TO 6
  1438. 44980        PRINT USING TF$;HD(I);
  1439. 44990        IF I=2 THEN 
  1440.  
  1441.             PRINT ":";
  1442. 45000        IF I=4 THEN 
  1443.  
  1444.             PRINT ":";
  1445. 45010    NEXT I
  1446. 45020    PRINT
  1447. 45030    RETURN
  1448. G TF$;