3 ' $linesize: 132
4 ' $title: 'RBBS-PC 17.3B, Copyright 1990 by D. Thomas Mack'        ' DA102501
5 ' WARNING !!! DO NOT CHANGE, BYPASS OR Remove LINES 3-29
9 'by D. Thomas Mack, 39 Cranbury Drive, Trumbull, CT 06611 (up to 16)
   '  Jon Martin, 4396 N Prairie Willow Ct, Concord, CA 94521 (up to 17.2B)
   '  Ken Goosens, 5020 Portsmouth Road, Fairfax, VA 22032
   '  Doug Azzarito, 5480 Eagle Lake Drive, Palm Beach Gardens, FL 33418
13 '
14 ' *******************************NOTICE*************************************
15 ' *  A limited license is granted to all users of this program and it's    *
16 ' *  companion program, CONFIG (version 17.3B), to make copies of this     *
17 ' *  program and distribute the copies to other users, on the following    *
18 ' *  conditions:                                                           *
19 ' *    1.   The notices contained in lines 3 through 29 of the program     *
20 ' *         are not altered, bypassed, or removed.                         *
21 ' *    2.   The program is not to be distributed to others in modified     *
22 ' *         form (i.e. the line numbers must remain the same).             *
23 ' *    3.   No fee is to be charged (or any other consideration received)  *
24 ' *         for copying or distributing these programs without an express  *
25 ' *         written agreement with D. Thomas Mack, The Second Ring, 39     *
26 ' *         Cranbury Drive, Trumbull, Conneticut 06611                     *
27 ' *                                                                        *
28 ' *       Copyright (c) 1983-1990 D. Thomas Mack, The Second Ring          *
29 ' **************************************************************************
   '
   ' $INCLUDE: 'RBBS-VAR.BAS'
   '
   ' $SUBTITLE: 'Main-line RBBS-PC Program'
    ZCrLf$ = CHR$(13) + CHR$(10)
    WasJ = 60
    DIM ZOptSec(WasJ)
    ZConfigFileName$ = "RBBS-PC.DEF"
    CALL GetCommand (ZDebug,NetTime$,ZNetBaud$,ZNetReliable$)
    ZSubParm = -62
    ZBulletinMenu$ = ""
    CALL ReadDef (ZConfigFileName$)
    IF ZErrCode > 0 THEN _
       GOTO 31
    CALL MLInit (1)
    ZSubParm = -9
    CALL Carrier
    IF ZSubParm THEN _
       CALL CopyRight
    GOTO 100
31  ZSnoop = ZTrue
    CALL PScrn ("Configuration "+ZConfigFileName$+" missing/improper format") : _ ' KG071301
    GOTO 204
100 CLEAR,,ZSizeOfStack
    DEF SEG                            ' Point to BASIC
    WIDTH 80                           ' Set Screen Width
    KEY OFF                            ' Line 25 turned off
' ********************* Variable Definitions *******************************
102 ZMsgDim = 99
    WasMM = 999
    WasBX = 75
    WasJ = 60
    REDIM ZOptSec(WasJ)
    DIM ZWorkAra$(WasJ)
    DIM ZGSRAra$(WasJ)
    DIM ZCategoryName$(WasBX),ZCategoryCode$(WasBX),ZCategoryDesc$(WasBX)
    DIM ZOutTxt$(ZMsgDim)                      ' Message line table
    DIM ZUserIn$(ZMsgDim)                      ' Message line table
    DIM ZMsgPtr(WasMM,2)                       ' Message pointers
    CALL VarInit
105 ZVersionID$ = "17.3B"
106 CALL GetCommand (ZDebug,NetTime$,ZNetBaud$,ZNetReliable$)
    ZSubParm = 1
    CALL ReadDef (ZConfigFileName$)
    IF ZErrCode > 0 THEN _
       GOTO 31
    REDIM ZWorkAra$(ZMaxWorkVar)
    REDIM ZGSRAra$(ZMaxWorkVar)
    ZUseTPut = (ZUpperCase OR ZXOnXOff)
    OrigUpgradeSec = ZAutoUpgradeSec
    ZOrigCallers$ = ZCallersFile$
    ZOrigMsgFile$ = ZMainMsgFile$
    ZOrigUserFile$ = ZMainUserFile$
    OrigMainSec = ZMinLogonSec
    ZOrigSysopFN$ = ZSysopFirstName$
    ZOrigSysopLN$ = ZSysopLastName$
    ZExpertUser = ZExpertUserDef
    ZPromptBell = ZPromptBellDef
    CALL BreakFileName (ZOrigMsgFile$,Drive$,OrigMsgName$,ZWasY$,ZFalse)
    IF OrigMsgName$ = "MESSAGES" THEN _
       OrigMsgName$ = "MAIN" _
    ELSE IF RIGHT$(OrigMsgName$,1) = "M" THEN _
            OrigMsgName$ = LEFT$(OrigMsgName$,LEN(OrigMsgName$)-1)
    ConfFileName$ = OrigMsgName$
    OrigNewsFileName$ = ZWelcomeFileDrvPath$ + _
              OrigMsgName$ + ".NWS"
    ZNewsFileName$ = OrigNewsFileName$
    IF ZNetMail$ <> "NONE" AND VAL(NetTime$) > 0 THEN _
       ZLimitMinsPerSession = VAL(NetTime$)
    IF ZNetMail$ <> "NONE" AND VAL(ZNetBaud$) > 0 THEN _
       ZExpectActiveModem = ZTrue : _
       IF NOT ZKeepInitBaud THEN _
          ZModemInitBaud$ = ZNetBaud$
    IF ZFossil THEN _
       ZComPort = VAL(RIGHT$(ZComPort$,1)) - 1 : _
       IF ZComPort < 0 THEN _
          GOTO 108 _
       ELSE CALL FOSinit(ZComPort,Result) : _
            IF Result = -1 THEN _
               ZSnoop = ZTrue : _
               CALL PScrn("ERROR INITIALIZING FOSSIL") : _
               GOTO 204
108 CALL BreakFileName (ZCallersFile$,Drive$,WasX$,ZWasY$,ZTrue)
    ZCallersFilePrefix$ = WasX$
    ZNodeWorkDrvPath$ = Drive$
    ZArcWork$ = ZNodeWorkDrvPath$ + _
                "ARCWORK" + _
                ZNodeFileID$ + _
                ".DEF"
    IF ZUseBASICWrites THEN _
       ZLocalBksp$ = ZBackArrow$ _
    ELSE ZLocalBksp$ = ZBackSpace$
    ZSysopFullName$ = LEFT$(ZSysopFirstName$ + " " + ZSysopLastName$ + "  ",22) ' KG090402
    ZFastFileSearch = ZFalse
    CALL FindIt (ZFastFileList$)
    IF ZOK THEN _
       CALL FindIt (ZFastFileLocator$) : _
       ZFastFileSearch = ZTrue : _
       CALL BreakFileName (ZFastFileList$, Drive$,WasX$,ZWasY$,ZTrue) : _
       ZFileName$ = Drive$ + WasX$ + "T" + ZWasY$ : _
       CALL FindIt (ZFileName$) : _
       IF ZOK THEN _
          CALL OpenRSeq (ZFileName$, WasX, WasY, 72) : _
          FIELD 2, 72 AS IndexRec$ : _
          GET 2, 1 : _
          ZFastTabs$ = IndexRec$ : _
          CLOSE 2
'
' *****  INITIALIZE NetBIOS INTERFACE   ****
'
   IF ZNetworkType = 6 AND NOT SubBoard THEN _
      CALL InitIBM
'
' *****  ESTABLISH NEXT CALLERS FILE RECORD AVAILABLE   ***
'
    CALL SetCall
112 IF NOT SubBoard THEN _
       ZLocalUser = ZTrue : _
       ZOutTxt$ = ZColorReset$ : _
       ZSubParm = 1 : _
       CALL TPut : _
       ZLocalUser = ZFalse
    ZUpldDriveFile$ = RIGHT$(ZDnldDrives$,1)+":FREESPAC.UPL"
    MinsPerSessionDef = ZMinsPerSession
    MaxPerDayDef = ZMaxPerDay
'
' *****  TEST FOR MESSAGE FILE PRESENT (Abort IF NOT PRESENT)  ****
'
135 IF ZCurDef$ = ZOrigCnfg$ THEN _
       ZActiveMessageFile$ = ZMainMsgFile$ : _
       ZActiveUserFile$ = ZMainUserFile$
    GOSUB 4910
    IF ZConfMode THEN _
       GOTO 150
    ZLocalUserMode = (RIGHT$(ZComPort$,1) < "1")
    GET 1,ZNodeRecIndex
    ZWasY$ = MID$(ZMsgRec$,77,2)
    CALL UnPackDate (ZWasY$,WasX,WasL,WasI,ZOldDate$)
    ZOldDate$ = LEFT$(ZOldDate$,6) + MID$(STR$(WasX),2)
    ZHourMinToDropToDos = - (ZHourMinToDropToDos > 0) * ZHourMinToDropToDos
    Hour = INT(ZHourMinToDropToDos / 100)
    WasMN = ZHourMinToDropToDos - Hour * 100
    ZTimeToDropToDos! = Hour * 3600! + WasMN * 60!                   ' KK030901
'
' ******  TEST FOR TIMED EXIT ACTIVE   *****
'
140 IF ZHourMinToDropToDos > 0 AND _
       ZOldDate$ <> DATE$ AND _
       TIMER >= ZTimeToDropToDos! AND _
       TIMER < 86340 THEN _
          GOTO 206
'
' **** GET CURRENT STATUS OF SYSOP AVAIL, SYSOP ANNOY, SYSOP NEXT, & PRINTER
'
150 IF SubBoard THEN _
       GOSUB 12987 : _
       GOSUB 5135 : _
       GOTO 170
    ZSysopAvail = VAL(MID$(ZMsgRec$,32,2))
    ZSysopAnnoy = VAL(MID$(ZMsgRec$,34,2))
    ZSysopNext = VAL(MID$(ZMsgRec$,36,2))
    MID$(ZMsgRec$,36,2) = STR$(ZFalse)
    ZPrinter = VAL(MID$(ZMsgRec$,38,2))
    IF ZTurnPrinterOff THEN _
       ZPrinter = ZFalse
    ZExitToDoors = (MID$(ZMsgRec$,40,2) = "-1" AND ZNetBaud$ = "")
    ZEightBit = VAL(MID$(ZMsgRec$,42,2))
    ZBPS = VAL(MID$(ZMsgRec$,44,2))
    ZSnoop = VAL(MID$(ZMsgRec$,58,2))
    MID$(ZMsgRec$,57,1) = "I"
    ZPrivateDoor = (MID$(ZMsgRec$,72,2) = "-1")
    IF ZPrivateDoor THEN _
       ZHasPrivDoor = ZTrue
    MID$(ZMsgRec$,72,2) = STR$(ZFalse)
    ZLocalUser = (MID$(ZMsgRec$,101,2) = ZCarriageReturn$+ZCarriageReturn$) ' KG030601
    IF ZExitToDoors OR ZPrivateDoor THEN _
       ZHasDoored = ZTrue : _
       TurboLogon = ZTrue
    PUT 1,ZNodeRecIndex
    GOSUB 12985
'
' *****  INITIALIZE VOICE SYNTHESIZER   ****
'
    CALL Talk (Init,ZOutTxt$)
'
' *****  TEST FOR MULTI LINK PRESENT IF NOT COMPAQ COMPUTER   ****
'
160 CALL MLInit (4)
170 FOR FunctionKeyIndex = 1 TO 10
       KEY FunctionKeyIndex,""
    NEXT
    CALL LoadNew (ZMsgPtr())
'
' ******  INITIALIZE FILE MANAGEMENT SYSTEM, CHECK FOR LOCAL BBS MODE
'
175 GOSUB 5344
    CALL CountLines (MaxEntries)
    REDIM ZCategoryName$(MaxEntries),ZCategoryCode$(MaxEntries),_
          ZCategoryDesc$(MaxEntries) : _
    CALL InitFMS (ZCategoryName$(),ZCategoryCode$(), _
                  ZCategoryDesc$(),ZNumCategories)
    ZMaxMsgLines = ZMaxMsgLinesDef
    ZLocalUser = (ZLocalUser OR ZLocalUserMode)
    IF (NOT ZLocalUser) AND (NOT SubBoard) THEN _
       CALL OpenCom (ZModemInitBaud$,",N,8,1")
    IF NOT SubBoard THEN _
       CALL SetEcho (ZDefaultEchoer$)
    ZNodeWorkFile$ = ZNodeWorkDrvPath$ + _
                      "NODE" + _
                      ZNodeFileID$ + _
                      "WRK"
    ZSecsPerSession! = ZMinsPerSession * 60!                         ' KK030901
    IF NOT ZLocalUserMode THEN _
       IF NOT ZExitToDoors THEN _
          GOTO 180 _
       ELSE IF NOT ZLocalUser THEN _
               GOTO 180
    ZLocalUser = ZTrue
    ZBPS = -6
    ZBaudTest! = 9600
    ZEightBit = ZTrue
    ZSnoop = ZTrue
    IF ZExitToDoors THEN _
       CALL AMorPM : _
       CALL ReadProf : _
       GOTO 410
    GOSUB 178
    GOTO 345
178 IF NOT SubBoard THEN _                                           ' KG082002
       RETURN                                                        ' KG082002
    IF ZNewUser THEN _                                               ' KG082002
       GOSUB 758                                                     ' KG082002
    IF ZFirstName$ = ZSysopFirstName$ AND _
       ZLastName$ = ZSysopLastName$ THEN _
          RETURN 832 _
    ELSE RETURN 790                                                  ' KG082002
180 ZSubParm = 2
    CALL Line25
    GOSUB 178
'
' ******  WAIT FOR THE PHONE TO RING AND ANSWER IT   ****
'
    ZSubParm = 1
200 ZToggleOnly = ZTrue
    CALL AnswerIt
    GET 1,ZNodeRecIndex
    ZSnoop = VAL(MID$(ZMsgRec$,58,2))
    ZToggleOnly = ZFalse
    IF ZErrCode > 1 THEN _
       GOTO 13000
    IF ZSubParm < 0 THEN _
       GOTO 202
    ON ZSubParm GOTO   410, _   '  1 = ANSWERED PHONE & CARRIER FOUND
                       330, _   '  2 = CARRIER FOUND BEFORE ANSWERING
                       822, _   '  3 = ZSysop GETS SYSTEM NEXT
                     10595, _   '  4 = ANSWERED PHONE BUT NO CARRIER
                     13540, _   '  5 = NOT USED
                       202, _   '  6 = LOCAL SYSOP KEY PRESSED
                       206, _   '  7 = TIME TO DROP TO DOS
                     13538      '  8 = ZNo CALLS! TIME TO RECYCLE
202 ZFF = -ZSubParm
    ON ZFF GOTO 10595, _   '  -1 = CARRIER DROPPED
                 4770, _   '  -2 = SYSOP INITIATED CHAT
                  205, _   '  -3 = FORCE SYSTEM TO ANSWER THE PHONE
                  204, _   '  -4 = EXIT TO DOS IMMEDEATELY
                  203, _   '  -5 = EXIT TO DOS AFTER CLEAN-UP
                10698, _   '  -6 = INDICATE ACCESS IS DENIED AND LOGOFF USER
                10620      '  -7 = UPDATE CALLERS FILE AND LOGOFF USER
203 CALL MLInit(3)
204 IF Zfossil THEN _
       CALL FOSExit(ZComPort)
    SYSTEM
205 ZSubParm = 4
    GOTO 200
206 CALL TimedOut
    GOTO 203
330 CALL Carrier
    IF ZSubParm = -1 THEN _
       GOTO 10595
    CALL EofComm (Char)
    IF Char = -1 THEN _
       GOTO 335
    CALL FlushCom (ZWasDF$)
    IF ZSubParm = -1 THEN _
        GOTO 10595
    GOTO 330
335 ZExitToDoors = ZFalse
    ZPrivateDoor = ZFalse
    IF ZWasCL <> 1 THEN _
       LOCATE 22,34
    WasD$ ="CONNECT" + _
        STR$(ZBaudTest!) + _
        "     "
    GOSUB 1315
'
' *****  DISPLAY WELCOME LINE  ****
'
345 LOCATE 24,1
    CALL AMorPM
    ZUserLogonTime! = TIMER
    ZTimeLoggedOn$ = TIME$
    ZLinesPrinted = 0
    ZExpertUserDef = ZExpertUser
    ZExpertUser = ZFalse
    CALL SetExpert
    ZOutTxt$ = ""
    IF NodesInSystem > 1 THEN _
       ZOutTxt$ = " - Node " + ZNodeID$                              ' DA071701
    IF ZReliableMode THEN _
       ZOutTxt$ = ZOutTxt$ + " (Reliable)"                           ' KG071301
    CALL QuickTPut1 ("Welcome to " + ZRBBSName$ + ZOutTxt$)          ' DA071701
    ZTestParity = ZTrue
    ZStopInterrupts = ZTrue
    ZFileName$ = ZPreLog$
    CALL FlushCom (WasX$)
    ZCommPortStack$ = ""
346 GOSUB 466
    IF ZSubParm = -1 THEN _
       GOTO 13540
    ZFF = ZFalse
'
' *****  GET USER NAME
' *****  C - COMMAND FROM NEWUSER REGISTER OPTIONS (CHANGE NAME OR ADDRESS)
'
400 CALL SkipLine(1)
    ZEscapeInsecure = ZFalse
    ZUpperCase = ZFalse
    ZExpertUser = ZExpertUserDef
    CALL SetExpert
    WasA1$ = "What is your "
    GOSUB 12500
    CALL CommInfo
    IF ZFF THEN _
       ZLogonErrorIndex = 1 : _
       GOTO 10620
    IF ZMinOldCallerBaud > ZBaudTest! THEN _
       CALL QuickTPut (MID$(STR$(ZBaudTest!),2) + " BAUD ACCESS NOT ALLOWED!",2) : _
       ZWasLG$(7) = "OLD CALLER BAUD RESTRICTION" : _
       ZLogonErrorIndex = 7 : _
       GOTO 10620
    TurboLogon = (LEFT$(ZUserIn$(4),1) = "!")
    SkipWelcomeScreen = (LEFT$(ZUserIn$(4),1) = "$")
    ZHomeConf$ = RIGHT$(ZUserIn$(4),LEN(ZUserIn$(4)) _
                     + (TurboLogon OR SkipWelcomeScreen))
    CALL AllCaps(ZHomeConf$)
'
' *****  CHECK IF SAME USER ON ANOTHER NODE   ***
'
410 IF ZExitToDoors THEN _
       ZCurDate$ = MID$(ZMsgRec$,119,2) + _
                       "-" + _
                       MID$(ZMsgRec$,121,2) + _
                       "-" + _
                       MID$(ZMsgRec$,123,2) : _
       ZTime$ = MID$(ZMsgRec$,125,2) + _
              ":" + _
              RIGHT$(ZMsgRec$,2) : _
       IF LEFT$(ZTime$,2) < "12" THEN _
          ZTime$ = ZTime$ + _
                 " AM" _
       ELSE ZTime$ = ZTime$ + _
                   " PM"
    NodeIndex = 2
    WasXX = NodesInSystem + 1
    WasX$ = LEFT$(ZActiveUserName$+"  ",30)
412 IF NodeIndex > WasXX THEN _
       GOTO 430
    GET 1,NodeIndex
    IF INSTR(ZMsgRec$,WasX$) THEN _
       GOTO 420
    NodeIndex = NodeIndex + 1
    GOTO 412
420 IF MID$(ZMsgRec$,57,1) = "A" THEN _
       ZLogonErrorIndex = 6 : _
       ZWasLG$(6) = ZWasLG$(6) + _
                LEFT$(ZMsgRec$,25) : _
       ZOutTxt$ = "Name <" + ZActiveUserName$ + "> in use on another node" : _
       CALL RingCaller : _
       GOTO 10620
    ZFirstName$ = LEFT$(ZMsgRec$,INSTR(ZMsgRec$, " ") - 1)
    IF NOT ZPrivateDoor THEN _
       CALL SkipLine (1) : _
       CALL QuickTPut1 (ZFirstName$ + ", welcome back!") : _
       CALL Talk (11,ZOutTxt$)
    IF ZExitToDoors THEN _
       GOTO 457
'
' *****  TEST FOR REMOTE SYSOP LOGGING ON   ***
'
430 GET 1,ZNodeRecIndex
    SameUser = (ZActiveUserName$ = LEFT$(ZMsgRec$,LEN(ZActiveUserName$)))
'
' *****  TEST FOR SYSOP NAME ATTEMPT  ***
'
445 IF INSTR(ZActiveUserName$,"SYSOP") OR _
       INSTR(ZActiveUserName$,ZSysopFirstName$ + " " + ZSysopLastName$) THEN _
       ZLogonErrorIndex = 2 : _
       GOTO 10620
'
' *****  REMOVE INVALID CHARACTERS FROM USER NAME  ***
'
455 CALL BadChar (ZActiveUserName$)
    IF ZActiveUserName$ = "" THEN _
       GOTO 400
'
' ****  CHECK FOR ACTIVE USER   ***
'
457 CALL SkipLine (1)
    GOSUB 12840
    GOSUB 12850
    GOSUB 12598
    GOSUB 11482
    CALL CompDate (TodayRegYY,TodayRegMM,TodayRegDD,TodayComputeDate!)
    IF NOT Found THEN _
       GOTO 700
    GOSUB 12984
'
' *****  ACTIVE USER FOUND  ****
'
459 GOSUB 9500
    ZLastDateTimeOnSave$ = ZLastDateTimeOn$
    IF ZExitToDoors THEN _
       TempHoldTime! = VAL(LEFT$(ZTime$,2))*3600! + _                ' KK030901
                         VAL(MID$(ZTime$,4,2))*60! : _               ' KK030901
       CALL CheckTime(TempHoldTime!, TempTime!, 2) : _
       MinsInDoors = TempTime! / 60 : _
       CALL TimeRemain (MinsRemaining)
    ZUserFileIndex = LOC(5)
    GOSUB 5135
'
' ***  COMPUTE THE NUMBER OF DAYS REMAINING UNTIL REGISTRATION EXPIRES **
'
    IF ZRestrictByDate AND ZDaysInRegPeriod > 0 THEN _
       CALL CompDate (UserRegYY,UserRegMM,UserRegDD,UserComputeDate!) : _
       ZRegDaysRemaining = UserComputeDate! + _
                            ZDaysInRegPeriod - _
                            TodayComputeDate! : _
       CALL ExpireDate (UserComputeDate!,ZDaysInRegPeriod,ZExpirationDate$) _
    ELSE ZDaysInRegPeriod = 0
    IF NOT ZPrivateDoor THEN _
       IF ZRegDaysRemaining < 0 AND ZDaysInRegPeriod > 0 THEN _
       IF ZUserSecLevel > ZExpiredSec THEN _
          CALL QuickTPut1 (ZWasLG$(9) + _
                      " - security reset to " + _
                      STR$(ZExpiredSec)) : _
          CALL BufFile(ZHelpPath$+"RGXPIRD"+ZHelpExtension$,WasX) : _
          ZLogonErrorIndex = 9 : _
          ZUserSecLevel = ZExpiredSec : _
          LSET ZSecLevel$ = MKI$(ZUserSecLevel) : _
          GOSUB 5135
460 UserSecLevel$ = STR$(ZUserSecLevel)
    IF ZUserSecLevel > -1 THEN _
       UserSecLevel$ = MID$(UserSecLevel$,2)
    IF ZUserSecLevel >= ZMinLogonSec THEN _
       GOTO 470
    IF NOT ZPrivateDoor THEN _
       GOSUB 465 : _
       CALL DelayTime (8 + ZBPS)
    IF ZLogonErrorIndex < 9 AND _
       ZErrCode = 0 THEN _
       ZLogonErrorIndex = 8
    GOTO 10620
'
' ***  DISPLAY LOG-ON MESSAGE FOR SPECIFIC SECURITY LEVEL  **
'
465 TurboLogon = TurboLogon AND (ZExitToDoors OR _
                  (ZUserSecLevel >= ZAllowCallerTurbo))
    IF TurboLogon THEN _
       RETURN
    ZFileName$ = ZWelcomeFileDrvPath$ + _
                 "LG" + _
                 UserSecLevel$ + _
                 ".DEF"
    CALL Graphic (ZUserGraphicDefault$,ZFileName$)
466 ZStopInterrupts = ZTrue
    ZBypassTimeCheck = ZTrue
    CALL BufFile (ZFileName$,WasX)
    RETURN
470 GOSUB 12989
    ZWasCI$ = ZCityState$
    CALL Trim (ZWasCI$)
    ZAttemptsAllowed = 4
    ZPswdSave$ = ZPswd$
    TempSysop = (ZUserSecLevel >= ZSysopSecLevel)
    ZMsgPswd = ZFalse
    IF NOT SubBoard THEN _
       ZElapsedTime = CVI(ZElapsedTime$)
    IF (NOT ZExitToDoors) AND _
       (ZCurDate$ <> LEFT$(ZLastDateTimeOn$,8)) AND _
       (ZElapsedTime > 0 OR NOT ZKeepTimeCredits) THEN _
       ZElapsedTime = 0
    IF ZPrivateDoor AND _
       ZTransferFunction = 3 THEN _
       GOSUB 755 : _
       GOTO 800
    IF ZPswdSave$ = SPACE$(LEN(ZPswdSave$)) THEN _
       GOSUB 755 : _
       GOTO 800
480 GOSUB 5370
    IF ZPrivateDoor OR (ZWasA AND ZEscapeInsecure) OR ZDoorSkipsPswd THEN _
       ZWasZ$ = ZPswdSave$ : _
       ZPswdFailed = 0 : _
       GOTO 644
    ZSubParm = 4
    CALL PassWrd
    LogonPswdFailed = ZPswdFailed                                    ' KG092101
    ZLastIndex = 0
643 IF NOT LogonPswdFailed THEN _                                    ' KG092101
       GOSUB 41070 _                                                 ' KG092101
    ELSE IF NOT ZExitToDoors THEN _                                  ' KG092101
       ZFirstName$ = "" : _                                          ' KG092102
       GOTO 902                                                      ' KG092101
644 ZNewUser = ZFalse
    WasWK$ = RIGHT$(STR$(ASC(MID$(ZListNewDate$,2))),2) + _  ' MM
           "/" + _
           RIGHT$(STR$(ASC(MID$(ZListNewDate$,3))),2) + _    ' DD
           "/" + _
           RIGHT$(STR$(ASC(ZListNewDate$)),2)                ' YY
    ZWasLM$ = RIGHT$(WasWK$,2) + _                           ' YY
          LEFT$(WasWK$,2) + _                                ' MM
          MID$(WasWK$,4,2)                                   ' DD
    IF MID$(ZWasLM$,3,1) = " " THEN _
       MID$(ZWasLM$,3,1) = "0"
655 IF MID$(ZWasLM$,5,1) = " " THEN _
       MID$(ZWasLM$,5,1) = "0"
660 CALL Muzak (1)
    GOTO 800
670 GOSUB 12570
    IF Found THEN _
       GOSUB 12984 : _
       RETURN 12595
    RETURN
'
' ****  ACTIVE USER NOT FOUND (NEWUSER ROUTINE)  ***
'
700 ZExpertUser = ZFalse
    CALL SetExpert
    IF ZMinNewCallerBaud > ZBaudTest! THEN _
       CALL QuickTPut ("(" + MID$(STR$(ZBaudTest!),2) + " BAUD ACCESS FOR REGISTERED USERS ONLY)",2) : _
       ZWasLG$(7) = "NEW CALLER BAUD RESTRICTION" : _
       ZLogonErrorIndex = 7 : _
       GOTO 10620
    CALL QuickTPut1 ("User not found")
    ZLastIndex = 0
    GOSUB 12558
    IF ZNo THEN _
       GOSUB 12990 : _
       GOTO 400
    CALL Line25
    ZWasZ$ = ZFirstName$
    GOSUB 670
    ZWasZ$ = ZLastName$
    GOSUB 670
    ZWasZ$ = ZActiveUserName$
    GOSUB 670
    TurboLogon = ZFalse
710 IF ZUserFileIndex = 0 AND NOT ZSurviveNoUserRoom THEN _
       GOTO 13540
720 GOSUB 5370
    IF ZWasA THEN _
       ZUserSecLevel = ZSysopSecLevel _
    ELSE ZUserSecLevel = ZDefaultSecLevel
725 IF ZUserSecLevel < ZMinLogonSec THEN _
       ZLogonErrorIndex = 1 : _
       GOTO 460
    IF ZFirstName$ = ZLastName$ THEN _
       CALL QuickTPut1 (ZFirstNamePrompt$+"/"+ZLastNamePrompt$+" cannot be same") : _
       ZLogonErrorIndex = 3 : _
       GOTO 10620
    IF NOT ZRememberNewUsers THEN _
       GOSUB 13700 : _
       ZUserFileIndex = 0 : _
       GOSUB 12960: _
       PrevLastOn$ = "00-00-00": _
       GOTO 735
    ZNewUser = ZTrue
    CALL OpenUser (HighestUserRecord)
    GOSUB 9450
    GOSUB 12630
    MID$(ZUserRecord$,ZStartHash,ZLenHash) = LEFT$("NEWUSER",ZLenHash)
    IF ZStartIndiv > 0 THEN _                                        ' RC050901
       MID$(ZUserRecord$,ZStartIndiv,ZLenIndiv) = ZIndivValue$       ' RC050901
    GOSUB 9440
730 GOSUB 12960
735 ZBypassTimeCheck = ZTrue
    GOSUB 758                                                        ' KG082002
739 CALL QuickTPut1 (ZActiveUserName$ + " from " + ZWasCI$)
740 ZOutTxt$ = "C)hange "+ZFirstNamePrompt$+"/"+ZLastNamePrompt$+"/"+ZUserLocation$+", D)isconnect, [R]egister"
    GOSUB 12995
    IF ZWasQ = 0 THEN _
       ZWasZ$ = "R" _
    ELSE CALL AllCaps (ZUserIn$(1)) : _
         ZWasZ$ = ZUserIn$(1)
    ZWasS = INSTR("CDR",ZWasZ$)
745 IF NOT ZRememberNewUsers THEN _
       ON ZWasS GOTO 748,752,754
    ON ZWasS GOTO 747,750,760
    GOTO 740
747 CALL UpdtCalr (ZActiveUserName$ + " from " + ZWasCI$ + _
                           " changed Name/Address",2)
    MID$(ZUserRecord$,ZStartHash,ZLenHash) = STRING$(ZLenHash,0)
    GOSUB 9440
    GOSUB 12991
748 ZFF = ZFalse
    GOTO 400
'
' ***  D - COMMAND FROM NEWUSER ROUTINE (DISCONNECT - REFUSE TO REGISTER) **
'
750 CALL UpdtCalr (ZActiveUserName$ + " from " + ZWasCI$ + _
                           " didn't register",2)
    MID$(ZUserRecord$,ZStartHash,ZLenHash) = STRING$(ZLenHash,0)
    GOSUB 9440
    GOSUB 12991
752 ZFF = ZFalse
    ZUserFileIndex = 0
    GOTO 13540
'
' *****  GET AND VERIFY PASSWORD   ****
'
754 CALL QuickTPut1 ("GUEST privileges granted.  Re-register on future calls")  ' DA071701
    ZUserSecSave = ZUserSecLevel
    GOTO 832
755 IF ZPrivateDoor THEN _
       ZUserIn$ = ZPswd$ : _
       ZWasZ$ = ZUserIn$ : _
       RETURN
    GOSUB 12800
    ZOutTxt$ = "Re-Enter password for Verification"                  ' DA071701
    GOSUB 45010
    SWAP ZWasZ$,ZUserIn$
    CALL AllCaps (ZWasZ$)
    IF ZUserIn$ <> ZWasZ$ THEN _
       CALL QuickTPut1 ("Passwords Don't Match!") : _
       GOTO 755
    RETURN                                                           ' KG082002
758 CALL AskMore ("",ZTrue,ZTrue,WasX,ZTrue)                         ' KG082002
    CALL Line25
    ZFileName$ = ZNewUserFile$
    ZStopInterrupts = ZTrue
    GOSUB 1790
    CALL SkipLine(1)
    RETURN                                                           ' KG082002
'
' ***  R - COMMAND FROM NEWUSER ROUTINE - REGISTER   **
'
760 GOSUB 755
    CALL AllCaps (ZWasZ$)
    LSET ZPswd$ = ZWasZ$
    CALL QuickTPut1 ("Please REMEMBER your password")
    ZUserTextColor = 37
    ZTempSecLevel = ZUserSecLevel
    CALL Protocol
    ZUserXferDefault$ = "N"
    ZProtoPrompt$ = "None"
    IF ZNewUserSetsDefaults THEN _                                   ' KG071301
       ZBypassTimeCheck = ZTrue : _
       GOSUB 43000 : _
       ZBypassTimeCheck = ZFalse : _
       CALL Graphic (ZUserGraphicDefault$,ZFileName$) : _
       GOSUB 42805 : _
       GOSUB 42700 _
    ELSE ZUpperCase = ZFalse : _
         ZHiLiteOff = ZTrue : _
         CALL SetGraphic (0,ZUserGraphicDefault$) : _
         ZNulls = ZFalse
    ZPageLength = ZPageLengthDef
    GOSUB 12900
    GOSUB 5135
    CALL DefaultU
790 IF NOT ZNewUser THEN _
       GOTO 800
    ZFileName$ = ZNewUserQuestionnaire$
    GOSUB 11520
    LSET ZSecLevel$ = MKI$(ZUserSecLevel)
    UserSecLevel$ = STR$(ZUserSecLevel)
    CALL Remove (UserSecLevel$," ")
'
' ****  LOGIN ALL USERS  ***
'
800 CALL DoorReturn
    IF ZAdjustedSecurity THEN _
       GOSUB 5135
    IF ZOrigCnfg$ = ZCurDef$ THEN _
       ZMainUserFileIndex = ZUserFileIndex : _
       ZOrigSec = ZUserSecLevel : _
       ZUserSecSave = ZUserSecLevel : _
       ZOrigUserName$ = ZActiveUserName$
    ZTimesLoggedOn = CVI(MID$(ZUserOption$,1,2)) - _
       ((ZOrigCnfg$ <> ZCurDef$ OR NOT SubBoard) AND _
        (NOT ZPrivateDoor) AND (NOT ZExitToDoors))
    GOSUB 9500
    IF (NOT ZExitToDoors) AND (NOT SubBoard) THEN _
       CALL UpdtCalr (ZActiveUserName$ + " from " + ZWasCI$ + _
                 " Lvl" + STR$(ZUserSecLevel) + " " + TIME$,2)
    PrevLastOn$ = ZLastDateTimeOn$
    IF ZLocalUser THEN _
       ZTalkToModemAt$ = "9600" : _
       ZBaudParity$ = "9600 BAUD,N,8,1" : _
       ZModemInitBaud$ = "9600" : _
       ZSnoop = ZTrue : _
       ZLineFeeds = ZTrue
    CALL SetCrLf
    CALL SetPrompt
    CALL XferType (2,ZTrue)
    IF NOT SubBoard THEN _
       BoardCheckDate$ = PrevLastOn$
    GOSUB 5370                                                       ' KG060101
    IF ZWasA THEN _                                                  ' KG060101
       ZActiveUserName$ = "SYSOP"                                    ' KG060101
    IF ZExitToDoors OR SubBoard THEN _                               ' KG052701
       GOTO 815
    GOSUB 465
    IF (ZEightBit AND _
       ZAutoDownDesired) OR _
       ZAskID THEN _
       CALL TestUser
    CALL QuickTPut1 ("Logging " + ZActiveUserName$)
    CALL Talk (1,ZOutTxt$)
    CALL QuickTPut1 ("RBBS-PC " + ZVersionID$ + " Node " + ZNodeID$ + _  ' DA071701
                ", operating at " + ZBaudParity$)                    ' DA071701
    CALL SkipLine (1)
    Attempts = 0
    ZWasZ$ = ZActiveUserName$ + _                                    ' KG052701
            " on at " + _                                            ' KG052701
            ZCurDate$ + _                                            ' KG052701
            ", " + _                                                 ' KG052701
            ZTime$ + _                                               ' KG052701
            " from " + _                                             ' KG052701
            ZWasCI$ + _                                              ' KG052701
            ", " + _                                                 ' KG052701
            ZBaudParity$                                             ' KG052701
     ZWasNG$ = ZWasZ$ + SPACE$(128 - LEN(ZWasZ$))                    ' KG090401
'
' *  ALWAYS RECORD THE HASH/INDIVIDUATING FIELD TO EACH RECORD LOGGED OUT
'
     WasX$ = "{" + _                                                 ' KG052701
          HashValue$ + _                                             ' KG052701
          "/" + _                                                    ' KG052701
          ZIndivValue$ + _                                           ' RC050901
          "}"                                                        ' KG052701
     IF LEN(ZWasZ$) < 65 THEN _                                      ' KG052701
        WasX = 65 _                                                  ' KG052701
     ELSE WasX = LEN(ZWasZ$) + 2                                     ' KG052701
     MID$(ZWasNG$,WasX) = WasX$                                      ' KG052701
     CALL Printit ("  " + ZWasZ$)                                    ' KG052701
     IF ZNewUser THEN _                                              ' KG052701
        CALL UpdtCalr ("NEWUSER",1) : _                              ' KG052701
        CALL Muzak (2)                                               ' KG052701
'
' *****  NOTIFY CALLER IF ABLE TO "AUTODOWN"  ****
'
    IF ZEightBit AND ZAutoDownYes THEN _
       ZOutTxt$ = CHR$(9) + _
            ZReturnLineFeed$ + _
            "You may use AUTODOWNLOADing!" : _
       CALL RingCaller : _
       CALL DelayTime(4)
815 ZDnlds = CVI(ZUserDnlds$)
    ZUplds = CVI(ZUserUplds$)
    IF ZEnforceRatios THEN _
       ZDLToday! = CVS(ZTodayDl$) : _
       ZBytesToday! = CVS(ZTodayBytes$) : _
       ZDLBytes! = CVS(ZDlBytes$) : _
       ZULBytes! = CVS(ZULBytes$)
    IF ZCurDate$ <> LEFT$(ZLastDateTimeOnSave$,8) THEN  _
       ZDLToday! = 0 : _
       ZBytesToday! = 0
    IF NOT GlobalsSet THEN _
       GlobalsSet = ZTrue : _
       ZGlobalDnlds = ZDnlds : _
       ZGlobalUplds = ZUplds : _
       ZGlobalDLToday! = ZDLToday! : _
       ZGlobalBytesToday! = ZBytesToday! : _
       ZGlobalDLBytes! = ZDLBytes! : _
       ZGlobalULBytes! = ZULBytes!
    'IF ZRatioRestrict# > 0 AND ZEnforceRatios THEN _
    '   IF ZByteMethod = 0 AND ZUplds < ZInitialCredit# THEN _
    '      ZUplds = ZInitialCredit# _
    '   ELSE IF ZByteMethod = 1 AND ZULBytes! < ZInitialCredit# THEN _
    '           ZULBytes! = ZInitialCredit#
    GOSUB 827
    LSET ZUserOption$ = MKI$(ZTimesLoggedOn) + _
                         MID$(ZUserOption$,3)
    LSET ZLastDateTimeOn$ = ZCurDate$ + _
                              " " + _
                              ZTimeLoggedOn$
    MID$(ZUserRecord$,ZStartHash,ZLenHash) = HashValue$
    IF ZStartIndiv > 0 THEN _
       MID$(ZUserRecord$,ZStartIndiv,ZLenIndiv) = ZIndivValue$       ' RC050901
    LSET ZUserName$ = ZOrigUserName$
    IF (NOT ZExitToDoors) AND NOT (ZOrigMsgFile$ = ZActiveMessageFile$ AND SubBoard) THEN _
       CALL AutoPage
    IF NOT SubBoard THEN _
       ZOrigUserFileIndex = ZUserFileIndex
    IF NOT ZConfMode THEN _                                          ' KG070601
       IF ZOrigDateTimeOn$ = "" THEN _                               ' KG070601
          ZOrigDateTimeOn$ = ZLastDateTimeOn$ : _                    ' KG070601
          ZOrigTimeLoggedOn$ = ZTimeLoggedOn$ _                      ' KG070601
       ELSE ZLastDateTimeOn$ = ZOrigDateTimeOn$ :                    ' KG070601
            ZTimeLoggedOn$ = ZOrigTimeLoggedOn$                      ' KG070601
    GOSUB 9440
    GOSUB 12991
    CALL AskMore ("",ZTrue,ZTrue,WasX,ZTrue)
    IF TurboLogon THEN _
       GOTO 819
    IF SkipWelcomeScreen AND _
       (ZUserSecLevel >= ZAllowCallerTurbo) THEN _
       GOTO 816
    IF NOT SameUser THEN _
       ZStopInterrupts = NOT ZWelcomeInterruptable : _
       ZBypassTimeCheck = ZTrue : _
       ZFileName$ = ZWelcomeFile$ : _
       ZDisplayAsUnit = ZTrue : _
       GOSUB 1790 : _
       ZDisplayAsUnit = ZFalse
    ZBypassTimeCheck = ZFalse
    ZStopInterrupts = ZTrue
816 IF NOT ZNewUser THEN _
       CALL QuickTPut1 ("Times on:" + STR$(ZTimesLoggedOn) + _
            "  Last was: " + PrevLastOn$)
817 IF NOT ZRemindFileXfers OR ZNewUser THEN _
       GOTO 818
    ZOutTxt$ = "Files Downloaded:" + _
         STR$(ZDnlds) + _
         "  Uploaded:" + _
         STR$(ZUplds)
    GOSUB 12977
    CALL CheckRatio (ZFalse)
818 CALL AskMore ("",ZTrue,ZTrue,WasX,ZTrue)
    IF ZRemindProfile THEN _
       GOSUB 5400 : _
       CALL AskMore ("",ZTrue,ZTrue,WasX,ZTrue)
819 CALL Trim (ZWasCI$)                                              ' KG060101
    IF (ZNodeRecIndex < 2) THEN _
       GOTO 821
    GOSUB 4910
    GOSUB 24000
    GET 1,ZNodeRecIndex
    MID$(ZMsgRec$,1,31) = ZActiveUserName$ + _
                                 SPACE$(31 - LEN(ZActiveUserName$))
    MID$(ZMsgRec$,40,2) = " 0"
    MID$(ZMsgRec$,44,2) = STR$(ZBPS)
    MID$(ZMsgRec$,55,2) = " 0"
    MID$(ZMsgRec$,57,1) = "A"
    MID$(ZMsgRec$,60,5) = ZTalkToModemAt$ + _
                                 SPACE$(5 - LEN(ZTalkToModemAt$))
    MID$(ZMsgRec$,72,2) = " 0"
    MID$(ZMsgRec$,93,24) = ZWasCI$ + _
                                  SPACE$(24)
    PUT 1,ZNodeRecIndex
    GOSUB 12985
821 IF ZExitToDoors THEN _
       IF ZTransferFunction = 3 THEN _
          ZNewUser = ZTrue : _
          TurboLogon = ZFalse : _
          SameUser = ZFalse : _
          ZTransferFunction = 0 : _
          GOTO 832 _
       ELSE GOTO 832
    GOSUB 1241
    IF (SubBoard AND (ZOrigMsgFile$ = ZActiveMessageFile$)) _
       OR ((ZUserSecLevel > ZMaxRegSec) AND (NOT ZNewUser)) THEN _
       GOTO 832
    ZWasZ$ = ZRegProgram$
    ZTransferFunction = 3
    CALL DoorExit (ZFalse)                                           ' KG032502
    ZTransferFunction = 0
    GOTO 832
'
' ****  ESC PRESSED ON LOCAL CONSOLE ENTERS HERE   ***
'
822 LOCATE 24,1
    CALL TakeOffHook
    ZLocalUser = ZTrue
    ZSnoop = ZTrue
    ZSysop = ZTrue                                                   ' DR081801
    ZBPS = -6
    CALL CommInfo
    CALL Muzak (2)
    IF NOT ZEscapeInsecure THEN _
       GOTO 345
    ZActiveUserName$ = ZSysopPswd1$ + " " + ZSysopPswd2$
    ZFirstName$ = ZSysopPswd1$
    ZLastName$ = ZSysopPswd2$
    ZUserLogonTime! = TIMER
    ZTimeLoggedOn$ = TIME$
    ZLinesPrinted = 0
    GOTO 457
825 WasX = (ZMaxPerDay - ZMinsPerSession)
    WasX = -WasX * (WasX > 0)    ' extra from daily max
    ZWasQ! = WasX + ZMinsPerSession + (ZMaxPerDay > 0) * ZElapsedTime
    IF ZWasQ! > ZMinsPerSession THEN _
       ZWasQ! = ZMinsPerSession
    ZSecsPerSession! = ZWasQ! * 60 + ZTimeCredits!
    RETURN
827 IF ZLastMsgRead > HighMsgNumber THEN _
       ZLastMsgRead = 0 : _
       MID$(ZUserOption$,3,2) = MKI$(0)
    RETURN
832 IF ZRestrictByDate AND ZDaysInRegPeriod > 0 THEN _
       IF ZRegDaysRemaining <= ZDaysToWarn AND _
          ZRegDaysRemaining > 0 AND ZUserSecLevel > ZExpiredSec THEN _ ' KG071101
             CALL QuickTPut1 ("Registration EXPIRES in" + _
                       STR$(ZRegDaysRemaining) + " days!") : _
             CALL BufFile(ZHelpPath$+"RGXPIRE"+ZHelpExtension$,WasX) : _
             IF NOT ZOk THEN CALL DelayTime (5)
    IF (NOT ZReqQuesAnswered) AND _
       ZReqQues$ <> "" THEN _
         ZFileName$ = ZReqQues$ : _
         GOSUB 11520 : _
         IF ZOK THEN _
            ZReqQuesAnswered = ZTrue                                 ' KG052701
842 GOSUB 825
    ZSysop = (ZUserSecLevel >= ZSysopSecLevel)
    GOSUB 12987
    IF SubBoard THEN _
       GOTO 850
    GOSUB 12986
    GOSUB 23000
    CallsToDate! = CallsToDate! + 1 + (ZSysop OR ZHasDoored)
    GOSUB 24000
    GOSUB 12985
850 ZSubParm = 2
    CALL Line25
    CALL SkipLine (1)
    IF TurboLogon THEN _
       ZBulletinSave$ = ZBulletinMenu$ : _
       GOSUB 9750 : _
       GOTO 900
    CALL CountNewFiles (BoardCheckDate$,ZMsgPtr(),LastNew,ZOutTxt$)
    IF ZFMSDirectory$ <> "" THEN _
       CALL QuickTPut1 (ZOutTxt$ + STR$(LastNew) + " NEW file(s) since last on") _
    ELSE GOTO 852
    IF ZNewUser OR LastNew < 1 OR NOT ZNewFilesCheck THEN _
       GOTO 852
    WasL = LEN(ZDnldDrives$)
    SecNum = 19
    IF (NOT ZSkipFilesLogon) AND _
       ZUserSecLevel >= ZOptSec(SecNum) THEN _
          ZOutTxt$ = "Review new files to download ([Y],N)" : _
          GOSUB 12999 : _
          IF NOT ZNo THEN _
             ZLastIndex = 3 : _
             ZAnsIndex = 1 : _
             ZWasQ = 3 : _
             ZUserIn$(2) = MID$(BoardCheckDate$,1,2) + _
                     MID$(BoardCheckDate$,4,2) + _
                     MID$(BoardCheckDate$,7,2) : _
             ZWasY$ = ZUserIn$(3) : _
             CALL BreakFileName (ZFMSDirectory$,DR$,ZWasY$,WasX$,ZFalse) : _
             ZUserIn$(3) = ZWasY$ : _
             TimeLockExempt = ZTrue : _
             GOSUB 20185 : _
             ZLastIndex = 0 : _
             TimeLockExempt = ZFalse
852 ZStopInterrupts = ZFalse
    ZSysop = (ZUserSecLevel >= ZSysopSecLevel)
    IF ZUserSecLevel < ZOptSec (2) OR _
       ZActiveBulletins < 1 OR _
       ZSysop OR _
       SameUser THEN _
          GOTO 900
    IF ZBulletinMenu$ = ZBulletinSave$ THEN _
        GOTO 900
    ZBulletinSave$ = ZBulletinMenu$
855 CALL AskMore ("",ZTrue,ZTrue,WasX,ZTrue)
    IF ZBulletinsOptional AND NOT ZNewUser THEN _
       GOTO 856
    ZStopInterrupts = ZTrue
    ZNewUser = ZFalse
    GOSUB 9700
    ZStopInterrupts = ZFalse
    GOTO 900
856 IF NOT ZCheckBulletLogon THEN _
       ZAnsIndex = 0 : _
       GOSUB 9760 : _
       GOTO 900
    CALL SkipLine (1)
    ZOutTxt$ = "Skip the" + _
         STR$(ZActiveBulletins) + _
         " bulletins (Y,[N])"
    GOSUB 12999
    IF ZYes THEN _
       GOTO 900
860 ZNewUser = ZFalse
    GOSUB 9700
900 ZNewUser = ZFalse
    ActionFlag = (ZLogonMailLevel$ = "S")
    LogonMailNew = (ZLogonMailLevel$ = "N")
    GOSUB 1895
    IF ZActiveUserName$ = "SYSOP" AND NOT ZSysop THEN _
       ZActiveUserName$ = ZOrigUserName$
    LogonMailNew = ZFalse
    ZSubParm = 2
    CALL Line25
    ZSection$ = "    "
    ZOutTxt$ = ""
    IF (NOT ZConfMode) AND (NOT SubBoard) AND NOT TurboLogon THEN _
       MailCheckConfirm = ZTrue : _
       ZNonStop = ZTrue : _
       GOSUB 5800
    MailCheckConfirm = ZFalse
    ZWasQ! = MinsInDoors * 60
902 IF LogonPswdFailed THEN _                                        ' KG092101
       ZExitToDoors = ZFalse : _                                     ' KG091601
       CALL UpdateU (ZTrue) : _                                      ' KG091601
       ZLogonErrorIndex = 4 : _                                      ' KG091601
       GOTO 10620                                                    ' KG091601
    IF ZExitToDoors and ZDooredTo$ <> "" THEN _                      ' ML082001
       CALL BufFile (ZOutTxt$(7),WasX)                               ' ML082001
    ZExitToDoors = ZFalse
    GOSUB 2350
    IF NOT ZPrivateDoor THEN _
       GOTO 955
    GOSUB 20165
    CALL SetSection
    ZPrivateDoor = ZFalse
    GOTO 1205
955 IF NOT TurboLogon THEN _
       GOSUB 4850
    TurboLogon = ZFalse
'
' *                           COMMAND PROCESSING
'
1200 CLOSE 1
     GOSUB 1280
1205 IF ZSubParm < 0 THEN _
        GOTO 202
     ZSubParm = 1
     ZStopInterrupts = ZFalse
     ZNonStop = (ZPageLength < 1)
     ZWasQ = 0
     IF ConfMailJoin OR (ZHomeConf$ <> "" AND ZHomeConf$ <> "MAIN") THEN _ ' TC051701
        TurboLogon = (NOT ConfMailJoin) : _
        ConfMailJoin = ZFalse : _
        ZFF = 8 : _
        ZUserIn$(2) = ZHomeConf$ : _
        ZHomeConf$ = "" : _
        ZWasQ = 1 : _
        ZAnsIndex = 1 : _
        ZLastIndex = 2 : _
        ZStoreParseAt = 1 : _
        ZLastCommand$ = "MJ" : _                                     ' KG021502
        GOTO 1240
     CALL SkipLine (1)
1210 GOSUB 41000
     IF ZAnsIndex < ZLastIndex THEN _
        GOTO 1232
     CALL Talk (10,ZOutTxt$)
     CALL AskMore ("",ZTrue,ZTrue,WasX,ZTrue)                        ' KG081702
     IF ZExpertUser THEN _
        GOTO 1230
1212 ZLinesPrinted = -ZMenusCanPause * ZLinesPrinted
     IF ZCustomPUI THEN _
        GOTO 1230
     IF ZSubSection < ZBegFile THEN _
        IF ZUserSecLevel >= ZSysopMenuSecLevel THEN _
           ZFileName$ = ZMenu$(1) : _
           GOSUB 43025
     ZFileName$ = ZMenu$(ZMenuIndex)
     ZDeleteInvalid = ZTrue
     GOSUB 43025
     ZDeleteInvalid = ZFalse
1230 CALL Line25                                                     ' KG081404
     IF ZConfMode THEN _
        ZOutTxt$ = ZConfName$ + ":" : _                              ' KG081702
        GOSUB 12978 : _                                              ' KG081702
        CALL Talk (65,ZConfName$)
     CALL DispTimeRemain (MinsRemaining)                             ' KG081702
     IF ZMenuIndex = 6 THEN _
        ZSubParm = 1 : _
        CALL Library
     CALL Talk (ZMenuIndex, ZOutTxt$)
1232 MID$(ZLastCommand$,2,1) = " "                                   ' KG052901
     IF ZCustomPUI THEN _                                            ' KG052901
        CALL UserFace (ZUserGraphicDefault$) : _
        GOSUB 12997 : _
        GOTO 1235                                                    ' KG052901
     ZOutTxt$ = ZCmdPrompt$
     GOSUB 12930
     IF ZWasQ = 0 THEN _
        GOTO 1230
1235 ZWasZ$ = ZUserIn$(ZAnsIndex)
     IF ZWasZ$ = SPACE$(LEN(ZWasZ$)) THEN _
        GOTO 1230
     CALL SearchCmd (ZSubSection,ZFF)
     IF ZFF < 1 THEN _
        CALL QuickTPut1 ("Unknown command <"+ZWasZ$+">") : _
        CALL FlushKeys : _
        GOTO 1230
     CALL Talk (65,"OPTION "+ZWasZ$+" SELECTED")
1240 IF ZUserSecLevel < ZOptSec(ZFF) THEN _
       ZViolation$ = ZSection$ + _
                     " " + _
                     ZWasZ$ : _
        GOSUB 1380 : _
        GOTO 1205
     IF ZFF > 39 THEN _
        ZDirExtension$ = ZLibDirExtension$ _
     ELSE ZDirExtension$ = ZMainDirExtension$
        ON ZFF GOSUB _
                 1400, _      ' 1  A)nswer questionnaire 1
                 9700, _      ' 2  B)ulletins
                 1800, _      ' 3  C)omments
                 10970, _     ' 4  D)oor (exit to)
                 2000, _      ' 5  E)nter a message
                 1275, _      ' 6  F)ile system (exit to)
                 1760, _      ' 7  I)nitial welcome redisplayed
                 5300, _      ' 8  J)oin a conference
                 3900, _      ' 9  K)ill a message
                 4700, _      '10  O)perator page
                 1900, _      '11  P)ersonal mail (look for)
                 4330, _      '12  R)ead messages
                 4340, _      '13  S)can message headers
                 4320, _      '14  T)opic msg scan
                 1285, _      '15  U)tilities (exit to)
                 5800, _      '16  V)iew a conference
                 9800, _      '17  W)ho's on other nodes displayed
                 1283, _      '18  @)Library (exit to) 18
                20160, _      '19  D)ownload
                10570, _      '20  G)oodbye
                20155, _      '21  L)ist
                20185, _      '22  N)ew
                20180, _      '23  P)ersonal files
                20175, _      '24  S)can
                20170, _      '25  U)pload
                20140, _      '26  V)iew ARC Contents
                 5500, _      '27  B)aud rate change 300==>450 1
                 9100, _      '28  C)lock (time & time on)
                 42850, _     '29  E)cho selection
                 42800, _     '30  F)ile transfer protocol
                 43000, _     '31  G)raphics
                 5200, _      '32  L)ines per page
                 10925, _     '33  M)essage margin
                 5110, _      '34  P)assword change
                 5400, _      '35  R)eview preferences
                 4850, _      '36  S)tatistics displayed
                 1500, _      '37  T)oggle
                 10090, _     '38  U)serlog displayed 12
                 30000, _     '39  A)rchive a Library disk 1
                 30100, _     '40  C)hange a Library disk
                 30200, _     '41  D)ownload Library files
                 10570, _     '42  G)oodbye
                 20155, _     '43  L)ist a Library directory
                 20175, _     '44  S)can a Library disk directory
                 20140, _     '45  V)iew arc contents 7
                 1325, _      '45  H)elp 1
                 1330, _      '46  ?)help
                 1250, _      '49  Q)uit
                 4240, _      '50  X)expert toggle on/off 4
                 10070, _     '51  1) List comments file 1
                 10090, _     '52  2) List callers file
                 10390, _     '53  3) Recover a message
                 10530, _     '54  4) Erase comments
                 11000, _     '55  5) User file maintenance
                  4130, _     '56  6) Toggle page bell on/off
                 10930        '57  7) Exit to DOS 2.x or above 7
     GOTO 1205
'
' ***       NEWS file scan        ***
'
1241 NewsDate# = VAL(MID$(BoardCheckDate$,4,2)) + _
        (100 * VAL(MID$(BoardCheckDate$,1,2))) + _                   ' LP01NEWS
        (10000# * (1900 + VAL(MID$(BoardCheckDate$,7,2))))           ' LP01NEWS
     GOTO 1243
1242 NewsDate# = 0
1243 ZFileName$ = ZNewsFileName$
     CALL RBBSFind (ZFileName$,WasZ,WasY,ZMsgPtr,WasD)               ' LP01NEWS
     IF WasZ <> 0 THEN _
        RETURN
     FDate# = WasD + (100 * ZMsgPtr) + (10000# * (WasY + 1980))      ' LP01NEWS
     IF NewsDate# > FDate# THEN _
        RETURN
     IF TurboLogon THEN _
        CALL QuickTPut1("NEWS file updated since last call") : _
        RETURN
     ZStopInterrupts = ZFalse
     ZNonStop = (ZPageLength < 1)
     GOSUB 1790
     WasZ = 0
     RETURN                                                          ' LP01NEWS
'
' ****           QUIT COMMAND (GLOBAL)              ***
'
1250 IF ZExpertUser THEN _
        ZOutTxt$ = ZQuitPromptExpert$ _
     ELSE ZOutTxt$ = ZQuitPromptNovice$
     ZStackC = ZTrue
     GOSUB 12930
     IF ZWasQ = 0 THEN _
        ZUserIn$(ZAnsIndex) = "M"
     ZWasZ$ = ZUserIn$(ZAnsIndex)
     CALL AllCaps (ZWasZ$)
     IF ZWasZ$ = "C" THEN _
        ZWasZ$ = "M" : _
        GOTO 5323
     IF ZWasZ$ <> SPACE$(LEN(ZWasZ$)) THEN _
        ON INSTR(ZQuitList$,ZWasZ$) GOTO 1275,1280,1285,10570,1283
     GOTO 1250
1275 ZMenuIndex = 3
     GOTO 1295
1280 ZMenuIndex = 2
     GOTO 1295
1283 ZMenuIndex = 6
     ZActiveFMSDir$ = ""
     GOTO 1295
1285 ZMenuIndex = 4
1295 CALL SetSection
     RETURN
1300 CALL QuickTPut1 ("Message base " + ZConfName$)
     RETURN
'
' **** COMMON LOCAL DISPLAY PRINT  ***
'
1315 NumReturns = 1
1320 CALL LPrnt(WasD$,NumReturns)
     RETURN
'
' ******            HELP (GLOBAL)           ****
'
1325 CALL ViewHelp (ZSubSection,ZUserGraphicDefault$, _
                MID$("MAINFILEUTILMAINLIBR",4 * ZMenuIndex - 7,4))
     IF ZSubParm = -1 THEN _
        RETURN 10595
     RETURN
1330 IF ZExpertUser THEN _
        RETURN 1212
     GOTO 1325
'
' *****  RECORD SECURITY VIOLATIONS   ****
'
1380 CALL SecViolation
     IF NOT ZDenyAccess THEN _
        RETURN
1386 CALL DenyAccess
     GOTO 10620
1397 ZOutTxt$ = "Sorry, " + _
          ZFirstName$ + _
          ", " + _
          ZOutTxt$
     GOTO 12975
'
' ***  A - answer questionnaire
'
1400 WasA1$ = ZAnsMenu$
     CALL Talk (13,ZOutTxt$)
     ReturnToPrompt = (ZWasQ > 1)
1401 ZStackC = ZTrue
     CALL SubMenu ("Which questionnaire(s), L)ist" + ZPressEnterExpert$, _
        WasA1$,ZQuesPath$,".DEF","",ZUserGraphicDefault$,ZTrue,ZFalse,ZTrue,"",WasX) ' KG032502
     IF ZWasQ = 0 THEN _
        RETURN
     IF ZSubParm = -1 THEN _
        RETURN 10595
     QuestHold$ = ZWasZ$
     GOSUB 11520
     CLOSE 2
     CALL UpdtCalr (QuestHold$ + " questionnaire " + _
        MID$("answeredaborted",1 - 8 * ZQuestAborted,8),2)
     IF ReturnToPrompt THEN _
        RETURN
     GOTO 1401
'
' *****    Toggle COMMAND (UTILITIES)     ****
'
1500 IF ZAnsIndex < ZLastIndex THEN _
        GOTO 1510
     ZOutTxt$ = "A)utodwnld   B)ullet  C)ase     F)ile   H)ilite"
     CALL ColorPrompt (ZOutTxt$)
     CALL QuickTPut1 (ZOutTxt$)
     ZOutTxt$ = "L)ine feeds  N)ulls   T)urboKey X)pert  !)bell"
     CALL ColorPrompt (ZOutTxt$)
     CALL QuickTPut1 (ZOutTxt$)
     ZOutTxt$ = "Toggle which options on/off?" + ZPressEnter$
1510 ZStackC = ZTrue                                                 ' KG081301
     GOSUB 12930
     IF ZWasQ=0 THEN _
        RETURN
     ZWasZ$ = ZUserIn$(ZAnsIndex)
     CALL AllCaps (ZWasZ$)
     ZFF = INSTR("ABCFHLNTX!",ZWasZ$)
     IF ZFF < 1 THEN _
        GOTO 1500
     CALL Toggle (ZFF)
     GOSUB 12997
     GOTO 1500
'
' ****  I - COMMAND FROM MAIN MENU (DISPLAY INITIAL WELCOME)  ***
'
1760 ZFileName$ = ZPreLog$
     GOSUB 1790
     ZFileName$ = ZWelcomeFile$
     GOSUB 1790
     RETURN
1790 CALL Graphic (ZUserGraphicDefault$,ZFileName$)
     CALL BufFile (ZFileName$,WasX)
     CALL Carrier
     IF ZSubParm = -1 THEN _
        RETURN 10595
     RETURN
'
' ***  C - COMMAND FROM MAIN MENU (LEAVE COMMENT FOR SYSOP)   **
'
1800 MsgTo$ = "SYSOP"
     OrigSubject$ = "COMMENT"
     Subject$ = OrigSubject$
     GOSUB 1893
     IF (ActiveMessages >= MaxMsgs OR _
        ((NOT ZMsgsCanGrow) AND _
        (ZNextMsgRec + 5 > HighestMsgRecord)) OR _
        NOT ZCmntsAsMsgs ) THEN _
        ZOutTxt$ = "Want a Reply?  Use "+MID$(ZAllOpts$,5,1) + _
                   " instead.  Leave a comment? (Y/[N])" : _
        GOSUB 12999 : _
        IF NOT ZYes THEN _
           CALL SkipLine (1) : _
           RETURN _
        ELSE ZSysopComment = ZTrue : _
             GOTO 2007
     ZSysopComment = ZFalse
     SysopMsg = ZTrue
     ZMsgHeader$ = "comment"
     MsgFrom$ = ZActiveUserName$
     GOTO 2010
1850 WasBX = &H3
     ZWasEN$ = ZCmntsFile$
     GOSUB 12992
     CALL OpenWorkA (ZCmntsFile$)
     ZOutTxt$ = ZFirstName$ + _
          ", Thanks for comments!"
     GOSUB 12976
     CALL AMorPM
     CALL PrintWorkA (ZActiveUserName$+" "+ZCurDate$+" "+ZTime$+" Node "+ZNodeID$)
     FOR WasX = 1 TO ZLinesInMsg
        CALL PrintWorkA (ZOutTxt$(WasX))
     NEXT
     CALL PrintWorkA (ZCarriageReturn$)
     CLOSE 2
     IF ZErrCode <> 0 THEN _
        ZWasEL = 1850 : _
        GOTO 13000
     WasBX = &H3
     ZWasEN$ = ZCmntsFile$
     GOSUB 12993
     CALL UpdtCalr ("Left comment",1)
     REDIM ZOutTxt$(ZMsgDim)
     RETURN
'
' ****  P - COMMAND FROM MAIN MENU (DISPLAY PERSONAL MAIL)  ****
'
1893 ActionFlag = ZTrue
     GOTO 1897
1895 IF TurboLogon THEN _
        RETURN
     ZUserIn$(0) = LEFT$("NEW ",-4*LogonMailNew)
1897 IF ZActiveMessageFile$ = ZPrevBase$ THEN _
        ActionFlag = ZFalse : _
        RETURN
1900 GOSUB 5344
     IF ZPrivateDoor THEN _
        ActionFlag = ZTrue
     ZPrevBase$ = ZActiveMessageFile$
     ShowActive = ZFalse
     IF NOT ActionFlag THEN _
        CALL QuickTPut ("Checking messages in " + ConfFileName$,0) : _
        ShowActive = ZTrue _
     ELSE CALL QuickTPut ("Loading messages",0)
     WasA1$ = ""                                                     ' KG030801
     MsgCt = 0                                                       ' KG030203
     MsgsFromUser = ZFalse
     ActiveMessages = 0
     MailReported = ActionFlag
     FirstOld = ZTrue
     GOSUB 23000
     MsgRec = FirstMsgRecord
     MaxMsgs = VAL(MID$(ZMsgRec$,89,7))
     IF MaxMsgs > WasMM THEN _
        MaxMsgs = WasMM
     REDIM ZMsgPtr(MaxMsgs,2)
     NumDots = 0
1905 GET 1,MsgRec
     CALL CheckInt (MID$(ZMsgRec$,117,4))
     IF ZErrCode <> 0 THEN _
        ZWasEL = 1905 : _
        GOTO 13000
     NumRecsInMsg = VAL(MID$(ZMsgRec$,117,4))
     IF NumRecsInMsg < 1 THEN _
        NumRecsInMsg = 1
1906 IF ActionFlag OR (FirstOld AND NOT MailReported) THEN _
        CALL MarkTime (NumDots)
     CALL Carrier
     IF ZSubParm = -1 THEN _
        RETURN 10595
1910 IF MsgRec >= ZNextMsgRec THEN _
        LowMsgNumber = ZMsgPtr(1,2) : _
        GOTO 1950
1915 IF MID$(ZMsgRec$,116,1) <> ZActiveMessage$ THEN _
        GOTO 1946
     WasX$ = MID$(ZMsgRec$,121,2)
     IF WasX$ <> "  " THEN _
        IF CVI(WasX$) > ZUserSecLevel THEN _
           GOTO 1945
     IF ActionFlag THEN _
        GOTO 1935
'
' ** ALLOW USERS WITH NAMES LONGER THAN 22 CHARS TO RECEIVE PRIVATE MAIL *
'
1920 GOSUB 4660
     IF NOT UserInHeader THEN _
        GOTO 1945
     IF MsgToCaller THEN _
        GOTO 1925
     GOTO 1940
1925 ZWasA = VAL(MID$(ZMsgRec$,2,4))
     IF LogonMailNew THEN _
        IF ZWasA <= ZLastMsgRead THEN _
           GOTO 1935
     IF NOT ShowActive THEN _
        GOTO 1930
     MailReported = ZTrue
     FirstNew = (ZWasA > ZLastMsgRead)
     IF FirstNew THEN _
        MsgCt = 0 : _                                                ' KG030203
        CALL SkipLine (1) : _
        CALL QuickTPut1 ("NEW Mail for YOU (* = Private)") _
     ELSE IF FirstOld THEN _
             CALL SkipLine (1) : _
             CALL QuickTPut1 ("OLD Mail for YOU (* = Private)") : _
             FirstOld = ZFalse
     ShowActive = NOT FirstNew
1930 CALL QuickTPut (LEFT$(ZMsgRec$,5),0)
     MsgCt = MsgCt + 1                                               ' KG030203
     IF MsgCt MOD 15 = 0 THEN _                                      ' KG030203
        CALL SkipLine (1) : _                                        ' KG030203
        CALL AskMore ("",ZTrue,ZTrue,WasX,ZTrue)                     ' KG030203
1935 IF NOT MsgFromCaller THEN _
        GOTO 1945
1940 MsgsFromUser = MsgsFromUser + 1                                 ' KG080501
     WasA1$ = WasA1$ + LEFT$(ZMsgRec$,5)                             ' KG080501
1945 ActiveMessages = ActiveMessages + 1
     ZMsgPtr(ActiveMessages,1) = MsgRec
     ZMsgPtr(ActiveMessages,2) = VAL(MID$(ZMsgRec$,2,4))
1946 MsgRec = MsgRec + NumRecsInMsg
     GOTO 1905
1950 IF NOT MailReported THEN _
        ZOutTxt$ = "Sorry, " + _
             ZFirstName$ + _
             ", No " + ZUserIn$(0) + "mail for you" : _              ' DA071701
        GOSUB 12975
     IF MsgsFromUser = 0 OR NOT ZMsgReminder THEN _
        GOTO 1961
     IF ActionFlag THEN _
        GOTO 1961
     ZOutTxt$ = "Mail you left"
     GOSUB 12976
1960 WasK = 1
     FOR MsgCt = 1 TO MsgsFromUser                                   ' KG030203
        ZOutTxt$ = MID$(WasA1$,WasK,5)                               ' KG030801
        WasK = WasK + 5
        GOSUB 12978
        IF MsgCt MOD 15 = 0 THEN _                                   ' KG030203
           CALL SkipLine (1) : _                                     ' KG030203
           CALL AskMore ("",ZTrue,ZTrue,WasX,ZTrue)                  ' KG030203
     NEXT
     WasA1$ = ""                                                     ' KG030801
     CALL SkipLine (1)
     IF ZUserSecLevel >= ZOptSec(9) THEN _                           ' KG092302
        CALL QuickTPut1 ("Please K)ill old/unneeded msgs")           ' KG092302
1961 ActionFlag = ZFalse
     CALL SkipLine (1)
     RETURN
'
' ****  E - COMMAND FROM MAIN MENU (ENTER MESSAGE)  ***
'
2000 QuotedReply = ZFalse
     MsgFrom$ = ZActiveUserName$
     SysopMsg = ZFalse                                               ' MB051601
     GOSUB 1893                                                      ' DA071101
2001 IF (LowMsgNumber > 0 AND ActiveMessages = MaxMsgs) _
        OR HighMsgNumber >= 9999 THEN _
        IF ZActiveMessageFile$ = ZMainMsgFile$ AND _
           ActiveMessages = 1 THEN _
           GOTO 5300 _
        ELSE ZOutTxt$ = "No more messages allowed!  Try tomorrow" : _
             GOSUB 12975 : _
             GOTO 3650
2006 IF NOT (ZReply OR MsgFwd) THEN _
        MsgPswd$ = ""
     ZSysopComment = ZFalse
     IF ZReply OR MsgFwd THEN SaveAnsIndex = ZAnsIndex
     IF MsgFwd OR NOT ZReply THEN MsgTo$ = ""
2007 IF ZSysopComment THEN _
        ZWasZ$ = ZCmntsFile$ : _
        ZMsgHeader$ = "comment" _
     ELSE ZWasZ$ = ZActiveMessageFile$ : _
          ZMsgHeader$ = "message"
2008 IF ZSysopComment OR ZMsgsCanGrow THEN _
        ZWasY$ = "on disk" : _
        CALL FindFree : _
        GOTO 2009
     IF ZNextMsgRec + 3 < HighestMsgRecord THEN _
        GOTO 2010
     ZWasY$ = "in file"
     ZFreeSpace$ = "1"
2009 IF VAL(ZFreeSpace$) >= 2000 THEN _
        GOTO 2010
     ZOutTxt$ = "No room " + ZWasY$ + " for " + ZMsgHeader$
     GOSUB 12979
     GOTO 3650
2010 IF NOT QuotedReply THEN _
        ZLinesInMsg = 0 : _
        ZCommPortStack$ = "" : _
        WasL = 0 : _
        WasX = 0 : _
        REDIM ZOutTxt$(ZMsgDim)
     IF ZGetExtDesc THEN _
        GOTO 2100
     GOSUB 1893
     RcvrRecNum = 0
2020 CALL MessageTo (HighestUserRecord,MsgTo$,MsgFrom$,RcvrRecNum,Found)
     IF MsgTo$ = "" THEN _
        RETURN
     IF ZSysopComment OR SysopMsg THEN _                             ' ML061904
        GOTO 2100                                                    ' ML061904
     IF ZReply OR MsgFwd THEN _
        Found = ZTrue : _
        CALL Trim (MsgTo$):  _
        GOTO 2035 _
     ELSE Subject$ = ""
     GOSUB 2065
2035 IF QuotedReply THEN _                                           ' ML061904
        RETURN
     GOTO 2100
'
' *****  SET/CHANGE SUBJECT FOR A MESSAGE   ***
'
2065 IF Subject$ <> "" THEN _
        ZOutTxt$ = "Change subject from " + _                        ' DA071701
             Subject$ + _
             " to" _                                                 ' TC090901
     ELSE ZOutTxt$ = "Subject"                                       ' TC090901
     ZMacroMin = 99                                                  ' KG092202
     ZParseOff = ZTrue                                               ' TC090901
     GOSUB 12932                                                     ' TC090901
     IF LEN(ZUserIn$) > 25 THEN _
        ZOutTxt$ = "25 Char. Max" : _
        GOSUB 12979 : _
        GOTO 2065
     IF ZWasQ = 0 THEN _
        IF Subject$ <> "" THEN _
           RETURN _
        ELSE GOSUB 2435 : _
             IF ZYes THEN _
                RETURN 5160 _
             ELSE GOTO 2065
     Subject$ = ZUserIn$
     CALL AllCaps (Subject$)
     OrigSubject$ = Subject$
     RETURN
'
' *****  ENTER MAIN BODY OF MESSAGE  ****
'
2100 ZOutTxt$ = "Type " + _
          ZMsgHeader$ + _
          STR$(ZMaxMsgLines) + _
          " lines max" + _
          ZPressEnter$
     GOSUB 12975
     GOSUB 3200
2125 ZLinesInMsg = ZLinesInMsg + 1
2127 IF ZRemoteEcho OR ZLocalUser THEN _
        ZOutTxt$ = RIGHT$(STR$(ZLinesInMsg),2) + _
             ": " + _
             ZOutTxt$(ZLinesInMsg) _
     ELSE ZOutTxt$ = ZOutTxt$(ZLinesInMsg)
     GOSUB 12978
     CALL LineEdit(ZLinesInMsg,ZRightMargin + 1)
     IF ZWaitExpired THEN _
        GOTO 10590 _
     ELSE IF ZSubParm = -1 THEN _
             GOTO 10595
     CALL FindFKey
     IF ZSubParm < 0 THEN _
        GOTO 202
     IF ZOutTxt$(ZLinesInMsg) = "" THEN _
        ZLinesInMsg = ZLinesInMsg - 1 : _
        GOTO 2300
2140 WasJ = ZLinesInMsg
     GOSUB 2200
     IF WasX THEN _
        GOTO 2300
     GOTO 2125
2200 WasX = 0
     IF WasJ < (ZMaxMsgLines - 2) THEN _
        RETURN
     ZOutTxt$ = MID$("2 lines leftLast line   Full",12 * (WasJ-(ZMaxMsgLines - 2)) + 1,12)
     WasX = (WasJ > (ZMaxMsgLines - 1))
2210 GOSUB 12979
     RETURN
'
' *****  FINAL MESSAGE DISPOSITION   ****
'
2300 IF NOT ZExpertUser THEN _
        CALL QuickTPut1 ("A)bort," + LEFT$("B)tch Import,",-13 * (ZSysop OR ZLocalUser)) + "C)ont,D)el,E)dit,I)nsert,L)ist,M)argin,R)ev subj,S)ave")
2315 ZOutTxt$ = "Edit Sub-function <A," + _
          LEFT$("B,",-2 * (ZSysop OR ZLocalUser)) + _
          "C,D,E,I,L,M,R,S,?>"
     CALL SkipLine (1)
     GOSUB 12930
     IF ZWasQ = 0 THEN _
        GOTO 2315
     CALL AllCaps (ZUserIn$(ZAnsIndex))
     ZWasZ$ = ZUserIn$(ZAnsIndex)
2330 ON INSTR("ABCDEILMRS?",ZWasZ$) GOTO 2400,2335,2332,2500,2600,2800,3000,3100,2440,3400,2345
     GOTO 2300
2332 IF ZLinesInMsg < 1 THEN _
        ZLinesInMsg = 1
     GOTO 2127
2335 WasX = ZLinesInMsg
     CALL MsgImport (ZMaxMsgLines,ZRightMargin,ZLinesInMsg,ZOutTxt$())
     IF ZLinesInMsg > WasX THEN _
        GOTO 3000 _
     ELSE GOTO 2300
'
' *****  DISPLAY MESSAGE SUBCOMMANDS HELP FILE   ****
'
2345 ZFileName$ = ZHelp$(4)
     GOSUB 1790
     GOTO 2315
2350 CALL FindIt (ZMainPUI$)
     ZCustomPUI = ZOK
     IF ZOK THEN _
        ZCurPUI$ = ZMainPUI$ _
     ELSE ZCurPUI$ = ""
     RETURN
'
' ****  ABORT MESSAGE   ***
'
2400 GOSUB 2435
     IF NOT ZYes THEN _
        GOTO 2300
2430 ZOutTxt$ = "Aborted"
     GOSUB 12975
     GOTO 3650
2435 ZOutTxt$ = "Abort " + _
          ZMsgHeader$ + _
          " (Y/[N])"
     GOSUB 12995
     RETURN
'
' *****  CHANGE SUBJECT OF A MESSAGE  ****
'
2440 GOSUB 2065
     GOTO 2300
'
' *****  (BLOCK) DELETE MESSAGE LINE(S)  *****
'
2500 ZOutTxt$ = "Delete from"
     GOSUB 3300
     Mark1 = ZTestedIntValue
2520 ZOutTxt$ = "Up to and including Line # (ENTER =" + STR$(Mark1) + ")"
     GOSUB 3302
     IF ZWasQ = 0 THEN _
        Mark2 = Mark1 _
     ELSE Mark2 = ZTestedIntValue
     CALL SkipLine(1)
     IF Mark1 > Mark2 THEN _
        ZOutTxt$ = "Beginning exceeds end.  Block NOT deleted" : _   ' DA071701
        GOSUB 12979 : _
        GOTO 2555
     IF Mark1 <= MsgLockLines THEN _
        ZOutTxt$ = "You can NOT delete lines 1 -" + STR$(MsgLockLines) + "!" : _
        GOSUB 12979 : _
        GOTO 2555
     GOTO 2530                                                       ' DA071702
2522 FOR WasX = Mark1 TO Mark2
        CALL AskMore ("",ZTrue,ZTrue,WasXX,ZFalse)
        IF ZNo OR ZRet THEN _
           WasX = Mark2 + 1 _
        ELSE ZOutTxt$ = ZOutTxt$(WasX) : _
           GOSUB 12977
     NEXT
     CALL SkipLine(1)
2530 ZOutTxt$ = "Delete lines " + STR$(Mark1) + "-" + _              ' DA071702
        MID$(STR$(Mark2),2) + " (Y,[N],L)ist)"                       ' KG072605
     GOSUB 12930
     Temp$ = ZUserIn$(ZAnsIndex)                                     ' DA071702
     CALL AllCaps(Temp$)                                             ' DA071702
     IF Temp$ = "L" THEN GOTO 2522                                   ' KG072605
     IF NOT ZYes THEN _
        ZOutTxt$ = "NOT Deleted" : _
        GOSUB 12979 : _
        GOTO 2555
2550 ZBlockSize = (Mark2 - Mark1) + 1
     EndOfBuffer = ZLinesInMsg + 1
     ZLinesInMsg = ZLinesInMsg - ZBlockSize
     FOR WasX = Mark1 TO ZLinesInMsg
        ZOutTxt$(WasX) = ZOutTxt$(WasX + ZBlockSize)
     NEXT
     FOR WasX = (ZLinesInMsg + 1) TO (EndOfBuffer)
        ZOutTxt$(WasX) = ""
     NEXT
     ZOutTxt$ = "Deleted" + STR$(ZBlockSize) + " line(s)"
     GOSUB 12979
2555 Mark1 = 0
     Mark2 = 0
     GOTO 2300
'
' ****  EDIT MESSAGE LINE  ***
'
2600 ZOutTxt$ = "Edit"
     GOSUB 3300
     IF ZTestedIntValue <= MsgLockLines THEN _
        ZOutTxt$ = "Not permitted to change 1st" + _                 ' KG071301
                    STR$(MsgLockLines) + " line(s)" : _
        GOSUB 12979 : _
        GOTO 2300
     CALL EditALine (ZTestedIntValue)
     IF ZSubParm < 0 THEN _
        GOTO 202
     GOTO 2300
2800 IF ZLinesInMsg >= ZMaxMsgLines AND NOT ZSysop THEN _
        ZOutTxt$ = "Message full" : _
        GOSUB 12979 : _
        GOTO 2300
2820 ZOutTxt$ = "Insert Before" : _
     GOSUB 3300
2830 WasLL = ZLinesInMsg
     WasK = ZLinesInMsg - ZTestedIntValue
     FOR WasX = ZTestedIntValue TO ZLinesInMsg
        ZUserIn$(WasX + 1 - ZTestedIntValue) = ZOutTxt$(WasX)
        ZOutTxt$(WasX) = ""
     NEXT
     ZLinesInMsg = ZTestedIntValue
2840 ZOutTxt$ = RIGHT$(STR$(ZLinesInMsg),2) + _
          ": " + ZOutTxt$(ZLinesInMsg)
     GOSUB 12978
     CALL LineEdit(ZLinesInMsg,ZRightMargin + 1)
     IF ZOutTxt$(ZLinesInMsg) = "" THEN _
        GOTO 2920
2870 ZLinesInMsg = ZLinesInMsg + 1
     WasJ = ZLinesInMsg + WasK - 1
     GOSUB 2200
     IF NOT WasX THEN _
        GOTO 2840
2920 FOR WasX = 1 TO WasK + 1
        ZOutTxt$(ZLinesInMsg + WasX - 1) = ZUserIn$(WasX)
     NEXT
     REDIM ZUserIn$(ZMsgDim)
     ZLinesInMsg = WasLL + ZLinesInMsg - ZTestedIntValue
     GOTO 2300
'
' *****  LIST MESSAGE CONTENTS   ****
'
3000 GOSUB 3010
     GOTO 2300
3010 ZStopInterrupts = ZFalse
     CALL SkipLine (1)
     IF (ZWasQ = 1 OR MsgFwd) AND NOT ZGetExtDesc THEN _             ' ML061905
        WasL = 1 : _
        ZOutTxt$ = ZFG3$ + "To: " + _
             MsgTo$ + _
             ZFG4$ + " Re: " + _
             Subject$ + ZEmphasizeOff$ : _
        GOSUB 12979 : _
        CALL QuickTPut (MID$("    ",1,-4 * (NOT ZRemoteEcho)),0) : _
        GOSUB 3200
3020 IF ZGetExtDesc THEN WasL = 1                                    ' ML071501
     FOR WasX = WasL TO ZLinesInMsg                                  ' ML071501
        CALL AskMore ("",ZTrue,ZTrue,WasXX,ZFalse)
        IF ZNo OR ZRet THEN _
           WasX = ZLinesInMsg + 1 _
        ELSE ZOutTxt$ = RIGHT$(STR$(WasX),2) + _
                  ": " + _
                  ZOutTxt$(WasX) : _
             GOSUB 12979
     NEXT
     RETURN
'
' *****  CHANGE MARGIN WIDTH   ****
'
3100 CALL SkipLine (1)
     ZOutTxt$ = "SET Right-Margin from" + _
          STR$(ZRightMargin) + _
          " TO (8...72)"
     GOSUB 12932
     IF LEN(ZUserIn$(ZAnsIndex)) > 2 THEN _
        GOTO 3140
3130 WasX = VAL(ZUserIn$(ZAnsIndex))
     IF WasX > 7 AND WasX < 73 THEN _
        ZRightMargin = WasX : _
        ZOutTxt$ = "Margin now" + _
             STR$(ZRightMargin) : _
        GOTO 3150
3140 ZOutTxt$ = "Invalid - Margin UNCHANGED"
3150 GOSUB 12979
     IF UtilMarginChange THEN _
        RETURN
     GOTO 2300
3200 ZOutTxt$ = "[" + _
          STRING$(ZRightMargin - 2,45) + _
          "]"
     IF ZRemoteEcho OR ZLocalUser THEN _
        ZOutTxt$ = "    " + _
             ZOutTxt$
     GOSUB 12975
     RETURN
3300 ZOutTxt$ = ZOutTxt$ + " Line #" + ZPressEnter$
3302 CALL SkipLine (-(ZAnsIndex >= ZLastIndex))
     GOSUB 12932
     IF ZWasQ = 0 THEN _
        IF Mark1 = 0 THEN _
           RETURN 2300 _
        ELSE RETURN
     CALL CheckInt (ZUserIn$(ZAnsIndex))
     IF ZErrCode = 0 THEN _
        IF ZTestedIntValue >= 1 THEN _
           IF ZTestedIntValue <= ZLinesInMsg THEN _
              RETURN
     ZOutTxt$ = "No such line #" + STR$(ZTestedIntValue)
     GOSUB 12979
     RETURN 2300
'
' ****  SAVE MESSAGE   ***
'
3400 IF ZGetExtDesc THEN _
        ZSysopComment = ZFalse : _
        RETURN
     IF ZSysopComment THEN _
        ZSysopComment = ZFalse : _
        GOTO 1850
3405 SaveReplyStatus = ZReply                                        ' ML061904
     ZReply = ZTrue                                                  ' ML061904
     IF SysopMsg THEN _                                              ' ML061904
        MsgPswd$ = "^READ^" _                                        ' ML061904
     ELSE CALL MsgProt (MsgTo$,Found,MsgPswd$)                       ' ML061904
     SysopMsg = ZFalse                                               ' ML061904
     ZReply = SaveReplyStatus                                        ' ML061904
     GOSUB 4910                                                      ' ML061904
     MsgRecSave$ = ZMsgRec$
     MsgCorrected = ZFalse
     GOSUB 23100
     ZOutTxt$ = "Adding new msg #" + _
          STR$(HighMsgNumber + 1)
     IF NOT ZLocalUser THEN _
        CALL UpdtCalr (ZOutTxt$,1)
     GOSUB 12978
     ZWasSL = 0
     ZWasN$ = ""
     ZLastIndex = 0
     HighMsgNumber = HighMsgNumber + 1                               ' DA061001
3410 ActiveMessages = ActiveMessages + 1
     MsgNum$ = STR$(HighMsgNumber) + _
                       SPACE$(5 - LEN(STR$(HighMsgNumber)))
     IF MsgPswd$ = "^READ^" THEN _
        MID$(MsgNum$,1,1) = "*" : _
        SecForMsg = ZPrivateReadSec _
     ELSE SecForMsg = ZPublicReadSec
3460 IF NOT MsgFwd THEN _
        MsgFrom$ = LEFT$(ZActiveUserName$ + SPACE$(31),31) _
     ELSE _
        MsgFrom$ = LEFT$(MsgFrom$ + SPACE$(31),31)
     MsgTo$ = LEFT$(MsgTo$ + SPACE$(31),31)
     MID$(MsgTo$,23,8) = TIME$
     Subject$ = LEFT$(OrigSubject$ + SPACE$(25),25)
     MsgPswd$ = LEFT$(MsgPswd$ + SPACE$(15),15)
     IF QuotedReply AND _
        ZLinesInMsg > ZMaxMsgLines THEN _
           ZLinesInMsg = ZMaxMsgLines
     FOR WasJ = 1 TO ZLinesInMsg
        ZOutTxt$(WasJ) = ZOutTxt$(WasJ) + _
                CHR$(227)
        ZWasSL = ZWasSL + LEN(ZOutTxt$(WasJ))
     NEXT
     IF ZWasSL MOD 128 = 0 THEN _
        ZWasN$ = STR$(ZWasSL \ 128 + 1) _
     ELSE ZWasN$ = STR$(ZWasSL \ 128 + 2)
3530 Temp = ZNextMsgRec
     ZNextMsgRec = Temp + VAL(ZWasN$)
     LSET ZMsgRec$ = MsgRecSave$
     GOSUB 24000
     GET 1,Temp
     ZMsgPtr(ActiveMessages,1) = Temp
     ZMsgPtr(ActiveMessages,2) = HighMsgNumber
     LSET ZMsgRec$ = MsgNum$ + _
                     MsgFrom$ + _
                     MsgTo$ + _
                     ZCurDate$ + _
                     Subject$ + _
                     MsgPswd$ + _
                     ZActiveMessage$ + _
                     ZWasN$ + _
                     SPACE$(4 - LEN(ZWasN$)) + _
                     MKI$(SecForMsg)
     PUT 1,Temp
     ZWasN$ = ""
     NumDots = 0
     FOR WasJ = 1 TO ZLinesInMsg
        CALL MarkTime (NumDots)
        ZWasN$ = ZWasN$ + _
             ZOutTxt$(WasJ)
        IF LEN(ZWasN$) > 127 THEN _
           LSET ZMsgRec$ = ZWasN$ : _
           PUT 1 : _
           ZWasN$ = MID$(ZWasN$,129)
3630 NEXT
     IF LEN(ZWasN$) > 0 THEN _
        LSET ZMsgRec$ = ZWasN$ : _
        PUT 1
     REDIM ZOutTxt$(ZMsgDim)
     IF MsgCorrected THEN _
        MsgCorrected = ZFalse : _
        ActionFlag = ZTrue : _
        CALL SkipLine (1) : _
        GOSUB 1900
3640 CALL SkipLine (1)
     GET 1,1
     GOSUB 12985
' ---[ notify receiver that has new mail waiting ]---
     IF RcvrRecNum > 0 THEN _
        UserFileIndexSave = ZUserFileIndex : _
        UserRecordHold$ = ZUserRecord$ : _
        ZUserFileIndex = RcvrRecNum : _
        GOSUB 12989 : _
        GET 5, RcvrRecNum : _
        WasX = CVI(MID$(ZUserRecord$,57,2)) : _
        MID$(ZUserRecord$,57,2) = MKI$(WasX OR 512) : _
        PUT 5, RcvrRecNum : _
        GOSUB 12991 : _
        ZUserFileIndex = UserFileIndexSave : _
        LSET ZUserRecord$ = UserRecordHold$ : _
        CALL QuickTPut1 ("Receiver will be notified of new mail") : _
        RcvrRecNum = 0
3650 QuotedReply = ZFalse
     MsgLockLines = 0
     IF ZReply OR MsgFwd THEN _
        ZReply = ZFalse : _
        ZAnsIndex = SaveAnsIndex : _
        GOTO 5344
     IF ZGetExtDesc THEN _
        ZLinesInMsg = 0 : _
        RETURN
     RETURN 1200
'
' ****  K - COMMAND FROM MAIN MENU (KILL MESSAGE)  ***
'
3900 ZKillMessage = ZFalse
     CALL SkipLine (1)
3930 ZOutTxt$ = "Msg #(s) to Kill" + ZPressEnterExpert$
     GOSUB 12932
     IF ZWasQ = 0 THEN _
        RETURN
     GOSUB 1893
3935 CALL CheckInt (ZUserIn$(ZAnsIndex))
     IF ZErrCode <> 0 THEN _
        GOTO 3930
     MsgToKill = ZTestedIntValue
3950 GOSUB 5344
     CALL KillMsg (MsgToKill,ActiveMessages)
4040 IF ZKillMessage THEN _
        RETURN
     GOTO 3930
'
' ****  Sysop Available toggle
'
4130  ZSubParm = -8
      CALL FindFKey
      ZSubParm = 0
      RETURN
'
' ****  X)pert Toggle
'
4240 CALL Toggle(9)
     RETURN
'
' ****  T)opic - QUICK SCAN MESSAGES  ***
'
4320 QuickScanMsgs = ZTrue
     ReadMsgs = ZFalse
     ScanMsgs = ZFalse
     MsgStart = 76
     MsgEnd = 100
     SecIndex= 0
     GOTO 4350
'
' ****  R - COMMAND FROM MAIN MENU (READ MESSAGES)  ****
'
4330 QuickScanMsgs = ZFalse
     ReadMsgs = ZTrue
     HiLiteRec = -1
     ScanMsgs = ZFalse
     MsgStart = 6
     MsgEnd = 100
     IF ZLocalUserMode OR NOT ZLocalUser THEN _
        IF ReadMsgIn$ <> ZActiveMessageFile$ THEN _
           ReadMsgIn$ = ZActiveMessageFile$ : _
           CALL UpdtCalr ("Read Messages in " + ReadMsgIn$,1)
     GOSUB 1300
     GOTO 4350                                                       ' KG022701
'
' ****  S - COMMAND FROM MAIN MENU (SCAN MESSAGE HEADERS)  ***
'
4340 IF ZWasQ < 2 THEN _
        GOSUB 1300
4345 QuickScanMsgs = ZFalse
     ReadMsgs = ZFalse
     ScanMsgs = ZTrue
     MsgStart = 6
     MsgEnd = 100
     SecIndex = 0
'
' ** MESSAGE READ MAINLINE (QUICK SCAN, READ & SCAN) ALL USE THIS ROUTINE *
'
4350 SearchHeader$ = ""
     SubInHeader$ = ""
4352 SearchString$ = ""
     DontPrint = ZFalse
     JustReplied = ZFalse
     QuotedReply = ZFalse
     AddressedToUser = ZFalse
     CanKill = (ZSysop OR ZUserSecLevel >= ZSecKillAny)
     GOSUB 1893
     GOSUB 5344
     ZWasZ$ = ""
     FOR WasI = 2 TO ZWasQ
        IF INSTR("Ss*",ZUserIn$(WasI)) > 0 THEN _
           ZUserIn$(WasI) = MID$(STR$(ZLastMsgRead+1),2) + "+"
       'IF LEN(ZUserIn$(WasI)) = 1 THEN _
       '   IF INSTR("Cc",ZUserIn$(WasI)) > 0 THEN _
       '      ZNonStop = ZTrue
        IF INSTR("Ll",ZUserIn$(WasI)) > 0 THEN _
           ZUserIn$(WasI) = MID$(STR$(HighMsgNumber),2) + "-"
     NEXT
4360 ZWasLG$(11) = ZWasZ$
     NumMsgsSelected = ZLastIndex
     MsgIndex = ZAnsIndex                                            ' KG022701
     ZLastIndex = 0
     ToRequested = ZFalse
     FromRequested = ZFalse
     IF ZPageLength < 1 THEN _
        ZNonStop = ZTrue
4370 MsgIndex = MsgIndex  + 1                                        ' KG022701
4371 IF MsgIndex <= NumMsgsSelected THEN _                           ' KG022701
        IF LEN(ZUserIn$(MsgIndex)) = 1 AND _                         ' KG073102
           INSTR("Cc",ZUserIn$(MsgIndex)) > 0 THEN _                 ' KG022701
           GOTO 4370 _
        ELSE _
        CALL CheckInt (ZUserIn$(MsgIndex)) : _                       ' KG022701
        IF ZErrCode <> 0 THEN _
           ZWasEL = 4371 : _
           GOTO 13000 _
        ELSE CurMsg = ZTestedIntValue : _
             ZAnsIndex = MsgIndex : _                                ' KG022701
             GOTO 4415
4380 ZNonStop = (ZPageLength < 1)
     WasA1$ = "Msg #" + _
           STR$(LowMsgNumber) + _
           "-" + _
           MID$(STR$(ZMsgPtr(ActiveMessages,2)),2) + _
           " (H)elp,S)ince,L)ast"
     IF AddressedToUser OR ToRequested OR FromRequested THEN _
        ZWasY$ = LEFT$("TO",-2*(ToRequested OR AddressedToUser)) + _
             LEFT$("/",-AddressedToUser) + _
             LEFT$("FROM",-4*(FromRequested OR AddressedToUser)) : _
        CALL QuickTPut1 ("Only msgs "+ZWasY$+" you.  Read from what msg # (e.g. 1+,4010-)") _
     ELSE WasA1$ = WasA1$ + _
               ", T)o,F)rom,M)ine"
     IF SearchString$ = "" THEN _
        WasA1$ = WasA1$ + _
             ", text" _
     ELSE CALL QuickTPut1 ("Only msgs with text " + SearchString$ + ".  Read from what msg # (e.g. 1+,4010-)")
4390 ZOutTxt$ = WasA1$ + ", [Q]uit)"
     ZMacroMin = 99
     ZTurboKey = 0
4400 GOSUB 12932                                                     ' KG022701
     IF ZWasQ = 0 THEN _
        RETURN
4402 IF LEN(ZUserIn$(ZAnsIndex)) = 1 THEN _                          ' KG022701
        WasY = INSTR("QqHh?",ZUserIn$(ZAnsIndex)) : _                ' KG101202
        IF WasY > 2 THEN _                                           ' KG081302
            ZFileName$ = ZHelpPath$ + "MR" + ZHelpExtension$ : _
            GOSUB 1790 : _
            GOTO 4390 _                                              ' KG101202
        ELSE IF WasY > 0 THEN _                                      ' KG101202
                RETURN                                               ' KG101202
     MsgIndex = 0                                                    ' KG022701
     NumMsgsSelected = ZWasQ
     GOTO 4370
4415 Forward = ZFalse
     Reverse = ZFalse
     IF LEN(ZUserIn$(ZAnsIndex)) = 1 THEN _
        IF INSTR("Ss*",ZUserIn$(ZAnsIndex)) > 0 THEN _
           CurMsg = ZLastMsgRead + 1 : _
           Forward = ZTrue : _
           GOTO 4430 _
        ELSE IF INSTR("Ll",ZUserIn$(ZAnsIndex)) > 0 THEN _
                CurMsg = HighMsgNumber : _
                Reverse = ZTrue : _
                GOTO 4490
4416 IF INSTR("Mm",ZUserIn$(ZAnsIndex)) THEN _
        AddressedToUser = ZTrue : _
        GOTO 4370
     ZWasA = INSTR("FfTt",ZUserIn$(ZAnsIndex))
     IF ZWasA > 0 THEN _
        ToRequested = (ZWasA > 2) : _
        FromRequested = (ZWasA < 3) : _
        GOTO 4370
     IF CurMsg = 0 THEN _
        IF SearchHeader$ <> "" THEN _
           GOTO 4370 _
        ELSE SearchString$ = ZUserIn$(ZAnsIndex) : _                 ' KG022701
             CALL AllCaps (SearchString$) : _
             CALL Remove (SearchString$,CHR$(34) + CHR$(39)) : _
             SearchHeader$ = SearchString$ : _
             SubInHeader$ = SearchHeader$ : _
             GOTO 4370
     CALL SkipLine (1)
4430 IF RIGHT$(ZUserIn$(ZAnsIndex),1) = "+" THEN _
        Forward = ZTrue
     IF RIGHT$(ZUserIn$(ZAnsIndex),1) = "-" THEN _
        Reverse = ZTrue : _
        GOTO 4490
4450 ZMsgDimIndex = 1
4452 IF ZMsgDimIndex > ActiveMessages THEN _
        GOTO 4515
     IF ReadMsgs AND _
        ZMsgPtr(ZMsgDimIndex,2) = CurMsg THEN _
        GOTO 4520
4470 IF ((ReadMsgs AND Forward) OR _
        QuickScanMsgs OR ScanMsgs) AND _
        ZMsgPtr(ZMsgDimIndex,2) >= CurMsg THEN _
        GOTO 4520
4480 ZMsgDimIndex = ZMsgDimIndex + 1
     GOTO 4452
4490 ZMsgDimIndex = ActiveMessages
4492 IF ZMsgDimIndex < 1 THEN _
        GOTO 4515
     IF ZMsgPtr(ZMsgDimIndex,2) <= CurMsg THEN _
        GOTO 4540
4510 ZMsgDimIndex = ZMsgDimIndex - 1
     GOTO 4492
4515 IF Forward THEN _
        ZOutTxt$ = "No new messages" : _
        ZLastMsgRead = HighMsgNUmber : _
        ZMailWaiting = ZFalse _
     ELSE ZOutTxt$ = "No such msg #" + _
               STR$(CurMsg)
     IF SubInHeader$ = "" THEN _                                     ' KG102001
        GOSUB 12979                                                  ' KG102001
     GOTO 4370
4520 EndingMsgIndex = ZMsgDimIndex
     IF ReadMsgs AND NOT Forward THEN _
        GOTO 4560
4530 StartMsgIndex = ZMsgDimIndex
     EndingMsgIndex = ActiveMessages
     WasSO = 1
     GOTO 4550
4540 StartMsgIndex = ZMsgDimIndex
     EndingMsgIndex = 1
     WasSO = -1
4550 WasXXX = EndingMsgIndex + WasSO
     ZMsgDimIndex = StartMsgIndex
4552 IF ZMsgDimIndex = WasXXX THEN _
        CALL Carrier : _
        GOTO 4637
4560   CurHeader = ZMsgPtr(ZMsgDimIndex,1)
       IF CurHeader < 1 THEN _
          GOTO 4515
       GET 1,CurHeader
       ZPswdFailed = ZFalse
       UserInHeader = ZFalse
       ZWasZ$ = MID$(ZMsgRec$,101,15)
       MsgPswd$ = ZWasZ$
       CALL Trim(MsgPswd$)
4561   GOSUB 4660
       GOSUB 4655
4562   IF NOT CanKill THEN _
          IF INSTR(ZMsgRec$,"^READ^") > 0 AND NOT UserInHeader THEN _
             ZPswdFailed = ZTrue : _
             IF Forward OR Reverse THEN _
                GOTO 4635
4563   CurMsg = VAL(MID$(ZMsgRec$,2,4))
       IF ToRequested THEN _
          IF NOT MsgToCaller THEN _
             GOTO 4629
       IF FromRequested THEN _
          IF NOT MsgFromCaller THEN _
             GOTO 4629
       IF AddressedToUser AND NOT UserInHeader THEN _
          GOTO 4629
       WasX$ = MID$(ZMsgRec$,121,2)
       IF WasX$ = "  " THEN _
          MsgSec = ZMinLogonSec _
       ELSE MsgSec = CVI(WasX$)
       IF ZUserSecLevel < MsgSec THEN _
          GOTO 4629
4580   IF INSTR(ZMsgRec$,ZWasLG$(11)) = 0 THEN _
          GOTO 4635
4581   IF MID$(ZMsgRec$,116,1) = ZDeletedMsg$ THEN _
          GOTO 4630
       JustSearching = ZFalse
       IF SearchHeader$ <> "" THEN _
          ZFF = INSTR(ZMsgRec$,SearchHeader$) : _
          IF ZFF >= MsgStart AND ZFF <= MsgEnd THEN _
             HiLitePos = ZFF : _
             GOTO 4582 _
          ELSE IF ReadMsgs AND SearchString$ <> "" THEN _
                  JustSearching = ZTrue : _
                  GOTO 4582 _
               ELSE GOTO 4629
4582   WasPG = ZFalse
       IF MID$(ZWasZ$,1,1) = "!" THEN _
          IF NOT CanKill THEN _
             WasPG = ZTrue : _
             ZPswdSave$ = MID$(ZWasZ$,2) + _
                              " " : _
             ZAttemptsAllowed = 0 : _
             ZSubParm = 1 : _
             CALL PassWrd
4584   IF ZPswdFailed AND _
          (QuickScanMsgs OR (ScanMsgs AND NOT WasPG)) THEN _
          GOTO 4635
4585   IF ZPswdFailed THEN _
          IF WasPG THEN _
             WasSJ$ = "<PASSWORD>" _
          ELSE WasSJ$ = "<PROTECTED>" _
       ELSE WasSJ$ = MID$(ZMsgRec$,76,25)
4590   IF QuickScanMsgs THEN _
          ZOutTxt$ = LEFT$(ZMsgRec$,5) + _
               " " + _
               LEFT$(WasSJ$,19) + _
               " " : _
          CALL CheckColor (ZOutTxt$,SubInHeader$,ZEmphasizeOff$) : _
          GOSUB 12978 : _
          SecIndex = SecIndex + 1 : _
          IF SecIndex = 3 THEN _
             SecIndex = 0 : _
             CALL SkipLine (1) : _
             GOTO 4630  _
          ELSE GOTO 4630
4600   IF ScanMsgs THEN _
          GOSUB 8020 : _
          GOTO 4630
       IF NOT JustSearching THEN _
          GOSUB 8000 : _
          IF QuotedReply THEN _
             QuotedReply = ZFalse : _
             GOTO 4602                                               ' KG091301
       IF ZRet THEN _
          GOTO 4630
       CanChangeSec = (ZUserSecLevel => ZSecChangeMsg)
       ShowKill =  - ((ZUserSecLevel >= ZOptSec(9)) AND (UserInHeader OR CanKill)) ' KG081601
       IF ZExpertUser THEN _
          WasA1$ = ",H,R,T,=,+,-" + _                                ' KG081303
                MID$(",F",1,- (UserInHeader OR CanChangeSec) * 2) + _
                MID$(",K",1,ShowKill * 2) + _                        ' KG081601
                MID$(",U",1,- (ZUserSecLevel >= ZOptSec(54)) * 2) + _
                MID$(",S",1, - CanChangeSec * 2) : _                 ' KG081303
          GOTO 4601                                                  ' KG091301
       GOSUB 4617                                                    ' KG091301
4601   ZTurboKey = -ZTurboKeyUser                                    ' KG091301
       IF JustSearching OR NOT JustReplied THEN _
          GOTO 4602                                                  ' KG091301
       JustReplied = ZFalse
       CALL AskMore (WasA1$,ZTrue,ZFalse,ZAnsIndex,ZFalse)
       CALL SkipLine (1)
       IF ZNo THEN _
          RETURN
       CALL AllCaps (ZUserIn$(1))                                    ' KG081303
       ZReply = (ZReply OR ZUserIn$(1) = "R")                        ' KG081303
       IF ZUserIn$(1) <> "=" THEN _                                  ' KG081303
          GOTO 4605                                                  ' KG081303
       CALL SkipLine (1)
4602   IF NOT ZPswdFailed THEN _                                     ' KG091301
          GOTO 4603                                                  ' KG091301
       IF WasPG AND (NOT ZNonStop) THEN _
          ZAttemptsAllowed = 2 : _
          ZSubParm = 2 : _
          CALL PassWrd
       IF ZPswdFailed THEN _                                         ' KG081303
          GOTO 4629
4603   GOSUB 9000                                                    ' KG091301
       JustReplied = ZFalse
       DontPrint = ZFalse
       IF JustSearching THEN _
          GOTO 4629
       IF ZAnsIndex > NumMsgsSelected THEN _
          GOTO 4650
       CALL SkipLine (1)
       GOSUB 41000                                                   ' KG081303
       ZKillMessage = ZFalse
       ZReply = ZFalse
       IF ZNonStop THEN _
          GOTO 4629
4604   ZTurboKey = -ZTurboKeyUser                                    ' KG091301
       CALL AskMore (WasA1$,ZTrue,ZFalse,WasXX,ZFalse)
       IF ZNo THEN _
          ZAnsIndex = ZLastIndex + 1 : _
          RETURN
       CALL AllCaps(ZUserIn$(1))
       ZReply = (ZReply OR ZUserIn$(1) ="R")
4605   ON INSTR(" FUST+-KRH?=",LEFT$(ZUserIn$(1),1)) GOTO _          ' KG081303
          4620,4606,4607,4608,4609,4610,4610,4611,4621,4612,4614,4615 ' KG091301
       GOTO 4620                                                     ' KG081303
4606   IF NOT (UserInHeader OR CanChangeSec) THEN _   ' Forward      ' KG081303
          GOTO 4620                                                  ' KG081303
       MsgFwd = ZTrue
       GOTO 4623
4607   IF ZUserSecLevel < ZOptSec(54) THEN _    ' User edit          ' KG081303
          GOTO 4620                                                  ' KG081303
       EditFromRead = 1
       ZReply=ZTrue
       CALL PutMsgAttr
       TempHashValue$ = MsgFrom$
       CALL Trim (TempHashValue$)
       IF TempHashValue$ = "SYSOP" THEN _
          TempHashValue$ = ZSysopPswd1$ + " " + ZSysopPswd2$
       GOTO 11000
4608   IF CanChangeSec THEN _            ' Security to read          ' KG081303
          CALL PutMsgAttr : _
          GOSUB 4665 : _
          ZReply = ZFalse : _
          QuotedReply = ZTrue : _
          CALL GetMsgAttr : _
          DontPrint = ZTrue : _
          ZUserIn$ = "=" : _
          JustReplied = ZTrue : _
          GOTO 4560
       GOTO 4620                                                     ' KG081303
4609   CALL SetThread (CurMsg, OrigSubject$)     ' Thread            ' KG081303
       IF ZWasQ > 0 THEN _
          SearchHeader$ = ZUserIn$(2) : _
          SubInHeader$ = SearchHeader$ : _
          CALL Trim (SubInHeader$) : _
          GOTO 4352
       GOTO 4620                                                      ' KG081303
4610   ZWasA = INSTR(" +-",ZUserIn$(1))      ' +/- read direction     ' KG081303
       CurMsg = CurMsg + 5 - 2 * ZWasA                                ' KG081303
       Forward = (ZWasA = 2)
       Reverse = (NOT Forward)
       SearchString$ = ""
       IF Reverse THEN _
          GOTO 4490 _
       ELSE GOTO 4450
4611   IF (UserInHeader OR CanKill) THEN _     ' Kill                ' KG081303
         IF ZUserSecLevel >= ZOptSec(9) THEN _
            CALL PutMsgAttr : _
            MsgToKill = CurMsg : _
            Temp = ZWasQ : _
            GOSUB 3950 : _
            CALL GetMsgAttr : _
            GOTO 4629 _
         ELSE ZViolation$ = "MORE KILL" : _
              GOSUB 1380 : _
              GOTO 4629
       GOTO 4620                                                     ' KG081303
4612   ZFileName$ = ZHelp$(7)  ' H - help                            ' KG081303
       GOSUB 1790                                                    ' KG091301
4614   GOSUB 4617                                                    ' KG091301
       GOTO 4604                                                     ' KG091301
4615   CALL SkipLine (1) ' = read again                              ' KG091301
       GOTO 4560                                                     ' KG081303
4617   WasA1$ = ",H)lp,R)eply,T)hread,=,+,-" + _                     ' KG091301
                MID$(",F)wd",1, - (UserInHeader OR CanChangeSec) * 5) + _ ' KG091301
                MID$(",K)ill",1, ShowKill * 6) + _                   ' KG091301
                MID$(",U)sr",1,- (ZUserSecLevel >= ZOptSec(54)) * 6) + _ ' KG091301
                MID$(",S)ec",1, - CanChangeSec * 5)                  ' KG091301
       RETURN                                                        ' KG091301
4620   IF NOT ZReply THEN _
          GOTO 4629
4621   IF ZUserSecLevel < ZOptSec(5) THEN _     ' Reply
          ZViolation$ = "MORE RE" : _
          GOSUB 1380 : _
          ZReply = ZFalse : _
          GOTO 4629
       IF LEFT$(OrigSubject$,3) <> "(R)" THEN _                      ' ML062202
          OrigSubject$ = "(R)" + _
                     LEFT$(OrigSubject$,22)
4622   MsgTo$ = MsgFrom$
       CALL Trim (MsgTo$)
       MsgFrom$ = ZActiveUserName$
4623   DontPrint = ZFalse
       CALL PutMsgAttr
       IF MsgFwd THEN GOTO 4624
       ZOutTxt$ = "Quote " + MsgTo$ + "'s message (Y/[N])"
       GOSUB 12999
       IF ZRet OR NOT ZYes THEN _
          GOTO 4627
4624   QuotedReply = ZTrue
       ZLinesInMsg = ZLinesInMsg - 1
       IF HiLitedLine > 0 THEN _
          ZOutTxt$(HiLitedLine) = ZOutTxt$(0) : _
          HiLitedLine = 0
       IF MsgFwd THEN _
          TempRightMargin = ZRightMargin _
       ELSE _
          TempRightMargin = ZRightMargin - 2
       CALL WordWrap (TempRightMargin,ZLinesInMsg,ZOutTxt$())
       IF ZLinesInMsg > ZMsgDim THEN _
          ZLinesInMsg = ZMsgDim : _
          CALL QuickTPut1 ("Original msg truncated to " + _
                      STR$(ZMsgDim) + " lines for editing!")
       IF MsgFwd THEN GOTO 4625
       FOR WasX = 1 TO ZLinesInMsg
          IF LEFT$(ZOutTxt$(WasX),1) = ">" THEN _
             ZOutTxt$(WasX) = ">" + ZOutTxt$(WasX) _
          ELSE ZOutTxt$(WasX) = "> " + ZOutTxt$(WasX)
       NEXT
4625   WasX$ = MsgTo$
       GOSUB 2001
       IF (ActiveMessages >= MaxMsgs) OR MsgTo$ = "" THEN _
          GOTO 4628
       IF MsgFwd THEN _
          MsgFwd$ = ZActiveUserName$ : _
          CALL Trim (MsgFwd$) : _
          CALL Trim (WasX$) : _
          MsgFwd$ = "Msg was to " + WasX$ + _
             ", forwarded by " + MsgFwd$
       IF (MsgFwd AND CanChangeSec AND NOT MsgFromCaller) THEN _
          CALL Trim (MsgFrom$) : _
          ZOutTxt$ = "Message was from " + _
             MsgFrom$ + _
             ", change to " + _
             ZActiveUserName$ + _
             " (Y/[N])" : _
          GOSUB 12999 : _
          IF ZYes THEN _
             MsgFrom$ = ZActiveUserName$ : _
             CALL Trim (MsgFrom$) : _
             GOTO 4626
       IF MsgFwd AND NOT MsgFromCaller THEN _
          FOR MsgFwdCount = ZLinesInMsg TO 1 STEP -1 : _
             ZOutTxt$(MsgFwdCount + 2) = ZOutTxt$(MsgFwdCount) : _
          NEXT MsgFwdCount : _
          ZOutTxt$(1) = MsgFwd$ : _
          ZOutTxt$(2) = "" : _
          ZLinesInMsg = ZLinesInMsg + 2 : _
          IF NOT CanChangeSec THEN _
             MsgLockLines = 1
4626   ZWasZ$ = "L"
       WasL = 1
       IF ZLinesInMsg >= ZMaxMsgLines THEN _
          CALL QuickTPut ("Msg cannot exceed" + _
                      STR$(ZMaxMsgLines) + " lines! ",0)
       IF NOT MsgFwd THEN _
          CALL QuickTPut1 ("C continues reply.  Please 1st delete unneeded lines (eg. d 1 5)")
       GOSUB 3200
       GOSUB 3020
       GOSUB 2300
       GOTO 4628
4627   GOSUB 2000
4628   ZReply = ZFalse
       JustReplied = ZTrue
       QuotedReply = ZTrue
       CALL GetMsgAttr
       DontPrint = ZTrue
       ZUserIn$ = "="
       QuotedReply = ZTrue
       MsgFwd = ZFalse
       GOTO 4560
4629   QuotedReply = ZFalse
       JustReplied = ZFalse
       IF NOT Forward AND NOT Reverse THEN _
          GOTO 4370
4630   CALL AskMore (",#(s) to read",ZTrue,ZTrue,WasXX,ZFalse)
       IF ZWasQ = 0 OR ZYes THEN _
          GOTO 4631
       IF ZNo THEN _
          RETURN
       IF ZSubParm = -1 THEN _
          RETURN 10595
       IF ZRet THEN _
          RETURN
       ZWasZ$ = ZUserIn$(1)
       CALL AllCaps (ZWasZ$)
       IF VAL(ZWasZ$) > 0 THEN _
          FOR WasI = ZWasQ TO 1 STEP -1 : _
             ZUserIn$(WasI + 1) = ZUserIn$(WasI) : _
          NEXT : _
          ZUserIn$(1) = MID$(ZAllOpts$,INSTR(ZOrigCommands$,"R"),1) : _
          ZLastIndex = ZWasQ + 1 : _
          ZAnsIndex = 1 : _
          RETURN 1235
4631   CALL CheckCarrier
       IF ZSubParm THEN _
          RETURN 10595
       IF ZRet THEN _
          RETURN
4635 IF WasSO = 0 THEN _
        WasSO = 1
     ZMsgDimIndex = ZMsgDimIndex + WasSO
     GOTO 4552
4637 IF ReadMsgs THEN _
        SearchString$ = "" : _
        SearchHeader$ = "" : _
        SubInHeader$ = "" : _
        ToRequested = ZFalse : _
        FromRequested = ZFalse : _
        AddressedToUser = ZFalse : _
        GOTO 4370
4650 CALL AskMore ("",ZTrue,ZTrue,WasX,ZTrue)                        ' KG081404
     CALL SkipLine (1)                                               ' KG082102
     CALL QuickTPut1 ("--End Msgs--")                                ' KG081404
     RETURN
4655 '****     update last message read     ****
     IF SearchHeader$ <> "" OR SearchString$ <> "" OR NOT ReadMsgs THEN _
        RETURN
4656 IF ZMsgPtr(ZMsgDimIndex,2) > ZLastMsgRead THEN _
        ZMailWaiting = ZFalse : _
        ZLastMsgRead = ZMsgPtr(ZMsgDimIndex,2)
     RETURN
4660 CALL ChkMsgName (MsgFromCaller,MsgToCaller)                     ' KG090402
     UserInHeader = (MsgFromCaller OR MsgToCaller)
     RETURN
'
' ****  S - CHANGE MESSAGE SECURITY   ***
'
4665 CALL Trim (MsgFrom$)
     ZOutTxt$ = "Change sender's name from " + _
        MsgFrom$ + _
        " to"
     GOSUB 12995
     IF ZWasQ = 0 THEN _
        GOTO 4666
     IF LEN(ZUserIn$) > 30 THEN _
        CALL QuickTPut1 ("30 Char. Max") : _
        GOTO 4665
     CALL AllCaps (ZUserIn$)
     MsgFrom$ = ZUserIn$
4666 CALL Trim (MsgTo$)
     ZOutTxt$ = "Change receiver's name from " + _
        MsgTo$ + _
        " to"
     GOSUB 12995
     IF ZWasQ = 0 THEN _
        GOTO 4667
     IF LEN(ZUserIn$) > 30 THEN _
        CALL QuickTPut1 ("30 Char. Max") : _
        GOTO 4666
     CALL AllCaps (ZUserIn$)
     MsgTo$ = ZUserIn$
     TempMsgTo$ = ZUserIn$
     CALL MessageTo (HighestUserRecord,MsgTo$,MsgFrom$,RcvrRecNum,Found)
     IF MsgTo$ = "" THEN MsgTo$ = TempMsgTo$
4667 CALL Trim (Subject$)
     ZOutTxt$ = "Change subject from " + _
        Subject$ + _
        " to"
     GOSUB 12995
     IF ZWasQ = 0 THEN _
        GOTO 4668
     IF LEN(ZUserIn$) > 25 THEN _
        CALL QuickTPut1 ("25 Char. Max") : _
        GOTO 4667
     CALL AllCaps (ZUserIn$)
     Subject$ = ZUserIn$
4668 ZOutTxt$ = "Change min sec to read from" + _
        STR$(MsgSec) + _
        " to"
     GOSUB 12995
     IF ZWasQ=0 THEN _
        GOTO 4669
     CALL CheckInt (ZUserIn$)
     IF ZErrCode <> 0 THEN _
        RETURN
     MsgSec = ZTestedIntValue
4669 ZReply = ZTrue
     CALL MsgProt (MsgTo$,Found,MsgPswd$)
     ZReply = ZFalse
4670 MsgTo$ = LEFT$(MsgTo$ + SPACE$(22),22)
     MsgFrom$ = LEFT$(MsgFrom$ + SPACE$(31),31)
     Subject$ = LEFT$(Subject$ + SPACE$(25),25)
     MsgPswd$ = LEFT$(MsgPswd$ + SPACE$(15),15)
     ZSubParm = 3
     CALL FileLock
     GET 1,CurHeader
     MID$(ZMsgRec$,37,22) = MsgTo$
     MID$(ZMsgRec$,6,31) = MsgFrom$
     MID$(ZMsgRec$,76,25) = Subject$
     MID$(ZMsgRec$,121,2) = MKI$(MsgSec)
     MID$(ZMsgRec$,101,15) = MsgPswd$
     IF LEFT$(MsgPswd$,6) = "^READ^" THEN _
        MID$(ZMsgRec$,1,1) = "*" _
     ELSE _
        MID$(ZMsgRec$,1,1) = " "
     PUT 1,CurHeader
     ZSubParm = 4
     CALL FileLock
     CALL QuickTPut1 ("Message header changed")
     CALL SkipLine (1)
     CALL FlushKeys
     RETURN
'
' ****  O - COMMAND FROM MAIN MENU (OPERATOR PAGE)   ***
'
4700 IF NOT ZSysopAvail THEN _
        ZOutTxt$ = "Sorry, " + _
             ZSysopFirstName$ + _
             " not available to answer page" : _
        GOSUB 12979 : _
        GOTO 4755
4705 CALL QuickTPut1 ("Chat. Remote Conversation")
     WasJJ = VAL(MID$(TIME$,1,2))*100 + VAL(MID$(TIME$,4,2))
     IF (WasJJ > ZStartOfficeHours AND WasJJ < ZEndOfficeHours) OR ZSysopAnnoy THEN _
        GOTO 4710
4708 ZOutTxt$ = "SYSOP in from" + _
          STR$(ZStartOfficeHours) + _
          " to" + _
          STR$(ZEndOfficeHours) + ","
     GOSUB 12979
     GOTO 4755
4710 ZOutTxt$ = "Page " + _
          ZSysopFirstName$ + _
          " (Y/[N])"
     CALL SkipLine (1)
     GOSUB 12999
     IF NOT ZYes THEN _
        RETURN
     PageCount = 0
     ZOutTxt$ = "Paging " + _
          ZSysopFirstName$                                           ' KG071301
     GOSUB 12978
     PageTimeStart! = TIMER
     TempSnoop = ZSnoop                                              ' DA101801
     ZSnoop = ZTrue                                                  ' DA101801
     CALL Line25                                                     ' DA102401
4730 CALL DelayTime (1)
4735 PageCount = PageCount + 1
     IF INKEY$ = ZEscape$ THEN _
        GOTO 4765
4740 IF PageCount MOD 2 THEN _
        ZOutTxt$ = ZPagingPtrSupport$ + _
             ZBellRinger$ : _
        IF LEN(ZPagingPtrSupport$) = 3 THEN _
           CALL Printit (CHR$(7)) : _
           IF ZErrCode <> 0 THEN _
              ZWasEL = 4740 : _
              GOTO 13000
4745 GOSUB 12978
     CALL CheckTime (PageTimeStart!, PageTimeNow!, 2)
     IF PageTimeNow! < 30 THEN GOTO 4730
     ZSnoop = TempSnoop                                              ' DA101801
4747 GOSUB 12979
4750 CALL QuickTPut1 (ZSysopFirstName$ + " not responding")
4755 CALL QuickTPut1 ("Try a msg or comment")
     ZPageStatus$ = "PG!"                                            ' DA080902
     CALL UpdtCalr ("Operator paged " + LEFT$(TIME$,5),2)
     RETURN
4765 CALL UpdtCalr ("Paged & chatted with Sysop",1)
     CALL QuickTPut1 ("SYSOP in!  " + _
          ZFirstName$ + _
          ", this is " + _
          ZSysopFirstName$ + _
          " go ahead!")
     ZPageStatus$ = ""
4770 CALL SysopChat
     IF ZSubParm < 0 THEN _
        GOTO 202
     RETURN
'
' ****  S - COMMAND FROM UTILITY MENU (STATISTICS)  ***
'
4850 GOSUB 1893
     CALL QuickTPut1 ("RBBS-PC " + ZVersionID$ + " Node " + ZNodeID$)
     ZOutTxt$ = ""
     IF NOT ZConfMode THEN _
        ZOutTxt$ = "Caller # " + _
             STR$(CallsToDate!) + _
             "  "
4855 ZOutTxt$ = ZOutTxt$ + _
          "# active msgs:" + _
          STR$(ActiveMessages)
     ZOutTxt$ = ZOutTxt$ + _
          "  Next msg #" + _
          STR$(HighMsgNumber + 1)
     IF ZLastMsgRead > 0 THEN _
        ZOutTxt$ = ZOutTxt$ + _
             "  Last msg read:" + _
             STR$(ZLastMsgRead)
4857 GOSUB 12976
     IF (NOT ZSysop) AND (ZUserSecLevel < ZSecKillAny) THEN _
        RETURN
     UserWork = (HighestUserRecord * .95) + 1
     IF ZMsgsCanGrow THEN _
        ZWasY$ = " open" _
     ELSE ZWasY$ = STR$(HighestMsgRecord + 1 - NodesInSystem - ZNextMsgRec)
     ZOutTxt$ = "USERS: used" + _
          STR$(CurUserCount - 1) + _
          " avl" + _
          STR$(UserWork - CurUserCount) + _
          "  MSGS: used" + _
          STR$(ActiveMessages) + _
          " avl" + _
          STR$(MaxMsgs - ActiveMessages) + _
          "  MSG REC: used" + _
          STR$(ZNextMsgRec - 1) + _
          " avl" + ZWasY$
     GOSUB 12976
     ZWasZ$ = ZUpldDriveFile$
     CALL FindFree
     CALL QuickTPut1 ("Upload disk has" + ZFreeSpace$)
     RETURN
4900 CALL UpdtCalr ("Entered " + ZConfName$,2)                       ' KG052702
     CALL QuickTPut1 ("Welcome to " + ZConfName$)
4905 GOSUB 1790
4910 GOSUB 12986
     GOSUB 5344
     IF LOF(1) = 0 THEN _
        ZWasDF$ = ZActiveMessageFile$ : _
        CLOSE 1 : _
        KILL ZActiveMessageFile$ : _
        GOSUB 12987 : _
        RETURN 13600
     GOSUB 23000
     RETURN
'
' ****  P - COMMAND FROM UTILITY MENU (PASSWORD CHANGE)  ***
'
5110 CALL NewPassword ("Enter new password" + ZPressEnter$,ZTrue)
     IF ZSubParm < 0 THEN _
        GOTO 202
     IF ZWasQ = 0 THEN _
        RETURN
5120 ZOutTxt$ = "Reenter new password"
     GOSUB 45010
     IF ZWasQ = 0 THEN _
        RETURN
     CALL AllCaps (ZUserIn$)
     IF ZWasZ$ <> ZUserIn$ THEN _
        ZOutTxt$ = "Passwords don't match!" : _
        GOSUB 12979 : _
        RETURN
5125 IF ZMaxPswdChanges AND _
        ChangeThisSession > _
        ZMaxPswdChanges AND _
        NOT ZSysop THEN _
            ZOutTxt$ = "No changes permitted" : _
            GOSUB 12975 : _
            RETURN _
     ELSE PswdChangeAllowed = ZTrue : _
          GOSUB 5140 : _
          IF NOT Found THEN _
             GOTO 5129 _
          ELSE ZOutTxt$ = "Temporary change" : _
               GOSUB 12975 : _
               ZPswd$ = ZTempPassword$ : _
               ZSecsPerSession! = ZTempTimeAllowed * 60 : _
               ZUserSecLevel = ZTempSecLevel : _
               GOSUB 41070 : _
               ZSysop = (ZUserSecLevel >= ZSysopSecLevel) : _
               CALL SetPrompt : _
               CALL XferType (2,ZTrue)
     IF ZActiveUserName$ = "SYSOP" THEN _
        ZUserIn$(1) = "********"
5126 CALL UpdtCalr ("Used temp password " + ZUserIn$,2)
     RETURN
5129 IF ZOrigUserFile$ <> ZActiveUserFile$ THEN _
        CALL QuickTPut1 ("Password Change only in Logon User File") : _
        RETURN
     GOSUB 12989
     CALL OpenUser (HighestUserRecord)
     GOSUB 9450
5130 IF ZUserFileIndex < 1 OR _
        ZUserFileIndex > 32767 THEN _
        GOTO 5160
     GET 5,ZUserFileIndex
     CALL AllCaps (ZUserIn$)
     LSET ZPswd$ = ZUserIn$
     GOSUB 9440
     GOSUB 12991
     ZOutTxt$ = "Password changed"
     ZStopInterrupts = ZTrue
     GOSUB 12975
     IF ZMaxPswdChanges THEN _
        ChangeThisSession = ChangeThisSession + 1
5131 CALL UpdtCalr ("New Password " + ZUserIn$(1),2)
     RETURN
'
' ****  SEARCH "PASSWORDS" FILE FOR TEMPORARY PASSWORDS  ***
'
5135 ZWasZ$ = ""
     WasZ = 0
     GOSUB 5140
     IF NOT Found THEN _
        ZTempTimeAllowed = MinsPerSessionDef : _
        ZTempMaxPerDay = MaxPerDayDef _
     ELSE ZTimeLockSet = ZTempTimeLock : _
          ZDaysInRegPeriod = ZTempRegPeriod
     ZMinsPerSession = ZTempTimeAllowed
     ZMaxPerDay = -(ZMaxPerDay * (ZTempMaxPerDay <= 0)) - _
                    (ZTempMaxPerDay * (ZTempMaxPerDay > 0))
     IF ZLimitMinsPerSession THEN _
        IF ZMinsPerSession > ZLimitMinsPerSession THEN _
           ZMinsPerSession = ZLimitMinsPerSession : _
           ZOutTxt$ = "Time shortened for external event" : _
           CALL RingCaller
     GOSUB 825
     RETURN
5140 Found = ZFalse
     CALL OpenWork (2,ZPswdFile$)
     IF ZErrCode = 53 THEN _
        CALL UpdtCalr ("Missing file " + ZPswdFile$,2) : _
        IF WasZ = 1 THEN _
           CALL AllCaps (ZUserIn$(1)) : _
           ZWasZ$ = ZUserIn$(1) : _
           GOTO 5160 _
        ELSE GOTO 5160
     ZWasZ$ = ZWasZ$ + _
          SPACE$(15 - LEN(ZWasZ$))
5150 IF EOF(2) THEN _
        GOTO 5160
5151 CALL GetPassword
     IF ZErrCode <> 0 THEN _
        ZWasEL = 5151 : _
        GOTO 13000
     IF LEN(ZTempPassword$) > 15 THEN _
        GOTO 5150
     ZTempPassword$ = ZTempPassword$ + _
                      SPACE$(15 - LEN(ZTempPassword$))
     IF ZWasZ$ <> ZTempPassword$ THEN _
        GOTO 5150
     IF PswdChangeAllowed AND _
        ZUserSecLevel >= ZMinSecForTempPswd THEN _
        GOTO 5155
     IF ZUserSecLevel <> ZTempSecLevel THEN _
        GOTO 5150
     IF ZStartTime = 0 THEN _
        GOTO 5155
     WorkTime$ = TIME$
     TestTime = VAL(LEFT$(WorkTime$,2) + MID$(WorkTime$,4,2))
     IF TestTime => ZStartTime AND TestTime <= ZEndTime THEN _
        GOTO 5155
     IF ZEndTime < ZStartTime THEN _
        IF TestTime => ZStartTime OR TestTime <= ZEndTime THEN _
           GOTO 5155
     GOTO 5150
5155 Found = ZTrue
5160 ZErrCode = 0
     RETURN
5200 CALL PageLen
     RETURN
'
' ****  J - COMMAND FROM MAIN MENU (JOIN CONFERENCE)  ***
'
5300 WasA1$ = ZConfMenu$
     CALL BreakFileName (ZActiveMessageFile$,MsgDrvPath$,WasX$,ZWasY$,ZTrue)
     CALL Talk (12,ZOutTxt$)
5301 ZStackC = ZTrue
     CALL SubMenu ("What conference, L)ist, M)ain ([ENTER] quits)",_
         WasA1$,MsgDrvPath$,_
         "M.DEF","M",ZUserGraphicDefault$,ZTrue,ZFalse,ZFalse,"C.DEF",WasX) ' KG032502
     IF ZWasQ = 0 THEN _
        RETURN
     IF ZSubParm = -1 THEN _
        RETURN 10595
5323 IF ZWasZ$ = "M" OR ZWasZ$ = "MAIN" THEN _
        IF ZConfName$ = "MAIN" THEN _
           RETURN _
        ELSE GOTO 5350
     IF NOT ZOK THEN _
        GOTO 5300
     CLOSE 2
'
' ****  UPDATE PREVIOUS MESSAGE BASE CHECKPOINT RECORD  ***
'
5324 PrevConfName$ = ZConfName$
     ZConfName$ = ZWasZ$
     ConfFileName$ = ZConfName$
     ConfNameSave$ = ZConfName$
     ' GOSUB 5342
     PrevMsg$ = ZActiveMessageFile$
     ZActiveMessageFile$ = ZFileName$
     GOSUB 5343
'
' ****  UPDATE PREVIOUS USER RECORD  ***
'
5325 GOSUB 5380
'
' *****  CHECK WHETHER HAVE SUBBOARD (I.E. CONFIG.DEF EXISTS)  ****
'
5327 UserRecordHold$ = ZUserRecord$
     ConfModeSave = ZConfMode
     ZConfMode = ZTrue
     PrevUser$ = ZActiveUserFile$
     PrevIndex = ZUserFileIndex
     PrevMainUser$ = ZMainUserFile$
     PrevUSL = ZUserSecLevel
     PrevDef$ = ZCurDef$
5328 WasX$ = ZConfName$ + _
          "C.DEF"
     CALL FindIt (WasX$)
     SubBoard = ZOK
     IF NOT SubBoard THEN _
        CALL BreakFileName (ZMainMsgFile$,MsgDrvPath$,ZWasDF$,ZWasY$,ZTrue) : _
        WasX$ = MsgDrvPath$ + WasX$ : _
        CALL FindIt (WasX$) : _
        SubBoard = ZOK
     IF SubBoard THEN _
        IF LEN(ZConfName$) = 6 THEN _
           IF LEFT$(ZConfName$,4) = "RBBS" AND RIGHT$(ZConfName$,1) = "P" THEN _
              SubBoard = ZFalse
     IF NOT SubBoard THEN _
        CALL BreakFileName (ZActiveUserFile$,UserDrvPath$,ZWasDF$,ZWasY$,ZTrue) : _
        WasX$ = UserDrvPath$ + _
             ZConfName$ + _
             "U.DEF" : _
        ZFileName$ = ZWelcomeFileDrvPath$ + _
                     ZConfName$ + _
                     "W.DEF" _
        ELSE CALL ReadDef (WasX$) : _
             IF ZErrCode > 0 THEN _
                CALL UpdtCalr ("Error"+STR$(ZErrCode)+" reading config file "+WasX$,2) : _
                ZErrCode = 0 : _
                ZInConfMenu = ZFalse : _
                ZOutTxt$ = "error reading subboard" : _
                GOTO 5341 _
             ELSE WasX$ = ZMainUserFile$ : _
                  ZFileName$ = "" : _
                  CALL FindIt (ZMainMsgFile$) : _
                  IF NOT ZOK THEN _
                     ZOutTxt$ = "msg file missing for" : _
                     ZInConfMenu = ZFalse : _
                     GOTO 5341 _
                  ELSE ZActiveMessageFile$ = ZMainMsgFile$ : _
                       GOSUB 5343
     UpdateDate = ZTrue
     CALL FindIt (WasX$)
     IF ZOK THEN _
        GOTO 5330
'
' *****  NO USER FILE - A PUBLIC CONFERENCE   ****
'
     ZMainUserFile$ = PrevMainUser$
     IF (ZUserSecLevel < AutoAddSec) THEN _
        GOTO 5340
     GOTO 5345
     'WasX$ = ZMainUserFile$
     'ZSysopPswd1$ = ""
     'ZSysopPswd2$ = ""
'
' ****  CHECK CONFERENCE USER'S FILE  ***
'
5330 ZActiveUserFile$ = WasX$
     IF ZMainUserFileIndex < 1 THEN _
        Found = ZFalse : _
        ZUserFileIndex = 0 : _
        GOTO 5335
     CALL WordInFile (ZConfMenu$,ZConfName$,ZInConfMenu)
     IF ZActiveUserName$ = "SYSOP" THEN _
        TempHashValue$ = ZOrigUserName$
     GOSUB 12598
     GOSUB 12984
5335 IF Found THEN _
        GOSUB 9500 : _
        ZMainUserFileIndex = -(SubBoard * ZUserFileIndex)_
                               -((NOT SubBoard) * ZMainUserFileIndex) : _
        Temp = -(SubBoard * ZMinLogonSec) _
               -((NOT SubBoard) * AutoAddSec) : _
        WasI = (ZUserSecLevel < OrigMainSec) : _
        WasJ = (ZUserSecLevel < Temp) : _
        WasK = (WasI AND WasJ) : _
        IF WasK THEN _
           ZOutTxt$ = "you have been locked out of" : _
           GOTO 5341 _
        ELSE GOSUB 5375 : _
             GOTO 5345
'
' **** USER NOT FOUND.  AUTO-ADD TO SUBBOARD IF SUFFICIENT SECURITY ***
'
     ZNewUser = SubBoard
     IF SubBoard THEN _
        AutoAddSec = ZMinLogonSec
     IF (ZOrigSec >= AutoAddSec) AND _                               ' KG080601
        (ZUserFileIndex > 0) AND (ZMainUserFileIndex > 0) THEN _
        LSET ZUserRecord$ = UserRecordHold$ : _
        CALL QuickTPut1 ("MEMBER privileges granted in " + ZConfName$) : _
        MID$(ZUserOption$,3,2) = MKI$(0) : _
        MID$(ZUserOption$,1,2) = MKI$(0) : _
        ZActiveUserName$ = LEFT$(UserRecordHold$,30) : _
        CALL Trim (ZActiveUserName$) : _
        Temp = -(SubBoard * ZDefaultSecLevel) _
               -((NOT SubBoard) * ZUserSecSave) : _
        GOSUB 5370 : _
        Temp = -(ZWasA * ZSysopSecLevel) - ((NOT ZWasA) * Temp) : _
        LSET ZSecLevel$ = MKI$(Temp) : _
        ZUserSecLevel = Temp : _
        GOSUB 5375 : _
        ZPageLength = ZPageLengthDef : _
        GOSUB 12986 : _
        GOSUB 12630 : _
        UpdateDate = ZTrue : _
        Found = ZTrue : _
        GOTO 5335
     IF ZOrigSec >= AutoAddSec THEN _                                ' KG080601
        CALL QuickTPut1 ("GUEST privileges granted in " + ZConfName$) : _
        ZActiveUserFile$ = PrevUser$ : _
        UpdateDate = ZFalse : _
        ZUserFileIndex = PrevIndex : _
        GOSUB 5382 : _
        ZUserFileIndex = 0 : _
        GOTO 5345
     ZNewUser = ZFalse
5340 IF ZInConfMenu THEN _
        ZOutTxt$ = "you are not in conference" _
     ELSE ZOutTxt$ = "no such option"
5341 ZOutTxt$ = ZOutTxt$ + " " + ZConfName$
'
' ****  CANNOT JOIN THE REQUESTED CONFERENCE.  THEREFORE, GO BACK  ***
'
     GOSUB 1397
     ZConfName$ = PrevConfName$
     ConfFileName$ = ZConfName$
     IF SubBoard THEN _
        CALL ReadDef (PrevDef$)
     ZActiveMessageFile$ = PrevMsg$
     GOSUB 5343
     ZUserFileIndex = PrevIndex
     ZActiveUserFile$ = PrevUser$
     GOSUB 5382
     ZConfMode = ConfModeSave
     GOSUB 12987
     ZAnsIndex = 0
     ZLastIndex = 0
     GOTO 5301
'
' ****  RESTORE A MESSAGE BASE   ***
'
5343 GOSUB 5344
     GOSUB 23000
     RETURN
'
' *****  OPEN AND SETUP MESSAGE BASE  *****
'
5344 CALL OpenMsg
     IF ZErrCode = 64 THEN _
        ZErrCode = 0 : _
        GOTO 5350
     FIELD 1, 128 AS ZMsgRec$
     RETURN
'
' *****  SUCCESSFUL CONFERENCE JOIN  ****
'
5345 ZNewsFileName$ = ZWelcomeFileDrvPath$ + ZConfName$ + ".NWS"
     ZConfName$ = ZConfName$ + " " + MID$("ConferenceSubboard",1-10*SubBoard,10)
     IF ZGlobalSysop THEN _
        ZActiveUserName$ = "SYSOP"
5347 GOSUB 4900
5348 GOSUB 12987
     GOSUB 12990
     IF SubBoard THEN _
        ZHasDoored = ZFalse : _
        ZActiveFMSDir$ = "" : _
        ZTimeLoggedOn$ = TIME$ : _                                   ' KG070601
        BoardCheckDate$ = LEFT$("00-00-00",-ZNewUser*8) + _          ' KG081001
                          LEFT$(ZLastDateTimeOn$,-(NOT ZNewUser)*8) : _  ' KG081001
        RETURN 108
     GOSUB 827
     IF UpdateDate THEN _
        BoardCheckDate$ = ZLastDateTimeOn$ : _
        ZTimeLoggedOn$ = TIME$ : _                                   ' KG070601
        LSET ZLastDateTimeOn$ = ZCurDate$ + _
                                  " " + _
                                  ZTimeLoggedOn$ : _
        GOSUB 9440 : _
        GOSUB 12991
     IF PrevUSL <> ZUserSecLevel THEN _
        CALL SetPrompt
     GOSUB 1241
     RETURN 852
'
' ****  JOIN M)AIN   ***
'
5350 IF ZConfName$ <> "MAIN" THEN _
        CALL QuickTPut1 ("Rejoining " + OrigMsgName$)                ' KG082003
     ConfFileName$ = OrigMsgName$
     ZNewsFileName$ = OrigNewsFileName$
     TurboLogon = ZTrue
     ZWasQ = 0
     ZNewUser = ZFalse                                               ' KG092201
     ZInConfMenu = ZTrue
     IF ZActiveUserName$ = "SYSOP" THEN _
        ZActiveUserName$ = ZSysopPswd1$ + " " + ZSysopPswd2$ : _
        CALL Trim (ZActiveUserName$)
     ZConfigFileName$ = ZOrigCnfg$
     CALL ReadDef (ZConfigFileName$)
     IF ZOrigMsgFile$ <> ZActiveMessageFile$ THEN _
        ZActiveMessageFile$ = ZOrigMsgFile$ : _
        GOSUB 5343
     IF ZOrigUserFile$ <> ZActiveUserFile$ THEN _
        GOSUB 5380 : _
        ZActiveUserFile$ = ZOrigUserFile$ : _
        ZActiveUserName$ = ZOrigUserName$ : _
        GOSUB 12598 : _
        GOSUB 12990 : _
        IF Found THEN _
           GOSUB 9500 : _
           ZMainUserFileIndex = ZUserFileIndex : _
           CALL SetPrompt : _
           CALL XferType (2,ZTrue) _
        ELSE ZUserFileIndex = 0 : _
             ZMainUserFileIndex = 0
     CALL UpdtCalr ("Exited " + ZConfName$,2)                        ' KG082003
     ZConfName$ = "MAIN"                                             ' KG082003
     GOSUB 2350
     ZUplds = ZGlobalUplds
     ZDnlds = ZGlobalDnlds
     ZDLToday! = ZGlobalDLToday!
     ZBytesToday! = ZGlobalBytesToday!
     ZDLBytes! = ZGlobalDLBytes!
     ZULBytes! = ZGlobalULBytes!
5360 ZConfMode = ZFalse
     SubBoard = ZTrue
     GOSUB 12987
     RETURN 108
5370 ZRemoteSysop = (ZActiveUserName$ = ZSysopPswd1$ + " " + ZSysopPswd2$) ' KG090402
     ZWasA = ZRemoteSysop                                            ' KG090402
     ZGlobalSysop = (ZGlobalSysop OR (ZWasA AND ZOrigCnfg$ = ZConfigFileName$))
     IF ZGlobalSysop THEN _
        ZWasA = ZTrue
     RETURN
5375 IF ((ZUserSecLevel < ZAutoUpgradeSec) AND SubBoard) OR _
        ((ZUserSecLevel < OrigUpgradeSec) AND NOT SubBoard) THEN _
           IF ZUserSecLevel <> ZOrigSec THEN _
              ZUserSecLevel = ZOrigSec : _
              LSET ZSecLevel$ = MKI$(ZUserSecLevel)
     RETURN
'
' *****  UPDATE CURRENT USERS RECORD  ****
'
5380 IF ZUserFileIndex < 1 THEN _
        RETURN
     IF ZAdjustedSecurity AND NOT ZSysop THEN _
        LSET ZSecLevel$ = MKI$(ZUserSecLevel) : _
        ZUserSecSave = ZUserSecLevel
     CALL UpdateU (ZFalse)
     RETURN
'
' *****  RESTORE A USER RECORD  ****
'
5382 IF ZUserFileIndex < 1 THEN _
        ZUserSecLevel = ZDefaultSecLevel : _
        RETURN
     CALL OpenUser (HighestUserRecord)
     GET 5,ZUserFileIndex
     GOSUB 9500
     RETURN
'
' *****  R - COMMAND FROM UTILITY MENU (REVIEW PROFILE)  ****
'
5400 CALL SkipLine(2)
     CALL QuickTPut1 ("Your PROFILE")                                ' KG072603
5410 CALL Toggle(-9)
     GOSUB 43020
     ZFF = INSTR(ZDefaultXfer$,ZUserXferDefault$)
     CALL Toggle(-5)
     GOSUB 42810
     CALL Toggle(-3)
     CALL Toggle(-6)
     CALL Toggle(-7)
     CALL Toggle(-10)
     CALL Toggle(-2)
     CALL Toggle(-4)
     CALL Toggle(-8)
     CALL Toggle(-1)
     IF ZRestrictByDate AND ZDaysInRegPeriod > 0 THEN _
        IF ZUserSecLevel > ZExpiredSec THEN _
           CALL QuickTPut1 ("Registration expires " + ZExpirationDate$)
     RETURN
'
' *****  B - COMMAND FROM UTILITY MENU (300 TO 450 BAUD CHANGE)  ****
'
5500 CALL Baud450
     IF ZLocalUser OR NOT (ZSubParm OR ZWasC = 20) THEN _
        RETURN
5502 RETURN 10595  'Entry point when have double nested gosub
'
' *****  V - COMMAND FROM MAIN MENU (VIEW CONFERENCES)  ****
'
5800 CALL ConfMail (MailCheckConfirm)
     ConfMailJoin = (ZHomeConf$ <> "")
     RETURN
'
' *  FORMAT MESSAGE HEADER INFORMATION FOR DISPLAY
'
8000 IF ZRet THEN _
        RETURN
8020 IF MID$(ZMsgRec$,37,5) = "ALL  " THEN _
        MsgTo$ = "ALL" : _
        GOTO 8040
8030 MsgTo$ = MID$(ZMsgRec$,37,22)
     CALL Trim (MsgTo$)
8040 IF LEN(MsgTo$) < 23 THEN _
        MsgTo$ = MsgTo$ + _
                      SPACE$(23 - LEN(MsgTo$))
     Subject$ = MID$(ZMsgRec$,76,25)
     CALL Trim (Subject$)
     CALL AllCaps (Subject$)                                         ' KG051501
     OrigSubject$ = Subject$
     IF ZPswdFailed THEN _
        Subject$ = WasSJ$
8050 MsgFrom$ = MID$(ZMsgRec$,6,31)
     CALL Trim (MsgFrom$)
     IF LEN(MsgFrom$) < 23 THEN _
        MsgFrom$ = MsgFrom$ + _
                        SPACE$(23 - LEN(MsgFrom$))
     IF ZUserSecLevel >= ZSecChangeMsg THEN _
        Year$ = "  Security:" + _
              STR$(MsgSec) _
        ELSE Year$ = ""
     IF MID$(ZMsgRec$,101,1) = "!" THEN _
        MID$(ZMsgRec$,1,1) = "!"
     ZOutTxt$ = ZFG1$ + "Msg #: " + _
          LEFT$(ZMsgRec$,5) + _
          Year$ + SPACE$ (22-LEN(Year$)) + ZConfName$
     Year$ = ZFG4$ + "   Sent: " + _
          MID$(ZMsgRec$,68,8) + _
          " " + _
          MID$(ZMsgRec$,59,5)
     IF NOT ZRet THEN _
        IF ReadMsgs THEN _
           CALL QuickTPut1 (ZOutTxt$): _
           WasX$ = MsgFrom$ : _
           CALL CheckColor (WasX$,SubInHeader$,ZFG2$) : _
           CALL QuickTPut1 (ZFG2$ + " From:  " + WasX$ + Year$) : _
           GOSUB 8076 : _
           WasX$ = MsgTo$ : _
           CALL CheckColor (WasX$,SubInHeader$,ZFG3$) : _
           CALL QuickTPut1 (ZFG3$ + "   To:  " + WasX$ + "  " + ZFG2$ + Year$) : _
           CALL CheckColor (Subject$,SubInHeader$,ZFG4$) : _
           ZOutTxt$ = ZFG4$ + "   Re:  " + _
                Subject$ + ZEmphasizeOff$ _
        ELSE ZOutTxt$ = ZFG1$ + LEFT$(ZMsgRec$,5) + _
                  " " + _
                  MID$(ZMsgRec$,68,5) + _
                  " " + _
                  + ZFG2$ + LEFT$(MsgFrom$,18) + _
                  " -> " + _
                  + ZFG3$ + LEFT$(MsgTo$,19) + _
                  " " + _
                  + ZFG4$ + LEFT$(Subject$,24) + ZEmphasizeOff$ : _
             CALL CheckColor (ZOutTxt$,SubInHeader$,"") : _
             GOTO 8080
     IF QuickScanMsgs OR _
        ScanMsgs THEN _
           GOTO 8080 _
     ELSE GOTO 8077
8076 IF MID$(ZMsgRec$,123,6) = STRING$(6,0) OR _
        MID$(ZMsgRec$,123,6) = SPACE$(6) THEN _
           Year$ = " Rcvd: -NO-" : _
           RETURN
     Year$ = " Rcvd: " + _
           RIGHT$(STR$(ASC(MID$(ZMsgRec$,123,1))),2) + _
           "-" + _
           RIGHT$(STR$(ASC(MID$(ZMsgRec$,124,1))),2) + _
           "-" + _
           RIGHT$(STR$(ASC(MID$(ZMsgRec$,125,1))),2) + _
           " " + _
           RIGHT$(STR$(ASC(MID$(ZMsgRec$,126,1))),2) + _
           ":" + _
           RIGHT$(STR$(ASC(MID$(ZMsgRec$,127,1))),2)
     FOR WasI = 8 TO 15
        IF MID$(Year$,WasI,1) = " " THEN _
           MID$(Year$,WasI,1) = "0"
     NEXT
     FOR WasI = 17 TO 21
        IF MID$(Year$,WasI,1) = " " THEN _
           MID$(Year$,WasI,1) = "0"
     NEXT
     RETURN
8077 IF (NOT MsgToCaller) THEN _
        ZWasA = (MID$(ZMsgRec$,37,5) = "ALL  ") : _
        IF NOT ZWasA THEN _
           GOTO 8080
     IF MsgFromCaller THEN _
        GOTO 8080
     Year$ = DATE$
     WasWK$ = TIME$
     MID$(ZMsgRec$,123,6) = CHR$(VAL(MID$(Year$,1,2))) + _
                                   CHR$(VAL(MID$(Year$,4,2))) + _
                                   CHR$(VAL(MID$(Year$,9,2))) + _
                                   CHR$(VAL(MID$(WasWK$,1,2))) + _
                                   CHR$(VAL(MID$(WasWK$,4,2))) + _
                                   CHR$(VAL(MID$(WasWK$,7,2)))
     GOSUB 12986
     PUT 1,ZMsgPtr(ZMsgDimIndex,1)
     GOSUB 12987
8080 GOSUB 12979
     ZOutTxt$ = ""
     RETURN
'
' * UNCOMPRESS MESSAGE PRIOR TO DISPLAY
'
9000 IF NOT JustSearching THEN _
        GOSUB 4656: _
        CALL SkipLine (1) : _
        ZLinesInMsg = 1 : _
        MsgDimXtra = 150 : _
        REDIM ZOutTxt$(MsgDimXtra) : _
        Remain$ = "" : _
        HiLitedLine = 0
     FOR WasX = 2 TO VAL(MID$(ZMsgRec$,117,4))
        WasJ = 1
        GET 1
        IF JustSearching THEN _
           ZOutTxt$ = ZMsgRec$ : _
           CALL AllCaps (ZOutTxt$) : _
           HiLitePos = INSTR(ZOutTxt$,SearchString$) : _
           IF HiLitePos > 0 THEN _
              HiLiteRec = LOC(1) : _
              WasX = 9999 : _
              GOTO 9090 _
           ELSE GOTO 9090
9050    ZWasB = INSTR(WasJ,ZMsgRec$,CHR$(227))
        IF ZRet THEN _
           RETURN
9060    ZWasC = ZWasB - WasJ
        IF ZWasC < 0 THEN _
           ZWasC = 128
9070    ZOutTxt$ = MID$(ZMsgRec$,WasJ,ZWasC)
        IF HiLiteRec = LOC(1) THEN _
           IF HiLitePos >= WasJ AND HiLitePos < WasJ+ZWasC THEN _
              HiLiteRec = -1 : _
              Bracketed = ZTrue : _
              ZOutTxt$(0) = ZOutTxt$ : _
              CALL Bracket (ZOutTxt$,HiLitePos-WasJ+1,HiLitePos+LEN(SearchString$)-WasJ,ZEmphasizeOn$,ZEmphasizeOff$)
        IF ZWasB = 0 THEN _
           Remain$ = ZOutTxt$ : _
           GOTO 9090 _
        ELSE ZOutTxt$ = Remain$ + ZOutTxt$ : _
             Remain$ = "" : _
             WasJ = ZWasB + 1
9085    IF LEFT$(ZOutTxt$,1) = ZStartOfHeader$ OR _
           LEFT$(ZOutTxt$,LEN(ZScreenOutMsg$)) = ZScreenOutMsg$ THEN _
           GOTO 9050
        ZOutTxt$(ZLinesInMsg) = ZOutTxt$
        IF Bracketed THEN _
           Bracketed = ZFalse : _
           HiLitedLine = ZLinesInMsg
        ZLinesInMsg = ZLinesInMsg + 1
        IF ZLinesInMsg > MsgDimXtra THEN _
           ZLinesInMsg = ZLinesInMsg - 1 : _
           CALL SkipLine (1) : _
           CALL QuickTPut1 ("Message too long.  Truncated to " + STR$(MsgDimXtra) + " lines!") : _
           ZOutTxt$ = "" : _
           RETURN
        IF NOT DontPrint THEN _                                      ' KG030201
           GOSUB 12979 : _                                           ' KG030201
           IF ZRet THEN _
              ZOutTxt$ = "" : _
              RETURN _                                               ' KG030201
           ELSE CALL AskMore ("",ZTrue,ZTrue,ZAnsIndex,ZFalse) : _   ' KG030201
                IF ZNo THEN _                                        ' KG030201
                   DontPrint = ZTrue                                 ' KG030201
        GOTO 9050
9090 NEXT
     IF DontPrint = ZTrue THEN _
        GOTO 5160
     IF JustSearching AND HiLitePos > 0 THEN _
        JustSearching = ZFalse : _
        GET 1,ZMsgPtr(ZMsgDimIndex,1) : _
        GOSUB 8000 : _
        GOTO 9000
     ZOutTxt$ = ""
     RETURN
'
' *  C - COMMAND FROM UTILITY MENU (CLOCK - TIME ON SYSTEM)
'
9100 CALL RptTime
     RETURN
'
' * WRITE A RECORD TO THE RBBS-PC "USER" FILE
'
9440 IF ZUserFileIndex > 0 AND ZUserFileIndex < 32768 THEN _
        PUT 5,ZUserFileIndex
     RETURN
'
' * DEFINE USER FILE RECORD VARIABLES TO COMPENSATE FOR THE BUG IN QUICKBASIC
' * THAT REQUIRES A FIELD STATMENT TO BE EXECUTED WITHIN EACH SEPARATELY
' * COMPILED PROGRAM -- EVEN THOUGH A FIELD STATEMENT WAS EXECUTED WHEN THE
' * FILE WAS OPENED IN ANOTHER SEPERATELY COMPILED SUBROUTINE
'
9450 IF LOF(5) < 1 THEN _
        ZWasDF$ = ZActiveUserFile$ : _
        RETURN 13600
     FIELD 5,31 AS ZUserName$, _
             15 AS ZPswd$, _
              2 AS ZSecLevel$, _
             14 AS ZUserOption$,  _
             24 AS ZCityState$, _
              3 AS MachineType$, _
              4 AS ZTodayDl$, _
              4 AS ZTodayBytes$, _
              4 AS ZDlBytes$, _
              4 AS ZULBytes$, _
             14 AS ZLastDateTimeOn$, _
              3 AS ZListNewDate$, _
              2 AS ZUserDnlds$, _
              2 AS ZUserUplds$, _
              2 AS ZElapsedTime$
     FIELD 5,128 AS ZUserRecord$
     RETURN
'
' * GET USER DEFAULTS
'
9500 GOSUB 9450
     GOSUB 5370
     IF ZWasA THEN _
        ZUserSecLevel = ZSysopSecLevel _
     ELSE ZUserSecLevel = CVI(ZSecLevel$)
     ZLastMsgRead = CVI(MID$(ZUserOption$,3,2))
     ZUserXferDefault$ = MID$(ZUserOption$,5,1)
     IF ZUserXferDefault$ = " " THEN _
        ZUserXferDefault$ = "N"
     CALL XferType (2,ZTrue)
     WasX = ASC(MID$(ZUserOption$,6,1))
     ZWasGR = (WasX MOD 3)
     ZBoldText$ = CHR$(48 - (WasX > 50))
     ZUserTextColor = (WasX - ZWasGR)/3 + 21
     IF ZUserTextColor > 37 THEN _
        ZUserTextColor = ZUserTextColor - 7
     IF ZEmphasizeOff$ <> "" THEN _
        CALL QuickTPut (ZColorReset$,0)
     IF ZEmphasizeOnDef$ <> "" THEN _
        ZEmphasizeOff$ = ZEscape$ + "[" + ZBoldText$ + ";40;" + MID$(STR$(ZUserTextColor),2) + "m" _
     ELSE ZEmphasizeOff$ = ""
     IF ZWasGR = 1 AND NOT ZEightBit THEN _
        ZWasGR = 0
     CALL SetGraphic (ZWasGR, ZUserGraphicDefault$)
     ZRightMargin = CVI(MID$(ZUserOption$,7,2))
     IF ZRightMargin > 72 THEN _
        ZRightMargin = 72
     ZWasCI$ = ZCityState$
     CALL Trim (ZWasCI$)
9510 UserOptions = CVI(MID$(ZUserOption$,9,2))
     ZPromptBell = (UserOptions AND 1) > 0
     ZExpertUser = (UserOptions AND 2) > 0
     CALL SetExpert
     ZNulls = (UserOptions AND 4) > 0
     ZUpperCase = (UserOptions AND 8) > 0
     ZLineFeeds = (UserOptions AND 16) > 0
     ZCheckBulletLogon = (UserOptions AND 32) > 0
     ZSkipFilesLogon = (UserOptions AND 64) > 0
     ZAutoDownDesired = (UserOptions AND 128) > 0
     ZReqQuesAnswered = (UserOptions AND 256) > 0
     ZMailWaiting = (UserOptions AND 512) > 0
     WasX = (UserOptions AND 1024 ) > 0
     CALL SetHiLite (NOT WasX)
     IF NOT ZHiLiteOff THEN _
        CALL QuickTPut (ZEmphasizeOff$,0)
     ZTurboKeyUser = (UserOptions AND 2048) > 0
     ZTurboKey = ZFalse
     GOSUB 11480
     ZPageLength = ASC(MID$(ZUserOption$,13,1))
     IF SubBoard THEN _
        GOTO 9520
     WasX$ = ZEchoer$
     ZEchoer$ = MID$(ZUserOption$,14,1)
     IF INSTR("ICR",ZEchoer$) = 0 THEN _
        ZEchoer$ = "R"
     IF WasX$ <> ZEchoer$ THEN _
        GOSUB 9525
     CALL SetEcho (ZEchoer$)
9520 ZNul$ = MID$(STRING$(5,0),1, - 5 * ZNulls)
     CALL SetCrLf
     ZUseTPut = (ZUpperCase OR ZXOnXOff)
     ZPswdSave$ = ZPswd$
     RETURN
9525 IF ZEchoer$ = "R" THEN _
        ZOutTxt$ =  "RBBS now set" _
     ELSE IF ZEchoer$ = "C" THEN _
             ZOutTxt$ = "Please set your communications package" _
          ELSE ZOutTxt$ = "Intermediate host now set"
     CALL QuickTPut1 (ZOutTxt$ + " to echo what you type")
     RETURN
'
' *  B - COMMAND FROM MAIN MENU (READ BULLETINS)
'
9700 ReturnOn$ = "*SN"
     WasA1$ = ZBulletinMenu$
9701 CALL SubMenu ("Read what bulletin(s), L)ist, S)ince, N)ews ([ENTER] = none)",_
                   WasA1$, ZBulletinPrefix$,"",ReturnOn$,_
                   ZUserGraphicDefault$,ZFalse,ZFalse,ZFalse,"",WasX) ' KG032502
     IF ZWasQ = 0 THEN _
        RETURN
     CALL CheckCarrier
     IF ZSubParm = -1 THEN _
        RETURN 10595
     IF (ZWasZ$ = "*" OR ZWasZ$ = "S") THEN _
        ZPrevPrefix$ = "" : _
        GOTO 9760
     ZStopInterrupts = ZFalse
     IF ZWasZ$ = "N" THEN _
        GOSUB 1242 : _
        IF WasZ <> 0 THEN _
           CALL QuickTPut1 ("No NEWS available") : _
           GOTO 9701 _
        ELSE GOTO 9703
     CALL BufFile (ZFileName$,ZAnsIndex)
9703 CALL UpdtCalr ("Read bulletin " + ZFileName$,1)
     GOTO 9701
'
' *  CHECK AND REVIEW NEW BULLETINS SINCE Last LOGON
'
9750 CALL CheckNewBul (BoardCheckDate$,NumNewBullets,NewBullets$)
     RETURN
9760 ' ****  [entry when want review plus chance to read] *********
     GOSUB 9750
     IF NumNewBullets > 0 THEN _
        ZLastIndex = NumNewBullets + 1 : _
        ZOutTxt$ = "Read ALL new bulletins ([Y],N)" : _              ' DA071701
        GOSUB 12999 : _
        IF NOT ZNo THEN _
           ZAnsIndex = 1: _
           GOTO 9700
     ZLastIndex = 0
     IF ZAnsIndex < 1 THEN _
        RETURN
     GOTO 9701
'
' *  W - COMMAND FROM MAIN MENU (WHO'S ON THE OTHER NODES)
'
9800 CALL WhosOn (NodesInSystem)
     GOSUB 5344
     RETURN
'
' *  1 - COMMAND FROM SYSOP MENU (DISPLAY COMMENTS)
'
10070 CALL Muzak (7)
      ZFileName$ = ZCmntsFile$
      IF NOT ZStopInterrupts THEN _
         ZOutTxt$ = "* Ctrl-K(^K) / ^X aborts. ^S suspends, ^Q resumes *" : _
         GOSUB 12976
      GOSUB 20150
      RETURN
'
' *  U - COMMAND FROM UTILITY MENU (DISPLAY USERS)
' *  2 - COMMAND FROM SYSOP MENU (DISPLAY USERS)
'
10090 CALL Muzak (6)
      ZOutTxt$ = "List - U)sers, R)ecent callers"
      CALL SkipLine (1)
      GOSUB 12930
      IF ZWasQ = 0 THEN _
         RETURN
      CALL AllCaps (ZUserIn$(ZAnsIndex))
      ON INSTR("UR",ZUserIn$(ZAnsIndex)) + 1 GOTO 10090,10096,10093
10093 CALL DispCall
      RETURN
10096 UserRecordHold$ = ZUserRecord$
      GOSUB 12700
      CALL OpenUser (HighestUserRecord)
      GOSUB 9450
      ZStopInterrupts = ZFalse
      ZNonStop = (ZPageLength < 1)
      WasI = 1
      ZWasZ$ = ZSysopPswd1$ + " " + ZSysopPswd2$
10097 IF WasI > HighestUserRecord OR ZRet THEN _
         GOTO 10099
      GET 5,WasI
      WasX$ = MID$(ZUserRecord$,ZStartHash,ZLenHash)
      IF ASC(WasX$)=0 OR LEFT$(WasX$,3)="   " THEN _                 ' KG073101
         GOTO 10098
      IF INSTR(WasX$,ZWasZ$) > 0 OR ZSysopSecLevel <= CVI(MID$(ZUserRecord$,47,2)) THEN _
         IF NOT ZSysop THEN _
            GOTO 10098
      CALL AskMore ("",ZTrue,ZTrue,WasXX,ZFalse)
      IF ZNo OR ZSubParm = -1 THEN _
         GOTO 10099
      ZOutTxt$ = LEFT$(WasX$,36) + ZCityState$ + ZLastDateTimeOn$
      GOSUB 12979
10098 WasI = WasI + 1
      GOTO 10097
10099 ZOutTxt$ = ""
      LSET ZUserRecord$ = UserRecordHold$
      ZStopInterrupts = ZTrue
      RETURN
'
' *  3 - COMMAND FROM SYSOP MENU (RECOVER MESSAGES)
'
10390 MsgRecovered = ZFalse
10391 ZOutTxt$ = "Recover Msg #" + ZPressEnter$
      GOSUB 12932
      CALL CheckInt (ZUserIn$(ZAnsIndex))
      IF ZErrCode <> 0 THEN _
         GOTO 10391
      MsgToRecover = ZTestedIntValue
      IF MsgToRecover < 1 THEN _
         GOTO 10392
      GOSUB 5344
      ActionFlag = ZFalse
      CALL RecoverMsg (MsgToRecover,FirstMsgRecord,ActionFlag)
      MsgRecovered = MsgRecovered OR ActionFlag
      GOTO 10391
10392 IF MsgRecovered THEN _
         ActionFlag = ZTRUE : _
         GOTO 1900
      RETURN
'
' *  4 - COMMAND FROM SYSOP MENU (DELETE COMMENTS)
'
10530 ZOutTxt$ = "Delete comments (Y/[N])"
      GOSUB 12995
      IF ZYes THEN _
         CALL OpenOutW (ZCmntsFile$)
      CLOSE 2
10550 RETURN
'
' *  TIME LIMIT EXCEEDED EXIT
'
10553 CALL UpdtCalr ("Time limit exceeded",1)
      CALL QuickTPut1 ("You have no time left")
'
' *  Q - COMMAND FROM GLOBAL FUNCTIONS
'
10560 GOSUB 9100
      IF NOT ZSysop AND _
         ZUserSecLevel < ZSecExemptFromEpilog THEN _
           ZFileName$ = ZEpilog$ : _
           GOSUB 11520
      IF ZLocalUserMode OR NOT ZLocalUser THEN _
         CALL UpdtCalr ("Logged off",1)
      CALL Muzak (4)
      GOTO 10595
10570 IF MinsRemaining > 1 AND (ZTurboKeyUser OR NOT ZExpertUser) THEN _
         ZOutTxt$ = "Log off (Y,[N])" : _                            ' DA071701
         GOSUB 12930 : _
         IF NOT ZYes THEN _
            RETURN
      GetOut = ZTrue
      GOTO 10560
10590 CALL UpdtCalr ("Sleep Disconnect",1)
      SubBoard = ZFalse
10595 CALL GetTime
      GOSUB 13700
      ZSubParm = 0
      CALL Carrier
      IF ZSubParm = -1 THEN _
         GOTO 10597
      IF ZConfName$ = OrigMsgName$ THEN _
         GetOut = ZTrue
      IF (SubBoard AND (NOT GetOut) AND (NOT ZSleepDisconnect)) THEN _
         GOSUB 5380 : _
         ZHomeConf$ = "M" : _
         CALL QuickTPut1 ("Time limit exceeded in " + ZConfName$) : _
         SubBoard = ZFalse : _
         GOTO 1205
10597 CALL UpdateU (ZTrue)
      GOTO 13540
10620 CALL UpdtCalr(ZWasLG$(ZLogonErrorIndex),2)
      IF ZExitToDoors THEN _
         CALL UpdateU (ZTrue)
10621 IF ZActiveUserName$ = "" THEN _
         ZActiveUserName$ = "NAME UNAVAILABLE"
      ZWasZ$ = ZActiveUserName$ + _
           " on at " + _
           ZCurDate$ + _
           ", " + _
           ZTime$ + _
           "** LOGON DENIED **, " + _
           ZBaudParity$
      ZWasNG$ = ZWasZ$ + _
            SPACE$(128 - LEN(ZWasZ$))
10698 CALL Muzak (5)
      IF ZFunctionKey = 22 THEN _
         GOTO 13545
      ZOutTxt$ = "Access denied!"
      GOSUB 12976
      CALL DelayTime (8 + ZBPS)
      GOTO 13545
'
' *  M - COMMAND FROM UTILITY MENU (CHANGE MARGINS)
'
10925 UtilMarginChange = ZTrue
      GOSUB 3100
      UtilMarginChange = ZFalse
      RETURN
'
' *  7 - COMMAND FROM SYSOP MENU (EXIT TO DOS)
'
10930 IF ZDosVersion < 2 OR _
         (ZRequiredRings = 0 AND NOT ZNoDoorProtect) THEN _
         CALL QuickTPut1 ("Remote DOS unavailable") : _
         RETURN
10932 IF ZLocalUser AND NOT ZDebug THEN _
         CALL QuickTPut1 ("Only for remote SYSOP's") : _
         RETURN
      CALL DosExit
      ZSubParm = -9
      CALL FindFKey
      GOTO 202
'
' *  D - COMMAND FROM MAIN MENU (EXIT TO DOORS)
'
10970 IF NOT ZDoorsAvail OR _
         (ZRequiredRings = 0 AND NOT ZNoDoorProtect) THEN _
         CALL QuickTPut1 ("No doors available") : _                  ' KG072604
         RETURN
      IF ZTimeLock AND 1 AND NOT ZHasDoored THEN _
         CALL TimeLock : _
         IF NOT ZOK THEN _
            RETURN
10974 WasA1$ = ZMenu$(5)
      CALL Talk (5,ZOutTxt$)
      ZStackC = ZTrue
      CALL SubMenu ("Open which door, L)ist" + ZPressEnterExpert$, _
                    WasA1$,"",".BAT","",_
                    ZUserGraphicDefault$,ZTrue,ZFalse,ZFalse,"",InMenu) ' KG032502
      IF ZWasQ = 0 THEN _
         RETURN
      IF ZSubParm = -1 THEN _
         RETURN 10595
10986 ZWasZ$ = ZFileName$
      CALL DoorExit (NOT InMenu)                                     ' KG032502
      GOTO 10974                                                     ' KG032502
'
' *  5 - COMMAND FROM SYSOP MENU (USER FILE MAINTENANCE)
'
11000 WasTU = ZUserFileIndex
      CALL DefaultU
      UserRecordHold$ = ZUserRecord$
      RegDateHold$ = ZRegDate$
      UserSecLevelSave = ZUserSecLevel                               ' ML062201
11001 ZStopInterrupts = ZTrue
      WasI = 1
      ScanUsers = ZFalse
      IF EditFromRead = 1 THEN GOTO 11341                            ' KG070901
      ZOutTxt$ = "A)dd, L)st, P)rt, M)od, S)can users"
      GOSUB 12930                                                    ' KG070901
11003 IF ZWasQ = 0 THEN _
      IF EditFromRead > 0 THEN _
         GOTO 11325 _
      ELSE _
         ZUserFileIndex = WasTU : _
         GOTO 20093
      WasQQ = 0
      ZWasZ$ = LEFT$(ZUserIn$(ZAnsIndex),1)                          ' KG070901
      CALL AllCaps (ZWasZ$)
      IF ZWasZ$ = "A" THEN _
         GOTO 12300 _
      ELSE IF ZWasZ$ = "M" THEN _
              ZStopInterrupts = ZTrue _
           ELSE IF ZWasZ$ = "P" THEN _
                   WasQQ = ZTrue _
                ELSE IF ZWasZ$ = "S" THEN _
                        ScanUsers = ZTrue : _
                        ZStopInterrupts = ZTrue _
                     ELSE IF ZWasZ$ <> "L" THEN _
                             GOTO 11001
11005 CALL OpenUser (HighestUserRecord)
      GOSUB 9450
      WasZ = 1
      IF ScanUsers THEN _
         ZOutTxt$ = "Scan for N)ame, P)wd, C)" + ZUserLocation$ + ", L)evel" + _
              LEFT$(", H)ash id",-9*(ZStartHash > 1 AND ZLenHash > 0)) : _
         GOSUB 12930 : _                                             ' KG070901
         ZOutTxt$ = "" : _
         ScanFunction$ = LEFT$(ZUserIn$(1),1) : _
         CALL AllCaps (ScanFunction$) : _
         ZCR = 0 : _
         GOSUB 12979 : _
         GOSUB 12966 : _
         GOTO 12962
11010 FOR WasJ = WasZ TO HighestUserRecord
         GET 5,WasJ
11015    WasX$ = MID$(ZUserRecord$,ZStartHash,ZLenHash)
         IF ASC(WasX$) = 0 OR LEFT$(WasX$,3) = "   " THEN _
            GOTO 11310
         WasOF = CVI(ZSecLevel$)
         IF WasOF > ZUserSecLevel THEN _
            IF NOT ZGlobalSysop THEN _
               GOTO 11310
         ZOutTxt$ = ZFG4$ + RIGHT$("     " + STR$(LOC(5)),4) + _
              ":" + _
              ZFG1$ + ZUserName$ + _
              ZFG2$ + "SECURITY" + _
              RIGHT$("     " + STR$(WasOF),5) + _
              " "
11020    ZOutTxt$ = ZOutTxt$ + _
              ZFG3$ + "Password = " + _
              ZPswd$ + ZEmphasizeOff$
11025    IF WasQQ THEN _
            CALL Printit (ZOutTxt$)
11027    GOSUB 12979
         IF ZRet <> 0 THEN _
            GOTO 11330
         IF WasOF < OrigMainSec THEN _
            ZOutTxt$ = ZEmphasizeOn$ + "<Locked out>" + ZEmphasizeOff$ + SPACE$(7) : _
            GOTO 11030
         IF WasOF >= ZSysopSecLevel THEN _
            ZOutTxt$ = ZEmphasizeOn$ + "  (SYSOP)  " + ZEmphasizeOff$ + SPACE$(8) : _
            GOTO 11030
         ZOutTxt$ = SPACE$(19)
11030    ZOutTxt$ = ZOutTxt$ + _
              ZLastDateTimeOn$ + _
             "   " + _
             ZFG4$ + ZCityState$ + ZEmphasizeOff$
11100    IF WasQQ THEN _
            CALL Printit (ZOutTxt$)
11101    CALL QuickTPut1 (ZOutTxt$)
        IF ZRet <> 0 THEN _
           GOTO 11330
        ZOutTxt$ = "  DOWNLOADS = " + _
             RIGHT$("     " + STR$(CVI(ZUserDnlds$)),5) + _
             "   " + _
             "UPLOADS = " + _
             RIGHT$("     " + STR$(CVI(ZUserUplds$)),5) + _
             "   " + _
             " Times on ="
         ZOutTxt$ = ZOutTxt$ + RIGHT$("     " + STR$(CVI(MID$(ZUserOption$,1,2))),5) + _
             "   " + _
             "TIME USED = " + _
             RIGHT$("    " + STR$(CVI(ZElapsedTime$)),4) + _
             " Min"
        IF WasQQ THEN _
           CALL Printit (ZOutTxt$)
11105   CALL QuickTPut1 (ZOutTxt$)
        IF ZRet <> 0 THEN _
           GOTO 11330
         IF NOT ZEnforceRatios THEN _
            GOTO 11106
         ZOutTxt$ = "BYTES: Dwn=" + STR$(CVS(ZDlBytes$)) + _
              "  Up=" + STR$(CVS(ZULBytes$)) + _
              " TODAY Dwn: #=" + STR$(CVS(ZTodayDl$)) + _
              " Bytes=" + STR$(CVS(ZTodayBytes$))
         IF WasQQ THEN _
            CALL Printit (ZOutTxt$)
         CALL QuickTPut1 (ZOutTxt$)
         IF ZRet <> 0 THEN _
            GOTO 11330
11106   IF (ZStartIndiv = 0 OR ZLenIndiv = 0) AND _
           (ZStartHash = 0 OR ZLenHash = 0) AND _
           NOT ZRestrictByDate THEN _
              GOTO 11107
        IF (ZStartHash > 1 AND ZLenHash > 0) THEN _
           ZOutTxt$ = "Hash: " + MID$(ZUserRecord$,ZStartHash,ZLenHash) _
        ELSE ZOutTxt$ = ""
        IF (ZStartIndiv > 1 AND ZLenIndiv > 0) THEN _
           ZOutTxt$ = ZOutTxt$ + " Indiv: " + MID$(ZUserRecord$,ZStartIndiv,ZLenIndiv)
        IF ZRestrictByDate THEN _
            GOSUB 11480 : _
            ZOutTxt$ = ZOutTxt$ + "  Registered: " + _
                 RegDisplayDate$
        CALL QuickTPut1 (ZOutTxt$)
        IF WasQQ THEN _
           CALL Printit (ZOutTxt$)
        IF ZRet <> 0 THEN _
           GOTO 11330
11107   IF NOT ZStopInterrupts THEN _
           GOTO 11310
11110   ZOutTxt$ = "D)el,F)ind,M)enu,N)ewPW,P)rnt,R)eset gr,Q)uit,S)ecLvl,U)ser#,X)fer"
        IF ZRestrictByDate THEN _
           ZOutTxt$ = ZOutTxt$ + _
                ",$)RegDate"
        GOSUB 12930                                                  ' KG070901
        IF NOT ScanUsers AND ZWasQ = 0 THEN _
           GOTO 11310
11115   ZWasZ$ = LEFT$(ZUserIn$(ZAnsIndex),1)                        ' KG070901
        CALL AllCaps (ZWasZ$)
        WasX = INSTR("DNPQFSMR$UX",ZWasZ$)
        IF ZWasZ$ = "" AND ScanUsers THEN _
           GOTO 12965
        ON WasX GOTO 11130,11160,11220,11320,11340,11390,11330,11400,11450,11127,11490
        GOTO 11110
11125   WasZ = VAL(ZUserIn$)
        IF WasZ < 1 OR WasZ > HighestUserRecord THEN _
           GOTO 11127
        GOTO 11010
11127   ZOutTxt$ = "What record #"
        GOSUB 12932                                                  ' KG070901
        GOTO 11125
'
' *  D - COMMAND FROM 5- USER MAINTENANCE OPTIONS (DELETE USER)
'
11130   ZOutTxt$ = "Delete user (Y/[N])"
        GOSUB 12995
        IF ZYes THEN _
           LSET ZUserName$ = CHR$(0) + _
                             "deleted user" : _
           LSET ZSecLevel$ = MKI$(ZMinLogonSec - 1) : _
           LSET ZLastDateTimeOn$ = "01-01-80" + _
                                     " " + _
                                     ZTimeLoggedOn$
        GOTO 11290
'
' *  N - COMMAND FROM 5- USER MAINTENANCE OPTIONS (CHANGE USER PASSWORD)
'
11160   GOSUB 12800
        GOTO 11290
'
' *  P - COMMAND FROM 5- USER MAINTENANCE OPTIONS (PRINT USER FILE)
'
11220   WasQQ = NOT WasQQ
        GOTO 11015
11290   ZUserFileIndex = LOC(5)
        GOSUB 12989
        GOSUB 9440
        GOSUB 12991
        ZUserFileIndex = 0
        GOTO 11015
11310   IF ScanUsers THEN _
           GOTO 12965
11311 NEXT
'
' *  Q - COMMAND FROM 5- USER MAINTENANCE OPTIONS (QUIT TO MAIN MENU)
'
11320 ZUserFileIndex = WasTU
      LSET ZUserRecord$ = UserRecordHold$
      ZRegDate$ = RegDateHold$
      IF EditFromRead > 0 THEN _
         GOTO 11325
      RETURN 1200
11325 ZReply = ZFalse
      JustReplied = ZTrue
      QuotedReply = ZTrue
      EditFromRead = 0
      CALL GetMsgAttr
      DontPrint = ZTrue
      ZUserIn$ = "="
      GOTO 4560
'
' *  M - COMMAND FROM 5- USER MAINTENANCE OPTIONS (MAIN USER MAINT. MENU)
'
11330 CLOSE 2
      IF EditFromRead > 0 THEN _
         EditFromRead = 2
      GOTO 11001
'
' *  F - COMMAND FROM 5- USER MAINTENANCE OPTIONS (FIND USER)
'
11340 ZOutTxt$ = ZPromptHash$ + _
           " to find"
      CALL SkipLine (1)
      ZParseOff = ZTrue                                              ' KG070901
      GOSUB 12932                                                    ' KG070901
      IF ZWasQ = 0 THEN _
         GOTO 11340
      TempHashValue$ = ZUserIn$
11341 IF LEN(TempHashValue$) < 3 OR LEN(TempHashValue$) > ZLenHash THEN _
         GOTO 11340
      CALL AllCaps (TempHashValue$)
      IF ZStartIndiv < 1 THEN _
         GOTO 11345
11342 ZOutTxt$ = ZPromptIndiv$ + _
           " to find"
      GOSUB 12995
      IF ZWasQ = 0 THEN _
         GOTO 11342
      TempIndivValue$ = ZUserIn$
      IF LEN(TempIndivValue$) > ZLenIndiv THEN _
         GOTO 11342
      CALL AllCaps (TempIndivValue$)
11345 GOSUB 12600
      GOSUB 12984
      ZUserFileIndex = 0
      IF Found THEN _
         GOTO 11015
11380 ZOutTxt$ = TempHashValue$ + _
           " " + _
           TempIndivValue$ + _
           " not found"
      GOSUB 12977
      GOTO 11310
'
' *  S - COMMAND FROM 5- USER MAINTENANCE OPTIONS (CHANGE USER SECURITY)
'
11390 GOSUB 11395
      LSET ZSecLevel$ = MKI$(WasOF)
      GOTO 11290
11395 ZOutTxt$ = "New sec level"
      GOSUB 12932                                                    ' KG070901
      ZWasZ$ = ZUserIn$(ZAnsIndex)                                   ' KG070901
      WasOF = VAL(ZWasZ$)
      IF WasOF > ZUserSecLevel THEN _
         WasOF = ZUserSecLevel
      RETURN
'
' *  R - COMMAND FROM 5- USER MAINTENANCE OPTIONS (RESET USER GRAPHICS)
'
11400 ZWasA = CVI(MID$(ZUserOption$,9,2))
      ZWasA = ZWasA AND &HFAFF                ' TURN HIGHLIGHTING OFF
      LSET ZUserOption$ = LEFT$(ZUserOption$,5) + _
                           "0" + _
                           MID$(ZUserOption$,7,2) + _
                           MKI$(ZWasA) + _
                           MID$(ZUserOption$,11)
      GOTO 11290
'
' *  $ - COMMAND FROM 5 - USER MAINTENANCE (CHANGE REGISTRATION DATE)
'
11450 ZOutTxt$ = "Enter new registration date (MM-DD-YY)"
      GOSUB 12932                                                    ' KG070901
      IF ZWasQ = 0 THEN _
         GOTO 11015
11455 WorkDate$ = ZUserIn$(ZAnsIndex)                                ' KG070901
      IF LEN(WorkDate$) < 8 THEN _
         GOTO 11450
      GOSUB 11470
      IF NOT ZOK THEN _
         GOTO 11450
      LSET ZUserOption$ = LEFT$(ZUserOption$,10) + _
                           ZRegDate$ + _
                           MID$(ZUserOption$,13)
      GOSUB 11480
      ZRegDate$ = RegDateHold$
      GOTO 11290
'
' *  CALCULATE REGISTRATION DATES
'
11470 IF LEN(WorkDate$) < 10 THEN _
         WorkDate$ = LEFT$(WorkDate$,6) + _
                      "19" + _
                      RIGHT$(WorkDate$,2)
      TodayRegYY = VAL(MID$(WorkDate$,7))
      TodayRegMM = VAL(LEFT$(WorkDate$,2))
      TodayRegDD = VAL(MID$(WorkDate$,4,2))
      ZOK = TodayRegYY > 1979 AND TodayRegMM > 0 AND _
           TodayRegMM < 13 AND TodayRegDD > 0 AND _
           TodayRegDD < 32
      IF ZOK THEN _
         CALL TwoByteDate (TodayRegYY,TodayRegMM,TodayRegDD,ZRegDate$)
      RETURN
11480 WasX$ = MID$(ZUserOption$,11,2)
      IF CVI(WasX$) <> 0 THEN _
         ZRegDate$ = WasX$ : _
      ELSE GOSUB 11482
      CALL UnPackDate (ZRegDate$,UserRegYY,UserRegMM,UserRegDD,RegDisplayDate$)
      IF CVI(WasX$) = 0 THEN _
         RegDisplayDate$ = "00-00-00"
      RETURN
11482 WorkDate$ = DATE$
      GOTO 11470
'
' *  X - COMMAND FROM 5 - USER MAINTENANCE (CHANGE XFER COUNTERS)             *
'
11490 CALL QuickTPut1 ("[ENTER] leaves unchanged")
      ZOutTxt$ = "Upload file total"
      GOSUB 12995
      IF LEN(ZUserIn$(1)) > 0 THEN _
         LSET ZUserUplds$ = MKI$(VAL(ZUserIn$(1)))
      ZOutTxt$ = "Upload BYTE total"
      GOSUB 12995
      IF LEN(ZUserIn$(1)) > 0 THEN _
         LSET ZULBytes$ = MKS$(VAL(ZUserIn$(1)))
      ZOutTxt$ = "Download file total"
      GOSUB 12995
      IF LEN(ZUserIn$(1)) > 0 THEN _
         LSET ZUserDnlds$ = MKI$(VAL(ZUserIn$(1)))
      ZOutTxt$ = "Download BYTE total"
      GOSUB 12995
      IF LEN(ZUserIn$(1)) > 0 THEN _
         LSET ZDlBytes$ = MKS$(VAL(ZUserIn$(1)))
      ZOutTxt$ = "Files downloaded TODAY"
      GOSUB 12995
      IF LEN(ZUserIn$(1)) > 0 THEN _
         LSET ZTodayDl$ = MKS$(VAL(ZUserIn$(1)))
      ZOutTxt$ = "Bytes downloaded TODAY"
      GOSUB 12995
      IF LEN(ZUserIn$(1)) > 0 THEN _
         LSET ZTodayBytes$ = MKS$(VAL(ZUserIn$(1)))
      GOTO 11290
'
' *  ALLOW USERS TO ANSWER A "QUESTIONNAIRE" BASED ON THE RBBS-PC SCRIPT
'
11520 CALL AskUsers
      IF NOT ZOK THEN _
         RETURN
      IF ZAdjustedSecurity THEN _
         GOSUB 12989 : _
         LSET ZSecLevel$ = MKI$(ZUserSecLevel) : _
         GOSUB 9440 : _
         GOSUB 12991 : _
         CALL SetPrompt : _
         CALL XferType (2,ZTrue) : _
         GOSUB 5135
      REDIM ZOutTxt$(ZMsgDim)
      IF ZSubParm = -1 THEN _
         RETURN 10595
      ZOK = ZTrue
      RETURN
'
' *  A - COMMAND FROM 5- USER MAINTENANCE OPTIONS (ADD USER)
'
12300 WasA1$ = ""
      Attempts = 0                                                   ' ML062201
      FirstNameSave$ = ZFirstName$
      LastNameSave$ = ZLastName$
      ActiveUserNameSave$ = ZActiveUserName$
      CityStateSave$ = ZWasCI$
      HashValueSave$ = HashValue$
      IndivValueSave$ = ZIndivValue$                                 ' RC050901
      GOSUB 12500
      GOSUB 12840
      GOSUB 12850
      GOSUB 12598
      IF ZUserFileIndex = 0 THEN _
         GOSUB 12984 : _
         GOTO 12330
      IF Found THEN _
         WasD$ = "User already exists" : _
         GOSUB 1315 : _
         GOSUB 12984 : _
         GOTO 12330
12310 GOSUB 12630
      GOSUB 12800
      GOSUB 11395
      ZTempSecLevel = WasOF
      GOSUB 12900
      LSET ZLastDateTimeOn$ = ZCurDate$ + _
                                " " + _
                                ZTimeLoggedOn$
      GOSUB 12960
      CALL AllCaps (ZUserIn$)
      LSET ZCityState$ = ZUserIn$
      LSET ZElapsedTime$ = MKI$(0)
      IF ZStartHash > 1 THEN _
         MID$(ZUserRecord$,ZStartHash,ZLenHash) = HashValue$
      IF ZStartIndiv > 1 THEN _
         MID$(ZUserRecord$,ZStartIndiv,ZLenIndiv) = ZIndivValue$     ' RC050901
      GOSUB 9440
12320 GOSUB 12991
12330 ZUserSecLevel = UserSecLevelSave
      ZFirstName$ = FirstNameSave$
      ZLastName$ = LastNameSave$
      ZActiveUserName$ = ActiveUserNameSave$
      ZWasCI$ = CityStateSave$
      HashValue$ = HashValueSave$
      ZIndivValue$ = IndivValueSave$                                 ' RC050901
      ZUserFileIndex = WasTU
      LSET ZUserRecord$ = UserRecordHold$
      GOTO 11001
'
' *  GET USER First AND Last NAMES
'
12500 IF Attempts > 5 THEN _
         ZFF = ZTrue : _
         RETURN
12510 GOSUB 12700
      Attempts = Attempts + 1
      ZOutTxt$ = WasA1$ + _
           ZFirstNamePrompt$
      CALL SkipLine (1)
      ZLogonActive = ZTrue
      GOSUB 12555
      ZLogonActive = ZFalse
      CALL Trim (ZWasZ$)
      ZFirstName$ = ZWasZ$
12530 ZOutTxt$ = WasA1$ + _
           ZLastNamePrompt$
      ZParseOff = ZTrue
      GOSUB 12555
12540 CALL Trim (ZWasZ$)
      ZLastName$ = ZWasZ$
      IF LEN(ZLastName$) < 2 THEN _
         IF LEN(ZFirstName$) > 2 THEN _
            GOTO 12500
      IF (LEN(ZFirstName$) + LEN(ZLastName$)) > 30 THEN _
         GOTO 12500
      IF UserSecLevelSave < ZSysopSecLevel THEN _
         IF (LEN(ZFirstName$) < 2 OR LEN(ZLastName$) < 2) THEN _
            GOTO 12500 _
         ELSE IF LEFT$(ZFirstName$,1)=" " OR LEFT$(ZLastName$,1)=" " THEN _
                 GOTO 12500
12550 ZActiveUserName$ = MID$(ZFirstName$ + " " + ZLastName$,1,31)
      IF HashIndiv > 1 THEN _
         IF ZWasQ < 3 THEN _
            GOSUB 12558 : _
            IF ZNo THEN _
               GOTO 12500
      ZWasZ$ = ZFirstName$
      RETURN
'
' *  CHECK FOR NAMES NOT ALLOWED
'
12555 GOSUB 12932
      IF ZWasQ = 0 THEN _
         RETURN 12500
12556 ZWasZ$ = ZUserIn$(ZAnsIndex)
12557 CALL AllCaps (ZWasZ$)
      CALL RemNonAlf (ZWasZ$,31,91)
      RETURN
12558 ZOutTxt$ = "Are you '" + _
           ZActiveUserName$ + _
           "' ([Y],N)"
      GOSUB 12995
      RETURN
12570 Found = ZFalse
      CALL OpenWork (2,ZTrashcanFile$)
      IF ZErrCode <> 0 THEN _                                        ' KG032601
         ZErrCode = 0 : _                                            ' KG032601
         RETURN                                                      ' KG032601
12580 IF EOF(2) THEN _
         RETURN
      INPUT #2,InvalidName$
      IF ZWasZ$ <> InvalidName$ THEN _
         GOTO 12580
      Found = ZTrue
      RETURN
12595 CALL QuickTPut1 ("Name not valid here. Call recorded")
      CALL UpdtCalr ("Name violation: "+ZActiveUserName$,1)
      GOTO 10621
'
' *  COMMON SEARCH USER FILE ROUTINE
'
12598 TempHashValue$ = HashValue$
      TempIndivValue$ = ZIndivValue$                                 ' RC050901
12600 GOSUB 4910
      GOSUB 12988
      IF ZInConfMenu THEN _
         IF NOT ZPrivateDoor THEN _
            CALL QuickTPut1 ("Checking Users...")
12605 CALL OpenUser (HighestUserRecord)
      GOSUB 9450
      CALL FindUser (TempHashValue$,TempIndivValue$,ZStartHash,ZLenHash,_
                     ZStartIndiv,ZLenIndiv,HighestUserRecord,Found,_
                     ZUserFileIndex,ZWasSL)
     IF Found THEN _
        RETURN
     IF CurUserCount < (HighestUserRecord-1)*.95 THEN _
        RETURN
     ZOutTxt$ = "No room for new users in " + ZConfName$
     CALL UpdtCalr (ZOutTxt$,2)
     IF ZActiveUserFile$ <> ZMainUserFile$ THEN _
        ZUserFileIndex = 0 : _
        RETURN
      IF ZRememberNewUsers AND NOT ZSurviveNoUserRoom THEN _
         GOSUB 1397
      ZUserFileIndex = 0
      IF ZSurviveNoUserRoom THEN _
         ZRememberNewUsers = ZFalse
      RETURN
'
' *  AUGMENT USER COUNT, LOCK 4 REC BLOCK IN USER, UNLOCK FILES
'
12630 GOSUB 23000
      CurUserCount = CurUserCount + (ZWasSL = 0) * ZRememberNewUsers
12632 GOSUB 24000
      GOSUB 12985
      IF ZRememberNewUsers THEN _
         GOSUB 12989
      GOSUB 12990
      RETURN
'
' *  INFORM USER OF WHAT CONFERENCE USER FILE HE IS VIEWING
'
12700 IF ZConfMode THEN _
         ZOutTxt$ = "Users of " + _
              ZConfName$ + _
              ":" : _
         GOSUB 12979
      RETURN
'
' *  GET PASSWORD FROM NEWUSER
'
12800 CALL NewPassword ("Enter PASSWORD you'll use to logon again",ZFalse)
      IF ZSubParm < 0 THEN _
         GOTO 202
      IF UserSecLevelSave < ZSysopSecLevel THEN _
         IF ZUserIn$ = SPACE$(LEN(ZUserIn$)) THEN _
            GOTO 12800
      LSET ZPswd$ = ZWasZ$
      RETURN
'
' *  GET HASH VALUE FOR CURRENT USER TO LOOK UP IN THE USER'S FILE
'
12840 IF ZStartHash = 1 THEN _
         HashValue$ = ZActiveUserName$ : _
         RETURN
      WasX$ = WasA1$ + _
           ZPromptHash$
      CALL UntilRight (WasX$,HashValue$,2,ZLenHash)
      RETURN
'
' *  GET FIELD TO INDIVIDUATE ONE USER FROM ANOTHER (NAME FIELD IS DEFAULT)
'
12850 IF ZStartIndiv < 1 THEN _
         RETURN
      IF ZStartIndiv = 1 THEN _
         ZIndivValue$ = ZActiveUserName$ : _                         ' RC050901
         RETURN
      IF ZExitToDoors THEN _                                         ' RC050901
         RETURN                                                      ' RC050901
      WasX$ = WasA1$ + _
           ZPromptIndiv$
      CALL UntilRight (WasX$,ZIndivValue$,2,ZLenIndiv)               ' RC050901
      RETURN
'
' *  SET NEWUSER DEFAULTS
'
12900 LSET ZUserName$ = ZActiveUserName$
      LSET ZUserOption$ = MKI$(0) + _
                           MKI$(0) + _
                           " 0" + _
                           MKI$(64) + _
                           MKI$(16) + _
                           MKI$(0) + _
                           CHR$(23) + _
                           ZDefaultEchoer$
      LSET ZUserDnlds$ = MKI$(0)
      LSET ZUserUplds$ = MKI$(0)
      IF ZEnforceRatios THEN _
         LSET ZTodayDl$ = MKS$(0) : _
         LSET ZTodayBytes$ = MKS$(0) : _
         LSET ZDlBytes$ = MKS$(0) : _
         LSET ZULBytes$ = MKS$(0)
      LSET ZSecLevel$ = MKI$(ZTempSecLevel)
      LSET ZElapsedTime$ = MKI$(0)
      RETURN
12930 ZTurboKey = -ZTurboKeyUser
12932 CALL PopCmdStack
      GOTO 12997
'
' *  GET CITY AND STATE FROM NEWUSER
'
12960 ZOutTxt$ = WasA1$ + _
           ZUserLocation$
      GOSUB 12995
      IF ZWasQ = 0 THEN _
         GOTO 12960
      IF ZUserIn$ = SPACE$(LEN(ZUserIn$)) THEN _
         GOTO 12960
      CALL AllCaps (ZUserIn$)
      LSET ZCityState$ = ZUserIn$
      ZWasCI$ = ZUserIn$
      RETURN
'
' *  S - COMMAND FROM 5 - USER MAINTENANCE OPTIONS (SCAN USERS)
'
12962 WasX = 0
      ZFF = ZFalse
      ZMacroMin = 99
      ZOutTxt$ = "String to search"
      GOSUB 12998
      IF ZWasQ = 0 THEN _
         GOTO 11001
      CALL AllCaps (ZUserIn$)
      WasWK$ = ZUserIn$
      IF ScanFunction$ = "L" THEN _
         WasWK$ = "," + _
               STR$(VAL(WasWK$)) + _
               ","
12963 GET 5,WasI
      GOSUB 12966
      WasX = INSTR(ScanField$,WasWK$)
      IF WasX > 0 THEN _
         GOTO 11015
12965 WasI = WasI + 1
      IF WasI > HighestUserRecord THEN _
         LSET ZUserRecord$ = UserRecordHold$ : _
         GOTO 11001
      WasX = 0
      GOTO 12963
12966 ZFF = INSTR("NCPLH",ScanFunction$)
12967 ON ZFF GOTO 12968,12969,12970,12972,12971
      GOTO 11001
'
' *  N - COMMAND FROM 5 - USER MAINTENANCE SCAN FUNCTION (SEARCH FOR NAME)
'
12968 ScanField$ = ZUserName$
      RETURN
'
' *  C - COMMAND FROM 5 - USER MAINTENANCE SCAN FUNCTION (SEARCH FOR CITY/ST)
'
12969 ScanField$ = ZCityState$
      RETURN
'
' *  P - COMMAND FROM 5 - USER MAINTENANCE SCAN FUNCTION (SEARCH FOR PASSWORD)
'
12970 ScanField$ = ZPswd$
      RETURN
'
' *  H - COMMAND FROM 5 - USER MAINTENANCE SCAN FUNCTION (SEARCH FOR HASH ID)
'
12971 IF ZStartHash > 0 AND ZLenHash > 0 THEN _
         ScanField$ = MID$(ZUserRecord$,ZStartHash,ZLenHash)
      RETURN
'
' *  L - COMMAND FROM 5 - USER MAINTENANCE SCAN FUNCTION (SEARCH FOR LEVEL)
'
12972 ScanField$ = "," + _
                    STR$(CVI(ZSecLevel$)) + _
                    ","
      RETURN
'
' * CALLS INTO SEPARATELY COMPILED SUBROUTINES (RBBS-SUB)
'
'
' * STANDARD ENTRY FOR RBBS-PC'S COMMON TERMINAL OUTPUT ROUTINE
'
12975 ZSubParm = 1
      GOTO 12981
12976 ZSubParm = 2
      GOTO 12981
12977 ZSubParm = 3
      GOTO 12981
12978 ZSubParm = 4     ' no cr/lf                                    ' KG081702
      GOTO 12981
12979 ZSubParm = 5     ' cr/lf                                       ' KG081702
      GOTO 12981
12980 ZSubParm = 6
12981 CALL TPut
12983 IF ZSubParm < 0 THEN _
         GOTO 202
      IF ZSubParm = 8 THEN _
         GOSUB 12995
      RETURN
'
' * STANDARD ENTRY FOR RBBS-PC'S FILE LOCKING WHEN RUNNING MULTIPLE RBBS-PC'S
'
12984 ZSubParm = 1  ' LOCK USERS & MESSAGES
      GOTO 12994
12985 ZSubParm = 2  ' UNLOCK MESSAGES AND FLUSH
      Flushed = ZTrue
      GOTO 12994
12986 ZSubParm = 3  ' LOCK MESSAGES
      GOTO 12994
12987 ZSubParm = 4  ' UNLOCK MESSAGES
      GOTO 12994
12988 ZSubParm = 5  ' LOCK USERS
      GOTO 12994
12989 ZSubParm = 6  ' LOCK USER BLOCK
      GOTO 12994
12990 ZSubParm = 7  ' UNLOCK USERS
      GOTO 12994
12991 ZSubParm = 8  ' UNLOCK USER BLOCK
      GOTO 12994
12992 ZSubParm = 9  ' LOCK COMMENTS/UPLOAD DIR
      GOTO 12994
12993 ZSubParm = 10 ' UNLOCK COMMENTS/UPLOAD DIR
12994 CALL FileLock
      IF Flushed THEN _
         FIELD 1,128 AS ZMsgRec$ : _
         Flushed = ZFalse
      IF ZSubParm = -1 THEN _
         ZSubParm = -9 : _
         CALL FindFKey : _
         GOTO 202
      RETURN
'
' * STANDARD ENTRY FOR RBBS-PC'S COMMON TERMINAL INPUT ROUTINE
'
12995 GOSUB 12997
      ZSubParm = 1
12996 CALL TGet
12997 IF ZSubParm < 0 THEN _
         GOTO 202
      RETURN
12998 ZOutTxt$ = ZOutTxt$ + _
           ZPressEnter$
      GOTO 12995
12999 ZTurboKey = -ZTurboKeyUser
      GOTO 12995
'
' *  MAIN SYSTEM ERROR TRAP - ALL ERRORS PASS THROUGH THIS ROUTINE
'
13000 IF ZDebug THEN _
         ZOutTxt$ = "DEBUG Trap ERL=" + _
              STR$(ZWasEL) + _
              " ERR=" + _
              STR$(ZErrCode) : _
              CALL Printit(ZOutTxt$) : _
              WasD$ = ZOutTxt$ : _
              GOSUB 1315
      IF ZWasEL = 1905 AND ZErrCode = 63 THEN _
         CLOSE 1 : _
         KILL ZActiveMessageFile$ : _
         GOTO 5350
      IF ZWasEL = 4371 AND ZErrCode = 6 THEN _
         GOTO 1200
      IF ZWasEL =  4740 THEN _
         GOTO 4745
      IF ZWasEL =  5151 AND ZErrCode = 62 THEN _
         CALL UpdtCalr (ZPswdFile$ + " bad format!",2) : _
         GOTO 5160
13500 CALL LogError
      CALL QuickTPut1 (ZCallersRecord$)
      GOTO 1200
'
' * COMMON EXIT FROM RBBS-PC (I.E. "ABANDON ALL HOPE OH YE WHO ENTER HERE")
'
13538 CALL UpdtCalr ("No calls.  Recycling.",1)
      GOTO 13549
13540 IF ZLocalUser THEN _
         IF NOT ZLocalUserMode THEN _
            GOTO 13549
13543 IF (NOT ZSysop) THEN _
         IF ((ZUserFileIndex = 0 AND ZRememberNewUsers) OR _
            ZNewUser = ZTrue) THEN _
            GOTO 13549
13545 CALL UpdateC
13549 GOSUB 13700
      IF ZLocalUser OR _
         ZModemOffHook THEN _
         GOTO 13555
      IF NOT ZFossil THEN _
         OUT ZModemCntlReg,INP(ZModemCntlReg) AND 254 : _
         CALL DelayTime (ZDTRDropDelay) : _
         OUT ZModemCntlReg,INP(ZModemCntlReg) OR 1 : _
         GOTO 13553
13550 CALL FosStatus(ZComPort,Status)
      Status = Status AND &H4000
      IF Status <> &H4000 THEN _
         CALL DelayTime (8 + ZBPS)
      State=0
      CALL FosDTR(ZComPort,State)
      CALL DelayTime (ZDTRDropDelay)
      State=1
      CALL FosDTR(ZComPort,State)
13553 CALL DelayTime (ZDTRDropDelay)
      CALL TakeOffHook
13555 ZActiveMessageFile$ = ZOrigMsgFile$
      GOSUB 12986
      GOSUB 5344
      GET 1,ZNodeRecIndex
      MID$(ZMsgRec$,57,1) = "I"
      MID$(ZMsgRec$,40,2) = " 0"
      MID$(ZMsgRec$,72,2) = " 0"
      IF MID$(ZMsgRec$,101,2) = ZCarriageReturn$+ZCarriageReturn$ THEN _ ' KG030602
         MID$(ZMsgRec$,101,2) = " 0"                                 ' KG030602
      PUT 1,ZNodeRecIndex
      GOSUB 12985
      CLOSE 1,2,4,5
      IF NOT ZFossil THEN _
         CLOSE 3
      IF ZRecycleToDos THEN _
         GOTO 203
      RUN 100
13600 CLS
      LOCATE ,,0
      CALL PScrn (ZWasDF$ + " file missing/invalid.  Run CONFIG")    ' KG071301
      CALL DelayTime (3)
      GOTO 203
13700 IF ZMsgFileLock THEN _
         GOSUB 12987
13710 IF ZUserFileLock THEN _
         GOSUB 12990
13720 IF ZUserBlockLock THEN _
         GOSUB 12991
      RETURN
'
' *  C/R - COMMAND FROM 5 - USER MAINTENANCE SCAN FUNCTION (QUIT TO MAIN MENU)
'
20093 LSET ZUserRecord$ = UserRecordHold$
      GOSUB 9500
20095 RETURN 1200
'
' *  V - COMMAND FROM FILES MENU (VIEW ARC CONTENTS)
'
20140 CALL GetArc
      IF ZSubParm = -1 THEN _
         GOTO 13540
      IF ZDenyAccess THEN _
         GOTO 1386
      RETURN
'
' * GO TO THE FILE SYSTEM TO LIST THE SYSOP'S COMMENTS
'
20150 ZFileSysParm = 1
      GOTO 20200
'
' * GO TO THE FILE SYSTEM TO LIST THE FILE DIRECTORIES
'
20155 ZFileSysParm = 2
      GOTO 20200
'
' * GO TO THE FILE SYSTEM TO DOWNLOAD FILES
'
20160 ZFileSysParm = 3
      GOTO 20200
'
' * GO TO THE FILE SYSTEM WHEN RETURNING FROM EXTERNAL PROTOCOLS
'
20165 ZFileSysParm = 4
      GOTO 20200
'
' * GO TO THE FILE SYSTEM TO UPLOAD FILES
'
20170 ZFileSysParm = 5
      GOTO 20200
'
' * GO TO THE FILE SYSTEM TO SCAN FILE SYSTEM DIRECTORIES
'
20175 ZFileSysParm = 6
      GOTO 20200
'
' * GO TO THE FILE SYSTEM TO HANDLE "PERSONAL" FILES
'
20180 ZFileSysParm = 7
      GOTO 20200
'
' * GO TO THE FILE SYSTEM TO LIST "NEW" FILES
'
20185 ZFileSysParm = 8
      GOTO 20200
'
' * RETURN TO THE FILE SYSTEM AFTER HANDLING EXTENDED FILE DESCRIPTIONS
'
20190 ZFileSysParm = 9
20200 CALL FileSystem
      ON ZFileSysParm GOTO 20205, _
                                20210, _
                                20215, _
                                20220, _
                                20225, _
                                20230, _
                                20235
20205 RETURN
20210 RETURN 202
20215 RETURN 1200
20220 RETURN 1380
20225 ZSysopComment = ZTrue
      ZMaxMsgLines = ZMaxExtendedLines
      GOSUB 2008
      GOTO 20190
20230 RETURN 10553
20235 RETURN 10595
'
' *  GET MESSAGE HEADER RECORD DATA
'
23000 GET 1,1
      HighMsgNumber = VAL(LEFT$(ZMsgRec$,8))
      AutoAddSec   = CVI(MID$(ZMsgRec$,9,2))
      CallsToDate! = VAL(MID$(ZMsgRec$,11,10))
      CurUserCount = VAL(MID$(ZMsgRec$,57,5))
      FirstMsgRecord = VAL(MID$(ZMsgRec$,68,7))
      ZNextMsgRec = VAL(MID$(ZMsgRec$,75,7))
      HighestMsgRecord = VAL(MID$(ZMsgRec$,82,7))
      IF ZActiveMessageFile$ = ZOrigMsgFile$ THEN _
         NodesInSystem = VAL(MID$(ZMsgRec$,127))
      RETURN
23100 GET 1,ZNextMsgRec
      IF MID$(ZMsgRec$,61,1) = ":" THEN _
         CALL CheckInt (MID$(ZMsgRec$,117,4)) : _
         IF ZErrCode = 0 AND (ZTestedIntValue > 1) AND (ZTestedIntValue < 100) THEN _
            WasY = ZTestedIntValue : _
            CALL CheckInt (MID$(ZMsgRec$,2,4)) : _
            IF ZErrCode = 0 AND ZTestedIntValue > HighMsgNumber THEN _
               HighMsgNumber = ZTestedIntValue : _
               ZNextMsgRec = ZNextMsgRec + WasY : _
               CALL QuickTPut1 ("Fixing Msg Header") : _             ' KG071301
               MsgCorrected = ZTrue : _
               GOTO 23100
      RETURN
'
' *  UPDATE MESSAGE HEADER RECORD DATA
'
24000 MID$(ZMsgRec$,1,8) = STR$(HighMsgNumber)
      MID$(ZMsgRec$,11,10) = STR$(CallsToDate!)
      MID$(ZMsgRec$,57,5) = STR$(CurUserCount)
      MID$(ZMsgRec$,68,7) = STR$(FirstMsgRecord)
      MID$(ZMsgRec$,75,7) = STR$(ZNextMsgRec)
      MID$(ZMsgRec$,82,7) = STR$(HighestMsgRecord)
      PUT 1,1
      RETURN
'
' * A - COMMAND FROM Library MENU (ARCHIVE A SELECTED Library DISK)
'
30000 ZSubParm = 4
      CALL Library
      IF ZSubParm = -1 THEN _
         RETURN 10595
      RETURN
'
' * C - COMMAND FROM Library MENU (CHANGE TO A Library DISK)
'
30100 ZSubParm = 2
      CALL Library
      RETURN
'
' * D - COMMAND FROM Library MENU (DOWNLOAD A DISK/FILE FROM Library)
'
30200 IF ZTimeLock AND 2 AND NOT ZHasPrivDoor THEN _
         CALL TimeLock : _
         IF NOT ZOK THEN _
            RETURN
      IF ZLibDiskChar$ = "0000" THEN _
         CALL QuickTPut1 ("You must select a Library disk first!") : _
         RETURN
      ZSubParm = 3
      CALL Library
      GOTO 20160
'
' * CALCULATE TIME REMAINING FOR USER
'
41000 CALL CheckTimeRemain (MinsRemaining)
      IF ZSubParm = -1 THEN _
         RETURN 10553
      RETURN
'
' * SHOW USER CURRENT ACCESS LEVEL
'
41070 ZOutTxt$ = "Granted access level" + _
           STR$(ZUserSecLevel) + _
           MID$(" (SYSOP)",1,-8 * (ZUserSecLevel >= ZSysopSecLevel))
      GOSUB 12975
      RETURN
'
' * NULLS SET FOR NEW USERS
'
42700 CALL SkipLine (1)
      CALL QuickTPut1 ("TurboKey: act on 1 char command without waiting for [ENTER]")
      ZOutTxt$ = "Want TurboKeys (Y/[N])"
      GOSUB 12999
      ZTurboKeyUser = NOT ZYes
      CALL Toggle (8)
      RETURN
'
' *  F - COMMAND FROM UTILITY MENU (FILE Transfer DEFALUT MODE)
' *  FILE Transfer DEFAULT SET FOR NEW USERS
'
42800 ZFF = INSTR(ZDefaultXfer$,ZUserXferDefault$)
      IF ZFF = 0 THEN _
         ZFF = INSTR(ZInternalEquiv$,"N")
      CALL QuickTPut1 ("Current Protocol: "+MID$(ZDefaultXfer$,ZFF,1))
42805 ZOutTxt$ = "Default "
      CALL XferType (3,ZExpertUser)
      IF ZSubParm = -1 THEN _
         RETURN 10595
      ZUserXferDefault$ = ZWasFT$
42810 ZOutTxt$ = "Protocol: " + ZProtoPrompt$
      GOSUB 12979
      RETURN
'
' *  C - COMMAND FROM UTILITY MENU (CHANGE CASE Toggle)
' *  UPPER/LOWER CASE SET FOR NEW USERS
'
42850 GOSUB 9525
42851 ZOutTxt$ = "Change to R)BBS, C)aller's software" + _
           MID$(", I)ntermediate host",1,-20 * (ZHostEchoOn$ <> "")) + _
           ZPressEnterExpert$
      GOSUB 12930
      IF ZWasQ = 0 THEN _
         RETURN
42852 ZWasZ$ = LEFT$(ZUserIn$(ZAnsIndex),1)
      CALL AllCaps (ZWasZ$)
      IF INSTR("ICR",ZWasZ$) = 0 THEN _
         GOTO 42851
      ZEchoer$ = ZWasZ$
      CALL SetEcho (ZEchoer$)
      GOSUB 9525
      RETURN                                                         ' KG071301
' *  G - COMMAND FROM UTILITY MENU (GRAPHICS WANTED)
' *  Graphic MENUS SELECTION SET FOR NEW USERS
'
43000 GOSUB 43005
      GOTO 43022
43005 CALL AskGraphics
      IF ZSubParm = -1 THEN _
         RETURN 10595
      IF ZWasQ = 0 THEN _
         RETURN
43020 ZOutTxt$ = "Text Graphics: " + _                               ' DA071701
           MID$("None AsciiColor",ZWasGR * 5 + 1,5)
      GOSUB 12979
      RETURN
43022 IF ZEmphasizeOnDef$ = "" THEN _
         RETURN
      ZOutTxt$ = "Do you want colorized prompts ([Y],N)"             ' DA071701
      GOSUB 12999
      ZHiLiteOff = NOT ZNo
      CALL Toggle(5)
      RETURN
43025 CALL Graphic (ZUserGraphicDefault$,ZFileName$)
'
' *  DISPLAY NON-BREAKABLE TEXT FILES
'
43027 ZStopInterrupts = ZTrue
      CALL BufFile (ZFileName$,WasX)
      CALL Carrier
      IF ZSubParm = -1 THEN _
         RETURN 10595
      ZStopInterrupts = ZFalse
      RETURN
'
' * MAKE INPUT STRING HIDDEN (USE *'S TO ECHO INPUT)
'
45010 ZHidden = ZTrue
      GOSUB 12995
      ZHidden = ZFalse
      RETURN
