      ' $linesize: 132
      ' $title:  'CONFIG CPC17-2B, Copyright 1983-89 by D. Thomas Mack'
      ' WARNING !!! DO NOT CHANGE, BYPASS OR REMOVE LINE 10000-10230
10000 ' CONFIG.BAS (RBBS-PC VERSION CPC17-2B)
      ' by D.Thomas Mack
      '   The Second Ring
      '   39 Cranbury Dr.
      '   Trumbull, CT. 06611
      '
      ' *******************************NOTICE**********************************
      ' *  A limited license is granted to all users of this program and it's *
      ' *  companion program, RBBS-PC (ver. CPC17-2B), to make copies of this *
      ' *  program and distribute the copies to other users, on the following *
      ' *  conditions                                                         *
      ' *   1.   The copyright notices contained within this program are not  *
      ' *        altered, bypassed, or removed.                               *
      ' *   2.   The program is not to be disrtibuted to others in modified   *
      ' *        form (i.e. the line numbers must remain the same).           *
      ' *   3.   No fee is charged (or any other consideration received)      *
      ' *        for coping or distributing these programs without an express *
      ' *        written agreement with D. Thomas Mack, The Second Ring,      *
      ' *        39 Cranbury Dr., Trumbul, CT. 06611                          *
      ' *                                                                     *
      ' *      Copyright (c) 1983-1989 D. Thomas Mack, The Second Ring        *
      ' ***********************************************************************
'     $INCLUDE: 'CNFG-VAR.BAS'
      CLEAR
'
' ****************************************************************************
' *  DISPLAY THE CONFIG TITLE PAGE
' ****************************************************************************
'
      WIDTH 80
      CLS
      NOT.YET.IN$ = "[Not Implemented]"  ' Msg used in config for parm not yet implemented
      NONE.PICKED$ = "<none>"    ' Standardized message
      NUM.FILES = 8
      NUM.GLOBAL = 4
      NUM.MAIN = 18
      NUM.SYSOP = 7
      NUM.UTILITY = 12
      NUM.LIBRARY = 7
      VERSION.NUMBER$ = "17.2B"
      I! = FRE(C$)
      KEY OFF
      CALL CNFGINIT
      PRINT TAB(60)"tm"
      PRINT TAB(16) STRING$(15,205)" U S E R W A R E "STRING$(15,205)
      PRINT
      PRINT TAB(17)"Capital PC User Group User-Supported Software"
      PRINT
      X$ = "    "
      PRINT "Copyright (c) 1983-1989 D. Thomas Mack, 39 Cranbury Dr., Trumbull, CT. 06611"
      PRINT
      PRINT X$;"    If you use RBBS-PC " + CONFIG.VERSION$ + " and find" ' KG060704
      PRINT X$;"    it valuable, consider contributing to"           ' KG060704
      PRINT ""
      PRINT X$;"                 Capital PC Software Exchange"
      PRINT X$;"                     Post Office Box 6128"
      PRINT X$;"                Silver Spring, Maryland  20906"
      PRINT
      PRINT X$;"    You are free to copy and share RBBS-PC provided" ' KG060704
      PRINT X$;"      1.  This program is not distributed in modified form."
      PRINT X$;"      2.  No fee or consideration is charged for RBBS-PC itself."
10230 PRINT X$;"      3.  This notice is not bypassed or removed."
      PRINT
'
' *  DEFINE THE FUNCTIONS USED BY CONFIG
'
      DEF FNTI! = CSNG(FIX((VAL(MID$(TIME$,1,2)) * 60 * 60) _
                         + (VAL(MID$(TIME$,4,2)) * 60) _
                         + (VAL(MID$(TIME$,7,2)) * 1)))
      DEF FNHSH(X$) = ((ASC(X$) * 100  _
                         + ASC(MID$(X$,(LEN(X$)/2) + .1,1)) * 10  _
                         + ASC(RIGHT$(X$,1))) MOD MAX.USR.FILE.SIZE.FRM.DEF) + 1
      DEF FNHSH2(X$) = (ASC(MID$(X$,2,1)) * 10 + 7) MOD MAX.USR.FILE.SIZE.FRM.DEF
      DELAY! = FNTI! + 5
10480 GOSUB 60440
10490 LOCATE 22,15
      PRINT SPC(64)
      NODE.ID$ = ""
      IF COMMAND$ <> "" THEN _
        CONFIG.FILENAME$ = COMMAND$: _
        GOTO 10530
      CONFIG.FILENAME$ = "RBBS-PC.DEF"
      CALL GETNUMYN ("Will you be running multiple copies of RBBS-PC",AB)
      IF NOT AB THEN _
         GOTO 10530
10510 GOSUB 22480
'
' * CHECK TO SEE IF AN EXISTING "RBBS-PC.DEF" FILE EXISTS
'
10530 ON ERROR GOTO 60010
      FILE$ = CONFIG.FILENAME$
      GOSUB 30000
      M$ = "Z"
      NO.DEF.FILE = FALSE
      SUBBOARD = FALSE
      IF OKAY THEN _
         CALL CNFGINIT : _
         GOTO 10536
      IF LEN(CONFIG.FILENAME$) > 7 OR _
         INSTR(CONFIG.FILENAME$,".") <> 0 THEN _
         GOTO 10531
      FILE$ = FILE$ + "C.DEF"
      GOSUB 30000
      IF OKAY THEN _
         CALL CNFGINIT : _
         CONFIG.FILENAME$ = FILE$ : _
         GOTO 10536
      CALL GETNUMYN ("Are you setting up a 'sub-board'",AB)
      IF NOT AB THEN _
         GOTO 10531
      SUBBOARD = TRUE
      BASE.NAME$ = CONFIG.FILENAME$
      CONFIG.FILENAME$   = CONFIG.FILENAME$+"C.DEF"
10531 A$ = "Configuration file " + CONFIG.FILENAME$ + " not found.  Create new one"
      CALL GETNUMYN (A$,AB)
      IF NOT AB THEN _
         SYSTEM
10532 X$ = "default location for RBBS files"
      GOSUB 15205
      DD$ = HJ$
      CALL CNFGINIT
      GOSUB 15790
      BULLETIN.MENU$ = DRIVE.FOR.BULLETINS$ + _
                       BULLETIN.MENU$
      BULLETIN.PREFIX$ = DRIVE.FOR.BULLETINS$ + _
                         BULLETIN.PREFIX$
      NO.DEF.FILE = TRUE
      GOTO 11710
10536 OPEN "I",#1,CONFIG.FILENAME$
'
' * READ IN THE PARAMETERS FROM AN EXISTING "RBBS-PC.DEF" FILE
'
11600 INPUT #1,CONFIG.FILE.VER$, _
               DOWNLOAD.DRIVES$, _
               SYSOP.PASSWORD.1$, _
               SYSOP.PASSWORD.2$, _
               SYSOP.FIRST.NAME$, _
               SYSOP.LAST.NAME$, _
               REQUIRED.RINGS, _
               START.OFFICE.HOURS, _
               END.OFFICE.HOURS, _
               MINUTES.PER.SESSION!, _
               MAX.ALLOWED.MSGS.FRM.DEF, _
               ACT.MNTHS.B4.DELETING, _
               UPLOAD.DIRECTORY$, _
               EXPERT.USER, _
               ACTIVE.BULLETINS, _
               PROMPT.BELL, _
               PCJR, _
               MENUS.CAN.PAUSE, _
               MENU$(1), _
               MENU$(2), _
               MENU$(3), _
               MENU$(4), _
               MENU$(5), _
               MENU$(6), _
               CONFERENCE.MENU$, _
               CONFERENCE.VIEWER.SEC.LVL, _
               WELCOME.INTERRUPTABLE, _
               REMIND.FILE.TRANSFERS, _
               PAGE.LENGTH, _
               MAX.MESSAGE.LINES, _
               DOORS.AVAILABLE, _
               MO$
      IF CONFIG.FILE.VER$ > VERSION.NUMBER$ OR _
         CONFIG.FILE.VER$ < "17.1A" THEN _
         PRINT "Config DEF file, " + CONFIG.FILENAME$ + " not " + CONFIG.VERSION$ : _
         END
      GOSUB 22340
11620 INPUT #1,MAIN.MESSAGE.FILE$, _
               MAIN.MESSAGE.BACKUP$, _
               CALLERS.FILE$, _
               COMMENTS.FILE$, _
               MAIN.USER.FILE$, _
               WELCOME.FILE$, _
               NEWUSER.FILE$, _
               DIRECTORY.EXTENTION$, _
               COM.PORT$, _
               BULLETINS.OPTIONAL, _
               USER.INIT.COMMAND$, _
               RTS$, _
               DOS.VERSION, _
               FG, _
               BG, _
               BORDER, _
               RBBS.BAT$, _
               RCTTY.BAT$
      GOSUB 22340
11640 INPUT #1,OMIT.MAIN.DIRECTORY$, _
               FIRST.NAME.PROMPT$, _
               HELP$(3), _
               HELP$(4), _
               HELP$(7), _
               HELP$(9), _
               BULLETIN.MENU$, _
               BULLETIN.PREFIX$, _
               DRIVE.FOR.BULLETINS$, _
               MESSAGE.REMINDER, _
               REQUIRE.NON.ASCII, _
               ASK.EXTENDED.DESC, _
               MAXIMUM.NUMBER.OF.NODES, _
               NETWORK.TYPE, _
               RECYCLE.TO.DOS, _
               MAX.USR.FILE.SIZE.FRM.DEF, _
               MAX.MSG.FILE.SIZE.FRM.DEF!, _
               TRASHCAN.FILE$
      DONT.ASK = TRUE
      GOSUB 21895
      DONT.ASK = FALSE
      GOSUB 22340
11660 INPUT #1,MINIMUM.LOGON.SECURITY, _
               DEFAULT.SECURITY.LEVEL, _
               SYSOP.SECURITY.LEVEL, _
               FILESEC.FILE$, _
               SYSOP.MENU.SECURITY.LEVEL, _
               CONFMAIL.LIST$, _
               MAXIMUM.VIOLATIONS, _
               SYSOP.FUNCTION(1), _
               SYSOP.FUNCTION(2), _
               SYSOP.FUNCTION(3), _
               SYSOP.FUNCTION(4), _
               SYSOP.FUNCTION(5), _
               SYSOP.FUNCTION(6), _
               SYSOP.FUNCTION(7), _
               PASSWORD.FILE$, _
               MAXIMUM.PASSWORD.CHANGES, _
               MINIMUM.SECURITY.FOR.TEMP.PASSWORD, _
               OVERWRITE.SECURITY.LEVEL, _
               DOORS.TERMINAL.TYPE, _
               MAX.PER.DAY
      GOSUB 22340
11680 INPUT #1,MAIN.FUNCTION(1), _
               MAIN.FUNCTION(2), _
               MAIN.FUNCTION(3), _
               MAIN.FUNCTION(4), _
               MAIN.FUNCTION(5), _
               MAIN.FUNCTION(6), _
               MAIN.FUNCTION(7), _
               MAIN.FUNCTION(8), _
               MAIN.FUNCTION(9), _
               MAIN.FUNCTION(10), _
               MAIN.FUNCTION(11), _
               MAIN.FUNCTION(12), _
               MAIN.FUNCTION(13), _
               MAIN.FUNCTION(14), _
               MAIN.FUNCTION(15), _
               MAIN.FUNCTION(16), _
               MAIN.FUNCTION(17), _
               MAIN.FUNCTION(18), _
               MIN.NEWCALLER.BAUD, _
               WAIT.BEFORE.DISCONNECT
      GOSUB 22340
11700 INPUT #1,FILES.FUNCTION(1), _
               FILES.FUNCTION(2), _
               FILES.FUNCTION(3), _
               FILES.FUNCTION(4), _
               FILES.FUNCTION(5), _
               FILES.FUNCTION(6), _
               FILES.FUNCTION(7), _
               FILES.FUNCTION(8), _
               UTILITY.FUNCTION(1), _
               UTILITY.FUNCTION(2), _
               UTILITY.FUNCTION(3), _
               UTILITY.FUNCTION(4), _
               UTILITY.FUNCTION(5), _
               UTILITY.FUNCTION(6), _
               UTILITY.FUNCTION(7), _
               UTILITY.FUNCTION(8), _
               UTILITY.FUNCTION(9), _
               UTILITY.FUNCTION(10), _
               UTILITY.FUNCTION(11), _
               UTILITY.FUNCTION(12), _
               GLOBAL.FUNCTION(1), _
               GLOBAL.FUNCTION(2), _
               GLOBAL.FUNCTION(3), _
               GLOBAL.FUNCTION(4), _
               UPLOAD.TIME.FACTOR!, _
               COMPUTER.TYPE, _
               REMIND.PROFILE, _
               RBBS.NAME$, _
               COMMANDS.BETWEEN.RINGS, _
               DF, _                                                 ' KG072303
               PAGING.PRINTER.SUPPORT$, _
               MODEM.INIT.BAUD$
      GOSUB 22340
11705 INPUT #1,TURN.PRINTER.OFF, _
               DIRECTORY.PATH$, _
               MIN.SEC.TO.VIEW, _
               LIMIT.SEARCH.TO.FMS, _
               DEFAULT.CATEGORY.CODE$, _
               DIR.CATEGORY.FILE$, _
               NEW.FILES.CHECK, _
               MAX.DESC.LEN, _
               SHOW.SECTION, _
               COMMANDS.IN.PROMPT, _
               NEWUSER.SETS.DEFAULTS, _
               HELP.PATH$, _
               HELP.EXTENSION$, _
               MAIN.COMMANDS$, _
               FILE.COMMANDS$, _
               UTIL.COMMANDS$, _
               GLOBAL.COMMANDS$, _
               SYSOP.COMMANDS$
      GOSUB 22340
11706 INPUT #1,RECYCLE.WAIT, _
               LIBRARY.FUNCTION(1), _
               LIBRARY.FUNCTION(2), _
               LIBRARY.FUNCTION(3), _
               LIBRARY.FUNCTION(4), _
               LIBRARY.FUNCTION(5), _
               LIBRARY.FUNCTION(6), _
               LIBRARY.FUNCTION(7), _
               LIBRARY.DRIVE$, _
               LIBRARY.DIRECTORY.PATH$, _
               LIBRARY.DIRECTORY.EXTENTION$, _
               LIBRARY.WORK.DISK.PATH$, _
               LIBRARY.MAX.DISK, _
               LIBRARY.MAX.DIRECTORY, _
               LIBRARY.MAX.SUBDIR, _
               LIBRARY.SUBDIR.PREFIX$, _
               LIBRARY.ARCHIVE.PATH$, _
               LIBRARY.ARCHIVE.PROGRAM$, _
               LIBRARY.COMMANDS$
      GOSUB 22340
      INPUT #1,UPLOAD.PATH$, _
               FMS.DIRECTORY$, _
               ANS.MENU$,_
               REQUIRED.QUESTIONNAIRE$,_
               REMEMBER.NEW.USERS, _
               SURVIVE.NOUSER.ROOM, _
               PROMPT.HASH$, _
               START.HASH, _
               LEN.HASH, _
               PROMPT.INDIV$, _
               START.INDIV, _
               LEN.INDIV
      GOSUB 22340
      INPUT #1,BYPASS.MSGS, _
               MUSIC, _
               RESTRICT.BY.DATE, _
               DAYS.TO.WARN, _
               DAYS.IN.SUBSCRIPTION.PERIOD, _
               VOICE.TYPE, _
               RESTRICT.VALID.CMDS, _
               NEW.USER.DEFAULT.MODE, _
               NEW.USER.LINE.FEEDS, _
               NEW.USER.NULLS, _
               NEW.USER.BELL, _
               NEW.USER.CASE, _
               MESSAGES.CAN.GROW, _
               WRAP.CALLERS.FILE$, _
               REDIRECT.IO.METHOD, _
               AUTO.UPGRADE.SEC, _
               HALT.ON.ERROR, _
               NEW.PUBLIC.MSGS.SECURITY, _
               NEW.PRIVATE.MSGS.SECURITY, _
               SECURITY.NEEDED.TO.CHANGE.MSGS, _
               SL.CATEGORIZE.UPLOADS, _
               BAUDOT, _
               TIME.TO.DROP.TO.DOS, _
               EXPIRED.SECURITY, _
               DTR.DROP.DELAY, _
               ASK.IDENTITY, _
               MAX.REG.SEC, _
               BUFFER.SIZE, _
               MLCOM, _
               SHOOT.YOURSELF, _
               DEFAULT.EXTENSION$, _
               NEW.USER.DEFAULT.PROTOCOL$, _
               NEW.USER.GRAPHICS$, _
               NET.MAIL$, _
               MASTER.DIRECTORY.NAME$, _
               PROTO.DEF$, _
               UPCAT.HELP$, _
               ALWAYS.STREW.TO$, _
               LAST.NAME.PROMPT$
      GOSUB 22340
      INPUT #1,PERSONAL.DRVPATH$, _
               PERSONAL.DIR$, _
               PERSONAL.BEGIN, _
               PERSONAL.LEN, _
               PERSONAL.PROTOCOL$, _
               PERSONAL.CONCAT , _
               PRIVATE.READ.SEC, _
               PUBLIC.READ.SEC, _
               SEC.CHANGE.MSG, _
               KEEP.INIT.BAUD, _
               MAIN.PUI$, _
               DEFAULT.ECHOER$, _
               HOST.ECHO.ON$, _
               HOST.ECHO.OFF$, _
               SWITCH.BACK, _
               DEFAULT.LINE.ACK$, _
               ALTDIR.EXTENSION$, _
               DIRECTORY.PREFIX$
      GOSUB 22340
      INPUT #1,SEC.LVL.EXEMPT.FRM.PURGING, _
               MODEM.INIT.WAIT.TIME, _
               MODEM.COMMAND.DELAY.TIME, _
               TURBO.RBBS
      GOSUB 22340
11707 INPUT #1,DNLD.SUB, _
               WILL.SUBDIRS.B.USED, _
               UPLOAD.TO.SUBDIR, _
               DOWNLOAD.TO.SUBDIR, _
               UPLOAD.SUBDIR$, _
               MIN.OLDCALLER.BAUD, _
               MAX.WORK.VAR, _
               DISKFULL.GO.OFFLINE, _
               EXTENDED.LOGGING, _
               USER.RESET.COMMAND$, _
               USER.COUNT.RINGS.COMMAND$, _
               USER.ANSWER.COMMAND$, _
               USER.GO.OFFHOOK.COMMAND$, _
               DISK.FOR.DOS$, _
               DUMB.MODEM, _
               COMMENTS.AS.MESSAGES, _
               LSB, _
               MSB, _
               LINE.CONTROL.REGISTER, _
               MODEM.CONTROL.REGISTER, _
               LINE.STATUS.REGISTER, _
               MODEM.STATUS.REGISTER
      GOSUB 22340
      INPUT #1,KEEP.TIME.CREDITS, _
               XON.XOFF, _
               ALLOW.CALLER.TURBO, _
               USE.DEVICE.DRIVER$, _
               PRELOG$, _
               NEW.USER.QUESTIONNAIRE$, _
               EPILOG$, _
               REGISTRATION.PROGRAM$, _
               QUES.PATH$, _
               USER.LOCATION$, _
               USER.INITIALIZE.COMMAND$, _
               USER.FIRMWARE.CLEAR.CMND$, _
               USER.FIRMWARE.WRITE.CMND$, _
               ENFORCE.UPLOAD.DOWNLOAD.RATIOS, _
               SIZE.OF.STACK, _
               SECURITY.EXEMPT.FROM.EPILOG, _
               USE.BASIC.WRITES, _
               DOSANSI, _
               ESCAPE.INSECURE, _
               USE.DIR.ORDER, _
               ADD.DIR.SECURITY, _
               MAX.EXTENDED.LINES, _
               DF$
      GOSUB 22340
      INPUT #1,LOGON.MAIL.LEVEL$, _
               MACRO.DRVPATH$, _
               MACRO.EXTENSION$, _
               EMPHASIZE.ON.DEF$, _
               EMPHASIZE.OFF.DEF$, _
               FG.1.DEF$, _
               FG.2.DEF$, _
               FG.3.DEF$, _
               FG.4.DEF$, _
               SECVIO.HLP$, _
               FOSSIL, _
               MAX.CARRIER.WAIT, _
               CALLER.BKGRD, _
               SMART.TEXT, _
               TIME.LOCK, _
               WRITE.BUF.DEF, _
               SEC.KILL.ANY, _
               DOORS.DEF$, _
               SCREEN.OUT.MSG$, _
               AUTOPAGE.DEF$
      GOSUB 21905
      GOSUB 22340
      IF MAX.CARRIER.WAIT < 1 THEN _
         MAX.CARRIER.WAIT = 30
      CALL ANSIDECODE (FG.1.DEF$)
      CALL ANSIDECODE (FG.2.DEF$)
      CALL ANSIDECODE (FG.3.DEF$)
      CALL ANSIDECODE (FG.4.DEF$)
      IF LEFT$(MACRO.EXTENSION$,1) = "." THEN _
         MACRO.EXTENSION$ = RIGHT$(MACRO.EXTENSION$,LEN(MACRO.EXTENSION$)-1)
      IF DNLD.SUB < 1 OR DNLD.SUB > 99 THEN _
         GOTO 11710
      FOR I = 1 TO DNLD.SUB
         INPUT #1,DNLD$(I)
      NEXT
      GOSUB 22340
'
' * CONVERT "RBBS-PC.DEF" PARAMETERS TO DISPLAYABLE VALUES, AS REQUIRED
'
11710 IF CALLERS.FILE$ = "" THEN _
         CALLERS.FILE$ = NONE.PICKED$
      IF ALTDIR.EXTENSION$ = "" THEN _
         ALTDIR.EXTENSION$ = NONE.PICKED$
      IF ALWAYS.STREW.TO$ = "" THEN _
         ALWAYS.STREW.TO$ = NONE.PICKED$
      IF QUES.PATH$ = "" THEN _
         QUES.PATH$ = NONE.PICKED$
      IF NEW.USER.QUESTIONNAIRE$ = "" THEN _
         NEW.USER.QUESTIONNAIRE$ = NONE.PICKED$
      IF REQUIRED.QUESTIONNAIRE$ = "" THEN _
         REQUIRED.QUESTIONNAIRE$ = NONE.PICKED$
      IF NET.MAIL$ = "NONE" THEN _
         NET.MAIL$ = NONE.PICKED$
      IF CONFMAIL.LIST$ = "" THEN _
         CONFMAIL.LIST$ = NONE.PICKED$
      X$ = BULLETIN.MENU$
      CALL BRKFNAME (X$,Z$,BULLETIN.MENU$,Y$,-1)
      IF Y$ <> "" THEN _
         BULLETIN.MENU$ = BULLETIN.MENU$ + Y$
      X$ = BULLETIN.PREFIX$
      CALL BRKFNAME (X$,Z$,BULLETIN.PREFIX$,Y$,-1)
      IF RECYCLE.TO.DOS = 0 THEN _
         RECYCLE.TO.DOS$ = "INTERNAL" _
      ELSE RECYCLE.TO.DOS$ = "SYSTEM
      HELP.FILE.PREFIX$ = LEFT$(HELP$(3),LEN(HELP$(3)) - 1)
      SF = SYSOP.FUNCTION(1)
      GOSUB 16062
      FOR I = 2 TO NUM.SYSOP
         IF SYSOP.FUNCTION(I) > SF THEN _
            GOTO 11790
         SF = SYSOP.FUNCTION(I)
11790 NEXT
      MM = MAIN.FUNCTION(1)
      FOR I = 1 TO NUM.MAIN
         MAIN.FUNCTION$(I,2) = MID$(MAIN.COMMANDS$,I,1)
         IF MAIN.FUNCTION(I)    > MM THEN _
            GOTO 11810
         MM = MAIN.FUNCTION(I)
11810 NEXT
      FC = FILES.FUNCTION(1)
      FOR I = 1 TO NUM.FILES
         FILES.FUNCTION$(I,2) = MID$(FILE.COMMANDS$,I,1)
         IF FILES.FUNCTION(I) > FC THEN _
            GOTO 11830
         FC = FILES.FUNCTION(I)
11830 NEXT
      UE = UTILITY.FUNCTION(1)
      FOR I = 1 TO NUM.UTILITY
         UTILITY.FUNCTION$(I,2) = MID$(UTIL.COMMANDS$,I,1)
         IF UTILITY.FUNCTION(I) > UE THEN _
            GOTO 11850
         UE = UTILITY.FUNCTION(I)
11850 NEXT
      PS = LIBRARY.FUNCTION(1)
      FOR I = 1 TO NUM.LIBRARY
         LIBRARY.FUNCTION$(I,2) = MID$(LIBRARY.COMMANDS$,I,1)
         IF LIBRARY.FUNCTION(I) > PS THEN _
           GOTO 11860
         PS = LIBRARY.FUNCTION(I)
11860 NEXT
      FOR I = 1 TO NUM.GLOBAL
         GLOBAL.FUNCTION$(I,2) = MID$(GLOBAL.COMMANDS$,I,1)
      NEXT
      CLOSE #1
      GOSUB 50480
      GOSUB 50530
11870 IF EXPERT.USER = 0 THEN _
         EXPERT.USER$ = "NOVICE
      IF EXPERT.USER = -1 THEN _
         EXPERT.USER$ = "EXPERT
      DRIVE.FOR.UPLOADS$ = RIGHT$(DOWNLOAD.DRIVES$,1)
      DRIVES.FOR.DOWNLOADS$ = LEFT$(DOWNLOAD.DRIVES$,(LEN(DOWNLOAD.DRIVES$) - 1))
      PROMPT.BELL$ = "ON"
      IF PROMPT.BELL = 0 THEN _
         PROMPT.BELL$ = "OFF
      GOSUB 15780
      IF SYSOP.PASSWORD.1$ = "" OR SYSOP.PASSWORD.2$ = "" THEN _
         MN1$ = "<Disabled>" : _
         MN2$ = "" _
      ELSE MN1$ = SYSOP.PASSWORD.1$ : _
           MN2$ = SYSOP.PASSWORD.2$
      M11$ = "NO"
      IF PAGING.PRINTER.SUPPORT$ = ". " + CHR$(7) THEN _
         M11$ = "YES"
      IF START.HASH < 1 THEN _
         START.HASH = 1
      IF LEN.HASH < 2 THEN _
         LEN.HASH = 31
      IF REQUIRED.QUESTIONNAIRE$ = "" THEN _
         REQUIRED.QUESTIONNAIRE$ = NONE.PICKED$
      GOSUB 18002
      GOSUB 18102
      I = 1
      GOSUB 13030
      IF NO.DEF.FILE = FALSE THEN _
         GOTO 12151
      IF NOT SUBBOARD THEN _
         GOTO 12151
      MAIN.MESSAGE.FILE$ = BASE.NAME$+"M.DEF"
      MAIN.USER.FILE$    = BASE.NAME$+"U.DEF"
12151 CONFERENCE.MODE = 0
      SUBBOARD = FALSE
      MAINMSG$ = MAIN.MESSAGE.FILE$
      MAINUSR$ = MAIN.USER.FILE$
12160 KEY OFF
'
' * IF A MESSAGE FILE EXISTS, READ IN THE PARAMETERS IN IT.
'
      FILE$ = MAIN.MESSAGE.FILE$
      GOSUB 30000
      NO.OLD.FILE = FALSE
      IF OKAY THEN _           ' IF MESSAGE FILE EXISTS, READ CHECKPOINT RECORD
         GOTO 12170
      NO.OLD.FILE = TRUE
      A$ = "Message file " + MAIN.MESSAGE.FILE$ + " not found.  Create new one"
      CALL GETNUMYN (A$,AB)
      IF NOT AB THEN _
         SYSTEM
      CALLS.TODATE! = 0                                 ' FIRST MSG#    -- 0
      FIRST.USER.RECORD = 1                             ' USERS file    -- first record number
      CURRENT.USER.COUNT = FIRST.USER.RECORD            ' USERS file    -- next available record number
      HIGHEST.USER.RECORD = MAX.USR.FILE.SIZE.FRM.DEF   ' USERS file    -- last record number
      FIRST.MESSAGE.RECORD = 2+MAXIMUM.NUMBER.OF.NODES  ' MESSAGES file -- first record of messages
      NEXT.MESSAGE.RECORD = FIRST.MESSAGE.RECORD        ' MESSAGES file -- next available record number
      HIGHEST.MESSAGE.RECORD = 5 * MAX.ALLOWED.MSGS.FRM.DEF _
                               + 1 _
                               + MAXIMUM.NUMBER.OF.NODES ' MESSAGES file -- last record number
      MAXIMUM.NUMBER.OF.MSGS = MAX.ALLOWED.MSGS.FRM.DEF  ' MESSAGES file -- maximum number of messages
      B1 = MAXIMUM.NUMBER.OF.NODES
      B3! = HIGHEST.MESSAGE.RECORD
      GOSUB 22080
      GOSUB 30450                        ' UPDATE CHECKPOINT RECORD
12170 GOSUB 30040                        ' READ THE CHECKPOINT RECORD
      MAX.MSG.FILE.SIZE.FRM.DEF! = HIGHEST.MESSAGE.RECORD
      MAX.ALLOWED.MSGS.FRM.DEF  = INT((HIGHEST.MESSAGE.RECORD - FIRST.MESSAGE.RECORD) / 5) + 1
      IF MAX.ALLOWED.MSGS.FRM.DEF > 999 THEN _
         MAX.ALLOWED.MSGS.FRM.DEF = 999
      IF MAXIMUM.NUMBER.OF.MSGS < 1 THEN _
         MAXIMUM.NUMBER.OF.MSGS = MAX.ALLOWED.MSGS.FRM.DEF : _
         GOSUB 30450                     ' READ THE CHECKPOINT RECORD
      FILE$ = MAIN.USER.FILE$            ' Check for USERS file
      GOSUB 30000
      NO.OLD.FILE = FALSE
      IF OKAY THEN _
         GOSUB 50500 : _
         GOTO 12189
      NO.OLD.FILE = TRUE
      B1 = MAX.USR.FILE.SIZE.FRM.DEF
      A$ = MAIN.USER.FILE$
      GOSUB 22140
      GOSUB 22150
12189 FOR I = 1 TO 10
         KEY I,""
      NEXT
      NO.OLD.FILE = FALSE
      B1 = MAX.USR.FILE.SIZE.FRM.DEF
      GOSUB 22140
      IF NO.DEF.FILE = FALSE THEN  _
         GOTO 12190
      GOSUB 18700
      NO.DEF.FILE = FALSE
'
' *  DISPLY CONFIG'S MAIN FUNCTION KEY MENU
'
12190 IF KSTACKED$ = "" THEN _
         IX = 0
12320 CALL DISPLAY
      IF IX = 21 THEN _
         GOTO 22350
      ON IPAGE GOTO 12622, _  ' 1        F1 - Global Parameters (part 1)
                    12624, _  ' 2        F2 - Global Parameters (part 2)
                    12626, _  ' 3        F3 - Global Parameters (part 3)
                    12628, _  ' 4        F4 - RBBS-PC System Files (part 1)
                    12630, _  ' 5        F5 - RBBS-PC System Files (part 2)
                    12632, _  ' 6        F6 - RBBS-PC "doors"
                    12634, _  ' 7        F7 - RBBS-PC security (part 1)
                    12636, _  ' 8        F8 - RBBS-PC security (part 2)
                    12640, _  ' 9        F9 - Multiple RBBS-PC parameters
                    12641, _  '10       F10 - RBBS-PC's Utilities
                    12642, _  '11  Shift-F1 - RBBS-PC File Manager
                    12643, _  '12  Shift-F2 - RBBS-PC comm. parameters (part 1)
                    12644, _  '13  Shift-F3 - RBBS-PC comm. parameters (part 2)
                    12645, _  '14  Shift-F4 - RBBS-PC Net Mail
                    12646, _  '15  Shift-F5 - New user's parameters
                    12647, _  '16  Shift-F6 - Library parameters
                    12648     '17  Shift-F7 - RBBS-PC Color parameters
'
' *  HANDLE UNSUPPORTED REQUEST
'
12325 IX = IPAGE
      GOTO 12320
12622 ON ILOOKUP GOSUB 12840, _  '   1 SYSOP's first name
                       12910, _  '   2 SYSOP's last name
                       13140, _  '   3 SYSOP's default signon mode
                       13210, _  '   4 SYSOP's office hours
                       13224, _  '   5 Page SYSOP with printer's bell
                       13249, _  '   6 Go off-line when disk is full
                       13750, _  '   7 Prompt bell
                       13840, _  '   8 Maximum minutes per session
                       16650, _  '   9 Maximum minutes per day
                       15234, _  '  10 Factor to extend time for uploads
                       13940, _  '  11 Months of inactivity before deleted
                       13131, _  '  12 Name of this RBBS-PC
                       15530, _  '  13 Foreground color
                       15590, _  '  14 Background color
                       15650, _  '  15 Border color
                       13320, _  '  16 ANSI.SYS in CONFIG.SYS?
                       13330, _  '  17 Control code for Smart Text
                       17725, _  '  18 AutoPage def file
                       13000, _  '  19 Level of logon mail report
                       12325     '  20
      GOTO 12325
12624 ON ILOOKUP GOSUB 15800, _  '  21 Remind users of messages they left
                       16690, _  '  22 Remind users of uploads and downloads
                       16722, _  '  23 Remind users of their profile
                       17600, _  '  24 Enable download of new files at logon
                       16730, _  '  25 Specify default page length
                       16790, _  '  26 Set maximum number of lines/message
                       16000, _  '  27 Is system "welcome" interruptable?
                       15840, _  '  28 Are the system bulletins optional?
                       16040, _  '  29 Type of PC running RBBS-PC
                       17230, _  '  30 Symbols for SYSOP's commands
                       17240, _  '  31 Symbols for main menu's commands
                       17250, _  '  32 Symbols for file menu's commands
                       17260, _  '  33 Symbols for utilities menu's commands
                       17264, _  '  34 Symbols for "global" commands
                       17500, _  '  35 Show section at command prompt?
                       17550, _  '  36 Show commands at command prompt?
                       15830, _  '  37 Restrict valid cmnds to current section
                       15820, _  '  38 Use machine language subroutines?
                       15825, _  '  39 Use BASIC PRINT for screen writes?
                       16795     '  40 Set max # of lines for extended desc
      GOTO 12325
12626 ON ILOOKUP GOSUB 18000, _  '  41 Field used to locate a users record
                       18100, _  '  42 Field to distinguish users with same id
                       17800, _  '  43 Where personal id begins in user rec
                       17810, _  '  44 Length of personal id in user rec
                       17830, _  '  45 First Name prompt
                       17840, _  '  46 Last Name prompt
                       17850, _  '  47 Enforce upload/download ratios
                       17630, _  '  48 Restrict users by date
                       18510, _  '  49 Security level when subscription expires
                       18530, _  '  50 Days before expiration to warn user
                       18520, _  '  51 Days a newuser gets when registers
                       17610, _  '  52 Turn printer off on recycle
                       17620, _  '  53 Play music for RBBS themes?
                       21760, _  '  54 Buffer size for text files
                       16032, _  '  55 Size of stack space to use
                       22550, _  '  56 Notify users when SYSOP wants system?
                       17845, _  '  57 Ask users their (city/state)
                       17625, _  '  58 Order show dirs for ALL option
                       21770, _  '  59 Buffer size on writes
                       21900     '  60 Voice synthesizer support
      GOTO 12325
12628 ON ILOOKUP GOSUB 14790, _  '  61 Drive and file describing bulletins
                       15290, _  '  62 Number of active bulletins
                       14800, _  '  63 Prefix used to name bulletin files
                       14810, _  '  64 Drive and path for 'help' files
                       14820, _  '  65 Prefix of nine major help files
                       14825, _  '  66 Extension for individual help files
                       14915, _  '  67 Help file for categorizing uploads
                       14830, _  '  68 Name of 'newuser' file
                       14840, _  '  69 Name of 'welcome" file
                       14860, _  '  70 Name of SYSOP's commands menu
                       14870, _  '  71 Name of main message command menu
                       14880, _  '  72 Name of file subsystem command menu
                       14890, _  '  73 Name of utilities command menu
                       14900, _  '  74 Menu listing available conferences
                       14905, _  '  75 Menu of questionnaires
                       14815, _  '  76 Drive/path for optional questionnaires
                       18310, _  '  77 Name of main PUI
                       15835, _  '  78 Can menus pause in the middle?
                       15850, _  '  79 Macro drive/path
                       15860     '  80 Macro extension
      GOTO 12325
12630 ON ILOOKUP GOSUB 14910, _  '  81 File of unacceptable user names
                       17700, _  '  82 Name of required questionnaire
                       17710, _  '  83 Name of "prelog" file
                       17720, _  '  84 Name of New User questionnaire
                       17730, _  '  85 Name of "epilog" questionnaire
                       15460, _  '  86 Name of 'message' file
                       15500, _  '  87 Name of 'user' file
                       15464, _  '  88 Name of 'comments' file
                       15993, _  '  89 Record comments as private messages?
                       15461, _  '  90 Name of 'callers' file
                       15991, _  '  91 Extened logging to 'callers' file?
                       22550, _  '  92 Wrap-around the 'callers' file?
                       12670, _  '  93 Conferences to search for new mail
                       21780, _  '  94 Max # of work variables
                       12325, _  '  95
                       12325, _  '  96
                       12325, _  '  97
                       12325, _  '  98
                       12325, _  '  99
                       12325     ' 100
      GOTO 12325
12632 ON ILOOKUP GOSUB 16290, _  ' 101 Are 'doors' available?
                       16130, _  ' 102 Name of menu listing available doors
                       16140, _  ' 103 Name of file built dynamically for doors
                       16150, _  ' 104 Name of .BAT the will re-invoke RBBS
                       16160, _  ' 105 Drive to look for COMMAND.COM on
                       16170, _  ' 106 Enable CTTY command for doors
                       18640, _  ' 107 Name of program to invoke at logon
                       17215, _  , 108 Who subject to logon door
                       18625, _  ' 109 Doors control file
                       12325, _  ' 110
                       12325, _  ' 111
                       12325, _  ' 112
                       12325, _  ' 113
                       12325, _  ' 114
                       12325, _  ' 115
                       12325, _  ' 116
                       12325, _  ' 117
                       12325, _  ' 118
                       12325, _  ' 119
                       12325     ' 120
      GOTO 12325
12634 ON ILOOKUP GOSUB 12980, _  ' 121 Pseudonym to sign on remotely as SYSOP
                       12990, _  ' 122 Escape logs on with no security
                       17160, _  ' 123 Minimum security level to logon
                       17170, _  ' 124 Default security level for new users
                       17180, _  ' 125 SYSOP's security level
                       17200, _  ' 126 Minimum security to see SYSOP's menu
                       17210, _  ' 127 Min security to add extended desc
                       17220, _  ' 128 Max # security violations allowed
                       17230, _  ' 129 Security levels for SYSOP commands
                       17240, _  ' 130 Security levels for main commands
                       17250, _  ' 131 Security levels for file commands
                       17260, _  ' 132 Security levels for utilities commands
                       17264, _  ' 133 Security level for 'global' commands'
                       17290, _  ' 134 Max # password changes allowed
                       17300, _  ' 135 Min. security for temp. passwords
                       17310, _  ' 136 Min. security to overwrite on uploads
                       17316, _  ' 137 User's security exempted from packing
                       15310, _  ' 138 Default security to read new Priv. Msg.
                       15320, _  ' 139 Default security to read new Public Msg.
                       15330     ' 140 Min. security to change msg.'s security
      GOTO 12325
12636 ON ILOOKUP GOSUB 22550, _  ' 141 Call back verification of all/new users
                       18630, _  ' 142 Drive/path for personal files
                       12750, _  ' 143 Name of personal directory
                       17820, _  ' 144 What protocol required for personal dnld
                       17190, _  ' 145 File listing download-secured files
                       17270, _  ' 146 File name with privileged passwords
                       17645, _  ' 147 Concatenate ASCII files in pers. dnld?
                       18515, _  ' 148 Security level to categorize uploads
                       18500, _  ' 149 Min. security to view new uploads
                       16033, _  ' 150 Security level exempt from "epilog"
                       18545, _  ' 151 Min. security to automatically add users
                       18340, _  ' 152 Min. security to use turbo logon
                       18345, _  ' 153 Min. security to add dir entry
                       17280, _  ' 154 Help file for security violation
                       18330, _  ' 155 Time Lock Selection
                       17640, _  ' 156 Auto upgrade security from main
                       17635, _  ' 157 Min sec to read/kill all msgs
                       13010, _  ' 158 How screen out lines from msg
                       12325, _  ' 159
                       12325     ' 160
      GOTO 12325
12640 ON ILOOKUP GOSUB 21750, _  ' 161 Maximum number of concurrent RBBS-PC's
                       21810, _  ' 162 Environment running RBBS-PC
                       21950, _  ' 163 Method that RBBS-PC re-cycles with
                       21910, _  ' 164 Number of records in 'user' file
                       22040, _  ' 165 Number of records in 'message' file
                       13890, _  ' 166 Maximum number of messages allowed
                       25040, _  ' 167 Conference file maintenance
                       14845, _  ' 168 Default extension compressed files
                       22030, _  ' 169 Can messages grow
                       12325, _  ' 170
                       12325, _  ' 171
                       12325, _  ' 172
                       12325, _  ' 173
                       12325, _  ' 174
                       12325, _  ' 175
                       12325, _  ' 176
                       12325, _  ' 177
                       12325, _  ' 178
                       12325, _  ' 179
                       12325     ' 180
      IF REFRESH = 1 THEN _
         REFRESH = 0 : _
         GOTO 12151
      IF REFRESH = 2 THEN _
         REFRESH = 0 : _
         GOTO 12160
      GOTO 12325
12641 ON ILOOKUP GOSUB 23160, _  ' 181 Pack the 'messages' file
                       22570, _  ' 182 Rebuild the 'user' file
                       23630, _  ' 183 Print the message headers
                       23740, _  ' 184 Renumber messages
                       23620, _  ' 185 Repair the 'message' file
                       24050, _  ' 186 Require users to answer questionnaire
                       24790, _  ' 187 Check FMS directory
                       13180, _  ' 188 Check Personal Download directory
                       18700, _  ' 189 Check critical parameters
                       18800, _  ' 190 Set New parameters
                       24795, _  ' 191 Reset active printers for all nodes
                       24040, _  ' 192 Set Highlight to match graphics
                       12325, _  ' 193
                       12325, _  ' 194
                       12325, _  ' 195
                       12325, _  ' 196
                       12325, _  ' 197
                       12325, _  ' 198
                       12325, _  ' 199
                       12325     ' 200
      GOTO 12325
12642 ON ILOOKUP GOSUB 14920, _  ' 201 Drive available for uploading
                       12730, _  ' 202 Name of directory for uploading
                       18550, _  ' 203 Drive/path for upload dir
                       13470, _  ' 204 Drive(s) available for downloading
                       25380, _  ' 205 Are DOS subdirectories used?
                       25420, _  ' 206 Upload to a DOS subdirectory?
                       25460, _  ' 207 Are downloads from DOS subdirectories?
                       25495, _  ' 208 List, change, add, delete subdir.?
                       14850, _  ' 209 Extension for file directories
                       14855, _  ' 210 Alternate directory extension
                       14857, _  ' 211 Name (prefix) of dir of dir
                       15920, _  ' 212 Omit directory list from N>ew command?
                       18350, _  ' 213 Copy upload descriptions to another file
                       12740, _  ' 214 FMS directory name
                       17590, _  ' 215 Limit file searches to upload dir
                       18200, _  ' 216 Default category codes for uploads
                       18300, _  ' 217 File name with valid category codes
                       18360, _  ' 218 Restrict dir search for 'ALL' to
                       18400, _  ' 219 Length of description of uploads
                       18600     ' 220 Drive/path directory files
      GOTO 12325
12643 ON ILOOKUP GOSUB 14120, _  ' 221 Communications Port being used
                       15240, _  ' 222 Seconds for modem to initalize
                       15250, _  ' 223 Seconds to wait before issuing cmds.
                       13228, _  ' 224 Number of rings to answer on
                       15710, _  ' 225 Use standard RBBS-PC modem commands
                       12325, _  ' 226 Microcom's MNP available?     ' KG072303
                       16121, _  ' 227 Issue modem commands between rings?
                       16124, _  ' 228 Baud rate to initially open modem at
                       16031, _  ' 229 Seconds to wait before disconnecting
                       16725, _  ' 230 Is a dumb modem being used?
                       23731, _  ' 231 Initialize Hayes 2400 firmware
                       18540, _  ' 232 DTR drop delay time
                       18620, _  ' 233 Where external protocol pgms are
                       17650, _  ' 234 Always check for autodownload support
                       15880, _  ' 235 Require non-ASCII protocol?
                       13280, _  ' 236 If no calls, recycle after
                       13290, _  ' 237 Leave modem at initial baud
                       12325, _  ' 238
                       12325, _  ' 239
                       12325     ' 240
      GOTO 12325
12644 ON ILOOKUP GOSUB 13295, _  ' 241 Switch back when change comm. parms.
                       13238, _  ' 242 Min. baud for new callers
                       13242, _  ' 243 Min. baud for old callers
                       13260, _  ' 244 Use CTS for modem flow control?
                       13310, _  ' 245 Use XON/XOFF for flow control
                       13270, _  ' 246 Max time to wait for carrier
                       12325, _  ' 247
                       12325, _  ' 248
                       12325, _  ' 249
                       12325, _  ' 250
                       12325, _  ' 251
                       12325, _  ' 252
                       12325, _  ' 253
                       12325, _  ' 254
                       12325, _  ' 255
                       12325, _  ' 256
                       12325, _  ' 257
                       12325, _  ' 258
                       12325, _  ' 259
                       12325     ' 260
      GOTO 12325
12645 ON ILOOKUP GOSUB 26040, _  ' 261 Time of day to drop to DOS
                       26070, _  ' 262 NET-MAIL driver to invoke
                       26100, _  ' 263 Echo on command for host
                       26110, _  ' 264 Echo off command for host
                       13285, _  ' 265 Echo remote input?
                       26105, _  ' 266 ASCII upload line acknowledge
                       12325, _  ' 267
                       12325, _  ' 268
                       12325, _  ' 269
                       12325, _  ' 270
                       12325, _  ' 271
                       12325, _  ' 272
                       12325, _  ' 273
                       12325, _  ' 274
                       12325, _  ' 275
                       12325, _  ' 276
                       12325, _  ' 277
                       12325, _  ' 278
                       12325, _  ' 279
                       12325     ' 280
      GOTO 12325
12646 ON ILOOKUP GOSUB 17560, _  ' 281 Prompt new users for their preferences
                       22550, _  ' 282 New users default sign-on mode
                       22550, _  ' 283 New users default file-transfer mode
                       22550, _  ' 284 Line feeds for new users default to
                       22550, _  ' 285 Nulls for new users default to
                       22550, _  ' 286 Prompt bell for new users defaults to
                       22550, _  ' 287 New users 'graphics' ability is
                       22550, _  ' 288 New users upper/lower case
                       22550, _  ' 289 New users margins defaults are
                       17570, _  ' 290 Remember new users
                       17580, _  ' 291 Survive no user room
                       12325, _  ' 292
                       12325, _  ' 293
                       12325, _  ' 294
                       12325, _  ' 295
                       12325, _  ' 296
                       12325, _  ' 297
                       12325, _  ' 298
                       12325, _  ' 299
                       12325     ' 300
      GOTO 12325
12647 ON ILOOKUP GOSUB 20000, _  ' 301 Drive for Library
                       20010, _  ' 302 Drive/path for directory
                       20020, _  ' 303 Extension for directory lists
                       20030, _  ' 304 Drive/path for work disk
                       20040, _  ' 305 # of disks in Library
                       20050, _  ' 306 # of Master directories
                       20060, _  ' 307 # of subdirectories in each master
                       20070, _  ' 308 Prefix of subdirectory on Library
                       20080, _  ' 309 Name of subsystem command menu
                       20090, _  ' 310 Symbols to use for menu commands
                       20090, _  ' 311 Security levels for menu functions
                       20100, _  ' 312 Drive/path of ARCHIVE utility
                       20110, _  ' 313 Name of ARCHIVE utility
                       12325, _  ' 314
                       12325, _  ' 315
                       12325, _  ' 316
                       12325, _  ' 317
                       12325, _  ' 318
                       12325, _  ' 319
                       12325     ' 320
      GOTO 12325
12648 ON ILOOKUP GOSUB 26115, _  ' 321 Turn on Emphasis
                       26120, _  ' 322 Restore text to normal
                       12850, _  ' 323 1st Foreground Color
                       12860, _  ' 324 2nd Foreground Color
                       12870, _  ' 325 3rd Foreground Color
                       12880, _  ' 326 4th Foreground Color
                       12890, _  ' 327 Caller Background Color
                       12325, _  ' 328
                       12325, _  ' 329
                       12325, _  ' 330
                       12325, _  ' 331
                       12325, _  ' 332
                       12325, _  ' 333
                       12325, _  ' 334
                       12325, _  ' 335
                       12325, _  ' 336
                       12325, _  ' 337
                       12325, _  ' 338
                       12325, _  ' 339
                       12325     ' 340
      GOTO 12325
'
' * LIST OF CONFERENCES TO SEARCH FOR NEW MAIL
'
12670 CALL GETNUMYN ("Do you want to notify callers of conference mail",X)
      IF NOT X THEN _
         CONFMAIL.LIST$ = NONE.PICKED$ : _
         RETURN
      GOSUB 17340
      GOSUB 17740
      CONFMAIL.LIST$ = HJ$
      RETURN
'
' * PROCESS NAME OF UPLOAD DIRECTORY
'
12730 CALL ASKRO("Name of upload directory (8 char. max)?",24,HJ$)
      IF LEN(HJ$) < 1 OR _
         LEN(HJ$) > 8 THEN _
         GOTO 12730
      CALL ALLCAPS (HJ$)
      UPLOAD.DIRECTORY$ = HJ$
      RETURN
'
' * Get the File Management System Directory
'
12740 CALL ASKRO("Name of File Management System (or NONE) directory (8 char. max)?",24,HJ$)
      IF LEN(HJ$) > 8 THEN _
         GOTO 12740
      CALL ALLCAPS (HJ$)
      FMS.DIRECTORY$ = HJ$
      IF FMS.DIRECTORY$ = "NONE" THEN _
         FMS.DIRECTORY$ = ""
      RETURN
12750 CALL ASKRO("Name (prefix, optional extension) of Personal directory",24,HJ$)
      IF LEN(HJ$) < 1 OR _
         LEN(HJ$) > 12 OR INSTR(HJ$,".") > 9 THEN _
         GOTO 12750
      CALL ALLCAPS (HJ$)
      PERSONAL.DIR$ = HJ$
      IF INSTR(PERSONAL.DIR$,".") < 1 THEN _
         PERSONAL.DIR$ = PERSONAL.DIR$ + _
                         ".DEF"
      IF (INSTR(PERSONAL.DIR$,":") < 1) AND _
         (INSTR(PERSONAL.DIR$,"\") < 1) THEN _
         PERSONAL.DIR$ = PERSONAL.DRVPATH$+PERSONAL.DIR$
      RETURN
'
' * GET THE SYSOP'S FIRST NAME
'
12840 CALL ASKRO("What is the SYSOP's FIRST Name?",24,HJ$)
      IF LEN(HJ$) < 3 THEN _
         GOTO 12840
      CALL ALLCAPS (HJ$)
      SYSOP.FIRST.NAME$ = HJ$
      RETURN
12850 CALL GETANSI (FG.1.DEF$," 1st")
      RETURN
12860 CALL GETANSI (FG.2.DEF$," 2nd")
      RETURN
12870 CALL GETANSI (FG.3.DEF$," 3rd")
      RETURN
12880 CALL GETANSI (FG.4.DEF$," 4th")
      RETURN
12890 CALL GETCOLOR("Caller's BACKGROUND color",CALLER.BKGRD)
      RETURN
'
' * PROCESS THE SYSOP'S LAST NAME
'
12910 CALL ASKRO("What is the SYSOP's LAST Name?",24,HJ$)
      IF LEN(HJ$) < 3 THEN _
         GOTO 12840
      CALL ALLCAPS (HJ$)
      SYSOP.LAST.NAME$ = HJ$
      RETURN
'
' * PROCESS THE "PSEUDONYM" (FIRST NAME) USED BY THE SYSOP TO LOGON REMOTELY
'
12980 CALL ASKRO("Secret first name that lets remote caller on as SYSOP is?",24,SYSOP.PASSWORD.1$)
      CALL ALLCAPS (SYSOP.PASSWORD.1$)
      IF SYSOP.PASSWORD.1$ = "" THEN _
         GOTO 12985
      MN1$ = SYSOP.PASSWORD.1$
      CALL ASKRO("Secret last name for remote SYSOP ([ENTER] disables)?",24,SYSOP.PASSWORD.2$)
      CALL ALLCAPS (SYSOP.PASSWORD.2$)
      IF SYSOP.PASSWORD.2$ = "" THEN _
         GOTO 12985
      MN2$ = SYSOP.PASSWORD.2$
      RETURN
12985 MN1$ = "(Disabled)"
      MN2$ = ""
      SYSOP.PASSWORD.1$ = ""                                         ' KG072801
      SYSOP.PASSWORD.2$ = ""                                         ' KG072801
      RETURN
12990 CALL GETNUMYN ("ESCAPE immediately lets on locally (NO=require name)",ESCAPE.INSECURE)
      RETURN
'
' * IDENTIFY THE TYPE OF USERS THAT CAN BYPASS THE MESSAGE SUBSYSTEM
'
13000 CALL ASKRO ("Mail to caller to report on logon: A)ll, N)ew only, S)kip (none)",24,HJ$)
      IF LEN(HJ$) < 1 THEN _
         GOTO 13000
      LOGON.MAIL.LEVEL$ = LEFT$(HJ$,1)
      CALL ALLCAPS (LOGON.MAIL.LEVEL$)
      IF INSTR("ANS",LOGON.MAIL.LEVEL$) = 0 THEN _
         GOTO 13000
      RETURN
13010 CALL ASKRO ("Exclude lines from msg display that begin with",24,SCREEN.OUT.MSG$)
      RETURN
13030 IF BYPASS = 0 THEN _
         BYPASS$ = "Any user" : _
         RETURN
      IF BYPASS = 1 THEN _
         BYPASS$ = "All but new users" : _
         RETURN
      IF BYPASS = 2 THEN _
         BYPASS$ = "Only EXPERT users" : _
         RETURN
      IF I = 0 THEN _
         CALL GETINIT ("Specify the security level required to bypass messages. ",24,-32767,32767,X,CR) : _
         X$=STR$(X)
      BYPASS$ = "Security >" + _
                STR$(VAL(X$)) + _
                " users"
      RETURN
'
' * ALLOW THE SYSOP TO GIVE THIS RBBS-PC A PERSONAL NAME
'
13131 CALL ASKRO("Enter name for this RBBS-PC (19 characters or less) ",24,HJ$)
      IF LEN(HJ$) > 19 THEN _
         GOTO 13131
      CALL ALLCAPS (HJ$)
      RBBS.NAME$ = HJ$
      RETURN
'
' * ALLOW THE SYSOP TO SELECT "EXPERT" OR "NOVICE" AS HIS DEFAULT MODE
'
13140 CALL ASKRO("SYSOP's default sign-on mode (E)xpert, N)ovice)? ",24,HJ$)
      IF LEN(HJ$) = 6 OR _
         LEN(HJ$) = 1 THEN _
         GOTO 13170
      GOTO 13140
13170 CALL ALLCAPS (HJ$)
      IF HJ$ = "E" OR _
         HJ$ = "EXPERT" THEN _
         EXPERT.USER$ = "EXPERT" : _
         RETURN
      IF HJ$ = "N" OR _
         HJ$ = "NOVICE" THEN _
         EXPERT.USER$ = "NOVICE" : _
         RETURN
      GOTO 13140
13180 CALL CHKPERSDIR (PERSONAL.DIR$,MAX.DESC.LEN,PERSONAL.LEN)
      RETURN
'
' * ALLOW THE SYSOP TO SELECT HIS "OFFICE HOURS"
'
13210 CALL GETINIT ("What is the earliest SYSOP wants to be paged? -- HHMM ",24,0,2359,START.OFFICE.HOURS,CR)
      IF CR THEN _
         GOTO 13210
13216 CALL GETINIT ("What is the latest SYSOP wants to be paged? -- HHMM ",24,0,2359,END.OFFICE.HOURS,CR)
      IF CR THEN _
         GOTO 13216
      IF START.OFFICE.HOURS > END.OFFICE.HOURS THEN _
         SWAP START.OFFICE.HOURS,END.OFFICE.HOURS
      RETURN
'
' * DETERMINE IF THE PRINTER'S "BELL" IS TO BE USED WHEN PAGING
'
13224 CALL GETYESNO ("Use on-line printer's bell to the page SYSOP?",M11$)
      RETURN
'
' * DETERMINE THE NUMBER OF RINGS RBBS-PC IS TO WAIT BEFORE ANSWERING
'
13228 A$ = ""
      MID$(USER.INIT.COMMAND$,INSTR(USER.INIT.COMMAND$,"S0=") + 3,5) = "1Q0X1"
13229 CALL GETINIT ("How many rings should RBBS-PC wait before answering? ",24,0,255,REQUIRED.RINGS,CR)
      IF CR THEN _
         GOTO 13229
      IF REQUIRED.RINGS = 0 THEN _
         MID$(USER.INIT.COMMAND$,INSTR(USER.INIT.COMMAND$,"S0=") + 3,5) = "1Q0X1" : _
         RETURN
13233 CALL GETNUMYN ("Next call answered after" + _
             STR$(REQUIRED.RINGS) + _
             " rings. Do you want ringback?",AB)
      IF NOT AB THEN _
         GOTO 13237
13235 IF REQUIRED.RINGS > 5 THEN _
         A$ = "(<6 for ringback)" : _
         GOTO 13229
      MID$(USER.INIT.COMMAND$,INSTR(USER.INIT.COMMAND$,"S0=") + 3,5) = "255  "
      RETURN
13237 MID$(USER.INIT.COMMAND$,INSTR(USER.INIT.COMMAND$,"S0=") + 3,5) = "254  "
      RETURN
13238 CALL MMINTEGER ("Minimum baud required for NEW callers",0,32000,MIN.NEWCALLER.BAUD)
      RETURN
13242 CALL MMINTEGER ("Minimum baud required for OLD callers",0,32000,MIN.OLDCALLER.BAUD)
      RETURN
13249 CALL GETNUMYN ("Should RBBS-PC go off-line when DISK FULL occurs ",DISKFULL.GO.OFFLINE)
      RETURN
'
' * REQUEST DRIVE SPECIFICATION IN THE RANGE "A" TO THE MAXIMUM ALLOWABLE
'
13253 CALL ASKRO ("Specify single drive in the range A->" + _
            M$ + _
            " for "+A$,24,HJ$)
      IF LEN(HJ$) <> 1 THEN _
         GOTO 13253
      CALL ALLCAPS (HJ$)
      IF HJ$ < "A" OR HJ$ > M$ THEN _
         GOTO 13253
      RETURN
'
' * ALLOW THE SYSOP TO ELECT TO USE RTS FOR MODEM FLOW CONTROL
'
13260 CALL GETYESNO ("Does your modem use the CTS signal for flow control",RTS$)
      RETURN
13270 CALL MMINTEGER ("Seconds to wait for carrier after detecting a call",5,999,MAX.CARRIER.WAIT)
      RETURN
13280 CALL MMINTEGER ("Wait how many minutes before recycling if no calls (0=forever)",0,32400,RECYCLE.WAIT)
      RETURN
13285 CALL ASKRO ("What caller types is ECHOed by R)BBS, I)nter host, C)aller's pgm",24,DEFAULT.ECHOER$)
      IF LEN(DEFAULT.ECHOER$) < 1 THEN _
         GOTO 13285
      DEFAULT.ECHOER$ = LEFT$(DEFAULT.ECHOER$,1)
      CALL ALLCAPS (DEFAULT.ECHOER$)
      IF INSTR("ICR",DEFAULT.ECHOER$) < 1 THEN _
         GOTO 13285
      RETURN
13290 CALL GETNUMYN ("Leave modem at init baud rate (don't match caller)",KEEP.INIT.BAUD)
      RETURN
13295 CALL GETNUMYN ("Switch back comm settings if changed for up/down load",SWITCH.BACK)
      RETURN
13310 CALL GETNUMYN ("Always respect XON/XOFF for flow control",XON.XOFF)
      RETURN
13320 CALL GETNUMYN ("CONFIG.SYS includes an ANSI device driver",DOSANSI)
      RETURN
13330 CALL MMINTEGER ("ASCII value for SMART TEXT control (0=NONE)",0,255,SMART.TEXT)
      RETURN
'
' * ALLOW THE DRIVES AVAILABLE FOR DOWNLOADING TO BE SELECTED
'
13470 CALL ASKRO ("Specify download drives (max of" + _
            STR$(MAXD) + _
            " in the range A-> " + M$ + "). ",24,HJ$)
      IF LEN(HJ$) < 1 OR LEN(HJ$) > MAXD THEN _
         GOTO 13470
      CALL ALLCAPS (HJ$)
      FOR I = 1 TO LEN(HJ$)
         A$(I) = MID$(HJ$,I,1)
      NEXT
      FOR I = 1 TO LEN(HJ$)
         IF A$(I) < "A" OR A$(I) > M$ THEN _
            GOTO 13470
      NEXT
      DRIVES.FOR.DOWNLOADS$ = HJ$
      IF DNLD.SUB < 1 THEN _
         RETURN
      FOR I = 1 TO DNLD.SUB
         IF INSTR(1,DRIVES.FOR.DOWNLOADS$,LEFT$(DNLD$(I),1)) = 0 THEN _
            DNLD$(I) = ""
      NEXT
      STOPIT = DNLD.SUB
      FOR I = 1 TO STOPIT
         IF DNLD$(I) <> "" THEN _
            GOTO 13583
         DNLD$(I) = DNLD$(I + 1)
         DNLD$(I + 1) = ""
13583 NEXT
      DNLD.SUB = 0
      FOR I = 1 TO STOPIT
         IF DNLD$(I) <> "" THEN _
            DNLD.SUB = DNLD.SUB + 1
      NEXT
      RETURN
13593 MAX = 3
13599 CALL ASKRO (A$,24,HJ$)
      CALL ALLCAPS (HJ$)
      IF LEN(HJ$) < 1 OR LEN(HJ$) > MAX THEN _
         GOTO 13599
      I = 0
      GOSUB 25920
      IF I = 0 THEN _
         RETURN
      GOTO 13599
'
' * IS THE DEFAULT TO HAVE THE PROMPT BELL ON AFTER EACH COMMAND?
'
13750 CALL ASKRO ("Prompt bell default? (ON or OFF) ",24,PROMPT.BELL$)
      IF LEN(PROMPT.BELL$) < 1 OR _
         LEN(PROMPT.BELL$) > 3 THEN _
         GOTO 13750
      CALL ALLCAPS (PROMPT.BELL$)
      IF PROMPT.BELL$ = "ON"  THEN _
         RETURN
      IF PROMPT.BELL$ = "OFF" THEN _
         RETURN
      GOTO 13750
'
' * SPECIFY THE MAXIMUM TIME A USER CAN STAY ON (THE DEFAULT)
'
13840 CALL GETINIT ("Maximum minutes per session a user can stay on the system ",24,0,1440,MIN,CR)
      IF CR THEN _
         GOTO 13840
      MINUTES.PER.SESSION! = MIN
      RETURN
'
' * ALLOW THE MAXIMUM NUMBER OF MESSAGES ALLOWED TO BE SELECTED
'
13890 J = 999
      IF NOT MESSAGES.CAN.GROW THEN _
         IF ((MAX.MSG.FILE.SIZE.FRM.DEF! - 1 - MAXIUM.NUMBER.OF.NODES) / 5) < J THEN _
            J = (MAX.MSG.FILE.SIZE.FRM.DEF! - 1 - MAXIMUM.NUMBER.OF.NODES) / 5
      CALL GETINIT ("Set maximum number of messages allowed (MAX = " + _
            STR$(FIX(J)) + _
            ")",24,1,999,MAX.ALLOWED.MSGS.FRM.DEF,CR)
      IF CR THEN _
         GOTO 13890
      IF MAX.ALLOWED.MSGS.FRM.DEF < J + 1 THEN _
         GOTO 13929
      IF MESSAGES.CAN.GROW THEN _
         GOTO 13929
      CALL GETNUMYN ("Increase the " + _
                      MAIN.MESSAGE.FILE$ + _
                     " file to " + _
                       STR$((MAX.ALLOWED.MSGS.FRM.DEF * 5) + 1 + MAXIMUM.NUMBER.OF.NODES) + _
                     " records?",AB)
      IF NOT AB THEN _
         GOTO 13890
13927 MAXIMUM.NUMBER.OF.MSGS = MAX.ALLOWED.MSGS.FRM.DEF
      GOSUB 30450
      B3! = (MAX.ALLOWED.MSGS.FRM.DEF * 5) + 1 + MAXIMUM.NUMBER.OF.NODES
      GOSUB 22080
      RETURN
13929 MAXIMUM.NUMBER.OF.MSGS = MAX.ALLOWED.MSGS.FRM.DEF
      GOSUB 30450
      RETURN
13940 CALL ANYINTEGER ("Set number of months before an inactive user is purged. ",ACT.MNTHS.B4.DELETING)
      IF ACT.MNTHS.B4.DELETING < 1 OR ACT.MNTHS.B4.DELETING > 12 THEN _
         GOTO 13940
      RETURN
14120 COMMIN = 1
      COMMAX = 8
      CALL ANYINTEGER ("# of communication port to use (" + _
                   MID$(STR$(COMMIN),2) + _
                  "-" + _
                  MID$(STR$(COMMAX),2) + _
                  ", or 0 for LOCAL WORKSTATION)? ",X)
      IF X <> 0 AND (X < COMMIN OR X > COMMAX) THEN _
         GOTO 14120
      COM.PORT$ = "COM" + MID$(STR$(X),2)
      IF X = 0 THEN _
         LSB = 1016 : _
         RETURN
14121 CALL GETNUMYN ("Use FOSSIL driver support",FOSSIL)
      IF FOSSIL THEN _
         GOTO 14125
      IF X < 3 THEN _
         GOTO 14123
      CALL GETNUMYN("BASIC does not support " + COM.PORT$ + ".  Do you wish to change it?",AB)
      IF AB THEN _
         GOTO 14120
      GOTO 14121
14123 IF X = 1 THEN _
         LSB = 1016 _
      ELSE IF X = 2 THEN _
              LSB = 760
      IF PCJR THEN _
         LSB = 760
      RETURN
14125 CALL ASKRO("Enter port address. i.e. 3F8? ",24,HJ$)
      IF LEN(HJ$) <> 3 THEN _
         GOTO 14125
14130 CALL ALLCAPS (HJ$)
      B = 3
      GOSUB 14789
      IF A < 0 THEN _
         GOTO 14125
      LSB = A
      B = 2
      GOSUB 14789
      IF A < 0 THEN _
         GOTO 14125
      LSB = LSB + A * 16
      B = 1
      GOSUB 14789
      IF A < 0 THEN _
         GOTO 14125
      LSB = LSB + A * 256
      RETURN
14789 A = INSTR("0123456789ABCDEF",MID$(HJ$,B,1)) - 1
      RETURN
'
' *  DRIVE AND NAME OF FILE CONTAINING THE BULLETIN FILES
'
14790 GOSUB 15200
      DRIVE.FOR.BULLETINS$ = HJ$
      GOSUB 14970
      BULLETIN.MENU$ = HJ$
      RETURN
'
' *  PREFIX USED TO NAME BULLETIN FILES
'
14800 GOSUB 14970
      IF LEN(HJ$) > 6 THEN _
         RETURN
      BULLETIN.PREFIX$ = HJ$
      RETURN
'
' *  DRIVE AND PATH FOR THREE MAJOR 'HELP' FILES
'
14810 GOSUB 15200
      HELP.PATH$ = HJ$
      RETURN
14815 GOSUB 15200
      QUES.PATH$ = HJ$
      RETURN
'
' *  PREFIX FOR FOR THREE MAJOR 'HELP' FILES
'
14820 GOSUB 14970
      IF LEN(HJ$) > 7 THEN _
         RETURN
      HELP.FILE.PREFIX$ = HJ$
      RETURN
'
' *  NAME OF 'NEWUSER' FILE
'
14825 A$ = "File extension for help files (max 3 chars)"
      GOSUB 13593
      HELP.EXTENSION$ = HJ$
      RETURN
14830 GOSUB 17340
      NEWUSER.FILE$ = HJ$
      RETURN
'
' *  NAME OF 'WELCOME' FILE
'
14840 GOSUB 17340
      WELCOME.FILE$ = HJ$
      RETURN
14845 CALL ASKRO ("Extension for compressed files",24,HJ$)           ' KG052301
      IF LEN(HJ$) > 3 OR LEN(HJ$) < 1 THEN _
         GOTO 14845
      CALL ALLCAPS (HJ$)
      DEFAULT.EXTENSION$ = HJ$
      RETURN
'
' *  NAME OF 'FILE DIRECTORY' FILE'S EXTENSION
'
14850 A$ = "Extension for RBBS directory files (3 char. max)."
      GOSUB 13593
      DIRECTORY.EXTENTION$ = HJ$
      RETURN
14855 CALL ASKRO ("Alternate extension for RBBS directory files ",24,HJ$)
      IF LEN(HJ$) > 3 THEN _
         GOTO 14855
      CALL ALLCAPS (HJ$)
      ALTDIR.EXTENSION$ = HJ$
      RETURN
14857 A$ = "PREFIX of name of directory of directories "
      MAX = 8
      GOSUB 13599
      DIRECTORY.PREFIX$ = HJ$
      RETURN
'
' *  NAME OF THE SYSOP'S MENU
'
14860 GOSUB 17340
      MENU$(1) = HJ$
      RETURN
'
' *  NAME OF MAIN MESSAGES SUBSECTION'S MENU
'
14870 GOSUB 17340
      MENU$(2) = HJ$
      RETURN
'
' *  NAME OF FILE SUBSECTION'S MENU
'
14880 GOSUB 17340
      MENU$(3) = HJ$
      RETURN
'
' *  NAME OF UTILITIES SUBSECTION'S MENU
'
14890 GOSUB 17340
      MENU$(4) = HJ$
      RETURN
'
' *  NAME OF MENU LISTING THE CONFERENCES THAT ARE AVAILABLE
'
14900 GOSUB 17340
      CONFERENCE.MENU$ = HJ$
      RETURN
'
' *  GET ANSWER MENU
'
14905 GOSUB 17340
      ANS.MENU$ = HJ$
      RETURN
'
' *  NAME OF FILE CONTAINING UNACCEPTABLE USER NAMES
'
14910 GOSUB 17340
      TRASHCAN.FILE$ = HJ$
      RETURN
14915 CALL ASKRO ("Help for uploader to categorize is",24,UPCAT.HELP$)
      IF LEN(UPCAT.HELP$) > 7 THEN 14915
      CALL ALLCAPS (UPCAT.HELP$)
      RETURN
'
' *  DRIVE AVAILABLE FOR UPLOADING
'
14920 A$ = "uploading "
      GOSUB 13253
      DRIVE.FOR.UPLOADS$ = HJ$
      IF LEN(UPLOAD.SUBDIR$) > 1 THEN _
         MID$(UPLOAD.SUBDIR$,1,1) = DRIVE.FOR.UPLOADS$
      RETURN
'
' * GENERALIZED ROUTINE TO SELECT FILE NAME FOR ANY OPTION WITHIN CONFIG
'
14970 X$ = OPTION$
14980 CALL ASKRO ("Specify name of the file for parameter " + X$ + ".",24,HJ$)
      CALL ALLCAPS (HJ$)
      IF LEN(HJ$) < 1 OR LEN(HJ$) > 12 THEN _
         GOTO 14980
      L1 = INSTR(HJ$,".")
      IF L1 = 0 THEN _
         IF LEN(HJ$) < 9 THEN _
            GOTO 15045 ELSE _   7
      GOTO 14980
      IF L1 > 9 THEN _
         GOTO 14980
      IF L1 < 2 THEN _
         GOTO 14980
      IF LEN(HJ$) - L1 > 3 THEN _
         GOTO 14980
15045 I = 0
      GOSUB 25920
      IF I = 0 THEN _
         RETURN
      GOTO 14980
'
' * GENERALIZED ROUTINE TO SPECIFY A DISK DRIVE FOR ANY OPTION WITHIN CONFIG
'
15170 CALL ASKRO ("Specify drive in the range A->" + _
                   M$ + _
                  " for parameter " + _
                   X$ + _
                  ". ",24,HJ$)
      IF LEN(HJ$) <> 1 THEN _
         GOTO 15170
      CALL ALLCAPS (HJ$)
      IF HJ$ < "A" OR HJ$ > M$ THEN _
         GOTO 15170
      TB$ = HJ$
      RETURN
'
' *  GENERALIZED ROUTINE FOR SPECIFYING DRIVE/PATH
'
15200 X$ = "parameter " + OPTION$
15205 CALL ASKRO ("Specify drive/path (A->" + M$ + ") for " + X$ + ".",24,HJ$)
      IF LEN(HJ$) < 1 THEN _
         GOTO 15205
      CALL ALLCAPS (HJ$)
      IF LEN(HJ$) = 1 THEN _
         HJ$ = HJ$ + ":"
      IF MID$(HJ$,2,1) = ":" THEN _
        IF LEFT$(HJ$,1) < "A" OR LEFT$(HJ$,1) > M$ THEN _
           GOTO 15205
      IF LEN(HJ$) > 2 THEN _
         IF MID$(HJ$,3,1) <> "\" THEN _
            GOTO 15205
      IF INSTR(HJ$,"\") > 0 THEN _
        IF RIGHT$(HJ$,1) <> "\" THEN _
           HJ$ = HJ$ + "\"
      STRNG$ = HJ$
      GOSUB 60470
      IF NOT IS.OK THEN _
         GOTO 15205
      TB$ = HJ$
      RETURN
15230 RETURN
15234 CALL ANYNUMBER ("Extend by what fraction of time uploading ",UPLOAD.TIME.FACTOR!)
      IF UPLOAD.TIME.FACTOR! <= 1.0 THEN _
         RETURN
      CLS
      LOCATE 10,1
      PRINT "     An upload time credit factor > 1 means that uploaders may get more"
      PRINT "     time credited than their total session time.   Such a credit normally"
      PRINT "     survives only for the day on which the upload is made."
      CALL GETNUMYN ("Make upload time credits survive forever until used",KEEP.TIME.CREDITS)
      RETURN
15240 CALL MMINTEGER ("How many seconds of delay after modem initilization (1 to 99)?",1,99,MODEM.INIT.WAIT.TIME)
      RETURN
15250 CALL MMINTEGER ("# seconds to delay prior to issuing modem commands (0 to 99)?",1,99,MODEM.COMMAND.DELAY.TIME)
      RETURN
15290 CALL MMINTEGER ("Enter number of active 'bulletins' (0 to 99)",0,99,ACTIVE.BULLETINS)
      RETURN
15310 CALL ANYINTEGER ("Min security to read new PRIVATE messages",PRIVATE.READ.SEC)
      RETURN
15320 CALL ANYINTEGER ("Min security to read new PUBLIC messages",PUBLIC.READ.SEC)
      RETURN
15330 CALL ANYINTEGER ("Min security to change msg read security",SEC.CHANGE.MSG)
      RETURN
'
' * DETERMINE THE NAME OF THE "MESSAGES" FILE
'
15460 GOSUB 17340
      MAIN.MESSAGE.FILE$ = HJ$
      MAIN.MESSAGE.BACKUP$ = MAIN.MESSAGE.FILE$ + ".BAK"
      MAINMSG$ = MAIN.MESSAGE.FILE$
      RETURN
'
' * DETERMINE THE NAME OF THE "CALLERS" FILE
'
15461 GOSUB 15200
      CALL GETNUMYN ("Do you want a caller's activity to be logged to a file",X)
      IF NOT X THEN _
         CALLERS.FILE$ = TB$ : _
         RETURN
      GOSUB 14970
      CALLERS.FILE$ = TB$ + HJ$
      RETURN
'
' * DETERMINE THE NAME OF THE "COMMENTS" FILE
'
15464 GOSUB 17340
      COMMENTS.FILE$ = HJ$
      RETURN
'
' * DETERMINE THE NAME OF THE "USERS" FILE
'
15500 GOSUB 17340
      MAIN.USER.FILE$ = HJ$
      MAINUSR$ = MAIN.USER.FILE$
      RETURN
15530 CALL GETCOLOR ("Foreground",FG)
      CALL ASKRO ("Make foreground [N]ormal, or I)ntense (bright)",24,ANS$)
      CALL ALLCAPS (ANS$)
      IF LEFT$(ANS$,1) = "I" THEN _
         FG = FG + 8
      RETURN
15590 CALL GETCOLOR ("Background",BG)
      RETURN
15650 CALL GETCOLOR ("Border",BORDER)
      RETURN

'
' * SHOULD RBBS-PC'S DEFAULT HAYES COMMANDS BE USED?
'
15710 CLS
      GOSUB 15780
      A$ = "RBBS-PC to use modem commands you specified as follows:"
      IF M14$ = "YES" THEN _
         A$ ="RBBS-PC to use standard modem commands as follows:"
      PRINT A$
      PRINT ""
      PRINT "1. Reset the modem                : " + USER.RESET.COMMAND$
      PRINT ""
      PRINT "2. Initialize the modem           : " + USER.INIT.COMMAND$
      PRINT "   Note: End item 2 with:"
      PRINT "     S0=1Q0X1 if answer on 0 rings"
      PRINT "     S0=254 if answer on >0 rings (no ring-back)"
      PRINT "     S0=255 if answer on >0 rings (with ring-back)"
      PRINT ""
      PRINT "3. Count the number of rings      : " + USER.COUNT.RINGS.COMMAND$
      PRINT ""
      PRINT "4. Answer the phone               : " + USER.ANSWER.COMMAND$
      PRINT ""
      PRINT "5. Take the phone off the hook    : " + USER.GO.OFFHOOK.COMMAND$
      PRINT ""
      PRINT "6. Clear the modem's firmware     : " + USER.FIRMWARE.CLEAR.CMND$
      PRINT ""
      PRINT "7. Initialize modem's firmware    : " + USER.INITIALIZE.COMMAND$
      PRINT "   Note: End item 7 with:"
      PRINT "     Q1 if item 2 ends with S0=255"
      PRINT ""
      PRINT "8. Write to modem's firmware      : " + USER.FIRMWARE.WRITE.CMND$
      CALL GETINIT ("Specify command to change (1 to 8), CR to end, or 0 to reset to defaults)",24,0,8,I,CR)
      IF CR THEN _
         RETURN
      IF I <> 0 THEN _
         GOTO 15711
      GOSUB 15790
      GOTO 15710
15711 CALL ASKRO ("Enter modem command for item" + _
                   STR$(I) + _
                  " :",24,HJ$)
      CALL ALLCAPS (HJ$)
      ON I GOTO 15712,15714,15716,15718,15720,15722,15724,15726
15712 USER.RESET.COMMAND$ = HJ$
      GOTO 15710
15714 USER.INIT.COMMAND$ = HJ$
      GOTO 15710
15716 USER.COUNT.RINGS.COMMAND$ = HJ$
      GOTO 15710
15718 USER.ANSWER.COMMAND$ = HJ$
      GOTO 15710
15720 USER.GO.OFFHOOK.COMMAND$ = HJ$
      GOTO 15710
15722 USER.FIRMWARE.CLEAR.CMND$ = HJ$
      GOTO 15710
15724 USER.INITIALIZE.COMMAND$ = HJ$
      GOTO 15710
15726 USER.FIRMWARE.WRITE.CMND$ = HJ$
      GOTO 15710
15780 M14$ = "NO"
      IF MODEM.ANSWER.COMMAND$ = USER.ANSWER.COMMAND$ AND _
         MODEM.COUNT.RINGS.COMMAND$ = USER.COUNT.RINGS.COMMAND$ AND _
         MODEM.GO.OFFHOOK.COMMAND$ = USER.GO.OFFHOOK.COMMAND$ AND _
         MID$(MODEM.INIT.COMMAND$,1,INSTR(MODEM.INIT.COMMAND$,"S0=") - 1) = MID$(USER.INIT.COMMAND$,1,INSTR(USER.INIT.COMMAND$,"S0=") - 1)  AND _
         MODEM.RESET.COMMAND$ = USER.RESET.COMMAND$ AND _
         FIRMWARE.INITIALIZE.COMMAND$ = USER.INITIALIZE.COMMAND$ AND _
         FIRMWARE.CLEAR.COMMAND$ = USER.FIRMWARE.CLEAR.CMND$ AND _
         FIRMWARE.WRITE.COMMAND$ = USER.FIRMWARE.WRITE.CMND$ THEN _
         M14$ = "YES"
      RETURN
15790 FIRMWARE.INITIALIZE.COMMAND$ = "AT&C1&D3B1E0V1M0S0=0&T5"
      FIRMWARE.CLEAR.COMMAND$ = "AT&F"
      FIRMWARE.WRITE.COMMAND$ = "&W"
      USER.ANSWER.COMMAND$ = MODEM.ANSWER.COMMAND$
      USER.COUNT.RINGS.COMMAND$ = MODEM.COUNT.RINGS.COMMAND$
      USER.GO.OFFHOOK.COMMAND$ = MODEM.GO.OFFHOOK.COMMAND$
      USER.INIT.COMMAND$ = MODEM.INIT.COMMAND$
      USER.RESET.COMMAND$ = MODEM.RESET.COMMAND$
      USER.INITIALIZE.COMMAND$ = FIRMWARE.INITIALIZE.COMMAND$
      USER.FIRMWARE.CLEAR.CMND$ = FIRMWARE.CLEAR.COMMAND$
      USER.FIRMWARE.WRITE.CMND$ = FIRMWARE.WRITE.COMMAND$
      RETURN
15800 CALL GETNUMYN ("Remind users of the messages they left?",MESSAGE.REMINDER)
      RETURN
15820 CALL GETNUMYN ("Use machine language routines for speed",TURBO.RBBS)
      RETURN
15825 CALL GETNUMYN ("Not BASIC = use DOS calls (need for local color graphics)",USE.BASIC.WRITES)
      RETURN
15830 CALL GETNUMYN ("Look no further when command not found in current section",RESTRICT.VALID.CMDS)
      RETURN
15835 CALL GETNUMYN ("YES means to stop rather than scroll away previous text",MENUS.CAN.PAUSE)
      RETURN
15840 CALL GETNUMYN ("Are system bulletins to be optional?",BULLETINS.OPTIONAL)
      RETURN
15850 GOSUB 15200
      MACRO.DRVPATH$ = HJ$
      RETURN
15860 CALL GETNUMYN ("Use macros",AB)                                ' KG060701
      IF NOT AB THEN _                                               ' KG060701
         MACRO.EXTENSION$ = "" : _                                   ' KG060701
         RETURN                                                      ' KG060701
15862 A$ = "File extension for macro files (3 chars required)"       ' KG060701
      CALL ASKRO (A$,24,MACRO.EXTENSION$)                            ' KG060701
      IF LEN(MACRO.EXTENSION$) <> 3 THEN _                           ' KG060701
         GOTO 15862                                                  ' KG060701
      RETURN
15880 CALL GETNUMYN ("Is non-ascii protocol required for binary files?",REQUIRE.NON.ASCII)
      RETURN                                                         ' KG072303
15920 CALL GETYESNO ("Is " + _
                      DIRECTORY.EXTENTION$ + _
                      " omitted from the N)ew command?",OMIT.MAIN.DIRECTORY$)
      RETURN
15991 CALL GETNUMYN ("Do you want EXTENDED logging to the 'callers' file",EXTENDED.LOGGING)
      RETURN
15993 CALL GETNUMYN ("Do you want 'comments' recorded as private messages",COMMENTS.AS.MESSAGES)
      RETURN
16000 CALL GETNUMYN ("Is system 'welcome' interruptable",WELCOME.INTERRUPTABLE)
      RETURN
16031 CALL MMINTEGER ("Seconds users can be idle before being logged off",1,32400,WAIT.BEFORE.DISCONNECT)
      RETURN
16032 CALL MMINTEGER ("Size of stack space to be set aside",1,32767,SIZE.OF.STACK)
      RETURN
16033 CALL MMINTEGER ("Security level exempt from 'epi-log'",1,32767,SECURITY.EXEMPT.FROM.EPILOG)
      RETURN
'
' * IDENTIFY THE TYPE OF PC THAT RBBS-PC WILL BE RUNNING ON
'
16040 CLS
      LOCATE 5,5
      PRINT "Please select the type of PC which RBBS-PC will be running on  :"
      LOCATE 7,10
      PRINT "0.   IBM PC/XT/AT/PS2..."                               ' KG072302
      LOCATE 9,10
      PRINT "1.   Compaq/Plus or compatable that uses interrupt 7F"
      LOCATE 11,10
      PRINT "2.   IBM PCjr
      LOCATE 13,10
      PRINT "3.   Other compatable under IBM's DOS (i.e. PC-DOS)
16050 CALL GETINIT ("Select environment (0 to 3, CR to end)",24,0,3,COMPUTER.TYPE,CR)
      IF CR THEN _
         RETURN
16062 ON COMPUTER.TYPE+1 GOTO 16063,16064,16065,16066
16063 COMPUTER.TYPE$ = "IBM PC/XT/AT/PS2..."                         ' KG072302
      RETURN
16064 COMPUTER.TYPE$ = "Compaq/Plus"
      RETURN
16065 COMPUTER.TYPE$ = "PCjr"
      GOTO 16071
16066 COMPUTER.TYPE$ = "Other under PC-DOS"
      RETURN
16071 CALL GETNUMYN ("Is an IBM PCjr Internal Modem installed? (YES or NO)",PCJR)
      IF PCJR THEN _
         LSB = 760
16073 RETURN
16121 CALL GETNUMYN ("Wait to issue modem commands between rings?",COMMANDS.BETWEEN.RINGS)
      RETURN
16124 CALL MMINTEGER ("Enter baud rate (300,1200,2400,4800,9600,19200) to open modem at ",300,19200,B1)
      IF B1 = 300 OR B1 = 1200 OR B1 = 2400 OR B1 = 4800 OR B1 = 9600 OR _
         B1 = 19200 THEN _
            GOTO 16128 _
      ELSE GOTO 16124
16128 MODEM.INIT.BAUD$ = MID$(STR$(B1),2)
      RETURN
'
' *  NAME OF MENU CONTAINING THE LIST OF AVAILABLE 'DOORS'
'
16130 GOSUB 17340
      MENU$(5) = HJ$
      RETURN
'
' * NAME OF THE FILE BUILT DYNAMICALLY BY RBBS-PC TO EXIT TO A 'DOOR'
'
16140 GOSUB 17340
      RCTTY.BAT$ = HJ$
      RETURN
'
' * NAME OF FILE TO RE-INVOKE RBBS-PC WHEN RETURNING FROM A 'DOOR'
'
16150 GOSUB 17340
      RBBS.BAT$ = HJ$
      RETURN
'
' * DRIVE/PATH TO LOOK FOR 'COMMAND.COM' ON
'
16160 GOSUB 15200
      DISK.FOR.DOS$ = HJ$
      RETURN
16170 CALL GETNUMYN ("Redirect I/O via the CTTY command on dropping to DOS?",REDIRECT.IO.METHOD)
16175 CALL GETNUMYN ("Redirect I/O via a device named in CONFIG.SYS?",B1)
      IF B1 THEN _
         GOTO 16176
      USE.DEVICE.DRIVER$ = ""
      RETURN
16176 IF LEN (USE.DEVICE.DRIVER$) > 0 THEN _
         GOTO 16177
      CALL ASKRO("Enter name of the device to use. ",24,USE.DEVICE.DRIVER$)
      IF LEN (USE.DEVICE.DRIVER$) > 8 THEN _
         GOTO 16176
      IF LEN (USE.DEVICE.DRIVER$) = 0 THEN _
         RETURN
16177 CALL GETNUMYN ("Use the device named " + USE.DEVICE.DRIVER$ + "?",B1)
      IF B1 THEN _
         RETURN
      USE.DEVICE.DRIVER$ = ""
      GOTO 16176
16290 CALL GETNUMYN ("Is the 'door' subsystem available?",DOORS.AVAILABLE)
      IF NOT DOORS.AVAILABLE THEN _
         RETURN
      CALL GETNUMYN ("Will you be running RBBS-PC under MultiLink? ",AB)
      IF AB THEN _
         GOTO 16350
16340 DELAY! = FNTI! + 15
'
' * NOTIFY THE SYSOP OF THE CONDITIONS FOR USING RBBS-PC "DOORS"
'
      CLS
      PRINT "                ******Warning******"
      PRINT "IBM's DOS absolutely REQUIRES any software package running"
      PRINT "as a 'door' (i.e. via a communication port) to monitor the"
      PRINT "communication port!  Otherwise your system will be vulnerable" ' KG060704
      PRINT "to being hung -- and worse!!!   Be wary of using doors if" ' KG060704
      PRINT "don't THROUGHLY understand the doors section in RBBS-PC's" ' KG060704
      PRINT "documentation and the pitfalls of using 'doors'!"       ' KG060704
16345 GOSUB 60440
      CLS
      PRINT "                ******Warning******"
      PRINT "Some environments require that you set the modem to answer"
      PRINT "on zero rings (i.e. 'auto-answer').  This is perilous to"
      PRINT "using doors because if a user in a door gets disconnected"
      PRINT "the modem is set to answer on the very next ring and someone who"
      PRINT "you may not want in the door or in DOS will find themselves"
      PRINT "able to do you grevious harm, though some environments and" ' KG060704
      PRINT "modems work fine."                                      ' KG060704
      PRINT ""                                                       ' KG060704
      CALL GETNUMYN ("Are you sure you want to use doors",SHOOT.YOURSELF) ' KG060704
      RETURN
16350 CLS
16360 LOCATE 23,1
      PRINT "Current Multi-Link terminal type for DOORS is ";DOORS.TERMINAL.TYPE
16370 CALL MMINTEGER ("Enter Multi-Link terminal type for DOORS ",0,12,DOORS.TERMINAL.TYPE)
      RETURN
16650 CALL ANYINTEGER ("MAX # of minutes per day (0 = no limit)",MAX.PER.DAY)
      RETURN
16690 CALL GETNUMYN ("Remind users of # uploads and downloads?",REMIND.FILE.TRANSFERS)
      RETURN
16722 CALL GETNUMYN ("Remind users of their terminal's profile?",REMIND.PROFILE)
      RETURN
16725 CALL GETNUMYN ("Are you using a non-Hayes auto-answer only modem?",DUMB.MODEM)
      RETURN
16730 CALL MMINTEGER ("Default user page length?(a value between 0 and 255)",0,255,PAGE.LENGTH)
      RETURN
16790 CALL MMINTEGER ("Maximum number of lines allowed per message (1-99)",1,99,MAX.MESSAGE.LINES)
      RETURN
16795 CALL MMINTEGER ("Max. # of lines allowed in extended upload description (0-99)",0,99,MAX.EXTENDED.LINES)
      RETURN
17160 CALL ANYINTEGER ("Security level for parameter " + _
                        HJ$ + _
                       " is? ",MINIMUM.LOGON.SECURITY)
      RETURN
17170 CALL ANYINTEGER ("Security level for parameter " + _
                        HJ$ + _
                       " is? ",DEFAULT.SECURITY.LEVEL)
      RETURN
17180 CALL ANYINTEGER ("Security level for parameter " + _
                        HJ$ + _
                       " is? ",SYSOP.SECURITY.LEVEL )
      RETURN
'
' * FILE CONTAINING FILE NAMES WITH DOWNLOAD SECURITY
'
17190 GOSUB 17340
      FILESEC.FILE$ = HJ$
      RETURN
17200 CALL ANYINTEGER ("Security level for parameter " + _
                        HJ$ + _
                       " is? ",SYSOP.MENU.SECURITY.LEVEL)
      RETURN
17210 CALL ANYINTEGER ("MIN security required to add extended upload description",ASK.EXTENDED.DESC)
      RETURN
17215 CALL ANYINTEGER ("Registration door applies to new users & whose security <=",MAX.REG.SEC)
      RETURN
17220 CALL MMINTEGER("MAXIMUM # security violations allowed (0=no limit)",0,99,MAXIMUM.VIOLATIONS)
      RETURN
17230 CALL SECURE ("SYSOP",SYSOP.COMMANDS.DEFAULTS$,NUM.SYSOP,SYSOP.FUNCTION$(),SYSOP.FUNCTION(),SYSOP.COMMANDS$)
      RETURN
17240 CALL SECURE ("Main Menu",MAIN.COMMANDS.DEFAULTS$,NUM.MAIN,MAIN.FUNCTION$(),MAIN.FUNCTION(),MAIN.COMMANDS$)
      RETURN
17250 CALL SECURE ("File Menu",FILE.COMMANDS.DEFAULTS$,NUM.FILES,FILES.FUNCTION$(),FILES.FUNCTION(),FILE.COMMANDS$)
      RETURN
17260 CALL SECURE ("Utilities",UTIL.COMMANDS.DEFAULTS$,NUM.UTILITY,UTILITY.FUNCTION$(),UTILITY.FUNCTION(),UTIL.COMMANDS$)
      RETURN
17264 CALL SECURE ("Global",GLOBAL.COMMANDS.DEFAULTS$,NUM.GLOBAL,GLOBAL.FUNCTION$(),GLOBAL.FUNCTION(),GLOBAL.COMMANDS$)
      RETURN
'
' * FILE NAME CONTAINING SPECIAL TEMPORARY PASSWORDS WITH TEMPORARY PRIVILEGES
'
17270 GOSUB 17340
      PASSWORD.FILE$ = HJ$
      RETURN
17280 CALL ASKRO("Name of file shown for security breaches",24,HJ$)
      IF LEN(HJ$) > 8 OR INSTR(HJ$,".") > 0 THEN _
         GOTO 17280
      IF LEN(HJ$) < 1 THEN _
         SECVIO.HLP$ = NONE.PICKED$ : _
         RETURN
      CALL ALLCAPS (HJ$)
      SECVIO.HLP$ = HELP.PATH$ + HJ$ + "." + HELP.EXTENSION$
      RETURN
17290 CALL MMINTEGER ("Maximum number of password changes is? (0 or more) ",0,99,MAXIMUM.PASSWORD.CHANGES)
      RETURN
17300 CALL ANYINTEGER ("Security level for parameter " + _
                        HJ$ + _
                       " is? ",MINIMUM.SECURITY.FOR.TEMP.PASSWORD)
      RETURN
17310 CALL ANYINTEGER ("Security level for overwriting files on upload is? ",OVERWRITE.SECURITY.LEVEL)
      RETURN
17316 CALL ANYINTEGER ("Security level for parameter " + _
                        HJ$ + _
                       " is? ",SEC.LVL.EXEMPT.FRM.PURGING)
      RETURN
'
' *  STANDARD ROUTINE TO SIMPLY SPECIFY A DRIVE LETTER FOR ANY OPTION
'
17340 GOSUB 15200
      GOSUB 14970
      IF IPAGE = 6 AND ILOOKUP = 9 AND HJ$ = "NONE" THEN _
      IF MID$(HJ$,2,1) <> ":" THEN _
         BEEP : _
         GOTO 17340
      IF HJ$ = "NONE" THEN _
         RETURN
      HJ$ = TB$ + HJ$
      RETURN
17500 CALL GETNUMYN ("Show section in command prompt",SHOW.SECTION)
      RETURN
17550 CALL GETNUMYN ("Show commands in command prompt",COMMANDS.IN.PROMPT)
      RETURN
17560 CALL GETNUMYN ("Let new users set their preferences",NEWUSER.SETS.DEFAULTS)
      RETURN
17570 CALL GETNUMYN ("Add new users to USERS file",REMEMBER.NEW.USERS)
      RETURN
17580 CALL GETNUMYN ("Log on new users even when USERS file full",SURVIVE.NOUSER.ROOM)
      RETURN
17590 CALL GETNUMYN ("Limit file searches to FMS directory",LIMIT.SEARCH.TO.FMS)
      RETURN
17600 CALL GETNUMYN ("Enable download of new files at logon",NEW.FILES.CHECK)
      RETURN
17610 CALL GETNUMYN ("Turn printer off after each recycle",TURN.PRINTER.OFF)
      RETURN
17620 CALL GETNUMYN ("Play music themes for RBBS functions",MUSIC)
      RETURN
17625 CALL GETNUMYN ("Use order on directory of directories (no=sort)",USE.DIR.ORDER)
      RETURN
17630 CALL GETNUMYN ("RESTRICT callers using SUBSCRIPTION period",RESTRICT.BY.DATE)
      RETURN
17635 CALL ANYINTEGER ("Security that lets caller READ & KILL all messages",SEC.KILL.ANY)
      RETURN
17640 CALL ANYINTEGER ("Adopt change in main security for all users with sec <",AUTO.UPGRADE.SEC)
      RETURN
17645 CALL GETNUMYN ("Send multi-file ASCII download as one big file",PERSONAL.CONCAT)
      RETURN
17650 CALL GETNUMYN ("Force check every time whether can AUTODOWNLOAD",ASK.IDENTITY)
      RETURN
17700 CALL GETNUMYN ("Require all callers to answer a questionnaire",AB)
      IF NOT AB THEN _
         REQUIRED.QUESTIONNAIRE$ = NONE.PICKED$ : _
         RETURN
      GOSUB 17340
      GOSUB 17740
      REQUIRED.QUESTIONNAIRE$ = HJ$
      RETURN
17710 GOSUB 17340
      PRELOG$ = HJ$
      RETURN
17720 CALL GETNUMYN ("Require all NEW users to answer a questionnaire",AB)
      IF NOT AB THEN _
         NEW.USER.QUESTIONNAIRE$ = NONE.PICKED$ : _
         RETURN
      GOSUB 17340
      GOSUB 17740
      NEW.USER.QUESTIONNAIRE$ = HJ$
      RETURN
17725 GOSUB 17340
      GOSUB 17740
      AUTOPAGE.DEF$ = HJ$
      RETURN
17730 GOSUB 17340
      GOSUB 17740
      EPILOG$ = HJ$
      RETURN
17740 IF INSTR(HJ$,".") = 0 THEN _
         HJ$ = HJ$ + ".DEF"
      RETURN
17800 CALL MMINTEGER ("Match personal downloads starting at what column in user record",1,128,PERSONAL.BEGIN)
      RETURN
17805 OK = TRUE
      IF NOT ENFORCE.UPLOAD.DOWNLOAD.RATIOS THEN _
         RETURN
      IF START.WRITE > 100 THEN _
         RETURN
      IF START.WRITE < 82 AND _
         START.WRITE + LEN.WRITE < 82 THEN _
         RETURN
      OK = FALSE
17806 CALL ASKRO ("Parameter 47 precludes using this part of USERS record. [ENTER] continues",24,A$)
      RETURN
17810 CALL MMINTEGER ("Match personal downloads using how many chars in user record",1,128,PERSONAL.LEN)
      RETURN
17820 CALL ASKRO ("Protocol for personal downloads [ENTER] for none)",24,PERSONAL.PROTOCOL$)
      IF LEN(PERSONAL.PROTOCOL$) > 1 THEN _
         GOTO 17820
      IF PERSONAL.PROTOCOL$ = "" THEN _
         PERSONAL.PROTOCOL$ = "N"
      CALL ALLCAPS (PERSONAL.PROTOCOL$)
      RETURN
17830 CALL ASKRO ("Prompt for first field caller asked (What is your..)",24,FIRST.NAME.PROMPT$)
      RETURN
17840 CALL ASKRO ("Prompt for second field caller asked (What is your..)",24,LAST.NAME.PROMPT$)
      RETURN
17845 CALL ASKRO ("Ask callers for [e.g. CITY/STATE] (What is your...)",24,USER.LOCATION$)
      RETURN
17850 CALL GETNUMYN ("Enforce upload/download ratios",ENFORCE.UPLOAD.DOWNLOAD.RATIOS)
      IF NOT ENFORCE.UPLOAD.DOWNLOAD.RATIOS THEN _
         RETURN
      IF START.INDIV > 100 THEN _
         RETURN
      IF START.INDIV < 82 AND _
         START.INDIV + LEN.INDIV < 82 THEN _
         RETURN
      ENFORCE.UPLOAD.DOWNLOAD.RATIOS = FALSE
      GOTO 17806
18000 CALL ASKUPOS ("Specify field in USERS file that will identify callers",_
                    START.HASH,LEN.HASH,PROMPT.HASH$)
18002 IF START.HASH < 1 OR LEN.HASH < 1 THEN _
        BEEP : _
        GOTO 18000
      IF START.HASH = 1 THEN _
         HASH.ID$ = "(NAME)"_
      ELSE HASH.ID$ = "(nonstandard)"
      START.WRITE = START.HASH
      LEN.WRITE = LEN.HASH
      GOSUB 17805
      IF NOT OK THEN _
         START.HASH = 1 : _
         LEN.HASH = 31 : _
         GOTO 18002
      RETURN
18100 CALL ASKUPOS ("Use what field to distinguish callers with same ID?",_
                    START.INDIV,LEN.INDIV,PROMPT.INDIV$)
18102 IF START.INDIV = 0 OR LEN.INDIV = 0 THEN_
        INDIV.ID$ = NONE.PICKED$ _
      ELSE INDIV.ID$ = "(nonstandard)"
      START.WRITE = START.INDIV
      START.LEN = LEN.INDIV
      GOSUB 17805
      IF NOT OK THEN _
         START.INDIV = 0 : _
         LEN.INDIV = 31 : _
         GOTO 18102
      START.WRITE = START.INDIV
      RETURN
18200 CALL ASKRO ("New default category code",24,DEFAULT.CATEGORY.CODE$)
      CALL ALLCAPS (DEFAULT.CATEGORY.CODE$)
      IF LEN(DEFAULT.CATEGORY.CODE$) > 3 THEN _
         DEFAULT.CATEGORY.CODE$ = LEFT$(DEFAULT.CATEGORY.CODE$,3) _
      ELSE DEFAULT.CATEGORY.CODE$ = DEFAULT.CATEGORY.CODE$ + _
                                    SPACE$(3 - LEN(DEFAULT.CATEGORY.CODE$))
      RETURN
18300 GOSUB 15200
      CALL ASKRO ("New file of directory categories",24,DIR.CATEGORY.FILE$)
      DIR.CATEGORY.FILE$ = TB$ + _
                           DIR.CATEGORY.FILE$
      RETURN
18310 GOSUB 17340
      MAIN.PUI$ = HJ$
      CALL BRKFNAME (MAIN.PUI$,X1$,X2$,X3$,TRUE)
      IF X3$ = "" THEN _
         MAIN.PUI$ = X1$ + X2$ + ".PUI"
      RETURN
18330 CALL GETNUMYN ("Should DOORS be TIME-LOCKED",TIME.LOCK)
      CALL GETNUMYN ("Should DOWNLOADS be TIME-LOCKED",Q)
      TIME.LOCK = -TIME.LOCK + 2 * -Q
      RETURN
18340 CALL ANYINTEGER ("MINIMUM security for turbo logon",ALLOW.CALLER.TURBO)
      RETURN
18345 CALL ANYINTEGER ("MINIMUM security to add dir entry for pre-existing file",ADD.DIR.SECURITY)
      RETURN
18350 CALL ASKRO ("Copy upload description to upload dir AND to (Drv/path/name)",24,ALWAYS.STREW.TO$)
      CALL ALLCAPS (ALWAYS.STREW.TO$)
      RETURN
18360 CALL ASKRO ("Restrict 'ALL' to directory named ([ENTER] = unrestriced)",24,MASTER.DIRECTORY.NAME$)
      CALL ALLCAPS (MASTER.DIRECTORY.NAME$)
      RETURN
18400 CALL MMINTEGER ("New max length of upload description (40-46)",40,46,MAX.DESC.LEN)
      RETURN
18500 CALL ANYINTEGER ("Min security to view new uploads",MIN.SEC.TO.VIEW)
      RETURN
18510 CALL ANYINTEGER ("SECURITY level callers gets when SUBSCRIPTION period EXPIRES",EXPIRED.SECURITY)
      RETURN
18515 CALL ANYINTEGER ("Min security for uploader to assign a category",SL.CATEGORIZE.UPLOADS)
      RETURN
18520 CALL MMINTEGER ("Default # days in SUBSCRIPTION PERIOD",0,32000,DAYS.IN.SUBSCRIPTION.PERIOD)
      RETURN
18530 CALL MMINTEGER ("# days left in subscription before start WARNING",0,32000,DAYS.TO.WARN)
      RETURN
18540 CALL MMINTEGER ("# seconds to WAIT for DTR to drop",0,30,DTR.DROP.DELAY)
      RETURN
18545 IF MAIN.MESSAGE.FILE$ = MAINMSG$ THEN _
         XX$ = "Parameter " + _
            OPTION$ + _
            " only valid during CONFERENCE maintenence!" : _
         GOSUB 50345 : _
         DELAY! = FNTI! + 5 : _
         GOSUB 60440 : _
         RETURN
      CALL ANYINTEGER ("Minimum security level to 'AUTO ADD' to conference",AUTO.ADD.SECURITY)
      AUTO.ADD.SECURITY$ = MID$(STR$(AUTO.ADD.SECURITY),2)
      RETURN
'
' *  GET UPLOAD DIRECTORY DRIVE/PATH
'
18550 GOSUB 15200
      UPLOAD.PATH$ = HJ$
      RETURN
18600 GOSUB 15200
      DIRECTORY.PATH$ = HJ$
      RETURN
18620 GOSUB 17340
      PROTO.DEF$ = HJ$
      RETURN
18625 GOSUB 17340
      DOORS.DEF$ = HJ$
      RETURN
18630 GOSUB 15200
      IF INSTR(PERSONAL.DIR$, PERSONAL.DRVPATH$) = 1 THEN _
         PERSONAL.DIR$ = HJ$ + MID$(PERSONAL.DIR$, LEN(PERSONAL.DRVPATH$)+1)
      PERSONAL.DRVPATH$ = HJ$
      RETURN
18640 CALL GETNUMYN ("Is there an external DOOR to check Callers",AB)
      IF NOT AB THEN _
         REGISTRATION.PROGRAM$ = NONE.PICKED$ : _
         RETURN
      GOSUB 17340
      REGISTRATION.PROGRAM$ = HJ$
      RETURN
18700 CALL GETNUMYN ("Set most critical parameters",AB)
      IF NOT AB THEN _
         RETURN
      HJ$ = CHR$(13)
'
' * SET THE MOST CRITICAL PARAMETERS
' *  12 = name of board
' *  29 = type pc
' * 162 = environment
' * 161 = max # nodes
' * 123 = min sec logon
' * 124 = default security
' *   8 = max sess time
' *   9 = max day time
' * 221 = comm port
' * 224 = ring to answer
' * 228 = baud rate
' * 121 = remote sysop name
'
     KSTACKED$ =   "8" + HJ$ +   "9" + HJ$ + _
                  "12" + HJ$ +  "29" + HJ$ + _
                 "121" + HJ$ + "123" + HJ$
     KSTACKED$ = KSTACKED$ + _
                 "124" + HJ$ + "161" + HJ$ + _
                 "162" + HJ$ + "221" + HJ$ + _
                 "224" + HJ$ + "228" + HJ$
     IX = 1
     RETURN
18800 CALL GETNUMYN ("Set the Parameters new in " + CONFIG.VERSION$,AB)
      IF NOT AB THEN _
         RETURN
      HJ$ = CHR$(13)
'
' * SET THE PARAMETERS NEW TO THIS RELEASE OF RBBS-PC
' *  60 = Speech synthesizer
' * 108 = Who subject to logon door
' * 109 = Doors control file
' * 156 = Auto alter security in conference
' * 157 = Sec to read/kill all messages
' * 158 = Screen msg lines
' * 168 = Default extension compressed files
'
      KSTACKED$ =    "60" + HJ$ + "108" + HJ$ + "109" + HJ$ + "156" + HJ$ + _
                    "157" + HJ$ + "158" + HJ$
      KSTACKED$ = KSTACKED$ + _
                    "168" + HJ$ + "END"
      IPAGE = 1
      RETURN
'
' * LET THE SYSOP SPECIFY THE NUMBER OF RECORDS IN THE USER FILE
'
19189 IF CONFERENCE.MODE = 2 THEN _
         GOSUB 22560 : _
         RETURN
      GOSUB 22100
      RETURN
'
' * ALLOW THE USER TO SPECIFY THE MAXIMUM NUMBER OF RBBS-PC'S TO CONFIGURE FOR
'
20000 LOCATE 18,1
      PRINT "NOTE:  PC-SIG believes that it is illegal to charge users for"
      PRINT "       downloading from the PC-SIG Library on a per download"
      PRINT "       basis.  Subscription fees of a reasonable nature are"
      PRINT "       acceptable."
      A$ = "Specify Library disk in the range A->" + M$ + "(or NONE) "
      MAX = 4
      GOSUB 13599
      LIBRARY.DRIVE$ = HJ$
      IF LEN(HJ$) > 1 AND HJ$ <> "NONE" THEN _
         GOTO 20000
      IF LIBRARY.DRIVE$ = "NONE" THEN _
         LIBRARY.DRIVE$ = "" _
      ELSE LIBRARY.DRIVE$ = LIBRARY.DRIVE$ + ":"
      RETURN
'
' * LIBRARY DIRECTORY/PATH
'
20010 GOSUB 15200
      LIBRARY.DIRECTORY.PATH$ = HJ$
      RETURN
'
' *  NAME OF 'LIBRARY DIRECTORY' FILE'S EXTENSION
'
20020 A$ = "Name of Library directory extension "
      GOSUB 13593
      LIBRARY.DIRECTORY.EXTENTION$ = HJ$
      RETURN
'
' * LIBRARY WORKING DISK
'
20030 GOSUB 15200
      LIBRARY.WORK.DISK.PATH$ = HJ$
      RETURN
20040 CALL MMINTEGER ("Max number of disks on Library (1-9999)",1,9999,LIBRARY.MAX.DISK)
      RETURN
20050 CALL MMINTEGER ("Max number of directories on Library (1-999)",1,999,LIBRARY.MAX.DIRECTORY)
      RETURN
20060 CALL MMINTEGER ("Number of subdirectories for each master (1-999)",1,999,LIBRARY.MAX.SUBDIR)
      RETURN
'
' * PREFIX OF LIBRARY SUBDIRECTORY
'
20070 A$ = "Prefix name of Library subdirectories in each master "
      MAX = 4
      GOSUB 13599
      LIBRARY.SUBDIR.PREFIX$ = HJ$
      RETURN
'
' *  NAME OF FILE SUBSECTION'S MENU
'
20080 GOSUB 17340
      MENU$(6) = HJ$
      RETURN
'
' *  ASSIGN SECURITY LEVELS TO THE LIBRARY MENU'S COMMANDS
'
20090 CALL SECURE ("LIBRARY",LIBRARY.COMMANDS.DEFAULTS$,NUM.LIBRARY,LIBRARY.FUNCTION$(),LIBRARY.FUNCTION(),LIBRARY.COMMANDS$)
      RETURN
'
' * DRIVE/PATH FOR ARCHIVE UTILITY
'
20100 GOSUB 15200
      LIBRARY.ARCHIVE.PATH$ = HJ$
      RETURN
'
' * PROCESS NAME OF ARCHIVE UTILITY
'
20110 CALL ASKRO ("Name of Archive utility ",24,HJ$)
      CALL ALLCAPS (HJ$)
      IF LEN(HJ$) < 1 OR LEN(HJ$) > 8 THEN _
         GOTO 20110
      LIBRARY.ARCHIVE.PROGRAM$ = HJ$
      CALL ASKRO ("Archive command ",24,HJ$)
      CALL ALLCAPS (HJ$)
      IF LEN(HJ$) > 8 THEN _
         GOTO 20110
      LIBRARY.ARCHIVE.PROGRAM$ = LIBRARY.ARCHIVE.PROGRAM$ + _
                                 " " + _
                                 HJ$
      RETURN
21750 CALL MMINTEGER ("Maximum number of concurrent RBBS-PC's? (1 - 36)",1,36,B1)
      IF MAXIMUM.NUMBER.OF.NODES = B1 THEN _
         RETURN
      B3! = MAX.MSG.FILE.SIZE.FRM.DEF!
      GOSUB 30610
      RETURN
21760 CALL MMINTEGER ("Size of internal BUFFER for text files (32-4096)",32,4096,BUFFER.SIZE)
      RETURN
21770 CALL MMINTEGER ("Size of internal BUFFER for Uploads (128-8192)",128,8192,WRITE.BUF.DEF)
      RETURN
21780 CALL MMINTEGER ("Max # of work variables in questionnaire/macros (13-99)",13,99,MAX.WORK.VAR)
      RETURN
'
' * IDENTIFY THE NETWORK TYPES THAT RBBS-PC CAN RUN IN
'
21810 SUBROUTINE.PARAMETER = 1
21820 CALL NETTYPE
      RETURN
21895 SUBROUTINE.PARAMETER = 2
      GOTO 21820
'
' * IDENTIFY THE VOICE SYNTHESIZER TYPES THAT RBBS-PC CAN SUPPORT
'
21900 SUBROUTINE.PARAMETER = 1
21903 CALL VOICETYPE
      RETURN
21905 SUBROUTINE.PARAMETER = 2
      GOTO 21903
'
' * ALLOW THE SYSOP TO SELECT NUMBER OF RECORDS IN THE USER FILE
'
21910 IF CONFERENCE.MODE = 2 THEN _
         GOSUB 22560 : _
         RETURN
      GOSUB 22100
      RETURN
'
' * ALLOW THE SYSOP TO SELECT HOW RBBS-PC IS TO RECYCLE WHEN A USER LOGS OFF
'
21950 CALL ASKRO ("How to recycle when users log off (<S>YSTEM or <I>NTERNAL)? ",24,HJ$)
      IF LEN(HJ$) < 1 OR LEN(HJ$) > 8 THEN _
         GOTO 21950
      CALL ALLCAPS (HJ$)
      IF LEFT$(HJ$,1) = "S" THEN _
         HJ$ = "SYSTEM" : _
         RECYCLE.TO.DOS = 1 : _
         GOTO 22020
      IF LEFT$(HJ$,1) = "I" THEN _
         HJ$ = "INTERNAL" : _
         RECYCLE.TO.DOS = 0 : _
         GOTO 22020
      GOTO 21950
22020 RECYCLE.TO.DOS$ = HJ$
      RETURN
22030 IF NETWORK.TYPE = 2 THEN _
         CALL ASKRO ("OMNI-NET cannot let message file grow.  Press [Enter] to continue",24,HJ$) : _
         RETURN
      CALL GETNUMYN ("Message file GROWS rather than FIXED in size",MESSAGES.CAN.GROW)
      RETURN
'
' * ALLOW THE SYSOP TO SPECIFY THE MAXIMUM NUMBER OF RECORDS IN MESSAGES FILE
'
22040 CALL ANYNUMBER ("Max. records in preformatted " + _
                       MAIN.MESSAGE.FILE$ + _
                      " file (>" + _
                       STR$(5*MAX.ALLOWED.MSGS.FRM.DEF + 1 + MAXIMUM.NUMBER.OF.NODES) + "):",B3!)
      IF B3! <= (5 * MAX.ALLOWED.MSGS.FRM.DEF + 1 + MAXIUM.NUMBER.OF.NODES) OR _
         B3! > 9999999! THEN _
         GOTO 22040
22080 B1 = MAXIMUM.NUMBER.OF.NODES
      GOSUB 30610
      MAX.MSG.FILE.SIZE.FRM.DEF! = B3!
      RETURN
'
' * BUILD THE USERS FILE TO SUIT
'
22100 FF = CURRENT.USER.COUNT
      IF FF > 1 THEN _
         FF = FF - 1
      CALL ANYINTEGER (STR$(FF) + _
                       " of" + _
                       STR$(HIGHEST.USER.RECORD) + _
                       " records used. Enter new max # of records for " + _
                       MAIN.USER.FILE$ + _
                       ":",B1)
22120 IF B1 < 1 OR B1 > 99999! OR _
         B1 < FF THEN _
         GOTO 22100
22140 B2 = 2
      WHILE B2 < B1
        B2 = B2 * 2
      WEND
      IF MAX.USR.FILE.SIZE.FRM.DEF = B2 THEN _
         RETURN
      CALL GETNUMYN ("Change " + _
                      MAIN.USER.FILE$ + _
                     " file to" + _
                      STR$(B2) + _
                     " records?",AB)
      IF NOT AB THEN _
         GOTO 22100
22150 MAX.USR.FILE.SIZE.FRM.DEF = B2
      D.FLAG = -1
      GOSUB 24110
      IB = 1
      MAX.USR.FILE.SIZE.FRM.DEF = B2
      HIGHEST.USER.RECORD = B2
      GOSUB 30450
      RETURN
'
' * COMMON ROUTINE TO NOTIFY THE USER WHEN READING DATA
'
22340 LOCATE 22,1
      PRINT SPACE$(15) + _
            TIME$ + _
            " " + _
            SPACE$(64);
      LOCATE 22,35
      COLOR 0,7
      PRINT " Reading Data, Wait a sec !!! ";
      COLOR FG,BG,BORDER
      RETURN
'
' * BEFORE EXITING, ASK USER IF HE WANTS TO WRITE OUT THE CHANGES OR QUIT
'
22350 CALL ASKRO ("Are you satisfied with all changes? (Y/N) or <Q>uit ",24,HJ$)
      GOSUB 22380
      ON AB GOTO 12190,59000,60360,22350
22380 IF LEN(HJ$) < 1 OR LEN(HJ$) > 4 THEN _
         GOTO 22470
      CALL ALLCAPS (HJ$)
      IF HJ$ = "NO" THEN _
         AB = 1 : _
         RETURN
      IF HJ$ = "N" THEN _
         HJ$ = "NO" : _
         AB = 1 : _
         RETURN
      IF HJ$ = "YES"  THEN _
         AB = 2 : _
         RETURN
      IF HJ$ = "Y" THEN _
         HJ$ = "YES" : _
         AB = 2 : _
         RETURN
      IF HJ$ = "QUIT" THEN _
         AB = 3 : _
         RETURN
      IF HJ$ = "Q" THEN _
         AB = 3 : _
         RETURN
22470 AB = 4
      RETURN
'
' * ASK THE USER WHICH RBBS-PC.DEF FILE CONFIG IS TO WORK WITH
'
22480 CALL MMINTEGER ("To which copy of RBBS-PC will these parameters apply (1 to 36)?",1,36,I)
      HJ$ = MID$(STR$(I),2)
      NODE.ID$ = MID$("1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ",VAL(HJ$),1)
      MID$(CONFIG.FILENAME$,5,1) = NODE.ID$
      RETURN
22550 CALL ASKRO ("Parameter " + _
                   OPTION$ + _
                  " unavailable with CONFIG " + _
                   CONFIG.VERSION$ + _
                  "!  CR to continue",24,A$)
      RETURN
22560 CALL ASKRO ("Parameter " + _
                   OPTION$ + _
                  " unavailable maintaining public conference! CR to continue",24,XX$)
      RETURN
'
' * REBUILD THE USER FILE
'
22570 A$ = "Rebuild the User File"
      GOSUB 22580
      IF CONFERENCE.MODE = 2 THEN _
         GOSUB 22560 : _
         RETURN
      CALL GETNUMYN ("Would you like a printed list of deleted users", _
                     PRINT.DELETED)
      D.FLAG = 0
      GOSUB 24110
      RETURN
'
' * GENERAL CONFIRMATION OF RESPONSES
'
22580 CALL GETNUMYN ("Really "+A$,AB)
      PRINT
      IF NOT AB THEN _
         RETURN 22582
22582 RETURN
'
' * PACK THE MESSAGES FILE
'
23160 A$ = "Pack the Message File"
      GOSUB 22580
      B1 = MAXIMUM.NUMBER.OF.NODES
      B3! = HIGHEST.MESSAGE.RECORD
      PURGE = -1
      GOSUB 30610
      RETURN
'
' * POINT TO THE NEXT MESSAGE HEADER IN THE MESSAGE FILE
'
23610 I = LOC(1) + VAL(MID$(MESSAGE.RECORD$,118,6)) - 1
      RETURN
'
' * REPAIR THE MESSAGES FILE
'
23620 RB = 1
      A$ = "Repair Message File"
      GOSUB 22580
'
' * PRINT THE HEADER RECORDS IN THE MESSAGES FILE
'
23630 SK = 0
      GOSUB 30040              ' <----Print message headers
      FILNUM = 1
      GOSUB 30050
      FIELD 1,128 AS MESSAGE.RECORD$
      FOR I = FIRST.MESSAGE.RECORD TO NEXT.MESSAGE.RECORD - 1
         GET 1,I
         IF VAL(MID$(MESSAGE.RECORD$,117,4)) > 0 AND _
            SK < VAL(MID$(MESSAGE.RECORD$,2,4)) THEN _
            SK = VAL(MID$(MESSAGE.RECORD$,2,4)) : _
            GOSUB 23610 _
         ELSE GOTO 23725
         I$ = "K"
         IF MID$(MESSAGE.RECORD$,116,1) = CHR$(225) THEN _
            I$ = "A
         IF LOC(1) > NEXT.MESSAGE.RECORD - 1 THEN _
            GOTO 23730
         PRINT LEFT$(MESSAGE.RECORD$,5) + " " + _
               MID$(MESSAGE.RECORD$,76,25) + " " + _
               MID$(MESSAGE.RECORD$,101,15) + " " + _
               I$ + " " + _
               MID$(MESSAGE.RECORD$,117,4) + " " + _
               STR$(LOC(1)) + " "  + _
               STR$(I)
         SK = VAL(MID$(MESSAGE.RECORD$,2,4))
         IF RB AND VAL(MID$(MESSAGE.RECORD$,2,4)) = CALLS.TODATE! THEN _
            GOTO 23730
         IF RB THEN _
            GOSUB 50580
23725 NEXT
23730 GET 1,1
      MID$(MESSAGE.RECORD$,1,8) = SPACE$(8)
      MID$(MESSAGE.RECORD$,1,8) = STR$(SK)
      HJ$ = RIGHT$("0"+MID$(STR$(MAXIMUM.NUMBER.OF.NODES),2),2)
      MID$(MESSAGE.RECORD$,127,2) = HJ$
      PUT 1,1
      CLOSE 1
      DELAY! = FNTI! + 5
      GOSUB 60440
      RETURN
'
' * ROUTINE TO INITIALIZE THE HAYES 2400 MODEM'S FIRMWARE
'
23731 LOCATE 25,5
      COMPORT% = VAL(RIGHT$(COM.PORT$,1)) -1
      IF COMPORT% < 0 THEN _
         PRINT "COM port cannot be set while using COM0" : _
         DELAY! = FNTI! + 3 : _
         GOSUB 60440 : _
         RETURN _
      ELSE PRINT "Setting modem firmware switches for RBBS-PC on " + COM.PORT$; ' KG062301
      DELAY! = FNTI! + 3
      GOSUB 60440
'
'
' * WHEN INITIALIZING THE HAYES 2400 VOLITILE MEMORY, SET THE FOLLOWING:
'
' *           &C1       = Indicate carrier detect if user is on-line
' *           &D3       = Use these settings when DTR drops
' *           B1        = Use Bell 212A when 1200 Baud is detected
' *           E0        = Do not echo modem commands back to the PC
' *           V1        = Issue long form of results codes
' *           M0        = Disable the speaker
'
'
23732 A$ = USER.INITIALIZE.COMMAND$
      IF VAL(MID$(USER.INIT.COMMAND$,INSTR(USER.INIT.COMMAND$,"S0=") + 3,3)) = 255 THEN _
         A$ = A$ + _
              "Q1"  ' Don't send results to the PC
23734 IF NOT FOSSIL THEN _
         GOTO 23736
      CALL FOSINIT(COMPORT%,RESULT%)
      IF RESULT% = -1 THEN _
         LOCATE 25,1 : _
         PRINT "ERROR initializing FOSSIL.  FOSSIL deactivated." : _
         FOSSIL = FALSE : _
         GOTO 23736
      COMSPEED% = VAL(MODEM.INIT.BAUD$)
      PARITY% = 2                                          ' NO PARITY
      DATABITS% = 3                                        ' 8 DATA BITS
      STOPBITS% = 0                                        ' 1 STOP BIT
      CALL FOSSPEED(COMPORT%,COMSPEED%,PARITY%,DATABITS%,STOPBITS%)
      STATE% = 1
      CALL FOSDTR(COMPORT%,STATE%)
      BYTES% = LEN(FIRMWARE.CLEAR.CMND$)
      CALL FOSWRITE(COMPORT%,BYTES%,FIRMWARE.CLEAR.CMND$)
      DELAY! = FNTI! + 3
      GOSUB 60440
      BYTES% = LEN(USER.FIRMWARE.WRITE.CMND$)
      CALL FOSWRITE(COMPORT%,BYTES%,USER.FIRMWARE.WRITE.CMND$)
      DELAY! = FNTI! + 3
      GOSUB 60440
      STATE% = 0
      CALL FOSDTR(COMPORT%,STATE%)
      GOTO 23739
23736 OPEN COM.PORT$ + ":2400,N,8,1,RS,CD,DS" AS #3
      PRINT #3,USER.FIRMWARE.CLEAR.CMND$ 'Clear and initialize to factory settings
      DELAY! = FNTI! + 3
      GOSUB 60440
      PRINT #3,A$ + USER.FIRMWARE.WRITE.CMND$
      GOSUB 60440
23739 IF FOSSIL THEN _
         CALL FOSEXIT(COMPORT%) : _
      ELSE CLOSE #3
      RETURN
'
' * ROUTINE TO RENUMBER THE MESSAGE FILE
'
23740 A$ = "Renumber the Message File"
      GOSUB 22580
      GOSUB 30040
23750 B1 = CALLS.TODATE!
      CALL GETINIT ("Renumber starting with OLD message # (<" + _
                     STR$(CALLS.TODATE! + 1) + _
                    ")",24,1,B1,RE,CR)
      IF CR THEN _
         RETURN
23810 CALL GETINIT ("Renumber starting with NEW message # ",24,1,9999,NE,CR)
      IF CR THEN _
         RETURN
      NE = NE - 1
      FILNUM = 1
      GOSUB 30050
      FIELD 1,128 AS MESSAGE.RECORD$
      FOR I  =  FIRST.MESSAGE.RECORD TO NEXT.MESSAGE.RECORD - 1
         GET 1,I
         X = ASC(MID$(MESSAGE.RECORD$,116))
         IF X = 225 OR X = 226 THEN _
            GOSUB 24010 : _
            GOSUB 23610
      NEXT
      GET 1,1
      MID$(MESSAGE.RECORD$,1,8) = SPACE$(8) ' Update the checkpoint record with the
      MID$(MESSAGE.RECORD$,1,8) = STR$(NE)  ' 1- 8  =  number of last message on system
      PUT 1,1
      CLOSE 1
      GOSUB 23905
      DELAY! = FNTI! + 1
      GOSUB 60440
      RETURN
'
' *  RESET LAST MESSAGE READ TO ZERO
'
23900 A$ = "Zero out last message read for all users"
      GOSUB 22580
23905 GOSUB 24020
      GOSUB 24025
      A! = HIGHEST.USER.RECORD
      XX$ = "Resetting Last Msg Read by User to 0.  Processing Record #"
      GOSUB 50345
      FOR J = 1 TO A!
         GET 1,J
         LOCATE 24,X
         PRINT J;
         HASH.VALUE$ = MID$(USER.RECORD$,START.HASH,LEN.HASH)
         LSET COMP.USER$ = HASH.VALUE$
         IF ASC(HASH.VALUE$) = 0 OR _
            COMP.USER$ = NEW.USER$ OR _
            COMP.USER$ = EMPTY.USER$ OR _
            COMP.USER$ = DELETED.USER$ THEN _
              GOTO 23955
         MID$(USER.OPTIONS$,3,2) = MKI$(0)  ' zero out last msg read
         PUT 1,J
23955 NEXT
      CLOSE 1
      RETURN
24010 LOCATE 24,15
      PRINT "Msg #" ; MID$(MESSAGE.RECORD$,1,5);
      IF VAL(MID$(MESSAGE.RECORD$,2,4)) < RE THEN _
         PRINT " read"; : _
         RETURN
      Y$ = MID$(MESSAGE.RECORD$,1,1)
      MID$(MESSAGE.RECORD$,1,5) = SPACE$(5)
      NE = NE + 1
      MID$(MESSAGE.RECORD$,1,5) = STR$(NE)
      MID$(MESSAGE.RECORD$,1,1) = Y$
      PRINT " renumbered as Msg #" + MID$(MESSAGE.RECORD$,1,5)
      PUT 1,I
      RETURN
'
' * ROUTINE TO PACK THE USERS FILE
'
24020 GOSUB 30060
      FIELD 1,  31 AS USER.NAME$, _
                15 AS PASSWORD$, _
                 2 AS SECURITY.LEVEL$, _
                14 AS USER.OPTIONS$, _
                24 AS CITY.STATE$, _
                19 AS MACHINE.TYPE$, _
                14 AS LAST.DATE.TIME.ON$, _
                 3 AS LIST.NEW.DATE$, _
                 2 AS USER.DOWNLOADS$, _
                 2 AS USER.UPLOADS$, _
                 2 AS ELASPED.TIME$
      FIELD 1, 128 AS USER.RECORD$
      RETURN
'
' *  SHARED ROUTINE TO SET UP USER PROCESSING
'
24025 IF LEN.HASH < 7 THEN _
         NU = LEN.HASH _
      ELSE NU = 7
      NEW.USER$ = LEFT$("NEWUSER",NU)
      EMPTY.USER$ = SPACE$(NU)
      DELETED.USER$ = LEFT$("deleted user",NU)
      COMP.USER$ = EMPTY.USER$
      RETURN
24040 CALL GETNUMYN ("Make Hilight if and only if color graphics selected",X)
      IF NOT X THEN _
         RETURN
      GOTO 24052
'
' *  SET FLAG TO "FALSE" ON ANSWERED REQUIRED QUESTIONNAIRE AS DEFAULT
'
24050 A$ = "Make all callers answer required questionnaire once"
      GOSUB 22580
24052 GOSUB 24020
      GOSUB 24025
      A! = HIGHEST.USER.RECORD
      XX$ = "Processing Record #"
      GOSUB 50345
      FOR J = 1 TO A!
         GET 1,J
         LOCATE 24,X
         PRINT J;
         HASH.VALUE$ = MID$(USER.RECORD$,START.HASH,LEN.HASH)
         LSET COMP.USER$ = HASH.VALUE$
         IF ASC(HASH.VALUE$) = 0 OR _
            COMP.USER$ = NEW.USER$ OR _
            COMP.USER$ = EMPTY.USER$ OR _
            COMP.USER$ = DELETED.USER$ THEN _
              GOTO 24055
         USER.OPTIONS = CVI(MID$(USER.OPTIONS$,9,2))
         IF ILOOKUP = 12 THEN _
            K = ((ASC(MID$(USER.OPTIONS$,6,1)) MOD 3) = 2) : _
            IF K THEN _
               USER.OPTIONS = USER.OPTIONS OR 1024 _ ' hilite
            ELSE USER.OPTIONS = USER.OPTIONS AND 1023 _ ' don't hilite
         ELSE USER.OPTIONS = USER.OPTIONS AND 1791 'Zero out Req Ques flag
         MID$(USER.OPTIONS$,9,2) = MKI$(USER.OPTIONS)
         PUT 1,J
24055 NEXT
      CLOSE 1
      RETURN
'
' COMMON ROUTINE TO EXPAND OR CONTRACT THE USER FILE
'
24110 GOSUB 30040
      IF NO.OLD.FILE THEN _
         GOTO 24111
      GOSUB 24020
      GOSUB 50350
      A$ = F$
      GOSUB 50095
24111 IF NETWORK.TYPE = 6 THEN _
         OPEN A$ FOR RANDOM SHARED AS #2 LEN = 128 _
      ELSE OPEN "R",2,A$,128
      FIELD 2,  31 AS USER.NAME.N$, _
                15 AS PASSWORD.N$, _
                 2 AS SECURITY.LEVEL.N$, _
                14 AS USER.OPTIONS.N$, _
                24 AS CITY.STATE.N$, _
                19 AS MACHINE.TYPE.N$, _
                14 AS LAST.DATE.TIME.ON.N$, _
                 3 AS LIST.NEW.DATE.N$, _
                 2 AS USER.DOWN.LOADS.N$, _
                 2 AS USER.UPLOADS.N$, _
                 2 AS ELAPSED.TIME.N$
      FIELD 2, 128 AS USER.RECORD.N$
      CURRENT.MONTH = VAL(LEFT$(DATE$,2)) + (VAL(RIGHT$(DATE$,2)) * 12)
      A! = 0
      GOSUB 50840
      CURRENT.USER.COUNT = 1
      IF NO.OLD.FILE THEN _
         HIGHEST.USER.RECORD = A! : _
         MAX.USR.FILE.SIZE.FRM.DEF = HIGHEST.USER.RECORD : _
         GOSUB 30450 : _
         RETURN
      A! = LOF(1) / 128.0!
      GOSUB 24025
      PURGED.COUNT = 0
24112 FOR J  =  1 TO A!
         GET 1
24114    HASH.VALUE$ = MID$(USER.RECORD$,START.HASH,LEN.HASH)
         LSET COMP.USER$ = HASH.VALUE$
24116    MONTH.OF.LAST.LOGON = VAL(LEFT$(LAST.DATE.TIME.ON$,2)) + _
                               (VAL(MID$(LAST.DATE.TIME.ON$,7,2)) * 12)
         MONTHS.SINCE.LAST.LOGON = CURRENT.MONTH - MONTH.OF.LAST.LOGON
         IF COMP.USER$ = NEW.USER$ OR _
            COMP.USER$ = DELETED.USER$ THEN _
            A$ = "" : _
            GOTO 24430
         X = ASC(HASH.VALUE$)
         IF X = 0 OR _
            COMP.USER$ = EMPTY.USER$ THEN _
            GOTO 24450
         Y = 1
24280    IF X < 32 OR X > 126 THEN _
            A$ = "Bad name" : _
            GOTO 24430
         IF Y < LEN.HASH THEN _
            Y = Y + 1 : _
            X = ASC(MID$(HASH.VALUE$,Y,1)) : _
            GOTO 24280
         HJ$ = "copied"
         IF D.FLAG THEN _
            GOTO 24290
         SECURITY.LEVEL = CVI(SECURITY.LEVEL$)
         IF SECURITY.LEVEL => SEC.LVL.EXEMPT.FRM.PURGING THEN _
            HJ$ = "exempt" : _
            GOTO 24290                           ' copy users exempt from purges
         IF SECURITY.LEVEL < MINIMUM.LOGON.SECURITY THEN _
            HJ$ = "locked" : _
            GOTO 24290                                 ' copy "locked-out" users
         IF MONTHS.SINCE.LAST.LOGON > ACT.MNTHS.B4.DELETING THEN _
            A$ = "(Last on " + LAST.DATE.TIME.ON$ + ") " + _
                 STR$(MONTHS.SINCE.LAST.LOGON) : _
            GOTO 24430                                     'Purge inactive users
         Y = 1
24290    PRINT STR$(LOC(1)) ; ": " ; HASH.VALUE$ ; " " ; HJ$ ; "...";
         GOSUB 50720
         PRINT STR$(MONTHS.SINCE.LAST.LOGON)
         GOTO 24450
24430    PRINT STR$(LOC(1)) ; ": " ; HASH.VALUE$ ; " ... purged " ; A$
         IF PRINT.DELETED THEN _
            LPRINT STR$(LOC(1)) ; ": " ; HASH.VALUE$ ; " ... purged " ; A$
         PURGED.COUNT = PURGED.COUNT + 1
24450 NEXT
      CLOSE 1,2
      MAX.USR.FILE.SIZE.FRM.DEF = HIGHEST.USER.RECORD
      GOSUB 30450
24730 PRINT PURGED.COUNT;" USERS PURGED"
      CALL GETNUMYN ("Delete the old " + _
                      MAIN.USER.FILE$ + _
                     " file?",AB)
      IF AB THEN _
         GOTO 24770
24750 A$ = MAIN.USER.FILE$
      GOSUB 50096
      NAME MAIN.USER.FILE$ AS A$
      GOTO 24780
24770 KILL MAIN.USER.FILE$
24780 GOSUB 50350
      A$ = F$
      GOSUB 50095
      NAME A$ AS MAIN.USER.FILE$
      RETURN
24790 CALL GETNUMYN ("Really check FMS directory",AB)
      IF NOT AB THEN _
         RETURN
      CALL CHKFMSDIR (DIRECTORY.PATH$ + FMS.DIRECTORY$ + "." + DIRECTORY.EXTENTION$,MAX.DESC.LEN + 36,DIR.CATEGORY.FILE$)
      RETURN
'
' * ROUTINE TO RESET ACTIVE PRINTERS FOR ALL NODES
'
24795 FILNUM = 2
      GOSUB 30050
      FIELD 2,128 AS RR$
      FOR J! = 2 TO MAXIMUM.NUMBER.OF.NODES + 1
         GET 2,J!
         MID$(RR$,38,2) = " 0"
         PUT 2,J!
      NEXT
      CLOSE 2
      RETURN
'
' * ROUTINE TO DISPLAY THE PAGE HEADER FOR CONFIG'S DISPLAYS
'
24800 CLS
      I! = FRE(C$)
      COLOR 0,7,0
      LOCATE 1,10
      PRINT "RBBS-PC CPC17 Default Configuration " + CONFIG.VERSION$;
      IF CONFERENCE.MODE THEN _
         GOSUB 24970
      COLOR FG,BG,BORDER
      PRINT " Page" + STR$(DISPLAYED.PAGE.NUMBER) + " of" + STR$(MAXIMUM.DISPLAYABLE.PAGES)
      RETURN
'
' * ROUTINE TO DISPLAY CONFERENCE MAINTENANCE MODE IN CONFIG'S DISPLAYS
'
24970 LOCATE 2,1
      PRINT SPACE$(10)
      LOCATE 2,10
      A$ = "Private"
      IF CONFERENCE.MODE = 2 THEN _
         A$ = "Public"
      COLOR 31,0,0
      PRINT "(" + A$ + " Conference Maintenance Mode for " + _
            MID$(MAIN.MESSAGE.FILE$,1,INSTR(MAIN.MESSAGE.FILE$,"M.DEF") - 1) + _
            ")";
      RETURN
'
' * COMMON SUBROUTINE TO DISPLAY ACTIVITY WHEN PACKING/PURGING FILES
'
25020 XX$ = "In file " + _
            MAIN.USER.FILE$ + _
            " " + _
            A$ + _
            " record"
      GOTO 25035
25030 IF PURGE THEN _
         RETURN
      XX$ = A$ + _
            " file " + _
            MAIN.MESSAGE.FILE$ + _
            " record"
25035 GOSUB 50345
      RETURN
'
' * ALLOW THE SYSOP TO ENTER/EXIT/CHANGE CONFERENCE MAINTENANCE MODE
'
25040 REFRESH = 0
      IF CONFERENCE.MODE = 0 THEN _
         GOTO 25050
      GOSUB 30100
      CALL GETNUMYN ("End conference maintenance?",AB)
      IF NOT AB THEN _
         GOTO 25050
25044 MAIN.MESSAGE.FILE$ = MAINMSG$
      MAIN.USER.FILE$ = MAINUSR$
      REFRESH = 1
      RETURN
25050 CALL ASKRO ("Enter the name of the conference (7 characters or less) ",24,HJ$)
      IF LEN(HJ$) < 1 OR LEN(HJ$) > 7 THEN _
         GOTO 25040
      CALL ALLCAPS (HJ$)
      CP$ = HJ$
25090 X$ = "this conference's files"
      GOSUB 15205
      CP$ = HJ$ + _
            CP$
      MAIN.MESSAGE.FILE$ = CP$ + _
                           "M.DEF
25142 CALL GETNUMYN ("Does this conference have a user's file?",AB)
      IF AB THEN _
         GOTO 25160
25144 CONFERENCE.MODE = 2
      GOTO 25170
25160 CONFERENCE.MODE = 1
      UG = 0
      MAIN.USER.FILE$ = CP$ + _
                        "U.DEF"
25170 REFRESH = 2
      RETURN
'
' * ESTABLISH IF THE SYSOP WANTS TO USE DOS SUB-DIRECTORIES
'
25380 CALL GETNUMYN ("Will you be using DOS sub-directories?",WILL.SUBDIRS.B.USED)
      IF WILL.SUBDIRS.B.USED THEN _
         RETURN
      UPLOAD.TO.SUBDIR = FALES
      DOWNLOAD.TO.SUBDIR = FALSE
      RETURN
25420 CALL GETNUMYN ("Are uploads to a DOS sub-directory?",UPLOAD.TO.SUBDIR)
      RETURN
25460 CALL GETNUMYN ("Are downloads from DOS sub-directories?",DOWNLOAD.TO.SUBDIR)
      RETURN
'
' * HANDLE SUB-DIRECTORY INPUTS (LIST, CHANGE, ADD, DELETE) AND PUT IN .DEF
'
25495 IF NOT UPLOAD.TO.SUBDIR THEN _
         GOTO 25497
      A$ = "upload"
      CALL GETNUMYN ("Change upload DOS sub-directory?",AB)
      IF AB THEN _
         GOTO 25500
25497 IF NOT DOWNLOAD.TO.SUBDIR THEN _
         RETURN
      A$ = "download"
      CALL GETNUMYN ("Modify download DOS sub-directories?",AB)
      IF AB THEN _
         GOTO 25505
25498 RETURN
25500 IF UPLOAD.SUBDIR$ = "" THEN _
         GOTO 25502
25501 LOCATE 23,5
      PRINT SPC(74)
      LOCATE 23,5
      PRINT "Current " + A$ + " DOS sub-directory name is " + UPLOAD.SUBDIR$;
25502 GOSUB 25850
      IF LEN(HJ$) < 1 THEN _
         GOTO 25505
      IF DRIVE.FOR.UPLOADS$ = MID$(X$,1,1) THEN _
         SWAP UPLOAD.SUBDIR$,X$ : _
         IF X$ = "" THEN _
            GOTO 25501 _
         ELSE 25505
      GOTO 25502
25505 IF A$="upload" THEN _
         GOTO 25497
      IF NOT DOWNLOAD.TO.SUBDIR THEN _
         RETURN
      LOCATE 23,5
      PRINT SPC(74)
      LOCATE 23,5
      PRINT STR$(DNLD.SUB) + " of 99 download subdirectories designated.";
25510 CALL ASKRO ("L>ist, C>hange, A>dd, D>elete " + A$ +" DOS sub-directories? (CR ends) ",24,HJ$)
      CALL ALLCAPS (HJ$)
      IF LEN(HJ$) < 1 THEN _
         GOTO 25498
      IF LEN(HJ$) <> 1 THEN _
         GOTO 25505
      FF = INSTR("LCAD",HJ$)
      IF FF = 0 THEN _
         GOTO 25510
      IF DNLD.SUB = 0 AND FF <> 3 THEN _
         GOTO 25510
      ON FF GOSUB 25610,25670,25730,25670
      GOTO 25505
25610 LAST = (DNLD.SUB/16) + 1
      INCR = 1
      FOR IX = 1 TO LAST
         GOSUB 24800
         LOCATE 4,1
         PRINT "DOS sub-directories from which downloads are done:";
         INDEX = 4
         FOR I = 1 TO 16
            LOCATE INDEX + I,1
            PRINT DNLD$(INCR);
            INCR = INCR + 1
            IF INCR > DNLD.SUB THEN _
               GOTO 25668
         NEXT
25636    CALL GETNUMYN ("More",AB)
         IF NOT AB THEN _
            GOTO 25668
25644 NEXT
25668 RETURN
25670 GOSUB 25850
      IF LEN(HJ$) < 1 THEN _
         RETURN
      GOSUB 26030
      A$ = " not found!"
      IF X$ = "" THEN _
         GOTO 25682
      FOR I = 1 TO DNLD.SUB
         IF X$ = DNLD$(I) THEN _
            GOTO 25698
      NEXT
25682 CALL ASKRO (X$ + A$ + " (CR to continue)",24,HJ$)
      A$ = "download"
      RETURN
25698 IF FF = 4 THEN _
         FOR X = I TO DNLD.SUB : _
            DNLD$(X) = DNLD$(X + 1) : _
         NEXT : _
         A$ = " deleted!" : _
         DNLD.SUB = DNLD.SUB - 1 : _
         GOTO 25682
      IF FF = 2 THEN _
         A$ = "download" : _
         NEXT.MESSAGE.RECORD = I : _
         GOSUB 25850 : _
         GOSUB 26030 : _
         SWAP DNLD$(NEXT.MESSAGE.RECORD),X$ : _
         A$ = " changed!" : _
         GOTO 25682
25730 X$ = ""
      GOSUB 25850
      IF LEN(HJ$) < 1 THEN _
         RETURN
      FOR I = 1 TO LEN(DRIVES.FOR.DOWNLOADS$)
         IF MID$(DRIVES.FOR.DOWNLOADS$,I,1) = LEFT$(X$,1) THEN _
            GOTO 25735
      NEXT
      GOSUB 60380
      CALL ASKRO (X$ + " is not a drive eligible for downloading. (CR to continue)",24,HJ$)
      GOTO 25730
25735 IF X$ = "" THEN _
         GOTO 25498
      DNLD.SUB = DNLD.SUB + 1
      DNLD$(DNLD.SUB) = X$
      RETURN
'
' * HANDLE SUB-DIRECTORY NAMES AND CHECK FOR THEIR VALIDITY
'
25850 CALL ASKRO ("Enter " + A$ + " DOS sub-directory name (CR to end). ",24,HJ$)
      CALL ALLCAPS (HJ$)
      IF LEN(HJ$) < 1 THEN _
         RETURN
      IF LEN(HJ$) = 2 AND INSTR(HJ$,":") = 2 THEN _
         X$ = HJ$ : _
         RETURN
      IF INSTR(HJ$,":\") <> 2 THEN _
         GOTO 25850
      X$ = HJ$
      FOR I = 4 TO LEN(X$)
         Y = INSTR(I,X$,"\")
         IF Y = 0 THEN _
            L1 = LEN(X$) - I + 1 : _
            GOTO 25876
         IF Y <> 0 THEN _
            L1 = Y - I + 1 : _
            GOTO 25876
      NEXT
25876 HJ$ = MID$(X$,I,L1)
      IF LEN(HJ$) > 12 THEN _
         GOTO 25850
      L1 = INSTR(HJ$,".")
      IF L1 = 0 THEN _
         IF LEN(HJ$) < 9 THEN _
            GOTO 25920 _
         ELSE GOTO 25850
      IF L1 > 9 THEN _
         GOTO 25850
      IF L1 < 2 THEN _
         GOTO 25850
      IF LEN(HJ$) - L1 > 3 THEN _
         GOTO 25850
      I = 0
      GOSUB 25920
      IF I = 0 THEN _
         RETURN
      GOTO 25850
25920 FOR J = 1 TO LEN(HJ$)
         X = ASC(MID$(HJ$,J,1))
         IF (X > 63 AND X < 91) THEN _
            GOTO 26020
         IF (X > 47 AND X < 58) THEN _
            GOTO 26020
         IF (X = 33) THEN _
            GOTO 26020
         IF (X > 34 AND X < 42) THEN _
            GOTO 26020
         IF (X > 43 AND X < 47) THEN _
            GOTO 26020
         IF (X > 96 AND X < 124) THEN _
            GOTO 26020
         IF (X = 125) THEN _
            GOTO 26020
         I = 1
         RETURN
26020 NEXT
      RETURN
'
' * VERIFY THAT THE DISK DRIVE IS ONE ELIGIBLE FOR DOWNLOADING
'
26030 FOR I = 1 TO LEN(DRIVES.FOR.DOWNLOADS$)
         IF MID$(DRIVES.FOR.DOWNLOADS$,I,1) = MID$(X$,1,1) THEN _
            RETURN
      NEXT
      X$ = ""
      RETURN
'
' * ALLOW THE SYSOP TO SELECT THE TIME OF DAY THAT RBBS-PC IS TO DROP TO DOS
'
26040 CALL GETNUMYN ("Is RBBS-PC to drop to DOS at a specific time each day?",AB)
      TIME.TO.DROP.TO.DOS = 0
      IF AB THEN _
         GOTO 26060
26050 GOTO 26065
26060 CALL GETINIT ("Time of day (HHMM) to drop to DOS--0000 to 2359? (ENTER = No)",24,0,2359,TIME.TO.DROP.TO.DOS,CR)
26065 RETURN
'
' * IDENTIFY THE NET WORK MAIL TYPE THAT RBBS-PC IS RUNNING IN
'
26070 CLS
      LOCATE 3,5
      PRINT "RBBS-PC supports the following store-and-forward mail systems:"
      LOCATE 5,20
      PRINT "Environment"
      LOCATE 7,10
      PRINT "0. None"
      LOCATE 9,10
      PRINT "1. SeaDog"
      LOCATE 11,10
      PRINT "2. Binkley Term"
      LOCATE 13,10
      PRINT "3. X.400 (to be supported in the future)"
      LOCATE 15,10
      PRINT "4. GTE's PC-Pursuit (to be supported in the future)"
      LOCATE 17,10
      PRINT "5. G.E.'s GENIE's QuikComm (to be supported in the future)"
26080 CALL GETINIT ("Select network mail type (0 to 5, CR to end)",24,0,5,AB,CR)
      NET.MAIL$ = "<none>"
      IF AB = 1 THEN _
         NET.MAIL$ = "SeaDog"
      IF AB = 2 THEN _
         NET.MAIL$ = "BINKLEY TERM"
      RETURN
26100 CALL GETASCII ("Turn Echo On",HOST.ECHO.ON$)
      RETURN
26105 CALL GETASCII ("Line Acknowledge",DEFAULT.LINE.ACK$)
      RETURN
26110 CALL GETASCII ("Turn Echo Off",HOST.ECHO.OFF$)
      RETURN
26115 CALL GETASCII ("Turn Graphic Emphasis ON",EMPHASIZE.ON.DEF$)
      RETURN
26120 CALL GETASCII ("Turn Graphic Emphasis OFF",EMPHASIZE.OFF.DEF$)
      RETURN
'
' * CHECK TO SEE IF A FILE EXIST (COMMON SUBROUTINE)
'
30000 CALL FINDFILE (FILE$,OKAY) ' <---- check to see if file exists
30030 RETURN
'
' * COMMON SUBROUTINE TO READ THE MESSAGES FILE'S CHECKPOINT RECORD
'
30040 FILNUM = 2
      GOSUB 30050
      FIELD 2,128 AS RR$
      GET 2,1
      CALLS.TODATE! = VAL(MID$(RR$,1,8))             '  1-  8 = number of last message on system
      AUTO.ADD.SECURITY = CVI(MID$(RR$,9,2))         '  9- 10 = min. security to auto. add a user
      CURRENT.USER.COUNT = VAL(MID$(RR$,57,5))       ' 57- 61 = next avail. user record
      FIRST.MESSAGE.RECORD = VAL(MID$(RR$,68,7))     ' 68- 74 = first rec. of msgs file
      IF FIRST.MESSAGE.RECORD < 3 THEN _
         FIRST.MESSAGE.RECORD = 3
      NEXT.MESSAGE.RECORD = VAL(MID$(RR$,75,7))      ' 75- 81 = next avail. msgs record
      HIGHEST.MESSAGE.RECORD = VAL(MID$(RR$,82,7))   ' 82- 88 = last rec. of msgs file
      MAXIMUM.NUMBER.OF.MSGS = VAL(MID$(RR$,89,7))   ' 89- 95 = maximum number of messages
      MAXIMUM.NUMBER.OF.NODES = VAL(MID$(RR$,127,2)) '127-128 = maximum number of "nodes"
      IF MAXIMUM.NUMBER.OF.NODES < 1 THEN _
         MAXIMUM.NUMBER.OF.NODES = 1
      CLOSE 2
      FIRST.USER.RECORD = 1
      IF MAIN.MESSAGE.FILE$ = MAINMSG$ THEN _
         AUTO.ADD.SECURITY$ = "CONF. ONLY" _
      ELSE AUTO.ADD.SECURITY$ = MID$(STR$(AUTO.ADD.SECURITY),2)
      RETURN
' * OPEN MESSAGE FILE
30050 CLOSE FILNUM
      IF NETWORK.TYPE = 6 THEN _
         OPEN MAIN.MESSAGE.FILE$ FOR RANDOM SHARED AS #FILNUM LEN = 128 _
      ELSE OPEN "R",FILNUM,MAIN.MESSAGE.FILE$,128
      RETURN
' * OPEN USER FILE
30060 CLOSE 1
      IF NETWORK.TYPE = 6 THEN _
         OPEN MAIN.USER.FILE$ FOR RANDOM SHARED AS #1 LEN = 128 _
      ELSE OPEN "R",1,MAIN.USER.FILE$,128
      RETURN
'
' * COMMON ROUTINE TO UPDATE AUTO ADD SECURITY TO CONFERENCE FILE
'
30100 FILNUM = 1
      GOSUB 30050
      FIELD 1,8 AS MR1$, 2 AS MR2$, 118 AS MR3$
      GET 1,1
      LSET MR2$ = MKI$(AUTO.ADD.SECURITY)
      PUT 1,1
      CLOSE 1
      RETURN
'
' * COMMON SUBROUTINE TO UPDATE MESSAGES FILE'S CHECKPOINT RECORD
'
30450 FILNUM = 2
      GOSUB 30050
      FIELD 2,128 AS RR$
      GET 2,1
      MID$(RR$,9,2)   = MKI$(AUTO.ADD.SECURITY)      '  9- 10 = min. security to auto. add a user
      MID$(RR$,57,5)  = LEFT$(STR$(CURRENT.USER.COUNT)  +SPACE$(5),5) ' 57- 61 = next avail. user record
      MID$(RR$,68,7)  = LEFT$(STR$(FIRST.MESSAGE.RECORD)+SPACE$(7),7) ' 68- 74 = first rec. of msgs file
      MID$(RR$,75,7)  = LEFT$(STR$(NEXT.MESSAGE.RECORD) +SPACE$(7),7) ' 75- 81 = next avail. msgs record
      MID$(RR$,82,7)  = LEFT$(STR$(HIGHEST.MESSAGE.RECORD)+SPACE$(7),7) ' 82- 88 = last rec. of msgs file
      MID$(RR$,89,7)  = LEFT$(STR$(MAXIMUM.NUMBER.OF.MSGS)+SPACE$(7),7) ' 89- 95 = maximum number of messages
      HJ$ = STR$(MAXIMUM.NUMBER.OF.NODES)
      IF MAXIMUM.NUMBER.OF.NODES>9 THEN _
         HJ$ = MID$(STR$(MAXIMUM.NUMBER.OF.NODES),2,2)
      MID$(RR$,127,2) = HJ$                          '127-128 = maximum number of "nodes"
      PUT 2,1
      CLOSE 2
      RETURN
'
' * COMMON ROUTINE TO EXPAND/CONTRACT A MESSAGES FILE
'
30610 A$ = MAIN.MESSAGE.FILE$
      IF NO.OLD.FILE THEN _
         GOTO 30612
      FILNUM = 1
      GOSUB 30050
      FIELD 1,128 AS MESSAGE.RECORD$
      GOSUB 50095
30612 CLOSE 2
      IF NETWORK.TYPE = 6 THEN _
         OPEN A$ FOR RANDOM SHARED AS #2 LEN = 128 _
      ELSE OPEN "R",2,A$,128
      FIELD 2,128 AS RR$
      A$="Copying"
      IF NO.OLD.FILE THEN _
         A$ = "Creating preformatted"
      OE = B1
      IF MAXIMUM.NUMBER.OF.NODES <= B1 THEN _
         OE = MAXIMUM.NUMBER.OF.NODES
      FOR J=1 TO OE + 1                 ' WRITE CHECKPOINT AND NODE RECORDS
         IF NO.OLD.FILE AND J = 1 THEN _
            GOSUB 31040
         IF NO.OLD.FILE AND J <> 1 THEN _
            GOSUB 31050
         IF NO.OLD.FILE = FALSE THEN _
            GET 1,J : _
            LSET RR$ = MESSAGE.RECORD$
         PUT 2
         GOSUB 25030
      NEXT
      IF NO.OLD.FILE THEN _
         GOTO 30850
      IF B1 <= MAXIMUM.NUMBER.OF.NODES THEN _
         GOTO 30780
      FOR J = OE + 1 TO B1             ' WRITE OUT EXPANISON NODE RECORDS
         GOSUB 31050
         PUT 2
         GOSUB 25030
      NEXT
30780 MAXIMUM.NUMBER.OF.NODES = B1     ' SET VALUE FOR MAXIMUM NUMBER OF NODES
      JX = FIRST.MESSAGE.RECORD
      GET 1,JX
      WHILE VAL(MID$(MESSAGE.RECORD$,2,4)) = 0 AND (JX < NEXT.MESSAGE.RECORD)
         JX = JX + 1
         GET 1, JX
      WEND
      IF JX > FIRST.MESSAGE.RECORD THEN _
         PRINT (JX-FIRST.MESSAGE.RECORD);" bad records purged"
      FOR J = JX TO NEXT.MESSAGE.RECORD - 1
30830    GET 1,J
         IF PURGE <> -1 THEN _
            GOTO 30840
         IF MID$(MESSAGE.RECORD$,116,1) = CHR$(225) THEN _
            IF VAL(MID$(MESSAGE.RECORD$,2,4)) < 1 THEN _
               PRINT " bad header purged..." : _
               GOTO 30842 _
            ELSE PRINT "Msg #" + LEFT$(MESSAGE.RECORD$,5) + " copied..." : _
                 GOTO 30840
         IF MID$(MESSAGE.RECORD$,116,1) = CHR$(226) THEN _
            PRINT "Msg #" + LEFT$(MESSAGE.RECORD$,5) + "          purged..." : _
            J = LOC(1) + VAL(MID$(MESSAGE.RECORD$,117,4)) : _
            GOTO 30830
30840    LSET RR$ = MESSAGE.RECORD$
         PUT 2                    ' WRITE OUT MESSAGE RECORD
         GOSUB 25030
30842 NEXT
      B1 = LOC(2) + 1             ' GET NEW FILE'S NEXT MESSAGE RECORD
      CLOSE 1
      IF B3! < LOC(2) + 1 THEN _
         GOTO 30960
30850 IF NO.OLD.FILE OR PURGE THEN _
         NEXT.MESSAGE.RECORD = LOC(2) + 1 : _
         PURGE = 0 : _
         A$ = "Preformatting"
      IF MESSAGES.CAN.GROW THEN _
         GOTO 30960
      GOSUB 25030
      FOR J! = NEXT.MESSAGE.RECORD TO B3!
         LSET RR$ = SPACE$(128)
         PUT 2                    ' WRITE OUT EXPANSION MESSAGE RECORDS
         LOCATE 24,X
         PRINT STR$(LOC(2)) + SPACE$(10);
      NEXT
30960 FIRST.MESSAGE.RECORD = 1 + MAXIMUM.NUMBER.OF.NODES + 1
      NEXT.MESSAGE.RECORD = B1
      IF NEXT.MESSAGE.RECORD < FIRST.MESSAGE.RECORD THEN _
         NEXT.MESSAGE.RECORD = FIRST.MESSAGE.RECORD
      HIGHEST.MESSAGE.RECORD = LOC(2)
      CLOSE 2
30980 IF NO.OLD.FILE THEN _
         RETURN
      CALL GETNUMYN ("Delete the old " + _
                      MAIN.MESSAGE.FILE$ + _
                     " file?",AB)
      IF AB THEN _
         GOTO 31020
31000 A$ = MAIN.MESSAGE.FILE$
      GOSUB 50096
      NAME MAIN.MESSAGE.FILE$ AS A$
      GOTO 31030
31020 KILL MAIN.MESSAGE.FILE$
31030 A$ = MAIN.MESSAGE.FILE$
      GOSUB 50095
      NAME A$ AS MAIN.MESSAGE.FILE$
      GOSUB 30450
31035 RETURN
'
' * COMMON SUBROUTINE TO CREATE A BLANK "CHECKPOINT" RECORD IN THE MESSAGE FILE
'
31040 LSET RR$ = " 1      " + _               ' NUMBER OF LAST MESSAGE
                 MKI$(0) + _                  ' SECURITY LEVEL TO AUTO-ADD USER
                 SPACE$(116) + _              ' BLANKS IN ALL OTHER FIELDS
                 RIGHT$("0"+MID$(STR$(MAXIMUM.NUMBER.OF.NODES),2),2)
      RETURN
'
' * COMMON SUBROUTINE TO CREATE A BLANK "NODE" RECORD IN THE MESSAGE FILE
'
31050 LSET RR$ = SPACE$(31) + "-1 0 0 0 0 0 0 0    0 0 0I"
      RETURN
'
' * COMMON SUBROUTINE TO MAKE SURE A WORK FILE HAS ".BAK" AS AN EXTENSION
'
50095 IF INSTR(A$,".") THEN _
         A$ = MID$(A$,1,INSTR(A$,".") - 1) + _
              ".BAK" : _
         RETURN _
      ELSE A$ = A$ + _
                ".BAK" : _
      RETURN
'
' * COMMON SUBROUTINE TO MAKE SURE SAVED FILES HAVES ".OLD" AS AN EXTENSION
'
50096 IF INSTR(A$,".") THEN _
         A$ = MID$(A$,1,INSTR(A$,".") - 1) + _
              ".OLD" : _
         RETURN _
      ELSE A$ = A$ + _
                ".OLD" : _
      RETURN
'
' * COMMON SUBROUTINE TO DISPLAY A MESSAGE ON LINE 24
'
50345 I! = FRE(C$)
50346 LOCATE 24,1
      PRINT SPACE$(5)+XX$+SPACE$(74-LEN(XX$));
      X = 5 + LEN(XX$) + 1
      RETURN
50350 F$ = MAIN.USER.FILE$
      IF INSTR(MAIN.USER.FILE$,".") THEN _
         F$ = MID$(MAIN.USER.FILE$,1,INSTR(MAIN.USER.FILE$,".") - 1)
      RETURN
'
' * COMMON SUBROUTINE TO GET LENGTH OF THE USERS FILE
'
50480 MAX.USR.FILE.SIZE.FRM.DEF = 8
      HIGHEST.USER.RECORD = MAX.USR.FILE.SIZE.FRM.DEF
50490 NAME MAIN.USER.FILE$ AS MAIN.USER.FILE$
50500 GOSUB 30060
      UG = LOF(1) / 128.0!
      MAX.USR.FILE.SIZE.FRM.DEF = UG
      HIGHEST.USER.RECORD = UG
      GOTO 50560
'
' * COMMON SUBROUTINE TO GET LENGTH OF THE MESSAGES FILE
'
50530 MAX.MSG.FILE.SIZE.FRM.DEF! = (5 * MAX.ALLOWED.MSGS.FRM.DEF) + 1 + MAXIMUM.NUMBER.OF.NODES
50540 NAME MAIN.MESSAGE.FILE$ AS MAIN.MESSAGE.FILE$
50550 FILNUM = 1
      GOSUB 30050
      IF MAX.MSG.FILE.SIZE.FRM.DEF!<LOF(1) / 128 THEN _
         MAX.MSG.FILE.SIZE.FRM.DEF! = LOF(1) / 128
50560 GOSUB 22340
      CLOSE 1
      RETURN
'
' * COMMON SUBROUTINE TO REPAIR THE MESSAGE FILE AND GUARANTEE IT'S CHAINS
'
50580 OLD = LOC(1)
      GET 1,I + 1
      IF (MID$(MESSAGE.RECORD$,116,1) = CHR$(225) _
         OR  MID$(MESSAGE.RECORD$,116,1) = CHR$(226)) _
         AND (MID$(MESSAGE.RECORD$,61,1) = ":" _
         AND  MID$(MESSAGE.RECORD$,64,1) = ":" _
         AND  MID$(MESSAGE.RECORD$,70,1) = "-" _
         AND MID$(MESSAGE.RECORD$,73,1) = "-") THEN _
         RETURN
      PRINT "Message chain broken at record number " + STR$(OLD)
      PRINT "Message chain repair in progress!
      FOR IQ = OLD + 1 TO NEXT.MESSAGE.RECORD - 1
         GET 1,IQ
         IF (MID$(MESSAGE.RECORD$,116,1) = CHR$(225) _
            OR MID$(MESSAGE.RECORD$,116,1) = CHR$(226)) _
            AND (MID$(MESSAGE.RECORD$,61,1)  = ":" _
            AND  MID$(MESSAGE.RECORD$,64,1)  = ":" _
            AND  MID$(MESSAGE.RECORD$,70,1) = "-" _
            AND  MID$(MESSAGE.RECORD$,73,1) = "-") THEN _
            GET 1,OLD : _
            MID$(MESSAGE.RECORD$,117,4) = STR$(IQ - OLD) : _
            PUT 1,OLD : _
            PRINT "Message chain repaired." : _
            I = IQ : _
            RETURN
      NEXT
      RETURN 23730
'
' * COMMON SUBROUTINE TO HASH A USER'S NAME TO FIND THE CORRECT USER RECORD #
'
50720 JX = LEN.HASH
      WHILE MID$(HASH.VALUE$,JX,1) = " "
        JX = JX - 1
      WEND
      X$ = MID$(HASH.VALUE$,1,JX)
      UIX# = FNHSH(X$)
      Q = FNHSH2(X$)
      NSR = 1
      RO = CSRLIN
      CO = POS(0)
50722 GET 2,UIX#
      HASH.VALUE.N$ = MID$(USER.RECORD.N$,START.HASH,LEN.HASH)
      IF MID$(HASH.VALUE.N$,1,NU) = EMPTY.USER$ THEN _
         GOTO 50730
      IF HASH.VALUE$ <> HASH.VALUE.N$ THEN _
         GOTO 50725
      IF START.INDIV > 0 AND LEN.INDIV > 0 THEN _
         IF MID$(USER.RECORD$,START.INDIV,LEN.INDIV) <> MID$(USER.RECORD.N$,START.INDIV,LEN.INDIV) THEN _
            GOTO 50725
      LOCATE RO,CO
      PRINT "Omitted Duplicate ";
      PURGED.COUNT = PURGED.COUNT + 1
      RETURN
50725 UIX# = UIX# + Q
      IF UIX# > MAX.USR.FILE.SIZE.FRM.DEF THEN _
         UIX# = UIX# - MAX.USR.FILE.SIZE.FRM.DEF
      NSR = NSR + 1
      LOCATE RO,CO
      PRINT "searching";UIX#;
      GOTO 50722
50730 LSET USER.RECORD.N$ = USER.RECORD$
      PUT 2,UIX#
      CURRENT.USER.COUNT = CURRENT.USER.COUNT + 1
      LOCATE RO,CO
      PRINT " pos#";UIX#;"/";NSR;"srch(s) ";
      RETURN
'
' * COMMON SUBROUTINE TO WRITE OUT BLANK USER RECORDS TO THE USERS FILE
'
50840 TEMPLATE$ = SPACE$(46) + MKI$(-32000)
      GOSUB 25020
      FOR J = A! + 1 TO MAX.USR.FILE.SIZE.FRM.DEF
         LSET USER.RECORD.N$ = TEMPLATE$
         PUT 2
         LOCATE 24,X
         PRINT J;
      NEXT
      PRINT
      RETURN
'
' * CONVERT DISPLAYABLE OPTIONS INTO RBBS-PC.DEF PARAMETER VARIABLES
'
59000 GOSUB 30100
      IF EXPERT.USER$ = "NOVICE" THEN _
         EXPERT.USER = 0
      IF EXPERT.USER$ = "EXPERT" THEN _
         EXPERT.USER = -1
      DOWNLOAD.DRIVES$ = DRIVES.FOR.DOWNLOADS$ + DRIVE.FOR.UPLOADS$
      PROMPT.BELL = -1
      IF PROMPT.BELL$ = "OFF" THEN _
         PROMPT.BELL = 0
      PAGING.PRINTER.SUPPORT$ = ". "
      IF M11$ = "YES" THEN _
         PAGING.PRINTER.SUPPORT$ = ". " + _
                                   CHR$(7)
      GOSUB 15780
      IF MAIN.MESSAGE.FILE$ <> MAINMSG$ THEN _
         MAIN.MESSAGE.FILE$ = MAINMSG$
      IF MAIN.USER.FILE$ <> MAINUSR$ THEN _
         MAIN.USER.FILE$ = MAINUSR$
      IF CONFERENCE.MODE THEN _
         GOSUB 30040
      IF CALLERS.FILE$ = NONE.PICKED$ THEN _
         CALLERS.FILE$ = ""
      IF ALTDIR.EXTENSION$ = NONE.PICKED$ THEN _
         ALTDIR.EXTENSION$ = ""
      IF ALWAYS.STREW.TO$ = NONE.PICKED$ THEN _
         ALWAYS.STREW.TO$ = ""
      IF QUES.PATH$ = NONE.PICKED$ THEN _
         QUES.PATH$ = ""
      IF NEW.USER.QUESTIONNAIRE$ = NONE.PICKED$ THEN _
         NEW.USER.QUESTIONNAIRE$ = ""
      IF REQUIRED.QUESTIONNAIRE$ = NONE.PICKED$ THEN _
         REQUIRED.QUESTIONNAIRE$ = ""
      IF NET.MAIL$ = NONE.PICKED$ THEN _
         NET.MAIL$ = "NONE"
      IF CONFMAIL.LIST$ = NONE.PICKED$ THEN _
         CONFMAIL.LIST$ = ""
      IF REGISTRATION.PROGRAM$ = NONE.PICKED$ THEN _
         REGISTRATION.PROGRAM$ = ""
59020 OPEN "O",#1,CONFIG.FILENAME$
      IF INSTR(MO$,":") < 1 THEN _
         MO$ = MO$ + _
               ":"
      IF INSTR(SJ$,":") < 1 THEN _
         SJ$ = SJ$ + _
               ":"
      IF INSTR(DRIVE.FOR.BULLETINS$,":") < 1 THEN _
         DRIVE.FOR.BULLETINS$ = DRIVE.FOR.BULLETINS$ + _
                                ":"
      T$ = DIRECTORY.EXTENTION$
      IF INSTR(DIRECTORY.EXTENTION$,".") THEN _
         T$ = MID$(DIRECTORY.EXTENTION$,INSTR(DIRECTORY.EXTENTION$,".") + 1,LEN(DIRECTORY.EXTENTION$))
      S$ = UPLOAD.DIRECTORY$
      IF INSTR(UPLOAD.DIRECTORY$,".") THEN _
         S$ = MID$(UPLOAD.DIRECTORY$,1,INSTR(UPLOAD.DIRECTORY$,".") - 1)
      DIRECTORY.EXTENTION$ = T$
      UPLOAD.DIRECTORY$ = S$
      IF NOT DOWNLOAD.TO.SUBDIR THEN _
         DNLD.SUB = 0 : _
         FOR I = 1 TO 99 : _
            DNLD$(I) = "" : _
         NEXT
      IF NOT UPLOAD.TO.SUBDIR THEN _
         UPLOAD.SUBDIR$ = DRIVE.FOR.UPLOADS$ + _
                          ":"
      IF UPLOAD.TO.SUBDIR AND UPLOAD.SUBDIR$ <> "" THEN _
         DRIVE.FOR.UPLOADS$ = UPLOAD.SUBDIR$
      IF REQUIRED.RINGS = 0 AND _
         MID$(USER.INIT.COMMAND$,INSTR(USER.INIT.COMMAND$,"S0") + 3,5) <> "1Q0X1" THEN _
         MID$(USER.INIT.COMMAND$,INSTR(USER.INIT.COMMAND$,"S0") + 3,5) = "1Q0X1"
      IF REQUIRED.RINGS > 0 AND _
         MID$(USER.INIT.COMMAND$,INSTR(USER.INIT.COMMAND$,"S0") + 3,3) = "0Q0X1" THEN _
         MID$(USER.INIT.COMMAND$,INSTR(USER.INIT.COMMAND$,"S0") + 3,3) = "254  "
'
' * WRITE OUT THE "RBBS-PC.DEF" FILE WITH THE SYSOP'S SPECIFIED CONFIGURATION
'
59030 WRITE #1,VERSION.NUMBER$, _
               DOWNLOAD.DRIVES$, _
               SYSOP.PASSWORD.1$, _
               SYSOP.PASSWORD.2$, _
               SYSOP.FIRST.NAME$, _
               SYSOP.LAST.NAME$, _
               REQUIRED.RINGS, _
               START.OFFICE.HOURS, _
               END.OFFICE.HOURS, _
               MINUTES.PER.SESSION!, _
               MAX.ALLOWED.MSGS.FRM.DEF, _
               ACT.MNTHS.B4.DELETING, _
               UPLOAD.DIRECTORY$,_
               EXPERT.USER, _
               ACTIVE.BULLETINS, _
               PROMPT.BELL, _
               PCJR, _
               MENUS.CAN.PAUSE, _
               MENU$(1), _
               MENU$(2), _
               MENU$(3), _
               MENU$(4), _
               MENU$(5), _
               MENU$(6), _
               CONFERENCE.MENU$, _
               CONFERENCE.VIEWER.SEC.LVL, _
               WELCOME.INTERRUPTABLE, _
               REMIND.FILE.TRANSFERS, _
               PAGE.LENGTH, _
               MAX.MESSAGE.LINES, _
               DOORS.AVAILABLE, _
               MO$
      IF INSTR(BULLETIN.MENU$,":") < 1 THEN _
         BULLETIN.MENU$ = DRIVE.FOR.BULLETINS$ + _
                          BULLETIN.MENU$
      IF INSTR(BULLETIN.PREFIX$,":") < 1 THEN _
         BULLETIN.PREFIX$ = DRIVE.FOR.BULLETINS$ + _
                            BULLETIN.PREFIX$
      IF GLOBAL.FUNCTION(3) > MINIMUM.LOGON.SECURITY THEN _
         GLOBAL.FUNCTION(3) = MINIMUM.LOGON.SECURITY
      IF FILES.FUNCTION(2) > MINIMUM.LOGON.SECURITY THEN _
         FILES.FUNCTION(2) = MINIMUM.LOGON.SECURITY
      IF LIBRARY.FUNCTION(4) > MINIMUM.LOGON.SECURITY THEN _
         LIBRARY.FUNCTION(4) = MINIMUM.LOGON.SECURITY
      IF LIBRARY.DRIVE$ = "" THEN _
         MAIN.FUNCTION(18) = 32767
      WRITE #1,MAIN.MESSAGE.FILE$, _
               MAIN.MESSAGE.BACKUP$, _
               CALLERS.FILE$, _
               COMMENTS.FILE$, _
               MAIN.USER.FILE$, _
               WELCOME.FILE$, _
               NEWUSER.FILE$, _
               DIRECTORY.EXTENTION$, _
               COM.PORT$, _
               BULLETINS.OPTIONAL, _
               USER.INIT.COMMAND$, _
               RTS$, _
               DOS.VERSION, _
               FG, _
               BG, _
               BORDER, _
               RBBS.BAT$, _
               RCTTY.BAT$
      WRITE #1,OMIT.MAIN.DIRECTORY$, _
               FIRST.NAME.PROMPT$, _
               HELP$(3), _
               HELP$(4), _
               HELP$(7), _
               HELP$(9), _
               BULLETIN.MENU$, _
               BULLETIN.PREFIX$, _
               DRIVE.FOR.BULLETINS$, _
               MESSAGE.REMINDER, _
               REQUIRE.NON.ASCII, _
               ASK.EXTENDED.DESC, _
               MAXIMUM.NUMBER.OF.NODES, _
               NETWORK.TYPE, _
               RECYCLE.TO.DOS, _
               MAX.USR.FILE.SIZE.FRM.DEF, _
               MAX.MSG.FILE.SIZE.FRM.DEF!, _
               TRASHCAN.FILE$
      WRITE #1,MINIMUM.LOGON.SECURITY, _
               DEFAULT.SECURITY.LEVEL, _
               SYSOP.SECURITY.LEVEL, _
               FILESEC.FILE$, _
               SYSOP.MENU.SECURITY.LEVEL, _
               CONFMAIL.LIST$, _
               MAXIMUM.VIOLATIONS, _
               SYSOP.FUNCTION(1), _
               SYSOP.FUNCTION(2), _
               SYSOP.FUNCTION(3), _
               SYSOP.FUNCTION(4), _
               SYSOP.FUNCTION(5), _
               SYSOP.FUNCTION(6), _
               SYSOP.FUNCTION(7), _
               PASSWORD.FILE$, _
               MAXIMUM.PASSWORD.CHANGES, _
               MINIMUM.SECURITY.FOR.TEMP.PASSWORD, _
               OVERWRITE.SECURITY.LEVEL, _
               DOORS.TERMINAL.TYPE, _
               MAX.PER.DAY
      WRITE #1,MAIN.FUNCTION(1), _
               MAIN.FUNCTION(2), _
               MAIN.FUNCTION(3), _
               MAIN.FUNCTION(4), _
               MAIN.FUNCTION(5), _
               MAIN.FUNCTION(6), _
               MAIN.FUNCTION(7), _
               MAIN.FUNCTION(8), _
               MAIN.FUNCTION(9), _
               MAIN.FUNCTION(10), _
               MAIN.FUNCTION(11), _
               MAIN.FUNCTION(12), _
               MAIN.FUNCTION(13), _
               MAIN.FUNCTION(14), _
               MAIN.FUNCTION(15), _
               MAIN.FUNCTION(16), _
               MAIN.FUNCTION(17), _
               MAIN.FUNCTION(18), _
               MIN.NEWCALLER.BAUD, _
               WAIT.BEFORE.DISCONNECT
      WRITE #1,FILES.FUNCTION(1), _
               FILES.FUNCTION(2), _
               FILES.FUNCTION(3), _
               FILES.FUNCTION(4), _
               FILES.FUNCTION(5), _
               FILES.FUNCTION(6), _
               FILES.FUNCTION(7), _
               FILES.FUNCTION(8), _
               UTILITY.FUNCTION(1), _
               UTILITY.FUNCTION(2), _
               UTILITY.FUNCTION(3), _
               UTILITY.FUNCTION(4), _
               UTILITY.FUNCTION(5), _
               UTILITY.FUNCTION(6), _
               UTILITY.FUNCTION(7), _
               UTILITY.FUNCTION(8), _
               UTILITY.FUNCTION(9), _
               UTILITY.FUNCTION(10), _
               UTILITY.FUNCTION(11), _
               UTILITY.FUNCTION(12), _
               GLOBAL.FUNCTION(1), _
               GLOBAL.FUNCTION(2), _
               GLOBAL.FUNCTION(3), _
               GLOBAL.FUNCTION(4), _
               UPLOAD.TIME.FACTOR!, _
               COMPUTER.TYPE, _
               REMIND.PROFILE, _
               RBBS.NAME$, _
               COMMANDS.BETWEEN.RINGS, _
               DF, _                                                 ' KG072303
               PAGING.PRINTER.SUPPORT$, _
               MODEM.INIT.BAUD$
59035 WRITE #1,TURN.PRINTER.OFF,_
               DIRECTORY.PATH$,_
               MIN.SEC.TO.VIEW, _
               LIMIT.SEARCH.TO.FMS, _
               DEFAULT.CATEGORY.CODE$, _
               DIR.CATEGORY.FILE$, _
               NEW.FILES.CHECK, _
               MAX.DESC.LEN, _
               SHOW.SECTION, _
               COMMANDS.IN.PROMPT, _
               NEWUSER.SETS.DEFAULTS, _
               HELP.PATH$, _
               HELP.EXTENSION$, _
               MAIN.COMMANDS$, _
               FILE.COMMANDS$, _
               UTIL.COMMANDS$, _
               GLOBAL.COMMANDS$, _
               SYSOP.COMMANDS$
      WRITE #1,RECYCLE.WAIT, _
               LIBRARY.FUNCTION(1), _
               LIBRARY.FUNCTION(2), _
               LIBRARY.FUNCTION(3), _
               LIBRARY.FUNCTION(4), _
               LIBRARY.FUNCTION(5), _
               LIBRARY.FUNCTION(6), _
               LIBRARY.FUNCTION(7), _
               LIBRARY.DRIVE$, _
               LIBRARY.DIRECTORY.PATH$, _
               LIBRARY.DIRECTORY.EXTENTION$, _
               LIBRARY.WORK.DISK.PATH$, _
               LIBRARY.MAX.DISK, _
               LIBRARY.MAX.DIRECTORY, _
               LIBRARY.MAX.SUBDIR, _
               LIBRARY.SUBDIR.PREFIX$, _
               LIBRARY.ARCHIVE.PATH$, _
               LIBRARY.ARCHIVE.PROGRAM$, _
               LIBRARY.COMMANDS$
      WRITE #1,UPLOAD.PATH$, _
               FMS.DIRECTORY$, _
               ANS.MENU$, _
               REQUIRED.QUESTIONNAIRE$, _
               REMEMBER.NEW.USERS, _
               SURVIVE.NOUSER.ROOM, _
               PROMPT.HASH$, _
               START.HASH, _
               LEN.HASH, _
               PROMPT.INDIV$, _
               START.INDIV, _
               LEN.INDIV
      WRITE #1,BYPASS.MSGS, _
               MUSIC, _
               RESTRICT.BY.DATE, _
               DAYS.TO.WARN, _
               DAYS.IN.SUBSCRIPTION.PERIOD, _
               VOICE.TYPE, _
               RESTRICT.VALID.CMDS, _
               NEW.USER.DEFAULT.MODE, _
               NEW.USER.LINE.FEEDS, _
               NEW.USER.NULLS, _
               NEW.USER.BELL, _
               NEW.USER.CASE, _
               MESSAGES.CAN.GROW, _
               WRAP.CALLERS.FILE$, _
               REDIRECT.IO.METHOD, _
               AUTO.UPGRADE.SEC, _
               HALT.ON.ERROR, _
               NEW.PUBLIC.MSGS.SECURITY, _
               NEW.PRIVATE.MSGS.SECURITY, _
               SECURITY.NEEDED.TO.CHANGE.MSGS, _
               SL.CATEGORIZE.UPLOADS, _
               BAUDOT, _
               TIME.TO.DROP.TO.DOS, _
               EXPIRED.SECURITY, _
               DTR.DROP.DELAY, _
               ASK.IDENTITY, _
               MAX.REG.SEC, _
               BUFFER.SIZE, _
               MLCOM, _
               SHOOT.YOURSELF, _
               DEFAULT.EXTENSION$, _
               NEW.USER.DEFAULT.PROTOCOL$, _
               NEW.USER.GRAPHICS$, _
               NET.MAIL$, _
               MASTER.DIRECTORY.NAME$, _
               PROTO.DEF$, _
               UPCAT.HELP$, _
               ALWAYS.STREW.TO$, _
               LAST.NAME.PROMPT$
      MSB = LSB + 1
      LINE.CONTROL.REGISTER = LSB + 3
      MODEM.CONTROL.REGISTER = LSB + 4
      LINE.STATUS.REGISTER = LSB + 5
      MODEM.STATUS.REGISTER = LSB + 6
      WRITE #1,PERSONAL.DRVPATH$, _
               PERSONAL.DIR$, _
               PERSONAL.BEGIN, _
               PERSONAL.LEN, _
               PERSONAL.PROTOCOL$, _
               PERSONAL.CONCAT, _
               PRIVATE.READ.SEC, _
               PUBLIC.READ.SEC, _
               SEC.CHANGE.MSG, _
               KEEP.INIT.BAUD, _
               MAIN.PUI$, _
               DEFAULT.ECHOER$, _
               HOST.ECHO.ON$, _
               HOST.ECHO.OFF$, _
               SWITCH.BACK, _
               DEFAULT.LINE.ACK$, _
               ALTDIR.EXTENSION$, _
               DIRECTORY.PREFIX$
      WRITE #1,SEC.LVL.EXEMPT.FRM.PURGING, _
               MODEM.INIT.WAIT.TIME, _
               MODEM.COMMAND.DELAY.TIME, _
               TURBO.RBBS, _
               DNLD.SUB, _
               WILL.SUBDIRS.B.USED, _
               UPLOAD.TO.SUBDIR, _
               DOWNLOAD.TO.SUBDIR, _
               UPLOAD.SUBDIR$, _
               MIN.OLDCALLER.BAUD, _
               MAX.WORK.VAR, _
               DISKFULL.GO.OFFLINE, _
               EXTENDED.LOGGING, _
               USER.RESET.COMMAND$, _
               USER.COUNT.RINGS.COMMAND$, _
               USER.ANSWER.COMMAND$, _
               USER.GO.OFFHOOK.COMMAND$, _
               DISK.FOR.DOS$, _
               DUMB.MODEM, _
               COMMENTS.AS.MESSAGES, _
               LSB, _
               MSB, _
               LINE.CONTROL.REGISTER, _
               MODEM.CONTROL.REGISTER, _
               LINE.STATUS.REGISTER, _
               MODEM.STATUS.REGISTER
      ORIG.COMMANDS$ = MAIN.COMMANDS.DEFAULTS$ + _
                       FILE.COMMANDS.DEFAULTS$ + _
                       UTIL.COMMANDS.DEFAULTS$ + _
                       LIBRARY.COMMANDS.DEFAULTS$ + _
                       GLOBAL.COMMANDS.DEFAULTS$ + _
                       SYSOP.COMMANDS.DEFAULTS$
      WRITE #1,KEEP.TIME.CREDITS, _
               XON.XOFF, _
               ALLOW.CALLER.TURBO, _
               USE.DEVICE.DRIVER$, _
               PRELOG$, _
               NEW.USER.QUESTIONNAIRE$, _
               EPILOG$, _
               REGISTRATION.PROGRAM$, _
               QUES.PATH$, _
               USER.LOCATION$, _
               USER.INITIALIZE.COMMAND$, _
               USER.FIRMWARE.CLEAR.CMND$, _
               USER.FIRMWARE.WRITE.CMND$, _
               ENFORCE.UPLOAD.DOWNLOAD.RATIOS, _
               SIZE.OF.STACK, _
               SECURITY.EXEMPT.FROM.EPILOG, _
               USE.BASIC.WRITES, _
               DOSANSI, _
               ESCAPE.INSECURE, _
               USE.DIR.ORDER, _
               ADD.DIR.SECURITY, _
               MAX.EXTENDED.LINES, _
               ORIG.COMMANDS$
      IF MACRO.EXTENSION$ <> "" THEN _
         MACRO.EXTENSION$ = "." + MACRO.EXTENSION$
      CALL COLORCODE (FG.1.DEF$,FG.1.DEF$,X)
      CALL COLORCODE (FG.2.DEF$,FG.2.DEF$,X)
      CALL COLORCODE (FG.3.DEF$,FG.3.DEF$,X)
      CALL COLORCODE (FG.4.DEF$,FG.4.DEF$,X)
      WRITE #1,LOGON.MAIL.LEVEL$, _
               MACRO.DRVPATH$, _
               MACRO.EXTENSION$, _
               EMPHASIZE.ON.DEF$, _
               EMPHASIZE.OFF.DEF$, _
               FG.1.DEF$, _
               FG.2.DEF$, _
               FG.3.DEF$, _
               FG.4.DEF$, _
               SECVIO.HLP$, _
               FOSSIL, _
               MAX.CARRIER.WAIT, _
               CALLER.BKGRD, _
               SMART.TEXT, _
               TIME.LOCK, _
               WRITE.BUF.DEF, _
               SEC.KILL.ANY, _
               DOORS.DEF$, _
               SCREEN.OUT.MSG$, _
               AUTOPAGE.DEF$
      IF DNLD.SUB <1 OR DNLD.SUB > 99 THEN _
         GOTO 59080
      FOR I = 1 TO DNLD.SUB
         WRITE #1,DNLD$(I)
      NEXT
59080 CLOSE #1
'
' * NOTIFY THE SYSOP THAT THE CONFIGURATION DESCRIPTION FILE HAS BEEN WRITTEN
'
      CLS
      LOCATE 12,1,1
      PRINT "RBBS-PC configuration description file, " + CONFIG.FILENAME$ + ", now on default drive."
      GOSUB 60380
      GOTO 60340
'
' *  CONFIG.BAS'S ERROR ROUTINES
'
60010 '* HANDLE ERROR CONDITIONS *
      IF ERR = 62 AND _
        (ERL = 11600 OR _
         ERL = 11620 OR _
         ERL = 11640 OR _
         ERL = 11660 OR _
         ERL = 11680 OR _
         ERL = 11700 OR _
         ERL = 11705 OR _
         ERL = 11706) THEN _
         PRINT CONFIG.FILENAME$ + _
               " from a version earlier than " + CONFIG.VERSION$ + " on default drive." : _
         PRINT "Please delete and rerun CONFIG." : _
         RESUME 60340
      IF ERL = 15780 AND ERR = 5 AND _
         INSTR(USER.INIT.COMMAND$,"S0=") = 0 THEN _
         RESUME 16073
      IF ERL = 31000 AND ERR = 58 THEN _
         KILL A$ : _
         RESUME 31000
      IF ERL = 31030 AND ERR = 58 THEN _
         KILL A$ : _
         RESUME 31030
      IF ERL = 22120 AND ERR = 6 THEN _
         RESUME 22100
      IF ERL = 24750 AND ERR = 58 THEN _
         KILL A$ : _
         RESUME 24750
      IF ERL = 31020 THEN _
         PRINT "Unable to kill ";MAIN.MESSAGE.FILE$;".  Error";STR$(ERR):_
         RESUME 31035
      IF ERL = 50490 AND ERR = 58 THEN  _
         RESUME 50500
      IF ERL = 50540 AND ERR = 58 THEN  _
         RESUME 50550
      IF ERL = 50490 OR ERL = 50540 THEN _
         RESUME 15230
      IF ERL = 60471 THEN _
         IF ERR <> 76 THEN _
            RESUME 60478 _
         ELSE RESUME 60474
      IF ERL = 60480 THEN _
         PRINT "ERROR -";ERR;" UNABLE TO CREATE SUBDIRECTORY" : _
         RESUME 60478
      IF ERR = 61 THEN _
         PRINT "ERROR - IBM DOS DISKETTE FULL " : _
         RESUME 60340
      IF ERR = 67 THEN _
         PRINT "ERROR - IBM DOS DIRECTORY FULL" : _
         RESUME 60340
      IF ERR = 70 THEN _
         PRINT "DISKETTE IN DRIVE IS WRITE PROTECTED" : _
         RESUME 60340
      IF ERR = 71 THEN _
         PRINT "DRIVE DOOR OPEN OR MISSING DISKETTE"  : _
         RESUME 60340
      IF ERR = 72 THEN _
         PRINT "ERROR - UNFORMATTED IBM DOS DISKETTE IN DRIVE" : _
         RESUME 60340
      PRINT "+++ Error";ERR;" in line ";ERL "occurred at " TIME$ " on " DATE$
60340 IF CONFERENCE.MODE = 1 THEN _
         DELAY! = FNTI! + 5
      GOSUB 60440
60360 SYSTEM
'
' * COMMON SUBROUTINE TO BEEP AT THE SYSOP
'
60380 FOR I = 1 TO 2
        BEEP
      NEXT
      RETURN
'
' * COMMON ROUTINE TO WAIT A SPECIFIED NUMBER OF SECONDS
'
60440 ' wait routine
60450 IF FNTI! < DELAY! THEN _
         GOTO 60450
      RETURN
'
' * COMMON ROUTINE TO CHECK DRIVE/PATH FOR FORMAT/EXISTENCE
'
60470 IF LEN(STRNG$) < 1 THEN _
         GOTO 60476
      IS.OK = TRUE
60471 NAME STRNG$ + "XX" AS STRNG$ + "XX"
60474 BEEP
      CALL ASKRO ("Bad/missing drive/path <"+STRNG$+">  [R]e-enter, I)gnore, C)reate",24,ANS$)
      CALL ALLCAPS (ANS$)
      ON INSTR("RIC",ANS$) GOTO 60476,60478,60480
60476 IS.OK = FALSE
60478 RETURN
60480 MKDIR LEFT$(STRNG$,LEN(STRNG$)-1)
      RETURN
