home *** CD-ROM | disk | FTP | other *** search
/ Black Box 4 / BlackBox.cdr / progbas / pbclon18.arj / PBCLONE1.MAN < prev    next >
Text File  |  1992-05-08  |  142KB  |  4,151 lines

  1. Name  : AddMatI              (Add Matrix Integer)
  2. Class : Array management
  3. Level : Any
  4.  
  5. This routine adds an integer to as many elements of an integer
  6. array as you like, starting at a specified place in the array.
  7. It can also be used to subtract (just specify a negative
  8. value).  If there was a numeric overflow at any point in the
  9. operation, an error code will be returned.
  10.  
  11.    AddMatI DSeg%, DOfs%, Elements%, Value%, ErrCode%
  12.  
  13. DSeg%      segment of the first array element to add
  14. DOfs%      offset of the first array element to add
  15. Elements%  number of array elements to which to add
  16. Value%     value to add to each array element
  17. -------
  18. ErrCode%   error code: 0 if no error
  19.  
  20. Name  : AddMatL              (Add Matrix Long integer)
  21. Class : Array management
  22. Level : Any
  23.  
  24. This routine adds a long integer to as many elements of an long
  25. integer array as you like, starting at a specified place in the
  26. array.  It can also be used to subtract (just specify a
  27. negative value).  If there was a numeric overflow at any point
  28. in the operation, an error code will be returned.
  29.  
  30.    AddMatL DSeg%, DOfs%, Elements%, Value&, ErrCode%
  31.  
  32. DSeg%      segment of the first array element to add
  33. DOfs%      offset of the first array element to add
  34. Elements%  number of array elements to which to add
  35. Value&     value to add to each array element
  36. -------
  37. ErrCode%   error code: 0 if no error
  38.  
  39. Name  : AllExtMem&           (All Extended Memory)
  40. Class : Equipment
  41. Level : Clone (AT)
  42.  
  43. This routine returns the amount of extended memory installed in
  44. the system, as reported by the power-on self-test (POST)
  45. routine at boot time.  This does not tell you how much extended
  46. memory is actually available, since extended memory may be
  47. carved up by users of BIOS-level extended memory or XMS memory,
  48. converted to expanded memory, etc.  It only tells you the
  49. amount of physical extended memory that is installed.
  50.  
  51. Do not use this routine on PC/XT machines. It is only for
  52. AT-class computers.
  53.  
  54.    TotalKb& = AllExtMem&
  55.  
  56. -------
  57. TotalKb&      kilobytes of extended memory installed
  58.  
  59. Name  : AltKey               (Alt Key)
  60. Class : Input
  61. Level : Any
  62.  
  63. This routine works in conjunction with a key input routine,
  64. such as INKEY$ or the CheckKey and GetKey routines.  Given the
  65. ASCII code and scan code of a key, AltKey returns the
  66. associated key letter, if any.  For instance, it returns "A" if
  67. you pass it ASCII code 0 and scan code 30, because those codes
  68. represent Alt-A.
  69.  
  70.    AltKey ASCIICode%, ScanCode%, Ky$
  71.  
  72. ASCIICode%   ASCII code of the key
  73. ScanCode%    scan code of the key
  74. -------
  75. Ky$          associated key letter ("" if none)
  76.  
  77. Name  : AndSt                (AND String)
  78. Class : String
  79. Level : Any
  80.  
  81. This routine ANDs each byte in one string with the
  82. corresponding byte in a second string.  The strings must be the
  83. same length.
  84.  
  85.    AndSt St1$, St2$
  86.  
  87. St1$      string to AND
  88. St2$      string to AND with
  89. -------
  90. St1$      result
  91.  
  92. Name  : Any2Dec              (Any to Decimal)
  93. Class : Numeric
  94. Level : Any
  95.  
  96. This routine converts a number in any base to a normal (base
  97. 10) integer.  It works like the &H and &O prefixes in BASIC,
  98. but rather than working only in hexadecimal (base 16) and octal
  99. (base 8), it can be used for binary, octal, or almost anything
  100. else.
  101.  
  102. If you specify base 10, you can use this routine to convert a
  103. signed integer (0-65,535) to a normal integer.
  104.  
  105.    Any2Dec Number$, NrBase%, DecNr%, ErrCode%
  106.  
  107. Number$   any-base number to convert to an integer
  108. NrBase%   number base to convert from
  109. -------
  110. DecNr%    resulting integer
  111. ErrCode%  error code: 0 if no error
  112.  
  113. Name  : AscI%                (ASC Integer)
  114. Class : String
  115. Level : Any
  116.  
  117. This is a replacement for the ASC function provided by BASIC.
  118. It is smaller than ASC, however, and also somewhat faster.
  119.  
  120. Unlike BASIC or ProBas, the PBClone AscI function returns -1 as
  121. an error condition if you try to use it on a null string.  This
  122. convention owes its origin to the similar routine in Crescent's
  123. libraries.
  124.  
  125.    Value% = AscI%(St$)
  126.  
  127. St$        string for which to return ASCII code
  128. -------
  129. Value%     code of the first string char or -1 if null string
  130.  
  131. Name  : BarMenu              (Bar Menu)
  132. Class : Input
  133. Level : Clone
  134.  
  135. This is a bar menu routine.  It allows the user to select one
  136. of a list of items given on a single menu row or "bar".  The
  137. current item is highlighted in your choice of colors; user
  138. selection can be done either by moving this highlight and
  139. pressing return or by entering the letter associated with the
  140. desired item.  Only text mode is supported.
  141.  
  142. The highlight may be moved with the left and right arrow keys,
  143. tab and backtab, or space and backspace.  Selection is done
  144. with <CR>, the enter key.
  145.  
  146. The letter used to select an item is the first character of the
  147. item that is not lowercase or a space.  If the item is all
  148. lowercase, the first character of the item will be used.  For
  149. example, suppose you want the user to select one of "list" or
  150. "log".  By passing the options to BarMenu as "List" and "lOg",
  151. you allow the user to press "L" for "List" and "O" for "lOg".
  152.  
  153. The user's choice will be returned to you as a number, with the
  154. first choice being numbered 1.  If <ESC> was pressed, 0 will be
  155. returned.
  156.  
  157.    BarMenu Pick$(), Row%, LCol%, RCol%, Attr%, HiAttr%, Prompt$
  158.  
  159. Pick$()       list of items to choose from
  160. Row%          row on which to display the bar
  161. LCol%         leftmost column of the bar
  162. RCol%         rightmost column of the bar (use -1 for autosize)
  163. Attr%         bar color/attribute (see CalcAttr)
  164. HiAttr%       bar highlight color/attribute (see CalcAttr)
  165. Prompt$       prompt text (displayed at left side of the bar)
  166. -------
  167. Row%          # of the chosen item (1-items, or 0 if <ESC>)
  168.  
  169. Name  : BarMenuM             (Bar Menu with Mouse)
  170. Class : Input, Mouse
  171. Level : Clone
  172.  
  173. This is a bar menu routine.  It functions just like BarMenu,
  174. but supports the use of a mouse as well as the keyboard.  Make
  175. sure the mouse cursor is visible before calling this routine!
  176.  
  177.    BarMenuM PickList$(), Row%, LeftCol%, RightCol%, Attr%,
  178.       HiAttr%, Prompt$, Mouse%, ShowCursor%
  179.  
  180. PickList$()   list of items to choose from
  181. Row%          row on which to display the bar
  182. LeftCol%      leftmost column of the bar
  183. RightCol%     rightmost column of the bar (use -1 for auto-sizing)
  184. Attr%         bar color/attribute (see CalcAttr)
  185. HiAttr%       bar highlight color/attribute (see CalcAttr)
  186. Prompt$       prompt text (displayed at the left side of the bar)
  187. Mouse%        whether a mouse is available (0 no)
  188. ShowCursor%   not used
  189. -------
  190. Row%          number of the chosen item (1-items, or 0 if <ESC>)
  191.  
  192. Name  : Bickel               (Bickel comparison)
  193. Class : String
  194. Level : Any
  195.  
  196. A string comparison routine, Bickel allows you to see how
  197. closely two strings match.  The better the match, the larger
  198. the returned value will be.  Since there is no constant minimum
  199. or maximum value, this routine is best used for applications
  200. involving dictionary searches.  You would scan the dictionary
  201. and make a list of the best matches.  This is appropriate for a
  202. spelling checker, for instance.
  203.  
  204.    Bickel St1$, St2$, Result%
  205.  
  206. St1$      first string to compare
  207. St2$      second string to compare
  208. -------
  209. Result%   resulting "match magnitude" value
  210.  
  211. Name  : BigPrint             (Big Print)
  212. Class : Display
  213. Level : BIOS
  214.  
  215. As the name suggests, this routine displays text in large
  216. characters.  How large?  Eight times as high and as wide as
  217. normal!  Each "big character" will be composed of many
  218. normal-sized characters.  You may choose the normal character
  219. used to create the big characters (the default is a CHR$(219)
  220. solid block character, if you pass a null string here).
  221.  
  222. You should avoid using CHR$(128) to CHR$(255) when in either of
  223. the CGA graphics modes, as many CGAs are unable to display
  224. these characters when in graphics mode.
  225.  
  226.    BigPrint St$, FormCh$, Row%, Column%, Attr%
  227.  
  228. St$       string to display in big characters
  229. FormCh$   character used to compose the big characters
  230. Row%      starting row
  231. Column%   starting column
  232. Attr%     color/attribute of big characters (see CalcAttr)
  233.  
  234. Name  : BinSeekD             (Binary Seek Double precision)
  235. Class : Array management
  236. Level : Any
  237.  
  238. This routine uses binary search techniques to locate a specific
  239. number in a sorted double-precision array.  Each number in the
  240. array must be unique (no duplicates) for this to work.  This is
  241. a very, very fast routine and is especially handy for look-up
  242. tables.
  243.  
  244. The array is expected to begin at element 1.  You may specify
  245. the maximum element to search, allowing use of only part of an
  246. array.
  247.  
  248. A single number is returned in Posn%.  If Posn% is greater than
  249. zero, the target number was found and Posn% is the position in
  250. the array where it was found.  If Posn% is negative, the target
  251. number was not found, but it could be inserted into the array
  252. at the -Posn% element.  If the number is zero, the target
  253. number was not found and there is no room in the array to add
  254. any more values.
  255.  
  256.    BinSeekD Array#(), Elements%, Target#, Posn%
  257.  
  258. Array#()    array of sorted, unique values to search
  259. Elements%   maximum array element to search
  260. Target#     value to look for
  261. -------
  262. Posn%       whether and where the target was found (see above)
  263.  
  264. Name  : BinSeekI             (Binary Seek Integer)
  265. Class : Array management
  266. Level : Any
  267.  
  268. This routine uses binary search techniques to locate a specific
  269. number in a sorted integer array.  Each number in the array
  270. must be unique (no duplicates) for this to work.  This is a
  271. very, very fast routine and is especially handy for look-up
  272. tables.
  273.  
  274. The array is expected to begin at element 1.  You may specify
  275. the maximum element to search, allowing use of only part of an
  276. array.
  277.  
  278. A single number is returned in Posn%.  If Posn% is greater than
  279. zero, the target number was found and Posn% is the position in
  280. the array where it was found.  If Posn% is negative, the target
  281. number was not found, but it could be inserted into the array
  282. at the -Posn% element.  If the number is zero, the target
  283. number was not found and there is no room in the array to add
  284. any more values.
  285.  
  286.    BinSeekI Array%(), Elements%, Target%, Posn%
  287.  
  288. Array%()    array of sorted, unique values to search
  289. Elements%   maximum array element to search
  290. Target%     value to look for
  291. -------
  292. Posn%       whether and where the target was found (see above)
  293.  
  294. Name  : BinSeekL             (Binary Seek Long integer)
  295. Class : Array management
  296. Level : Any
  297.  
  298. This routine uses binary search techniques to locate a specific
  299. number in a sorted long integer array.  Each number in the
  300. array must be unique (no duplicates) for this to work.  This is
  301. a very, very fast routine and is especially handy for look-up
  302. tables.
  303.  
  304. The array is expected to begin at element 1.  You may specify
  305. the maximum element to search, allowing use of only part of an
  306. array.
  307.  
  308. A single number is returned in Posn%.  If Posn% is greater than
  309. zero, the target number was found and Posn% is the position in
  310. the array where it was found.  If Posn% is negative, the target
  311. number was not found, but it could be inserted into the array
  312. at the -Posn% element.  If the number is zero, the target
  313. number was not found and there is no room in the array to add
  314. any more values.
  315.  
  316.    BinSeekL Array&(), Elements%, Target&, Posn%
  317.  
  318. Array&()    array of sorted, unique values to search
  319. Elements%   maximum array element to search
  320. Target&     value to look for
  321. -------
  322. Posn%       whether and where the target was found (see above)
  323.  
  324. Name  : BinSeekS             (Binary Seek Single precision)
  325. Class : Array management
  326. Level : Any
  327.  
  328. This routine uses binary search techniques to locate a specific
  329. number in a sorted single-precision array.  Each number in the
  330. array must be unique (no duplicates) for this to work.  This is
  331. a very, very fast routine and is especially handy for look-up
  332. tables.
  333.  
  334. The array is expected to begin at element 1.  You may specify
  335. the maximum element to search, allowing use of only part of an
  336. array.
  337.  
  338. A single number is returned in Posn%.  If Posn% is greater than
  339. zero, the target number was found and Posn% is the position in
  340. the array where it was found.  If Posn% is negative, the target
  341. number was not found, but it could be inserted into the array
  342. at the -Posn% element.  If the number is zero, the target
  343. number was not found and there is no room in the array to add
  344. any more values.
  345.  
  346.    BinSeekS Array!(), Elements%, Target!, Posn%
  347.  
  348. Array!()    array of sorted, unique values to search
  349. Elements%   maximum array element to search
  350. Target!     value to look for
  351. -------
  352. Posn%       whether and where the target was found (see above)
  353.  
  354. Name  : BinSeekSt            (Binary Seek String)
  355. Class : Array management
  356. Level : Any
  357.  
  358. This routine uses binary search techniques to locate a specific
  359. string in a sorted string array.  Each string in the array must
  360. be unique (no duplicates) for this to work.  This is a very,
  361. very fast routine and is especially handy for look-up tables.
  362.  
  363. The string array is expected to begin at element 1.  You may
  364. specify the maximum element to search, allowing use of only
  365. part of an array.  You must specify whether capitalization
  366. matters-- set CapsCount% to 0 if it doesn't.
  367.  
  368. A single number is returned in Posn%.  If the number is greater
  369. than zero, the target string was found, and the number is the
  370. position in the array where it was found.  If the number is
  371. negative, the target string was not found, but it could be
  372. inserted into the array at the -Posn% element.  If the number
  373. is zero, the target string was not found and there is no room
  374. in the array to add any more values.
  375.  
  376.    BinSeekSt Array$(), Elements%, Target$, CapsCount%, Posn%
  377.  
  378. Array$()    array of sorted, unique values to search
  379. Elements%   maximum array element to search
  380. Target$     string to look for
  381. CapsCount%  0 if capitalization doesn't matter
  382. -------
  383. Posn%       whether and where the target was found (see above)
  384.  
  385. Name  : BIOSInkey            (BIOS INKEY$)
  386. Class : Input
  387. Level : BIOS
  388.  
  389. BIOSInkey works like INKEY$, but it gets its key directly by
  390. asking the BIOS. The primary advantage of this is that you get
  391. the "scan" code as well as the ASCII code of the key.  The scan
  392. code is independent of the shift status-- for instance, the
  393. scan code for "A" is the same as the scan code for "a" or
  394. Control-A or Alt-A.  This can be very handy.
  395.  
  396. If there is no key available, both the scan code and ASCII code
  397. will be zero.
  398.  
  399.    BIOSInkey AscCode%, ScanCode%
  400.  
  401. -------
  402. AscCode%    ASCII code of the key, if any
  403. ScanCode%   scan code of the key, if any
  404.  
  405. Name  : BkScroll             (Backward Scroll)
  406. Class : Display
  407. Level : BIOS
  408.  
  409. This routine scrolls any selected part of the display down-- it
  410. does a backwards scroll.  You may scroll as many times as you
  411. like, or scroll "zero" times to totally clear the selected part
  412. of the display.
  413.  
  414. Note that BIOS-level scrolling can cause the screen to flicker
  415. on some CGAs due to a combination of unfortunate design factors.
  416.  
  417.    BkScroll TopRow%, LeftCol%, BottomRow%, RightCol%, Times%
  418.  
  419. TopRow%      top row of the area to scroll
  420. LeftCol%     left column of the area to scroll
  421. BottomRow%   top row of the area to scroll
  422. RightCol%    left column of the area to scroll
  423. Times%       number of times (or rows) to scroll
  424.  
  425. Name  : BkSpace              (Backspace)
  426. Class : Display
  427. Level : BIOS
  428.  
  429. Although CHR$(8) is supposed to mean "backspace", it shows up
  430. as a graphics character when BASIC prints it.  This routine
  431. does an actual backspace with full wrap-- if it's at the
  432. beginning of the line, it will move back to the previous line
  433. (if there is one).  It backspaces destructively (erasing the
  434. previous character) from the current cursor position.  The new
  435. cursor is returned to you, since QuickBASIC may ignore the new
  436. status.
  437.  
  438.    BkSpace Row%, Column%       ' do the backspace
  439.    LOCATE Row%, Column%        ' inform QuickBASIC
  440.  
  441. -------
  442. Row%      new row
  443. Column%   new column
  444.  
  445. Name  : Blink                (Blink toggle)
  446. Class : Display
  447. Level : BIOS / Clone (see text)
  448.  
  449. It is possible to make characters in text mode blink by giving
  450. them an appropriate "color".  I wouldn't mention something so
  451. obvious but for another possibility which is less widely known:
  452. blinking can be turned off, in which case the characters that
  453. would have otherwise blinked will instead have a bright
  454. background.  In other words, turn off blinking, and you double
  455. the possible number of background colors.
  456.  
  457. This technique will always work with EGA and VGA displays.  It
  458. can also be used with MDA/Hercules and CGA displays, on which
  459. it will almost always work... unfortunately, on some
  460. less-than-perfect PC clones, it will cause the computer to lock
  461. up instead.  So, be careful with this one!
  462.  
  463.    Blink SetBlink%
  464.  
  465. SetBlink%    use blink (-1) or intense backgrounds (0)
  466.  
  467. Name  : BlockMove            (Block memory Move)
  468. Class : Memory
  469. Level : Clone
  470.  
  471. This routine allows you to copy or "move" a block of data from
  472. one memory location to another.  It isn't very bright, so if
  473. the memory areas overlap, you will have to tell the routine to
  474. "move backwards" instead of forwards. In that case, you will
  475. also have to change the offsets to point to the ends of the
  476. memory areas instead of the beginnings.
  477.  
  478. Normally, you can use forward moves.  In that case, the offsets
  479. you specify are those of the beginning of the memory areas.  If
  480. backward moves are required, the offsets specified are those of
  481. the end of the memory areas.
  482.  
  483. If you are familiar with assembly language, you may recognize
  484. this as a straightforward implementation of the "REP MOVSB"
  485. instruction.
  486.  
  487. You may move up to 65,520 bytes at a time, provided that the
  488. addresses are in normalized form (if you don't know what this
  489. means, you probably don't need to worry about it).
  490.  
  491. This routine can be used to copy information to an array from
  492. any area of memory (the BIOS data area, the screen, another
  493. array, etc), or vice versa. It can also be used to do things
  494. like insert/delete elements from an array, scroll the screen,
  495. fill the screen with a specified character, and so on.
  496.  
  497.    BlockMove FromSeg%, FromOfs%, ToSeg%, ToOfs%, Bytes&, Dirn%
  498.  
  499. FromSeg%    segment of the area from which to copy
  500. FromOfs%    offset of the area from which to copy
  501. ToSeg%      segment of the area to which to copy
  502. ToOfs%      offset of the area to which to copy
  503. Bytes&      number of bytes to copy (0-65,520)
  504. Dirn%       direction to copy (0 if forward, else backward)
  505.  
  506. Name  : BootDrive            (get Boot Drive)
  507. Class : Disk
  508. Level : DOS 4.0+
  509.  
  510. This routine tells you which drive was used to boot the
  511. system.  See also BootDrive2, a function version of this
  512. routine.
  513.  
  514. One use for BootDrive would be in installation programs, to
  515. determine the most likely destination drive for your software.
  516.  
  517.    Drive$ = "x"
  518.    BootDrive Drive$
  519.  
  520. -------
  521. Drive$   boot drive-- set it to at least one char beforehand!
  522.  
  523. Name  : BootDrive2$          (get Boot Drive)
  524. Class : Disk
  525. Level : DOS 4.0+
  526.  
  527. This routine tells you which drive was used to boot the system.
  528.  
  529. One use for BootDrive2 would be in installation programs, to
  530. determine the most likely destination drive for your software.
  531.  
  532.    Drive$ = BootDrive2$
  533.  
  534. -------
  535. Drive$   boot drive (null if wrong DOS version)
  536.  
  537. Name  : BreakCheck%          (Break key Check)
  538. Class : Input
  539. Level : BIOS
  540.  
  541. This routine is for use after BreakOff.  It allows you to see
  542. whether the Break key has been pressed since you last checked.
  543. The Break status is cleared after the value is returned.
  544.  
  545.    Brk% = BreakCheck%
  546.    IF Brk% THEN
  547.       PRINT "** Break key pressed **"
  548.       GOTO EndProgram
  549.    END IF
  550.  
  551. -------
  552. Brk%    whether Break was pressed (0 no, -1 yes)
  553.  
  554. Name  : BreakOff             (Break key Off)
  555. Class : Input
  556. Level : BIOS
  557.  
  558. This routine disables the Break key.  It is not effective in
  559. the QB or QBX environments, as these use their own keyboard
  560. handler.  It is also not effective if your program was compiled
  561. with Debugging on (/D switch).
  562.  
  563. Note that BreakOff installs a routine to intercept some
  564. interrupt vectors. You MUST use the BreakOffDone routine to
  565. reverse this process before your program ends, or the computer
  566. will be left in an indeterminate state and will probably crash
  567. the next time Break is pressed!
  568.  
  569.    BreakOff
  570.  
  571. Name  : BreakOffDone         (Break key Off routine Done)
  572. Class : Input
  573. Level : BIOS
  574.  
  575. This routine is used after BreakOff to restore the original
  576. interrupt vectors.  If you use BreakOff, you MUST call
  577. BreakOffDone before your program ends!  Otherwise, the computer
  578. will probably crash the next time someone presses Break.
  579.  
  580.    BreakOffDone
  581.  
  582. Name  : BSq                  (Blank Squeeze)
  583. Class : String
  584. Level : Any
  585.  
  586. A simple compression routine, BSq "squeezes" the blank spaces
  587. in a string. It is designed expressly for use with text data.
  588. The text may not contain more than 131 spaces in a row, or
  589. CHR$(128) through CHR$(255), which are used in the compression.
  590.  
  591. Average text files are liable to be compressed by around 16%.
  592. Files that contain more spaces, such as structured programs,
  593. will benefit more.  The compression algorithm is simple but
  594. extremely fast, adding no noticeable overhead to string
  595. processing.
  596.  
  597. See also BUsq, BUsqLen.
  598.  
  599.    BSq St$, StLen%
  600.    St$ = LEFT$(St$, StLen%)
  601.  
  602. St$     string to compress
  603. -------
  604. St$     compressed string
  605. StLen%  length of the compressed string
  606.  
  607. Name  : BUsq                 (Blank Unsqueeze)
  608. Class : String
  609. Level : Any
  610.  
  611. This routine is used to uncompress strings that were processed
  612. by BSq. Before uncompression, the BUsqLen routine must be used
  613. to find out how long the resulting string will be.
  614.  
  615. See also BSq, BUsqLen.
  616.  
  617.    BUsqLen St$, StLen%
  618.    IF StLen% < 0 THEN
  619.       PRINT "Error in compressed string"
  620.    ELSE
  621.       Result$ = SPACE$(StLen%)
  622.       BUsq St$, Result$
  623.    END IF
  624.  
  625. St$      string to uncompress
  626. -------
  627. Result$  uncompressed string
  628.  
  629. Name  : BUsqLen              (Blank Unsqueeze Length)
  630. Class : String
  631. Level : Any
  632.  
  633. This routine is used in coordination with BUsq to uncompress
  634. strings that were processed by BSq.  It determines what the
  635. length of the uncompressed string will be, which is necessary
  636. to initialize the string for BUsq.
  637.  
  638. See also BSq, BUsq.
  639.  
  640.    BUsqLen St$, StLen%
  641.    IF StLen% < 0 THEN
  642.       PRINT "Error in compressed string"
  643.    ELSE
  644.       Result$ = SPACE$(StLen%)
  645.       BUsq St$, Result$
  646.    END IF
  647.  
  648. St$      string to uncompress
  649. -------
  650. StLen%   length of the uncompressed string
  651.  
  652. Name  : CalcAttr             (Calculate Attribute)
  653. Class : Display
  654. Level : Any
  655.  
  656. Many of the display routines in this library require an
  657. "attribute" rather than foreground and background colors.  An
  658. attribute is a combination of the foreground and background
  659. colors in a format which is used by all types of displays when
  660. in text mode.
  661.  
  662. Foreground colors are usually specified as 0-31, with
  663. backgrounds as 0-7.  If you turn blinking off (see Blink), it
  664. may be more convenient to express the same thing as foreground
  665. 0-15, background 0-15.  The CalcAttr routine will accept either
  666. way of expressing it.
  667.  
  668. Note, however, that UnCalcAttr will always return the former
  669. pair of results, since it has no way of knowing whether Blink
  670. has been used (foreground 0-31, background 0-15).  See
  671. UnCalcAttr for more details and a solution.
  672.  
  673. See also CalcAttr2, the FUNCTION version of this routine.
  674.  
  675.    CalcAttr Foreground%, Background%, Attr%
  676.  
  677. Foreground%  foreground color
  678. Background%  background color
  679. -------
  680. Attr%        color "attribute"
  681.  
  682. Name  : CalcAttr2%           (Calculate Attribute)
  683. Class : Display
  684. Level : Any
  685.  
  686. Many of the display routines in this library require an
  687. "attribute" rather than foreground and background colors.  An
  688. attribute is a combination of the foreground and background
  689. colors in a format which is used by all types of displays when
  690. in text mode.
  691.  
  692. Foreground colors are usually specified as 0-31, with
  693. backgrounds as 0-7.  If you turn blinking off (see Blink), it
  694. may be more convenient to express the same thing as foreground
  695. 0-15, background 0-15.  The CalcAttr2 routine will accept
  696. either way of expressing it.
  697.  
  698. Note, however, that UnCalcAttr will always return the former
  699. pair of results, since it has no way of knowing whether Blink
  700. has been used (foreground 0-31, background 0-15).  See
  701. UnCalcAttr for more details and a solution.
  702.  
  703. See also CalcAttr, the SUB version of this routine.
  704.  
  705.    Attr% = CalcAttr2%(Foreground%, Background%)
  706.  
  707. Foreground%  foreground color
  708. Background%  background color
  709. -------
  710. Attr%        color "attribute"
  711.  
  712. Name  : CalcDate             (Calculate Date)
  713. Class : Time
  714. Level : Any
  715.  
  716. This routine calculates what the date will be a given number of
  717. days from now, either in the past or the future.  Actually, you
  718. may use any starting date, not just the current date.  An error
  719. code is returned if the starting date or resulting date are not
  720. valid.  Dates may not preceed January 1, 1900.
  721.  
  722. CalcDate accepts the date in any standard form ("01/30/91" or
  723. "01-30-1991", for example) and returns its results in the same
  724. format.
  725.  
  726.    CalcDate StartDate$, Days&, Direction%, NewDate$, ErrCode%
  727.  
  728. StartDate$   starting date
  729. Days&        number of days from the current date (0 or more)
  730. Direction%   return future result (0) or past (nonzero)
  731. -------
  732. NewDate$     resulting date
  733. ErrCode%     whether the dates are valid (0 yes)
  734.  
  735. Name  : CalcSize             (Calculate array Size)
  736. Class : Display
  737. Level : Any
  738.  
  739. This routine calculates the necessary DIM size for an integer
  740. array, assuming that you intend to store display data in the
  741. array.  This is most useful in conjunction with DGetScreen and
  742. GetScreen.
  743.  
  744.    CalcSize TopRow%, LeftCol%, BottomRow%, RightCol%, Elements%
  745.    DIM Array%(1 TO Elements%)
  746.  
  747. TopRow%      top row of the display area
  748. LeftCol%     left column of the display area
  749. BottomRow%   top row of the display area
  750. RightCol%    left column of the display area
  751. -------
  752. Elements%    required size of the integer array
  753.  
  754. Name  : CalcVGAColor         (Calculate VGA palette Color)
  755. Class : Display
  756. Level : Any
  757.  
  758. The QuickBASIC manual gives a cumbersome formula for
  759. calculating VGA palette colors.  This routine does it faster
  760. and with less fuss.  All you need to do is pass it the
  761. appropriate intensity values (0-63) and you get back a long
  762. integer, just the way BASIC wants it.
  763.  
  764.    CalcVGAColor Red%, Green%, Blue%, Colour&
  765.  
  766. Red%      red   intensity
  767. Green%    green intensity
  768. Blue%     blue  intensity
  769. -------
  770. Colour&   color value for use in the PALETTE statement
  771.  
  772. Name  : Carrier              (detect Carrier)
  773. Class : Serial
  774. Level : Clone
  775.  
  776. If you write communications programs, particularly things like
  777. doors and BBSes, you probably want to keep an eye on the
  778. carrier.  BASIC won't do it, but we will!
  779.  
  780.    Carrier CommPort%, CarrierHigh%
  781.  
  782. CommPort%     serial port (1-4, though BASIC only handles 1-2)
  783. -------
  784. CarrierHigh%  zero if no carrier
  785.  
  786. Name  : CatchError           (Catch Error from SHELL)
  787. Class : Miscellaneous
  788. Level : Clone
  789.  
  790. NOTE: You should use the GetError2% function in preference to
  791. this set of routines.
  792.  
  793. The CatchError routine is used in conjunction with GetError.
  794. It lets you get the exit code (error level) returned by a
  795. program to which you have SHELLed. Since CatchError hooks an
  796. interrupt to do its work, you must always make sure to use
  797. GetError afterwards to "clean up".  See also GetError.
  798.  
  799. Note that differences in DOS mean that this routine will not
  800. always work.  In some versions of DOS, you can only get the
  801. error level if a batch file was executed; in others, you can't
  802. get the error level from a batch file at all. Sorry about
  803. that.  I don't know of any way to work around it.
  804.  
  805.    CatchError
  806.    SHELL ProgramName$
  807.    GetError ExitCode%
  808.  
  809. Name  : CDROM                (check for CD-ROM)
  810. Class : Disk / Equipment
  811. Level : DOS
  812.  
  813. This routine tells you whether the Microsoft CD-ROM Extensions
  814. are installed. If so, it tells you what the letter of the first
  815. CD-ROM logical drive is and how many logical drives exist.
  816.  
  817. Note: The CD-ROM installation check conflicts with the
  818. GRAPHICS.COM installation check for DOS 4.0, due to some
  819. screw-up at IBM or Microsoft. This may cause unexpected
  820. results.  I'm not yet sure whether DOS 5.0 is similarly
  821. afflicted.
  822.  
  823.    FirstDrive$ = "x"
  824.    CDROM FirstDrive$, Drives%
  825.  
  826. -------
  827. FirstDrive$   letter of first logical drive (init to >= 1 char)
  828. Drives%       number of logical drives (0 if no CD-ROM)
  829.  
  830. Name  : CDROM2%              (check for CD-ROM)
  831. Class : Disk / Equipment
  832. Level : DOS
  833.  
  834. This routine tells you whether the Microsoft CD-ROM Extensions
  835. are installed. If so, it tells you how many logical drives
  836. exist.
  837.  
  838. Note: The CD-ROM installation check conflicts with the
  839. GRAPHICS.COM installation check for DOS 4.0, due to some
  840. screw-up at IBM or Microsoft. This may cause unexpected
  841. results.  I'm not yet sure whether DOS 5.0 is similarly
  842. afflicted.
  843.  
  844.    Drives% = CDROM2%
  845.  
  846. -------
  847. Drives%       number of logical drives (0 if no CD-ROM)
  848.  
  849. Name  : CeilD#               (Ceiling, Double-precision)
  850. Class : String
  851. Level : Any
  852.  
  853. This function returns the smallest integer greater than or
  854. equal to the number you give it.  This is most often used for
  855. rounding.
  856.  
  857.    Result# = CeilD#(Nr#)
  858.  
  859. Nr#          number to process
  860. -------
  861. Result#      result
  862.  
  863. Name  : CeilS!               (Ceiling, Single-precision)
  864. Class : String
  865. Level : Any
  866.  
  867. This function returns the smallest integer greater than or
  868. equal to the number you give it.  This is most often used for
  869. rounding.
  870.  
  871.    Result! = CeilS!(Nr!)
  872.  
  873. Nr!          number to process
  874. -------
  875. Result!      result
  876.  
  877. Name  : CheckDate            (Check Date validity)
  878. Class : Time
  879. Level : Any
  880.  
  881. This routine checks a date to see if it is valid.
  882.  
  883.    CheckDate MonthNr%, DayNr%, YearNr%, ErrCode%
  884.  
  885. MonthNr%     month number (1-12)
  886. DayNr%       day number (1-31)
  887. YearNr%      year number (1900 on; years <100 assumed 1900s)
  888. -------
  889. ErrCode%     whether the date is valid (0 yes)
  890.  
  891. Name  : CheckDisk            (Check Disk readiness)
  892. Class : Disk
  893. Level : DOS
  894.  
  895. The CheckDisk routine determines whether a disk is ready.
  896. About the only thing it won't tell you is if a disk is
  897. write-protected or out of space. Since the PBClone disk
  898. routines all contain critical error handling, which reports
  899. back an appropriate error code for all such problems, this
  900. routine isn't really needed any more.  It's included for
  901. compatibility with older ProBas programs.
  902.  
  903. Results will normally be returned as one of the following,
  904. although not all DOS versions report the exact cause of the
  905. error, in which case the error number may not mean what you
  906. expect.
  907.  
  908.    0   no error
  909.    1   unformatted disk
  910.    2   open drive door
  911.    3   bad drive spec
  912.  
  913.    CheckDisk Drive$, ErrCode%
  914.  
  915. Drive$    letter of the drive to check
  916. -------
  917. ErrCode%  0 if no error, nonzero for error (see above)
  918.  
  919. Name  : CheckDsk%            (Check Disk readiness)
  920. Class : Disk
  921. Level : DOS
  922.  
  923. The CheckDsk% function determines whether a disk is ready.
  924. About the only thing it won't tell you is if a disk is
  925. write-protected or out of space. Since the PBClone disk
  926. routines all contain critical error handling, which reports
  927. back an appropriate error code for all such problems, this
  928. routine isn't really needed any more.  It's included for
  929. compatibility with older ProBas programs.
  930.  
  931. Note that DOS versions before 3.0 do not return as useful error
  932. codes as later versions.  Under such circumstances, both
  933. "unformatted disk" and "open drive door" will be returned as
  934. "open drive door".
  935.  
  936.    ErrCode% = CheckDsk%(Drive$)
  937.  
  938. Drive$    letter of the drive to check
  939.  
  940. Name  : CheckKey             (Check for Key or mouse)
  941. Class : Input, Mouse
  942. Level : BIOS
  943.  
  944. This routine is kind of an extended version of INKEY$.  It
  945. checks the keyboard to see if any key is available and gets the
  946. key if it is.  At your option, it can also check the mouse to
  947. see if a button has been pressed.
  948.  
  949.    CheckKey Mouse%, ASCIIcode%, ScanCode%, LButton%, RButton%
  950.  
  951. Mouse%        whether to check the mouse (0: no)
  952. -------
  953. ASCIIcode%    ASCII code of the key pressed
  954. ScanCode%     scan code of the key pressed (0 if none)
  955. LButton%      whether the left  mouse button was pressed
  956. RButton%      whether the right mouse button was pressed
  957.  
  958. Name  : CheckKey3            (Check for Key or 3-button mouse)
  959. Class : Input, Mouse
  960. Level : BIOS
  961.  
  962. This routine is kind of an extended version of INKEY$.  It
  963. checks the keyboard to see if any key is available and gets the
  964. key if it is.  At your option, it can also check the mouse to
  965. see if a button has been pressed.
  966.  
  967.    CheckKey3 Mouse%, ASCIIcode%, ScanCode%, LButton%,
  968.       MButton%, RButton%
  969.  
  970. Mouse%        whether to check the mouse (0: no)
  971. -------
  972. ASCIIcode%    ASCII code of the key pressed
  973. ScanCode%     scan code of the key pressed (0 if none)
  974. LButton%      whether the left   mouse button was pressed
  975. MButton%      whether the middle mouse button was pressed
  976. RButton%      whether the right  mouse button was pressed
  977.  
  978. Name  : CheckShare           (Check for SHARE)
  979. Class : Disk
  980. Level : DOS
  981.  
  982. The CheckShare routine determines whether SHARE.EXE is active.
  983. This is particularly helpful before using the BASIC OPEN
  984. statement, which will fail if you request file sharing when
  985. it's not available.  The PBClone file routines handle such
  986. situations automatically, so CheckShare is not needed for them.
  987.  
  988.    CheckShare ShareActive%
  989.  
  990. -------
  991. ShareActive%   whether SHARE is active (0 if no)
  992.  
  993. Name  : CheckShare2%         (Check for SHARE)
  994. Class : Disk
  995. Level : DOS
  996.  
  997. The CheckShare2% function determines whether SHARE.EXE is
  998. active.  This is particularly helpful before using the BASIC
  999. OPEN statement, which will fail if you request file sharing
  1000. when it's not available.  The PBClone file routines handle such
  1001. situations automatically, so CheckShare2% is not needed for
  1002. them.
  1003.  
  1004.    ShareActive% = CheckShare2%
  1005.  
  1006. -------
  1007. ShareActive%   whether SHARE is active (0 if no)
  1008.  
  1009. Name  : Checksum             (calculate Checksum)
  1010. Class : String / Serial
  1011. Level : Any
  1012.  
  1013. The Checksum routine calculates a checksum on a string.  The
  1014. resulting number is compatible with Xmodem and Ymodem checksum
  1015. routines and will vary from 0-255.  This checksum provides a
  1016. minimal, but fast, check of what characters are contained in
  1017. the string.  See also CRC1.
  1018.  
  1019.    Checksum St$, ChkSum%
  1020.  
  1021. St$       string to process
  1022. -------
  1023. ChkSum%   checksum of the characters in the string
  1024.  
  1025. Name  : Cipher               (Cipher)
  1026. Class : String
  1027. Level : Any
  1028.  
  1029. This is a very simple text encryption routine.  It isn't
  1030. particularly hard to crack, but will provide a basic level of
  1031. security for undemanding applications.  The same routine can be
  1032. used either to encrypt or decrypt text.  The original text may
  1033. contain any character; likewise, the resulting text.  This is
  1034. not well suited for use with sequential files-- if such is
  1035. required, see CipherP.
  1036.  
  1037. I'd suggest using a long password composed of an unlikely
  1038. string of characters, e.g. "#*@@!A^%x{.'".
  1039.  
  1040.    Cipher St$, Password$
  1041.  
  1042. St$        string to encrypt or decrypt
  1043. Password$  password
  1044. -------
  1045. St$        encrypted or decrypted string
  1046.  
  1047. Name  : CipherP              (Cipher Printable)
  1048. Class : String
  1049. Level : Any
  1050.  
  1051. This is a very simple text encryption routine.  It isn't
  1052. particularly hard to crack, but will provide a basic level of
  1053. security for undemanding applications.  The same routine can be
  1054. used either to encrypt or decrypt text.  The original text may
  1055. contain any character below CHR$(128), as may the password.
  1056. The resulting text will be printable, if bizarre (all
  1057. characters will be above CHR$(127)), and may be used with
  1058. sequential files.
  1059.  
  1060. This routine is potentially less secure than the Cipher routine
  1061. (see).
  1062.  
  1063. I'd suggest using a long password composed of an unlikely
  1064. string of characters, e.g. "#*@@!A^%x{.'".
  1065.  
  1066.    CipherP St$, Password$
  1067.  
  1068. St$        string to encrypt or decrypt
  1069. Password$  password
  1070. -------
  1071. St$        encrypted or decrypted string
  1072.  
  1073. Name  : ClearArea            (Clear a screen Area)
  1074. Class : Display
  1075. Level : Clone
  1076.  
  1077. This routine clears an area of the screen to a specified
  1078. color.  The clearing is done by removing random characters
  1079. until the area is totally clear.
  1080.  
  1081.    ClearArea TRow%, LCol%, BRow%, RCol%, Attr%, Fast%
  1082.  
  1083. TRow%       top row of area to clear
  1084. LCol%       left column of area to clear
  1085. BRow%       bottom row of area to clear
  1086. RCol%       right column of area to clear
  1087. Attr%       color/attribute to clear to
  1088. Fast%       whether to use fast displays (0 no)
  1089.  
  1090. Name  : Clock                (Clock)
  1091. Class : Display / Time
  1092. Level : Clone
  1093.  
  1094. This routine allows you to turn a visible time display on or
  1095. off.  When on, the time will be continuously displayed at a
  1096. selected location while your program continues processing.  The
  1097. clock is managed as a background process, in effect doing some
  1098. simple multitasking.
  1099.  
  1100. You should turn the clock off before you terminate your
  1101. program, including any time you execute another program with
  1102. RUN.  The clock can be safely kept on when you SHELL to another
  1103. program, however, as long as you can be sure that control will
  1104. return to your program when the other is done.
  1105.  
  1106. The clock must also be turned off if you change any of its
  1107. parameters with the ClockSet routine (see).
  1108.  
  1109. The clock will only be visible when the display is in text
  1110. mode.  The use of PLAY or SOUND statements may shut off the
  1111. clock, depending on your version of the BASIC compiler.
  1112.  
  1113.    Clock DisplayOn%
  1114.  
  1115. DisplayOn%   whether to display the clock (0 if no)
  1116.  
  1117. Name  : ClockSet             (Clock Settings)
  1118. Class : Display / Time
  1119. Level : Clone
  1120.  
  1121. The ClockSet routine is used in conjunction with Clock (see).
  1122. It should only be used when the clock is turned off.
  1123.  
  1124. This routine allows you to set 12-hour or 24-hour time, whether
  1125. to display the seconds or not, how often to update the clock
  1126. display (in 1/18th seconds; 9 is usually the best choice),
  1127. where to display the clock and in what color, and whether to
  1128. use flicker-free displays (needed for cheap CGAs only).  The
  1129. defaults are 12-hour time, display seconds, put the time (in
  1130. white on black) in the upper right corner, and display quickly
  1131. (may flicker on some CGAs).
  1132.  
  1133.    ClockSet Hours24%, Seconds%, Updates%, Row%, Column%,
  1134.       Attr%, Fast%
  1135.  
  1136. Hours24%   whether to display 24-hour time (0 if no)
  1137. Seconds%   whether to display seconds (0 if no)
  1138. Updates%   display update frequency in 1/18th seconds
  1139. Row%       row on which to display the clock
  1140. Col%       column at which to display the clock
  1141. Attr%      color/attribute to use (see CalcAttr)
  1142. Fast%      whether to use fast mode (0 no)
  1143.  
  1144. Name  : CloseA               (Close Archive)
  1145. Class : Disk / Time
  1146. Level : DOS
  1147.  
  1148. This routine closes an archive opened by FindFirstA or
  1149. FindNextA.  It must be used when you are done searching the
  1150. archive.
  1151.  
  1152. Routines in this series include:
  1153.    FindFirstA, FindNextA, GetNameA, GetCRCA, GetCRCAL,
  1154.    GetDateA, GetTimeA, GetSizeAL, GetStoreA
  1155.  
  1156.    CloseA
  1157.  
  1158. Name  : ClrCols              (Clear Columns)
  1159. Class : Display
  1160. Level : BIOS
  1161.  
  1162. This routine clears the current row between the specified
  1163. columns, inclusive. It does not affect the cursor position.
  1164.  
  1165.    ClrCols StartCol%, EndCol%
  1166.  
  1167. StartCol%  starting column
  1168. EndCol%    ending column
  1169.  
  1170. Name  : ClrEOL               (Clear to End Of Line)
  1171. Class : Display
  1172. Level : BIOS
  1173.  
  1174. This routine clears from the cursor to the end of the line,
  1175. inclusive.  It does not affect the current cursor position.
  1176.  
  1177.    ClrEOL
  1178.  
  1179. Name  : ClrEOP               (Clear to End Of Page)
  1180. Class : Display
  1181. Level : BIOS
  1182.  
  1183. This routine clears from the cursor to the end of the display,
  1184. inclusive.  It does not affect the current cursor position.
  1185.  
  1186.    ClrEOP
  1187.  
  1188. Name  : ClrSOL               (Clear to Start Of Line)
  1189. Class : Display
  1190. Level : BIOS
  1191.  
  1192. This routine clears from the start of the line to the cursor,
  1193. inclusive.  It does not affect the current cursor position.
  1194.  
  1195.    ClrSOL
  1196.  
  1197. Name  : ClrKbd               (Clear Keyboard buffer)
  1198. Class : Input
  1199. Level : DOS
  1200.  
  1201. ClrKbd clears the keyboard buffer, discarding any keys that may
  1202. be waiting. This is a good idea for situations where an
  1203. unexpected input is made and you don't want to chance it being
  1204. answered accidentally by keys that were typed beforehand-- for
  1205. instance, in the event of an error or other condition where it
  1206. is important that the user see a message or take an action
  1207. before pressing a key.
  1208.  
  1209.    ClrKbd
  1210.  
  1211. Name  : ClrSOP               (Clear to Start Of Page)
  1212. Class : Display
  1213. Level : BIOS
  1214.  
  1215. This routine clears from the start of the display to the
  1216. cursor, inclusive. It does not affect the current cursor
  1217. position.
  1218.  
  1219.    ClrSOP
  1220.  
  1221. Name  : CopyFile             (Copy a File)
  1222. Class : Disk
  1223. Level : DOS
  1224.  
  1225. This works like the DOS COPY command, although it does not
  1226. allow wildcards. One file is copied to another, retaining the
  1227. same date and time.  Full path specifications are supported,
  1228. including drive and subdirectory specs.
  1229.  
  1230. See also FileCopy, which supports wildcards.
  1231.  
  1232.    CopyFile FromFile$, ToFile$, ErrCode%
  1233.  
  1234. FromFile$   name of file to copy
  1235. ToFile$     name of new file to create
  1236. -------
  1237. ErrCode%    0 if no error, else DOS Error
  1238.  
  1239. Name  : CPrintScreen1        (CGA Print Screen [SCREEN 1])
  1240. Class : Display / Printer
  1241. Level : Clone
  1242.  
  1243. This routine dumps a SCREEN 1 display (CGA 320x200) to the
  1244. printer.  It uses the stdprn device (normally PRN or LPT1) by
  1245. default, although this can be altered with the PrtSwap routine.
  1246.  
  1247.    CPrintScreen1
  1248.  
  1249. Name  : CPrintScreen2        (CGA Print Screen [SCREEN 2])
  1250. Class : Display / Printer
  1251. Level : Clone
  1252.  
  1253. This routine dumps a SCREEN 2 display (CGA 640x200) to the
  1254. printer.  It uses the stdprn device (normally PRN or LPT1) by
  1255. default, although this can be altered with the PrtSwap routine.
  1256.  
  1257.    CPrintScreen2
  1258.  
  1259. Name  : CRC                  (calculate CRC)
  1260. Class : String / Serial
  1261. Level : Any
  1262.  
  1263. This routine has become obsolete; the CRC1 routine is much
  1264. faster.  However, CRC is still included for backwards
  1265. compatibility.
  1266.  
  1267. This routine calculates a complex 16-bit checksum, called a
  1268. Cyclical Redundancy Check (or CRC) on a string.  The results
  1269. are compatible with Xmodem and Ymodem CRC routines.  The CRC
  1270. provides a fairly reliable check of what characters are
  1271. contained in the string.  See also Checksum.
  1272.  
  1273. If you are using this routine for Xmodem or Ymodem, note that
  1274. the string should be padded with two null characters before
  1275. calculating a "send" CRC: St$ = St$ + STRING$(2, 0).  On
  1276. receive, you should calculate the CRC on the entire data block,
  1277. plus the received CRC; if the block was received correctly, the
  1278. calculated CRC will be zero in both lsb and msb.
  1279.  
  1280. Although Intel notation uses "lsb, msb" order, the
  1281. Xmodem/Ymodem CRC uses the opposite format, which is why the
  1282. parameters are ordered in this fashion.
  1283.  
  1284.    CRC St$, CRCmsb%, CRClsb%
  1285.  
  1286. St$       string to process
  1287. -------
  1288. CRCmsb%   most significant byte of CRC
  1289. CRClsb%   least significant byte of CRC
  1290.  
  1291. Name  : CRC1                 (calculate CRC)
  1292. Class : String / Serial
  1293. Level : Any
  1294.  
  1295. This routine calculates a complex 16-bit checksum, called a
  1296. Cyclical Redundancy Check (or CRC) on a string.  The results
  1297. are compatible with Xmodem and Ymodem CRC routines.  The CRC
  1298. provides a fairly reliable check of what characters are
  1299. contained in the string.  See also Checksum.
  1300.  
  1301. Note that CRC1 does not work like the older CRC routine.  You
  1302. should not pad outgoing strings with a STRING$(2, 0) sequence.
  1303.  
  1304. Although Intel notation uses "lsb, msb" order, the
  1305. Xmodem/Ymodem CRC uses the opposite format, which is why the
  1306. parameters are ordered in this fashion.
  1307.  
  1308.    CRC St$, CRCmsb%, CRClsb%
  1309.  
  1310. St$       string to process
  1311. -------
  1312. CRCmsb%   most significant byte of CRC
  1313. CRClsb%   least significant byte of CRC
  1314.  
  1315. Name  : Crunch               (Crunch repeated characters)
  1316. Class : String
  1317. Level : Any
  1318.  
  1319. It was hard to decide on a name for this routine, and I don't
  1320. know if I've done the best job.  What Crunch does is to
  1321. eliminate repeated sequences of the same character.  For
  1322. instance, if you gave it "This    is a   test" and asked it to
  1323. crunch spaces, it would return "This is a test".  I use this to
  1324. filter information from the COMMAND$ function, but it's a good
  1325. general purpose input filter.
  1326.  
  1327.    Crunch St$, Ch$, StLen%
  1328.    St$ = LEFT$(St$, StLen%)
  1329.  
  1330. St$       string to be processed
  1331. Ch$       character to crunch out of the string
  1332. -------
  1333. St$       crunched string
  1334. StLen%    length of the crunched string
  1335.  
  1336. Name  : CtrlKey              (Control Key)
  1337. Class : Input
  1338. Level : Any
  1339.  
  1340. This routine works in conjunction with a key input routine,
  1341. such as INKEY$ or the CheckKey and GetKey routines.  Given the
  1342. ASCII code of a key, CtrlKey returns the associated key letter,
  1343. if any.  For instance, it returns "A" if you pass it ASCII code
  1344. 1, because that code represents Ctrl-A.
  1345.  
  1346.    CtrlKey ASCIICode%, Ky$
  1347.  
  1348. ASCIICode%   ASCII code of the key
  1349. -------
  1350. Ky$          associated key letter ("" if none)
  1351.  
  1352. Name  : CursorInfo           (Cursor Information)
  1353. Class : Input
  1354. Level : Clone
  1355.  
  1356. While BASIC allows you to set the size and shape of the cursor
  1357. with LOCATE, it's fairly hazardous to do so.  There is no way
  1358. to find out the maximum size of the cursor, so your cursor may
  1359. end up a peculiar shape on some adapters. If you change the
  1360. cursor size or visibility in a subprogram, you may be screwing
  1361. up the main program.
  1362.  
  1363. CursorInfo offers a solution to these problems.  It returns the
  1364. current cursor visibility and size, plus the maximum size
  1365. possible with the current video adapter.  The minimum size will
  1366. always be zero, so it is not reported.
  1367.  
  1368.    CursorInfo Visible%, StartLine%, EndLine%, MaxLine%
  1369.  
  1370. -------
  1371. Visible%      whether the cursor is visible (0 no, 1 yes)
  1372. StartLine%    starting scan line of cursor
  1373. EndLine%      ending scan line of cursor
  1374. MaxLine%      maximum possible scan line for cursor
  1375.  
  1376. Name  : CWindowManager       (CGA Window Manager)
  1377. Class : Display
  1378. Level : Clone
  1379.  
  1380. CWindowManager displays a pop-up window on a CGA graphics
  1381. screen.  It is intended for SCREEN 1, although it can be used
  1382. on SCREEN 2 as well (it will still have 40 columns and will
  1383. display shades rather than colors).  The window may have any of
  1384. a variety of frames, a title, or a shadow, and it may appear
  1385. instantly or "grow" onto the screen.
  1386.  
  1387. These are the available frame types:
  1388.     0   no frame
  1389.     1   single lines
  1390.     2   double lines
  1391.     3   single horizontal, double vertical lines
  1392.     4   double horizontal, single vertical lines
  1393.     5   block graphic lines
  1394.  
  1395. Options for growing windows are as follows:
  1396.    -1   grow as fast as possible
  1397.     0   pop onto the screen
  1398.    1+   grow with delay given in milliseconds (15 works for me)
  1399.  
  1400. Note that this routine is different from its ProBas equivalent
  1401. in a number of respects.  The grow delay time is different.
  1402. Growing is done more smoothly. The shadow and title parameters
  1403. are not changed by this routine.  A new frame type (5) was
  1404. added.  If a title is too long, it is truncated instead of
  1405. being ignored completely.  Using a -1 as the title foreground
  1406. color will not turn off the title; instead, use a null title
  1407. string.
  1408.  
  1409.    CWindowManager TRow%, LCol%, BRow%, RCol%, Frame%,
  1410.       Fore%, Back%, Grow%, Shade%, TFore%, Title$, Fast%
  1411.  
  1412. TRow%       top row of window
  1413. LCol%       left column of window
  1414. BRow%       bottom row of window
  1415. RCol%       right column of window
  1416. Frame%      frame type (see above)
  1417. Fore%       frame foreground color
  1418. Back%       frame background color
  1419. Grow%       window growing option (see above)
  1420. Shade%      window shadow option (0 for none)
  1421. TFore%      title foreground color
  1422. Title$      window title ("" if none)
  1423. Fast%       whether to use fast mode (0 no)
  1424.  
  1425. Name  : DataSeg              (Data Segment)
  1426. Class : Memory
  1427. Level : Any
  1428.  
  1429. It's rare that you need to know the data segment used by BASIC,
  1430. but it does happen.  DataSeg tells you that value.  This is the
  1431. segment used by (near) strings, static arrays (except in the
  1432. QuickBASIC environment), some COMMON data, BASIC internal
  1433. variables and so forth.  It is also the area specified by a
  1434. plain "DEF SEG", though not (usually) by "DEF SEG=xxxx".
  1435.  
  1436.    DataSeg DSeg%
  1437.  
  1438. -------
  1439. DSeg%     data segment for BASIC
  1440.  
  1441. Name  : Date2Int             (Date to Integer)
  1442. Class : Time
  1443. Level : Any
  1444.  
  1445. This routine compresses a date into a single integer.  Note
  1446. that this integer is not in a format that lends itself to
  1447. simple computation-- you cannot subtract one from another to
  1448. find out the length of time between them. However, as long as
  1449. the year is in the range 1980-2042, you can compare the two
  1450. integers to see if one date is before or after another.
  1451.  
  1452. You may express the year as either a two-digit or four-digit
  1453. number.
  1454.  
  1455. The ProBas and PBClone versions of this routine do not work the
  1456. same way in regards to the year.  ProBas assumed that any
  1457. two-digit year was in the 1900s.  In contrast, PBClone assumes
  1458. that years 80-99 should be converted to 1980-1999 and that 0-79
  1459. should be converted to 2000-2079.  I consider the PBClone
  1460. method more appropriate, with the turn of the century moving
  1461. closer. The date format used does not allow dates before 1980
  1462. anyway, so nothing is being lost by this change.
  1463.  
  1464.    Date2Int MonthNr%, Day%, Year%, IntDate%
  1465.  
  1466. MonthNr%     month number (1-12)
  1467. Day%         day (1-31)
  1468. Year%        year (1980-2079; see above for two-digit years)
  1469. -------
  1470. IntDate%     date compressed into an integer
  1471.  
  1472. Name  : DateA2R              (Date Actual to Relative)
  1473. Class : Time
  1474. Level : Any
  1475.  
  1476. This routine converts an actual date to a relative date,
  1477. expressed as a number of days.  This allows you to compare
  1478. dates, find out what the date will be in a given number of days
  1479. (or what it was a given number of days ago), see how many days
  1480. passed between two dates, and so forth.
  1481.  
  1482. I've frequently seen routines of this nature called "Julian
  1483. date" routines. I'm not sure where that nomenclature
  1484. originated, as it has nothing to do with the Julian calendar.
  1485. Most of these routines rely on approximations through floating
  1486. point math, and may or may not handle leap years and centuries
  1487. appropriately.  The DateA2R routine takes no such shortcuts and
  1488. may be relied upon to return accurate results.
  1489.  
  1490.    DateA2R MonthNr%, DayNr%, YearNr%, RelDate&
  1491.  
  1492. MonthNr%     month number (1-12)
  1493. DayNr%       day number (1-31)
  1494. YearNr%      year number (1900 on; years <100 assumed in 1900s)
  1495. -------
  1496. RelDate&     relative date
  1497.  
  1498. Name  : DateN2S              (Date Numbers to String)
  1499. Class : Time
  1500. Level : Any / DOS
  1501.  
  1502. Many of the PBClone routines return the date as a set of
  1503. numbers.  This routine provides an easy way to convert those
  1504. numbers into string form.  The date format used (year length
  1505. and delimiter) will be based on the string which you pass to
  1506. the routine.  For instance, "xx-xx-xxxx" will return a date
  1507. like "11-26-1990", whereas "xx.xx.xxxx" would return
  1508. "11.26.1990", and "xx/xx/xx" would return "11/26/90".
  1509.  
  1510. If you pass zeroes for the MonthNr%, Day%, and Year% values,
  1511. the current date will be returned in the format that you
  1512. specified.
  1513.  
  1514. The ProBas and PBClone versions of this routine do not work the
  1515. same way in regards to the year.  ProBas assumed that any
  1516. two-digit year was in the 1900s.  In contrast, PBClone assumes
  1517. that years 80-99 should be converted to 1980-1999 and that 0-79
  1518. should be converted to 2000-2079.
  1519.  
  1520.    DateSt$ = "xx-xx-xxxx"
  1521.    DateN2S MonthNr%, Day%, Year%, DateSt$
  1522.  
  1523. MonthNr%  month
  1524. Day%      day
  1525. Year%     year
  1526. -------
  1527. DateSt$   date string.  Init to 8 or 10 chars (see above).
  1528.  
  1529. Name  : DateR2A              (Date Relative to Actual)
  1530. Class : Time
  1531. Level : Any
  1532.  
  1533. This is the opposite of the DateA2R routine-- it takes a
  1534. "relative" date and converts it back to the usual form.
  1535.  
  1536.    DateR2A MonthNr%, DayNr%, YearNr%, RelDate&
  1537.  
  1538. RelDate&     relative date
  1539. -------
  1540. MonthNr%     month number (1-12)
  1541. DayNr%       day number (1-31)
  1542. YearNr%      year number (1900 on)
  1543.  
  1544. Name  : DateS2N              (Date String to Numbers)
  1545. Class : Time
  1546. Level : Any
  1547.  
  1548. Many of the PBClone routines need to be passed the date as a
  1549. set of numbers. This routine provides an easy way to convert a
  1550. date from string form into numbers.  You may use either
  1551. "xx/xx/xx" or "xx-xx-xxxx" form to specify the date (the string
  1552. length is important, but the delimiter and contents of the
  1553. string are ignored).
  1554.  
  1555. The ProBas and PBClone versions of this routine do not work the
  1556. same way in regards to the year.  ProBas assumed that any
  1557. two-digit year was in the 1900s.  In contrast, PBClone assumes
  1558. that years 80-99 should be converted to 1980-1999 and that 0-79
  1559. should be converted to 2000-2079.
  1560.  
  1561.    DateS2N MonthNr%, Day%, Year%, DateSt$
  1562.  
  1563. DateSt$   date string.  Init to 8 or 10 characters (see above).
  1564. -------
  1565. MonthNr%  month
  1566. Day%      day
  1567. Year%     year
  1568.  
  1569. Name  : DCal                 (Direct-to-memory Calendar)
  1570. Class : Time
  1571. Level : Any
  1572.  
  1573. This routine draws a calendar for a specific month and year.
  1574. The results are placed in an array which can be displayed using
  1575. ScrRest or the other PBClone routines to restore a screen image.
  1576.  
  1577. You must supply an integer array large enough to hold the image
  1578. generated by DCal, which expects a 25x80 screen.  DIM Scrn%(1
  1579. TO 2000) will do it.  If you supply a null date, the current
  1580. date will be used.
  1581.  
  1582.    DCal Scrn%(), CalDate$
  1583.  
  1584. Scrn%()      array to hold screen image
  1585. CalDate$     date for the calendar
  1586. Page%        ignored
  1587. Fast%        ignored
  1588.  
  1589. Name  : DCalendar            (Direct-to-memory Calendar)
  1590. Class : Time
  1591. Level : Clone
  1592.  
  1593. This routine displays a calendar for a specific month and
  1594. year.  It waits for input and acts accordingly, allowing the
  1595. user to move to different dates via the arrow keys or by
  1596. entering the date directly. The bottom row of the screen gives
  1597. a list of the available key commands.
  1598.  
  1599. Screen handling is largely done by writing to an array, then
  1600. dumping the entire array to the display with DScrRest.  This
  1601. provides for very smooth displays.  You must supply an integer
  1602. array large enough to hold the image generated by DCalendar,
  1603. which expects a 25x80 screen.  DIM Scrn%(1 TO 2000) will do
  1604. it.  Only text mode is supported by this routine.
  1605.  
  1606. If you supply a null date, the current date will be used.
  1607.  
  1608.    DCalendar Scrn%(), CalDate$, Page%, Fast%
  1609.  
  1610. Scrn%()      array to hold screen image
  1611. CalDate$     date for the calendar
  1612. Page%        page on which to display (normally zero)
  1613. Fast%        whether to use fast mode (0 no)
  1614.  
  1615. Name  : DClear               (Direct-to-memory Clear)
  1616. Class : Display
  1617. Level : Any
  1618.  
  1619. The DClear routine allows you to clear a text-mode display.
  1620.  
  1621. This routine does not necessarily work on the display itself.
  1622. Instead, it allows you to specify the memory location (segment
  1623. and offset) of the "screen", which may be an actual screen, a
  1624. saved screen in an array, a multitasker's virtual screen, etc.
  1625. Among other things, this makes it easy to work with two
  1626. displays at once: use a segment of &HB000 for the mono display
  1627. and &HB800 for the color display (the offset in each case is
  1628. zero).
  1629.  
  1630.    DClear DSeg%, DOfs%, Attr%
  1631.  
  1632. DSeg%    segment of "screen" memory
  1633. DOfs%    offset of "screen" memory
  1634. Attr%    color/attribute to use (see CalcAttr)
  1635.  
  1636. Name  : DClearSS             (Direct Clear for Specified Size)
  1637. Class : Display
  1638. Level : Any
  1639.  
  1640. Like the CLS statement, this routine allows you to clear a text
  1641. display. However, rather than clearing the actual screen,
  1642. DClearSS clears a screen that is stored in an array.  This
  1643. allows you to design a screen in memory, then flash it onto the
  1644. display using PutScreen or a similar routine.
  1645.  
  1646. This routine is designed for a text screen of any specified
  1647. size.
  1648.  
  1649.    DClearSS DSeg%, DOfs%, Attr%, Rows%, Columns%
  1650.  
  1651. DSeg%     segment of the array that holds the screen
  1652. DOfs%     offset of the array that holds the screen
  1653. Attr%     color/attribute to use (see CalcAttr)
  1654. Rows%     length of the screen
  1655. Columns%  width of the screen
  1656.  
  1657. Name  : Dec2Any              (Decimal to Any base)
  1658. Class : Numeric
  1659. Level : Any
  1660.  
  1661. This routine converts a normal integer to a number in any
  1662. base.  It works like the HEX$ function in BASIC, but rather
  1663. than working only in hexadecimal (base 16), it can be used for
  1664. binary, octal, or almost anything else.
  1665.  
  1666. The result will be right-justified in the string you provide.
  1667. If you use zeroes, this allows you to ignore the NumberLen%
  1668. spec and just trim the string to the desired length, leaving
  1669. nothing worse than possible leading zeroes.
  1670.  
  1671. The length needed by the return string will vary according to
  1672. the number, with a maximum length depending on the number base
  1673. chosen.  For integers, this will be at most 16 characters
  1674. (worst case: base 2 or binary).
  1675.  
  1676.    Number$ = STRING$(16, "0")
  1677.    Dec2Any DecimalNr%, NrBase%, Number$, NumberLen%
  1678.    Number$ = RIGHT$(Number$, NumberLen%)
  1679.  
  1680. DecimalNr   integer to convert to another base
  1681. NrBase%     desired number base (2-31)
  1682. -------
  1683. Number$     resulting number in desired base (init >= 16 chars)
  1684. NumberLen%  length of the result (-1 if string too short)
  1685.  
  1686. Name  : Delay                (Delay for seconds)
  1687. Class : Time
  1688. Level : Clone
  1689.  
  1690. This routine delays for a given number of seconds.  The timing
  1691. will be the same from an 8088 PC through an 80486 AT-- it's
  1692. entirely independent of the processor.  See also Delay18th.
  1693.  
  1694.    Delay Seconds%
  1695.  
  1696. Seconds%   number of seconds for which to delay
  1697.  
  1698. Name  : Delay18th            (Delay for 1/18th seconds)
  1699. Class : Time
  1700. Level : Clone
  1701.  
  1702. This routine delays for a given number of 18ths of seconds.
  1703. The timing will be the same from an 8088 PC through an 80486
  1704. AT-- it's entirely independent of the processor.  See also
  1705. Delay.
  1706.  
  1707.    Delay WaitTime%
  1708.  
  1709. WaitTime%  number of 18ths of seconds for which to delay
  1710.  
  1711. Name  : DelayV               (Delay based on Video timing)
  1712. Class : Time
  1713. Level : Clone
  1714.  
  1715. This routine delays for a given number of milliseconds.  The
  1716. timing is based on a signal from the video adapter and may vary
  1717. somewhat depending on the adapter.  The delay is largely
  1718. independent of the cpu type and speed, however.
  1719.  
  1720. For anyone unfamiliar with the metric system: there are 1000
  1721. milliseconds in one second.  Depending on the specific display
  1722. adapter, this routine may well be fairly inaccurate; it is
  1723. intended for providing small delays for animation and similar
  1724. purposes, not as a reliable timer.
  1725.  
  1726.    DelayV MilliSeconds%
  1727.  
  1728. MilliSeconds%   number of milliseconds for which to delay
  1729.  
  1730. Name  : DelChr               (Delete Character)
  1731. Class : Display
  1732. Level : Clone
  1733.  
  1734. The DelChr routine deletes the character at the specified
  1735. screen location.
  1736.  
  1737.    DelChr Row%, Column%
  1738.  
  1739. Row%      row of character
  1740. Column%   column of character
  1741.  
  1742. Name  : DelLine              (Delete Line)
  1743. Class : Display
  1744. Level : BIOS
  1745.  
  1746. This routine deletes the specified row from the screen.
  1747.  
  1748.    DelLine Row%, Attr%
  1749.  
  1750. Row%      row to delete
  1751. Attr%     color/attr to use on new bottom row (see CalcAttr)
  1752.  
  1753. Name  : DelFile              (Delete File)
  1754. Class : Disk
  1755. Level : DOS
  1756.  
  1757. This works like the DOS DEL (or ERASE) command, although it
  1758. does not allow wildcards.  The specified file is deleted.  Full
  1759. path specifications are supported, including drive and
  1760. subdirectory specs.
  1761.  
  1762.    DelFile FileName$, ErrCode%
  1763.  
  1764. FileName$   name of the file to delete
  1765. -------
  1766. ErrCode%    0 if no error, else DOS Error
  1767.  
  1768. Name  : DelSub               (Delete Subdirectory)
  1769. Class : Disk
  1770. Level : DOS
  1771.  
  1772. This works like the DOS RD (or RMDIR) command.  It does not
  1773. allow wildcards. The specified subdirectory is deleted.  Note
  1774. that you may not delete a subdirectory that you're located in,
  1775. or a subdirectory which contains files, or the root directory.
  1776.  
  1777.    DelSub SubDir$, ErrCode%
  1778.  
  1779. SubDir$     name of the subdirectory to delete
  1780. -------
  1781. ErrCode%    0 if no error, else DOS Error
  1782.  
  1783. Name  : DFRead               (Direct-to-memory File Read)
  1784. Class : Disk
  1785. Level : DOS
  1786.  
  1787. This routine reads data into an array from a file that was
  1788. opened by FOpen or FCreate.  If it wasn't possible to read it
  1789. all from the file, an error code will be returned and the
  1790. BytesRead% value will tell you how many bytes were actually
  1791. read.
  1792.  
  1793.    DFRead Handle%, DSeg%, DOfs%, Bytes%, BytesRead%, ErrCode%
  1794.  
  1795. Handle%     handle of the file from which to read
  1796. DSeg%       segment of the array into which to read the file
  1797. DOfs%       offset of the array into which to read the file
  1798. Bytes%      number of bytes to read
  1799. -------
  1800. BytesWrit%  # of bytes actually read from the file (if error)
  1801. ErrCode%    error code: 0 if no error, else DOS Error
  1802.  
  1803. Name  : DFWrite              (Direct-from-memory File Write)
  1804. Class : Disk
  1805. Level : DOS
  1806.  
  1807. This routine writes data from an array to a file that was
  1808. opened by FOpen or FCreate.  If it wasn't possible to write it
  1809. all to the file, an error code will be returned and the
  1810. BytesWrit% value will tell you how many bytes were actually
  1811. written.
  1812.  
  1813.    DFWrite Handle%, DSeg%, DOfs%, Bytes%, BytesWrit%, ErrCode%
  1814.  
  1815. Handle%     handle of the file to which to write
  1816. DSeg%       segment of the data to write to the file
  1817. DOfs%       offset of the data to write to the file
  1818. Bytes%      number of bytes to write
  1819. -------
  1820. BytesWrit%  # of bytes actually written to the file (if error)
  1821. ErrCode%    error code: 0 if no error, else DOS Error
  1822.  
  1823. Name  : DGClear              (Direct-to-memory Graphics Clear)
  1824. Class : Display
  1825. Level : Any
  1826.  
  1827. This routine works like the CLS statement, clearing a CGA
  1828. graphics display. However, rather than clearing the actual
  1829. screen, DClearSS clears a screen that is stored in an array.
  1830. This allows you to design a screen in memory, then flash it
  1831. onto the display using GrafRest.
  1832.  
  1833. This routine is designed for use with SCREEN 1 or SCREEN 2 (CGA
  1834. graphics).
  1835.  
  1836.    DGClear DSeg%, DOfs%, Colour%
  1837.  
  1838. DSeg%     segment of the array that holds the screen
  1839. DOfs%     offset of the array that holds the screen
  1840. Colour%   color to use
  1841.  
  1842. Name  : DGetRec              (Direct-from-memory Get Record)
  1843. Class : String
  1844. Level : Clone
  1845.  
  1846. The DGetRec routine allows you to get a string from a specified
  1847. area of memory (numeric array, BIOS data area, display memory,
  1848. or whatever).  The string should be initialized to the desired
  1849. record length in advance.
  1850.  
  1851. This works somewhat like an array of fixed length strings or a
  1852. random file, treating memory as a contiguous series of records
  1853. of a specified length.
  1854.  
  1855.    DGetRec DSeg%, DOfs%, RecNr%, St$
  1856.  
  1857. DSeg%      segment of the array to read from
  1858. DOfs%      offset of the array to read from
  1859. RecNr%     record number (starting at 1)
  1860. -------
  1861. St$        returned string.  Init to record length (see above).
  1862.  
  1863. Name  : DGetScreen           (Direct memory Get Screen image)
  1864. Class : Display
  1865. Level : Clone
  1866.  
  1867. This routine saves any portion of the display to an array.
  1868. Only text modes are supported.  If your program uses multiple
  1869. display pages, you can get an image from any of those pages.  A
  1870. special "slow" mode is supported for the CGA, to prevent
  1871. flickering (a problem only with some CGAs).
  1872.  
  1873. The size of the integer array needed to store a specific area
  1874. of the screen can be calculated using the CalcSize routine
  1875. (see).
  1876.  
  1877. The GetScreen routine works the same way as this, but has a
  1878. simpler calling convention.  Also, if you wish to save the
  1879. entire screen, you may find ScrSave easier.
  1880.  
  1881.    DGetScreen DSeg%, DOfs%, TRow%, LCol%, BRow%, RCol%,
  1882.       Page%, Fast%
  1883.  
  1884. DSeg%      segment of the array in which to store the image
  1885. DOfs%      offset of the array in which to store the image
  1886. TRow%      top row of the desired screen area
  1887. LCol%      left column of the desired screen area
  1888. BRow%      bottom row of the desired screen area
  1889. RCol%      right column of the desired screen area
  1890. Page%      page from which to get the display area
  1891. Fast%      whether to use fast mode (0 no)
  1892.  
  1893. Name  : DGetSt               (Direct-from-memory Get String)
  1894. Class : String
  1895. Level : Clone
  1896.  
  1897. The DGetSt routine allows you to get a string from a specified
  1898. area of memory (numeric array, BIOS data area, display memory,
  1899. or whatever).  The string should be initialized to the desired
  1900. length in advance.
  1901.  
  1902. You may specify an additional offset from the initial location,
  1903. which itself is specified as a segment and an offset.  The
  1904. second offset begins with position 1.  The combined total of
  1905. the two offsets must be under 65,536 at the moment.  I'll
  1906. remove that restriction at a later time.  With normalized
  1907. segment and offset specifications, which is usually the case,
  1908. this allows you to specify a number from 1-65,521 for the
  1909. second offset.
  1910.  
  1911.    DGetSt DSeg%, DOfs%, Posn&, St$
  1912.  
  1913. DSeg%      segment of the array to read from
  1914. DOfs%      offset of the array to read from
  1915. Posn&      location relative to the start of the array
  1916. -------
  1917. St$        returned string.  Init to # of chars desired.
  1918.  
  1919. Name  : DGQPrint             (Direct Graphics Quick Print)
  1920. Class : Display
  1921. Level : Any
  1922.  
  1923. This is a simple high-speed replacement for the PRINT statement
  1924. which works on a CGA virtual graphics screen (SCREEN 2).  It
  1925. does not interpret control codes or support graphics characters
  1926. (ASCII 128-255).
  1927.  
  1928. DGQPrint allows you to display to a CGA even if it isn't the
  1929. active display (use a segment of &HB800 and offset of 0).  Its
  1930. intended use, however, is to display to a virtual screen kept
  1931. in an array or other memory area.  The results can then be
  1932. displayed using GrafRest.
  1933.  
  1934.    DGQPrint DSeg%, DOfs%, St$, Row%, Column%
  1935.  
  1936. DSeg%    segment of CGA virtual screen
  1937. DOfs%    offset of CGA virtual screen
  1938. St$      string to display
  1939. Row%     row (1-25)
  1940. Column%  column (1-80)
  1941.  
  1942. Name  : DGXQPrint            (Direct Graphics Extended Q Print)
  1943. Class : Display
  1944. Level : Any
  1945.  
  1946. This is a simple high-speed replacement for the PRINT statement
  1947. which works on a CGA virtual graphics screen (SCREEN 1).  It
  1948. does not interpret control codes or support graphics characters
  1949. (ASCII 128-255).
  1950.  
  1951. This routine can also be used on a SCREEN 2 display, where it
  1952. will display the string in shades instead of in color (using 40
  1953. columns/row).
  1954.  
  1955. DGXQPrint allows you to display to a CGA even if it isn't the
  1956. active display (use a segment of &HB800 and offset of 0).  Its
  1957. intended use, however, is to display to a virtual screen kept
  1958. in an array or other memory area.  The results can then be
  1959. displayed using GrafRest.
  1960.  
  1961.    DGXQPrint DSeg%, DOfs%, St$, Row%, Column%, Fore%
  1962.  
  1963. DSeg%    segment of CGA virtual screen
  1964. DOfs%    offset of CGA virtual screen
  1965. St$      string to display
  1966. Row%     row (1-25)
  1967. Column%  column (1-40)
  1968. Fore%    foreground color (0-3)
  1969.  
  1970. Name  : DGXQPrint1           (Direct Graphics Extended Q Print)
  1971. Class : Display
  1972. Level : Any
  1973.  
  1974. This is a high-speed replacement for the PRINT statement which
  1975. works on a CGA virtual graphics screen (SCREEN 1). It does not
  1976. interpret control codes.
  1977.  
  1978. This routine can also be used on a SCREEN 2 display, where it
  1979. will display the string in shades instead of in color (using 40
  1980. columns/row).
  1981.  
  1982. DGXQPrint1 allows you to display to a CGA even if it isn't the
  1983. active display (use a segment of &HB800 and offset of 0).  Its
  1984. intended use, however, is to display to a virtual screen kept
  1985. in an array or other memory area.  The results can then be
  1986. displayed using GrafRest.
  1987.  
  1988.    DGXQPrint1 DSeg%, DOfs%, St$, Row%, Column%, Fore%, Back%
  1989.  
  1990. DSeg%    segment of CGA virtual screen
  1991. DOfs%    offset of CGA virtual screen
  1992. St$      string to display
  1993. Row%     row (1-25)
  1994. Column%  column (1-40)
  1995. Fore%    foreground color (0-3)
  1996. Back%    background color (0-3)
  1997.  
  1998. Name  : DInput               (Dollar Input)
  1999. Class : Input
  2000. Level : Clone
  2001.  
  2002. This routine provides formatted input of a dollar amount.  You
  2003. specify the format and an initial value (may be zero).  You may
  2004. also specify whether to allow negation-- if so, the user may
  2005. press the "-" key to toggle the number between negative and
  2006. positive.  The numeric keypad will automatically be locked into
  2007. the numeric state.  Since the decimal point is implicit, the
  2008. "." key functions as a delete or backspace operation, for
  2009. convenient one-handed data entry and correction.
  2010.  
  2011. The dollar amount is kept in a long integer as a number of
  2012. pennies, to avoid the possibility of round-off errors which
  2013. might result from use of floating point math.  The results are
  2014. returned to you both as a long integer and as a formatted
  2015. number.
  2016.  
  2017. The format string works just like a PRINT USING format string.
  2018. Editing is not as flexible as for SInput, but is quite
  2019. adequate.  The SInputSet routines will work for DInput as well
  2020. as SInput.  The ExitCode% returned is the same as for SInput,
  2021. but left and right arrows may also be returned.
  2022.  
  2023.    DInput Format$, St&, St$, MinusOk%, Attr%, ExitCode%
  2024.  
  2025. Format$    numeric format (just like PRINT USING format)
  2026. St&        dollar amount (in pennies)
  2027. MinusOk%   whether negation is allowed (0 if no)
  2028. Attr%      color/attribute to use (see CalcAttr)
  2029. -------
  2030. St&        dollar amount (in pennies)
  2031. St$        formatted dollar amount
  2032. ExitCode%  key used to exit (ASCII code if +, scan code if -)
  2033.  
  2034. Name  : DiskStat             (Disk Statistics)
  2035. Class : Disk
  2036. Level : DOS
  2037.  
  2038. DiskStat gives you statistics on the memory usage of a
  2039. specified disk drive: the total number of clusters, the number
  2040. of available or free clusters, the number of sectors per
  2041. cluster, and the number of bytes per sector.
  2042.  
  2043. From this information, you can determine how much total disk
  2044. space there is, how much space is left and how much is used,
  2045. the size of a cluster, et al.
  2046.  
  2047. A few formulas for you:
  2048.  
  2049.    ClusterSize% = BytesPerSec% * SecsPerClus%
  2050.    FreeSpace& = FreeClus& * ClusterSize%
  2051.    TotalSpace& = TotalClus& * ClusterSize%
  2052.    UsedSpace& = TotalSpace& - FreeSpace&
  2053.  
  2054. A "cluster" is the minimum amount of disk space that can be
  2055. allocated at a time.  A typical cluster size for a medium-sized
  2056. hard drive is 2048 bytes, which means that any file from 1-2048
  2057. bytes in length is actually taking up a full 2048 bytes on the
  2058. disk.  Large cluster sizes improve file access times but can
  2059. waste a lot of disk space.
  2060.  
  2061.    DiskStat Drive$, FreeClus&, TotalClus&, BytesPerSec%,
  2062.       SecsPerClus%
  2063.  
  2064. Drive$        letter of the drive to examine
  2065. -------
  2066. FreeClus&     number of free or available clusters
  2067. TotalClus&    total number of clusters
  2068. BytesPerSec%  bytes per sector
  2069. SecsPerClus%  sectors per cluster (-1 if bad drive, etc)
  2070.  
  2071. Name  : Dissolve             (Dissolve)
  2072. Class : Display
  2073. Level : Clone
  2074.  
  2075. Like CLS, but a bit more fancy, this routine provides an
  2076. interesting way to clear the screen.  See also FadeOut.
  2077.  
  2078. This routine may cause heavy flickering on some CGA displays.
  2079.  
  2080.    Dissolve Attr%
  2081.  
  2082. Attr%   color/attribute to which to clear (see CalcAttr)
  2083.  
  2084. Name  : DMPrint              (DOS Message Print)
  2085. Class : Display
  2086. Level : DOS
  2087.  
  2088. This routine is similar to PRINT, but goes through DOS output
  2089. services, which allows your program to support output
  2090. redirection, filters, CTTY and other handy things.  See
  2091. DOSInkey for a DOS input service.
  2092.  
  2093. Note that the use of DMPrint means that you should avoid using
  2094. BASIC display handling (CLS, INPUT, LINE INPUT, PRINT, LOCATE,
  2095. CSRLIN, POS, etc).  Instead, you should use ANSI escape
  2096. sequences to control the display.  This requires that an ANSI
  2097. driver (like ANSI.SYS, DVANSI.SYS, NANSI.SYS, or ZANSI.SYS) be
  2098. installed on your system.  See your DOS manual for details on
  2099. ANSI sequences, or grab the documentation on ANSI from one of
  2100. your friendly local BBSes.
  2101.  
  2102. It is -possible- to use BASIC display handling in conjunction
  2103. with DMPrint, but that tends to defeat the purpose of using
  2104. DMPrint in the first place.
  2105.  
  2106. Note that the DMPrint routine does not add a carriage
  2107. return/linefeed to the end of a string.  If you want that, add
  2108. CHR$(13) + CHR$(10) to the end of the string.
  2109.  
  2110.    DMPrint St$
  2111.  
  2112. St$    string to display
  2113.  
  2114. Name  : DOSClrEol            (DOS Clear to End Of Line)
  2115. Class : Display
  2116. Level : DOS
  2117.  
  2118. This routine clears from the cursor position to the end of the
  2119. row using DOS output functions.  It requires that ANSI.SYS or
  2120. another ANSI driver be installed.
  2121.  
  2122.    DOSClrEol
  2123.  
  2124. Name  : DOSCls               (DOS Clear Screen)
  2125. Class : Display
  2126. Level : DOS
  2127.  
  2128. This routine clears the screen using DOS output functions.  It
  2129. requires that ANSI.SYS or another ANSI driver be installed.
  2130.  
  2131.    DOSCls
  2132.  
  2133. Name  : DOSColor             (DOS Color)
  2134. Class : Display
  2135. Level : DOS
  2136.  
  2137. This routine sets the screen colors using DOS output
  2138. functions.  It requires that ANSI.SYS or another ANSI driver be
  2139. installed.
  2140.  
  2141.    DOSColor Fore%, Back%
  2142.  
  2143. Fore%    foreground color
  2144. Back%    background color
  2145.  
  2146. Name  : DOSErrM$             (DOS Error Message)
  2147. Class : Miscellaneous
  2148. Level : DOS
  2149.  
  2150. Of the many PBClone routines that return error codes, most
  2151. simply pass the code back from DOS without any processing.  You
  2152. can see what the codes mean by checking the chart in
  2153. PBClone.DOC, or it may be more convenient to use DOSErrM$
  2154. instead.  This routine returns a short text description of the
  2155. error in question.
  2156.  
  2157.    ErrMsg$ = DOSErrM$(ErrCode%)
  2158.  
  2159. ErrCode%     error code to translate
  2160. -------
  2161. ErrMsg$      brief explanation of the error
  2162.  
  2163. Name  : DOSInkey             (DOS INKEY$)
  2164. Class : Input
  2165. Level : DOS
  2166.  
  2167. This routine is similar to INKEY$, but goes through DOS input
  2168. services, which allows your program to support input
  2169. redirection, filters, CTTY and other handy things.  See DMPrint
  2170. for a DOS output service.  See also DOSInky$.
  2171.  
  2172.    DOSInkey CharCode%, CharType%
  2173.  
  2174. -------
  2175. CharType%    0 if no key, 1 if normal key, 2 if extended key
  2176. CharCode%    ASCII code if normal key, scan code if extended key
  2177.  
  2178. Name  : DOSInky$             (DOS INKEY$)
  2179. Class : Input
  2180. Level : DOS
  2181.  
  2182. This routine works just like INKEY$, but goes through DOS input
  2183. services, which allows your program to support input
  2184. redirection, filters, CTTY and other handy things.  See DMPrint
  2185. for a DOS output service.  See also DOSInkey.
  2186.  
  2187.    ky$ = DOSInky$
  2188.  
  2189. -------
  2190. ky$      key, if any was waiting (0-2 chars/key, like INKEY$)
  2191.  
  2192. Name  : DOSInt%              (DOS Interrupt)
  2193. Class : Miscellaneous
  2194. Level : DOS
  2195.  
  2196. This routine provides you with easy access to DOS functions via
  2197. INT 21H, the major DOS interrupt.  It works like the CALL
  2198. INTERRUPT routines provided with QuickBASIC but is easier to
  2199. use, at the expense of some flexibility.
  2200.  
  2201. CAUTION: This routine works directly with DOS, bypassing most
  2202. of BASIC's safety precautions.  Possible chaos may result if
  2203. you don't know what you're doing!  A few specific caveats:
  2204.  
  2205.    1) Do Not use this routine to exit your program or execute
  2206.       another.  BASIC needs to clean up after itself before
  2207.       these tasks, and bypassing its handling is liable to make
  2208.       the system unstable at best.
  2209.  
  2210.    2) If you expect to use a string or array as a buffer, make
  2211.       sure it is long enough to handle the maximum amount of
  2212.       information anticipated. Strings and arrays can move
  2213.       about in memory, so be sure to get their addresses Just
  2214.       Before using DOSInt%.
  2215.  
  2216. If you wish to specify BASIC's data segment for DS, you can
  2217. find out what that is using the DataSeg routine (q.v.).
  2218.  
  2219. Normally, the CarryFlag% will be set if there is an error, in
  2220. which case AX will return the error code.
  2221.  
  2222.    CarryFlag% = DOSInt%(AX%, BX%, CX%, DX%, DS%)
  2223.  
  2224. AX%         desired setting of the AX register
  2225. BX%         desired setting of the BX register
  2226. CX%         desired setting of the CX register
  2227. DX%         desired setting of the DX register
  2228. DS%         desired setting of the DS and ES registers
  2229. -------
  2230. AX%         returned setting of the AX register
  2231. BX%         returned setting of the BX register
  2232. CX%         returned setting of the CX register
  2233. DX%         returned setting of the DX register
  2234. DS%         returned setting of the DS and ES registers
  2235. CarryFlag%  returned carry flag (0 no error, else code in AX)
  2236.  
  2237. Name  : DOSLocate            (DOS Locate)
  2238. Class : Display
  2239. Level : DOS
  2240.  
  2241. This routine sets the cursor position using DOS output
  2242. functions.  It requires that ANSI.SYS or another ANSI driver be
  2243. installed.
  2244.  
  2245. Note that many ANSI drivers do not fully support EGA or VGA
  2246. modes in that they are limited to a maximum of 25 rows.
  2247.  
  2248.    DOSLocate Row%, Column%
  2249.  
  2250. Row%      row
  2251. Column%   column
  2252.  
  2253. Name  : DPutRec              (Direct-to-memory Put Record)
  2254. Class : String
  2255. Level : Clone
  2256.  
  2257. The DPutRec routine allows you to put a string into a specified
  2258. area of memory (numeric array, BIOS data area, display memory,
  2259. or whatever).  The string should be initialized to the desired
  2260. record length in advance.
  2261.  
  2262. This works somewhat like an array of fixed length strings or a
  2263. random file, treating memory as a contiguous series of records
  2264. of a specified length.
  2265.  
  2266.    DPutRec DSeg%, DOfs%, RecNr%, St$
  2267.  
  2268. DSeg%      segment of the array to write into
  2269. DOfs%      offset of the array to write into
  2270. RecNr%     record number (starting at 1)
  2271. St$        string to write.  Init to record length (see above).
  2272.  
  2273. Name  : DPutScreen           (Direct-from-memory Put Screen)
  2274. Class : Display
  2275. Level : Clone
  2276.  
  2277. This routine restores a portion of the display (which was saved
  2278. to an array by DGetScreen or GetScreen) to the screen.  Only
  2279. text modes are supported. If your program uses multiple display
  2280. pages, you can put the image onto any of those pages.  A
  2281. special "slow" mode is supported for the CGA, to prevent
  2282. flickering (a problem only with some CGAs).
  2283.  
  2284. The PutScreen routine works the same way as this, but has a
  2285. simpler calling convention.  Also, if you wish to restore the
  2286. entire screen, you may find ScrRest easier (see).
  2287.  
  2288.    DPutScreen DSeg%, DOfs%, TRow%, LCol%, BRow%, RCol%,
  2289.       Page%, Fast%
  2290.  
  2291. DSeg%      segment of the array from which to restore the image
  2292. DOfs%      offset of the array from which to restore the image
  2293. TRow%      top row of the desired screen area
  2294. LCol%      left column of the desired screen area
  2295. BRow%      bottom row of the desired screen area
  2296. RCol%      right column of the desired screen area
  2297. Page%      page on which to restore the display
  2298. Fast%      whether to use fast mode (0 no)
  2299.  
  2300. Name  : DPutSt               (Direct-to-memory Put String)
  2301. Class : String
  2302. Level : Clone
  2303.  
  2304. The DPutSt routine allows you to put a string into a specified
  2305. area of memory (numeric array, BIOS data area, display memory,
  2306. or whatever).
  2307.  
  2308. You may specify an additional offset from the initial location,
  2309. which itself is specified as a segment and an offset.  The
  2310. second offset begins with position 1.  The combined total of
  2311. the two offsets must be under 65,536 at the moment.  I'll
  2312. remove that restriction at a later time.  With normalized
  2313. segment and offset specifications, which is usually the case,
  2314. this allows you to specify a number from 1-65,521 for the
  2315. second offset.
  2316.  
  2317.    DPutSt DSeg%, DOfs%, Posn&, St$
  2318.  
  2319. DSeg%      segment of the array to write to
  2320. DOfs%      offset of the array to write to
  2321. Posn&      location relative to the start of the array
  2322. St$        string to write into memory
  2323.  
  2324. Name  : DRecDel              (Direct-to-memory Record Deletion)
  2325. Class : Array management
  2326. Level : Any
  2327.  
  2328. This routine allows you to delete an item from an array.  The
  2329. item may consist of one or more array elements.  The size of
  2330. the array isn't actually changed, but the array elements are
  2331. moved as if a deletion took place.
  2332.  
  2333.    DRecDel DSeg%, DOfs%, RecNr%, RecLen%, Records%
  2334.  
  2335. DSeg%      segment of the array
  2336. DOfs%      offset of the array
  2337. RecNr%     record/element number (starting at 1)
  2338. RecLen%    record/element length in bytes
  2339. Records%   total number of records/elements in the array
  2340.  
  2341. Name  : DRecIns              (Direct-to-mem Record Insertion)
  2342. Class : Array management
  2343. Level : Any
  2344.  
  2345. This routine allows you to insert an item into an array.  The
  2346. item may consist of one or more array elements.  The size of
  2347. the array isn't actually changed, but the array elements are
  2348. moved as if an insertion took place.  You must of course make
  2349. sure that the array is DIMed large enough to handle this.
  2350.  
  2351.    DRecIns DSeg%, DOfs%, RecNr%, RecLen%, Records%
  2352.  
  2353. DSeg%      segment of the array
  2354. DOfs%      offset of the array
  2355. RecNr%     record/element number (starting at 1)
  2356. RecLen%    record/element length in bytes
  2357. Records%   total number of records/elements in the array
  2358.  
  2359. Name  : DRecolor             (Direct-to-memory Recolor)
  2360. Class : Display
  2361. Level : Any
  2362.  
  2363. The DRecolor routine changes all text in one color to another
  2364. color.  It works only in text modes.  The colors are specified
  2365. as attributes (see CalcAttr).
  2366.  
  2367. This routine does not necessarily work on the display itself.
  2368. Instead, it allows you to specify the memory location (segment
  2369. and offset) of the "screen", which may be an actual screen, a
  2370. saved screen in an array, a multitasker's virtual screen, etc.
  2371. Among other things, this makes it easy to work with two
  2372. displays at once: use a segment of &HB000 for the mono display
  2373. and &HB800 for the color display (the offset in each case is
  2374. zero).
  2375.  
  2376.    DRecolor DSeg%, DOfs%, OldAttr%, NewAttr%
  2377.  
  2378. DSeg%      segment of "screen" memory
  2379. DOfs%      offset of "screen" memory
  2380. OldAttr%   color to be changed
  2381. NewAttr%   color to which to change
  2382.  
  2383. Name  : DRecolorArea         (Direct-to-memory Recolor Area)
  2384. Class : Display
  2385. Level : Clone
  2386.  
  2387. The DRecolorArea routine changes a specified area of the screen
  2388. to a specified color.  It works only in text modes.  The color
  2389. is specified as an attribute (see CalcAttr).
  2390.  
  2391. One of the more common applications for this routine is marking
  2392. an area of the screen, e.g. menu highlight bars.
  2393.  
  2394.    DRecolorArea DSeg%, DOfs%, TRow%, LCol%, BRow%, RCol%, Attr%
  2395.  
  2396. This routine does not necessarily work on the display itself.
  2397. Instead, it allows you to specify the memory location (segment
  2398. and offset) of the "screen", which may be an actual screen, a
  2399. saved screen in an array, a multitasker's virtual screen, etc.
  2400. Among other things, this makes it easy to work with two
  2401. displays at once: use a segment of &HB000 for the mono display
  2402. and &HB800 for the color display (the offset in each case is
  2403. zero).
  2404.  
  2405. DSeg%       segment of "screen" memory
  2406. DOfs%       offset of "screen" memory
  2407. TRow%       top row of area to recolor
  2408. LCol%       left column of area to recolor
  2409. BRow%       bottom row of area to recolor
  2410. RCol%       right column of area to recolor
  2411. Attr%       desired color
  2412.  
  2413. Name  : DriveSpace&          (Drive Space free)
  2414. Class : Disk
  2415. Level : DOS
  2416.  
  2417. This routine tells you how many bytes are free on a specified
  2418. disk drive.
  2419.  
  2420.    BytesFree& = DriveSpace&(Drive$)
  2421.  
  2422. Drive$      letter of the drive to examine
  2423. -------
  2424. BytesFree&  free bytes on the specified drive, or -1 if error
  2425.  
  2426. Name  : DrvSpaceL            (Drive Space free as Long integer)
  2427. Class : Disk
  2428. Level : DOS
  2429.  
  2430. This routine tells you how many bytes are free on a specified
  2431. disk drive. See also DriveSpace, a function-type version of
  2432. this routine.
  2433.  
  2434.    DrvSpaceL Drive$, BytesFree&
  2435.  
  2436. Drive$      letter of the drive to examine
  2437. -------
  2438. BytesFree&  free bytes on the specified drive, or -1 if error
  2439.  
  2440. Name  : DrvType              (Drive Type)
  2441. Class : Disk
  2442. Level : DOS 3.1+
  2443.  
  2444. The DrvType routine tells you whether a specified drive is
  2445. fixed or removeable, and whether it is local or remote (network
  2446. drive).
  2447.  
  2448.    DrvType Drive$, Removeable%, Remote%, ErrCode%
  2449.  
  2450. Drive$       letter of the drive to examine
  2451. -------
  2452. Removeable%  whether the disk can be removed (0 if no)
  2453. Remote%      whether this is a remote drive (0 if no)
  2454. ErrCode%     error code: 0 if none, else bad DOS version
  2455.  
  2456. Name  : DScrRest             (Direct-from-mem Screen Restore)
  2457. Class : Display
  2458. Level : Clone
  2459.  
  2460. The DScrRest routine restores a display that was saved using
  2461. ScrSave or a similar routine.  It only works in text modes.
  2462. See also ScrRest.
  2463.  
  2464.    DScrRest DSeg%, DOfs%, Page%, Fast%
  2465.  
  2466. DSeg%      segment of info to restore to the screen
  2467. DOfs%      offset of info to restore to the screen
  2468. Page%      page on which to restore the display
  2469. Fast%      whether to use fast mode (0 no)
  2470.  
  2471. Name  : DScrSave             (Direct-from-memory Screen Save)
  2472. Class : Display
  2473. Level : Clone
  2474.  
  2475. The DScrSave routine saves the display to an array or other
  2476. storage area. Only text modes are supported.  For an 80x25
  2477. display, the array must hold 4,000 bytes (4,000 string
  2478. characters or 2,000 integers).  See also ScrSave.
  2479.  
  2480.    DScrSave DSeg%, DOfs%, Page%, Fast%
  2481.  
  2482. DSeg%      segment of place to store the display
  2483. DOfs%      offset of place to store the display
  2484. Page%      page from which to get the display
  2485. Fast%      whether to use fast mode (0 no)
  2486.  
  2487. Name  : DTR                  (Data Terminal Ready signal)
  2488. Class : Serial
  2489. Level : Clone
  2490.  
  2491. Just as IBM provided the standard for personal computers, Hayes
  2492. provided the standard for modem commands.  Unfortunately, the
  2493. command method of dropping carrier (hanging up the phone) was
  2494. badly designed, and all Hayes-compatible modems have a hard
  2495. time recognizing that command under certain line conditions.
  2496.  
  2497. Fortunately, there's a more reliable way of hanging up: the DTR
  2498. serial signal.  Turning this signal off will cause the modem to
  2499. hang up very quickly.  Most Hayes-compatible modems are
  2500. factory-set to pay attention to the DTR; those that aren't can
  2501. be made to do so either by flipping a hardware switch or with a
  2502. special initialization command.  See your modem manual for
  2503. details.
  2504.  
  2505. BASIC will drop the DTR when you CLOSE the comm port, but this
  2506. isn't always a convenient way to do it.  As a matter of fact,
  2507. this can be a decided nuisance, so many people have patched
  2508. their version of BASIC to avoid it.  If you would like to do
  2509. so, check your local BBS for the method!  With the PBClone DTR
  2510. routine, you can get full control over the DTR without having
  2511. to CLOSE the comm port.
  2512.  
  2513. Note: it may be wise to include a brief delay after dropping
  2514. the DTR, to give the modem a chance to react.  Try Delay18th
  2515. (see) with a wait of around 4.
  2516.  
  2517.    DTR CommPort%, TurnOn%
  2518.  
  2519. CommPort%    serial port (1-4, though BASIC only handles 1-2)
  2520. TurnOn%      whether to raise (turn on) the DTR (0 if no)
  2521.  
  2522. Name  : DWindowManager       (Direct-to-memory Window Manager)
  2523. Class : Display
  2524. Level : Any
  2525.  
  2526. DWindowManager displays a pop-up window according to your
  2527. specifications. The window may have any of a variety of frames,
  2528. a title, or a shadow, and it may appear instantly or "grow"
  2529. onto the screen.
  2530.  
  2531. These are the available frame types:
  2532.     0   no frame
  2533.     1   single lines
  2534.     2   double lines
  2535.     3   single horizontal, double vertical lines
  2536.     4   double horizontal, single vertical lines
  2537.     5   block graphic lines
  2538.  
  2539. These are the available shadows:
  2540.    -3   transparent shadow on the right
  2541.    -2   transparent shadow on the left
  2542.    -1   solid black shadow on the left
  2543.     0   no shadow
  2544.    1+   shadow attribute (use CalcAttr) for a colored shadow
  2545.  
  2546. Options for growing windows are as follows:
  2547.    -1   grow as fast as possible
  2548.     0   pop onto the screen
  2549.    1+   grow with delay given in milliseconds (15 works for me)
  2550.  
  2551. Note that this routine is different from its ProBas equivalent
  2552. in a number of respects.  The grow delay time is different.
  2553. Growing is done more smoothly. The shadow and title parameters
  2554. are not changed by this routine.  A new frame type (5) was
  2555. added.  If a title is too long, it is truncated instead of
  2556. being ignored completely.  Using a -1 as the title foreground
  2557. color will not turn off the title; instead, use a null title
  2558. string.
  2559.  
  2560.    DWindowManager DSeg%, DOfs%, TRow%, LCol%, BRow%, RCol%,
  2561.       Frame%, Fore%, Back%, Grow%, Shade%, TFore%, Title$
  2562.  
  2563. This routine does not necessarily work on the display itself.
  2564. Instead, it allows you to specify the memory location (segment
  2565. and offset) of the "screen", which may be an actual screen, a
  2566. saved screen in an array, a multitasker's virtual screen, etc.
  2567. Among other things, this makes it easy to work with two
  2568. displays at once: use a segment of &HB000 for the mono display
  2569. and &HB800 for the color display (the offset in each case is
  2570. zero).
  2571.  
  2572. DSeg%       segment of "screen" memory
  2573. DOfs%       offset of "screen" memory
  2574. TRow%       top row of window
  2575. LCol%       left column of window
  2576. BRow%       bottom row of window
  2577. RCol%       right column of window
  2578. Frame%      frame type (see above)
  2579. Fore%       frame foreground color
  2580. Back%       frame background color
  2581. Grow%       window growing option (see above)
  2582. Shade%      window shadow option (see above)
  2583. TFore%      title foreground color
  2584. Title$      window title ("" if none)
  2585.  
  2586. Name  : DWindowMan2          (Direct-to-memory Window Manager)
  2587. Class : Display
  2588. Level : Any
  2589.  
  2590. This routine is identical to DWindowManager but for the fact
  2591. that it allows you to design your own custom window frames.
  2592. Please see the description of DWindowManager for general
  2593. information.
  2594.  
  2595. These are the additional frame types:
  2596.     6   custom frame composed of a single character
  2597.     7   custom frame composed of the specified 7-character list:
  2598.         top left corner, top middle, top right corner,
  2599.         left middle, right middle,
  2600.         bottom left corner, bottom middle, bottom right corner
  2601.  
  2602.  /------------------------------------------------------------\
  2603.  | A custom frame like this would be defined as frame type 7, |
  2604.  | with a frame string of "/-\||\-/", for instance.           |
  2605.  \------------------------------------------------------------/
  2606.  
  2607.  *************************************************
  2608.  * On the other hand, a frame like this would be *
  2609.  * frame type 6, with a frame string of "*".     *
  2610.  *************************************************
  2611.  
  2612. Note that this routine differs from the ProBas equivalent in
  2613. that it supports full frame definitions through frame type 7
  2614. (ProBas only supports type 6). The other differences mentioned
  2615. under WindowManager are also relevant.
  2616.  
  2617.    DWindowMan2 DSeg%, DOfs%, TRow%, LCol%, BRow%, RCol%,
  2618.       Frame%, FSt$, Fore%, Back%, Grow%, Shade%, TFore%, Title$
  2619.  
  2620. DSeg%       segment of "screen" memory
  2621. DOfs%       offset of "screen" memory
  2622. TRow%       top row of window
  2623. LCol%       left column of window
  2624. BRow%       bottom row of window
  2625. RCol%       right column of window
  2626. Frame%      frame type (see above)
  2627. FSt$        frame definition string (see above)
  2628. Fore%       frame foreground color
  2629. Back%       frame background color
  2630. Grow%       window growing option (see above)
  2631. Shade%      window shadow option (see above)
  2632. TFore%      title foreground color
  2633. Title$      window title ("" if none)
  2634.  
  2635. Name  : DWindowMan3          (Direct-to-memory Window Manager)
  2636. Class : Display
  2637. Level : Any
  2638.  
  2639. This routine is identical in function to DWindowManager.  The
  2640. parameters are mostly passed as an array, however, instead of
  2641. one by one.  Please see the description of DWindowManager for
  2642. general information.
  2643.  
  2644.    DWindowMan3 Parm%(), Title$
  2645.  
  2646. DSeg%       segment of "screen" memory
  2647. DOfs%       offset of "screen" memory
  2648. Parm%(1)    top row of window
  2649. Parm%(2)    left column of window
  2650. Parm%(3)    bottom row of window
  2651. Parm%(4)    right column of window
  2652. Parm%(5)    frame type (see above)
  2653. Parm%(6)    frame foreground color
  2654. Parm%(7)    frame background color
  2655. Parm%(8)    window growing option (see above)
  2656. Parm%(9)    window shadow option (see above)
  2657. Parm%(10)   title foreground color
  2658. Title$      window title ("" if none)
  2659.  
  2660. Name  : DWindowMan4          (Direct-to-memory Window Manager)
  2661. Class : Display
  2662. Level : Any
  2663.  
  2664. This is an extremely cut-down version of DWindowManager,
  2665. providing no more than a simple frame generator.
  2666.  
  2667. These are the available frame types:
  2668.     0   no frame
  2669.     1   single lines
  2670.     2   double lines
  2671.     3   single horizontal, double vertical lines
  2672.     4   double horizontal, single vertical lines
  2673.     5   block graphic lines
  2674.  
  2675. Note that this routine is different from its ProBas equivalent
  2676. in that a new frame type (5) is available.
  2677.  
  2678.    DWindowMan4 DSeg%, DOfs%, TRow%, LCol%, BRow%, RCol%,
  2679.       Frame%, Attr%
  2680.  
  2681. DSeg%       segment of "screen" memory
  2682. DOfs%       offset of "screen" memory
  2683. TRow%       top row of window
  2684. LCol%       left column of window
  2685. BRow%       bottom row of window
  2686. RCol%       right column of window
  2687. Frame%      frame type (see above)
  2688. Attr%       frame color/attribute (use CalcAttr)
  2689.  
  2690. Name  : DXQPrint             (Direct Extended Quick Print)
  2691. Class : Display
  2692. Level : Any
  2693.  
  2694. This routine provides a rather crude, but very fast, display
  2695. capability.  It works like the PRINT statement in BASIC, except
  2696. that it doesn't move the cursor or process control codes.  It
  2697. works only in text modes.
  2698.  
  2699. This routine does not necessarily work on the display itself.
  2700. Instead, it allows you to specify the memory location (segment
  2701. and offset) of the "screen", which may be an actual screen, a
  2702. saved screen in an array, a multitasker's virtual screen, etc.
  2703. Among other things, this makes it easy to work with two
  2704. displays at once: use a segment of &HB000 for the mono display
  2705. and &HB800 for the color display (the offset in each case is
  2706. zero).
  2707.  
  2708.    DXQPrint DSeg%, DOfs%, St$, Row%, Column%, Attr%
  2709.  
  2710. DSeg%     segment of "screen" memory
  2711. DOfs%     offset of "screen" memory
  2712. St$       string to display
  2713. Row%      starting row
  2714. Column%   starting column
  2715. Attr%     color/attribute (see CalcAttr)
  2716.  
  2717. Name  : EGARest7             (EGA Restore for SCREEN 7)
  2718. Class : Display
  2719. Level : Clone
  2720.  
  2721. This routine allows you to restore a SCREEN 7 (EGA, 320x200, 16
  2722. color) display that was saved using EGASave7 (see).
  2723.  
  2724.    EGARest7 DSeg%, DOfs%
  2725.  
  2726. DSeg%        segment of storage array, returned by VARSEG
  2727. DOfs%        offset  of storage array, returned by VARPTR
  2728.  
  2729. Name  : EGARest8             (EGA Restore for SCREEN 8)
  2730. Class : Display
  2731. Level : Clone
  2732.  
  2733. This routine allows you to restore a SCREEN 8 (EGA, 640x200, 16
  2734. color) display that was saved using EGASave8 (see).
  2735.  
  2736.    EGARest8 DSeg%, DOfs%
  2737.  
  2738. DSeg%        segment of storage array, returned by VARSEG
  2739. DOfs%        offset  of storage array, returned by VARPTR
  2740.  
  2741. Name  : EGARest9             (EGA Restore for SCREEN 9)
  2742. Class : Display
  2743. Level : Clone
  2744.  
  2745. This routine allows you to restore a SCREEN 9 (EGA, 640x350, 16
  2746. color) display that was saved using EGASave9 (see).
  2747.  
  2748.    EGARest9 DSeg1%, DOfs1%, DSeg2%, DOfs2%
  2749.  
  2750. DSeg1%       segment of storage array #1, returned by VARSEG
  2751. DOfs1%       offset  of storage array #1, returned by VARPTR
  2752. DSeg2%       segment of storage array #2, returned by VARSEG
  2753. DOfs2%       offset  of storage array #2, returned by VARPTR
  2754.  
  2755. Name  : EGASave7             (EGA Save for SCREEN 7)
  2756. Class : Display
  2757. Level : Clone
  2758.  
  2759. This routine allows you to save a SCREEN 7 (EGA, 320x200, 16
  2760. color) display that can be restored using EGARest7 (see).
  2761.  
  2762. The array used to hold the screen must contain 32,000 bytes.
  2763. For an integer array, this means that you must create the array
  2764. by DIM Array%(1 TO 16000).
  2765.  
  2766.    EGASave7 DSeg%, DOfs%
  2767.  
  2768. DSeg%        segment of storage array, returned by VARSEG
  2769. DOfs%        offset  of storage array, returned by VARPTR
  2770.  
  2771. Name  : EGASave8             (EGA Save for SCREEN 8)
  2772. Class : Display
  2773. Level : Clone
  2774.  
  2775. This routine allows you to save a SCREEN 8 (EGA, 640x200, 16
  2776. color) display that can be restored using EGARest8 (see).
  2777.  
  2778. The array used to hold the screen must contain 64,000 bytes.
  2779. For an integer array, this means that you must create the array
  2780. by DIM Array%(1 TO 32000).
  2781.  
  2782.    EGASave8 DSeg%, DOfs%
  2783.  
  2784. DSeg%        segment of storage array, returned by VARSEG
  2785. DOfs%        offset  of storage array, returned by VARPTR
  2786.  
  2787. Name  : EGASave9             (EGA Save for SCREEN 9)
  2788. Class : Display
  2789. Level : Clone
  2790.  
  2791. This routine allows you to save a SCREEN 9 (EGA, 640x350, 16
  2792. color) display that can be restored using EGARest9 (see).
  2793.  
  2794. Two arrays must be used to hold the screen, for a total of
  2795. 112,000 bytes.  If you use integer arrays, each array must be
  2796. created by DIM Array%(1 TO 28000).
  2797.  
  2798.    EGASave9 DSeg%, DOfs%
  2799.  
  2800. DSeg1%       segment of storage array #1, returned by VARSEG
  2801. DOfs1%       offset  of storage array #1, returned by VARPTR
  2802. DSeg2%       segment of storage array #2, returned by VARSEG
  2803. DOfs2%       offset  of storage array #2, returned by VARPTR
  2804.  
  2805. Name  : Elapsed              (Elapsed time)
  2806. Class : Time
  2807. Level : Any
  2808.  
  2809. This routine tells you the amount of time elapsed between a
  2810. given starting time and ending time.  The difference between
  2811. the times must be less than 24 hours for the results to be
  2812. meaningful.
  2813.  
  2814. See also ElapsedTime, the FUNCTION version of this routine.
  2815.  
  2816.    Elapsed TimeStart$, TimeStop$, TimeDiff$
  2817.  
  2818. TimeStart$   starting time
  2819. TimeStop$    ending time
  2820. -------
  2821. TimeDiff$    elapsed time
  2822.  
  2823. Name  : ElapsedTime$         (Elapsed time)
  2824. Class : Time
  2825. Level : Any
  2826.  
  2827. This routine tells you the amount of time elapsed between a
  2828. given starting time and ending time.  The difference between
  2829. the times must be less than 24 hours for the results to be
  2830. meaningful.
  2831.  
  2832. See also Elapsed, the SUB version of this routine.
  2833.  
  2834.    TimeDiff$ = ElapsedTime$(TimeStart$, TimeStop$)
  2835.  
  2836. TimeStart$   starting time
  2837. TimeStop$    ending time
  2838. -------
  2839. TimeDiff$    elapsed time
  2840.  
  2841. Name  : EMSBuffer            (EMS Buffer size)
  2842. Class : Memory
  2843. Level : BIOS
  2844.  
  2845. EMSBuffer tells you how many bytes are needed to save the state
  2846. of the EMS array routines.  Used in conjunction with EMSSave
  2847. and EMSRest, it allows you to preserve EMS arrays across a
  2848. CHAIN to another part of your program.
  2849.  
  2850.    EMSBuffer Bytes%
  2851.    EMSState$ = SPACE$(Bytes%)
  2852.    EMSSave EMSState$
  2853.  
  2854. -------
  2855. Bytes%       bytes needed to save EMS array state
  2856.  
  2857. Name  : EMSClose             (EMS Close)
  2858. Class : Memory
  2859. Level : BIOS
  2860.  
  2861. The EMSClose routine is used when you are finished with an EMS
  2862. array.  It frees the array handle and EMS memory for other
  2863. uses.  If you don't close all EMS arrays before your program
  2864. ends, the memory will be lost until the system is rebooted, so
  2865. it is important to remember EMSClose.
  2866.  
  2867.    EMSClose ArrayHandle%
  2868.  
  2869. ArrayHandle%    handle of an EMS array
  2870.  
  2871. Name  : EMSGet               (EMS Get)
  2872. Class : Memory
  2873. Level : BIOS
  2874.  
  2875. This routine gets an element from an EMS array created by
  2876. EMSOpen.  Element numbers start at 0.  Be sure to use the right
  2877. numeric type for the array-- for instance, if you opened the
  2878. array for SINGLE precision, use "Value!".
  2879.  
  2880.    EMSGet ArrayHandle%, ElementNr&, Value
  2881.  
  2882. ArrayHandle%    handle of an EMS array
  2883. ElementNr&      element number to get
  2884. -------
  2885. Value           result (must be correct type for array)
  2886.  
  2887. Name  : EMSOpen              (EMS Open)
  2888. Class : Memory
  2889. Level : BIOS
  2890.  
  2891. This routine allows you to open a block of EMS (expanded)
  2892. memory which can then be accessed like a numeric array.  The
  2893. array size is limited only by available EMS memory (use GetLIMM
  2894. to find out how much is available).  You may specify any
  2895. numeric type:
  2896.  
  2897.     1   INTEGER
  2898.     2   LONG or SINGLE
  2899.     3   DOUBLE
  2900.  
  2901. When the array is opened, you are returned an "array handle"
  2902. which is used to access that array.  Access to the array is
  2903. done via EMSGet and EMSPut.  When you are finished with the
  2904. array, you must close it with EMSClose.
  2905.  
  2906. As many as 25 EMS arrays can be in use at one time, subject to
  2907. limitations which may be imposed by your EMS driver (each array
  2908. requires one EMS handle).
  2909.  
  2910.    EMSOpen Elements&, ElementType%, ArrayHandle%, ErrCode%
  2911.  
  2912. Elements&       number of elements in array (like DIM size)
  2913. ElementType%    numeric type of array (see above)
  2914. -------
  2915. ArrayHandle%    handle of an EMS array
  2916. ErrCode%        whether an error occurred (0 no)
  2917.  
  2918. Name  : EMSPut               (EMS Put)
  2919. Class : Memory
  2920. Level : BIOS
  2921.  
  2922. This routine puts an element into an EMS array created by
  2923. EMSOpen.  Element numbers start at 0.  Be sure to use the right
  2924. numeric type for the array-- for instance, if you opened the
  2925. array for SINGLE precision, use "Value!".
  2926.  
  2927.    EMSPut ArrayHandle%, ElementNr&, Value
  2928.  
  2929. ArrayHandle%    handle of an EMS array
  2930. ElementNr&      element number to set
  2931. Value           value to store (must be correct type for array)
  2932.  
  2933. Name  : EMSRest              (EMS Restore state)
  2934. Class : Memory
  2935. Level : BIOS
  2936.  
  2937. This routine allows you to restore the state of the EMS array
  2938. handler.  Used in conjunction with EMSBuffer and EMSSave, it
  2939. allows you to preserve EMS arrays across a CHAIN to another
  2940. part of your program.
  2941.  
  2942.    EMSRest EMSState$
  2943.  
  2944. EMSState$    saved EMS array state
  2945.  
  2946. Name  : EMSSave              (EMS Save state)
  2947. Class : Memory
  2948. Level : BIOS
  2949.  
  2950. This routine allows you to save the state of the EMS array
  2951. handler.  Used in conjunction with EMSBuffer and EMSRest, it
  2952. allows you to preserve EMS arrays across a CHAIN to another
  2953. part of your program.
  2954.  
  2955.    EMSBuffer Bytes%
  2956.    EMSState$ = SPACE$(Bytes%)
  2957.    EMSSave EMSState$
  2958.  
  2959. -------
  2960. EMSState$    saved EMS array state
  2961.  
  2962. Name  : EnhKbd               (Enhanced Keyboard)
  2963. Class : Input
  2964. Level : BIOS
  2965.  
  2966. By default, the PBClone routines assume an old-style keyboard
  2967. is in use, for greatest compatibility.  EnhKbd allows you to
  2968. turn on enhanced keyboard handling for the current generation
  2969. of (usually) 101-key keyboards.  This allows access to the F11
  2970. and F12 function keys as well as codes for key combinations
  2971. that used to be ignored, among other things.
  2972.  
  2973. The KbdType or KbdType2% routine can be used to determine if an
  2974. enhanced keyboard is available (recommended).
  2975.  
  2976. Note that EnhKbd works by intercepting the BIOS keyboard
  2977. handler.  All calls to the BIOS keyboard interrupt are
  2978. converted from the old keyboard functions to the new ones.  YOU
  2979. MUST DISABLE EnhKbd BEFORE YOUR PROGRAM ENDS, so it can restore
  2980. the old setup.  Otherwise, the computer will most probably
  2981. crash.
  2982.  
  2983. A list of the new key codes is given in PBClone.DOC.
  2984.  
  2985.    EnhKbd Enable%
  2986.  
  2987. Enable%     turn on enhanced keyboard support (0 disable)
  2988.  
  2989. Name  : EuropeDate           (European Date format)
  2990. Class : Time
  2991. Level : Any
  2992.  
  2993. This routine takes a date in one of the American formats
  2994. ("MM/DD/YY" or "MM-DD-YYYY") and converts it to the European
  2995. convention ("DD.MM.YY" or "DD.MM.YYYY").  The date is formatted
  2996. according to a format string which provides the desired
  2997. delimiter and year length, e.g. "##-##-##" specifies a
  2998. delimiter of "-" and a year length of two digits.
  2999.  
  3000. An error code is returned if the date is not valid.
  3001.  
  3002.    EuropeDate DateSt$, Format$, Result$, ErrCode%
  3003.  
  3004. DateSt$     date to format (month, day, year order)
  3005. Format$     format for the date
  3006. -------
  3007. Result$     resulting date (day, month, year order)
  3008. ErrCode     whether the date is valid (0 ok)
  3009.  
  3010. Name  : Equipment            (Equipment information)
  3011. Class : Equipment
  3012. Level : BIOS
  3013.  
  3014. This routine gives you some information about the basic
  3015. equipment in your computer.  Note that the "game port"
  3016. information is not reliable, due to changes in the meaning of
  3017. this particular area of the BIOS over many years.
  3018.  
  3019.    Equipment Memory%, Parallel%, Serial%, Game%
  3020.  
  3021. -------
  3022. Memory%    kilobytes of conventional memory installed (16 - 640)
  3023. Parallel%  parallel (printer) ports installed (0-4)
  3024. Serial%    serial (communications) ports installed (0-4)
  3025. Game%      game (joystick) ports installed (0-1).  See remarks, above.
  3026.  
  3027. Name  : EWindowManagerC      (EGA Window Manager w Char coords)
  3028. Class : Display
  3029. Level : Clone
  3030.  
  3031. EWindowManagerC displays a pop-up window according to your
  3032. specifications. The window may have any of a variety of frames,
  3033. a title, or a shadow, and it may appear instantly or "grow"
  3034. onto the screen.  EGA and VGA graphics modes (SCREEN 7 through
  3035. SCREEN 12) are supported.
  3036.  
  3037. These are the available frame types:
  3038.     0   no frame
  3039.     1   single lines
  3040.     2   double lines
  3041.     3   single horizontal, double vertical lines
  3042.     4   double horizontal, single vertical lines
  3043.     5   block graphic lines
  3044.  
  3045. These are the available shadows:
  3046.     0   no shadow
  3047.    1+   shadow attribute (use CalcAttr) for a colored shadow
  3048.  
  3049. Options for growing windows are as follows:
  3050.    -1   grow as fast as possible
  3051.     0   pop onto the screen
  3052.    1+   grow with delay given in milliseconds (not recommended)
  3053.  
  3054. The differences between this routine and its ProBas equivalent
  3055. are the same as mentioned in the description for
  3056. WindowManager.  In addition, growing windows are supported, but
  3057. are not recommended (too slow).  Colored shadows work as in
  3058. WindowManager.  "True" shadows are not yet supported.
  3059.  
  3060.    EWindowManagerC TRow%, LCol%, BRow%, RCol%, Frame%,
  3061.       Fore%, Back%, Grow%, Shade%, S1%, S2%, TFore%, Title$
  3062.  
  3063. TRow%       top row of window
  3064. LCol%       left column of window
  3065. BRow%       bottom row of window
  3066. RCol%       right column of window
  3067. Frame%      frame type (see above)
  3068. Fore%       frame foreground color
  3069. Back%       frame background color
  3070. Grow%       window growing option (see above)
  3071. Shade%      window shadow option (see above)
  3072. S1%         unused
  3073. S2%         unused
  3074. TFore%      title foreground color
  3075. Title$      window title ("" if none)
  3076.  
  3077. Name  : Exist                (file Existence)
  3078. Class : Disk
  3079. Level : DOS
  3080.  
  3081. Most versions of BASIC give you no way of seeing if a file
  3082. exists before you try to OPEN it, so you end up taking your
  3083. chances.  The Exist routine allows you to test to see if the
  3084. file exists beforehand.  It isn't really necessary for the
  3085. PBClone file routines, which will return an appropriate error
  3086. code, but it's an important safeguard when using the BASIC OPEN
  3087. statement.
  3088.  
  3089. The Exist routine does not support wildcards.  If you need that
  3090. feature, try the FindFirstFx and FindNextFx routines instead.
  3091.  
  3092. See also Exist2, the FUNCTION version of this routine.
  3093.  
  3094.    Exist FileName$, Found%
  3095.  
  3096. FileName$   name of the file to look for
  3097. -------
  3098. Found%      whether the file was found (0 if no)
  3099.  
  3100. Name  : Exist2%              (file Existence)
  3101. Class : Disk
  3102. Level : DOS
  3103.  
  3104. Most versions of BASIC give you no way of seeing if a file
  3105. exists before you try to OPEN it, so you end up taking your
  3106. chances.  The Exist2% function allows you to test to see if the
  3107. file exists beforehand.  It isn't really necessary for the
  3108. PBClone file routines, which will return an appropriate error
  3109. code, but it's an important safeguard when using the OPEN
  3110. statement.
  3111.  
  3112. The Exist2% routine does not support wildcards.  If you need
  3113. that feature, try the FindFirstFx and FindNextFx routines
  3114. instead.
  3115.  
  3116. See also Exist, the SUB version of this routine.
  3117.  
  3118.    Found% = Exist2%(FileName$)
  3119.  
  3120. FileName$   name of the file to look for
  3121. -------
  3122. Found%      whether the file was found (0 if no)
  3123.  
  3124. Name  : ExplainFAttr$        (Explain File Attribute)
  3125. Class : Disk
  3126. Level : Any
  3127.  
  3128. This function returns a string explaining what a file attribute
  3129. means, using a specified level of abbreviation.  A single space
  3130. is used between each word, e.g. a hidden subdirectory at
  3131. abbreviation level 2 would be "Hid Dir".
  3132.  
  3133. Abbreviation Levels:
  3134.         1           2              3
  3135.    ---------------------------------------
  3136.  1      R          R-O         Read-Only
  3137.  2      H          Hid         Hidden
  3138.  4      S          Sys         System
  3139.  8      V          Vol         Volume
  3140. 16      D          Dir         Directory
  3141. 32      A          Arc         Archive
  3142.  
  3143. This function is convenient in conjunction with any of the
  3144. routines which return a file attribute: GetAttrF, GetAttrFx,
  3145. GetFAttr, LoadDirAll.
  3146.  
  3147.    Info$ = ExplainFAttr$(FilAttr%, AbbrevLevel%)
  3148.  
  3149. We use FilAttr% instead of FileAttr%, since BASIC has a
  3150. built-in FILEATTR function.
  3151.  
  3152. FilAttr%      file attribute
  3153. -------
  3154. AbbrevLevel%  how much to abbreviate the result (1-3)
  3155.  
  3156. Name  : EXQPrintC            (EGA Extended Quick Print, Char)
  3157. Class : Display
  3158. Level : Clone
  3159.  
  3160. This routine provides a rather crude, but very fast, display
  3161. capability.  It works like the PRINT statement in BASIC, except
  3162. that it doesn't move the cursor or process control codes.  It
  3163. works in EGA and VGA graphics modes (SCREEN 7 through SCREEN
  3164. 12).
  3165.  
  3166.    EXQPrintC St$, Row%, Column%, Fore%, Back%
  3167.  
  3168. St$       string to display
  3169. Row%      starting row
  3170. Column%   starting column
  3171. Fore%     foreground color
  3172. Back%     background color
  3173.  
  3174. Name  : ExtendFSpec          (Extend File Specification)
  3175. Class : Disk
  3176. Level : DOS
  3177.  
  3178. The ExtendFSpec routine combines a number of handy services
  3179. together.  It is intended for processing user-entered file
  3180. specifications.  It does the following:
  3181.  
  3182.    1) Makes sure the filespec is valid
  3183.    2) Formats the filespec to normal DOS standards
  3184.    3) Tells you whether the drive and subdirectories
  3185.       specified exist
  3186.    4) Fills out any drive or subdirectory information that
  3187.       was left out (optionally includes adding an extension
  3188.       to files which lack one)
  3189.  
  3190. The error codes returned are as follows:
  3191.    -1    Invalid file specification
  3192.     0    No error
  3193.     1    Specified drive does not exist (warning only)
  3194.     2    Specified subdirectory does not exist (warning only)
  3195.  
  3196. The ExtendFSpec routine mimics DOS filename handling exactly,
  3197. to the best of my knowledge.
  3198.  
  3199.    ExtendFSpec File$, Ext$, FullFile$, ErrCode%
  3200.  
  3201. File$      file specification to process
  3202. Ext$       extension to add to files that don't have extensions
  3203. -------
  3204. FullFile$  processed file specification
  3205. ErrCode%   error code
  3206.  
  3207. Name  : ExtGet               (Extended memory Get)
  3208. Class : Memory
  3209. Level : BIOS (AT)
  3210.  
  3211. This routine allows you to get information from extended
  3212. memory.  It should only be used on AT-class computers, since
  3213. older PCs do not support extended memory.
  3214.  
  3215. You may get up to 32,766 words (just under 64 kilobytes) at a
  3216. time from a specified location in extended memory.  The
  3217. location is specified as the distance from the start of
  3218. extended memory, starting at 1 for the first location.  One
  3219. word is equivalent to one integer.
  3220.  
  3221. See ExtMem for information on extended memory constraints.
  3222.  
  3223.    ExtGet DSeg%, DOfs%, Posn&, Words%, ErrCode%
  3224.  
  3225. DSeg%       segment of array to place data from extended memory
  3226. DOfs%       offset of array to place data from extended memory
  3227. Posn&       location of data in extended memory (starting at 1)
  3228. Words%      # of words to transfer (1 int = 1 word = 2 byte)
  3229. -------
  3230. ErrCode%    error code (0 if no error)
  3231.  
  3232. Name  : ExtMem               (Extended Memory)
  3233. Class : Memory / Equipment
  3234. Level : BIOS (AT)
  3235.  
  3236. This routine allows you to find out how much extended memory is
  3237. available. It should only be used on AT-class computers, since
  3238. older PCs do not support extended memory.
  3239.  
  3240. The amount of memory returned may be either the total amount of
  3241. extended memory installed or just the amount available at this
  3242. time, depending on how previously-installed programs (if any)
  3243. make use of extended memory. Unfortunately, there is no
  3244. standard which defines how a program should use extended memory
  3245. as there is with EMS (expanded memory), so there is no way for
  3246. a program to determine whether or how another program is using
  3247. extended memory.  Microsoft is trying to clear up this
  3248. situation with its HIMEM driver (available at your local BBS,
  3249. or [last I looked] free from Microsoft), but this approach
  3250. hasn't really become standard yet.
  3251.  
  3252.    ExtMem KBytes%
  3253.  
  3254. -------
  3255. KBytes%     the number of kilobytes of extended memory
  3256.  
  3257. Name  : ExtPut               (Extended memory Put)
  3258. Class : Memory
  3259. Level : BIOS (AT)
  3260.  
  3261. This routine allows you to put information into extended
  3262. memory.  It should only be used on AT-class computers, since
  3263. older PCs do not support extended memory.
  3264.  
  3265. You may put up to 32,766 words (just under 64 kilobytes) at a
  3266. time into a specified location in extended memory.  The
  3267. location is specified as the distance from the start of
  3268. extended memory, starting at 1 for the first location.  One
  3269. word is equivalent to one integer.
  3270.  
  3271. Note that you can't rely on extended memory being available
  3272. just because it exists.  There is no automatic way to determine
  3273. if another program is also trying to use the same extended
  3274. memory.  If in doubt, allow a user-installed option to
  3275. enable/disable the use of extended memory by your program.
  3276.  
  3277.    ExtPut DSeg%, DOfs%, Posn&, Words%, ErrCode%
  3278.  
  3279. DSeg%       segment of data to store in extended memory
  3280. DOfs%       offset of data to store in extended memory
  3281. Posn&       location to place data in extended memory
  3282. Words%      # of words to transfer (1 int = 1 word = 2 bytes)
  3283. -------
  3284. ErrCode%    error code (0 if no error)
  3285.  
  3286. Name  : Extract              (Extract delimited substring)
  3287. Class : String
  3288. Level : Any
  3289.  
  3290. Extract allows you to remove any one of a list of delimited
  3291. substrings in a string.  It's useful for input parsing and
  3292. database work.  You pass it the string, delimiter, and the
  3293. number of the desired substring (numbers start at one).  It
  3294. returns the starting position of the substring within the
  3295. string and the length of the substring (0 if not found).
  3296.  
  3297. Just for example, let's assume we have a string as follows:
  3298.    St$ = "Tom Hanlin=3544 E. Southern Ave #104=Mesa, AZ 85204"
  3299.  
  3300. If we selected a delimiter of "=" and substring number three,
  3301. the results would be "Mesa, AZ 85204".
  3302.  
  3303. Delimiters of more than one character are fine.  This can be
  3304. handy for locating carriage return/linefeed pairs, among other
  3305. things.
  3306.  
  3307.    Extract St$, Delimiter$, SubStrNr%, StartPosn%, SLen%
  3308.    SubSt$ = MID$(St$, StartPosn%, SLen%)
  3309.  
  3310. St$         string from which to extract
  3311. Delimiter$  delimiter between substrings
  3312. SubStrNr%   number of the desired substring
  3313. -------
  3314. StartPosn%  starting position of substring within the string
  3315. SLen%       length of the substring (0 if none)
  3316.  
  3317. Name  : FadeOut              (Fade Out)
  3318. Class : Display
  3319. Level : Clone
  3320.  
  3321. Like CLS, but a bit more fancy, this routine provides an
  3322. interesting way to clear the screen.  See also Dissolve.
  3323.  
  3324.    FadeOut Attr%
  3325.  
  3326. Attr%   color/attribute to which to clear (see CalcAttr)
  3327.  
  3328. Name  : FarPeek%             (Far memory Peek)
  3329. Class : Memory
  3330. Level : Clone
  3331.  
  3332. This is like the BASIC PEEK function, but expects both a
  3333. segment and an offset, thus doing away with the need for DEF
  3334. SEG.  This is especially handy for use in subprograms which
  3335. might otherwise inadvertently change the DEF SEG value expected
  3336. by the main program.
  3337.  
  3338.    Value% = FarPeek%(DSeg%, DOfs%)
  3339.  
  3340. Related routines include FarPeekI%, FarPeekL&, DGetSt, DGetRec.
  3341.  
  3342. DSeg%    segment of the location to look at
  3343. DOfs%    offset of the location to look at
  3344. -------
  3345. Value%   value at the specified memory location (byte: 0-255)
  3346.  
  3347. Name  : FarPeekI%            (Far memory Peek Integer)
  3348. Class : Memory
  3349. Level : Clone
  3350.  
  3351. This is like the BASIC PEEK function, but expects both a
  3352. segment and an offset, thus doing away with the need for DEF
  3353. SEG.  This is especially handy for use in subprograms which
  3354. might otherwise inadvertently change the DEF SEG value expected
  3355. by the main program.  Unlike PEEK, this routine returns a word
  3356. (integer) rather than a byte.
  3357.  
  3358.    Value% = FarPeekI%(DSeg%, DOfs%)
  3359.  
  3360. Related routines include FarPeek%, FarPeekL&, DGetSt, DGetRec.
  3361.  
  3362. DSeg%    segment of the location to look at
  3363. DOfs%    offset of the location to look at
  3364. -------
  3365. Value%   value at the specified memory location (word)
  3366.  
  3367. Name  : FarPeekL&            (Far memory Peek Long integer)
  3368. Class : Memory
  3369. Level : Clone
  3370.  
  3371. This is like the BASIC PEEK function, but expects both a
  3372. segment and an offset, thus doing away with the need for DEF
  3373. SEG.  This is especially handy for use in subprograms which
  3374. might otherwise inadvertently change the DEF SEG value expected
  3375. by the main program.  Unlike PEEK, this routine returns a dword
  3376. (long integer) rather than a byte.
  3377.  
  3378.    Value& = FarPeekL&(DSeg%, DOfs%)
  3379.  
  3380. Related routines include FarPeek%, FarPeekI%, DGetSt, DGetRec.
  3381.  
  3382. DSeg%    segment of the location to look at
  3383. DOfs%    offset of the location to look at
  3384. -------
  3385. Value&   value at the specified memory location (dword)
  3386.  
  3387. Name  : FarPoke              (Far memory Poke)
  3388. Class : Memory
  3389. Level : Clone
  3390.  
  3391. This is like the BASIC POKE statement, but expects both a
  3392. segment and an offset, thus doing away with the need for DEF
  3393. SEG.  This is especially handy for use in subprograms which
  3394. might otherwise inadvertently change the DEF SEG value expected
  3395. by the main program.
  3396.  
  3397.    FarPoke DSeg%, DOfs%, Value%
  3398.  
  3399. Related routines include FarPokeI, FarPokeL, DPutSt, DPutRec.
  3400.  
  3401. DSeg%    segment of the location to look at
  3402. DOfs%    offset of the location to look at
  3403. Value%   value to store in the given memory posn (byte: 0-255)
  3404.  
  3405. Name  : FarPokeI             (Far memory Poke Integer)
  3406. Class : Memory
  3407. Level : Clone
  3408.  
  3409. This is like the BASIC POKE statement, but expects both a
  3410. segment and an offset, thus doing away with the need for DEF
  3411. SEG.  This is especially handy for use in subprograms which
  3412. might otherwise inadvertently change the DEF SEG value expected
  3413. by the main program.  Unlike POKE, this routine stores a word
  3414. or integer.
  3415.  
  3416.    FarPokeI DSeg%, DOfs%, Value%
  3417.  
  3418. Related routines include FarPoke, FarPokeL, DPutSt, DPutRec.
  3419.  
  3420. DSeg%    segment of the location to look at
  3421. DOfs%    offset of the location to look at
  3422. Value%   value to store in the given memory posn (word)
  3423.  
  3424. Name  : FarPokeL             (Far memory Poke Long integer)
  3425. Class : Memory
  3426. Level : Clone
  3427.  
  3428. This is like the BASIC POKE statement, but expects both a
  3429. segment and an offset, thus doing away with the need for DEF
  3430. SEG.  This is especially handy for use in subprograms which
  3431. might otherwise inadvertently change the DEF SEG value expected
  3432. by the main program.  Unlike POKE, this routine stores a dword
  3433. or long integer.
  3434.  
  3435.    FarPokeL DSeg%, DOfs%, Value&
  3436.  
  3437. Related routines include FarPoke, FarPokeI, DPutSt, DPutRec.
  3438.  
  3439. DSeg%    segment of the location to look at
  3440. DOfs%    offset of the location to look at
  3441. Value&   value to store in the given memory posn (dword)
  3442.  
  3443. Name  : FClose               (File Close)
  3444. Class : Disk
  3445. Level : DOS
  3446.  
  3447. This routine closes a file that was opened by FOpen or
  3448. FCreate.  It can also be used to close any of the predefined
  3449. device handles.
  3450.  
  3451. These are the predefined device handles that are always
  3452. available:
  3453.  
  3454.    0    CON     stdin     standard input, normally the keyboard
  3455.    1    CON     stdout    standard output, normally the display
  3456.    2    CON     stderr    standard error, almost always display
  3457.    3    AUX     stdaux    auxiliary device, generally COM1
  3458.    4    PRN     stdprn    standard printer, generally LPT1
  3459.  
  3460. If you are running short of handles, you can always close
  3461. stdaux to free up a handle.  The stdprn device can also be
  3462. closed as long as you don't use the printer or if you only
  3463. access the printer through LPRINT.  It is not a good idea to
  3464. close stdin, stdout, or stderr under normal circumstances.
  3465.  
  3466.    FClose Handle%
  3467.  
  3468. Handle%    handle of the file to close
  3469.  
  3470. Name  : FCreate              (File Create)
  3471. Class : Disk
  3472. Level : DOS
  3473.  
  3474. This routine creates a file and opens it for use by the PBClone
  3475. file handling routines.  If the file already existed, it will
  3476. be wiped out, so you may want to check beforehand if this is a
  3477. problem.  Try the Exist routine.
  3478.  
  3479. The file is opened in read/write mode, allowing both input and
  3480. output.
  3481.  
  3482. You may create the file using any of the following attributes:
  3483.  
  3484.    Normal          0      (nothing special)
  3485.    Read Only       1      file can be read, but not written to
  3486.    Hidden          2      file is "invisible"
  3487.    System          4      special DOS system file
  3488.  
  3489. The attributes can be combined by adding them together.  Don't
  3490. use the System attribute unless you know what you're doing!
  3491.  
  3492. Note that this routine does not support file sharing.  If that
  3493. is a problem, close the file just after it is created and
  3494. reopen it using FOpen.
  3495.  
  3496.    FCreate FileName$, Attr%, Handle%, ErrCode%
  3497.  
  3498. FileName$  name of the file to create
  3499. Attr%      attribute(s) of the file
  3500. -------
  3501. Handle%    handle by which to access the file (if no error)
  3502. ErrCode%   error code: 0 if no error, else DOS Error
  3503.  
  3504. Name  : FGetLoc              (File Get Location)
  3505. Class : Disk
  3506. Level : DOS
  3507.  
  3508. This routine tells you the position of the file pointer of a
  3509. file that was opened using FOpen or FCreate.  This pointer is
  3510. used to specify where the next item should be read from or
  3511. written to the file.  The first location of the file is
  3512. numbered 1.
  3513.  
  3514. See also FGetLoc2, the FUNCTION version of this routine.
  3515.  
  3516.    FGetLoc Handle%, Posn&
  3517.  
  3518. Handle%    handle of the file
  3519. -------
  3520. Posn&      location of the file pointer
  3521.  
  3522. Name  : FGetLoc2&            (File Get Location)
  3523. Class : Disk
  3524. Level : DOS
  3525.  
  3526. This routine tells you the position of the file pointer of a
  3527. file that was opened using FOpen or FCreate.  This pointer is
  3528. used to specify where the next item should be read from or
  3529. written to the file.  The first location of the file is
  3530. numbered 1.
  3531.  
  3532. See also FGetLoc, the SUB version of this routine.
  3533.  
  3534.    Posn& = FGetLoc2&(Handle%)
  3535.  
  3536. Handle%    handle of the file
  3537. -------
  3538. Posn&      location of the file pointer
  3539.  
  3540. Name  : FileCopy             (File Copy)
  3541. Class : Disk
  3542. Level : DOS
  3543.  
  3544. This routine copies one or more files, just like the DOS
  3545. command "COPY".
  3546.  
  3547. FileCopy works exactly like the DOS COPY command, except it
  3548. won't append files.  You may use wildcards in both source and
  3549. destination file specifications.  In the event of an error,
  3550. normal DOS error codes are returned, with two exceptions:
  3551.  
  3552.   -2  attempt to copy files over themselves
  3553.   -1  attempt to copy multiple sources to a single dest file
  3554.  
  3555. See also CopyFile, a simpler routine which doesn't support
  3556. wildcards.
  3557.  
  3558.    FileCopy SrcFile$, DestFile$, FCount%, ByteCount&, ErrCode%
  3559.  
  3560. SrcFile$    source file name(s)
  3561. DestFile$   destination file name(s)
  3562. -------
  3563. FCount%     number of files copied
  3564. ByteCount&  number of bytes copied
  3565. ErrCode%    error code (0 if no error)
  3566.  
  3567. Name  : FileCount            (File Count)
  3568. Class : Disk
  3569. Level : DOS
  3570.  
  3571. This routine returns the number of files which match a given
  3572. file specification and attribute.  You need to use this routine
  3573. before LoadDir or LoadDirAll in order to DIM the array to the
  3574. appropriate size.
  3575.  
  3576. The attribute can be any of the usual file attributes:
  3577.    1   Read-Only
  3578.    2   Hidden
  3579.    4   System
  3580.   16   Directory
  3581.  
  3582. You can combine attributes by adding their values.  For
  3583. instance, to search for hidden directories, you'd use an
  3584. attribute of 18.  By default, DOS returns normal files as well
  3585. as files which have the specified attributes, so an attribute
  3586. of 18 would get you normal files, hidden files, directories,
  3587. and hidden directories.  However, FileCount can be made to
  3588. screen out unwanted files-- just negate the attribute to force
  3589. only files of that attribute to be counted.  For example, an
  3590. attribute of -18 would return only hidden subdirectories.
  3591.  
  3592.    FileCount FileSpec$, FilAttr%, Count%, ErrCode%
  3593.  
  3594. We use FilAttr% instead of FileAttr%, since BASIC has a
  3595. built-in FILEATTR function.
  3596.  
  3597. FileSpec$   search filename (may contain wildcards)
  3598. FilAttr%    search file attribute
  3599. -------
  3600. Count%      number of matching files found
  3601. ErrCode%    error code (0 if no error)
  3602.  
  3603. Name  : FileCRC              (File CRC)
  3604. Class : Disk
  3605. Level : DOS
  3606.  
  3607. This routine calculates a 32-bit CRC for a file.  This CRC is
  3608. derived by a formula which takes each character of the file
  3609. into consideration.  It provides a powerful (although not 100%
  3610. foolproof) way to verify that a file hasn't changed since you
  3611. last checked.
  3612.  
  3613.    FileCRC FileName$, Result&, ErrCode%
  3614.  
  3615. FileName$   source file name(s)
  3616. -------
  3617. Result&     32-bit CRC of the file
  3618. ErrCode%    error code (0 if no error)
  3619.  
  3620. Name  : FindFirstA           (Find First file in an Archive)
  3621. Class : Disk
  3622. Level : DOS
  3623.  
  3624. The FindFirstA routine is used to find the first file that
  3625. matches search parameters which you specify.  Various
  3626. information about the file that matches (if any) can be
  3627. retrieved by other routines.
  3628.  
  3629. Rather than working on a directory, this routine works on files
  3630. in an archive.  Supported archives include ARC, ARJ, LZH, PAK,
  3631. ZIP and ZOO formats.  If no extension is given, a search will
  3632. be made through each valid archive extension, and the first
  3633. matching archive will be used for the file search.
  3634.  
  3635. Archive names may contain drive and subdirectory
  3636. specifications, but not wildcards.  File names may contain
  3637. wildcards, but not drive/subdir specs.
  3638.  
  3639. When you are done searching, be sure to use CloseA to terminate
  3640. the search.
  3641.  
  3642. Routines in this series include:
  3643.    FindFirstA, FindNextA, GetNameA, GetCRCA, GetCRCAL,
  3644.    GetDateA, GetTimeA, GetSizeAL, GetStoreA
  3645.  
  3646.    FindFirstA ArcName$, FileName$, ErrCode%
  3647.  
  3648. ArcName$    name of archive to search through
  3649. FileName$   name of file(s) for which to search
  3650. -------
  3651. ErrCode%    error code (0 if no error, else no matching files)
  3652.  
  3653. Name  : FindFirstF           (Find First File)
  3654. Class : Disk
  3655. Level : DOS
  3656.  
  3657. This is part of a set of routines included for compatibility
  3658. with ADVBAS and ProBas.  A better solution may be found in
  3659. FindFirstFx.
  3660.  
  3661. The FindFirstF routine is used to find the first file that
  3662. matches search parameters which you specify.  Various
  3663. information about the file that matches (if any) can be
  3664. retrieved by other routines.  See also FindNextF.
  3665.  
  3666. The file name specified may contain a drive and subdirectory
  3667. specification. Wildcards are also allowed.
  3668.  
  3669. Possible search attributes are as follows:
  3670.  
  3671.    Normal          0      (nothing special)
  3672.    Hidden          2      file is "invisible"
  3673.    System          4      special DOS system file
  3674.    Subdirectory   16      subdirectory
  3675.  
  3676. You can combine the attributes by adding them together.  All
  3677. searches will match if any of the specified attributes are
  3678. found, so if you're looking only for a specific attribute, you
  3679. will need to test the results using GetAttrF.
  3680.  
  3681. Routines in this series include:
  3682.    FindFirstF, FindNextF, GetNameF, GetAttrF, GetDateF,
  3683.    GetTimeF, GetSizeFL
  3684.  
  3685.    FindFirstF FileName$, Attr%, ErrCode%
  3686.  
  3687. FileName$   name of file(s) for which to search
  3688. Attr%       file attribute(s) to seek
  3689. -------
  3690. ErrCode%    error code (0 if no error, else no matching files)
  3691.  
  3692. Name  : FindFirstFx          (Find First File, Extended)
  3693. Class : Disk
  3694. Level : DOS
  3695.  
  3696. The FindFirstFx routine is used to find the first file that
  3697. matches search parameters which you specify.  Various
  3698. information about the file that matches (if any) can be
  3699. retrieved by other routines.
  3700.  
  3701. The file name specified may contain a drive and subdirectory
  3702. specification. Wildcards are also allowed.
  3703.  
  3704. Possible search attributes are as follows:
  3705.  
  3706.    Normal          0      (nothing special)
  3707.    Read Only       1      file can be read, but not written to
  3708.    Hidden          2      file is "invisible"
  3709.    System          4      special DOS system file
  3710.    Subdirectory   16      subdirectory
  3711.  
  3712. You can combine the attributes by adding them together.  All
  3713. searches will match if any of the specified attributes are
  3714. found, so if you're looking only for a specific attribute, you
  3715. will need to test the results using GetAttrFx.
  3716.  
  3717. Routines in this series include:
  3718.    FindFirstFx, FindNextFx, GetNameFx$, GetAttrFx%, GetDateFx$,
  3719.    GetTimeFx$, GetSizeFx&
  3720.  
  3721. These routines differ from the older FindFirstF-based series in
  3722. two major respects.  They include a Buffer$ parameter, which
  3723. allows you to have more than one search going on at a time.
  3724. This makes it safe to use these routines in subprograms without
  3725. conflict with the main program.  It also allows you to search
  3726. entire subdirectory trees recursively.  The other major
  3727. difference is that many of these routines are coded as
  3728. functions for greater convenience.
  3729.  
  3730.    Buffer$ = SPACE$(64)
  3731.    FindFirstFx Buffer$, FileName$, Attr%, ErrCode%
  3732.  
  3733. FileName$   name of file(s) for which to search
  3734. Attr%       file attribute(s) to seek
  3735. -------
  3736. Buffer$     buffer used in search (init to 64 characters)
  3737. ErrCode%    error code (0 if no error, else no matching files)
  3738.  
  3739. Name  : FindNextA            (Find Next file in an Archive)
  3740. Class : Disk
  3741. Level : DOS
  3742.  
  3743. This routine is for use after FindFirstA, to find any
  3744. additional archived files which may match your search
  3745. specifications.
  3746.  
  3747. Routines in this series include:
  3748.    FindFirstA, FindNextA, GetNameA, GetCRCA, GetCRCAL,
  3749.    GetDateA, GetTimeA, GetSizeAL, GetStoreA
  3750.  
  3751.    FindNextA ErrCode%
  3752.  
  3753. -------
  3754. ErrCode%    error code (0 if no error, else no matching files)
  3755.  
  3756. Name  : FindNextF            (Find Next File)
  3757. Class : Disk
  3758. Level : DOS
  3759.  
  3760. This routine is for use after FindFirstF, to find any
  3761. additional files which may match your search specifications.
  3762.  
  3763. Routines in this series include:
  3764.    FindFirstF, FindNextF, GetNameF, GetAttrF, GetDateF,
  3765.    GetTimeF, GetSizeFL
  3766.  
  3767.    FindNextF ErrCode%
  3768.  
  3769. -------
  3770. ErrCode%    error code (0 if no error, else no matching files)
  3771.  
  3772. Name  : FindNextFx           (Find Next File, Extended)
  3773. Class : Disk
  3774. Level : DOS
  3775.  
  3776. This routine is for use after FindFirstFx, to find any
  3777. additional files which may match your search specifications.
  3778.  
  3779. Routines in this series include:
  3780.    FindFirstFx, FindNextFx, GetNameFx$, GetAttrFx%, GetDateFx$,
  3781.    GetTimeFx$, GetSizeFx&
  3782.  
  3783.    FindNextFx Buffer$, ErrCode%
  3784.  
  3785. Buffer$     buffer used in search
  3786. -------
  3787. Buffer$     updated buffer
  3788. ErrCode%    error code (0 if no error, else no matching files)
  3789.  
  3790. Name  : FindPatch            (Find Patch location)
  3791. Class : Disk
  3792. Level : DOS
  3793.  
  3794. This is one of a set of routines that allow you to write
  3795. self-modifying code. Your program can patch DATA statements in
  3796. itself or in another program, allowing you to save
  3797. configuration information (for example) without having to
  3798. create additional data files.
  3799.  
  3800. In order for this routine to work, you must have a series of
  3801. DATA statements containing quoted strings of the maximum
  3802. desired length.  The first DATA statement must contain a unique
  3803. string, as FindPatch will use it to locate the data block.
  3804. Note that if your program is patching itself, you must READ the
  3805. unique string rather than assigning it directly, to make sure
  3806. it's unique.  The string must exist at only one place in the
  3807. program.
  3808.  
  3809. See the PDEMO.BAS file if you would like clarification.  This
  3810. little demo program, when compiled, will patch itself with
  3811. whatever you enter on the command line.  For instance, if you
  3812. type PDEMO Banana, it will store "Banana" in its DATA
  3813. statement.  PDEMO will not work in the QuickBASIC environment,
  3814. of course.  You must compile it to an .EXE file.
  3815.  
  3816. A precompiled version of PDEMO has been included.  It was
  3817. compiled with Crescent's PDQ library in addition to PBClone,
  3818. which makes the .EXE file much smaller.  It also doesn't
  3819. capitalize COMMAND$.  You can recompile PDEMO using the
  3820. PCREATE.BAT program (PDQ is not required).
  3821.  
  3822. You may compile the program using any switches.  You may not
  3823. use the /EXEPACK switch for LINK, though, as this may alter the
  3824. program DATA area.  Likewise, you must not use compression
  3825. utilities such as PKLite on the program.
  3826.  
  3827. Routines in this set include FindPatch, SetPatch, PatchDone.
  3828.  
  3829.    FindPatch FileName$, SearchSt$, ErrCode%
  3830.  
  3831. FileName$     name of the file to patch
  3832. SearchSt$     value of the first DATA statement
  3833. MoveBack%     not used
  3834. -------
  3835. ErrCode%      whether search worked (0 yes, <0 no, >0 Error)
  3836.  
  3837. Name  : FloorD#              (Floor, Double-precision)
  3838. Class : String
  3839. Level : Any
  3840.  
  3841. This function returns the largest integer less than or equal to
  3842. the number you give it.  This is most often used for rounding.
  3843.  
  3844.    Result# = FloorD#(Nr#)
  3845.  
  3846. Nr#          number to process
  3847. -------
  3848. Result#      result
  3849.  
  3850. Name  : FloorS!              (Floor, Single-precision)
  3851. Class : String
  3852. Level : Any
  3853.  
  3854. This function returns the largest integer less than or equal to
  3855. the number you give it.  This is most often used for rounding.
  3856.  
  3857.    Result! = FloorS!(Nr!)
  3858.  
  3859. Nr!          number to process
  3860. -------
  3861. Result!      result
  3862.  
  3863. Name  : Floppies             (Floppies installed)
  3864. Class : Equipment / Disk
  3865. Level : BIOS
  3866.  
  3867. The Floppies routine tells you how many floppy drives are
  3868. installed (0-4). See also Floppies2, a function version of this
  3869. routine.
  3870.  
  3871.    Floppies Drives%
  3872.  
  3873. -------
  3874. Drives%  number of floppy disk drives installed
  3875.  
  3876. Name  : Floppies2%           (Floppies installed)
  3877. Class : Equipment / Disk
  3878. Level : BIOS
  3879.  
  3880. The Floppies2 routine tells you how many floppy drives are
  3881. installed (0-4).
  3882.  
  3883.    Drives% = Floppies2%
  3884.  
  3885. -------
  3886. Drives%  number of floppy disk drives installed
  3887.  
  3888. Name  : FloppyType           (Floppy drive Type)
  3889. Class : Equipment / Disk
  3890. Level : Clone (AT)
  3891.  
  3892. This routine tells you what kinds of floppy drives are
  3893. installed, if any.  A code is returned for each drive, as
  3894. follows:
  3895.  
  3896.    0    no drive
  3897.    1    5 1/4"    360K
  3898.    2    5 1/4"    1.2M
  3899.    3    3 1/2"    720K
  3900.    4    3 1/2"    1.44M
  3901.  
  3902. Result codes of 5-7 are available, but not yet defined.  One
  3903. might guess that the 2.88M drive supported by DOS 5.0 will be
  3904. drive type 5.
  3905.  
  3906. Note that this routine supports a maximum of only two drives.
  3907. It is possible for a machine to have up to four drives, but
  3908. there is not currently any good way to find out about them.
  3909.  
  3910. FloppyType should only be used on AT-class machines.  It will
  3911. not work on PC/XT computers and may cause unusual results if
  3912. used on such machines.  It will also not work on some of the
  3913. earliest AT machines, which didn't adhere to the standard CMOS
  3914. format.
  3915.  
  3916.    FloppyType DriveA%, DriveB%
  3917.  
  3918. -------
  3919. DriveA%    drive type of first floppy drive
  3920. DriveB%    drive type of second floppy drive
  3921.  
  3922. Name  : FlushToDisk          (Flush file buffers To Disk)
  3923. Class : Disk
  3924. Level : DOS
  3925.  
  3926. This is a "file safety" routine for use with files opened by
  3927. FOpen or FCreate.  Files are normally buffered by DOS, which
  3928. makes file handling faster but creates the danger of losing the
  3929. file if there is a crash or power outage.  By flushing the file
  3930. to disk, you insure that it is updated to the current moment.
  3931.  
  3932. Note: this routine will need to temporarily create a new file
  3933. handle if DOS versions before 4.0 are used.
  3934.  
  3935.    FlushToDisk Handle%, ErrCode%
  3936.  
  3937. Handle%    handle of the file to flush
  3938. -------
  3939. ErrCode%   error code: 0 if none, else DOS Error
  3940.  
  3941. Name  : FOpen                (File Open)
  3942. Class : Disk
  3943. Level : DOS
  3944.  
  3945. This routine opens an existing file for use with the PBClone
  3946. file handling routines.  If you need to create a file that
  3947. doesn't already exist, use the FCreate routine instead.
  3948.  
  3949. The file may be opened for reading, writing, or both:
  3950.  
  3951.    0   Read
  3952.    1   Write
  3953.    2   Read/Write
  3954.  
  3955. You may specify a file sharing mode for use with networks and
  3956. multitaskers. This will only take effect if the DOS version is
  3957. 3.0 or later and if the DOS SHARE utility has been executed.
  3958. Otherwise, it will be ignored.
  3959.  
  3960.    0   Normal       compatibility mode: no file sharing
  3961.    1   Exclusive    no one else may access the file
  3962.    2   Deny Write   no one else may write to the file
  3963.    3   Deny Read    no one else may read from the file
  3964.    4   Deny None    anyone else may read from or write to file
  3965.  
  3966. Most of the time, "Deny Write" will be appropriate.  This
  3967. allows others to read the file, but not to modify the file on
  3968. you unexpectedly.
  3969.  
  3970. See the discussion of predefined device handles at FClose.
  3971.  
  3972.    FOpen FileName$, ReadWrite%, Sharing%, Handle%, ErrCode%
  3973.  
  3974. FileName$   name of the file to open
  3975. ReadWrite%  whether you want input, output, or both (see above)
  3976. Sharing%    file sharing mode (see above)
  3977. -------
  3978. Handle%    handle by which to access the file (if no error)
  3979. ErrCode%   error code: 0 if no error, else DOS Error
  3980.  
  3981. Name  : ForceMatch$          (Force Match of file to wildcard)
  3982. Class : Disk
  3983. Level : Any
  3984.  
  3985. The ForceMatch$ function allows you to mimic DOS commands that
  3986. operate on source file(s) and destination file(s).  It forces a
  3987. source file name to match a specified pattern (which may
  3988. contain wildcards), producing an appropriate destination file
  3989. name.
  3990.  
  3991. For example, if the source is "TESTNAME.BAS" and the pattern is
  3992. "?RUE*.*", the result would be "TRUENAME.BAS".
  3993.  
  3994. Consider the DOS command "COPY *.BAS A:*.BAK".  The "*.BAK"
  3995. part is the desired pattern.  The "*.BAS" part specifies which
  3996. files to copy to the new pattern.  Each filename that matches
  3997. "*.BAS" is translated through the "*.BAK" pattern to give the
  3998. destination filename.  The ForceMatch$ function is designed to
  3999. do this sort of translation for you.
  4000.  
  4001.    DestFile$ = ForceMatch$(Pattern$, SrcFile$)
  4002.  
  4003. Pattern$   pattern of desired file name (may contain wildcards)
  4004. SrcFile$   file name to force through the pattern
  4005. -------
  4006. DestFile$  resulting file name
  4007.  
  4008. Name  : FormatDate           (Format Date)
  4009. Class : Time
  4010. Level : Any
  4011.  
  4012. This is a highly flexible date formatting routine.  It accepts
  4013. a date in one of the usual American formats ("03-22-1990",
  4014. "03/22/90", or even "3/22/90") and converts it according to a
  4015. format string.  This format string allows you to normalize the
  4016. date, select a new delimiter, choose between two-digit and
  4017. four-digit years, and even change the order from month/day/year
  4018. to anything else.  An error code will be returned if the date
  4019. is not valid.
  4020.  
  4021. The format string can be as simple as "##/##/##", which
  4022. specifies that the usual month/day/year order be used, with a
  4023. delimiter of "/" and a two-digit year.  If you want to change
  4024. the date order, you would need a format like "DD.MM.YYYY"
  4025. instead.  For sorting or storage, you might want to convert the
  4026. date to a plain number, using a format string like "YYYYMMDD".
  4027. The result could then be converted to a LONG with the BASIC VAL
  4028. function.
  4029.  
  4030.    FormatDate DateSt$, Format$, Result$, ErrCode%
  4031.  
  4032. DateSt$     date to format (month, day, year order)
  4033. Format$     format for the date
  4034. -------
  4035. Result$     resulting date
  4036. ErrCode     whether the date is valid (0 ok)
  4037.  
  4038. Name  : FSetEnd              (File Set to End)
  4039. Class : Disk
  4040. Level : DOS
  4041.  
  4042. This moves the file pointer to the end of the file.  It is for
  4043. use with files opened by FOpen or FCreate.  The usual purpose
  4044. for this is to append information to an existing file.
  4045.  
  4046. Note that some text files may have a Control-Z or CHR$(26) on
  4047. the end.  For historical reasons, this character is sometimes
  4048. used as an "end of file" marker.  When dealing with text files,
  4049. you may want to examine the last character of the file to make
  4050. sure it isn't a Control-Z.
  4051.  
  4052. QuickBASIC is among the programs which, unfortunately, put a
  4053. Control-Z at the end of a file (if you OPEN for OUTPUT).  This
  4054. is a bad habit at best.
  4055.  
  4056.    FSetEnd Handle%
  4057.  
  4058. Handle%    handle of the file
  4059.  
  4060. Name  : FSetLoc              (File Set Location to byte)
  4061. Class : Disk
  4062. Level : DOS
  4063.  
  4064. This moves the file pointer to a specified position in the
  4065. file.  It is for use with files opened by FOpen or FCreate.
  4066. File positions are considered to start at 1.
  4067.  
  4068.    FSetLoc Handle%, Posn&
  4069.  
  4070. Handle%    handle of the file
  4071. Posn&      location to which to move
  4072.  
  4073. Name  : FSetOfs              (File Set location by Offset)
  4074. Class : Disk
  4075. Level : DOS
  4076.  
  4077. This moves the file pointer backwards or forwards in the file.
  4078. It is for use with files opened by FOpen or FCreate.
  4079.  
  4080.    FSetOfs Handle%, Offset&
  4081.  
  4082. Handle%    handle of the file
  4083. Offset&    number of bytes by which to move
  4084.  
  4085. Name  : FSetRec              (File Set location to Record)
  4086. Class : Disk
  4087. Level : DOS
  4088.  
  4089. This sets the file pointer to a specific record in the file.
  4090. It is for use with files opened by FOpen or FCreate.
  4091.  
  4092. This routine provides the same function as FSetLoc, but is a
  4093. bit more convenient for dealing with files composed of
  4094. fixed-length records.
  4095.  
  4096.    FSetRec Handle%, RecSize%, RecNr%
  4097.  
  4098. Handle%    handle of the file
  4099. RecSize%   number of bytes per record
  4100. RecNr%     number of record (starting at 1)
  4101.  
  4102. Name  : FSetSize             (File Set Size)
  4103. Class : Disk
  4104. Level : DOS
  4105.  
  4106. Many people have asked how to delete information from a file.
  4107. Well, there's no straightforward way to do it most of the time,
  4108. but if the record is at the end of the file, you can chop it
  4109. right off.
  4110.  
  4111. This routine can also be used to make a file larger, perhaps
  4112. pre-allocating space that will be used later (for better speed).
  4113.  
  4114. The file in question must have been opened by FCreate or FOpen.
  4115.  
  4116.    FSetSize Handle%, Bytes&
  4117.  
  4118. Handle%    handle of the file
  4119. Bytes&     desired file size, in bytes
  4120.  
  4121. Name  : FSize                (File get Size)
  4122. Class : Disk
  4123. Level : DOS
  4124.  
  4125. This routine allows you to get the size of a file that was
  4126. opened by FOpen or FCreate.
  4127.  
  4128. See also FSize2, the FUNCTION version of this routine.
  4129.  
  4130.    FSize Handle%, Bytes&
  4131.  
  4132. Handle%    handle of the file
  4133. -------
  4134. Bytes&     file size, in bytes
  4135.  
  4136. Name  : FSize2&              (File get Size)
  4137. Class : Disk
  4138. Level : DOS
  4139.  
  4140. This routine allows you to get the size of a file that was
  4141. opened by FOpen or FCreate.
  4142.  
  4143. See also FSize, the Sub version of this routine.
  4144.  
  4145.    Bytes& = FSize2&(Handle%)
  4146.  
  4147. Handle%    handle of the file
  4148. -------
  4149. Bytes&     file size, in bytes
  4150.  
  4151.