************************************************** * * * S F G R * * ------- * * * * SCREEN FORMAT GENERATOR PROGRAM * * FOR CP/M-80 * * * * VERSION 1.00 * * * * Copyright (c) 1986 Harris Landsberg * * * * Harris Landsberg * * 1350 East 5th Street * * Suite 1-J * * Brooklyn, New York 11230 * * * * 1-718-951-7075 * * * ************************************************** COPYRIGHT ========= No part of this documentation, software system, source code or technical information used in this system may be sold, either stand alone or as part of another package, without the written permission of the author. Object produced through the program source code written by the user may be distributed as the writer pleases, but the author requests a copy as a thankful gesture for program use. It is presently intended that software may be shared freely, but the author requests a modest donation of $10.00 if you find it useful in any way. Those who make a contribution will be entitled to support and software updates if any should arise. The author reserves the right to later repackage this software system for sale with other software. Any alterations made to the software, source code or documentation should be sent to the author for final approval. This is done to keep the integrity and quality of the software at the standard the author deems fit. LIMITED WARRANTY ================ The author warrants this product to run under CP/M 2.2 on an Epson QX-10/16 with Televideo 920 terminal emulation. Every attempt will be made to isolate terminal specific instruction, and provide either an installation program or patch instructions. See applicable documentation and technical information for further reference. No other warranties are expressed or implied including warranties of merchantibility, fitness for a particular purpose. Nothing in this statement shall be construed as a written statement guarantee. You have specific legal rights, but that is only if you make the requested contribution of $10.00. All rights reserved. Table of Contents Page 1. Introduction . . . . . . . . . . . . . . . . . . . . . 3 2. Screen Specifications. . . . . . . . . . . . . . . . . 4 3. Display Specifications . . . . . . . . . . . . . . . . 6 4. Running SFGR from CP/M-80. . . . . . . . . . . . . . . 11 5. Error Messages . . . . . . . . . . . . . . . . . . . . 12 6. Technical Information. . . . . . . . . . . . . . . . . 14 7. The User Support Concept . . . . . . . . . . . . . . . 16 8. Registration Form. . . . . . . . . . . . . . . . . . . 17 2 Introduction ------------ The SFGR Compiler is intended to process user-generated screen format specifications and produce a display screen format object file that can be loaded at run-time by a program. SFGR is a utlity on the IBM System 34/36 mini-computer systems and used primarily with the RPG language. It is also interfaced with Cobol and Basic on those systems running under SSP, System Support Program. This version is intended to run under CP/M-80 version 2.2 or higher. It can be interfaced with any language to drive the screen displays, user response, and input/output. This implimentaion is System 34/36 compatible, with all examples provided tested under the System 36 environment. Some restriction apply and not all attributes have been implimented. This document will point out such discrepencies where it is deemed appropiate. In addition to generating a screen object format, SFGR can generate a listing, either to the screen, printer or file, listing the source specifications and diagnostic or informational messages for use with implimenting the screen format. These are: a) Output buffer description. b) Input buffer description. c) Indicators used. A utility program is provided called FVIEW that will page through a screen format file and display output constants with output variable as "*". The proper syntax is FVIEW [d:]filename, with file-extension assumed as ".FMT". 3 Screen Specifications ---------------------- The first record in a display format specification is a screen format specification statement. This control statement provides the necessary information to the support program that is relavent to the entire display screen. It sets up where the display screen will start and for how may lines should be cleared prior to its display. Also it identifies the allowable command key response allowed by the user, and the name to call this format screen. The following are the valid screen specification fields that are implimented and their meaning. Sequence Number (Columns 1-5) Columns 1 through 5 may contain record sequence information. It is ignored by the SFGR Compiler, but is listed when listing has been requested. This field is not required. Form Type (Column 6) Column 6 must contain the character "S" to identify that this is a screen specification. This is required field. Format Name (Coumns 7-14) This entry gives a unique name to the screen format that is being defined. Duplicate names in the same source program are invalid and will be flagged by the SFGR Compiler. The first character must not be blank, and blanks cannot be embedded within the name. The format name can be a combination of any character except "," (comma) and "'" (quote). The format name must be 8 characters or less. If there is an "*" in column 7 then that record is considered a comment. Start Line Number (Columns 17-18) The start line number where the display will begin. The actual start line number on which a field begins is calcuated through the following equation: Actual Line # = Start Line # + Display Row # -1 Entried allowed for start line number: Blank Line 1 of the display screen is assumed as start. 1-24 Specifies the line where the display is to begin. V Variable start line defined by within program. Lines to Clear (Columns 19-20) Specifies the number of lines to clear prior to displaying the screen format. Valid entries are between 0 and 24, with blank assumed as entire screen (24 lines) 4 Lowercase (Column 21) Specifies whether all alphabetic characters will be displayed and sent to the user program in lowercase or uppercase. Allowable entries are N (or blank) for all alphabetic characters are uppercase, and Y for alphabetic letters can be sent in lowercase. Sound Alarm (Columns 25-26) Allow the bell to sound prior to screen display. Valid entries are N (or blank) for the bell not to sound and Y for the bell cast its lovely sound. Also allowed are indicators (an internal switch that can be turned on or off by the user program) 01 through 99. If a valid indicator is on, the the bell will sound. Enable Function Keys (Column 28) Allow operator to use command keys to control program operation. You use enable function keys to allow command keys to be allowed. If functions are not enabled then all function keys are disabled. The specific command keys to be enabled are defined in the key mask. Valid entries for enable function keys: Blank All command keys are disabled. Key mask is ignored. Y Command keys identified in key mask are enabled. N Same as blank. R Retain previous mask. Not implimented. Key Mask (Columns 64-79) The key mask is a string of letters that identify the command keys that are enabled for this screen. The key mask must begin in column 64 and cannot contain embedded blanks. Letters may be put in any order, though alphabetically would be easier to read. This SFGR Compiler has only implimented 10 command keys. A command key is the ESC character followed by a number from 1 through 10. On System 34/36 machines there are 24 allowable indicators. An implimentation of SFGR in MS-DOS by Lattice impliments only 10. This version impliments only 10, because in most applications written on System 34/36 only use the first 10 indicators. The alphabetic letters A through J correspond to command keys 1 through 10, respectively. Note: No provision has been made to impliment blink cursor function, return input, erase input fields and function keys. These were either deemed inappropriate for CP/M-80 or lack of use by users of the System 34/36 environment. 5 Display Specifications ---------------------- The records that follow the screen specification are known as the display specifications. They define a field on the display, and each field must have its own record. A field can be either constant output or variable input/output depending on how it is defined. Sequence Number (Columns 1-5) Columns 1 through 5 may contain record sequence information. It is ignored by the SFGR Compiler, but is listed when listing has been requested. This field is not required. Form Type (Column 6) Column 6 must contain the character "D" to identify that this is a display specification. This is required field. Field Name (Columns 7-14) This entry specifies the name of the field being defined and can have a maximum of 8 characters. It is used for reference only and not included in the screen object format. There need not be any match between the name given and the actual name used in your program, but it is suggested, for debugging purposes, that they are identical. An asterisk in column 7 identified this record as comment record, except when this is a continuation record. If the previous record is an output constant and requires a continuation, and has the letter "X" in column 80, then the continuation line starts in column 7. Field Length (Column 15-18) Specifies the length of the field. The field number may be any number from 1 to 1840. The value must be right-justified with leading zeros allowed, but not required. This implimentation limits the length for output variables to 250 positions. For input fields the maximum is 80 and cannot cross screen line boundries. For output constant the maximum is 96 characters, with only one continuation line allowed per field. This is sufficient for most applications. Also a maximum of 250 variable input fields are allowed per screen format. Line Number (Column 19-20) Specifies the number of the line relative to the start line as defined in the screen specification statement. The actual calculation was given by the start line definition. The actual line number cannot exceed the maximum lines for the entire screen. The value must be right-justified with leading zeros allowed, but not required. 6 Column Position (Column 21-22) Specifies the column number of the first position in the field. Valid numbers are between 1 through 80. It must be right-justified with leading zeros allowed, but not required. Output Data (Columns 23-24) If a "Y" is specified in column 23 and a "C" appears in column 56 then the data specified in columns 57 through 79, and continuation line if it applies, is displayed. If a "C" does not appear in column 56 then the data to be displayed is taken from the output buffer. If a "N" is specified in column 23 then no output is performed for this specification statement. If an indicator (from 01 through 99) is specified, then when that indicator is set on, then information from the output buffer is displayed. If the indicator has not been set on, then the data within the buffer for the field length of position is not displayed but the buffer pointer is advanced. If an output field is also defined as an input field, then the data is moved into the input buffer and displayed and can be changed by the program user. Input Allowed (Column 26) This allowes whether this field is an input field. The allowable type of data is defined in the data type entry. Valid entries are "Y" or "N". The input buffer is allocated only for "Y" entries. Data Type (Column 27) This entry defines the type of data that can be entered for an input field. This SFGR Compiler limits it to the following: B (or blank) Can contain any valid typing character. N Numeric data only. (0-9,.,-) All other types are not implimented and will be flagged by the SFGR Compiler. We hope in the future to impliment more data types if there is a request for them. Here is a quick list of extra data types available on a System 36: A - alphabetic only. S - signed numerical data. R - data from magnetic tape reader. Z - cursor moves from right to left. D - decimal data. K - Katakana characters. E - mixture of different characters. Adjust Fill (Column 31) If Z is specified then information entered into this field will be right-justified and unused positions will be filled with zeros before exiting field. If B is specified then information entered into this field will be right-justified and unused positions will be filled with blanks before exiting field. A field exit key must be pressed to exit the field for it to take affect. 7 Position Cursor (Columns 32-33) This field is used to explicitly position the cursor. Usually the cursor is positioned at the first input field defined after the screen specifications, but with this entry you can change all that. If there is more than one position cursor enabled at time of display, then the cursor is positioned at the first field that has enable indicator. If a "Y" is specified in column 32, the cursor appears will start at this filed, unless other fields have prior have cursor positioning enabled. A "N" (or blank), the cursor is not positioned in this field, unless it is the first input field defined after the "S" specification and no other fields have cursor positioning enabled. If an indicator (from 01 through 99) is specified, then when that indicator is set on, then the cursor will be positioned unless a prior field has cursor positioning enabled. If the indicator has not been set on, then the cursor won't be positioned unless this is the first input field specified for that screen format. Controlled Field Exit (Column 35) If you specify "Y" for this field, then a field exit key must be pressed to exit field. A "+" will be used for delete-to-end-of-field and justifying. TAB will be used for simple exit of field. The regular cursor keys will not be allowed, and once you come to the end of this field, the cursor will not advance to the next field. A "N" (or blank) means a field exit can be used (should be used when you want to justify input, especially numeric data) but is not required. Also, the cursor will advance to next field when the position of the previous field has been entered. Auto Record Advance (Column 36) If you specify "Y" for this field, the entire screen of input will be returned when the operator has either: a) completed the last position of the field that does not require a field exit. b) has pressed the "+" key as field exit whether field requires field exit or not. A "N" (or blank) means after entering field the cursor will then go to next field. Normally, a program requires the ENTER key key to be depressed for input data to be returned to a program. With auto advance enabled the screen will be returned without the need for the ENTER key. Note: you can bypass field with TAB to exit field and not return input to program. The cursor keys can be used too if the field is not control field exit enabled. Protect field (Column 37-38) If you specify "Y" in column 37, this field will be bypassed whenever input is requested. If "N" (or blank) then normal processing will take place for this field, meaning input allowed. If an indicator (from 01 through 99) is specified, then when that indicator is set on, then the cursor bypass this field for input. If the indicator has not been set on, then the field will not be bypassed when input is requsted for display format. 8 High Intensity (Columns 39-40) If you specify "Y" in column 39, this field will be displayed in high intensity. If "N" (or blank) then this field will be displayed with normal intensity. If an indicator (from 01 through 99) is specified, then when that indicator is set on, then the field will be displayed in high intensity. Otherwise, if the indicator has not been set, then the field will be displayed in normal intensity. Blink Field (Columns 41-42) If you specify "Y" in column 41, this field will be displayed with blink attributes. If "N" (or blank) the field will be displayed in normal non-blink attributes. When an indicator (from 01 through 99) is specified, then when that indicator is set on, then the field will be displayed blinking. Otherwise, if the indicator has not been set, then the field will not be blinking. Nondisplay Field (Columns 43-44) If you specify "Y" in column 43, this field will not be displayed on the screen. If an input field, characters will not echo. If "N" or blank the field will be displayed in normal non-blink attributes. When an indicator (from 01 through 99) is specified, then when that indicator is set on, then the field will be displayed blinking. Otherwise, if the indicator has not been set, then the field will not be blinking. A note on mixing screen attributes: If nondisplay is specified together with high intensity, reverse image, or underline, then the field will be assumed as nondisplay. Reverse Image (Colum 45-46) If you specify "Y" in column 45, this field will be displayed in reverse image. If "N" (or blank) the field will be displayed in normal attributes. When an indicator (from 01 through 99) is specified, then when that indicator is set on, then the field will be displayed in reverse image. Otherwise, if the indicator has not been set, then the field will not be in reverse image. Underline (Columns 47-48) If you specify "Y" in column 47, this field will be displayed with the underline atttribute. If "N" (or blank) then this field will be displayed without underline. When an indicator (from 01 through 99) is specified, then when that indicator is set on, then the field will be underlined. Otherwise, if the indicator has not been set, then the field will not be without an underline. Column Separator (Column 49) Most computers cannot display column separators, so an underline is usually substituted. If "Y" is specified then the column separator attribute is used. If "N" (or blank) then it is not used. 9 Constant Type (Column 56) This field specifies whether constant information is output or data is to be taken from the output buffer. If "C" is specified, then constant data is assumed. An indicator cannot be used for output data field if constant data is used. (Nondisplay field should be used if you do not want to display on an indicator.) If column 56 is blank, the display record is an output variable, even if constant data is specified in columns 57 through 79. This last statement makes this SFGR not entirely in conformity with SFGR on the System 34/36. In most situations, you specify a "C" for constant data even if columns 57-79 are not blank. Constant Data (Columns 57-79) This specifies the data constant that is to be displayed in an output or input/output field. This is the actual constant data and if longer than 23 characters it is continued on the next record starting in column 7 and continues until column 79 of that record. If the field consists of all blanks, then all blanks should be typed in, especially when a continuation record is needed. Continuation (Column 80) If more than 23 characters of constant data is needed, an "X" is placed in column 80 to indicate that the record is continued. Only one continuation record per field is allowed in this version. Positions 7 through 79 of the next record contain the continuation data. And to be compatible with System 4/36 SFGR, comments should not follow a record with an "X" in column 80. General Note: Unused columns within a record should be left blank, but will not be flagged by this SFGR Compiler. Also, try to limit all types of lines to 80 characters. (132 character lines can be used safely, but is not recommended.) For all comments, please use an "*" in column 7 for any record type except a continuation record. The SFGR Compiler ignores such lines. Also, put comments after the screen specification that are relevant to the screen format. 10 Running SFGR from CP/M-80 ------------------------- Running the SFGR from command line is easy. All that is needed is compiler (SFGR.COM) and error message file (SFGR.ERR). If the error message file is not on the current disk, then errors will be flagged without a display message. No space is saved in not having the error message file. There are three options that can be used for listing the source member. The listing includes the source with error flagging at the line, output buffer description, input buffer description, and the indicators used. The switches are: no switch no listing except for error to console. /S listing to screen with everything. /P same as above, but to the printer. /F listing to file with ".LST" extension. The file extension of a screen format source is ".SCR". The SFGR Compiler requires this extension and cannot be changed. The output format object file has a ".FMT" extension. The temporary file has the standard ".$$$" extension, and will be renamed ".FMT" if no errors are found in the source member. If an unsuccessful compile occured, the previous format object file is not deleted or changed in any way. This is nice when you blunder something so bad, and forgot to make a backup of the original source. Input source member, Output object file, and listing file are placed or found on the same drive. Current drive will be used, unless you specify a diffent drive. User areas are not directly supported in this compiler. Here is the proper syntax: SFGR [d:]filename [/x] Where d: is the drive where the source is found and object will be created. It is optional, defaulting to current drive. For filename is a valid CP/M filename with an extension of ".EXT" (Must be left off or switches will be ignored.). The /x is a valid switch as pictured above. Must be uppercase (CP/M changes it to uppercase) and if it is not valid it will be ignored. Usually use /S. After the compilation, a message of how many format screens that are within the compiled member are displayed. A maximum of 250 screens are allowed for each source member. Also, the exact count of how many bytes generated is displayed. On disk, it will be written in records of 128 bytes, the CP/M standard. The ".FMT" object file can be quickly viewed, paged by screen, to find it compiled normally by using the FVIEW utility. It is a simple program that will display constant output without extra attributes and variable output as a series of "*". To run type: FVIEW [d:]filename, and press ENTER to view next screen and ESC to end program. 11 SFGR Error Messages ------------------- The following are the 15 error message that are used for the SFGR Compiler Version 1.00. These may be edited to your taste with the provided utility EDITERR. To run this program type: EDITERR [d:]SFGR where d: is optional drive. Format of each record is 64 byte random record with zero hex fill at end. This error message editor is the same one provided with the SPL compiler package. If the file SFGR.ERR is not found it will be created on the specified or current drive. This program can edit any other file with ".ERR" extension with the substitution of SFGR for a different file name. Entering 9999 will exit from this program. See technical section for possible terminal specific code such as clear screen and cursor positioning. 1) NO S SPECIFICATION PRIOR TO D SPECIFICATIONS You have forgotten to specify a screen specification record prior to the display specification. The SFGR Compiler must know what screen format will receive the display. The screen specification names the screen format, so it can be called by a program. 2) INVALID SPECIFICATION, MUST BE EITHER S OR D You have specified in column 7 something other than a "S" for a screen specification or "D" for a display specification. It must also be in uppercase. Help specifications are not supported in this release of the SFGR Compiler. 3) MUST SPECIFY INPUT/OUTPUT IN D SPECIFICATION You forgot to put a "Y" for input/output data or did not specify an indicator for output. It must be uppercase. How is SFGR suppose to know what you want to do if you don't tell it? 4) FIELD OVERLAPS WITH A PREVIOUSLY DEFINED FIELD The current field overlaps with another field that was previously defined for the same screen format. You may have expanded the field and did not realise it overlapped or you forgot to place the screen specification statement properly. 5) INVALID LINE NUMBER SPECIFIED IN COLUMN 19-20 There are a maximum of 24 lines on the entire screen. You must take into account the starting line number. So if you display on line 18 when starting line number is 10, then it will be invalid. 6) INVALID COLUMN NUMBER SPECIFIED IN COLUMN 21-22 Only supports columns 1 through 80. If columns 21-22 are blank, then this error will occur. If greater than 80, too. Terminal that can display 132 characters are only supported to 80 column width. 12 7) INVALID FIELD LENGTH SPECIFIED IN COLUMN 15-18 The usual cause is when columns 15 through 18 are left blank. The other cause if you have an input field that crosses from one screen line to another. The final cause is if you specified a number greater than 250 for output field. 8) INVALID KEY MASK STRING SPECIFIED IN COLUMN 64-79 Letters greater than "J" (command key 10) are not supported. Also they must be in uppercase. Numbers 1 through 5 are function keys and are not implimented in this version. 9) EMBEDDED BLANKS OR BLANK FORMAT NAME IN COLUMN 7-14 The format name must be one word without any blank preceeding it. If all blank or blanks embedded then you will see this nasty. Name must be blank padded on the right if less than 8 letters. 10) INVALID START LINE NUMBER SPECIFIED IN COLUMN 17-18 Either 0 entered, number greater than 24, or invalid letter. 11) INVALID LINES TO CLEAR SPECIFIED IN COLUMN 19-20 Can only clear up to: (24 - start line + 1). Probable cause was clearing of more than available lines. 12) DUPLICATE FORMAT NAME SPECIFIED IN COLUMN 7-14 The format name has appeared in a screen specification of a prior record. The format name must be unique within a member. 13) UNIMPLIMENTED DATA TYPE, MUST BE EITHER N OR BLANK This version of SFGR limits you to only two types of data. You've specified a data type which was not implimented or is invalid. Also the "N" or "B" must be in uppercase if specified. 14) EXCEEDED THE MAXIMUM OF 250 INPUT FIELDS PER SCREEN SFGR cannot handle more than this without overflow. Also the driver program is index with a maximum of 250 input field. This is only per format screen not per format member. A theorectical maximum of 62,500 input fields are allowed per format member. There is no limit for output specifications, however. 15) INDICATOR CANNOT CONDITION OUTPUT FOR A CONSTANT Provided to keep System 34/36 compabibility. 13 Technical Information --------------------- The following information is provided for users to impliment SFGR format object code in any language. It is preferable to impliment it for RPG II (Report Program Generator), but I am not about to write one on the spur of the moment. An implimentation of the driver will soon be written in SPL (one of my other lanaguages) and Modula-2. They may provided an easy way to modify for your own type of screen. My screen responds to something close to Televideo 920. This is for Epson QX-10 and QX-16 machines and very close to a Kaypro. There are two commercially known SFGR Compilers for the IBM PC family. One by Lattice, and is packaged with their RPG II Compiler. The other is by California Software, which is packaged with their development system of Baby/36. Both generate SFGR code that appears quite different and are more System 34/36 compatible. Baby/36 will run nearly everything that runs on an IBM System 34/36 (in color if you have a color monitor, of course). Lattice to a lesser degree. For the FVIEW and EDITERR utilities the following is the possible terminal specific instructions: Clear screen puts a 1AH character to the screen. Cursor positioning puts an ESC "=" row+31 col+31. There is little or no space for patch, since data area begins right after the code area after loaded. Check with DDT. Some sample screen members are provided to provide a means of simple understanding the capabilities of SFGR. Using FVIEW, you will be able to see what these screens would look like in a program. All will compile on a System 36 (some were downloaded) and, of course, can be compiled with the SFGR Compiler. The Object specification records may change with version, so if you write a driver, make it easily fixable to include the changes. It will usually be additional bytes in the screen and/or display records, and possibly an attribute attatched to a pre-existing attribute byte. It may seem hard to write a driver, but once written display screen can be created by just calling an object file. If you are really interested in SFGR, then I must refer you to the IBM manuals for the System 36 such as Screen Display Manual using Screen Design Aid. There may be other books on the market that deal with RPG II that also deal with the workstation file definitions. Such a book may presumably be more readable. 14 Screen Specification Object Record Bytes Description of object byte ----- ------------------------------------------------------- 1 Always 0FFH to signify start of format record 2-9 Format Screen Name, left justified blank-fill If byte = 0FFH then no more screen formats. 10 Start Line Number (00 = Variable Start Line) 11 Lines to Clear (0-24 valid entry) 12 Most Significant Bit - Lowercase (1=yes,0=no) Others - Alarm (01-99 indic) (0=no,100=yes) 13 Command keys 1-5 in the 5 Least Signif. Bits 14 Command keys 6-10 in the 5 Least Signif. Bits Display Specification Object Record Bytes Description of object byte ----- ------------------------------------------------------- 1 Type (bit 0=output var,bit 1=input var,bit 2=constant) 2 Row, actual row except if variable start line. 3 Column on the Screen Line to start field. 4 Length of field. 5 Output indicator (0=no,01-99=indicator,1=yes) 6 If alphabetic - (bit 0=0,bit 1=lowercase) If numeric - (bit 0=1,bit 1=fill type) (bit 2=control exit,bit 3=auto advance) 7 High intensity (0=no,01-99=indicator,1=yes) 8 Blink field (0=no,01-99=indicator,1=yes) 9 Reverse image (0=no,01-99=indicator,1=yes) 10 Most Significant Bit - Underline (1=yes,0=no) Others - Column separators (01-99 indic) (0=no,100=yes) 11 Nondisplay (0=no,01-99=indicator,1=yes) 12 Position cursor (0=no,01-99=indicator,1=yes) 13 Protect field (0=no,01-99=indicator,1=yes) 14+ Data if output constant (upto 96 characters) 15 A word about user supported software: The user supported software concept (sometimes referred to as cheapware or freeware or shareware) is an attempt to provide software at low cost. The cost of offering a new product by conventional means is quite staggering, and hence dissuades many new sotware authors from developing and promoting their ideas and products. The User supported software is an attempt to develop a somewhat new marketing channel and technique, where products can be introduced at low cost. If user supported software works, then everyone who is part of it will benefit from it. The user will benefit by receiving a quality product at low cost, and by being able to "see what it really does" before purchasing it. The author benefits by being able to enter the commercial software market without first needing large sum of cash to pay all the overhead that is involved otherwise. But it can only work with your "USER" support. It is not just program package, but about all user supported software. If you are still using a program after a couple of weeks, then it is means it is worth something to you, and you should send in a contribution. A mere $10.00 is requested for this programs use. If you register, you will be entitled to "USER" support from the author. 16 ORDER FORM Check which items you wish to support: (_) Noncommercial license for the use of SFGR. (_) Payment of $_____ is enclosed (checks please) _______________________________________________ Name _______________________________________________ _______________________________________________ Address ______________________ ________ ____________ City State Zip Telephone Number Send this completed form to: Harris Landsberg 1350 East 5th Street Suite 1-J Brooklyn, New York 11230 For a commercial site license, please write to the author for further arrangements. 17