home *** CD-ROM | disk | FTP | other *** search
/ ftp.barnyard.co.uk / 2015.02.ftp.barnyard.co.uk.tar / ftp.barnyard.co.uk / cpm / walnut-creek-CDROM / CPM / CPR86 / CPR860.DOC < prev    next >
Text File  |  2000-06-30  |  24KB  |  521 lines

  1.                                 CPR86 
  2.  
  3.                 A CCP REPLACEMENT FOR CP/M86 or CP/M816
  4.  
  5. Written by Ken Brassler          Contact via Compuserve, CPMSIG  ID# 72345,46
  6.  
  7. =============================================================================
  8.  
  9. This CCP replacement has been tested on Compupro hardware, using the
  10. standard CP/M86 operating system from Digital Research, and also the
  11. proprietary CP/M816 operating system from Compupro. It is basically a
  12. subset of the commands offered in ZCPR2 (for the Z80 processor) written
  13. by Richard Conn. If the Compupro 8085/88 Dual Processor is used, CPR86
  14. will also manage the automatic loading and running of many 8 bit programs
  15. provided the necessary support software is available. (SW!.CMD)
  16.  
  17. CPR86 should work on any Computer running the standard CP/M86 operating
  18. system, such as the Z100, IBM PC (cp/m86), DEC Rainbow etc., however, such
  19. installations are left as an 'exercise for the student'. If it works I'd
  20. like to hear about it. If it doesn't work, there is little I can do to help.
  21.  
  22. Files required to install CPR86. The '?' will be replaced by a version number.
  23.  
  24. 1. CPR86?.DOC     This documentation
  25. 2. INSTL?.DOC     Installation proceedure and required patches.
  26. 3. CPR86?.BIN     Rename to CPR86.CMD after download from CIS.
  27. 4. OVL?.BIN       Rename to OVERLAY.CMD after download from CIS.
  28.           (note: .BIN file types are necessary on Compuserve only)
  29.  
  30. =============================================================================
  31.  
  32.                      CPR86 COMMAND DESCRIPTION
  33.  
  34.  
  35. 1.0 DISK/USER SWITCHING
  36.  
  37. Disk/user switching is identical to ZCPR2. Maximum user number = 31.
  38.  
  39. B15:     Go to disk B, user 15
  40. 3:       Go to user area 3 on the logged in disk.
  41. D:       Go to disk D in the current user area.
  42.  
  43. A disk/user command by itself is considered permanent, while a D/U appended
  44. to a filename is considered temporary.
  45.  
  46. TYPE D3:CPR860.DOC         Will read the file from D3, but return to the
  47.                            current D/U on program exit.
  48.  
  49. A possible exception to what you are used to is that DIR C3: will also log
  50. you into C3, so that a subsequent ERA command will always operate on the
  51. most recent directory. This login can be defeated with a simple patch
  52. to the OVERLAY.
  53.  
  54. It should be noted that transient programs, unless specifically written to
  55. do so, do not recognize the 'DU' format for user areas. For instance, PIP
  56. A0:=D1:CPR86.OVL, is an illegal command.
  57.  
  58. 1.1 DIRECTORY DISPLAY - DIR or DIRS
  59.  
  60. Each DIR request begins by clearing the screen. The emphasis is on no
  61. scrolling and hard disks with lots of entries. There are 5 filenames
  62. horizontally, rather than 4, and the display will stop after 20 lines are
  63. listed. A CR will continue the display. While waiting for the CR, the
  64. program is in BDOS function 10, so that ^C or even ^P will be recognized.
  65.  
  66. The filenames are listed alphabetically, in horizontal order. The DIR
  67. function is capable of displaying and alphabetizing 1024 directory entries,
  68. on each call.
  69.  
  70. If ^P is active when entering DIR, the clear screen function and the 20
  71. line auto-stop are defeated, to accomodate listing the complete directory.
  72.  
  73. 1.2 ERASE - ERA
  74.  
  75. The ERA function is highly modified. If no wildcards are used in the
  76. filename, the erase occurs as in normal CP/M. However, if wildcards are
  77. included, CPR86 automatically switches to a selective approach, where a 'y'
  78. has to be entered in response to EACH displayed filename. If a 'y' is
  79. entered, the cursor moves up and also erases the display from the console.
  80. If CR is entered alone, that particular file is not erased, and the name
  81. remains displayed on the console. Not functional, but cute. Entering an 'x'
  82. will exit the selective erase function before completion.
  83.  
  84. If wildcards are included, and you are certain at the outset that all
  85. files matching the description should be erased, a "c" (confirm) with
  86. a leading space can be appended to the command. With this format, all
  87. matching files will be erased without an intervening query. Example:
  88.  
  89. era cpr861.* c             The "c" confirms that no query is necessary.
  90.  
  91. The program is self prompting with a single prompt string at the top of the
  92. screen.
  93.  
  94. Be EXTREMELY careful that you do NOT enter:
  95.  
  96. ERA *.* C
  97.  
  98. Unless you are certain that you want to erase the entire directory without
  99. further query. If this does occur inadvertently, you'll have to use DU to
  100. restore the erased directory entries.
  101.  
  102. 1.3 RENAME - REN
  103.  
  104. The REN function is similiar to ERA, however, wildcards are allowed in the
  105. .TYP position ONLY. Again, a REN request with no wildcards results in a
  106. 'standard' rename format. With a "*" in the .TYP position of BOTH the new
  107. and old filename, the old .TYP is moved to the new .TYP before renaming.
  108. This is the only format allowed, and actually the only one necessary. This
  109. feature is intended solely for renaming a list of related files, such
  110. as .A86, .BAK, .LST, .SYM, .HEX. As a result, the command form is:
  111.  
  112. ren CPR861.*=CPR860.*      The "*" must be in both .TYP positions.
  113.  
  114. If the new name already exists on the disk, you will be given the choice
  115. of erasing the existing files, or aborting the request. NOTE: If the
  116. rename request has a wildcard in the .TYP position, ALL files with that
  117. name will be erased without further query.
  118.  
  119. As in ERA, a "c" may be appended to the command when wildcards are included
  120. to indicate that a query preceeding each rename is not necessary.
  121.  
  122. Command summary for REN and ERA:
  123.  
  124. <CR>              Do not erase or rename.
  125. <y> <CR>          Make the change.
  126. <x> <CR>          Exit selective function before normal completion.
  127.  
  128. 1.4 TYPE
  129.  
  130. TYPE will display a file of any length, one page at a time, with a page
  131. number at the bottom. You may scan backwards or forwards through the file,
  132. with only 16K in memory at any one time. When TYPEing .PRN files, line
  133. length is truncated to the screen width. Future commands are anticipated,
  134. and disk reads occur while you are reading the page, so normally, no delay
  135. is encountered when a command is entered. The initial page is displayed as
  136. soon as there is enough data in the buffer to fill a screen, so the initial
  137. delay is minimal.
  138.  
  139. In order to type Wordstar files, only CR, LF, and TAB are passed to conout.
  140. All other control characters are filtered out. In addition,  the high bits
  141. (if any) are stripped from each character. I don't know if this will have
  142. any bad side effects or not, since I don't use Wordstar.
  143.  
  144. If ^P is in effect when TYPE is called, the function changes to a direct
  145. disk to printer dump. Form feeds are now passed to the printer, to
  146. accomodate files which have them embedded. Paging, page numbers, and line
  147. width truncation are defeated. The listing is displayed on the console.
  148.  
  149. If ^P is not in effect when TYPE is called, it can then be toggled on and
  150. off in a normal manner to list individual pages, however, the printer listing
  151. will be identical to the normal screen display.
  152.  
  153. The TYPE commands are:
  154.  
  155. <CR>      A carriage return by itself defaults to +1 page.
  156. <+n><cr>  Move n pages ahead and display it. Defaults to 1 if n not used.
  157. <-n><cr>  Move n pages back and display it. Defaults to 1 if n not used.
  158. <Pn><cr>  Go directly to page number "n" and display it.
  159. <x><cr>   Exit program.
  160.  
  161. All command errors default to +1 page.
  162.  
  163. The absolute page command (Pn) will incur some delay if the requested page
  164. is not in the 16K buffer.
  165.  
  166. 1.5 SET SEARCH PATH - SETP
  167.  
  168. A default search path for locating transient programs is fixed within
  169. the program during initial installation, and may include up to 5 'DU'
  170. stops. Note this path is valid only for locating the transient program,
  171. and not for the secondary filename sent to the transient. The secondary
  172. file is loaded by the transient program, not CPR86, and will not recognise
  173. the 'DU' format unless specifically written to do so.
  174.  
  175. For example, the command VEDIT FOO.ASM, will search for VEDIT along the path,
  176. but FOO.ASM must be located in the logged in 'DU'. If the transient program
  177. supports a disk switch in the command tail (most all do) then VEDIT B:FOO.ASM
  178. will look for FOO.ASM on disk B, current user. VEDIT B3:FOO.ASM will fail
  179. because VEDIT does not recognize the form 'B3:'.
  180.  
  181. The command SETP allows modifying the default search path during program
  182. execution. The path stops are entered in the normal DU form, except
  183. that 'logged in D or U' can be specified by entering $ in either location.
  184. Again, a maximum of 5 DU stops are allowed. A valid example is:
  185.  
  186. $0 A$ A0 D0 C0 <cr>
  187.  
  188. This translates to, 1. Logged disk, user 0.
  189.                     2. Disk A, logged user
  190.                     3. Disk A, user 0
  191.                     4. Disk D, user 0
  192.                     5. Disk C, user 0
  193.  
  194. The path always begins at the logged in DU, so the form $$ is redundant.
  195.  
  196. Command lines with more than 5 stops will be truncated to the first 5
  197. stops.
  198.  
  199. Entering only a <cr> will erase the entire path. Any errors in formatting
  200. the path will produce an error message, and also erase the entire path.
  201.  
  202. The original default path will be in effect after any cold boot.
  203.  
  204. 1.6 BATCH PROCESSING - ZIP
  205.  
  206. The ZIP command is an enhanced version of SUBMIT which allows all required
  207. program inputs to be retrieved from a disk file, rather than just the basic
  208. command line. Replacement text strings can be passed to the batch file
  209. by including them in the original command tail. Also, a pause function is
  210. supported which stops execution of the batch file and allows the operator
  211. to continue or abort the session. The normal SUBMIT function is not
  212. available with CPR86.
  213.  
  214. To use this function, a file of type .ZIP must first be created with your
  215. editor that contains the exact sequence of terminal inputs that are required
  216. by the program or series of programs. Each input statement must occupy a
  217. separate line in the file. Comment statements are allowed within the file 
  218. at the CCP level, provided they originate at the start of a line.
  219.  
  220. There are 2 special characters recognized by ZIP as program control functions
  221. that cannot be used as part of a filename or command line, unless, of course,
  222. that particular function is desired.
  223.  
  224. 1. "~" (7EH) when encountered in the batch file causes ZIP to halt execution
  225.    pending operator input to continue or abort the session.
  226.  
  227. 2. "\" (5CH) directs ZIP to retrieve a statement from the original ZIP
  228.    command tail. The actual form is "\n" where n = 1 through 9, corresponding
  229.    to the first through ninth character string of the command tail, which
  230.    are separated by a SINGLE space.
  231.  
  232. Examples:
  233.  
  234. A common repetitive task is creating a new system disk. The following batch
  235. file named NEWDISK.ZIP will perform the complete task when the command
  236. ZIP NEWDISK is entered. The example given uses the special Compupro versions
  237. of Format and Sysgen. Comments used here are NOT allowed in the actual file.
  238.  
  239. format                     ;Load the format program
  240. b                          ;Format asks which drive?
  241. 3                          ;Format asks bytes per sector (1024)
  242. y                          ;Format asks ready on B:?
  243. n                          ;Format asks continue?
  244. sysgen88 d:loader.cmd      ;Load sysgen with loader.cmd on drive D:
  245. b                          ;Sysgen asks drive?
  246.                            ;A blank line in the file simulates a CR
  247.                            ;2 CR's are required by Sysgen to confirm ready
  248. pip                        ;Load PIP
  249. b:=a:cpm.sys[v             ;Copy the system file
  250. b:=a:overlay.cmd[v         ;Copy the overlay
  251.                            ;CR to exit pip
  252. dir b:                     ;Confirm completion. ZIP will end when EOF is
  253.                            ;encountered
  254.  
  255.  
  256. When using a hard disk, a common task is to make back-up copies of files
  257. on a floppy disk in drive B. The following file named BACKUP.ZIP uses
  258. command tail strings to fill in the required PIP format.
  259.  
  260. b0:                        ;log in drive B, user 0
  261. pip b:=\2:\1.A86[vg\3      ;\1, \2, \3 are filled from command tail
  262.  
  263. For example, enter the command:
  264. zip backup cpr* d 3        ;Note SINGLE spaces are required between command
  265.                            ;tail strings.
  266.  
  267. And the resulting PIP entry will be:
  268.  
  269. pip b:=D:CPR*.a86[vg3
  270.  
  271. The mixture of upper and lower case is shown only to point out that command
  272. tail strings are translated to upper case by normal program flow before
  273. being returned as part of the batch file command.
  274.  
  275. When doing program development, the repetitive task of assembling and
  276. generating a command file can be replaced by a ZIP function. In this
  277. case, you would not want to continue the batch process if errors are
  278. reported by the assembler. The PAUSE function (~) is used to halt the
  279. batch process and query the operator whether to continue or abort the
  280. session. The following ZIP file is used in the development of CPR86, and
  281. accomplishes the complete installation from assembling a new source file
  282. to patching the resulting CMD file. Again, comments are NOT allowed in
  283. the actual file.
  284.  
  285. asm86 cpr863 $pz sz        ;Assemble the source code.
  286. ~                          ;Pause - Are there any errors?
  287. gencmd cpr863 8080         ;No errors, generate a CMD file.
  288. a0:                        ;Log in system disk.
  289. pip a:=d:cpr863.cmd[vg1    ;Copy CMD file to system disk.
  290. ddt86                      ;Load DDT86
  291. rcpr863.cmd                ;Read the CMD file.
  292. rcpm.sys                   ;Read CPM.SYS.
  293. f4cb:80,0a7f,00            ;Erase the current CCP.
  294. m42b:80,09ff,4cb:80        ;Replace it with the new CPR86.
  295. ~                          ;Pause - Were the memory references correct?
  296. wcpm.sys                   ;Yes, write a new CPM.SYS file.
  297.  
  298. A special problem occurs with DDT86 patching that can only be overcome
  299. by trial and error. The memory references required by the Fill (f) and
  300. Move (m) command will vary based on the length of the files read by DDT86,
  301. and also the length of the ZIP file which also occupies memory space
  302. during the patching process. Therefore, these memory addresses will be
  303. different under ZIP, then if the process were acomplished manually.
  304.  
  305. The solution is to run the process under ZIP up to the second pause, note
  306. the load addresses reported by DDT86, then change the ZIP file to reflect
  307. the correct addresses. DDT86 will always read a file to an 80H boundary,
  308. so as the length of the source file grows, it will only be necessary to
  309. again modify the patch addresses after each additional 80H of code is
  310. generated. This could become tedious during the early stages of program
  311. development, but after the source code is somewhat stabilized, it is
  312. well worth the effort.
  313.  
  314. Control characters can be included in a batch file simply by using the
  315. form ^C or ^c. Unfortunately, ^characters meant to be recognized by the
  316. CP/M86 operating system, such as ^C and ^P, will NOT be recognized when
  317. they originate from a batch file. The structure of CP/M86 requires that
  318. these characters enter the program through the BIOS CONIN function, which
  319. cannot be duplicated by ZIP. (or SUBMIT)
  320.  
  321. 1.7  AUTOMATIC PROCESSOR SWITCHING
  322.  
  323. For systems using the Compupro 8085/8088 dual processor CPU, and CP/M816
  324. operating system from Compupro, CPR86 provides the additional feature of
  325. searching the 'path' for SW!.CMD, and also searching the 'path' for the
  326. requested 8 bit .COM program. 
  327.  
  328. To decide which processor is required, CPR86 performs the following steps.
  329.  
  330. 1. Search for a .CMD file with the requested program name along the preset
  331.    search path, and if found, load the program.
  332. 2. Search for a .COM file with the requested program name along the preset
  333.    search path, and if found, record the disk number where it resides.
  334. 3. If the requested program is not located as a .CMD or .COM file, an
  335.    error message is displayed, and CPR86 returns to the function prompt.
  336. 4. If a .COM file is found, CPR86 searches the preset path for the program
  337.    SW!.CMD and if found, loads the program.
  338. 5. The original program request is passed to SW!.CMD, and in addition, the
  339.    disk where the .COM file was found is inserted in the primary default
  340.    file control block as an auto-disk select command.
  341. 6. SW!.CMD then loads and runs the .COM file using the 8085 processor.
  342.  
  343. SW!.CMD does not have the ability to cross user boundries, therefore it will
  344. attempt to load the .COM file from the logged in user area, but on the disk
  345. located by the search path. If the .COM file was located at path stop A2,
  346. and you are currently logged into B3, SW! will not be able to locate the
  347. file.
  348.  
  349. However, CP/M86 automatically inserts an additional path stop by looking
  350. for a .SYS (invisible) file in user area 0. Therefore, if all .COM utility
  351. programs are stored as .SYS files in user 0, they WILL be found by SW!
  352. from any logged in DU location, provided that disk is on the search
  353. path.
  354.  
  355. SW! requires a complete 64K block of memory, aligned at a 64K boundry, in
  356. order to operate. So normally, a minimum of 128K is required. Unfortunately,
  357. OVERLAY.CMD is loaded by the CP/M memory manager to the very top of memory,
  358. which, in a 128K system, will occupy part of the 64K block required by SW!.
  359. Currently OVERLAY.CMD is less than 4K long, but to be safe, a minimum of
  360. 136K memory is required to run CPR86 and SW!.
  361.  
  362. 1.7 COMMAND CHAINING
  363.  
  364. Multiple commands are supported when separated by a semi-colon. Multiple
  365. commands for transient programs are also supported, however, command
  366. chaining after the transient is only possible if the program returns to
  367. CP/M via a RETF (return far) instruction. It is impossible to control the
  368. program flow if the program terminates with a BDOS function 0 call. As
  369. a result, chaining of transient programs should be done using ZIP and a
  370. batch file.
  371.  
  372. This function was added at the insistance of others, only because ZCPR2
  373. has it. I find it totally useless, and considered not even mentioning it
  374. in this documentation. If you find it useful, then use it. If you would
  375. like it to do more, forget it.
  376.  
  377. 1.8  FIND - SEARCH HARD DISK FOR AN AMBIGUOUS FILENAME
  378.  
  379. FIND will scan the entire hard disk, from user 0 through user 15, on
  380. each logical drive. (note users 16 through 31 are not included - it
  381. took too long) The beginning and ending disk reference must be patched
  382. in OVERLAY.CMD.
  383.  
  384. SYNTAX
  385.          find filename.typ
  386.  
  387.          find cpr*.*       all files beginning with CPR
  388.          find *.a86        all files of type .A86
  389.          find ed.com       locate all duplicate files
  390.  
  391. PROGRAMMERS NOTES
  392.  
  393. CPR86 maintains a stack area at least 64 levels deep (128 bytes). The
  394. standard CCP stack area is 48 levels. Therefore, with either system,
  395. it should not be necessary to set up a local stack when writing a transient
  396. program unless some peculiar stack operations are planned. Also, when
  397. using the CPR86 stack, the stack segment register (SS) always points to
  398. the base of CPR86 which is also the base segment of the CP/M86 operating
  399. system. Sometimes, knowing where the system is located is very useful
  400. information.
  401.  
  402. Software interrupt 10 (INT 10) is used by CPR86 for calls to the
  403. OVERLAY.
  404.  
  405. ==========================================================================
  406.  
  407. COMMAND SUMMARY AND EXAMPLES
  408.  
  409. c30:              Log into disk c, user 30.
  410. dir               Display directory of logged in DU. (Disk/User)
  411. dirs              Display system files of logged in DU.
  412. dir b3:           Display disk b user 3 directory, and log into b3.
  413. dir a1:; dir a2:; dir a3:; a0:
  414.                   Display directories for a1,a2, and a3, log into a0.
  415. dir c5:a*.*       Display all files on c5 beginning with the letter A.
  416.                   All wildcards described in the CP/M documentation are
  417.                   supported.
  418.  
  419. ren cpr861.a86=cpr860.a86  (or)
  420. ren cpr861.a86 < cpr860.a86
  421.                   The file is renamed to cpr861.a86
  422. ren cpr861.*=cpr860.*
  423.                   All file types named cpr860 are changed to cpr861 with a
  424.                   query before each change is made.
  425. ren cpr861.*=cpr860.* c
  426.                   Same as above except no query is given.
  427. ren a5:cpr861.a86 = cpr860.a86
  428.                   The rename occurs on A5, then returns to the logged
  429.                   in DU.
  430.  
  431. era cpr860.lst    The file is erased.
  432. era cpr860.*      All file types with name cpr860 are displayed, and
  433.                   the option to erase or skip each individual file is
  434.                   given.
  435. era cpr860.* c    Same as above except the option to skip is not given.
  436. era *.*           Display all files in the directory with the option to
  437.                   skip or erase.
  438. era *.* c         The entire directory is erased without further query.
  439. era a5:cpr860.*   Function occurs on DU a5, then returns to logged in DU.
  440.  
  441. find cpr*.*       The entire hard disk will be scanned for all files
  442.                   beginning with CPR. They will be displayed along with
  443.                   the DU where they are located.
  444.  
  445. COMMANDS THAT DO NOT WORK
  446.  
  447. ren cpr???.a86 = cpr???.a86
  448.                   Wildcards allowed in .TYP position only
  449. ren cpr862.* = cpr861.a86
  450.                   Must have * in both .TYP positions
  451. ren cpr862.a86 = b0:cpr861.a86
  452.                   The DU in the second file name is ignored.
  453.  
  454. ============================================================================
  455.  
  456. THINGS THAT MIGHT BE DONE BETTER IN FUTURE RELEASES  (bugs?)
  457.  
  458. 1. There is no way to abort ZIP from the keyboard. I've tried, but any
  459. scheme I've come up with so far also puts restrictions on ZIP operation.
  460. I suggest liberal use of the pause command until the .ZIP file is
  461. debugged. ZIP, by it's very nature, has no error trapping. Like an
  462. editor, ZIP will do whatever you tell it to, without trying to decide
  463. if it's reasonable or not.
  464.  
  465. 2. I have come across a bug in TYPE where it will hang if a TAB character
  466. immediately preceedes a CRLF. (sometimes) If this happens to you, edit
  467. the file to remove the TAB.
  468.  
  469. 3. CPR86 and OVERLAY.CMD have interrupts ENABLED! I use CPR86 with an
  470. interrupt driven BIOS supplied by Tom Lanier. If you get 'Wild interrupt'
  471. messages, and are not running interrupt driven, you must change your
  472. BIOS to properly initialize the 8259 interrupt controllers, and have
  473. ALL interrupts masked off.
  474.  
  475. 4. Software interrupt 10 is used for all calls to the OVERLAY. This may
  476. conflict with the operating system on computers other than Compupro.
  477.  
  478. 5. If using the Compupro Dual Processor and SW!.CMD, keep in mind that
  479. CPR86 only loads SW!.CMD and then passes to it the name of the program
  480. you requested. SW! actually runs the program, and there are several
  481. programs that SW! won't handle. (there are also several versions of SW!
  482. floating around) I don't have the source to SW!, and can't support any
  483. problems you may have. If you do have a problem, try entering the
  484. command: SW! FOO.BAR. With this form, CPR86 is completely out of the
  485. picture.
  486.  
  487. 6. You cannot chain ZIP commands. ZIP STARTUP;ZIP PROFILE will not
  488. work.
  489.  
  490. ===========================================================================
  491.  
  492. I greatfully acknowledge the assistance of Charlie Strom, Paul Homchick and
  493. Bob Thrush who acted as beta test sites, and suggested many of the features
  494. included in CPR86.
  495.  
  496. I certainly hope that many of you will be able to use and enjoy the
  497. additional flexibility of the CPR86 interface with CP/M86 and CP/M816.
  498. For those who will attempt to install CPR86 on computers other than
  499. Compupro, I will be happy to hear about your success, and willing to
  500. discuss your failures, on Compuserve, CPM interest group (CP-MIG or
  501. CPMSIG, whatever the current name is). Telephone calls to my home are
  502. NOT solicited.
  503.  
  504. I do not believe that donating a program to the Public Domain incurs an
  505. implied responsibility to support that program in the future, or even
  506. to fix bugs that may show up, due to someones individual operating
  507. habits. I will keep track of all reported bugs, however, and future
  508. releases, if any, will attempt to correct all of them. The source code
  509. for CPR86.CMD and OVERLAY.CMD is not available for distribution.
  510.  
  511. On the other hand, I do not believe you can "give your program away, and
  512. have it too". If you want to incorporate CPR86 into some commercial
  513. venture, you have my blessing and permission. However, I have no intention
  514. of becomming a free programmer for someones commercial venture - thus
  515. my reluctance to guarantee support.
  516.  
  517. Now that you've waded through my disclaimer, I sincerely hope that you
  518. find CPR86 a welcome addition to your box of computer tools.
  519.  
  520. end CPR86.DOC
  521.