C L A C O M Communications Library For Clarion Database Developer Copyright (C) 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. CLACOM 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. CLACOM is copyrighted by GAP Development Company. Clarion and Clarion Database Developer are trademarks of Clarion Software Corporation. DESQview is a trademark of Quarterdeck. DigiBoard is a trademark of DigiBoard Incorporated. Contents Description 5 Major Features 5 Getting Started 6 Integrating with Clarion 7 Overlays 8 Communications Interface 9 File Transfers 11 KeyCodes 12 Port Initialization 14 Input & Output 17 Sample Application 21 Functions - Quick Reference 24 Functions - Detailed Reference 25 Page 3 Appendix A 69 Appendix B 72 Index 73 Page 4 GAP Communications CLACOM Description CLACOM is a professional communications library for programmers using the Clarion Database Developer. It allows you to easily integrate asynchronous communications into your Clarion programs. CLACOM includes robust Communications routines which are fully interrupt driven. Written in highly optimized assembler, they are capable of operating at any speed which the UART on an IBM type of computer is capable of producing. The FIFO buffers in the 16550 UART are fully supported. Hardware flow control (CTS/RTS checking) is automatic. CLACOM provides for built in ANSI emulation as well as the most popular file transfer protocols. Major Features  Supports the FIFO buffers of the 16550 UART chip.  Speeds up to 115,200 baud.  Supports COM 1 through COM 4 as well as Intelligent DigiBoards using a Direct Programming Interface or a DigiBoard Device Driver.  Supports CTS/RTS, automatically.  Fully self contained, built in ANSI driver for IBM ANSI Terminal Emulation.  File transfer protocols include - ASCII, Xmodem, Xmodem- CRC, 1K Xmodem, 1K Xmodem-G, Ymodem, Ymodem-G, and Zmodem.  Extremely easy interfacing with Clarion programs. Page 5 GAP Communications CLACOM Getting Started First a note about this documentation. This Text Based manual is identical in content to the Printed Manual except that it lacks formatting and graphics. Some screens can not be reproduced in a document such as this. Font sizes can not be changed when necessary since there is no way of knowing what kind of printer this document will be printed with. The Printed Manual is designed in such a way that it is easy to read and it is easy to find the information you may be looking for. We are unable to do the same with this text based manual. If the documentation references a screen, you will need to run the Example program to see the screen, since we are unable to reproduce it in this Text Based manual. The following files are part of the CLACOM distribution set: CLACOM.TXT - Text Based documentation. Not part of Registered version since its not needed. DXVCLOM.LIB - Library routines for Statically linked Clarion APP. DOVCLCOM.LIB - Library routines for Overlayed Clarion APP. DDVCLCOM.LIB - Library routines for Overlayed Clarion APP using Run Time Librares. CLACOM.OBJ - Stub for including Module Definitions. CLACOM.INC - Module Structure Include file GTERM.ZIP - Terminal Emulation example with Clarion source. RESETDIG.ZIP - Program used to reset a DigiBoard COM/Xi. The .OBJ, .LIB and .INC files should be placed in the same directory where the program you intend to use them with resides. GTERM.ZIP contains a Terminal Emulation Clarion Application. It should be placed in its own directory along with the above .OBJ, .LIB and .INC files. Page 6 GAP Communications CLACOM Integrating with Clarion To tell your Clarion Application that you are using the CLACOM library, follow these steps: Load or Create your application. From the View Menu, select Module View. Select Insert from the Edit Menu. The Module Properties screen will appear. For the Module Name, type CLACOM.OBJ. Select the External Object Module radio button. For the Module Structure Include File, type CLACOM.INC. Select OK. CLACOM.OBJ is a dummy module. It contains no code or data. Its sole purpose is to include the CLACOM procedure definitions. You must now edit the Project File and include the three CLACOM libraries. The three libraries are identical with the exception that they were compiled using one of the three Clarion memory models: Static, Overlayed, and Overlayed/Runtime. Select the Project Menu. Select Change Project File. Select the Module button and then the Insert button. For the Module Name, type: %CLAPFX%CLCOM.LIB Select the External OBJ/LIB Radio button. Finally, save the Project File changes. Your Clarion application is now fully aware of the CLACOM library routines and you will be free to use any of the three standard Memory Models without having to worry about which CLACOM library to use. Page 7 GAP Communications CLACOM Overlays You must perform one final step before generating your CLACOM application. The Standard Communications interface takes over the interrupt vector for the selected COM Port. This means that the interrupt service routine can not be swapped out. It must remain in memory at all times. The same is true if you enable the Ctrl-Break intercept routine (which you should). In order to keep the Communications routines in memory and prevent them from being swapped out, you must make a change to one of Clarion's files. In the Clarion directory there is a file called ROVERLAY.EXP. Edit this file and add the following line to the end of the SEGMENTS section: GCOM_TEXT PRELOAD A portion of the ROVERLAY.EXP file would appear as follows: CLAICEP_TEXT PRELOAD CLAFIXED_DATA PRELOAD GCOM_TEXT PRELOAD Please do not take the above change lightly or forget to make it. Failure to add the above line will cause your program to crash as soon as the communications routines are swapped out of memory. You will need to remember to make this change whenever you upgrade to a new version of Clarion, since the Upgrade (or Patch) will overwrite your changes. Adding the above line to your Export file will not, in any way, interfere with applications that do not use CLACOM. Page 8 GAP Communications CLACOM Communications Interface CLACOM supports three serial port interfaces: STANDARD DIGIBOARD INT14/EBIOS The standard interface is used when working with the standard COM1 thru COM4 serial ports on the Host computer. This will be the interface most often used. If an end user is using a DigiBoard then either the DigiBoard or Int14/EBIOS interface may be selected. Most DigiBoard users will use the Int14/EBIOS interface. All input/output to the DigiBoard is performed via Interrupt 14 calls and a Device Driver (supplied by DigiBoard) handles the interface between the program and the board. The DigiBoard interface uses Direct Programming. CLACOM 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. This program is supplied as part of the CLACOM package and may be freely distributed to your end users. In order to determine which interface your end users require, you should provide a Hardware screen similar to the following: SCREEN NOT AVAILABLE IN TEXT BASED DOCUMENTATION SEE EXAMPLE PROGAM If the Standard Interface is selected, the Ports Button should be enabled, the DigiBoard Button disabled, and if the Ports Button is selected, a screen similar to the following should be displayed: SCREEN NOT AVAILABLE IN TEXT BASED DOCUMENTATION SEE EXAMPLE PROGAM Page 9 GAP Communications CLACOM If the DigiBoard or Int14/EBIOS Interface is selected, the Ports Button should be disabled, the DigiBoard Button enabled, and if the DigiBoard Button is selected, a screen similar to the following should be displayed: SCREEN NOT AVAILABLE IN TEXT BASED DOCUMENTATION SEE EXAMPLE PROGAM On the Hardware Screen, if the DigiBoard or Int14/EBIOS Interface is selected, then the Port Radio Buttons should be disabled. On the Port Assignments Screen, the Base and IRQ fields for COM 1 and COM 2 should be marked as "Skip". The reason for this is that it makes no difference what a user types into these fields since the standard Base Address and IRQ for these two ports will be used. On the DigiBoard Parameters Screen, the fields that need to be disabled depend upon the Interface. If the Interface is DigiBoard, then the Memory Window and I/O Port Buttons are valid, as is the Channel Number field. Channel Numbers for the Direct Interface generally range from 1 to 8. The sample screens show the valid Window and I/O Port address for a DigiBoard. If, however, the Interface is Int14/EBIOS, the Memory Window and I/O Port Buttons should be disabled. Only the Channel Number field should be selectable. The Int14/EBIOS Interface uses the DigiBoard supplied Device Driver and it already knows what the addresses for the board are, so these Radio Buttons are not needed for this Interface. Channel numbers for this Interface generally range from 4 to 11 (0 - 3 are reserved for COM1 - COM4). Don't try to do range checking on the DigiBoard Channel Numbers. These boards are produced in several varieties from 2 ports, 8 ports, up to 16 ports. An end user that is using a DigiBoard will likely know what Channel Number is being configured. When using the DigiBoard Interface an end user that is using a DigiBoard will also know what Memory Window and I/O Port address the board was configured for when the board was installed. The valid addresses are contained in the DigiBoard manuals and are shown on the sample screens. Page 10 GAP Communications CLACOM Keep in mind that in order to use the DigiBoard Direct Interface, your end users must run the supplied RESETDIG.EXE program in their AUTOEXEC.BAT files. This program makes sure the DigiBoard is reset and able to accept commands when the computer is powered on. It resets all of the Channels on the board, which is why it is run only once. File Transfers CLACOM supports all of the popular File Transfer Protocols. Each of the protocols are given a number (with the exception of Zmodem). Before initiating an Upload or a Download, you need to prompt the user for a Protocol. Your end users won't be the least bit impressed about having to type in a number so your Protocol Browse Box should display Protocol Names. In the background, you will translate the Names into numbers to send to the protocol drivers. The sample Terminal Program shows an excellent example of how to prompt for a Protocol and translate the string into a number to send to the protocol drivers. The Protocols are numbered as follows: 0 - ASCII 3 - 1K Xmodem-G 1 - Xmodem 4 - Ymodem 2 - 1K Xmodem 5 - Ymodem-G Note that as far as CLACOM is concerned, there is no difference between Checksum Xmodem and CRC Xmodem. CLACOM always starts in "CRC Mode" but will adjust itself as necessary. Also note that both of the Ymodem protocols (as well as Zmodem) are Batch Protocols and when Downloading, you need not prompt for a File Name since the name will be supplied by the sender. When Uploading you can either provide a single File Name to upload or a Wild Card specification. Page 11 GAP Communications CLACOM KeyCodes CLACOM includes a function called GetKeyc. If your application needs to send keycodes that were generated from the local keyboard out the Communications Port to a remote computer you need to use this function to gather input from the local keyboard. Clarion's keyboard routines can not be used because Clarion changes the value of certain key presses (including the standard ASCII codes, 0 - 255). For instance, Clarion re-maps the following keys from their standard ASCII value to a value meaningful only to Clarion: Key Clarion Actual Escape 256 27 Enter 257 13 Backspace 258 8 If you use the Clarion keyboard functions and a user presses the backspace key, Clarion returns a code of 258. If you send this keycode to the remote computer, what you will actually be sending is the code 2 (Clarion's keyboard functions return a LONG and Communications Ports can only accept a BYTE, therefore the high bytes of the return value are truncated and only the lower byte is sent). The remote computer will either display the character (a happy face) or act upon it (to the remote computer, it is a Ctrl-B). The remote computer will not know that you were trying to backspace over a previously typed character! Any character typed at the keyboard is a valid character to send out the Communications Port if that character has a value of 255 or less. It shouldn't be re-mapped or translated in any manner. GetKeyc returns keyboard characters "as is". It makes no translations on regular ASCII characters (0 - 255). Any code above 255 (an Extended Keyboard code) returns the actual keyboard scan code for that key with the value 256 added. By adding 256 to the value you can easily determine if the key is an exteneded key. A Backspace is code 8. An Enter is code 13. An Escape is code 27. Because Clarion includes its Keyboard Equate file in your application, there are no supplied mnemonics for the keycodes that GetKeyc returns. Appendix A shows the actual key typed and the value returned by GetKeyc. You can not use BSKey to see if a key press is the Back Space key because of the keyboard re- Page 12 GAP Communications CLACOM mapping equates that Clarion includes in your program. If you do, you will be testing against the code 258 when you need to be testing against the code 8. For instance, this will not work: keychr = GetKeyc() ! Get Key Press if keychr = BSKey ! Backspace hit ComPutc(keychr) ! Actually sends a Ctrl-B end This will work: keychr = GetKeyc() ! Get Key Press if keychr = 8 ! Backspace hit ComPutc(keychr) ! Sends an 8 (backspace) end Page 13 GAP Communications CLACOM Port Initialization The first thing a communications program normally does is initialize the communications port and reset the modem. You will notice that the sample program, GTERM, takes a different approach to the usual "terminal" interface and it doesn't initialize the port until it is ready to use it. How you initialize the communications port depends upon which Interface the user has selected. The DigiBoard and Int14/EBIOS Interfaces set up the port in a single step process. This is because some of the low level routines either in the Int14 Device Driver or the on-board BIOS require that all parameters be known when initializing a port on the board. Setting up the Standard Interface is a two step process. The first step is to set up the Interrupt Handler, program the UART to generate interrupts, turn the FIFO buffers on (if the UART is a 16550) and program the Interrupt Controller chip so that it will recognize the UART interrupts. The second step is to set the Line Control register in the UART. This is more commonly known as setting the Baud Rate, Party, Data, and Stop bits The following is an example on setting up the communications port. The first step is to initialize the ANSI driver. This is important so that the screen output functions know how large your Terminal Screen is and the default color you want to use. The second step is to determine which Interface the user is using and setup the port accordingly: InitAnsi(MaxRows,MaxCols,14) ! Initialize Ansi Driver BaudRate = DEFORMAT(GCN:BaudRate) ! string to number data = deformat(GCN:Data) ! get Data stop = deformat(GCN:Stop) ! Stop if GCN:Parity = 'Odd' ! and Parity parity = 1 elsif GCN:Parity = 'Even' parity = 2 else parity = 0 end gotdigi = 0 ! assume no DigiBoard Page 14 GAP Communications CLACOM if clip(GCN:Interface) = 'DigiBoard' ! using DigiBoard gotdigi = 1 ! set DigiBoard flag anystring = GCN:DigiSeg ! get Memory Window digiseg = StrHex(anystring) ! as a Hex Number anystring = GCN:DigiPort ! get I/O Port digiport = StrHex(anystring) ! as a Hex Number retcode = DsetUp(DigiSeg,DigiPort,GCN:DigiChnl,BaudRate, parity,data,stop) if retcode > 0 ! display error message and quit end elsif clip(GCN:Interface) = 'Int14/EBIOS' ! using Int14/EBIOS gotdigi = 1 ! set DigiBoard flag retcode = Int14Set(GCN:DigiChnl,BaudRate,parity,data,stop) if retcode > 0 ! display error message and quit end else ! Regular Interface ! get Port, IRQ, and BASE Address IRQ = 0 base = 0 if GCN:Port = 'COM1' port = 0 elsif GCN:Port = 'COM2' port = 1 elsif GCN:Port = 'COM3' port = 2 IRQ = GCN:IRQ3 anystring = GCN:BASE3 base = StrHex(anystring) elsif GCN:Port = 'COM4' port = 3 IRQ = GCN:IRQ4 anystring = GCN:BASE4 base = StrHex(anystring) end Page 15 GAP Communications CLACOM ! initialize COM Port and Interrupt Vector retcode = SetPort(IRQ,base,port) if retcode > 0 ! display error message and quit else ! Set Baud, Parity, Data, and Stop retcode = InitPort(BaudRate,parity,data,stop) ! Init port if retcode > 0 ResetPort() ! Interrupts Off ! display error message and quit end end end You will see that when using the Standard Interface and there are no errors setting up the Port, we then call InitPort to set the Baud Rate, Data, etc. Page 16 GAP Communications CLACOM Input & Output To gather input from the local keyboard, GetKeyc is used. GetKeyc returns a SHORT. If the return value is less than 0 then that means no key was pressed (GetKeyc actually returns a -1 in this case). If the return value is greater than 255 then that means an extended key was pressed (function key, cursor pad key, etc). You normally do not send these extended keys out the communications port unless the remote end can accept and handle extended keys. If the remote end can handle extended keys, the usual procedure for sending these keys is to first send a 0, then send the lower 8 bits of the return value. If the return value is less than or equal to 255, then you assign the return value to a BYTE and call ComPutc to send the keyboard code. The following example shows how to use GetKeyc and interpret the return value. Note that we do not use the Clarion KeyCode Equate labels since they are mapped to different codes: retchr SHORT keychr BYTE retchr = GetKeyc() ! get a keyboard character if retchr NOT= -1 ! if something there if retchr > 255 ! Extended Key case retchr ! which one of 278 ! Alt-U, Upload a File of 288 ! Alt-D, Download a File of 369 ! Alt-F10, activate Menu end else ! regular keyboard key keychr = retchr ! Translate to BYTE value ComPutc(keychr) ! and send it out end end The following example is similar to the above but in this case, the remote end can handle extended keyboard codes: retchr SHORT keychr BYTE retchr = GetKeyc() ! get a keyboard character if retchr NOT= -1 ! if something there if retchr > 255 ! Extended Key Page 17 GAP Communications CLACOM case retchr ! which one of 278 ! Alt-U, Upload a File of 288 ! Alt-D, Download a File of 369 ! Alt-F10, activate Menu else ! not something we care about keychr = retchr ! Translate to BYTE value ComPutc(0) ! flag that this is extended key ComPutc(keychr) ! send scan code end else ! regular keyboard key keychr = retchr ! Translate to BYTE value ComPutc(keychr) ! and send it out end end Whether or not local keyboard characters are sent to the local screen depends upon if you originated the connection or answered the connection. Generally the originating side does not display keyboard characters. It simply sends the characters out the communications port and the answering side displays the characters on its screen and sends the characters back, at which time you retrieve them from your receive buffer and display them. This is sometimes refered to as Full Duplex. Some answering systems do not echo characters back to the sender (refered to as Half Duplex). In this case, you will need to display the keyboard character in addition to sending it to the communications port. If you are writing BBS software, you always display locally typed characters on the screen, and you always echo characters received from the communications port back out the port. If you are writing Terminal Emulation software, whether or not to display locally typed characters on the screen is generally a Phone Book option for each entry in the phone book. Characters received from the communications port are never sent back out the port. Page 18 GAP Communications CLACOM The following is an example of keyboard input routines where "Half Duplex" operation is required: retchr SHORT keychr BYTE halfdup BYTE halfdup = 1 ! flag to use half duplex retchr = GetKeyc() ! get a keyboard character if retchr NOT= -1 ! if something there if retchr < 256 ! regular character keychr = retchr ! Translate to BYTE value ComPutc(keychr) ! and send it out if halfdup ! if half duplex Gputc(keychr) ! display on local screen end end end A good example of Half Duplex versus Full Duplex is when you enter into Terminal Emulation mode when not connected with a remote computer. If the modem is configured not to echo characters back, then anything you type will not be displayed on the screen. This is because there is no On Line service on the remote end to send the characters back. If you subsequently place an item on the Terminal Menu to toggle duplex from full to half and toggle it to half, then what you type will be displayed on the screen (providing you write the code to handle this situation, as in the above example). GPutc and GPuts are the local output routines. The first displays single characters while the second displays entire strings. Both routines are tied into the internal ANSI driver which means they can contain ANSI display sequences to move the cursor, change colors, clear the screen, etc. ComGetc is the communications port input routine. It retrieves single byte values from the port. In order to distinguish between a no character available condition (empty receive buffer) and a legitimate character, it returns a negative value (-1) if there are no characters waiting to be read. The return value must be assigned to a BYTE before it can be displayed by Gputc. Page 19 GAP Communications CLACOM An example of ComGetc and Gputc together: retchr SHORT keychr BYTE retchr = ComGetc() ! get a remote character if retchr NOT= -1 ! if something there keychr = retchr ! Translate to BYTE value Gputc(keychr) ! and display it end ComPutc and ComPuts are the communications output routines. The first sends single characters while the second sends entire strings. A word about the built in ANSI driver and Clarion. The ANSI driver writes directly to the video display memory (taking care to honor DESQView's shadow buffer if operating under DESQView). Because Clarion keeps a backup copy of the video display, Clarion will overwrite anything placed on the screen by Gputc and Gputs. This occurs because when Clarion opens a screen or a menu, it first updates the physical screen with the contents of its backup buffer, then opens the screen. The only time this is a problem is when you are in Terminal Mode and using the CLACOM output routines. To circumvent this problem there is a procedure called GetScrn which will update Clarion's backup buffer with the contents of the physical screen. This procedure should be called prior to invoking a Clarion function that writes to the screen. Page 20 GAP Communications CLACOM Sample Application Included with CLACOM is a sample Terminal Emulation program (called GTERM) which shows how to use most of the communications routines. You may use this application as a template for designing your own communications program. The First Procedure is defined as InitProgram. InitProgram first arms a ShutDown Procedure called ResetCbreak. In then makes a call to SetCbreak to set up the Ctrl-Break handler (a necessary requirement for any communications program. ResetCbreak will be called automatically when the program ends. It makes a call to RestCbreak to restore the Ctrl-Break handler. InitProgram then checks to see if the Main Configuration File exists. If this is the first time the program is run, it will create the configuration file with default values for each of the fields. It then checks to see if the Protocol File exists. If not, it creates the file with the 7 internal protocols. This data could be set up in a Memory Queue, but placing it in a file allows you to create an entry screen so that your users can add external protocols. You will see from examining the File Properties that the fields to allow for external protocols are already in the file. If you do create a Browse/Form for adding external protocols, you need to make sure that the user can not delete or change any of the internal protocols. InitProgram then calls MainMenu. On MainMenu the user may select the Files Menu, which contains Quit, to exit the program. The Dial Menu brings up a Lookup screen where the user may select a Phone Number to call. The Dialing Directory is tied into the EditPhone Form so that a user may add or change an entry without having to go to the Setup Menu. When a phone number has been selected, the Dial Procedure initializes the Communications Port and calls the number. Upon successful connection with the remote computer it will place the user in Terminal Mode. Dial gives excellent examples on interfacing with a communications port and a modem. The Terminal Menu puts the user directly into Terminal Mode. Because Terminal Mode can be entered either directly or from the Dial Menu, the procedure checks to see if it was called by Dial. If so, it won't attempt to initialize the Communications Port. If entered from the Menu, Terminal initializes the port in exactly the same manner as Dial, with one exception. For the Port Page 21 GAP Communications CLACOM parameters, instead of using the parameters from a dialing directory entry, it uses the global default parameters. Terminal Mode is really the heart of the application. Whatever is received from the Communications Port is displayed on the screen. Incoming characters are sent to the ANSI Driver. If you wish to emulate a TTY device, instead of sending the characters to the ANSI Driver, you can use Clarion's TYPE function (the character will first have to be converted to a string). Keyboard codes (those entered from the local keyboard) are checked to see if they are extended keys. Any keyboard code above 255 is an extended key. If the key code is a regular keyboard character, it is sent out the Communications Port. If the key code is an extended key it is checked to see if it is the menu activation key (Alt-F10) or one of the "hot keys". If so, the routines associated with those keys are invoked. If the key code is not a regular ASCII character or an extended key that Terminal recognizes it is simply discarded. Please see the section Keycodes for more information on Extended Keyboard Codes and why you need to use CLACOM's GetKeyc function to retrieve characters from the keyboard. Terminal includes a Menu that is activated by pressing the Alt- F10 key. It allows the user to exit Terminal Mode, Upload and Download Files, Clear the Screen, Change Modem Parameters and Hang Up the modem (drop carrier). You will notice that any menu function that depends upon there being a remote carrier is disabled if there is no connection with a remote computer. Because Clarion writes to the screen twice (once to video memory and once to its own backup buffer) Clarion doesn't know that you've been using the ANSI driver to display characters. When you use Gputc and Gputs to send incoming characters to the CLACOM ANSI driver, Clarion has no idea that you've been writing to the screen. While in Terminal Mode, before you call any Clarion Function that displays something on the screen (with the possible exception of the TYPE function) you need to update the backup buffer that Clarion writes to. This is accomplished with a call to GetScrn. GetScrn reads the contents of the physical screen and updates Clarion's backup buffer with the information. Terminal shows how and when to call GetScrn. If you don't make the call to GetScrn then Clarion will erase whatever is on your Terminal Screen before it displays the screen you open. To get a better understanding for this, comment out all of the calls to GetScrn in the Terminal Procedure. Then make and run the program. Make a connection to a remote computer. While in Terminal Mode, activate Page 22 GAP Communications CLACOM the Menu (Alt-F10). Watch what is on the screen suddenly disappear! The Setup Menu allows a user to set default Modem Parameters and enter Phone Book entries. The Modem Parameters are used as the defaults for each Phone Book entry and when entering Terminal Mode from the Terminal Menu. GTERM gives excellent examples on how to use the CLACOM functions and procedures. It can be used as a template to write powerful Terminal Emulation programs that include more terminal emulations, external protocols, script files (for automating logons), keyboard macros, Compuserve or BBS Message handling, Screen Capturing, and lots more. GTERM can be condensed so that your Mailing List Application can automatically dial a number contained in the data base. It can be expanded to become a popular Term program, even a BBS program! Page 23 GAP Communications CLACOM Functions - Quick Reference CkeyPress - Checks for a remote or local key press. ClrBuf - Clear the communications receive buffer. ComGetc - Gets a character from com port. ComGetd - Gets a character from com port with time-out. ComPutb - Sends a buffer of data to com port. ComPutc - Sends a character to com port. ComPuts - Sends a string to com port. CursorOff - Turns local cursor off. CursorOn - Turns local cursor on. DclrTx - Clear DigiBoard Transmit buffer. DgtTxfree - Get Free space in DigiBoard Transmit buffer. Dmodem - Change DigiBoard Port parameters. DownLoad - Download using Xmodem and Ymodem. Drestore - Reset DigiBoard Port. DsetUp - Initialize DigiBoard Port (Direct Interface). Dtr - Toggles the DTR line on or off. GetKeyc - Gets keyboard character and scan code. GetScrn - Update Clarion's screen buffer. GetZmodem - Download using Zmodem. Gputc - Sends a character to local screen. Gputs - Sends a string to local screen. InitAnsi - Initializes ANSI driver. InitPort - Sets up Communications Port (Std Interface). Int14Set - Initialize DigiBoard Port (Int14/EBIOS Intface). Iscd - Checks if there is a Carrier. ModemPuts - Send a string to the modem. ModemStat - Get Modem Status. PosCursor - Update ANSI Driver Cursor Position. ResetPort - Restores Communications Port (Std Interface). RestCbreak - Restores Ctrl-Break vector. Rts - Toggles RTS line on or off. Rxempty - Checks if any characters in receive buffer. SendBreak - Send a break signal to the modem. SendZmodem - Send files using Zmodem. SetPort - Initializes Communications port. SetCbreak - Initializes Ctrl-Break vector. StrHex - Translate Hex String to number. StrWord - Find substring in string. Timer - Time Delay. UpLoad - Send files using Xmodem and Ymodem. Page 24 GAP Communications CLACOM Functions - Detailed Reference Functions return a value, procedures do not return anything. Procedures cannot be used in assignment statements. They perform a service and do not report back as to the successful completion of that service. Functions also perform a service but they do report back on how well that service was performed. The return value from a function must be assigned to a variable of like type or used in a comparison statement (this is due to Clarion's strong type checking which will not allow you to call a function without checking its return value). The function descriptions will note whether or not a function is actually a Procedure (does not return a value) or a Function (does return a value). The Examples will use a string called "cstr" to let you know that the function requires a string in the C, NULL terminated, format (CSTRING in Clarion). Passing Clarion Strings to these functions will not work. You will need to assign the Clarion STRING to a CSTRING and then pass the variable in the function call. Page 25 GAP Communications CLACOM CkeyPress ----------------------------------------------------------------- Purpose Checks for a remote or local key press. CkeyPress() Type Function - Returns SHORT 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 wait for a key press, either from remote or local. Return Value 0 = no key is waiting, 1 = a key is waiting. Example c = CkeyPress() ! key pressed? loop while CkeyPress() = 0 ! do nothing end ! until a key is pressed Page 26 GAP Communications CLACOM ClrBuf ----------------------------------------------------------------- Purpose Clears the Communications receive buffer. ClrBuf() Type Procedure Description Empties the receive buffer such that any pending characters are simply ignored. Return Value None. Example ClrBuf() ! clear receive buffer Page 27 GAP Communications CLACOM ComGetc ----------------------------------------------------------------- Purpose Retrieve a character from communications buffer. ComGetc() Type Function - Returns SHORT Description Checks the communications receive buffer and returns the next character, if any. In order to distinguish between a legitimate character and a "no character" condition, this function returns a SHORT even though a legitimate character is a BYTE. If the function does not return a -1, the return value needs to be assigned to a variable of type BYTE if the character is to be passed to a function that requires a BYTE parameter (Gputc and ComPutc, for instance). Return Value Next character in buffer or -1 for no characters waiting. Example c = ComGetc() ! get a char from remote keychr BYTE retchr SHORT retchr = ComGetc() ! get a char from remote if retchr NOT= -1 ! anything there? keychr = retchr ! yes, truncate high byte Gputc(keychr) ! and display end Page 28 GAP Communications CLACOM ComGetd ----------------------------------------------------------------- Purpose Retrieve a character from communications buffer with delay. ComGetd(secs) SHORT secs Number of seconds to wait Type Function - Returns SHORT Description This function is the same as ComGetc, except that if there are no characters in the receive buffer, it will wait for the number of seconds you specify. Return Value Next character in buffer or -10 for time-out (no characters to read). Example do while ComGetd(2) = -10 ! wait 2 seconds end ! for a character Page 29 GAP Communications CLACOM ComPutb ----------------------------------------------------------------- Purpose Sends a buffer of data out the communications port. ComPutb(buffer, len) CSTRING buffer Buffer containing data SHORT len Number of bytes to send Type Procedure Description This function will send a user supplied buffer of len bytes out the communications port, one byte at a time. Return Value None. Example buffer CSTRING(200) ComPutb(buffer,100) ! Send 100 bytes of data Page 30 GAP Communications CLACOM ComPutc ----------------------------------------------------------------- Purpose Sends a single character out the communications port. ComPutc(ch) BYTE ch Character to send Type Procedure Description Will send a single character out the communications port. Return Value None. Example ComPutc(13) ! Send a Carriage Return keychr BYTE retchr SHORT retchr = GetKeyc ! Keyboard hit? if retchr NOT= -1 ! anything there? if retchr < 256 ! yes, if regular char keychr = retchr ! truncate high byte ComPutc(keychr) ! and send it to remote end end Page 31 GAP Communications CLACOM ComPuts ----------------------------------------------------------------- Purpose Sends a string of characters out the communications port. ComPuts(str) CSTRING str String to send Type Procedure Description Will send a string of characters out the communications port. Note that unlike ComPutb, the number of bytes to send is determined by the length of the string. Therefore this function stops sending characters when it encounters the NULL byte. Return Value None. Example cstr CSTRING(100) cstr = 'Send this String' ! string to send ComPuts(cstr) ! send string to com port Page 32 GAP Communications CLACOM CursorOff ----------------------------------------------------------------- Purpose Turns the local cursor off. CursorOff() Type Procedure Description This function is used to turn the cursor on the local monitor off. Return Value None. Example CursorOff() ! turn the cursor off CursorOn ----------------------------------------------------------------- Purpose Turns the local cursor on. CursorOn() Type Procedure Description This function is used to turn the cursor on the local monitor on. Return Value None. Example CursorOn() ! turn the cursor on Page 33 GAP Communications CLACOM DclrTx ----------------------------------------------------------------- Purpose Clears the Transmit Buffer on DigiBoard. DclrTx() Type Procedure Description When using a DigiBoard (Interface is set to DigiBoard or Int14/EBIOS), this function will clear the Transmit Buffer for the current port in use on the DigiBoard. Return Value None. Example DclrTx() ! clear xmit buffer Page 34 GAP Communications CLACOM DgtTxfree ----------------------------------------------------------------- Purpose Returns number of Free Bytes in Digi Transmit Buffer. DgtTxfree() Type Function - Returns USHORT Description When using a DigiBoard (Interface is set to DigiBoard or Int14/EBIOS), this function returns the number of free bytes in the Transmit Buffer for the current port in use on the DigiBoard. Return Value None. Example freebytes USHORT freebytes = DgtTxfree() ! get free space Page 35 GAP Communications CLACOM Dmodem ----------------------------------------------------------------- Purpose Initialize Digi port to baud, parity, data, and stop bits Dmodem(baud, parity, data, stop) LONG baud BPS rate SHORT parity 0 = None, 1 = Odd, 2 = Even SHORT data 6, 7, or 8 data bits SHORT stop 1 or 2 stop bits Type Procedure Description Changes the current port settings on a DigiBoard to the parity, data bits, stop bits, and baud rate. The port number is defined when initially setting up the port with a call to DsetUp or Int14Set. The port parameters are normally set when first initializing the DigiBoard port. This function allows you to change those parameters while "on- line". Return Value None. Example Dmodem(2400,2,7,1) ! E,7,1 - 2400 bps Page 36 GAP Communications CLACOM DownLoad ----------------------------------------------------------------- Purpose Receives one or more files. DownLoad(protocol,filename) SHORT protocol Number of protocol to use CSTRING filename Name of file to download Type Procedure Description This function allows you to receive a file from a remote computer. The protocols are defined as follows: 0 = ASCII 3 = 1K Xmodem-G 1 = Xmodem 4 = Ymodem 2 = 1K Xmodem 5 = Ymodem-G Filename is a CSTRING containing the name of the file to download. If the protocol is a batch protocol (Ymodem or Ymodem-G) then you may pass a NULL string (cstr = '') since the name of the file will be supplied by the remote sender. If a filename is passed, it will be ignored. Return Value None. Example cstr CSTRING(100) cstr = 'FILE.ZIP' ! receive a single file DownLoad(2,cstr) ! using 1K Xmodem _ cstr = '' ! receive 1 or more files DownLoad(4,cstr) ! using Ymodem Page 37 GAP Communications CLACOM Drestore ----------------------------------------------------------------- Purpose Reset Modem attached to a DigiBoard Port. Drestore() Type Procedure Description This function simply turns off the handshaking lines to the modem. It turns DTR and RTS off and disables Hardware Flow control. Should be used only when using the DigiBoard or Int14/EBIOS Interface. Return Value None. Example Drestore() ! Reset Modem Page 38 GAP Communications CLACOM DsetUp ----------------------------------------------------------------- Purpose Initialize Digi port to baud, parity, data, and stop bits. DsetUp(base, port, channel, baud, parity data, stop) USHORT base Memory Window USHORT port I/O Port SHORT channel Channel Number (port) LONG baud BPS rate SHORT parity 0 = None, 1 = Odd, 2 = Even SHORT data 6, 7, or 8 data bits SHORT stop 1 or 2 stop bits Type Function - Returns SHORT Description When using a Communications Interface set to DigiBoard, this function initializes the specified port (Channel) on the DigiBoard. The DigiBoard Interface is a direct link to the DigiBoard (a Device Driver is not needed). In order to use this interface, the end user must have already run the DigiBoard Reset program called RESETDIG.EXE. The base address is the high memory address the DigiBoard uses when communicating with the host computer. Valid base addresses are: C000 D000 C800 D800 The port is the I/O port the DigiBoard is attached to. Valid ports are: 100 220 110 300 120 320 200 Page 39 GAP Communications CLACOM The channel is the Communications Port to use on the DigiBoard. This should be 1 - 8. Note that base and port are USHORTS. Because it is difficult to gather input from an end user such that the result is a valid hexadecimal number, these two fields are generally stored as strings. You can use the function StrHex to convert a Hexadecimal String to an unsigned short. Return Value 0 = Successful. 1 = DigiBoard not Installed or RESETDIG.EXE not run. 2 = DigiBoard not Responding. 3 = Invalid Parameter passed. 4 = DigiBoard EPROM is too old. Example ! set up 1st port on DigiBoard (Channel = 1) ! DigiBoard Memory Address = D800 ! DigiBoard I/O Port = 320 digiseg USHORT digiport USHORT cstr CSTRING(12) cstr = 'D800' ! Base Address digiseg = StrHex(cstr) ! as a number cstr = '320' ! I/O Port digiport = StrHex(cstr) ! as a number if DsetUp(digiseg,digiport,1,38400,0,8,1) ShowError('Unable To Initialize DigiBoard') end Page 40 GAP Communications CLACOM Dtr ----------------------------------------------------------------- Purpose Toggle the DTR line on or off. Dtr(how) SHORT how 0 = Turn DTR off 1 = Turn DTR on Type Procedure Description This routine is used to turn the DTR line of the communications port on or off. Turning DTR off while there is a carrier will cause the modem to drop carrier. In order to send commands to the modem, DTR needs to be on. Return Value None. Example cstr CSTRING(10) cstr = 'ATZ' & '<13>' ! Modem Init String Dtr(1) ! turn DTR on,wake up modem ComPuts(cstr) ! reset the modem Page 41 GAP Communications CLACOM GetKeyc ----------------------------------------------------------------- Purpose Gets keyboard character and scan code. GetKeyc() Type Function - Returns SHORT Description This is the main keyboard input routine. It returns the keyboard character or if the key struck was an extended key, it will return a unique code. These codes are described in Appendix A. This function should be used when designing terminal emulation software, BBS software or any software where you well be checking the local keyboard and the Com Port for key presses. Clarion's ASK and KEYCODE functions cannot be used since Clarion re-maps extended keys and some control keys. Any character in the ASCII range of 0 to 255 is a valid character and can be sent out the Com Port, however Clarion re-maps some of these characters and does not return their true byte value. If the return value is greater than 255, then the key that was pressed is an Extended Key (i.e., F1, Up-Arrow, PgUp, Home, etc). The Extended Key corresponds to the Keyboard Scan codes with the value 256 added. Return Value ASCII code for the key pressed or a unique code for extended keys. Example retchr SHORT retchr = GetKeyc() ! get a keyboard char if retchr > 255 ! Extended Key case retchr ! which one of 278 ! Alt-U, Upload a File of 288 ! Alt-D, Download a File of 369 ! Alt-F10, activate Menu end end Page 42 GAP Communications CLACOM GetScrn ----------------------------------------------------------------- Purpose Copies Physical Screen to Clarion Screen Buffer. GetScrn() Type Procedure Description Clarion keeps a backup copy of the physical screen in a buffer. Whenever you send something to the screen by either opening a Window, a Menu, or what have you, Clarion performs two operations: it updates the physical screen and its screen buffer. The screen output routines in CLACOM (Gputc and Gputs) write directly to the physical screen memory. Clarion, therefore, doesn't know that the screen has been written to. When you open a Window or a Menu, Clarion will re-draw the screen with whatever happens to be in its Screen Buffer and then open your Window. What Clarion puts on the screen will not necessarily be what you see on your physical screen. Clarion only knows about what it wrote to the physical screen. It knows nothing about what an outside function might have put on the screen. If you are using the CLACOM routines to write to the screen and you need to open a Clarion Window, activate a Menu, or otherwise write to the local screen using a Clarion function, you need to call GetScrn before making your Clarion call. GetScrn will copy the contents of the Physical Screen to the Clarion Screen Buffer. This will prevent Clarion from overwriting the physical screen with data that no longer belongs there. Return Value None. Page 43 GAP Communications CLACOM Example keychr BYTE retchr SHORT retchr = GetKeyc() ! Keyboard hit? if retchr = -1 ! nothing there goto getrmt ! check remote end keychr = retchr ! strip high byte if set if retchr < 256 ! if not a scan code ComPutc(keychr) ! send to com port goto getrmt ! and check remote end ! Keyboard key was an Extended key. Check if special key ! First though, it is likely that we will be doing something ! that will use Clarion to write to the Screen (open Window, ! Menu, etc). If so, we have to read the physical screen and ! update Clarion's Screen Buffer. This is because Clarion ! doesn't know that our ANSI driver has been writing to the ! screen. If we don't do this, Clarion will erase whatever is ! on the screen right now. GetScrn() ! update Clarion Screen Buffer Page 44 GAP Communications CLACOM ! Note that we already know the key is an extended key so we ! are only checking the low byte of the key (same as ! subtracting 256 from the return value). case keychr ! get special keys of 22 ! Alt-U, Upload A File if online = 0 ! if no carrier, you can't upload ! This is one reason for GetScrn. Remove the call to ! GetScrn and watch what happens when following window ! is opened. Open(NotOnLine) ! Tell um can't upload bell() ! Make noise Beep(0,300) ! Wait 3 seconds Close(NotOnLine) ! Close Can't Upload Screen else ! otherwise, upload away UpFile end end Page 45 GAP Communications CLACOM GetZmodem ----------------------------------------------------------------- Purpose Receives 1 or more files using the Zmodem Protocol. GetZmodem() Type Procedure Description This function allows you to receive one or more files using Zmodem. The files will be placed in whatever directory the program happens to be in at the time of the call. You may want to use SETPATH to change into a work directory prior to the call. Return Value None. Example GetZmodem() ! Receive using Zmodem Page 46 GAP Communications CLACOM Gputc ----------------------------------------------------------------- Purpose Sends a single character to local screen. Gputc(ch) BYTE ch Character to send Type Procedure Description This is one of the main output routines. It is part of the ANSI driver. It will send a single character to the local screen. Return Value None. Example Gputc(12) ! Clear the Screen retchr SHORT keychr BYTE retchr = GetKeyc() ! Keyboard hit? if retchr NOT= -1 ! if something there keychr = retchr ! truncate high byte Gputc(keychr) ! and display it end Page 47 GAP Communications CLACOM Gputs ----------------------------------------------------------------- Purpose Sends a string of characters to local screen. Gputs(str) CSTRING str String to send Type Procedure Description This is one of the main output routines and is part of the ANSI driver. It will send a string of characters to the local screen. Return Value None. Example cstr CSTRING(100) cstr = 'This is a string of characters' Gputs(cstr) ! Display locally ComPuts(cstr) ! and to remote ! this example embeds the CR/LF pair at the beginning ! and end of the string cstr = '<13,10>' & 'This is a string of characters' & '<13,10>' Gputs(cstr) ! Display locally Page 48 GAP Communications CLACOM InitAnsi ----------------------------------------------------------------- Purpose Initialize ANSI driver. InitAnsi(row, col, color) BYTE row Number of Rows on Screen BYTE col Number of Columns on Screen BYTE color Default Color to use Type Procedure Description This function sets up the ANSI driver so that it knows the maximum number of Rows and Columns on the Screen and the default color to use when displaying characters. This function must be called prior to using the output routines Gputc and Gputs. Since the ANSI driver writes directly to Video Memory, it is imperative that this function be called so that it can set internal variables that tells it where the cursor is, the color attribute to use when displaying characters and the Segment address of Video Memory. You should call this function anytime the Screen is changed in size (i.e., from 25 to 43 line mode). The ANSI driver always protects the bottom row of the screen. In other words, it will not allow text to be written there using Gputc or Gputs. If you need to write to the bottom screen row, use the Clarion SHOW function. The color parameter is a standard IBM color code in the range of 0 to 255. The Color codes are described in the Clarion Language Reference Manual in the Video and Keyboard Chapter. Return Value None. Page 49 GAP Communications CLACOM Example MaxRows SHORT MaxCols SHORT MaxRows = ROWS() ! Get Max Number of Rows MaxCols = COLS() ! Get Max Number of Columns SetCursor(1,1) ! Cursor to top of screen InitAnsi(MaxRows,MaxCols,14) ! Initialize ANSI driver Page 50 GAP Communications CLACOM InitPort ----------------------------------------------------------------- Purpose Initialize port to baud, data, parity, and stop bits. InitPort(baud, parity, data, stop) LONG baud BPS rate SHORT parity 0 = None, 1 = Odd, 2 = Even SHORT data 6, 7, or 8 data bits SHORT stop 1 or 2 stop bits Type Function - Returns SHORT Description Sets the communications port to the parity, data bits, stop bits, and baud rate. The port number is defined when initially setting up the port with a call to SetPort. This function should only be used when the Communications Interface is set to Standard. Don't call when interfacing with a DigiBoard. Return Value 0 = Successful. 1 = Port Not Initialized. 2 = Invalid Parameter. Example if InitPort(38400,0,8,1) ! Initialize to N,8,1 - 38400 bps ShowError('Unable To Initialize Port') end Page 51 GAP Communications CLACOM Int14Set ----------------------------------------------------------------- Purpose Initialize Digi port to baud, parity, data, and stop bits. DsetUp(channel, baud, parity, data, stop) SHORT channel Channel Number (port) LONG baud BPS rate SHORT parity 0 = None, 1 = Odd, 2 = Even SHORT data 6, 7, or 8 data bits SHORT stop 1 or 2 stop bits Type Function - Returns SHORT Description When using a Communications Interface set to Int14/EBIOS, this function initializes the specified port (Channel) on the DigiBoard. This interface requires that the end user have the DigiBoard supplied Universal DOS Driver installed as a TSR. The channel is the Communications Port to use on the DigiBoard. This should be 4 - 11. Return Value 0 = Successful. 1 = Device Driver not installed or DigiBoard not installed. 2 = EBIOS not configured. 3 = Invalid Parameter passed. Example ! set up 1st port on DigiBoard (Channel = 4) if Int14Set(4,38400,0,8,1) ShowError('Unable To Initialize DigiBoard') end Page 52 GAP Communications CLACOM Iscd ----------------------------------------------------------------- Purpose Check for Carrier on the Communications Port. Iscd() Type Function - Returns SHORT Description This function allows you to test the communications port for a remote carrier signal. Return Value Returns 0 if there is no carrier and 1 if there is a carrier. Example if Iscd() ! is there a carrier? online = 1 show(MaxRows,MaxCols - 7,' OnLine') else online = 0 show(MaxRows,MaxCols - 7,'OffLine') end Page 53 GAP Communications CLACOM ModemPuts ----------------------------------------------------------------- Purpose Sends a Command String to a Modem. ModemPuts(str) CSTRING str String to send Type Procedure Description Will send a string of characters out the communications port. This function is generally used to send commands to a modem. It is identical to ComPuts except that it interprets and acts upon certain characters. The special characters are: ^M - Send a Carriage Return ~ - Tilde. Pause for 1/2 second Note that the special characters are not sent to the modem. Also note that in order for a modem to accept commands, the modem must be "offline" (not connected to a remote modem) and DTR must be set : Dtr(1). Return Value None. Example cstr CSTRING(100) cstr = 'ATZ^M~~' ! Modem Reset String ! The above string will send the Modem Reset String followed ! by a Carriage Return. It will wait 1 second after sending ! the string. ModemPuts(cstr) ! Send Modem Command Page 54 GAP Communications CLACOM ModemStat ----------------------------------------------------------------- Purpose Returns Status of the attached Modem. ModemStat() Type Function - Returns BYTE Description Returns the value of the Modem Status Register. Return Value None. Example modstat BYTE modstat = ModemStat ! get Modem Status if BAND(Modstat,080h) ! check for Carrier online = 1 ! got one, set flag else online = 0 ! no carrier, reset flag end Page 55 GAP Communications CLACOM PosCursor ----------------------------------------------------------------- Purpose Restore ANSI Driver Cursor Position. PosCursor() Type Procedure Description When opening a window and then closing it, Clarion does not put the cursor back where it was prior to opening the window. This doesn't cause any problems because the ANSI driver maintains its own internal cursor position. However, the screen will look a bit strange if the cursor is "hanging" in the middle of the screen when it should be on row 2, column 10. Return Value None. Example PosCursor() ! Put Cursor back where it was Page 56 GAP Communications CLACOM ResetPort ----------------------------------------------------------------- Purpose Restores the Communications port. ResetPort() Type Procedure Description This function must be called prior to exiting the program or anytime you are finished with the Com Port. It restores the interrupt vector used by the Standard Communications routines. It is imperative that when using the Standard Interface you call this function when you no longer wish to access the Serial Port. The Standard Interface sets up an interrupt vector for the port and if this vector is not restored prior to exiting your program, the computer will ultimately crash. This function should only be used when the Communications Interface is set to Standard. Don't call when interfacing with a DigiBoard. Return Value None. Example ResetPort() ! Restore communications port Page 57 GAP Communications CLACOM RestCbreak ----------------------------------------------------------------- Purpose Restores the Ctrl-Break vector. RestCbreak() Type Procedure Description This function must be called prior to exiting the program. It restores the interrupt vector used by the Ctrl-Break routine. If you set up a Ctrl-Break handler at the beginning of your program, you should call this function from a SHUTDOWN procedure. Setting up a SHUTDOWN procedure insures that the Ctrl-Break vector is restored prior to program termination. Return Value None. Example RestCbreak() ! restore Ctrl-Break vector Page 58 GAP Communications CLACOM Rts ----------------------------------------------------------------- Purpose Toggle the RTS line on or off. Rts(how) SHORT how 0 = Turn RTS off 1 = Turn RTS on Type Procedure Description This routine is used to turn the Request To Send line of the communications port on or off. Turning RTS off (providing the modem supports hardware handshaking) tells the modem to stop sending data to the computer. It is typically toggled off while writing a buffer of data to a disk. Return Value None. Example Rts(0) ! Turn RTS off Page 59 GAP Communications CLACOM Rxempty ----------------------------------------------------------------- Purpose To check if there are any characters in the receive buffer. Rxempty() Type Function - Returns SHORT Description This function checks the communications receive buffer to see if there are any characters waiting to be read. Return Value Returns 1 if buffer is empty, 0 if there are characters waiting to be read. Example while Rxempty() ! nothing happening end ! wait till something to read Page 60 GAP Communications CLACOM SendBreak ----------------------------------------------------------------- Purpose Sends a Break Signal to Modem. SendBreak() Type Procedure Description Will send a Break Signal to the Modem. This function is most often used with high speed modems that have their own transmit buffer and you wish to clear the buffer. These modems can be configured to empty their buffer upon receipt of a break signal. Note that some modems do not react too well to a break signal. Whether or not to send a break to the modem so that you can clear its transmit buffer should be a configuration option. Return Value None. Example SendBreak() ! Send a Break to Modem Page 61 GAP Communications CLACOM SendZmodem ----------------------------------------------------------------- Purpose Sends one or more files using Zmodem. SendZmodem(filename) CSTRING filename Name of file to upload Type Procedure Description This function allows you to send one or more files to a remote computer using the Zmodem Protocol. Filename is a CSTRING containing the name of the file to upload. It may contain a Wild Card Specification to send more than one file at a time. Return Value None. Example cstr CSTRING(100) cstr = 'FILE.ZIP' ! send a single file SendZmodem(cstr) cstr = '*.ZIP' ! send all the ZIP files SendZmodem(cstr) Page 62 GAP Communications CLACOM SetCbreak ----------------------------------------------------------------- Purpose Initializes the Ctrl-Break vector. SetCbreak() Type Procedure Description To trap Ctrl-C and Ctrl-Break, this function should be called to set up an interrupt service routine to trap these two keys. It is imperative that the program not exit before calling RestCbreak so that the interrupt vector can be restored. When using the Standard Communications Interface, a Ctrl-Break vector must be installed to prevent a user from breaking out of your program before you've had a chance to restore the Communications Interrupt vector. Return Value None. Example SetCbreak() ! set up Ctrl-Break ISR Page 63 GAP Communications CLACOM SetPort ----------------------------------------------------------------- Purpose Initialize the Communications Port. SetPort(irq, base, port) SHORT irq Port IRQ to use SHORT base Port Base Address to use SHORT port Com Port Number Type Function - Returns SHORT Description This is the port initialization routine that must be called when using the Standard Interface. It must be called prior to any port I/O calls. IRQ is the Interrupt Request number to use for the port. Base Address is the address where the port is located. Port is the COM port number, where COM1 = 0, COM2 = 1, COM3 = 2, and COM4 = 3. For COM 1 and COM 2, you may simply pass 0 as the IRQ and Base address since the defaults for these ports will be used. Note that the Communications Routines always use hardware handshaking. This means that if CTS is not active, the output routines will not be able to send a character out the serial port. CTS is normally controlled by a Modem, however when not using a modem, the serial cable must be wired so that CTS on one end of the connection is tied to RTS on the other end. See Appendix B for a diagram of a NULL Modem cable. Return Value 0 = successful. 1 = No UART found at Port Address. 2 = Clear To Send (CTS) is not active. Example ! Set Up Port on COM1 if SetPort(0,0,0) ShowError('Unable To Initialize Port') end Page 64 GAP Communications CLACOM StrHex ----------------------------------------------------------------- Purpose Converts a Hexadecimal string to an Unsigned Short. StrHex(hexstring) CSTRING hexstring String containing Hex digits Type Function - Returns USHORT Description This function will convert a string containing hexadecimal digits and return the value of that string as an unsigned short. It is most often used to convert Memory Addresses stored as a string to a number that can be utilized by the port initialization routines. Return Value 0 if string could not be converted, number if it could. Example cstr CSTRING(100) hexnum USHORT cstr = 'D800' ! Base Address hexnum = StrHex(cstr) ! as a number Page 65 GAP Communications CLACOM StrWord ----------------------------------------------------------------- Purpose Check if one string contains another string. StrWord(srcstring, substring) CSTRING srcstring String to search CSTRING substring String to search for Type Function - Returns SHORT Description Clarion's INSTRING function doesn't work very well with C strings (in fact, it doesn't work at all). The terminating NULL seems to be included as part of the search value. StrWord will search for a string to see if it is contained within another string. Both strings must be of type CSTRING. If the larger string contains the smaller string, the position in the larger string where the smaller string begins will be returned. Note that the strings are compared without regard to case. Return Value 0 if substring not found, otherwise position in source string where the substring starts. Example srcstring CSTRING(100) substring CSTRING(10) scrstring = 'This is a string' substring = 'string' if StrWord(srcstring,substring) ! srcstring contains substring else ! substring not found end Page 66 GAP Communications CLACOM Timer ----------------------------------------------------------------- Purpose Pauses for the number of "ticks" specified. Timer(ticks) SHORT ticks Number of timer ticks to pause Type Procedure Description This function allows you to pause all processing for the specified number of ticks. It is in- sensitive to processor speed. The function simply delays the number of "ticks" indicated by the passed parameter. Each tick is 1/18 of a second (or 55 milliseconds). Return Value None. Example Timer(18) ! pause for 1 second Page 67 GAP Communications CLACOM UpLoad ----------------------------------------------------------------- Purpose Sends one or more files. UpLoad(protocol,filename) SHORT protocol Number of protocol to use CSTRING filename Name of file to upload Type Procedure Description This function allows you to send a file to a remote computer. The protocols are defined as follows: 0 = ASCII 3 = 1K Xmodem-G 1 = Xmodem 4 = Ymodem 2 = 1K Xmodem 5 = Ymodem-G Filename is a CSTRING containing the name of the file to upload. If the protocol is a batch protocol (Ymodem or Ymodem-G) then you may pass a Wild Card Specification to send more than one file at a time. Return Value None. Example cstr CSTRING(100) cstr = 'FILE.ZIP' ! send a single file UpLoad(2,cstr) ! using 1K Xmodem cstr = '*.ZIP' ! send all the ZIP files UpLoad(4,cstr) ! using Ymodem Page 68 GAP Communications CLACOM Appendix A GetKeyc obtains keyboard input by making calls to the Computer BIOS. The BIOS translates keyboard scan codes into unique codes. Any code returned by GetKeyc that is less than or equal to 127 is a regular ASCII character. Codes in the range of 128 to 255 are IBM enhanced ASCII characters. These codes are returned "as is" (no translations are performed upon them). Key Codes greater than 255 present a problem. These are extended keys and include the function keys, cursor keys, and the Ctrl and Alt key combinations. The BIOS returns the scan code of these keys. The problem is that the scan code can lie in the range of ASCII characters (0 through 255). In order to distinguish between a displayable ASCII character and an extended key (F1, Home, PgDn, Alt-Equal, etc), GetKeyc adds 256 to the key code returned by the BIOS. The following tables show the extended key codes as well as Control Key combinations (which are used extensively in communications). Page 69 GAP Communications CLACOM Control Keys and Extended Keys in Numerical Order: Ctrl-A 1 Alt-S 287 Shift-F9 348 Ctrl-B 2 Alt-D 288 Shift-F10 349 Ctrl-C 3 Alt-F 289 Ctrl-F1 350 Ctrl-D 4 Alt-G 290 Ctrl-F2 351 Ctrl-E 5 Alt-H 291 Ctrl-F3 352 Ctrl-F 6 Alt-J 292 Ctrl-F4 353 Ctrl-G 7 Alt-K 293 Ctrl-F5 354 Backspace 8 Alt-L 294 Ctrl-F6 355 Ctrl-H 8 Alt-Z 300 Ctrl-F7 356 Ctrl-I 9 Alt-X 301 Ctrl-F8 357 Tab 9 Alt-C 302 Ctrl-F9 358 Ctrl-J 10 Alt-V 303 Ctrl-F10 359 LineFeed 10 Alt-B 304 Alt-F1 360 Ctrl-K 11 Alt-N 305 Alt-F2 361 Ctrl-L 12 Alt-M 306 Alt-F3 362 Ctrl-M 13 F1 315 Alt-F4 363 Enter 13 F2 316 Alt-F5 364 Ctrl-N 14 F3 317 Alt-F6 365 Ctrl-O 15 F4 318 Alt-F7 366 Ctrl-P 16 F5 319 Alt-F8 367 Ctrl-Q 17 F6 320 Alt-F9 368 Ctrl-R 18 F7 321 Alt-F10 369 Ctrl-S 19 F8 322 Ctrl-PrintScreen 370 Ctrl-T 20 F9 323 Ctrl-CursorLeft 371 Ctrl-U 21 F10 324 Ctrl-CursorRight 372 Ctrl-V 22 Home 327 Ctrl-End 373 Ctrl-W 23 CursorUp 328 Ctrl-PgDn 374 Ctrl-X 24 PgUp 329 Ctrl-Home 375 Ctrl-Y 25 CursorLeft 331 Alt-1 376 Ctrl-Z 26 CursorRight 333 Alt-2 377 Escape 27 End 335 Alt-3 378 BackTab 271 CursorDown 336 Alt-4 379 Alt-Q 272 PgDn 337 Alt-5 380 Alt-W 273 Insert 338 Alt-6 381 Alt-E 274 Delete 339 Alt-7 382 Alt-R 275 Shift-F1 340 Alt-8 383 Alt-T 276 Shift-F2 341 Alt-9 384 Alt-Y 277 Shift-F3 342 Alt-0 385 Alt-U 278 Shift-F4 343 Alt-Hyphen 386 Alt-I 279 Shift-F5 344 Alt-Equal 387 Alt-O 280 Shift-F6 345 Ctrl-PgUp 388 Alt-P 281 Shift-F7 346 Alt-A 286 Shift-F8 347 Page 70 GAP Communications CLACOM Control Keys and Extended Keys in Alphabetical Order: Alt-0 385 Alt-V 303 Ctrl-T 20 Alt-1 376 Alt-W 273 Ctrl-U 21 Alt-2 377 Alt-X 301 Ctrl-V 22 Alt-3 378 Alt-Y 277 Ctrl-W 23 Alt-4 379 Alt-Z 300 Ctrl-X 24 Alt-5 380 Backspace 8 Ctrl-Y 25 Alt-6 381 BackTab 271 Ctrl-Z 26 Alt-7 382 Ctrl-A 1 CursorDown 336 Alt-8 383 Ctrl-B 2 CursorLeft 331 Alt-9 384 Ctrl-C 3 CursorRight 333 Alt-A 286 Ctrl-CLeft 371 CursorUp 328 Alt-B 304 Ctrl-CRight 372 Delete 339 Alt-C 302 Ctrl-D 4 End 335 Alt-D 288 Ctrl-E 5 Enter 13 Alt-E 274 Ctrl-End 373 Escape 27 Alt-Equal 387 Ctrl-F 6 F1 315 Alt-F 289 Ctrl-F1 350 F10 324 Alt-F1 360 Ctrl-F10 359 F2 316 Alt-F10 369 Ctrl-F2 351 F3 317 Alt-F2 361 Ctrl-F3 352 F4 318 Alt-F3 362 Ctrl-F4 353 F5 319 Alt-F4 363 Ctrl-F5 354 F6 320 Alt-F5 364 Ctrl-F6 355 F7 321 Alt-F6 365 Ctrl-F7 356 F8 322 Alt-F7 366 Ctrl-F8 357 F9 323 Alt-F8 367 Ctrl-F9 358 Home 327 Alt-F9 368 Ctrl-G 7 Insert 338 Alt-G 290 Ctrl-H 8 LineFeed 10 Alt-H 291 Ctrl-Home 375 PgDn 337 Alt-Hyphen 386 Ctrl-I 9 PgUp 329 Alt-I 279 Ctrl-J 10 Shift-F1 340 Alt-J 292 Ctrl-K 11 Shift-F10 349 Alt-K 293 Ctrl-L 12 Shift-F2 341 Alt-L 294 Ctrl-M 13 Shift-F3 342 Alt-M 306 Ctrl-N 14 Shift-F4 343 Alt-N 305 Ctrl-O 15 Shift-F5 344 Alt-O 280 Ctrl-P 16 Shift-F6 345 Alt-P 281 Ctrl-PgDn 374 Shift-F7 346 Alt-Q 272 Ctrl-PgUp 388 Shift-F8 347 Alt-R 275 Ctrl-PrtScr 370 Shift-F9 348 Alt-S 287 Ctrl-Q 17 Tab 9 Alt-T 276 Ctrl-R 18 Alt-U 278 Ctrl-S 19 Page 71 GAP Communications CLACOM Appendix B Most of the Null Modem connectors and cables that are commercially available are wired incorrectly. Sounds unbelievable, but true. They are wired using yesterday's technology. Modern day modems are intelligent devices. They are capable of telling the Host Computer when to stop sending data and are able to determine when the computer needs to have data sent to it temporarily suspended. This concept is known as Hardware Flow Control (CTS/RTS checking). CLACOM was written with Hardware Flow Control in mind. No characters will be sent to the communications port if the port is unable to accept new characters. This prevents loss of data and insures a reliable connection. Most NULL Modems are wired with the CTS/RTS lines either always off or always on. If you are hardwiring computers together via a NULL Modem, you will probably have to change some of the wiring on the connectors. You can either make your own NULL Modem or purchase one. If you purchase one, be sure that you can remove the connector shields to gain access to the wiring. The following diagram shows a properly wired NULL Modem: SCREEN NOT AVAILABLE IN TEXT BASED DOCUMENTATION SEE PRINTED MANUAL Page 72 GAP Communications CLACOM Index Ansi driver 5, 19, 20, 22, 24, 44, 47, 48, 56 Initializing 14, 24, 49 ASK 42 Base Address 10, 64 Baud Rate 5, 36, 39, 51, 52, 64 Channel 10, 11, 39, 40, 52 Characters Sending to com port 17, 24, 31 Sending to local screen 17, 24, 47 CkeyPress 24, 26 Clarion ASK 42 Color 49 CSTRING 25, 32, 37, 40, 41, 48, 54, 62, 65, 66, 68 Cursor 56 INSTRING 66 KEYCODE 12, 42 Overlays 8 ROVERLAY.EXP 8 Screen 56 Screen Buffer 20, 43 SHOW 49 Strings 66 TYPE 22 Type Checking 25 ClrBuf 24, 27 Color 49 ComGetc 19, 24, 28 ComGetd 24, 29 Communications Base address 14, 64 Baud rates 5, 14, 64 Carrier 53 DigiBoard 9, 14, 51, 57 FIFO buffers 5, 14 Initializing 14, 36, 39, 51, 52, 64 Input 28, 29, 60 Interface 9, 51, 57 Interrupt 8, 14, 57 IRQ 64 Output 30, 31, 32, 54 Port 9, 64 ComPutb 24, 30 Page 73 GAP Communications CLACOM ComPutc 20, 24, 31 Computs 20, 24, 32 CSTRING 25, 32, 37, 40, 41, 48, 54, 62, 65, 66, 68 Ctrl-Break handler 8, 58, 63 CTS 64 Cursor 24, 33, 56 CursorOff 24, 33 CursorOn 24, 33 DclrTx 24, 34 Delaying 67 DgtTxfree 24, 35 DigiBoard 9, 51, 57 Channel 10, 11, 39, 40, 52 Initializing Port 14, 36, 39, 52 Resetting Modem 38 Transmit Buffer 34 Free Space 35 Distribution files 6 Dmodem 24, 36 DownLoad 24, 37 Downloading Files 11, 37, 46 Drestore 24, 38 DsetUp 14, 24, 36, 39 Dtr 24, 41 Files Downloading 11, 37, 46 Uploading 11, 62, 68 Functions CkeyPress 26 ClrBuf 27 ComGetc 19, 28 ComGetd 29 ComPutb 30 ComPutc 20, 31 ComPuts 20, 32 CursorOff 33 CursorOn 33 DclrTx 34 DgtTxfree 35 Dmodem 36 DownLoad 37 Drestore 38 DsetUp 14, 36, 39 Dtr 41 GetKeyc 12, 42, 69 GetScrn 43 GetZmodem 46 Gputc 19, 43, 47, 49 Page 74 GAP Communications CLACOM Gputs 19, 43, 48, 49 InitAnsi 14, 49 InitPort 14, 51 INSTRING 66 Int14Set 14, 36, 52 Iscd 53 ModemPuts 54 ModemStat 55 PosCursor 56 ResetPort 57 RestCbreak 58 Rts 59 Rxempty 60 SendBreak 61 SendZmodem 62 SetCbreak 63 SETPATH 46 SetPort 14, 51, 64 SHOW 49 SHUTDOWN 58 StrHex 40, 65 StrWord 66 Timer 67 UpLoad 68 GetKeyc 12, 24, 42, 69 GetScrn 24, 43 GetZmodem 24, 46 Gputc 19, 24, 43, 47, 49 Gputs 19, 24, 43, 48, 49 Hardware Handshaking 64 InitAnsi 14, 24, 49 Initializing ANSI driver 49 Interrupt handlers 64 InitPort 14, 24, 51 Input From com port 17, 24, 28, 29, 60 From local & remote 17, 26 From local keyboard 12, 17, 24, 42, 69 INSTRING 66 Int14Set 14, 24, 36, 52 Interrupt handlers Communications 8, 14, 57 Ctrl-Break 8, 58, 63 IRQ 10, 64 Iscd 24, 53 Keyboard 12, 17, 26, 42, 69 Clarion Key Codes 12, 42 Page 75 GAP Communications CLACOM KEYCODE 12, 42 Modem 38, 41, 51, 72 Sending strings to 54 ModemPuts 24, 54 ModemStat 24, 55 NULL Modem 64, 72 Output To com port 17, 24, 30, 31, 32 To local screen 17, 24, 47, 48 To modem 54 Overlays 8 Pausing 67 Port 9, 14, 34, 35, 36, 38, 39, 41, 51, 64 PosCursor 24, 56 Program Crashing 8 Protocols 5, 11, 21, 23, 37, 46, 68 External 21, 23 Receive buffer 24, 26, 27, 28, 29, 60, 64 RESETDIG.EXE 9, 11, 39, 40 ResetPort 24, 57 RestCbreak 24, 58 ROVERLAY.EXP 8 Rts 24, 59, 64 Rxempty 24, 60 Scan codes 42 Screen 24, 43, 47, 48, 49, 56 Clearing 47 Color 49 Columns 49 Cursor 33 Output 17 Rows 49 Screen Buffer 20, 43 SendBreak 24, 61 SendZmodem 24, 62 SetCbreak 24, 63 SETPATH 46 SetPort 14, 24, 51, 64 SHOW 49 SHUTDOWN 58 Standard Interface 9, 14, 51, 57, 64 StrHex 24, 40, 65 Strings 66 Hexadecimal 40 INSTRING 66 Sending to com port 24, 32, 54 Sending to local screen 24, 48 Page 76 GAP Communications CLACOM Sub string 66 StrWord 24, 66 Timer 24, 67 Transmit Buffer 24, 34 Free Space 35 TYPE 22 UpLoad 24, 68 Uploading Files 11, 62, 68 Video Memory 43 Xmodem 5, 11, 24, 37, 68 Ymodem 5, 11, 24, 37, 68 Zmodem 5, 11, 46, 62 Page 77