home *** CD-ROM | disk | FTP | other *** search
/ DP Tool Club 8 / CDASC08.ISO / VRAC / B7T12B.ZIP / B7TOOL.DOC < prev    next >
Encoding:
Text File  |  1993-07-13  |  54.7 KB  |  1,306 lines

  1.  
  2.  
  3.                             The B7Tool Library [B7T]
  4.                                    Ver. 1.2b
  5.                   Library Routines for Microsoft BASIC PDS 7.x
  6.                                 by  R. J. Crouch
  7.                          Copyright - 1992-93 - CareWare
  8.                               All Rights Reserved
  9.           ____________________________________________________________
  10.  
  11.  
  12.  
  13.                       **   What is the B7Tool Library?  **
  14.                      ======================================
  15.  
  16.  
  17.           B7Tool  is a collection of innovative and direct programming
  18.           tools, in the form of a user  library,  for  Microsoft  (R),
  19.           BASIC  PDS  7.x.   It  has  emerged  from  a necessity for a
  20.           collection of comprehensive routines to supplement the BASIC
  21.           language.  B7T features;  a comprehensive selection of mouse
  22.           functions,  a  unique  windowing  routine, fast screen save/
  23.           restore routines, fast screen writes, a  bar  menu  routine,
  24.           routines to set and get equipment information, and more.
  25.  
  26.           All  of  the  B7Tool  routines  are easily incorporated into
  27.           almost any BASIC PDS 7.xx source without greatly  increasing
  28.           the efficient size of the "stand-alone" program.  The B7Tool
  29.           Library  is  proposed  as  a  solid foundation from which to
  30.           build your own personal libraries.  These  library  routines
  31.           are  intended  for  use  by  individuals with some BASIC PDS
  32.           programming experience.
  33.  
  34.  
  35.  
  36.                **   Things to know about the B7Tool Library   **
  37.               ===================================================
  38.  
  39.  
  40.           B7Tool is being distributed as a  Shareware  product.   This
  41.           program  is not free and is copyrighted to CareWare with all
  42.           rights reserved.  If you find B7T of value and  continue  to
  43.           use  its services beyond a 30 day trial period, then you are
  44.           required  to  register  your  copy   with   CareWare.    The
  45.           registration  fee  for  B7Tool, on disk with OBJ modules, is
  46.           $25.00 (US).  A  registration  form  is  provided  for  your
  47.           convenience.  Please see the last page of this document.
  48.  
  49.           B7Tool  may  be  shared  with  others  as long as it remains
  50.           unaltered and distributed in its entirety.   A  distribution
  51.           fee,  not to exceed $8.00, may be imposed by disk vendors to
  52.           cover shipping and  handling  costs.   The  following  files
  53.           comprise  the  whole  of  this  product  and  was originally
  54.           distributed as the self-extracting  file  B7T12.EXE  or  the
  55.           ZIPed file B7T12.ZIP.
  56.  
  57.               B7T.LIB        B7T.QLB        B7T.BI       B7TOOL.DOC
  58.               B7T-DEMO.BAS   B7T-DEMO.EXE   VENDOR.DOC   README.TXT
  59.               REGISTER.TXT   FILE_ID.DIZ
  60.  
  61.  
  62.  
  63.                **   Things to know about the B7Tool Library   **
  64.               ===================================================
  65.  
  66.  
  67.           The B7Tool Library is presented as-is and with no warranties
  68.           expressed or implied.  CareWare  assumes  no  responsibility
  69.           for  this products use, misuse, or lose of any kind incurred
  70.           by its use.
  71.  
  72.           Upon  your  completed  registration  you  are  granted  full
  73.           unrestricted single user  operation  and  support  for  this
  74.           product.  There are no additional licensing fees for modules
  75.           compiled  and  linked  into  products  you  distribute.  Any
  76.           comments or  suggestions  are  gratefully  accepted  and  an
  77.           honest attend will be made to answer them.
  78.  
  79.           Microsoft is a registered trademark of the Microsoft Corp.
  80.  
  81.  
  82.  
  83.                    **   What the B7Tool Library provides   **
  84.                   ============================================
  85.  
  86.  
  87.           Mouse Services:  Mouse*()
  88.           -------------------------
  89.  
  90.           A  majority  of  the  routines  in  B7T  pertain  to   mouse
  91.           functions.   These  functions  will  allow  a  programmer to
  92.           incorporate the much needed  mouse  services  into  any  de-
  93.           manding  application.   They  are  intelligently  written to
  94.           compensate for a few idiosyncrasies that tend to emerge from
  95.           the mouse interrupt (33H).
  96.  
  97.  
  98.           Windowing:  DoWindow()
  99.           ----------------------
  100.  
  101.           Windowing  for  today's applications  is  not  new, but this
  102.           windowing routine adds a few features that will enhance  any
  103.           program.   The  screen write for this routine is serviced by
  104.           machine code for  a  fast  and  clean  appearance.   Select-
  105.           ability for title location, type and location of shadow, and
  106.           a solid frame, make this windowing routine unique from other
  107.           we have seen.
  108.  
  109.  
  110.           Screen save/restore:  PutScrn()/GetScrn()
  111.           -----------------------------------------
  112.  
  113.           The ability to save and later restore a screen's contents is
  114.           essential  for contemporary programming.  These two routines
  115.           are designed to work within the BASIC PDS environment.  They
  116.           make use of BASIC PDS's string  descriptor  block  functions
  117.           for  ease of use.  This pair of routines is written entirely
  118.           of machine code for instant results.
  119.  
  120.  
  121.  
  122.                    **   What the B7Tool Library provides   **
  123.                   ============================================
  124.  
  125.  
  126.           Screen print:  PrtScrn()
  127.           ------------------------
  128.  
  129.           This is a little machine code routine that will print to the
  130.           screen,  at the location and color desired, any string vari-
  131.           able.  It's fast, compact, and simulates in  just  one  CALL
  132.           BASIC  PDS's  LOCATE,  COLOR,  and  PRINT  statements.  This
  133.           routine is the heart of  the  windowing  procedure  and  the
  134.           reason for its speed.
  135.  
  136.  
  137.           Equipment Information:  Get*() and Set*()
  138.           -----------------------------------------
  139.  
  140.           These  routines will retrieve and set various system  equip-
  141.           ment  information.   These  types  of  services  give   your
  142.           programs  the  kind  of  information  it  needs  for  proper
  143.           application and system interaction.
  144.  
  145.  
  146.           Pull-Down Bar Menu:  BarMenu()
  147.           ------------------------------
  148.  
  149.           This  routine  provides  a  comprehensive and easy means for
  150.           establishing an application menu system.  BarMenu  is  fully
  151.           configurable  with five color attributes and is both key and
  152.           mouse driven.  (A great value to any Library)
  153.  
  154.  
  155.           Screen string centering:  Ctr()
  156.           -------------------------------
  157.  
  158.           This  is  a  handy  little  function that returns the column
  159.           position needed to center string data or  variables  on  the
  160.           screen.   It  can  easily  be  incorporated into BASIC PDS's
  161.           LOCATE statement.  [i.e.  LOCATE 12, Ctr(strg$)]
  162.  
  163.  
  164.           Program delays:  Delay()
  165.           ------------------------
  166.  
  167.           This is a smart replacement for BASIC PDS's SLEEP  statement
  168.           (which,  by the way, takes over 2K of executable code).  The
  169.           delay can either be forced or user bypassed with any key  or
  170.           mouse  button.   Delay()  also takes into account a midnight
  171.           rollback and adjusts accordingly.
  172.  
  173.  
  174.  
  175.                    **   What the B7Tool Library provides   **
  176.                   ============================================
  177.  
  178.  
  179.           Access to system interrupts
  180.           ---------------------------
  181.  
  182.           Incorporated (LINKed) within the B7Tool Library are  BASIC's
  183.           QBX.QLB  (C),  QBX.LIB (C) and QBX.BI (C).  These files were
  184.           necessary in the writing of various routines that  make  use
  185.           BASIC's Interrupt() service.  Because of their presence, you
  186.           also  have  access to DOS service calls.  This is a powerful
  187.           feature for any programmer.
  188.  
  189.  
  190.  
  191.                **   What the B7Tool Library does not provide   **
  192.               ====================================================
  193.  
  194.  
  195.           B7Tool  does  not  contain routines for data input or manip-
  196.           ulation.  It is felt these  type  of  procedures  should  be
  197.           handled  by  the programmer for their particular application
  198.           needs.  Absent also from this library is  the  abundance  of
  199.           routines  that  can't  possibly  be  incorporated into every
  200.           program.  B7T is intended to be a quality library from which
  201.           to build from.
  202.  
  203.  
  204.  
  205.                **   The nuts and bolts of the B7Tool Library   **
  206.               ====================================================
  207.  
  208.  
  209.           The following is a clarified description of  the  prototypes
  210.           used in the CALL's to these B7Tool library routines.  Please
  211.           note  the  variable  types  used  for the arguments in these
  212.           routines.  The mouse service calls are designed to work with
  213.           a Microsoft (R) mouse driver or close  compatible.   Examin-
  214.           ation  of  the demo source code can aid in understanding the
  215.           use of these routines.
  216.  
  217.  
  218.           -------------------
  219.           MouseStatus(Ready%)
  220.           -------------------
  221.           This routine does a nondestructive interrupt vector check to
  222.           determine  the  existence  of  a mouse driver.  This routine
  223.           should be called prior to using any of the other  B7T  mouse
  224.           routines  to  insure  the  presence  of  the mouse interrupt
  225.           (33H).  (if present the mouse is enabled - function 20H)
  226.  
  227.           Passed:  An integer variable
  228.  
  229.           Returns: 0 if a mouse driver is not detected
  230.                    1 if a mouse driver has been installed
  231.  
  232.           Example:  CALL MouseStatus(have%)
  233.  
  234.  
  235.           ----------------
  236.           MouseReset(Set%)
  237.           ----------------
  238.           This routine will initialize the mouse driver and will allow
  239.           the saving and restoring of two separate mouse states.
  240.  
  241.           Passed:  An initialized integer variable or constant
  242.                    0 = hard reset - initializes mouse driver, turns
  243.                        mouse pointer off and disables any prior
  244.                        user installed events (function 00H)
  245.                    1 = soft reset - reset mouse driver and turns
  246.                        pointer off (function 21H)
  247.                    2 = will save the current mouse state to mouse
  248.                        buffer #1
  249.                    3 = will restore the mouse state as saved in mouse
  250.                        buffer #1
  251.                    4 = will save the current mouse state to mouse
  252.                        buffer #2
  253.                    5 = will restore the mouse state as saved in mouse
  254.                        buffer #2
  255.  
  256.           Returns:  If passed a variable initialized to 0, will reset
  257.                     mouse and return number of buttons installed, else
  258.                     returns nothing
  259.  
  260.           Example:  buttons% = 0
  261.                     CALL MouseReset(buttons%)
  262.  
  263.  
  264.  
  265.           ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  266.           Note:  Not   all   mouse  drivers  support  the  saving  and
  267.                  restoring of the mouse state  (MouseReset(2 thru 5)).
  268.                  If  it  is  your intention to distribute programs for
  269.                  maximum compatibility, you should refrain from  using
  270.                  these reset features.
  271.           ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  272.  
  273.  
  274.           ----------------------
  275.           MouseVersion(Version$)
  276.           ----------------------
  277.           This routine will return both the major and minor version of
  278.           the mouse driver installed.
  279.  
  280.           Passed:  A string variable at lease 5 characters in length
  281.  
  282.           Returns:  A string containing the version of the mouse
  283.                     driver installed.  (i.e.  6.123)
  284.  
  285.           Example:  CALL MouseVersion(ver$)
  286.  
  287.  
  288.           ---------------------
  289.           MouseVisible(Status%)
  290.           ---------------------
  291.           This routine will allow  the  mouse  pointer  to  be  either
  292.           turned  on  or  off.  This routine has been stabilized by an
  293.           internal variable to  compensate  for  the  mouse  interrupt
  294.           counter.   Recursive  calls  to  the  same  Status% will not
  295.           increase or decrease the mouse interrupt counter.  This will
  296.           only be done by opposing Status% calls.
  297.  
  298.           Passed:  An initialized integer variable or constant
  299.                    0 = mouse pointer off
  300.                    1 = mouse pointer on
  301.  
  302.           Returns:  Nothing
  303.  
  304.           Examples:  CALL MouseVisible(1)
  305.                      or
  306.                      off% = 0
  307.                      CALL MouseVisible(off%)
  308.  
  309.  
  310.           ----------------------------------------
  311.           MouseLocate(ScrnRowY%, ScrnColX%, Mode%)
  312.           ----------------------------------------
  313.           This routine will place the  mouse  pointer  at  the  screen
  314.           location  indicated  by its arguments.  The Mode switch will
  315.           allow the location to be given  in  either  row/column  text
  316.           positions or X/Y pixel positions.
  317.  
  318.           Passed:  3 initialized integer variables or constants
  319.                    Mode 0 = pixel positions
  320.                       ScrnColX% = horizontal (X) position with a value
  321.                                   from 0 to 632
  322.  
  323.  
  324.  
  325.                       ScrnRowY% = vertical (Y) position with a value
  326.                                   from 0 to 192
  327.  
  328.                    note:  The pixel given is the upper left dot of
  329.                           the standard 8x8 mouse pointer.  Pixel
  330.                           positions start from 0,0.
  331.  
  332.                    Mode 1 = text positions
  333.                       ScrnColX% = text column position with a value
  334.                                   from 1 to 80
  335.                       ScrnRowY% = text row position with a value from
  336.                                   1 to 25
  337.  
  338.           Returns:  Nothing
  339.  
  340.           Examples:  CALL MouseLocate(12, 30, 1)
  341.                      or
  342.                      CALL MouseLocate(y%, x%, 0)
  343.  
  344.  
  345.           ------------------------------------------
  346.           MousePosition(ScrnRowY%, ScrnColX%, Mode%)
  347.           ------------------------------------------
  348.           This  routine  will return the current position of the mouse
  349.           pointer.  The Mode switch will allow the  location  returned
  350.           to be either given in row/column text positions or X/Y pixel
  351.           positions.
  352.  
  353.           Passed:  2 integer variables and 1 initialized integer
  354.                    variable or constant (Mode%)
  355.                    Mode 0 = returned values represent X/Y pixel
  356.                             positions
  357.                    Mode 1 = returned values represent row/column
  358.                             positions
  359.  
  360.           Returns:  An integer value
  361.                     Mode 0
  362.                        ScrnColX% = current horizontal (X) position of
  363.                                    mouse pointer as represented by
  364.                                    pixels (0 to 632)
  365.                        ScrnRowY% = current vertical (Y) position of
  366.                                    mouse pointer as represented by
  367.                                    pixels (0 to 192)
  368.  
  369.                     note:  The pixel returned is the upper left dot
  370.                            of the standard 8x8 mouse pointer.  Pixel
  371.                            positions start from 0,0.
  372.  
  373.                     Mode 1
  374.                        ScrnColX% = current column position of mouse
  375.                                    pointer (1 to 80)
  376.                        ScrnRowY% = current row position of mouse
  377.                                    pointer (1 to 25)
  378.  
  379.           Example:  CALL MousePosition(TextRow%, TextCol%, 1)
  380.  
  381.  
  382.  
  383.           ------------------------------------------------------------
  384.           MouseLimits(UpRowY%, LeftColX%, LowRowY%, RightColX%, Mode%)
  385.           ------------------------------------------------------------
  386.           This routine will let you limit  the  motion  of  the  mouse
  387.           pointer.    The   mouse   pointer  will  reside  within  the
  388.           boundaries  specified  by  the  arguments  passed  to   this
  389.           routine.  The  Mode switch will allow the limited area to be
  390.           either given in  row/column  text  positions  or  X/Y  pixel
  391.           positions.
  392.  
  393.           Passed:  5 initialized integer variables or constants
  394.                    Mode 0 = pixel positions
  395.                       LeftColX% = left horizontal (X) position with a
  396.                                   value from 0 to 632
  397.                       UpRowY% = upper vertical (Y) position with a
  398.                                 value from 0 to 192
  399.                       RightColX% = right horizontal (X) position with
  400.                                   a value from LeftColX% to 632
  401.                       LowRowX% = lower vertical (Y) position with a
  402.                                   value from UpRowY% to 192
  403.  
  404.                    note:  The pixel given is the upper left dot of
  405.                           the standard 8x8 mouse pointer.  Pixel
  406.                           positions start from 0,0.
  407.  
  408.                    Mode 1 = text positions
  409.                       LeftColX% = left column position with a value
  410.                                   from 1 to 80
  411.                       UpRowY% = upper row position with a value from
  412.                                 1 to 25
  413.                       RightColX% = right column position with a value
  414.                                    from LeftColX% to 80
  415.                       LowRowY% = lower row position with a value from
  416.                                  UpRowY% to 25
  417.  
  418.           Returns:  Nothing
  419.  
  420.           Example:  CALL MouseLimits(10, 25, 15, 55, 1)
  421.  
  422.  
  423.  
  424.           -------------------------------------------------------------
  425.           MouseExclude(UpRowY%, LeftColX%, LowRowY%, RightColX%, Mode%)
  426.           -------------------------------------------------------------
  427.           This  routine  will  allow  the mouse pointer to be excluded
  428.           from any portion of the screen as specified by the arguments
  429.           passed to this routine.  When the mouse pointer  enters  the
  430.           excluded  boundaries,  the pointer is turned off.  The mouse
  431.           interrupt (33H)  does  not,  however,  reinstate  the  mouse
  432.           pointer  to the on condition upon exiting the excluded area.
  433.           This process must be performed within the  programming  code
  434.           itself.    The   excluded   area  cannot  be  saved  by  the
  435.           MouseReset() routines.  The mode switch will allow  the  ex-
  436.           cluded  area to be either given in row/column text positions
  437.           or X/Y pixel positions.
  438.  
  439.           Passed:  5 initialized integer variables or constants
  440.                    Mode 0 = pixel positions
  441.                       LeftColX% = left horizontal (X) position with a
  442.                                   value from 0 to 632
  443.                       UpRowY% = upper vertical (Y) position with a
  444.                                 value from 0 to 192
  445.                       RightColX% = right horizontal (X) position with
  446.                                    a value from LeftColX% to 632
  447.                       LowRowX% = lower vertical (Y) position with a
  448.                                  value from UpRowY% to 192
  449.  
  450.                    note:  The pixel given is the upper left dot of
  451.                           the standard 8x8 mouse pointer.  Pixel
  452.                           positions start from 0,0.
  453.  
  454.                    Mode 1 = text positions
  455.                       LeftColX% = left column position with a value
  456.                                   from 1 to 80
  457.                       UpRowY% = upper row position with a value from
  458.                                 1 to 25
  459.                       RightColX% = right column position with a value
  460.                                    from LeftColX% to 80
  461.                       LowRowY% = lower row position with a value from
  462.                                  UpRowY% to 25
  463.  
  464.           Returns:  Nothing
  465.  
  466.           Example:  CALL MouseExclude(15, 20, 21, 35, 1)
  467.  
  468.  
  469.  
  470.           -------------------------------------------------
  471.           MouseClick(LeftClick%, MiddleClick%, RightClick%)
  472.           -------------------------------------------------
  473.           This  routine  will  return  a  value indicating the current
  474.           mouse button in use.  The value is only  returned  upon  the
  475.           release  of  the button, thus returning the value only once.
  476.           This allows the mouse button status to be  effectively  used
  477.           within a loop.
  478.  
  479.           Passed:  3 integer variables
  480.  
  481.           Returns:  0 = button not in use
  482.                     1 = button has been clicked
  483.  
  484.           Example:  CALL MouseClick(lft%, mid%, rgt%)
  485.  
  486.  
  487.           -----------------------------------------------------
  488.           MouseScroll(LeftButton%, MiddleButton%, RightButton%)
  489.           -----------------------------------------------------
  490.           This routine will return  a  value  indicating  the  current
  491.           mouse   button   being  pressed.   This  value  will  remain
  492.           constant until the button is released.
  493.  
  494.           Passed:  3 integer variables
  495.  
  496.           Returns:  0 = button not in use
  497.                     1 = button is being pressed
  498.  
  499.           Example:  CALL MouseScroll(lft%, mid%, rgt%)
  500.  
  501.  
  502.           --------------------------------
  503.           MouseCursor(Fore%, Back%, Char%)
  504.           --------------------------------
  505.           This routine allows you to change the character and color of
  506.           the mouse pointer.
  507.  
  508.           Passed:  3 initialized integer variables or constants
  509.                    Fore = foreground color for the new pointer
  510.                           (within a range of 0 to 15)
  511.                    Back = background color for the new pointer
  512.                           (within a range of 0 to 7)
  513.                    Char = ASCII decimal value for the character of the
  514.                           new pointer (within a range of 0 to 255)
  515.  
  516.           Returns:  Nothing
  517.  
  518.           Example:  CALL MouseCursor(12, 7, 30)
  519.  
  520.           ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  521.           Note:  Not all mouse drivers support  the  changing  of  the
  522.                  mouse  cursor.  If  it  is  your intent to distribute
  523.                  programs for maximum compatibility, then  you  should
  524.                  consider not using this function.
  525.           ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  526.  
  527.  
  528.  
  529.           --------------------------------------------------------
  530.           DoWindow(UpR%, LfC%, VSz%, HSz%, Att%, Frm%, Shw%, Txt$,
  531.                    Lct%)
  532.           --------------------------------------------------------
  533.           This routine will create attractive application  windows  at
  534.           any  screen  position.  You have control over color, type of
  535.           frame and color, type and location of shadow,  and  location
  536.           of  window title and style.  This windowing routine offers a
  537.           wide variety of possibilities.
  538.  
  539.           Passed:  8 initialized integer variables or constants
  540.                    1 string variable or constant for title
  541.                    UpR = upper row position for start of window
  542.                          (within a range of 1 to 24)
  543.                    LfC = left column position for start of window
  544.                          (within a range of 1 to 79)
  545.                    VSz = vertical size of window (# of rows)
  546.                          (within a range of 26 minus UpR)
  547.                    HSz = horizontal size of window (# of columns)
  548.                          (within a range of 81 minus LfC)
  549.                    Att = attribute of window colors
  550.                          (within a range of 0 to 127)
  551.                          ( (background * 16) + foreground )
  552.                          Note:  Adding 128 to the attribute will
  553.                                 produce a blinking foreground
  554.                    Frm = frame type, if any
  555.                          0 = no frame
  556.                          1 = single line
  557.                          2 = double line
  558.                          3 = single vertical and double horizontal
  559.                          4 = single horizontal and double vertical
  560.                          5 = solid frame enclosing the window
  561.                    Shw = shadow location and type, if any
  562.                          0 = no shadow
  563.                          1 = shadow left side and bottom of window
  564.                              (black in color)
  565.                          2 = shadow right side and bottom of window
  566.                              (black in color)
  567.                          3 = shadow left side and bottom of window
  568.                              (tinted black)
  569.                          4 = shadow right side and bottom of window
  570.                              (tinted black)
  571.                          note:  Tinted black is a combination, with
  572.                                 ASCII character #177, of the color
  573.                                 attribute outside the window and black.
  574.                          5 = shadow left side and bottom of window
  575.                              (shadowed character)
  576.                          6 = shadow right side and bottom of window
  577.                              (shadowed character)
  578.                          note:  The characters within the shadowed
  579.                                 area are displayed using attribute 8.
  580.                    Txt = string variable or constant used for the
  581.                          title of the window
  582.                          note: Empty double quotes ("") or a string
  583.                                initialized to null will not produce
  584.                                a title.
  585.  
  586.  
  587.  
  588.                    Lct = determines the location of the title, if any
  589.                          0 = title at top without brackets
  590.                          1 = title at bottom without brackets
  591.                          2 = title at top with brackets
  592.                          3 = title at bottom with brackets
  593.                          note:  If a title is not present, the
  594.                                 location value has no effect.
  595.  
  596.                    note:  The horizontal and vertical size cannot be
  597.                           less then 2.
  598.  
  599.           Returns:  Nothing
  600.  
  601.           Examples:  CALL DoWindow(5, 10, 15, 60, 98, 5, 3, "", 0)
  602.                      or
  603.                      CALL DoWindow(Rw, Cl, Rn, Cn, 4, 0, 0, Text$, 2)
  604.  
  605.  
  606.           -----------------
  607.           PutScrn(ScrnBuf$)
  608.           -----------------
  609.           This routine will allow you to save the entire  contents  of
  610.           the  screen currently being displayed.  The screen saved can
  611.           later be retrieved and displayed with the companion  routine
  612.           GetScrn().  The screen's contents is saved to a string vari-
  613.           able or array initialized  to  4000  characters  in  length.
  614.           (i.e.  DIM ScrnBuf(3) AS STRING * 4000)
  615.  
  616.           Passed:  An initialized string variable or array at least
  617.                    4000 characters in length
  618.  
  619.           Returns:  current screen's contents
  620.  
  621.           Examples:  DIM ScrnBuf AS STRING * 4000
  622.                      CALL PutScrn(ScrnBuf)
  623.                      or
  624.                      DIM SHARED ScrnBufArr(2) AS STRING * 4000
  625.                      CALL PutScrn(ScrnBufArr(0))  [default option base]
  626.  
  627.  
  628.           -----------------
  629.           GetScrn(ScrnBuf$)
  630.           -----------------
  631.           This routine will allow you  to  retrieve  and  display  the
  632.           contents  of  the  screen  saved  by  its  companion routine
  633.           PutScrn().
  634.  
  635.           Passed:  The string variable or array that contains the
  636.                    screen to be displayed.
  637.  
  638.           Returns:  Nothing  (contents of buffer are displayed)
  639.  
  640.           Examples:  CALL GetScrn(ScrnBuf)
  641.                      or
  642.                      CALL GetScrn(ScrnBufArr(1))
  643.  
  644.  
  645.  
  646.           ---------------------------------
  647.           PrtScrn(Strg$, Row%, Col%, Attr%)
  648.           ---------------------------------
  649.           This is a machine language routine that will print a  string
  650.           variable or constant to the screen at the location and color
  651.           indicated  by its arguments.  The attribute is a combination
  652.           of  the  foreground  and  background  colors  and   can   be
  653.           determined  by  the  following  formula: (background * 16) +
  654.           foreground.
  655.  
  656.           Passed:  3 initialized integer variables or constants
  657.                    1 initialized string variable or constant
  658.                    Strg = string variable or constant to be displayed
  659.                    Row  = screen row for display
  660.                           (within a range of 1 to 25)
  661.                    Col  = screen column for display
  662.                           (within a range of 1 to 80)
  663.                    Attr = attribute of color to be displayed
  664.                           (within a range of 0 to 127)
  665.                           Note:  Adding 128 to the attribute will
  666.                                  produce a blinking foreground
  667.  
  668.           Returns:  Nothing
  669.  
  670.           Examples:  CALL PrtScrn("Hello Universe", 12, 33, 110)
  671.                      or
  672.                      CALL PrtScrn(hello$, rw%, cl%, att%)
  673.  
  674.  
  675.           ------------------------------
  676.           GetDrive(TotDrives%, CurDrive%
  677.           ------------------------------
  678.           This routine returns the total number of drives installed on
  679.           a system,  the  current  drive  location,  and  the  current
  680.           directory location.
  681.  
  682.           Passed:  2 integer variables
  683.  
  684.           Returns:  TotDrives% = total number of disk drives installed
  685.                                  on system
  686.                     CurDirve% = numeric value indicating current drive
  687.                                 (1=A:, 2=B:, 3=C: and so on)
  688.  
  689.           Example:  CALL GetDrive(TotDrv%, CurDrv%)
  690.  
  691.  
  692.  
  693.           -------------------
  694.           SetDrive(DriveNum%)
  695.           -------------------
  696.           This routine allows you to change the current drive location
  697.           within  an application.  Valid drive numbers range from 1 to
  698.           26.  No action is taken if the drive number supplied is  not
  699.           valid or the drive does not exist on the system.
  700.  
  701.           Passed:  An initialized integer variable or constant
  702.                    (1=A:, 2=B:, 3=C: and so on up to 26)
  703.  
  704.           Returns:  Nothing
  705.  
  706.           Examples:  CALL SetDrive(3)
  707.                      or
  708.                      NewDrv% = 2
  709.                      CALL SetDrive(NewDrv%)
  710.  
  711.  
  712.           --------------------
  713.           DriveSpc(Available&)
  714.           --------------------
  715.           This  routine  will  return the total bytes available on the
  716.           disk drive supplied.  The routine is useful when wanting  to
  717.           know  if  enough  disk  space  remains on a drive to write a
  718.           file.
  719.  
  720.           Passed:  A long integer containing the drive number to check
  721.                    (1=A:, 2=B:, 3=C: and so on)
  722.  
  723.           Returns:  The total bytes available on specified drive
  724.  
  725.           Example:  Drv& = 2
  726.                     CALL DriveSpc(Drv&)
  727.  
  728.  
  729.           -------------------------
  730.           GetSize(FileName$, Size&)
  731.           -------------------------
  732.           This  routine  returns  the  file  size  of  the  given file
  733.           specification.  This routine is useful for determining if  a
  734.           file is present.
  735.  
  736.           Passed:  1 initialized string or constant containing  the
  737.                        file name and its location, if any
  738.                        (i.e.  C:\B7T\B7T-DEMO.EXE)
  739.                    1 long integer variable
  740.  
  741.           Returns:  Size& = size of specified file.  If 0 is returned,
  742.                             file was not found.
  743.  
  744.           Examples:  CALL GetSize("B7T.LIB", FSize&)
  745.                      or
  746.                      FileSpec$ = "D:\WP\TEST.TXT"
  747.                      CALL GetSize(FileSpec$, FSize&)
  748.                      IF FSize& <> 0 THEN... etc.
  749.  
  750.  
  751.  
  752.           -------------------
  753.           GetDOS(VersionNum$)
  754.           -------------------
  755.           This routine return a string containing the version  of  DOS
  756.           currently  used  by a computer system.  The routine is handy
  757.           when wanting to know what  system  interrupts  you  can  use
  758.           based on the DOS version installed.
  759.  
  760.           Passed:  A string variable
  761.  
  762.           Returns:  VersionNum$ = current DOS version (i.e.  5.0)
  763.  
  764.           Example:  CALL GetDOS(Ver$)
  765.  
  766.  
  767.           ----------------------------------------------------------
  768.           GetVideo(Mode%, Page%, Col%, CurStart%, CurStop%, CurAtt%)
  769.           ----------------------------------------------------------
  770.           This routine can provide you with necessary information on a
  771.           system's current video state.  If used at the beginning of a
  772.           program, the  information  retrieved  can  be  used  at  its
  773.           closing to restore a system's video status.
  774.  
  775.           Passed:  6 Integer variables
  776.  
  777.           Returns:  Mode% = current video mode as outlined by Int 10H,
  778.                             Function 00H
  779.                     Page% = current video page number
  780.                     Col% = number of columns for current video mode
  781.                     CurStart% = starting scan line for cursor
  782.                     CurStop% = ending scan line for cursor
  783.                     CurAtt% = color attribute at cursor position
  784.  
  785.           Example:  CALL GetVideo(VMd%, VPg%, Col%, CSt%, CSp%, CAt%)
  786.  
  787.  
  788.           ---------------
  789.           SetVideo(Mode%)
  790.           ---------------
  791.           This  routine  allows you to set a desired video mode.  When
  792.           used in conjunction with the value returned by GetVideo(), a
  793.           system's video mode, if changed within  a  program,  can  be
  794.           restored to it initial state.
  795.  
  796.           Passed:   An  initialized  integer  variable  or constant as
  797.                     outlined by Int 10H, Function 00H
  798.  
  799.           Returns:  Nothing
  800.  
  801.           Examples:  CALL SetVideo(3)
  802.                      or
  803.                      VMode% = 1
  804.                      CALL SetVideo(VMode%)
  805.  
  806.  
  807.  
  808.           ---------------------
  809.           GetComPorts(HowMany%)
  810.           ---------------------
  811.           This  routine will return the number of serial ports install
  812.           on a computer.
  813.  
  814.           Passed:  An integer variable
  815.  
  816.           Returns:  Number of serial ports installed
  817.  
  818.           Example:  CALL GetComPorts(NumOfPorts%)
  819.  
  820.  
  821.           -----------------
  822.           Get87(DoWeHave%)
  823.           -----------------
  824.           This routine will return a True or False value  representing
  825.           the presence of a math coprocessor.
  826.  
  827.           Passed:  An integer variable
  828.  
  829.           Returns:  -1 = A math coprocessor has been detected
  830.                      0 = No math coprocessor has been detected
  831.  
  832.           Example:  CALL Get87(Have87%)
  833.                     IF Have87 THEN... etc.
  834.  
  835.  
  836.  
  837.           -------------------------------------------------------------
  838.           BarMenu(MenuStr(), A1%, A2%, A3%, A4%, A5%, S%, M%, R1%, R2%)
  839.           -------------------------------------------------------------
  840.           This is a comprehensive top line pull-down bar menu routine.
  841.           It's  configurable  with five color attributes, window frame
  842.           style, and mouse support.  This routine allows you to add  a
  843.           full  and  attractive  menu to any application.  New to this
  844.           routine is an argument allowing you  to  shadow  the  menu's
  845.           pull-down windows.
  846.  
  847.           Passed:  MenuStr() - a two dimensional string array contain-
  848.                                ing the menu items
  849.  
  850.                      Note:  The (0, 0) element of MenuStr() holds the
  851.                             upper limits of each second dimension.
  852.                             (i.e.  MenuStr(0, 0) = "03050402").
  853.                             Each 2d dimension 0 element for each 1st
  854.                             dimension holds the level 1 menu item.
  855.  
  856.                    A1% - color attribute of level 1 menu bar
  857.                    A2% - color attribute for highlighted first letter
  858.                          of level 1 menu bar
  859.  
  860.                      Note:  If these two attributes (A1 & A2) are NOT
  861.                             the same value and the first letter of
  862.                             all level 1 menu titles are different,
  863.                             then BarMenu() will pick the proper menu
  864.                             title by pressing the highlighted letter.
  865.  
  866.                    A3% - color attribute of level 2 menu window
  867.                    A4% - color attribute of level 2 menu window text
  868.                    A5% - color attribute of level 2 menu window
  869.                          highlighted test (item selected)
  870.                    S% - shadow type for menu windows (see DoWindow()
  871.                         shadow types for argument values)
  872.                    M% - a True (-1) or False (0) value indicating
  873.                         if a mouse is to be used
  874.  
  875.                      Note:  If a mouse is used, the mouse cursor is
  876.                             turned off upon entering BarMenu() and
  877.                             then turned on upon exiting.
  878.  
  879.                    R1% - an integer value indicating the number of
  880.                          spaces between each level 1 menu item
  881.                    R2% - frame style used for the level 2 menu window
  882.                          (see DoWindow() for styles - default 5)
  883.  
  884.           Returns:  R1% - level 1 menu item picked
  885.                     R2% - level 2 menu item picked
  886.  
  887.                       Note:  If the <ESC> key or RIGHT mouse button is
  888.                              pressed the values returned are 0 and the
  889.                              menu exits.
  890.  
  891.  
  892.  
  893.           Example:  DIM MenuStr(4, 5) AS STRING
  894.                     [ Initialize your array elements           ]
  895.                     [   MenuStr(0, 0) = "03050402"             ]
  896.                     [   MenuStr(1, 0) = " File Information "   ]
  897.                     [   MenuStr(1, 1) = " Get File Size "      ]
  898.                     [   MenuStr(1, 2) = " View File     "      ]
  899.                     [   Etc...                                 ]
  900.                     S% = 6: M% = -1: R1% = 3: R2% = 3
  901.                     CALL BarMenu(MenuStr(), 11, 4, 112, 113, 116,  S%,
  902.                                  M%, R1%, R2%)
  903.  
  904.           Note:  Please  see  the  Demo source code (B7T-DEMO.BAS) for
  905.                  additional information and an example on the  use  of
  906.                  this routine.
  907.  
  908.  
  909.           ------------
  910.           Ctr(String$)
  911.           ------------
  912.           This  is  a  handy  little  function that returns the column
  913.           position needed to screen center a string variable.  It  can
  914.           easily be incorporated into BASIC's LOCATE statement.
  915.  
  916.           Passed:  An initialized string variable
  917.  
  918.           Returns:  Column position needed to screen center a
  919.                     string variable.
  920.  
  921.           Examples:  LOCATE 12, Ctr(Strg$)
  922.                      or
  923.                      cntr = Ctr(Strg$)
  924.                      LOCATE 12, cntr
  925.  
  926.  
  927.           ----------------------------------
  928.           Delay(Length!, Forced%, UseMouse%)
  929.           ----------------------------------
  930.           This routine is a smart alternative  to  BASIC  PDS's  SLEEP
  931.           statement  or the numerous appearances of LOOPs.  This delay
  932.           can either be forced or user bypass  with  the  keyboard  or
  933.           mouse  buttons  (if installed).  The delay makes use of real
  934.           time so CPU speed has little effect.
  935.  
  936.           Passed:  2 initialized integer variable or constant
  937.                    1 initialized long variable or constant
  938.  
  939.                    Length = single precision integer indicating the
  940.                             length of the delay in seconds
  941.  
  942.  
  943.  
  944.                    Forced = integer indicating the type of delay
  945.                             0 = not forced (can be bypassed with
  946.                                 any key or mouse button)
  947.                            -1 = delay is forced (remains in effect
  948.                                 until specified time has elapsed)
  949.                    UseMouse = integer indicating if a mouse can be
  950.                               used for a button response
  951.                               0 = do not use a mouse for response
  952.                              -1 = a mouse is present and used for a
  953.                                   response
  954.  
  955.                    note:  If both Length and Forced are 0, then
  956.                           Delay() will wait indefinitely until any
  957.                           key or mouse button (if present) is pressed.
  958.  
  959.           Returns:  Nothing
  960.  
  961.           Examples:  CALL Delay(.25, 1, 0)
  962.                      or
  963.                      lgth! = 1.25
  964.                      Forced% = False
  965.                      Mouse% = True
  966.                      CALL Delay(lgth1!, Forced%, Mouse%)
  967.  
  968.  
  969.           --------------------------------------
  970.           QBX.QLB (C) - QBX.LIB (C) - QBX.BI (C)
  971.           --------------------------------------
  972.           These three BASIC PDS  files  are  incorporated  into  B7T's
  973.           libraries.   They  are necessary for the DOS interrupts used
  974.           by the mouse routines.  The  following  is  a  list  of  the
  975.           services   provided   by  these  files.   Because  of  their
  976.           presence, you also have access to these important  services.
  977.           Please  consult  your  BASIC  PDS  7.x reference manuals for
  978.           information on the use  of  these  BASIC  PDS  CALL's.   The
  979.           demonstration  source  code  (B7T-DEMO.BAS)  illustrates  an
  980.           example of a CALL to the Interrupt() routine.
  981.  
  982.                CALL Absolute()
  983.                CALL Int86Old()
  984.                CALL Int86XOld()
  985.                CALL Interrupt()
  986.                CALL InterruptX()
  987.  
  988.  
  989.  
  990.                        **   The $INCLUDE file B7T.BI   **
  991.                       ====================================
  992.  
  993.  
  994.           The  file B7T.BI contains the declarations for the Ctr() and
  995.           Delay() routines.  If you intend to use these routines, this
  996.           file must be used in BASIC's  metacommand  instructions  and
  997.           placed  at  the beginning of your code.  Generally, the TYPE
  998.           declarations for the Interrupt() and InperruptX() CALLs  are
  999.           also  placed  in  this  file.   Please see the demonstration
  1000.           source code (B7T-DEMO.BAS) for an example of  a  metacommand
  1001.           instruction  or consult your BASIC PDS reference manuals for
  1002.           information on $INCLUDE: files.
  1003.  
  1004.  
  1005.  
  1006.                 **   A demonstration of the B7Tool Library   **
  1007.                =================================================
  1008.  
  1009.  
  1010.           There is an  old  cliche  that states, "A picture is worth a
  1011.           thousand words".  So, provided with  B7Tool  is  the  source
  1012.           code   [B7T-DEMO.BAS]  for  a  short  demonstration  of  its
  1013.           routines.   This  source  code  will  give  you   a   better
  1014.           understanding  as  to  the actual usage of the B7T routines.
  1015.           The code is presented in an ASCII format and can  be  viewed
  1016.           with  any  common  text editor or sent to your printer using
  1017.           the syntax;  COPY B7T-DEMO.BAS PRN.  This  demonstration  is
  1018.           quite   simple   and   by  no  means  illustrates  the  only
  1019.           application for the B7Tool Library.  If you wish to  compile
  1020.           this demo, the following command line syntax should be used.
  1021.  
  1022.           From the DOS command line for a stand-alone EXE:
  1023.  
  1024.                BC B7T-DEMO/O/Fs;
  1025.                LINK B7T-DEMO,,,B7T;
  1026.  
  1027.           To start BASIC PDS and load B7T-DEMO.BAS:
  1028.  
  1029.                QBX /L B7T B7T-DEMO
  1030.  
  1031.           The  B7T-DEMO  provided  with  this release was compiled and
  1032.           linked  within  the  QBX  environment for a stand-alone EXE.
  1033.           The following compile and link switches were used by the QBX
  1034.           environment.
  1035.  
  1036.              Compile:  /O/Ot/Fs/Lr/FPi/T/C:512
  1037.  
  1038.              Link:  /EX/NOE/NOD:BRT71EFR.LIB
  1039.  
  1040.              Libraries linked:  BCL71EFR.LIB and B7T.LIB
  1041.  
  1042.  
  1043.  
  1044.                   **   Compiling with the B7Tool Library   **
  1045.                  =============================================
  1046.  
  1047.  
  1048.           When starting BASIC PDS, you will need to  supply  the  name
  1049.           of  the  library  to  look  to for external references.  The
  1050.           following is an example of this command line using  the  B7T
  1051.           library.
  1052.  
  1053.                QBX /L B7T [YOURFILE.BAS]
  1054.  
  1055.           All  of  the  OBJ  modules  within  the  B7Tool Library were
  1056.           compiled using  the  command-line  compiler  (BC)  and  were
  1057.           supplied with the /O (stand-alone EXE) and /Fs (far strings)
  1058.           switches.   BASIC  will  not allow modules compiled for near
  1059.           strings to be mixed with modules compiled for  far  strings.
  1060.           If  you  intend to mix the B7T OBJ modules with some of your
  1061.           own modules, be sure your OBJ modules  were  compiled  using
  1062.           the  /Fs switch.  Within the QBX environment the near string
  1063.           model is never used  and are always compiled for far strings
  1064.           (/Fs).
  1065.  
  1066.           B7Tool  can  be  linked  to  your  object  modules using the
  1067.           standard DOS command line.  This process  avoids  the  BASIC
  1068.           PDS  environment  entirely.  Your source code (BAS) needs to
  1069.           be saved in text (ASCII) format in order for BC  to  operate
  1070.           properly.   The  following  syntax has been tested and works
  1071.           quite well.
  1072.  
  1073.              For stand-alone EXE  -  BC YOURFILE.BAS/O/Fs;
  1074.                                      LINK YOURFILE.OBJ,,,B7T.LIB;
  1075.  
  1076.              For run-time EXE  -  BC YOURFILE.BAS/Fs;
  1077.                                   LINK YOURFILE.OBJ,,,B7T.LIB;
  1078.  
  1079.              Note:   Be  sure  you  supply  all necessary command line
  1080.                      switches  needed  for  your  source   code   when
  1081.                      compiling (BC).  [i.e.  BC YOURFILE.BAS/O/E/X/Fs]
  1082.  
  1083.           Please   consult  your  BASIC  reference  manuals  for  more
  1084.           detailed information on compiling and linking your  programs
  1085.           from the DOS command line.
  1086.  
  1087.  
  1088.  
  1089.                    **   A look inside the B7Tool Library   **
  1090.                   ============================================
  1091.  
  1092.  
  1093.           The  B7Tool  Library  is  comprised  of  eight  object  code
  1094.           modules.  With  this type of construction, it is possible to
  1095.           build libraries  containing  only  the  particular  routines
  1096.           desired, or incorporate them into existing libraries.  These
  1097.           modules are provided to you (on disk) upon your registration
  1098.           of  B7Tool.   Below  is a list of the object modules and the
  1099.           routines contained in each.
  1100.  
  1101.                 Module Name         Routines          Source Type
  1102.                 -----------         --------          -----------
  1103.  
  1104.                 B7TOOL.OBJ          Ctr()                 BAS
  1105.                                     Delay()               BAS
  1106.  
  1107.                 B7WIND.OBJ          DoWindow()            BAS
  1108.  
  1109.                 B7MOUSE.OBJ         Mouse*()              BAS
  1110.  
  1111.                 PRTSCRN2.OBJ        PrtScrn()             ASM
  1112.  
  1113.                 PUTSCRN2.OBJ        PutScrn()             ASM
  1114.  
  1115.                 GETSCRN2.OBJ        GetScrn()             ASM
  1116.  
  1117.                 B7MENU.OBJ          BarMenu()             BAS
  1118.  
  1119.                 B7EQUIP.OBJ         GetDirve()            BAS
  1120.                                     SetDrive()            BAS
  1121.                                     DriveSpc()            BAS
  1122.                                     GetVideo()            BAS
  1123.                                     SetVideo()            BAS
  1124.                                     GetDOS()              BAS
  1125.                                     GetSize()             BAS
  1126.                                     GetComPorts()         BAS
  1127.                                     Get87()               BAS
  1128.  
  1129.           The routine DoWindow() does make CALLs  to  PRTSCRN2.OBJ and
  1130.           must  have  access  to  its services.  When using the B7WIND
  1131.           module, the PRTSCRN2 module should always be linked with it.
  1132.  
  1133.           If  B7MOUSE.OBJ  is  used separately, it must have access to
  1134.           QBX.LIB or QBX.QLB if used within the BASIC PDS environment.
  1135.  
  1136.           The BarMenu() routine makes CALLs to the following  routines
  1137.           and must have access to their services.
  1138.  
  1139.                 DoWindow()    PrtScrn()   GetScrn()   PutScrn()
  1140.  
  1141.           If   a  mouse  in  intended  for  use  with  BarMenu()  then
  1142.           B7MOUSE.OBJ also  must  be  accessible.
  1143.  
  1144.  
  1145.  
  1146.                    **   A look inside the B7Tool Library   **
  1147.                   ============================================
  1148.  
  1149.  
  1150.           The screen  handling  modules  (ASM)  employ  direct  memory
  1151.           access and assume the segment address of the regen buffer to
  1152.           be the following:
  1153.  
  1154.                       Card Type             Segment Address
  1155.                      -----------           -----------------
  1156.  
  1157.                       Monochrome                 B000H
  1158.  
  1159.                       Color                      B800H
  1160.  
  1161.           The  following  is  a list of internal variables used in the
  1162.           mouse routines.  These variable names should not be used  by
  1163.           your  program  structure  in  conjunction with the COMMON or
  1164.           SHARED Statements.
  1165.  
  1166.                visible33%       mouse1buf33%()     mouse2buf33%()
  1167.  
  1168.           The  remaining  variables  within  the  B7T   routines   are
  1169.           initialized upon their CALL and are not defined as SHARED.
  1170.  
  1171.  
  1172.  
  1173.                        **   String Descriptor Block   **
  1174.                       ===================================
  1175.  
  1176.  
  1177.           The  following four BASIC PDS routines are also incorporated
  1178.           within the B7Tool Library.
  1179.  
  1180.             StringAssign  StringRelease  StringAddress  StringLength
  1181.  
  1182.           Because  the  structure  of  the far string descriptor block
  1183.           for fixed length strings is proprietary and unknown  at  the
  1184.           time  of  this writing, these BASIC PDS routines are used in
  1185.           the ASM modules to decipher the descriptor block  for  their
  1186.           use.   You  also  have  access  to these services because of
  1187.           their inclusion in the B7Tool  Library.   Please  refer  the
  1188.           your BASIC PDS Reference Manual, "Mixed-Language Programming
  1189.           with  Far  Strings",  for more specific information on their
  1190.           structure and use.
  1191.  
  1192.  
  1193.  
  1194.               **   A few final notes about the B7Tool Library   **
  1195.              ======================================================
  1196.  
  1197.  
  1198.           This documentation is not written to be a tutorial and makes
  1199.           the  assumption  you  have  some  knowledge  of  the calling
  1200.           conventions for BASIC PDS.  The  demonstration  source  code
  1201.           (B7T-DEMO.BAS)  was  written  to  provide you with a working
  1202.           example of the B7T routines and  is  a  valuable  source  of
  1203.           information.
  1204.  
  1205.           B7Tool was developed and tested on a 8088  machine,  running
  1206.           at  8  mhz,  and  a  80386sx machine, running at 16 mhz, and
  1207.           should perform as expected on most computers within the "86"
  1208.           family.
  1209.  
  1210.  
  1211.  
  1212.                 **   The Shareware principle works for you   **
  1213.                =================================================
  1214.  
  1215.  
  1216.           R. J. Crouch
  1217.           CareWare
  1218.           307 Gracie Road
  1219.           Nevada City, CA  95959
  1220.           (916) 265-8704 * CIS 74270,516
  1221.  
  1222.  
  1223.           This program is produced by a member of the  Association  of
  1224.           Shareware  Professionals (ASP).  ASP wants to make sure that
  1225.           the shareware principle works for you.  If you are unable to
  1226.           resolve a shareware-related problem with an  ASP  member  by
  1227.           contacting the member directly, ASP may be able to help. The
  1228.           ASP Ombudsman can help you resolve a dispute or problem with
  1229.           an  ASP  member,  but does not provide technical support for
  1230.           members' products.  Please write to  the  ASP  Ombudsman  at
  1231.           545 Grover Road,  Muskegon, MI  49442  or  send a CompuServe
  1232.           message via easyplex to ASP Ombudsman 70007,3536.
  1233.  
  1234.  
  1235.                   _______
  1236.              ____|__     |                (R)
  1237.           --|       |    |-------------------
  1238.             |   ____|__  |  Association of
  1239.             |  |       |_|  Shareware
  1240.             |__|   o   |    Professionals
  1241.           -----|   |   |---------------------
  1242.                |___|___|    MEMBER
  1243.  
  1244.  
  1245.                             The B7Tool Library [B7T]
  1246.                                    Ver. 1.2b
  1247.                            Software Registration Form
  1248.                 _______________________________________________
  1249.  
  1250.  
  1251.          CareWare
  1252.          307 Gracie Road
  1253.          Nevada City, CA  95959                       Date ____________
  1254.  
  1255.  
  1256.          Quantity        Type of registration          Cost      Total
  1257.          --------        --------------------          ----      -----
  1258.  
  1259.           ______    Registration of your current      $20.00    _______
  1260.                     copy
  1261.  
  1262.           ______    Registration & latest ver. of     $25.00    _______
  1263.                     B7Tool & OBJ modules on disk
  1264.  
  1265.           ______    All the above plus all OBJ        $50.00    _______
  1266.                     module source codes on disk
  1267.  
  1268.                                                     Subtotal    _______
  1269.  
  1270.  
  1271.           Disk size:  [ ] 5.25 (360)  -  [ ] 3.5 (720)          _______
  1272.                        (please add $1.00 for ea. 3.5)
  1273.  
  1274.           Please add $4.00 for disk shipping outside of U.S.    _______
  1275.           (first class air)
  1276.  
  1277.                                              Amount Enclosed    _______
  1278.  
  1279.  
  1280.           All  registered  user  will  receive  prompt  and  courteous
  1281.           support for this  product.
  1282.  
  1283.  
  1284.           Name ________________________________________________
  1285.  
  1286.           Address _____________________________________________
  1287.  
  1288.                   _____________________________________________
  1289.  
  1290.           City, State, Zip ____________________________________
  1291.  
  1292.           Phone (optional) ____________________________________
  1293.  
  1294.           Please  help  us track the distribution of B7Tool and let us
  1295.           know where you found this copy.
  1296.  
  1297.           ____________________________________________________________
  1298.  
  1299.           Please make payable to the author  -  R. J. Crouch
  1300.  
  1301.           ORDERS OUTSIDE  OF  U.S.   -   Please   send   international
  1302.           postal or money orders in U.S. dollars.
  1303.  
  1304.  
  1305.  
  1306.