home *** CD-ROM | disk | FTP | other *** search
/ TopWare Tools / TOOLS.iso / tools / top1190 / pmap.doc < prev    next >
Encoding:
Text File  |  1988-11-15  |  27.3 KB  |  640 lines

  1.  
  2.                                    PMAP 1.34
  3.                                    ---------
  4.  
  5.         PMAP (Program MAP) is a simple program that displays how your
  6.         PC's memory is being used.  It lists all active programs
  7.         (including resident programs such as Sidekick and PCED) and
  8.         tells you how much free memory is available for programs.  If
  9.         expanded (LIM) memory is present, a summary of EMS use is also
  10.         shown.  A list of installed devices is optionally displayed.
  11.  
  12.         Syntax summary
  13.         --------------
  14.  
  15.         The command line syntax of PMAP is:
  16.  
  17.             pmap [/drsvx?] [program-list]
  18.  
  19.         The optional /switches are:
  20.  
  21.                 d   display Detail list of allocation by programs
  22.                 r   display Raw list of memory blocks
  23.                 s   display only Standard DOS memory
  24.                 v   display deVice driver information
  25.                 x   display only eXpanded memory
  26.                 ?   display syntax summary
  27.  
  28.         Program-list, if present, restricts the display to the listed
  29.         programs.  Named programs may contain wildcards (*).
  30.  
  31.         Examples:
  32.  
  33.           pmap            (default display)
  34.           pmap /r         (raw display)
  35.           pmap /d sdump   (detail display of program SDUMP only)
  36.           pmap sdump c*   (display SDUMP and anything beginning with C)
  37.           pmap /x         (display only expanded memory usage)
  38.           pmap /v         (display only device driver data)
  39.  
  40.  
  41.         Standard display
  42.         ----------------
  43.  
  44.         When PMAP is invoked without parameters, you'll see a display
  45.         similar to this:
  46.  
  47.  
  48.           Addr Program   Parent    Parameters     Han Blks   Size    Vectors
  49.           ---- -------  -------- ---------------  --- ----  -------  -------
  50.           147D command  command  main               0    2     3888  2E
  51.           157B nmi      command  /i/q               0    2     1856  02
  52.           15F2 cache-em command  500                0    2    13168  13 19
  53.           193E dbase    command  /C d:command      16    2   238384  30
  54.           ...
  55.           Total conventional free memory                 4   451696
  56.           Largest conventional free block                    371168
  57.           Extended memory installed                          425984
  58.           Next program will load at 5579
  59.  
  60.         Each program that is currently in memory is displayed.  Fields
  61.         are as follows:
  62.  
  63.             Addr        The memory segment at which the program is
  64.                         loaded, in hexadecimal.
  65.  
  66.             Program     The name of the program, if available.  "n/a"
  67.                         indicates that the name is not available.  The
  68.                         program name is never available under DOS 2.x.
  69.  
  70.             Parent      The name of the program's "parent".  In most
  71.                         cases, this will be "command", because most
  72.                         programs are run by COMMAND.COM (i.e., from
  73.                         the DOS prompt).  See below.
  74.  
  75.             Parameters  The command line parameters that were specified
  76.                         when the program was run.  Some programs re-use
  77.                         the area where the parameters are stored, in
  78.                         which case a "??" will be displayed.  An
  79.                         ellipsis ("...") at the end indicates that there
  80.                         were more parameters than could fit here.
  81.  
  82.             Han         The number of open handles (or files) associated
  83.                         with the owner.  See below.
  84.  
  85.             Blocks      The number of memory blocks that are owned by
  86.                         the program.
  87.  
  88.             Size        The total size of all blocks owned by the
  89.                         program.
  90.  
  91.  
  92.             Vectors     A list of 80x8x interrupt vectors that appear to
  93.                         have been "intercepted" by the program.
  94.  
  95.         For example, the program NMI is loaded at memory segment 157BH
  96.         and was run directly from the DOS prompt or from a batch file.
  97.         The original parameters were "/i/q".  DOS has allocated two
  98.         blocks of memory for the program, and they total 1856 bytes in
  99.         size.  Vector 2 (nonmaskable interrupt) has been "intercepted"
  100.         by NMI.
  101.  
  102.         At the end of the list, PMAP indicates the number of blocks of
  103.         free memory, the total size of all free blocks, the largest
  104.         single free block, and the segment address at which the next
  105.         program will probably load.
  106.  
  107.         The amount of extended memory (AT memory above the 1 megabyte
  108.         mark) is displayed only if such memory is present.
  109.  
  110.         You can restrict the display to certain programs by naming them
  111.         on the command line.  For example,
  112.  
  113.             pmap sdump ced
  114.  
  115.         would display information for the SDUMP and CED programs, and no
  116.         others.  The summary and expanded memory information is always
  117.         displayed.
  118.  
  119.         You can use a single wildcard '*' at the end of any named
  120.         program in the list.  For example,
  121.  
  122.             pmap sd* c*
  123.  
  124.         would display information for all programs beginning with
  125.         "sd" or "c".
  126.  
  127.         NOTE: "below" the first program loaded in memory (usually
  128.         COMMAND.COM), there is a block of memory allocated by DOS for
  129.         device drivers, etc.  PMAP does not show this block in its
  130.         standard display.  If you are interested to see how large it is
  131.         and where it is allocated, use the /R display described below,
  132.         in which it will be the first block listed; it will usually show
  133.         0008 in the "owner" field.
  134.  
  135.  
  136.         Detail display
  137.         --------------
  138.  
  139.         When you run PMAP with the /D (Detail) parameter, you'll see the
  140.         same display, except that PMAP will show a detailed list of
  141.         memory blocks allocated for each program.  For example:
  142.  
  143.          Addr Program  Parent    Parameters  Han Blks  Size   Vectors
  144.          ---- ------- -------- ------------- --- ---- ------- -------
  145.          1666 kbfix2  command  /KT1 /D0...     0    2    2560 08 09 16
  146.          1661  Environment                                 64
  147.          1666  Program                                   2496
  148.  
  149.         KBFIX2 has two memory blocks allocated to it; PMAP shows the
  150.         size of each block and its address, and makes an educated guess
  151.         as to what the block is used for.
  152.  
  153.         You may include a list of specific programs to be displayed:
  154.  
  155.             pmap sdump ced /d
  156.  
  157.         PMAP also displays a detail list of all free blocks of memory.
  158.  
  159.  
  160.         Raw display
  161.         -----------
  162.  
  163.         When you run PMAP with the /r (Raw) parameter, you'll see a
  164.         display like this:
  165.  
  166.             T  MCB  Addr  Owner  Para    Bytes
  167.             - ----  ----  -----  ----  --------
  168.             M 0974  0975   0008  0AFA     44960
  169.             M 146F  1470   1470  00C3      3120
  170.             M 1533  1534   1470  0020       512
  171.                [more of the same]
  172.             M 1DF3  1DF4   1DF4  0706     28768
  173.             M 24FA  24FB   2500  0004        64 [pmap]
  174.             M 24FF  2500   2500  1376     79712 [pmap]
  175.             Z 3876  3877   0000  6789    424080
  176.  
  177.         This is an uninterpreted list of all blocks of memory allocated
  178.         by DOS (see below).  The fields are as follows:
  179.  
  180.             Type        The block type.  There are only two block types,
  181.                         type M and type Z.  The last block in the
  182.                         chain is type Z, and all others are type M.
  183.  
  184.             MCB         The segment address of the Memory Control Block
  185.                         (sometimes known as an arena header).
  186.  
  187.             Addr        The segment address of the memory block itself.
  188.                         This is always equal to the MCB address plus
  189.                         one.
  190.  
  191.             Owner       The segment address of the program that "owns"
  192.                         the block of memory.  If this is 0000, the block
  193.                         is unallocated or "free".
  194.  
  195.             Para        The size of the block, in paragraphs (16 bytes).
  196.  
  197.             Bytes       The size of the block, in bytes.
  198.  
  199.         All numbers are hexadecimal except "bytes", which is decimal.
  200.  
  201.         The [pmap] suffix after an allocated block indicates that the
  202.         block is being used by PMAP.  When PMAP terminates, this block
  203.         will be free (unallocated).  The standard (non-Raw) PMAP display
  204.         understands this, and displays the map as if PMAP weren't there.
  205.  
  206.         If the /R switch is included, all other command line parameters
  207.         are ignored.
  208.  
  209.  
  210.         Expanded memory display
  211.         -----------------------
  212.  
  213.         If expanded (LIM-EMS, or EEMS) memory is present, PMAP always
  214.         displays EMS allocation as follows:
  215.  
  216.             Expanded memory summary:
  217.  
  218.                     Block      Size    Name
  219.                     -----    -------   ----
  220.                     0         589824   SYSTEM
  221.                     1         425984
  222.                     2          16384   CDIR
  223.                     3          65536   HINDSITE
  224.                     ...
  225.                     Free      327680
  226.                     Total    2097152
  227.                     Page frame segment: CC00h
  228.  
  229.         The NAME field will be present only if your expanded memory
  230.         manager supports the LIM 4.0 specification, and then only for
  231.         programs that have defined their names to the system.
  232.  
  233.         EMS memory uses a "page frame" that maps a 64K block (actually,
  234.         four 16K "pages") of EMS memory into standard 80x8x memory.
  235.         The segment to which this memory is mapped is also displayed.
  236.  
  237.         If you only want to display the expanded memory allocation, use
  238.         the /X switch.  To suppress the display of expanded memory, use
  239.         /S.
  240.  
  241.  
  242.         Device driver display
  243.         ---------------------
  244.  
  245.         If you execute PMAP with the /V switch, it will display a table
  246.         of information about your installed device drivers.  No other
  247.         data (i.e., no memory maps) are displayed when /V is selected.
  248.  
  249.         The first five columns of the table contain the following
  250.         fields:
  251.  
  252.             Name        If the device is a character device, the device
  253.                         name.  If it is a block device (like a disk),
  254.                         this will be "Blk (n)", where n is the number
  255.                         of units handled by this device.
  256.  
  257.             Address     The address where the device driver begins in
  258.                         memory, in standard hex segment:offset form.
  259.  
  260.             Size        The approximate size (in bytes, displayed in
  261.                         decimal) of the device driver.  See below.
  262.  
  263.             Strt        The entry point of the driver's strategy
  264.                         routine.  This is the hex offset within the
  265.                         device driver's segment (shown under ADDRESS).
  266.  
  267.             Intr        The entry point of the driver's interrupt
  268.                         routine.  This is the hex offset within the
  269.                         device driver's segment (shown under ADDRESS).
  270.  
  271.         The remaining columns are bit fields with the driver's attribute
  272.         record.  In each case, an asterisk indicates that the bit is
  273.         set (1), and a space indicates that it is reset (0).
  274.  
  275.             CHR         *    = this is a character device
  276.                         <sp> = this is a block device.
  277.  
  278.             IOC         *    = device supports IOCTL calls
  279.  
  280.             IBM    for block devices:
  281.                         *    = non-IBM format
  282.                    for character devices:
  283.                         *    = supports output-until-busy
  284.  
  285.             RMV         *    = supports removable media
  286.  
  287.             LOG         *    = supports Get/Set Logical Device
  288.  
  289.             CLK         *    = this is the clock device
  290.  
  291.             NUL         *    = this is the NUL device
  292.  
  293.             SOT         *    = this is this standard output device
  294.  
  295.             SIN    for block devices:
  296.                         *    = supports generic IOCTL
  297.                    for character devices
  298.                         *    = this is the standard input device
  299.  
  300.         Note that <space> inplies the opposite of <*>; for example, an
  301.         asterisk in IOC indicates that the device supports IOCTL calls,
  302.         while a space there indicates that IOCTL is not supported.
  303.  
  304.         Also note that DOS does not provide any documented way for
  305.         programs to find the chain of device drivers.  If PMAP is unable
  306.         to find the chain, it will tell you so.
  307.  
  308.  
  309.         Device driver size; order of list
  310.         ---------------------------------
  311.  
  312.         PMAP cannot reliably determine the size of the default devices
  313.         (CON, PRN, AUX, COM1, etc.) that are loaded automatically by
  314.         DOS.  These will all show an address beginning with "0070", and
  315.         their sizes will not be displayed.  However, if you load a
  316.         replacement for one of these devices (for example, ANSI.SYS
  317.         loads a replacement for CON), PMAP will generally be able to
  318.         determine and display its size.
  319.  
  320.         PMAP cannot determine the size of the last device loaded by
  321.         CONFIG.SYS.  If you wish to determine the size of the last
  322.         device, and your CONFIG.SYS loads more than one device, you can
  323.         determine its size by simply swapping the load order of the last
  324.         two devices in CONFIG.SYS and rebooting.
  325.  
  326.         The devices are shown in the order in which DOS searches for
  327.         them.  If there are two or more devices with the same name, the
  328.         one that DOS will use is the first one listed.  For example, you
  329.         will have two or more CON devices if you use ANSI.SYS; the
  330.         ANSI.SYS CON will be listed before the default CON.  DOS will
  331.         use the first one listed (ANSI.SYS).
  332.  
  333.  
  334.         Interrupt vectors
  335.         -----------------
  336.  
  337.         Many times interrupts are "intercepted" by more than one
  338.         resident program.  PMAP will only show a vector attached to the
  339.         LAST program that intercepted it.  For example, KBFIX2 shows
  340.         that it has intercepted vectors 8, 9, and 16.  However, RXINTMGR
  341.         and SDUMP could also have intercepted any or all of these three
  342.         vectors, and PMAP would not know about that.
  343.  
  344.         PMAP assumes that any vector that points into memory owned by a
  345.         program has been intercepted by that program.  That is not
  346.         always true, so you may occasionally see spurious vectors
  347.         attached to a program.
  348.  
  349.  
  350.         More about parents
  351.         ------------------
  352.  
  353.         Every program has a "parent"; if program B was executed by
  354.         program A, then A is B's parent.  In most cases, the parent will
  355.         be COMMAND.COM, because most PC programs are executed by
  356.         COMMAND.COM.
  357.  
  358.         However, any program can execute any other program (assuming
  359.         that there is sufficient memory, etc.).  This is how "shells"
  360.         work.  For example, current versions of WordPerfect and many
  361.         other programs allow you to "exit to DOS"; what they usually do
  362.         is execute COMMAND.COM, which then displays a DOS prompt and
  363.         allows you to enter any commands that you wish.  If you run
  364.         PMAP, you will see two copies of COMMAND.COM in memory.
  365.  
  366.         However, you may notice that the second copy of COMMAND.COM
  367.         shows COMMAND.COM as its parent.  Logically, you would expect
  368.         the parent to be (in this case) WordPerfect.  Unfortunately,
  369.         some versions of COMMAND.COM (the one that comes with DOS 3.2,
  370.         for example) fool around with the area of memory that PMAP uses
  371.         to find the parent's address; rather than having the parent's
  372.         address, COMMAND.COM puts its own address there.  In effect,
  373.         COMMAND.COM is always its own parent.
  374.  
  375.         In general, programs that allow you to execute other programs
  376.         can use one of two methods: they can execute the other programs
  377.         directly, or the can execute COMMAND.COM and ask it to run the
  378.         requested program.  If the former, PMAP will show the true
  379.         parent; if the latter, PMAP will show COMMAND.COM, and
  380.         COMMAND.COM will be its own parent.
  381.  
  382.         Here is part of a PMAP display that shows a direct-execution
  383.         under DOS 3.2:
  384.  
  385.             Addr  Program    Parent   Han  Blks    Size    Vectors
  386.             ----  -------   --------  ---  ----   -------  -------
  387.             ...
  388.             3222  xced      command     0     2     26016
  389.             387E  qe        xced        0     3     97232
  390.             503E  command   command     0     3      3488  22 23 24
  391.             ...
  392.  
  393.         The XCED program was run by COMMAND.COM (from the DOS prompt).
  394.         It then ran the program QE directly, i.e., without reloading
  395.         COMMAND.COM.  Finally, a "shell" exit was taken from QE, which
  396.         did reload COMMAND.COM; notice that COMMAND shows as its own
  397.         parent.
  398.  
  399.  
  400.         File handles
  401.         ------------
  402.  
  403.         The "Han" field of the standard memory display shows the number
  404.         of file handles that are associated with each program.  For the
  405.         most part, this field will be zero.  Some open handles may show
  406.         for programs that are active (for example, the active program
  407.         named "dbase" in the first example has 16 open files).
  408.  
  409.         You may see some resident programs that show one or more open
  410.         handles.  This usually occurs when you redirect the program's
  411.         start-up logo to NUL, and the program fails to close its
  412.         standard files before exiting back to DOS (it really shouldn't
  413.         be necessary, but it is).  These open handles may reduce the
  414.         number of files your application programs can have
  415.         simultaneously open.  We prefer not to redirect programs' logos
  416.         to NUL.  We save file handles; we get to see the names of the
  417.         nice people who wrote our software, and their copyrights; and we
  418.         don't lose the error messages that explain why the program isn't
  419.         doing what we thought it should.  Sounds like a bargain.
  420.  
  421.  
  422.         Multi-tasking/task-switching programs
  423.         -------------------------------------
  424.  
  425.         ... play havoc with the memory allocation chain.  PMAP may
  426.         not yield very much useful information under such programs.
  427.  
  428.  
  429.         DOS's memory allocation chain
  430.         -----------------------------
  431.  
  432.         This information is almost totally undocumented by Microsoft, so
  433.         take it for what's it's worth.  It's provided for informational
  434.         purposes only, and could vary from DOS version to DOS version.
  435.  
  436.         DOS (version 2.00 or later) manages memory as a chain of
  437.         "blocks".  Each block begins on a paragraph boundary, can be (in
  438.         theory) almost a megabyte in size, and is preceded immediately
  439.         by a 16-byte Memory Control Block (MCB), sometimes known as an
  440.         "arena header".  The lowest (the 80x8x interrupt vectors, BIOS
  441.         and DOS data areas, DOS itself, device drivers, etc.) and
  442.         highest (video buffers, ROM modules) portions of memory are not
  443.         mapped, but the rest of memory is.  Thus, memory can be pictured
  444.         like this:
  445.  
  446.             paragraph   contents
  447.             ---------
  448.               0000      low memory (unmapped)
  449.                         first MCB (16 bytes)
  450.                         first memory block
  451.                         next MCB
  452.                         next memory block
  453.                         ...
  454.                         last MCB
  455.                         last memory allocation block
  456.               nnnn      end of DOS memory (640K, for example)
  457.  
  458.         The address of the first MCB will vary, depending on your
  459.         version of DOS, and the number and size of device drivers,
  460.         buffers, stacks, etc., that you loaded via CONFIG.SYS.  In all
  461.         current versions of DOS (verified through 3.30), the segment
  462.         address of the first MCB can be obtained via DOS function 52H.
  463.         On return from this function, the address of the first MCB is
  464.         located at ES:[BX-2].  Here is sample code that returns the
  465.         address of the first MCB in AX:
  466.  
  467.             mov ah,52H
  468.             int 21H
  469.             mov ax,es:[bx-2]
  470.  
  471.         The MCB itself is a 16-byte region of memory that with fields as
  472.         follows:
  473.  
  474.             Offset  Size    Contents
  475.             ------  ----    --------
  476.             0       Byte    'M': this is not the last MCB
  477.                             'Z': this is the last MCB
  478.                             anything else: memory control blocks
  479.                             destroyed.  DOS will politely crash.
  480.  
  481.             1       Word    The segment address of the program that owns
  482.                             this block of memory (the program's PSP).
  483.  
  484.             3       Word    The size of the block, in paragraphs
  485.  
  486.             5-15            Reserved
  487.  
  488.         This structure provides all of the information needed to step
  489.         through the memory allocation chain.  A basic algorithm is as
  490.         follows:
  491.  
  492.             Set MCB = segment of first MCB (as described above)
  493.             Do Until byte (MCB:0) = 'Z'
  494.                 If byte (MCB:0) isn't 'M' or 'Z',
  495.                     Then there's a big problem, so abort
  496.                 Block_owner = word (MCB:1)
  497.                 Block_size = word (MCB:3)
  498.                 MCB = MCB + block_size + 1
  499.             End
  500.  
  501.         EMS and EEMS memory is not, of course, mapped by DOS.
  502.  
  503.         For more complete detail about DOS's memory allocation, see
  504.         "Managing Memory" by William J. Redmond in PC Tech Journal,
  505.         August, 1984 (Vol. 2, No. 2).
  506.  
  507.  
  508.         Version 1.34 (11/15/88)
  509.         -----------------------
  510.         Fixes a bug in 1.33 for resident programs that release their
  511.         environments under DOS 4.0.
  512.  
  513.         Version 1.33 (11/14/88)
  514.         -----------------------
  515.         Uses a new feature of DOS 4.0 to more reliably obtain names of
  516.         resident programs, including those installed via INSTALL.
  517.  
  518.         Version 1.31/1.32 (7/29/88)
  519.         -----------------
  520.         Displays number of open handles for each PSP.
  521.         Displays sizes of some devices (/V switch).
  522.         Improved display when too many vectors to fit on one line.
  523.         Fixed spurious errorlevel returned by successful run (32).
  524.  
  525.         Version 1.30
  526.         ------------
  527.         Adds /X, /S, and /? switches.
  528.         Adds device driver display (/V).
  529.         Displays names of EMS-users when available (LIM 4.0 only).
  530.         Allows wildcards in program-list.
  531.         Fixes problem with name of secondary copies of COMMAND.COM
  532.             under DOS 3.3 (it's not available).
  533.  
  534.         Version 1.26
  535.         ------------
  536.         Corrects a problem detecting extended memory with certain
  537.         versions of BIOS ROM.
  538.  
  539.         Version 1.25
  540.         ------------
  541.         Adds the extended memory display and the selective display
  542.         option.
  543.  
  544.         Corrects a minor problem with DOS 3.3.
  545.  
  546.         Version 1.21
  547.         ------------
  548.         Bug fixes to version 1.20:
  549.  
  550.         1. No more runaway display when EMS memory is present but none
  551.         of it is in use.
  552.  
  553.         2. PMAP is more careful about what it thinks is the name of the
  554.         command shell.
  555.  
  556.  
  557.         Copyright/License/Warranty
  558.         --------------------------
  559.  
  560.         This document and the program file PMAP.EXE ("the software") are
  561.         copyrighted by the author.  The copyright owner hereby licenses
  562.         you to: use the software; make as many copies of the program and
  563.         documentation as you wish; give such copies to anyone; and
  564.         distribute the software and documentation via electronic means.
  565.         There is no charge for any of the above.
  566.  
  567.         However, you are specifically prohibited from charging, or
  568.         requesting donations, for any such copies, however made; and
  569.         from distributing the software and/or documentation with
  570.         commercial products without prior permission.  An exception is
  571.         granted to not-for-profit user's groups, which are authorized to
  572.         charge a small fee (not to exceed $7) for materials, handling,
  573.         postage, and general overhead.  NO FOR-PROFIT ORGANIZATION IS
  574.         AUTHORIZED TO CHARGE ANY AMOUNT FOR DISTRIBUTION OF COPIES OF
  575.         THE SOFTWARE OR DOCUMENTATION, OR TO INCLUDE COPIES OF THE
  576.         SOFTWARE OR DOCUMENTATION WITH SALES OF THEIR OWN PRODUCTS.
  577.  
  578.         THIS INCLUDES A SPECIFIC PROHIBITION AGAINST FOR-PROFIT
  579.         ORGANIZATIONS DISTRIBUTING THE SOFTWARE, EITHER ALONE OR WITH
  580.         OTHER SOFTWARE, AND CHARGING A "HANDLING" OR "MATERIALS" FEE OR
  581.         ANY OTHER SUCH FEE FOR THE DISTRIBUTION.  NO FOR-PROFIT
  582.         ORGANIZATION IS AUTHORIZED TO INCLUDE THE SOFTWARE ON ANY MEDIA
  583.         FOR WHICH MONEY IS CHARGED.  PERIOD.
  584.  
  585.         There is no restriction on the use of this software in
  586.         commercial or institutional environments.
  587.  
  588.         No copy of the software may be distributed or given away without
  589.         this document; and this notice must not be removed.
  590.  
  591.         There is no warranty of any kind, and the copyright owner is not
  592.         liable for damages of any kind.  By using this free software,
  593.         you agree to this.
  594.  
  595.         The software and documentation are:
  596.  
  597.                        Copyright (C) 1986, 1987, 1988 by
  598.                             Christopher J. Dunford
  599.                             The Cove Software Group
  600.                                  P.O. Box 1072
  601.                            Columbia, Maryland 21044
  602.  
  603.                                 (301) 992-9371
  604.                         CompuServe 76703,2002 [IBMNET]
  605.  
  606.          ----------------end-of-author's-documentation---------------
  607.  
  608.                         Software Library Information:
  609.  
  610.                    This disk copy provided as a service of
  611.  
  612.                         The Public (Software) Library
  613.  
  614.          We are not the authors of this program, nor are we associated
  615.          with the author in any way other than as a distributor of the
  616.          program in accordance with the author's terms of distribution.
  617.  
  618.          Please direct shareware payments and specific questions about
  619.          this program to the author of the program, whose name appears
  620.          elsewhere in  this documentation. If you have trouble getting
  621.          in touch with the author,  we will do whatever we can to help
  622.          you with your questions. All programs have been tested and do
  623.          run.  To report problems,  please use the form that is in the
  624.          file PROBLEM.DOC on many of our disks or in other written for-
  625.          mat with screen printouts, if possible.  The P(s)L cannot de-
  626.          bug programs over the telephone.
  627.  
  628.          Disks in the P(s)L are updated monthly, so if you did not get
  629.          this disk  directly from the P(s)L,  you should be aware that
  630.          the files in this set may no  longer be the current versions.
  631.  
  632.          For a copy of the latest monthly software library newsletter
  633.          and a list of the 1,400+ disks in the library, call or write
  634.  
  635.                         The Public (Software) Library
  636.                               P.O.Box 35705 - F
  637.                            Houston, TX 77235-5705
  638.                                (713) 665-7017
  639.  
  640.