GAP Communications Online Software GAPQBDR Door Interface Library For Quick Basic Programmers Copyright (C) 1987-1993 by GAP Development Company. ALL RIGHTS RESERVED. No part of this manual shall be reproduced, stored in a retrieval system, or transmitted by any means, electronic, mechanical, photocopying, recording, or otherwise, without written permission from GAP Development Company. While every precaution has been taken in the preparation of this manual, GAP Development Company assumes no responsibility for errors or omissions. Neither is any liability assumed for damages resulting from the use of the information contained herein. GAPQBDR is the sole and exclusive property of GAP Development Company. It is licensed and not sold to the end user with restrictions placed upon its use. GAPQBDR is copyrighted by GAP Development Company. DESQview is a trademark of Quarterdeck. PCBoard is a trademark of Clark Development Corporation. WildCat! is copyrighted by Mustang Software. DigiBoard is a trademark of DigiBoard Incorporated. TABLE OF CONTENTS Page DESCRIPTION 5 GETTING STARTED 6 COMPILING AND LINKING 12 SYSOP SETUP AND FUNCTIONS 13 GLOBAL VARIABLES 17 CONSTANTS 17 ANSI CONSTANTS 17 DOOR.SYS VARIABLES 18 INTEGERS 18 LONGS 18 STRINGS 18 GAPQBDR GLOBALS 19 INTEGERS 19 LONGS 19 STRINGS 19 GLOBAL VARIABLES - ALPHABETICALLY By Type 20 CONSTANTS 20 INTEGERS 20 LONGS 21 STRINGS 21 Page 3 FUNCTIONS AND SUBROUTINES - QUICK REFERENCE 22 FUNCTIONS AND SUBROUTINES - REFERENCE 23 INDEX 51 Page 4 GAPQBDR (C) Copyright 1988-1993 The GAP Development Company DESCRIPTION ----------- GAPQBDR is a professional development kit for Bulletin Board Door programmers. It can also be used to facilitate the writing of stand alone communications programs. Written entirely in Quick Basic (with a little help from some Assembler support routines), it is fast, reliable, easy to use, and easy to incorporate into the serious programmer's source code. Features Include : o Interfaces with GAP Communications, PCBoard, WildCat or any BBS capable of writing a DOOR.SYS file. o Complete interrupt driven communications which does not require a DTR patched BRUNxx.EXE run time library. o Supports the DigiBoard COM/Xi Intelligent Serial Port Boards. o Supports the FIFO buffers of the 16550 UART. o Speeds to 57,600 bps. o Supports all communications ports. o Does not require watchdog or CTTY. o Uses ANSI colors instead of Basic's color statements so the sysop sees what the caller sees. o Maintains a scoreboard of the top 10 players. o High speed text file display. o Supports ANSI color and ASCII text files with no programming effort other than to make a single subroutine call. o Easy to use Random Number Generator. o Informative Status Line display. o Monitors keyboard activity and caller time remaining. o Easy interfacing to BBS system and user files. o Sysop chat with full word wrapping. o Allows the sysop to shell to DOS. o "Remembers" the default drive and directory which prevents file access errors. o Credits caller with time spent chatting or while sysop is in a DOS shell. o Sysop can twit caller without caller ever knowing the sysop is watching. o Caller time can be increased or decreased. o Time calculations are not dependent on the "seconds since midnight" and are thus unsusceptible to the midnight roll over. o Allows the sysop to "force" a file display. o Automatic detection of multi-user system. o Extremely easy interfacing to door programs. Page 5 GAPQBDR (C) Copyright 1988-1993 The GAP Development Company GETTING STARTED --------------- GAPQBDR is distributed in archived format. The contents of the archive should be as follows: QBORDER.FRM - Registration Info and Order Form. GAPQBDR.TXT - This documentation. GAPQBDR.QLB - Library routines for QB 4.5 environment. GAPQBDR.LIB - Library routines for QB 4.5. GAPQBDR7.LIB - Library routines for Basic 7.x. GAPQBDR.BI - Door Interface include file. GAPQBERR.BI - Error Handling routines. DOOR.ZIP - Sample program illustrating many of the features of GAPQBDR. READ.ME - Any pertinent information which you should read. LIBLIB - Library Response File for QB 4.5. LIBLIB7 - Library Response File for Basic 7.x QLBLIB - Linker Response File for QB 4.5 QLBLIB7 - Linker Response File for Basic 7.x MAKE7QLB - Batch File to build Basic 7.x QLB file. MAKEBAS7.BAT - Batch File to build Basic 7.x LIB file. MAKESRC.BAT - Batch File to build 4.5 LIB & QLB files. If you licensed the source code to GAPQBDR, the following files are included in an archive called GAPQBSRC: ACCESS.BAS - Basic source for file access. CARRIER.BAS - Basic source for no carrier routines. DOCHAT.BAS - Basic source for sysop chat. GAPDOS.BAS - Basic source to read/write GAPDOS.DAT. GAPQBDR.BAS - Basic source for main GAPQBDR functions. GAPUSER.BAS - Basic source to read/write GAP USERS. GETRAND.BAS - Basic source for random number routines. INITDOOR.BAS - Basic source for door initialization. LEAVE.BAS - Basic source for closing the door. PCBSYS.BAS - Basic source to read/write PCBOARD.SYS. PCBUSER.BAS - Basic source to read/write PCB USERS. PUTCHAR.BAS - Basic source for character output. SCOREBRD.BAS - Basic source for scoreboard routines. SHOWFILE.BAS - Basic source for file display. STATUS.BAS - Basic source for the status line. SYSPAGE.BAS - Basic source for page sysop routines. TIMCRED.BAS - Basic source for time credits. WAIT.BAS - Basic source for time pauses. ATSAY.ASM - Assembler source for screen positioning. Page 6 GAPQBDR (C) Copyright 1988-1993 The GAP Development Company CLS.ASM - Assembler source for clear screen. CTRLC.ASM - Assembler source for CTRL-C handler. CURSOR.ASM - Assembler code for cursor positioning. DOSPRINT.ASM - Assembler source for BIOS string output. GAPPUTS.ASM - Assembler source for string output. GETKEYC.ASM - Assembler source for keyboard input. KEYBRD.ASM - Assembler source for keyboard function. GAPQBSRC.BI - Global declarations for source files. LIBLIB - Library Response File for QB 4.5. LIBLIB7 - Library Response File for Basic 7.x QLBLIB - Linker Response File for QB 4.5 QLBLIB7 - Linker Response File for Basic 7.x MAKE7QLB - Batch File to build Basic 7.x QLB file. MAKEBAS7.BAT - Batch File to build Basic 7.x LIB file. MAKESRC.BAT - Batch File to build 4.5 LIB & QLB files. SRCREAD.ME - Any pertinent information which you should read. In addition, all the object modules for the private GAPQBDR functions are provided so that you may create the quick library. You will also need the file QB.BI which is distributed with the Microsoft QB disks. A DTR patched BRUN45.EXE is not needed since GAPQBDR uses its own communications routines. Place the files in your QB work directory. Make sure that QB.BI is accessible to the compiler. The source files should be placed in a directory called SOURCE (off of your QB directory). Throughout this document, the terms function, routine, procedure and subroutine are used interchangeably. However, pay close attention to the return value and the examples. In QB, a function returns a value, where as a sub program does not. If you use an external editor to write your programs, the editor must allow control characters to be entered and displayed. The ANSI constants are initialized by literal characters and if your editor removes the ESC character from the constants, your ANSI displays will be quite messy. If you are using the QB environment, you will need to load the door module along with your source program. To do so, type the following : QB door /L GAPQBDR (where door is the name of your basic source program) Page 7 GAPQBDR (C) Copyright 1988-1993 The GAP Development Company If you fail to load the quick library along with your program, you will receive a great many "subprogram not defined" errors when you try to compile or run your program. We are a firm supporter of declaring all variables prior to their use. Not only does it make your programs easier to debug, it makes them easier to read and follow. We recommend that you follow our guidelines and declare all of your global variables at the beginning of your program, after including GAPQBDR.BI. At the very beginning of your program, you must include the GAPQBDR.BI file. Without this file, nothing will work. It must be the first directive in your source file. To include the file, you type the following at the beginning of your source program: '$INCLUDE: 'GAPQBDR.BI' Do not under any circumstances use the DEF type statements (I.E., DEFINT A-Z). This is the lazy persons method of programming. Typedef your variables by either declaring them ahead of time, or by appending the type after the name (i.e., A$, I%). If you need to use your own On Error routines, you should modify the supplied error handler rather than simply ignore it or replace it. If you subsequently change the Error Trap address, it is your responsibility to deal with any run time errors. After declaring any variables and functions, you must include the error handling file. The error handler is included in your source module so that it can be globally accessible by all routines in the GAPQBDR library. To include the file, type the following immediately AFTER declaring your global variables and BEFORE any executable statements: '$INCLUDE: 'GAPQBERR.BI' It is important that the error handling file be inserted at the proper place in your program. The file may not be included before your variable declarations and it MUST be included prior to your first executable statement. Please see the example program for a sample of how to include this file. Remember that a variable assignment is not a variable declaration but an actual executable statement. You are now ready to begin your program. You may now initialize your variables and start your program. Page 8 GAPQBDR (C) Copyright 1988-1993 The GAP Development Company The first thing that must be done prior to using any of the door functions, is to initialize GAPQBDR itself. This is done by making a call to read.cnf. Read.cnf opens the configuration file (the name of which you pass as a parameter) and reads the first eight lines of the file. If the configuration file cannot be found, the program will end. The format of the configuration file is as follows: ----------------------------------------- C:\GAP The Crow's Nest BBS 4 03F8 STANDARD D000 320 4 The first line of the file is the path to the BBS default directory. The second line is the name of the BBS. The third line is the Port IRQ and the 4th line is the Port Base Address. If the sysop running your program has his BBS configured to use Com Ports other than 1 or 2, he would then enter the IRQ and Base address for his Com Port on lines 3 and 4. GAPQBDR derives the Port Number from the DOOR.SYS file. Lines five through eight are for the Intelligent DigiBoard multi- port Communications Card. The DigiBoard routines specifically support the COM/Xi series. All four of these lines are required even if your end users are using the Standard Interface. Line five is the Communications Port Interface. It must be one of the following: STANDARD DIGIBOARD INT14/EBIOS The Standard interface is the one that will normally be used. If an end user is using a DigiBoard then either the DigiBoard or Int14/EBIOS interface may be selected. Most sysops will use the Int14/EBIOS interface. All input/output to the DigiBoard is performed via Interrupt 14 calls and a Device Driver (available from DigiBoard) handles the interface between the program and the board. The DigiBoard interface uses Direct Programming. GAPQBDR talks to the board directly without the need for a Device Driver. In order to use this interface, a program called RESETDIG.EXE must be used in the AUTOEXEC.BAT file to reset the DigiBoard once when the computer is first booted. If the end user does not have Page 9 GAPQBDR (C) Copyright 1988-1993 The GAP Development Company this program (it is a part of the GAP Communications BBS package) then the Int14/EBIOS interface must be used. If the Interface is other than STANDARD, then lines 6 through 8 will be ignored. If the Interface is INT14/EBIOS, then lines 6 and 7 will be ignored. Line 6 is the DigiBoard Memory Window, or the address the board uses as a communications area between itself and the Host Computer. This line is used only if the Interface is set to DIGIBOARD. It can be set to 0 if the Interface is STANDARD or INT14/EBIOS. Line 7 is the DigiBoard I/O Port Address. This line is used only if the Interface is set to DIGIBOARD and can be set to 0 otherwise. Line 8 is the DigiBoard Channel Number. This line is required for the DIGIBOARD and INT14/EBIOS Interfaces. It is normally 1 - 8 for the DIGIBOARD Interface and 4 - 11 for the INT14/EBIOS Interface. The Channel Number is similar to a Port Number. It tells the program which of the DigiBoard Communications ports to use. The configuration file is usually given a name similar to the name of your door program, with a CNF extension. Read.cnf will leave this file open for your use. If you have any configuration options of your own, you may place them in this file beginning with line 9. Do not read your configuration options until after making a call to init.door (which should be the second function call in your program). Upon return from init.door, you are free to read your configuration options (if any). At this time, you should close the configuration file. Its file number is #1. Normally, your program is invoked with a command line parameter giving the name of the configuration file to use: (I.E., DOOR DOOR.CNF). You would use the COMMAND$ function to extract the configuration parameter and then pass this parameter on to read.cnf. This allows the end user to use a single program (your program) with multiple configuration files. This is especially important under multi-user systems where separate configuration files are needed. The configuration file is opened as a sequential file so using Line Input #1 would be appropriate for reading any data. Page 10 GAPQBDR (C) Copyright 1988-1993 The GAP Development Company If there were no errors, read.cnf will return. You must now make a call to init.door. Init.door uses the information derived from line 1 of the configuration file to open and read DOOR.SYS. In addition, init.door opens the communications port (if a remote user is on), initializes some global variables, initializes the random number generator, and installs the CTRL-C interrupt handler. If there is an error, init.door will not return. Instead it will end the program. That is basically all you have to do to initialize the GAPQBDR module. When your program ends, you should clean house if necessary and call leave. Leave closes the communications port and any open files, sends a sign off message to the caller, and then exits to DOS. Things to remember: To get the ball rolling, include GAPQBDR.BI as the first directive in your source program. Include GAPQBERR.BI after declaring any global variables and prior to your first executable statement. To initialize the door, call read.cnf with the name of your programs configuration file. Call init.door. Call leave when your program is finished. With the exception of file #1 which is used to read the configuration file and which YOU should close, there are no other files left open. GAPQBDR uses good programming practice by asking Basic for a file number rather than telling Basic which number to use. All input and output should be performed through the GAPQBDR functions. The sample program gives good examples on how to accomplish this. To determine if the BBS is a single or multi user system, check the variable called node. If it is anything other than 0, then the BBS is multi-user and you should read/write your data files with sharing attributes. To test your program, you will need a DOOR.SYS file that was written for local exit. Of course, you can always modify any DOOR.SYS file and change the first line so that it reads COM0:. A Page 11 GAPQBDR (C) Copyright 1988-1993 The GAP Development Company complete set of sample files are provided for testing your program under local mode. Experience has shown that although the QB environment editor makes for a cumbersome programmers editor, testing programs inside QB is perhaps the easiest and most efficient way to test. The environment is wonderful for catching syntax errors and even more fantastic at allowing the programmer to correct those errors and continue to run the program. Do not use any of the Basic input/output or screen positioning functions. If you do, you will find that if you attempt to "print" a string, the string will not appear on the screen where you might think it should. This is because Basic maintains its own cursor location, and GAPQBDR does NOT update this information. All input/output should take place using the functions provided by GAPQBDR. Not only are they more efficient than Basics, they are faster as well! COMPILING AND LINKING --------------------- GAPQBDR has already been compiled with the necessary compile time switches. To compile your programs, use whatever switches are required by your program along with the /x (on error) switch which is needed for the error handling routine. Use the following commands: bc /x doorname; link doorname,,NUL.MAP,+gapqbdr Where doorname is the name of your program. Page 12 GAPQBDR (C) Copyright 1988-1993 The GAP Development Company SYSOP SETUP AND FUNCTIONS ------------------------- These sysop setup and function descriptions should be placed in the documentation of your door program. You should, of course change the setup information to fit your particular needs. Door programs written with the GAPQBDR Door Interface Module will run on any BBS System that supports DOOR.SYS. To configure the door for a particular BBS setup, a configuration file must be used. At the very minimum, this file will contain eight lines. It may contain more than eight, depending upon a particular doors configuration requirements. The name of the file is usually the same as that of the door program but with a CNF extension. The minimum requirements for the file are as follows: C:\GAP The Crow's Nest BBS 4 03F8 STANDARD D000 320 4 The first line of the file is the path to the BBS default directory. The second line is the name of the BBS. The third line is the Port IRQ and the 4th line is the Port Base Address. If you have your BBS configured to use Com Ports other than 1 or 2, you would enter the IRQ and Base address for your Com Port on lines 3 and 4. GAPQBDR derives the Port Number from the DOOR.SYS file. Lines five through eight are for the Intelligent DigiBoard multi- port Communications Card. The DigiBoard routines specifically support the COM/Xi series. All four of these lines are required even if you are using the Standard Interface. Line five is the Communications Port Interface. It must be one of the following: STANDARD DIGIBOARD INT14/EBIOS The Standard interface is the one that will normally be used. If you are using a DigiBoard then either the DigiBoard or Int14/EBIOS interface may be selected. Most sysops will use the Int14/EBIOS interface. All input/output to the DigiBoard is performed via Interrupt 14 calls and a Device Driver (available Page 13 GAPQBDR (C) Copyright 1988-1993 The GAP Development Company from DigiBoard) handles the interface between the program and the board. The DigiBoard interface uses Direct Programming. GAPQBDR talks to the board directly without the need for a Device Driver. In order to use this interface, a program called RESETDIG.EXE must be used in the AUTOEXEC.BAT file to reset the DigiBoard once when the computer is first booted. If you do not have this program (it is a part of the GAP Communications BBS package) then the Int14/EBIOS interface must be used. If the Interface is other than STANDARD, then lines 6 through 8 will be ignored. If the Interface is INT14/EBIOS, then lines 6 and 7 will be ignored. Line 6 is the DigiBoard Memory Window, or the address the board uses as a communications area between itself and the Host Computer. This line is used only if the Interface is set to DIGIBOARD. It can be set to 0 if the Interface is STANDARD or INT14/EBIOS. Line 7 is the DigiBoard I/O Port Address. This line is used only if the Interface is set to DIGIBOARD and can be set to 0 otherwise. Line 8 is the DigiBoard Channel Number. This line is required for the DIGIBOARD and INT14/EBIOS Interfaces. It is normally 1 - 8 for the DIGIBOARD Interface and 4 - 11 for the INT14/EBIOS Interface. The Channel Number is similar to a Port Number. It tells the program which of the DigiBoard Communications ports to use. GAPQBDR will obtain the sysop's name from the BBS configuration file. You must now create a batch file to invoke the door. This batch file is placed in your BBS default directory. Such a batch file might look like this: @echo off cd \gap\doors\tl tl tl.cfg cd \gap As you can see, the door is invoked by passing the configuration file name as a parameter. Page 14 GAPQBDR (C) Copyright 1988-1993 The GAP Development Company You will also need to modify your doors menu files and the data file that tells the BBS what your doors are and the security level needed to access them. For GAP, these are respectively: DOORM DOORMG DOORS.DAT Please refer to your BBS documentation for details on setting these files up. If you are running multi-nodes, simply create a separate door configuration file for each node, and number them. For instance, for a 3 node system, you might have the following configuration files: TL1.CFG TL2.CFG TL3.CFG The only difference between the three would be the 1st line which points to the default directory for the particular node. The following sysop functions are available while awaiting keyboard input : F5 - Shell to DOS. F8 - Twit user and return to BBS. F10 - Initiate chat with user. CF10 - Answer user page bell. Home - Main user stats. End - Displays sysop keys available. PgDn - Secondary user stats. Up Arrow - Increase user's time remaining. Dn Arrow - Decrease user's time remaining. One of the nicer features about using the TWIT key, is the user is not told that "the sysop wants them to return to the BBS". Instead, a very plain and simple message of "returning you to the BBS" is displayed. This way, the user is given no indication that the sysop is hovering about. When using the F5 shell to DOS key, to return to the door program, simply type EXIT at the DOS command prompt. It is not necessary to change directories back to the door directory. GAPQBDR is smart enough to know which drive and directory the Page 15 GAPQBDR (C) Copyright 1988-1993 The GAP Development Company door program is in and will reset the defaults upon return from DOS. The Up and Down Arrow keys increase and decrease the user's time respectively by 5 minutes for each press of the key. There is no indication of what is occurring (except by the fact the user's time remaining will change), so the sysop should try not to have a lead finger. The increase or decrease is effective only while the user is in the door. Since we are firm believers that the BBS system files belong to the BBS and should not be altered by any door program, updating the BBS system file is NOT automatic. If you wish that any decrease or increase in the user's time be made permanent, you may, after initializing the door, call the function that opens the system file. Keep track of any time credits during the door programs operation, then call the function that updates the BBS system file. Examples of how to do this are included in the sample program. Page 16 GAPQBDR (C) Copyright 1988-1993 The GAP Development Company GLOBAL VARIABLES ---------------- All global variables (except for constants) are defined as COMMON SHARED. They are included in your program by including the file GAPQBDR.BI at the top of your source file. CONSTANTS --------- Constants are defined as - CONST name = constant value. NO Defined as 0 YES Defined as 1 ANSI CONSTANTS -------------- ANSI constants contain the actual ANSI color sequences. BLACK ANSI codes for Black BLUE ANSI codes for Blue BROWN ANSI codes for Brown CYAN ANSI codes for Cyan GREEN ANSI codes for Green MAGENTA ANSI codes for Magenta RED ANSI codes for Red WHITE ANSI codes for White BBLACK ANSI codes for Grey BBLUE ANSI codes for bright Blue BCYAN ANSI codes for bright Cyan BGREEN ANSI codes for bright Green BMAGENTA ANSI codes for bright Magenta BRED ANSI codes for bright Red BWHITE ANSI codes for bright White YELLOW ANSI codes for Yellow Page 17 GAPQBDR (C) Copyright 1988-1993 The GAP Development Company DOOR.SYS VARIABLES ------------------ DOOR.SYS variables are initialized while reading the Door Interface Module, DOOR.SYS. These variables are available from door start up to door end. The DOOR.SYS variables are the door programmer's connection to the BBS. INTEGERS -------- alarm Caller Alarm. 0 = off, 1 = on bell Page Bell. 0 = off, 1 = on c.olor Color toggle. 0 = no color, 1 = color ok expert Expert mode. 0 = non-expert, 1 = expert l.ocal 0 = remote user, 1 = local level User's security level minsleft Number of minutes user has left at door start node Node number. 0 = single user page User's page length parity Should actually be data bits and is not used port Communications port in use printer Printer Toggle. 0 = off, 1 = on s.creen Screen display. 0 = off, 1 = on LONGS ----- baud DTE rate to open COMM port at downbytes Total bytes downloaded downloads Number of downloads maxbytes Maximum number of bytes allowed to download recnum User's record number in USER file timeson Number of times user has been on upbytes Total bytes uploaded uploads Number of uploads userbaud BPS rate of the remote user STRINGS ------- bphone User's business or data phone number city User's home town first User's first name hphone User's home phone number last User's last name lastdate Last date user was on Page 18 GAPQBDR (C) Copyright 1988-1993 The GAP Development Company password User's password. PASSWORD if sysop is on subscrip Date user's subscription expires username User's full name GAPQBDR GLOBALS -------------- These variables are the documented, global variables (initialized and used by GAPQBDR). They may be modified and/or used at the programmer's discretion. INTEGERS --------- noup If set to 1, get.string will not uppercase timecredit Time credits for user (in minutes) timeleft Time user has left (in minutes) LONGS ----- starttime Time the user logged on (in seconds) temptime For calculating keyboard time out timenow Time it is now (in seconds) STRINGS ------- anystring1 Global garbage collector bbs.dir Path to BBS default dir birthday Callers birth date board.name Name of the BBS gendir Path to the gen directory maindir Path to the main directory sysname Sysop's name Page 19 GAPQBDR (C) Copyright 1988-1993 The GAP Development Company GLOBAL VARIABLES - ALPHABETICALLY By Type ----------------------------------------- CONSTANTS --------- BBLACK ANSI codes for Grey BBLUE ANSI codes for bright Blue BCYAN ANSI codes for bright Cyan BGREEN ANSI codes for bright Green BLACK ANSI codes for Black BLUE ANSI codes for Blue BMAGENTA ANSI codes for bright Magenta BRED ANSI codes for bright Red BROWN ANSI codes for Brown BWHITE ANSI codes for bright White CYAN ANSI codes for Cyan GREEN ANSI codes for Green MAGENTA ANSI codes for Magenta NO Defined as 0 RED ANSI codes for Red WHITE ANSI codes for White YELLOW ANSI codes for Yellow YES Defined as 1 INTEGERS -------- alarm Caller Alarm. 0 = off, 1 = on bell Page Bell. 0 = off, 1 = on c.olor Color toggle. 0 = no color, 1 = color ok expert Expert mode. 0 = non-expert, 1 = expert l.ocal 0 = remote user, 1 = local level User's security level minsleft Number of minutes user has left at door start node Node number. 0 = single user noup 1 = get.string will not uppercase page User's page length parity Should actually be data bits and is not used port Communications port in use printer Printer Toggle. 0 = off, 1 = on s.creen Screen display. 0 = off, 1 = on timecredit Time credits for user (in minutes) timeleft Time user has left (in minutes) Page 20 GAPQBDR (C) Copyright 1988-1993 The GAP Development Company LONGS ----- baud DTE rate to open COMM port at downbytes Total bytes downloaded downloads Number of downloads maxbytes Maximum number of bytes allowed to download recnum User's record number in USER file starttime Time the user logged on (in seconds) temptime For calculating keyboard time out timenow Time it is now (in seconds) timeson Number of times user has been on upbytes Total bytes uploaded uploads Number of uploads userbaud BPS rate of the remote user STRINGS ------- anystring1 garbage collector bbs.dir Path to BBS default dir birthday Callers birth date board.name Name of the BBS bphone User's business or data phone number city User's home town first User's first name gendir Path to the gen directory hphone User's home phone number last User's last name lastdate Last date user was on maindir Path to the main directory password User's password. PASSWORD if sysop is on subscrip Date user's subscription expires sysname Sysop's name username User's full name Page 21 GAPQBDR (C) Copyright 1988-1993 The GAP Development Company FUNCTIONS AND SUBROUTINES - QUICK REFERENCE ------------------------------------------- a.ccess% Checks for the existence of a file. ansi Displays ANSI escape sequences. backspace Sends one or more backspaces. ckeypress% Checks for a remote or local key press. clear.scr Clears the local and remote screens do.chat To allow sysop to chat with remote user. elap.time Computes elapsed time. get.string Gets a string of characters. get.time& Returns number of seconds since 01/01/70. getakey% Gets one key responses. getrand% Returns a random number. init.door Initializes the Door. leave Shuts down door and returns to the BBS. more Checks for a full screen. nl Sends a CR/LF to local and remote. no.carrier Prints a message if carrier lost. pagesysop Alerts sysop that the user wants to chat. pause Sends a "Press [Any Key] To Continue" prompt. putachar Sends a single character. putkey Used by chat for word wrapping. read.cnf Reads the door configuration file. read.doorsys% Reads DOOR.SYS. read.gapuser% Reads USERS.DAT. read.pcbuser% Reads PCB USERS file. read.score% Reads and displays the scoreboard. right.trim$ Trims spaces from string. set.status Displays status line. show.file Displays text files. show.mess Displays a message. time.credit Gives credits for time used. time.left Computes time remaining. update.clock Updates status line clock. waitasec Pauses for x number of seconds. wrap.word Wraps a word. write.gapuser% Writes USERS.DAT. write.pcbuser% Writes PCB USERS. write.score Creates and maintains the scoreboard. Page 22 GAPQBDR (C) Copyright 1988-1993 The GAP Development Company FUNCTIONS AND SUBROUTINES - REFERENCE ------------------------------------- Functions always return a value. The type of the return value is denoted by the type modifier after a function name. The return value should be assigned to a variable of the same type. For instance, the function get.time& returns a long integer. To re- trieve the return value, assign it to an long integer as : long.int& = get.time& Subroutines do not return a value. To call a subroutine, use the Basic CALL function : call get.string a.ccess% ----------------------------------------------------------------- Purpose Checks for the existence of a file. Parameters Full path and name of file Return Value 0 = file was found, 1 = file not found Description In order to avoid Basic errors that occur when trying to open a file that does not exist, this function should be used prior to opening any file. Example r% = access%("GAPQBDR.DOC") if r% <> 0 then call show.mess("Can't Find GAPQBDR.DOC",NO,YES) end if Page 23 GAPQBDR (C) Copyright 1988-1993 The GAP Development Company ansi ----------------------------------------------------------------- Purpose Displays ANSI escape sequences Parameters ANSI color to display Return Value None Description This function will send a string of ANSI escape sequences to the remote user and to the local console. The ANSI codes for the various colors are defined as constants in the GAPQBDR.BI file. If the remote or local user is in non graphics mode, the function returns immediately. Example call ansi(BWHITE) backspace ----------------------------------------------------------------- Purpose Sends one or more backspaces Parameters Number of backspaces to send Return Value None Description In order to actually erase a character on the screen, you must send a 3 character sequence which consists of backspace, space, backspace. This function will send as many of these 3 character sequences as you specify in the parameter list. Example call backspace(1) str$ = "Press Any Key " ' set up string call show.mess(str$,NO,NO) ' show string c% = getkeyc% ' get a key call backspace(len(str$)) ' erase string Page 24 GAPQBDR (C) Copyright 1988-1993 The GAP Development Company ckeypress% ----------------------------------------------------------------- Purpose Checks for a remote or local key press Parameters None Return Value 0 = no key is waiting, 1 = a key is waiting Description This function will check the local keyboard as well as the communications receive buffer to see if a key is waiting to be read. It is most often used in loops that need to receive a 1 character keystroke. Example c% = ckeypress% ' key pressed? c% = 0 ' initialize do | ' do something | c% = ckeypress% ' key pressed? until c% <> 0 ' key pressed,exit clear.scr ----------------------------------------------------------------- Purpose Clears local and remote screens. Parameters None Return Value None Description This routine will call CLS23 to clear the local screen. If the remote caller is in non-color mode, it sends a CHR$(12) to the remote screen, otherwise it sends the ANSI clear screen sequence. Example call clear.scr ' clear screen Page 25 GAPQBDR (C) Copyright 1988-1993 The GAP Development Company do.chat ----------------------------------------------------------------- Purpose To allow sysop to chat with remote user Parameters None Return Value None Description This function allows a one on one chat with a re- mote user. If the caller is in graphics mode, the sysop's key presses will be displayed in green and the remote user's key presses will be displayed in white. Text will automatically wrap at column 76. To exit chat, press either the ESC key or type a CTRL-X. Note that the user may also send these characters to end chat. The user will receive full credit for the time spent chatting with the sysop. However, this function will not update the BBS system file so it is possible that the user may be logged off (with an out of time message) when he/she returns to the BBS. Example call do.chat response$ = " " ' initialize call get.string(response$) ' get a string if response$ = "P" then ' paging sysop call do.chat ' chat with sysop end if Page 26 GAPQBDR (C) Copyright 1988-1993 The GAP Development Company elap.time ----------------------------------------------------------------- Purpose Computes elapsed time while waiting for keyboard input Parameters None Return Value None Description This function is used in loops that await a key- board response. Prior to entering the loop, the variable called temptime should be initialized with the current time. Once inside the loop, this function should be called to keep track of the elapsed time. If there is no keyboard response within 4 minutes, the user will be logged off. Example call elap.time temptime& = get.time& ' start timer do gc = getakey% ' get a key if gc <> 0 then ' key pressed exit do ' exit and process end if call elap.time ' activity? loop ' continue Page 27 GAPQBDR (C) Copyright 1988-1993 The GAP Development Company get.string ----------------------------------------------------------------- Purpose Gets a string of characters Parameters String to fill Return Value None Description This is the main input routine. It will get a string from either the remote user or the local keyboard. The string passed will be set to the characters received. The length of the input string is determined by the length of the string passed. Do not pass a fixed length string to this routine. Before calling, you must initialize the passed string with spaces. The number of spaces in the string determines the number of characters allowed to be input. If a user attempts to type more characters than allowed, the cursor will not move pass the end of the string. Input ends when the Enter key is pressed. To initialize the string, use the Basic space$ function (IE, input$ = space$(10) - initializes input$ to 10 spaces). WARNING : It is extremely important that the passed string be initialized. Failure to set the string to spaces, will cause unpredictable results! This function does not return a new string con- taining the keyboard input. Instead, it modifies the string you pass to it in the parameter list. The string will be stripped of any trailing spaces. get.string automatically uppercases the string. If you wish to disable this feature, set the variable noup to 1. get.string will automatically check for keyboard activity so it is not necessary for you to do so. Example instr$ = space$(10) ' initialize call get.string(instr$) ' get string Page 28 GAPQBDR (C) Copyright 1988-1993 The GAP Development Company get.time& ----------------------------------------------------------------- Purpose Gets the number of seconds elapsed since 01/01/70 Parameters None Return Value Number of seconds since 01/01/70 Description This routine is equivalent to the C time() func- tion. It is used throughout the GAPQBDR module to compute various times. This function is not sus- ceptible to the midnight roll over problem so prevalent in Basic communications programs. Note that the Return Value is of type LONG. You must cast the Return Value to a LONG INTEGER or loss of significant digits will result. Example dim ltime as long ' declare as long ltime = get.time& ' get the time ' if you don't like declaring variables, you can ' do it the old fashioned way longtime& = get.time& ' get the time Page 29 GAPQBDR (C) Copyright 1988-1993 The GAP Development Company getakey% ----------------------------------------------------------------- Purpose Gets one key responses Parameters None Return Value ASCII code for the key pressed or 0 Description This is the main keyboard input routine (internal). It is called by get.string as well as any keyboard polling loops. It checks the receive buffer as well as the local keyboard for a key press. If one is not found it returns 0. The character input is not echoed. Since 99% of all keyboard input comes from this routine, it checks for carrier, time remaining, keyboard time-out, as well as special sysop function keys. The "timeleft" variable is updated via this routine. This is the variable you would normally use in a prompt such as, [20 mins left] Main Command : Example c% = getakey Page 30 GAPQBDR (C) Copyright 1988-1993 The GAP Development Company getrand% ----------------------------------------------------------------- Purpose Gets a random number Parameters Low number, high number Return Value A random number Description This routine is provided because it is much easier to use and understand than Basic's random function. Provide as parameters two integers. The first parameter is the lowest number you will accept as a random number, and the second parameter is the highest random number you will accept. The function will return a random integer between the range specified (low and high are included in the range of numbers). It is not necessary to seed the random number generator as this is done automatically for you during program initialization. Example ' get a random number between 1 and 10 rndnum% = getrand% (1,10) Page 31 GAPQBDR (C) Copyright 1988-1993 The GAP Development Company init.door ----------------------------------------------------------------- Purpose Initializes the GAPQBDR functions Parameters None Return Value None Description This routine must be called immediately after calling read.cnf. It initializes the door, opens and reads system files, initializes the comm port, initializes global variables and in general, makes sure that all of the files required for operation are present. There is no Return Value. If an error occurs while trying to initialize, the function will display an error message and end the program. Example call read.cnf("DOOR.CFG") ' read config file call init.door ' init the door leave ----------------------------------------------------------------- Purpose Exits the program Parameters None Return Value None Description When the program terminates, it must call this function to end. This is the ONLY proper exit from the door. Example call leave Page 32 GAPQBDR (C) Copyright 1988-1993 The GAP Development Company more ----------------------------------------------------------------- Purpose Checks for a full screen and issues a More Prompt Parameters None Return Value None Description This is an internal routine that is called by the character output functions. Example nl ----------------------------------------------------------------- Purpose To send a Carriage Return and Line Feed to local and remote Parameters Number of New Line's to send Return Value None Description To send a blank line, call this routine with the number of blank lines you wish to send. Example call nl(2) ' send two blank lines Page 33 GAPQBDR (C) Copyright 1988-1993 The GAP Development Company no.carrier ----------------------------------------------------------------- Purpose Prints a message and calls leave() Parameters None Return Value None Description Internal routine that is called when there is a loss of carrier. Displays a message to the local screen and then calls leave to terminate the program. If you have a routine that checks for carrier and you wish to display the standard "No Carrier" message and log the user off, call this function. Example call no.carrier pagesysop ----------------------------------------------------------------- Purpose Alerts sysop that user wants to chat Parameters None Return Value None Description Allows the programer to provide the user with a Page Sysop command. The page lasts for 30 seconds and can be aborted by typing CTRL K. If the sysop's page bell is on, the sysop's speaker will also sound. To answer the page, the sysop should press CTRL F10. Example response$ = " " ' initialize var call get.string(response$) ' wait for a key if response$ = "P" then ' wants to chat call pagesysop ' tell sysop end if Page 34 GAPQBDR (C) Copyright 1988-1993 The GAP Development Company pause ----------------------------------------------------------------- Purpose Sends a "Press [Any Key] To Continue" prompt Parameters None Return Value None Description This function sends a pause prompt and waits for a key press. Example call nl(1) ' send blank line call pause ' wait for a key putachar ----------------------------------------------------------------- Purpose Send a single character to local and remote Parameters ASCII character to send Return Value None Description This routine is called a "semi-unfiltered" char- acter output routine because it allows for most ASCII characters to be output. Example c% = ASC("A") ' send an 'A' call putachar(c%) ' to local and remote screen c% = getakey% ' get a keypress if (c% <> 0 then ' if we got a key call putachar(c%) ' display the end if ' character Page 35 GAPQBDR (C) Copyright 1988-1993 The GAP Development Company putkey ----------------------------------------------------------------- Purpose Used by chat routines to keep track of word wrapping Parameters Character to send Return Value None Description This is the main output routine for the chat functions. It keeps track of the current column, and decides when it is time to wrap a word. It should not be called by the programmer's routines since putachar is faster and more efficient. Example Page 36 GAPQBDR (C) Copyright 1988-1993 The GAP Development Company read.cnf ----------------------------------------------------------------- Purpose To read the door configuration file Parameters Full path and file name to the configuration file. Return Value None Description Opens the configuration file for the current door. Normally the passed parameter is the name of the door with a .CNF extension (it is assumed that the file is in the same directory as the door program). If an error occurs, the program ends immediately. The first line of the file is the path to the BBS default directory. The second line is the name of the BBS. The third line is the Port IRQ and the 4th line is the Port Base Address. If the sysop running your program has his BBS configured to use Com Ports other than 1 or 2, he would then enter the IRQ and Base address for his Com Port on lines 3 and 4. GAPQBDR derives the Port Number from the DOOR.SYS file. Lines five through eight are for the Intelligent DigiBoard multi-port Communications Card. The DigiBoard routines specifically support the COM/Xi series. All four of these lines are required even if your end users are using the Standard Interface. Line five is the Communications Port Interface. It must be one of the following: STANDARD DIGIBOARD INT14/EBIOS The Standard interface is the one that will normally be used. If an end user is using a DigiBoard then either the DigiBoard or Int14/EBIOS interface may be selected. Most sysops will use the Int14/EBIOS interface. All input/output to the DigiBoard is performed via Interrupt 14 calls and a Device Driver (available from DigiBoard) handles the interface between the program and the board. The DigiBoard interface uses Direct Programming. GAPQBDR talks to the board directly without the need for a Device Driver. In order to use this interface, a program called RESETDIG.EXE must be used in the AUTOEXEC.BAT file to reset the Page 37 GAPQBDR (C) Copyright 1988-1993 The GAP Development Company DigiBoard once when the computer is first booted. If the end user does not have this program (it is a part of the GAP Communications BBS package) then the Int14/EBIOS interface must be used. If the Interface is other than STANDARD, then lines 6 through 8 will be ignored. If the Interface is INT14/EBIOS, then lines 6 and 7 will be ignored. Line 6 is the DigiBoard Memory Window, or the address the board uses as a communications area between itself and the Host Computer. This line is used only if the Interface is set to DIGIBOARD. It can be set to 0 if the Interface is STANDARD or INT14/EBIOS. Line 7 is the DigiBoard I/O Port Address. This line is used only if the Interface is set to DIGIBOARD and can be set to 0 otherwise. Line 8 is the DigiBoard Channel Number. This line is required for the DIGIBOARD and INT14/EBIOS Interfaces. It is normally 1 - 8 for the DIGIBOARD Interface and 4 - 11 for the INT14/EBIOS Interface. The Channel Number is similar to a Port Number. It tells the program which of the DigiBoard Communications ports to use. It is the responsibility of the door author to describe the format of these eight lines to the end user. It is also the responsibility of the door author to insure that the end user have these eight lines in the door configuration file. If your door program requires no configuration parameters of its own, you can simply distribute a sample "door".cnf file with these eight lines already in it. GAPQBDR will NOT close this file (file #1) after reading the first eight lines. It leaves the file open for the programmer's use. If your door does require certain configuration parameters, have your users place the parameters in the file starting with line 9. If you use a set up program, be sure that your set up program writes the first eight lines as specified. After you have called read.cnf and init.door, if you have any configuration options in the Page 38 GAPQBDR (C) Copyright 1988-1993 The GAP Development Company "door".cnf file, you should line input those op- tions. Then close file #1. Even if you have no options to read, close the file. WARNING : You MUST call this routine before using any of the GAPQBDR functions. After calling this routine, you MUST call init.door. Example call read.cnf("TOURIST.CNF") call init.door read.doorsys% ----------------------------------------------------------------- Purpose Reads the DOOR.SYS universal door interface file Parameters None Return Value 0 = no error, 1 = error Description Internal routine called by init.door. Reads the DOOR.SYS file and initializes any global variables that depend on the information in that file. Example c% = read.doorsys% read.gapuser% ----------------------------------------------------------------- Purpose Reads the GAP Communications USERS.DAT file Parameters None Return Value 0 = no error, 1 = error Description Reads the user record of the current user in the GAP USERS.DAT file. The record variables are contained in a variable called user. Example c% = read.gapuser% Page 39 GAPQBDR (C) Copyright 1988-1993 The GAP Development Company read.pcbuser% ----------------------------------------------------------------- Purpose Reads the PCB USERS file. Parameters None Return Value 0 = no error, 1 = error Description This function will read the PCB Users record for the user currently in the door. Example c% = read.pcbuser% read.score% ----------------------------------------------------------------- Purpose Reads and displays the top 10 player file. Parameters Filename to read, message to display. Return Value 0 = ok, 1 = file not found Description This function reads the scoreboard file and displays it to the caller. Pass as the first parameter, the name of the scoreboard file. The second parameter is a string to display prior to showing the actual scores. Example c% = read.score% ("SCORE.DAT","Top 10 Players") if c% = 1 then call show_mess("No winners yet!",NO,YES) end if Page 40 GAPQBDR (C) Copyright 1988-1993 The GAP Development Company right.trim$ ----------------------------------------------------------------- Purpose Trims spaces from the end of NULL terminated strings Parameters String containing the spaces. Return Value String without the spaces. Description This function will remove the NULL and trim any spaces from the right end of any 'C' string. Example username$ = right.trim$(user.fname) set.status ----------------------------------------------------------------- Purpose To display and update the sysop status line Parameters 0 = set the status line, 1 = update the status line, 4 = show other user stats Return Value None Description This routine is used internally. There should be no reason to call it unless you have modified a user's stats and you need to update those stats on the status line. In this case, you should use option 0. Example call set.status(0) Page 41 GAPQBDR (C) Copyright 1988-1993 The GAP Development Company show.file ----------------------------------------------------------------- Purpose To display a text file Parameters The full path and file name to the file to be shown Return Value None Description Many door programs have welcome, news, exit, help and other files to show to the user at various points in the program. This is the function that allows you to do that. This function tries to be as intelligent as it possibly can in determining the sysop's wishes. To display a file to the user, call the function with the full drive\path\filename of the file to display. If you have color and non-color versions of files pass the name of the non-color version as this function will automatically append a "G" to the filename if the user is in color mode. In fact, this function will ALWAYS try to find a file with a "G" appended to the end of the name (if the user is in color mode) before it looks for the actual file by the name you specified. If you pass "WELCOMEG" to this function and the user is in color mode, it will first try to find a file with the name of "WELCOMEGG". As with GAP Communications, your text files can have certain control characters as the first character in the file. A "{" signals that the more prompt should never display. In other words, GAPQBDR will not keep track of the number of lines displayed and will never issue a more prompt. This is useful for very long ANSI files. A "@" signals that the pause prompt should be displayed when the screen is full instead of a more prompt. This is very handy when you want the user to see the file in its entirety. The user will not be allowed to break out of the file read. WARNING : The "{" or "@" MUST appear as the VERY first character in the file. If you use an ANSI editor, be aware that the first few characters in a file will usually be an ANSI color sequence. You Page 42 GAPQBDR (C) Copyright 1988-1993 The GAP Development Company normally have to edit the file with a text editor to insert the control character. Because QB 4.x is EXTREMELY slow when it comes to function calls, all input and output is done "in line". Despite QB's high overhead, this function is pretty fast. GAPQBDR does not have the ability to protect the status line. Because of this, it is possible for an ANSI file that contains clear screen codes to erase the status line. At the end of the function, the status line will be re-drawn just in case. Since most ANSI files contain the clear screen codes at the beginning of the file, show.file will remove any such codes during the first read of the file. Pressing CTRL K or CTRL X will abort any file display if the file does not begin with a "@". REMEMBER : If you have both color and non-color versions of the same files, pass the name of the non-color version. Also, the actual disk files must be named in such a way that they have no file extension and the color version ends with a "G". Example call show.file("WELCOME") call show.file("C:\GAP\GEN\WELCOME") Page 43 GAPQBDR (C) Copyright 1988-1993 The GAP Development Company show.mess ----------------------------------------------------------------- Purpose Displays a message Parameters Message, ring the bell, issue a New Line Return Value None Description Finally! After all of this, just how do you dis- play a message to the user? Well, here it is. This is the string output function for GAPQBDR. Under most circumstances, this is the one function that you would call to display output to the user. There should be no reason to ever call putkey or putachar, as they are basically internal routines. There should be no reason to EVER use the Basic print statement unless you need to display a mes- sage to the local screen that you do not want the remote user to see. In other words, ALL string output should be done through this function. If there is a reason to display information locally it would be much easier and more efficient to keep track of the l.ocal variable, set it to 1, call show.mess with the strings to be displayed, then restore the l.ocal variable to what it was before, instead of using the print function which cannot display ANSI sequences (forcing you to translate ANSI codes to color statements). The three parameters are : 1 - the string to display 2 - YES or NO if you want to sound the remote user's bell. 3 - YES or NO if you want to issue a CR/LF after displaying the string. Page 44 GAPQBDR (C) Copyright 1988-1993 The GAP Development Company Example ' the first show.mess displays the string and leaves the ' cursor on the same line. The second show.mess displays ' the string, rings the remote user's bell, and drops the ' cursor to the next line. call nl(1) call show.mess("Are you ready? (Y/N) : ",NO,NO) a$ = space$(3) call get.string(a$) if left$(a$,1) = "Y" then ' begin whatever it is you want to begin else call nl(1) call show.mess("Too Bad!",YES,YES) end if Page 45 GAPQBDR (C) Copyright 1988-1993 The GAP Development Company time.credit ----------------------------------------------------------------- Purpose Keeps track of time and credits the user with time elapsed Parameters 1 = start timer, 0 = end timer Return Value None Description This is basically an internal routine called by chat and sysop shell to DOS so that the user is not penalized for time used. It updates a global variable called timecredit. Timecredit is used in the calculations that determine the user's time remaining. If you wish to use this feature in your own rou- tines, prior to entering your routine, call time.credit with a 1 and it will start the timer. When your routine is finished, call time.credit with a 0 and the timer will stop. The variable timecredit will be updated with the elapsed time. Example call time.credit(1) ' start the timer call do.chat ' chat with user call time.credit(0) ' stop the timer ' Note that this is simply an example. do.chat ' calls time.credit on its own. In the above ' example, if the sysop chat with the user took ' 10 minutes, the user will be credited with ' that 10 minutes as will be reflected in the ' timecredit variable. Page 46 GAPQBDR (C) Copyright 1988-1993 The GAP Development Company time.left ----------------------------------------------------------------- Purpose To compute the user's time remaining Parameters None Return Value None Description This is the routine that is called by the input and output routines to compute the user's time remaining. It is not necessary for the programmer to call this routine directly. A global variable called timeleft will be updated with each call. This variable may be used in prompts that display the user's remaining time. As long as all input/output is performed thru calls to the GAPQBDR library, the timeleft variable will always be current. Example call time.left update.clock ----------------------------------------------------------------- Purpose Updates the status line clock Parameters None Return Value None Description Internal routine to update the status line clock. Example Page 47 GAPQBDR (C) Copyright 1988-1993 The GAP Development Company waitasec ----------------------------------------------------------------- Purpose Pauses for the number of seconds specified. Parameters Number of seconds to pause Return Value None Description This function allows you to pause all processing for the specified number of seconds. It is in- sensitive to processor speed and is immune to the midnight rollover problem. Example call waitasec(10) ' pause for 10 sec wrap.word ----------------------------------------------------------------- Purpose To wrap a word during sysop chats Parameters None Return Value None Description Internal function called by putkey to wrap words. Example Page 48 GAPQBDR (C) Copyright 1988-1993 The GAP Development Company write.gapuser% ----------------------------------------------------------------- Purpose Updates the user record in GAP's USERS.DAT file Parameters None Return Value 0 = no error, 1 = error Description This function allows you to update any variables in the GAP USERS.DAT file for the current user. WARNING : The GAP USERS.DAT file contains C char- acter arrays. These are equivalent to Basic's fixed length strings with the exception that the C strings have a NULL character (chr$(0)) in the last position. If you modify any of these fixed length strings, you MUST make sure that the string is fully padded with spaces and that the NULL character is placed in the last string position. When assigning a value to a fixed length string, Basic will automatically pad the fixed length string with spaces. All the programmer need to is insure that the NULL is inserted at the end of the string. WARNING : The indexes for the user file consists of the user's last name, first name, level, and handle. Do not under any circumstances modify either of these four fields. Doing so will cause corruption of the Index file. Example ' Increase # of Files User has downloaded c% = read.gapuser% ' 1st read record user.downloads = user.downloads + 2 c% = write.gapuser% ' update the record Page 49 GAPQBDR (C) Copyright 1988-1993 The GAP Development Company write.pcbuser% ----------------------------------------------------------------- Purpose Updates the PCB USERS file Parameters None Return Value 0 = no error, 1 = error Description This function allows the programmer to update the PCB USERS File. Note that you will need to use MKSMBF on the field lastmsg, and MKDMBF on the fields downbytes and upbytes, if you modified these fields since reading the file. Example c% = write.pcbuser% ' write the file write.score ----------------------------------------------------------------- Purpose Creates and maintains the scoreboard file. Parameters Filename to write, score to write. Return Value None Description This function will create and maintain a data file of the top 10 scores. You pass as parameters, the name of the file to use as the scoreboard file, and the score to write. The score is a long integer. The name and date are already known. If the file does not exist, it will be created. Example DIM score AS LONG score = 45600 write.score("SCORE.DAT",score) Page 50 INDEX ----- @ 42 { 42 A.ccess% 23 ANSI 5, 7, 17, 20, 24, 42, 44 Backspace 24 Base address 9, 13, 37 Bell 44 Chat 5, 26, 34, 36, 46, 48 Ckeypress% 25 Clear.scr 25 COMMAND$ 10 Communications base address 9, 13, 37 configuration file 9, 13, 37 IRQ 9, 13, 37 Communications port 11 Configuration file 10, 11 Do.chat 26 DOOR.SYS 9, 11, 13, 18, 22, 37 Elap.time 27 Error 8, 11, 23, 32, 37 Files Aborting 43 Color 42 Configuration 11, 37 DOOR.SYS 9, 13, 37, 39 Errors 23 Include 8, 11 Opening 23 PCB USERS 40 Showing 42 System 26, 32 USERS.DAT 39, 49 Functions 23 Get.string 19, 26, 28, 30, 34, 45 Get.time& 29 Getakey% 30 Getrand% 31 Global Variables Constants ANSI BBLACK 17 BBLUE 17 BCYAN 17 BGREEN 17 BLACK 17 BLUE 17 BMAGENTA 17 Page 51 INDEX ----- BRED 17 BROWN 17 BWHITE 17 CYAN 17 GREEN 17 MAGENTA 17 RED 17 WHITE 17 YELLOW 17 General NO 17 YES 17 Integers DOOR.SYS alarm 18 bell 18 c.olor 18 expert 18 l.ocal 18 level 18 minsleft 18 node 18 page 18 parity 18 port 18 printer 18 s.creen 18 General noup 19 timecredit 19 timeleft 19 Longs DOOR.SYS baud 18 downbytes 18 downloads 18 maxbytes 18 recnum 18 timeson 18 upbytes 18 uploads 18 userbaud 18 General starttime 19 temptime 19 timenow 19 Strings DOOR.SYS Page 52 INDEX ----- bphone 18 city 18 first 18 hphone 18 last 18 lastdate 18 password 19 subscrip 19 username 19 General anystring1 19 bbs.dir 19 board.name 19 gendir 19 maindir 19 sysname 19 Init.door 10, 11, 32, 39 IRQ 9, 13, 37 Leave 11, 32 MKDMBF 50 MKSMBF 50 More 33 New Line 33, 44 Nl 33 No.carrier 34 Node 11 Noup 28 Pagesysop 34 Pause 35, 48 PCB USERS 22 Putachar 35, 44 Putkey 36, 44 Read.cnf 9, 10, 11, 37 Read.doorsys% 39 Read.gapuser% 39 Read.pcbuser% 40 Read.score% 40 Right.trim$ 41 Set.status 41 Show.file 42 Show.mess 24, 44 Spaces Trimming 41 USERS.DAT 49 Status Line 5, 41, 43, 47 String output 44 Subroutines 23 Time.credit 46 Page 53 INDEX ----- Time.left 47 Timecredit 46 Timeleft 30, 47 Trimming Spaces 41 Update.clock 47 USERS.DAT 22 Waitasec 48 Wrap.word 48 Write.gapuser% 49 Write.pcbuser% 50 Write.score 50 Page 54