home *** CD-ROM | disk | FTP | other *** search
/ World of Shareware - Software Farm 2 / wosw_2.zip / wosw_2 / QBAS / PBBACK10.ZIP / PBBACK.MAN < prev    next >
Text File  |  1992-11-08  |  197KB  |  5,976 lines

  1.        PBBack 1.0  (c) 1990-1992  Thomas G. Hanlin III
  2.  
  3. Name  : AddMatI              (Add Matrix Integer)
  4. Class : Array management
  5. Level : Any
  6.  
  7. This routine adds an integer to as many elements of an integer
  8. array as you like, starting at a specified place in the array.
  9. It can also be used to subtract (just specify a negative
  10. value).  If there was a numeric overflow at any point in the
  11. operation, an error code will be returned.
  12.  
  13.    CALL AddMatI (DSeg%, DOfs%, Elements%, Value%, ErrCode%)
  14.  
  15. DSeg%      segment of the first array element to add
  16. DOfs%      offset of the first array element to add
  17. Elements%  number of array elements to which to add
  18. Value%     value to add to each array element
  19. -------
  20. ErrCode%   error code: 0 if no error
  21.  
  22. Name  : AndSt                (AND String)
  23. Class : String
  24. Level : Any
  25.  
  26. This routine ANDs each byte in one string with the
  27. corresponding byte in a second string.  The strings must be the
  28. same length.
  29.  
  30.    CALL AndSt (St1$, St2$)
  31.  
  32. St1$      string to AND
  33. St2$      string to AND with
  34. -------
  35. St1$      result
  36.  
  37. Name  : ArrayPtr             (Array Pointer)
  38. Class : Array_Mgmt
  39. Level : Any
  40.  
  41. This routine returns a pointer to an array, in the form of a
  42. segment and offset.  It works only for STATIC arrays.  Since
  43. the QB 4.x and QBX editor/environments only support DYNAMIC
  44. arrays, it will not work in those environments.
  45.  
  46. String arrays are stored in an unusual format and must not be
  47. used with this routine.  Numeric arrays of any type are fine.
  48.  
  49. This routine is typically used to pass an array to a PBBack
  50. routine.
  51.  
  52.    CALL ArrayPtr (Array%(1), DSeg%, DOfs%)
  53.  
  54. Array%(1)   name of first array element
  55. -------
  56. DSeg%       segment of start of array
  57. DOfs%       offset of start of array
  58.  
  59. Name  : Bickel               (Bickel comparison)
  60. Class : String
  61. Level : Any
  62.  
  63. A string comparison routine, Bickel allows you to see how
  64. closely two strings match.  The better the match, the larger
  65. the returned value will be.  Since there is no constant minimum
  66. or maximum value, this routine is best used for applications
  67. involving dictionary searches.  You would scan the dictionary
  68. and make a list of the best matches.  This is appropriate for a
  69. spelling checker, for instance.
  70.  
  71.    CALL Bickel (St1$, St2$, Result%)
  72.  
  73. St1$      first string to compare
  74. St2$      second string to compare
  75. -------
  76. Result%   resulting "match magnitude" value
  77.  
  78. Name  : BigPrint             (Big Print)
  79. Class : Display
  80. Level : BIOS
  81.  
  82. As the name suggests, this routine displays text in large
  83. characters.  How large?  Eight times as high and as wide as
  84. normal!  Each "big character" will be composed of many
  85. normal-sized characters.  You may choose the normal character
  86. used to create the big characters (the default is a CHR$(219)
  87. solid block character, if you pass a null string here).
  88.  
  89. You should avoid using CHR$(128) to CHR$(255) when in either of
  90. the CGA graphics modes, as many CGAs are unable to display
  91. these characters when in graphics mode.
  92.  
  93.    CALL BigPrint (St$, FormCh$, Row%, Column%, VAttr%)
  94.  
  95. St$       string to display in big characters
  96. FormCh$   character used to compose the big characters
  97. Row%      starting row
  98. Column%   starting column
  99. VAttr%    color/attribute of big characters (see CalcAttr)
  100.  
  101. Name  : BIOSInkey            (BIOS INKEY$)
  102. Class : Input
  103. Level : BIOS
  104.  
  105. BIOSInkey works like INKEY$, but it gets its key directly by
  106. asking the BIOS. The primary advantage of this is that you get
  107. the "scan" code as well as the ASCII code of the key.  The scan
  108. code is independent of the shift status-- for instance, the
  109. scan code for "A" is the same as the scan code for "a" or
  110. Control-A or Alt-A.  This can be very handy.
  111.  
  112. If there is no key available, both the scan code and ASCII code
  113. will be zero.
  114.  
  115.    CALL BIOSInkey (AscCode%, ScanCode%)
  116.  
  117. -------
  118. AscCode%    ASCII code of the key, if any
  119. ScanCode%   scan code of the key, if any
  120.  
  121. Name  : BkScroll             (Backward Scroll)
  122. Class : Display
  123. Level : BIOS
  124.  
  125. This routine scrolls any selected part of the display down-- it
  126. does a backwards scroll.  You may scroll as many times as you
  127. like, or scroll "zero" times to totally clear the selected part
  128. of the display.
  129.  
  130. Note that BIOS-level scrolling can cause the screen to flicker
  131. on some CGAs due to a combination of unfortunate design factors.
  132.  
  133.    CALL BkScroll (TopRow%, LeftCol%, BotRow%, RtCol%, Times%)
  134.  
  135. TopRow%    top row of the area to scroll
  136. LeftCol%   left column of the area to scroll
  137. BotRow%    top row of the area to scroll
  138. RtCol%     left column of the area to scroll
  139. Times%     number of times (or rows) to scroll
  140.  
  141. Name  : BkSpace              (Backspace)
  142. Class : Display
  143. Level : BIOS
  144.  
  145. Although CHR$(8) is supposed to mean "backspace", it shows up
  146. as a graphics character when BASIC prints it.  This routine
  147. does an actual backspace with full wrap-- if it's at the
  148. beginning of the line, it will move back to the previous line
  149. (if there is one).  It backspaces destructively (erasing the
  150. previous character) from the current cursor position.  The new
  151. cursor is returned to you, since QuickBASIC may ignore the new
  152. status.
  153.  
  154.    CALL BkSpace (Row%, Column%)     ' do the backspace
  155.    LOCATE Row%, Column%             ' inform QuickBASIC
  156.  
  157. -------
  158. Row%      new row
  159. Column%   new column
  160.  
  161. Name  : Blink                (Blink toggle)
  162. Class : Display
  163. Level : BIOS / Clone (see text)
  164.  
  165. It is possible to make characters in text mode blink by giving
  166. them an appropriate "color".  I wouldn't mention something so
  167. obvious but for another possibility which is less widely known:
  168. blinking can be turned off, in which case the characters that
  169. would have otherwise blinked will instead have a bright
  170. background.  In other words, turn off blinking, and you double
  171. the possible number of background colors.
  172.  
  173. This technique will always work with EGA and VGA displays.  It
  174. can also be used with MDA/Hercules and CGA displays, on which
  175. it will almost always work... unfortunately, on some
  176. less-than-perfect PC clones, it will cause the computer to lock
  177. up instead.  So, be careful with this one!
  178.  
  179.    CALL Blink (SetBlink%)
  180.  
  181. SetBlink%    use blink (-1) or intense backgrounds (0)
  182.  
  183. Name  : BlockMove            (Block memory Move)
  184. Class : Memory
  185. Level : Clone
  186.  
  187. This routine allows you to copy or "move" a block of data from
  188. one memory location to another.  It isn't very bright, so if
  189. the memory areas overlap, you will have to tell the routine to
  190. "move backwards" instead of forwards. In that case, you will
  191. also have to change the offsets to point to the ends of the
  192. memory areas instead of the beginnings.
  193.  
  194. Normally, you can use forward moves.  In that case, the offsets
  195. you specify are those of the beginning of the memory areas.  If
  196. backward moves are required, the offsets specified are those of
  197. the end of the memory areas.
  198.  
  199. If you are familiar with assembly language, you may recognize
  200. this as a straightforward implementation of the "REP MOVSB"
  201. instruction.
  202.  
  203. You may move up to 65,520 bytes at a time, provided that the
  204. addresses are in normalized form (if you don't know what this
  205. means, you probably don't need to worry about it).
  206.  
  207. This routine can be used to copy information to an array from
  208. any area of memory (the BIOS data area, the screen, another
  209. array, etc), or vice versa. It can also be used to do things
  210. like insert/delete elements from an array, scroll the screen,
  211. fill the screen with a specified character, and so on.
  212.  
  213.    CALL BlockMove (FromSeg%, FromOfs%, ToSeg%, ToOfs%, _
  214.      Bytes%, Dirn%)
  215.  
  216. FromSeg%    segment of the area from which to copy
  217. FromOfs%    offset of the area from which to copy
  218. ToSeg%      segment of the area to which to copy
  219. ToOfs%      offset of the area to which to copy
  220. Bytes%      number of bytes to copy (0-32,767)
  221. Dirn%       direction to copy (0 if forward, else backward)
  222.  
  223. Name  : BootDrive            (get Boot Drive)
  224. Class : Disk
  225. Level : DOS 4.0+
  226.  
  227. This routine tells you which drive was used to boot the
  228. system.
  229.  
  230. One use for BootDrive would be in installation programs, to
  231. determine the most likely destination drive for your software.
  232.  
  233.    Drive$ = "x"
  234.    CALL BootDrive (Drive$)
  235.  
  236. -------
  237. Drive$   boot drive-- set it to at least one char beforehand!
  238.  
  239. Name  : BRead                (Byte Read)
  240. Class : Disk
  241. Level : DOS
  242.  
  243. This routine reads a byte from a file into an integer.  The
  244. byte is zero-extended into the integer, providing a value that
  245. may range from 0-255.
  246.  
  247. The file must have been opened using FCreate or FOpen1.
  248.  
  249.    CALL BRead (Handle%, Value%, ErrCode%)
  250.  
  251. Handle%    file handle
  252. -------
  253. Value%     byte read from file
  254. ErrCode%   DOS error code (0 if no error)
  255.  
  256. Name  : BSq                  (Blank Squeeze)
  257. Class : String
  258. Level : Any
  259.  
  260. A simple compression routine, BSq "squeezes" the blank spaces
  261. in a string. It is designed expressly for use with text data.
  262. The text may not contain more than 131 spaces in a row, or
  263. CHR$(128) through CHR$(255), which are used in the compression.
  264.  
  265. Average text files are liable to be compressed by around 16%.
  266. Files that contain more spaces, such as structured programs,
  267. will benefit more.  The compression algorithm is simple but
  268. extremely fast, adding no noticeable overhead to string
  269. processing.
  270.  
  271. See also BUsq, BUsqLen.
  272.  
  273.    CALL BSq (St$, StLen%)
  274.    St$ = LEFT$(St$, StLen%)
  275.  
  276. St$     string to compress
  277. -------
  278. St$     compressed string
  279. StLen%  length of the compressed string
  280.  
  281. Name  : BUsq                 (Blank Unsqueeze)
  282. Class : String
  283. Level : Any
  284.  
  285. This routine is used to uncompress strings that were processed
  286. by BSq. Before uncompression, the BUsqLen routine must be used
  287. to find out how long the resulting string will be.
  288.  
  289. See also BSq, BUsqLen.
  290.  
  291.    CALL BUsqLen (St$, StLen%)
  292.    IF StLen% < 0 THEN _
  293.       PRINT "Error in compressed string" _
  294.    ELSE _
  295.       Result$ = SPACE$(StLen%): _
  296.       BUsq St$, Result$
  297.  
  298. St$      string to uncompress
  299. -------
  300. Result$  uncompressed string
  301.  
  302. Name  : BUsqLen              (Blank Unsqueeze Length)
  303. Class : String
  304. Level : Any
  305.  
  306. This routine is used in coordination with BUsq to uncompress
  307. strings that were processed by BSq.  It determines what the
  308. length of the uncompressed string will be, which is necessary
  309. to initialize the string for BUsq.
  310.  
  311. See also BSq, BUsq.
  312.  
  313.    CALL BUsqLen (St$, StLen%)
  314.    IF StLen% < 0 THEN _
  315.       PRINT "Error in compressed string" _
  316.    ELSE _
  317.       Result$ = SPACE$(StLen%): _
  318.       BUsq St$, Result$
  319.  
  320. St$      string to uncompress
  321. -------
  322. StLen%   length of the uncompressed string
  323.  
  324. Name  : BWrite               (Byte Write)
  325. Class : Disk
  326. Level : DOS
  327.  
  328. This routine writes a byte to a file from an integer.  The
  329. least significant byte of the integer is written.
  330.  
  331. The file must have been opened using FCreate or FOpen1.
  332.  
  333.    CALL BWrite (Handle%, Value%, ErrCode%)
  334.  
  335. Handle%    file handle
  336. Value%     byte to write to file
  337. -------
  338. ErrCode%   DOS error code (0 if no error)
  339.  
  340. Name  : CalcAttr             (Calculate Attribute)
  341. Class : Display
  342. Level : Any
  343.  
  344. Many of the display routines in this library require an
  345. "attribute" rather than foreground and background colors.  An
  346. attribute is a combination of the foreground and background
  347. colors in a format which is used by all types of displays when
  348. in text mode.
  349.  
  350. Foreground colors are usually specified as 0-31, with
  351. backgrounds as 0-7.  If you turn blinking off (see Blink), it
  352. may be more convenient to express the same thing as foreground
  353. 0-15, background 0-15.  The CalcAttr routine will accept either
  354. way of expressing it.
  355.  
  356. Note, however, that UnCalcAttr will always return the former
  357. pair of results, since it has no way of knowing whether Blink
  358. has been used (foreground 0-31, background 0-15).  See
  359. UnCalcAttr for more details and a solution.
  360.  
  361.    CALL CalcAttr (Foreground%, Background%, VAttr%)
  362.  
  363. Foreground%  foreground color
  364. Background%  background color
  365. -------
  366. VAttr%       color "attribute"
  367.  
  368. Name  : CalcSize             (Calculate array Size)
  369. Class : Display
  370. Level : Any
  371.  
  372. This routine calculates the necessary DIM size for an integer
  373. array, assuming that you intend to store display data in the
  374. array.  This is most useful in conjunction with DGetScreen and
  375. GetScreen.
  376.  
  377. If your version of the BASIC compiler does not support dynamic
  378. arrays, you will need to calculate the size in advance and
  379. hard-code it into your program.
  380.  
  381.    CALL CalcSize (TopRow%, LftCol%, BotRow%, RtCol%, Elements%)
  382.    DIM Array%(1 TO Elements%)
  383.  
  384. TopRow%     top row of the display area
  385. LftCol%     left column of the display area
  386. BotRow%     top row of the display area
  387. RtCol%      left column of the display area
  388. -------
  389. Elements%   required size of the integer array
  390.  
  391. Name  : Carrier              (detect Carrier)
  392. Class : Serial
  393. Level : Clone
  394.  
  395. If you write communications programs, particularly things like
  396. doors and BBSes, you probably want to keep an eye on the
  397. carrier.  BASIC won't do it, but we will!
  398.  
  399.    CALL Carrier (CommPort%, CarrierHigh%)
  400.  
  401. CommPort%     serial port (1-4, though BASIC only handles 1-2)
  402. -------
  403. CarrierHigh%  zero if no carrier
  404.  
  405. Name  : CDROM                (check for CD-ROM)
  406. Class : Disk / Equipment
  407. Level : DOS
  408.  
  409. This routine tells you whether the Microsoft CD-ROM Extensions
  410. are installed. If so, it tells you what the letter of the first
  411. CD-ROM logical drive is and how many logical drives exist.
  412.  
  413. Note: The CD-ROM installation check conflicts with the
  414. GRAPHICS.COM installation check for DOS 4.0, due to some
  415. screw-up at IBM or Microsoft. This may cause unexpected
  416. results.  I'm not yet sure whether DOS 5.0 is similarly
  417. afflicted.
  418.  
  419.    FirstDrive$ = "x"
  420.    CALL CDROM (FirstDrive$, Drives%)
  421.  
  422. -------
  423. FirstDrive$   letter of first logical drive (init to >= 1 char)
  424. Drives%       number of logical drives (0 if no CD-ROM)
  425.  
  426. Name  : CheckDisk            (Check Disk readiness)
  427. Class : Disk
  428. Level : DOS
  429.  
  430. The CheckDisk routine determines whether a disk is ready. About
  431. the only thing it won't tell you is if a disk is write-
  432. protected or out of space.  Since the PBBack disk routines all
  433. contain critical error handling, which reports back an
  434. appropriate error code for all such problems, this routine
  435. isn't really needed any more.  It's included for compatibility
  436. with older ProBas programs.
  437.  
  438. Results will normally be returned as one of the following,
  439. although not all DOS versions report the exact cause of the
  440. error, in which case the error number may not mean what you
  441. expect.
  442.  
  443.    0   no error
  444.    1   unformatted disk
  445.    2   open drive door
  446.    3   bad drive spec
  447.  
  448.    CALL CheckDisk (Drive$, ErrCode%)
  449.  
  450. Drive$    letter of the drive to check
  451. -------
  452. ErrCode%  0 if no error, nonzero for error (see above)
  453.  
  454. Name  : CheckKey             (Check for Key or mouse)
  455. Class : Input, Mouse
  456. Level : BIOS
  457.  
  458. This routine is kind of an extended version of INKEY$.  It
  459. checks the keyboard to see if any key is available and gets the
  460. key if it is.  At your option, it can also check the mouse to
  461. see if a button has been pressed.
  462.  
  463.    CALL CheckKey (Mouse%, ASCIIcode%, ScanCode%, LButton%, _
  464.       RButton%)
  465.  
  466. Mouse%        whether to check the mouse (0: no)
  467. -------
  468. ASCIIcode%    ASCII code of the key pressed
  469. ScanCode%     scan code of the key pressed (0 if none)
  470. LButton%      whether the left  mouse button was pressed
  471. RButton%      whether the right mouse button was pressed
  472.  
  473. Name  : CheckKey3            (Check for Key or 3-button mouse)
  474. Class : Input, Mouse
  475. Level : BIOS
  476.  
  477. This routine is kind of an extended version of INKEY$.  It
  478. checks the keyboard to see if any key is available and gets the
  479. key if it is.  At your option, it can also check the mouse to
  480. see if a button has been pressed.
  481.  
  482.    CALL CheckKey3 (Mouse%, ASCIIcode%, ScanCode%, LButton%, _
  483.       MButton%, RButton%)
  484.  
  485. Mouse%        whether to check the mouse (0: no)
  486. -------
  487. ASCIIcode%    ASCII code of the key pressed
  488. ScanCode%     scan code of the key pressed (0 if none)
  489. LButton%      whether the left   mouse button was pressed
  490. MButton%      whether the middle mouse button was pressed
  491. RButton%      whether the right  mouse button was pressed
  492.  
  493. Name  : CheckShare           (Check for SHARE)
  494. Class : Disk
  495. Level : DOS
  496.  
  497. The CheckShare routine determines whether SHARE.EXE is active.
  498. This is particularly helpful before using the BASIC OPEN
  499. statement, which will fail if you request file sharing when
  500. it's not available.  The PBBack file routines handle such
  501. situations automatically, so CheckShare is not needed for them.
  502.  
  503.    CALL CheckShare (ShareActive%)
  504.  
  505. -------
  506. ShareActive%   whether SHARE is active (0 if no)
  507.  
  508. Name  : Checksum             (calculate Checksum)
  509. Class : String / Serial
  510. Level : Any
  511.  
  512. The Checksum routine calculates a checksum on a string.  The
  513. resulting number is compatible with Xmodem and Ymodem checksum
  514. routines and will vary from 0-255.  This checksum provides a
  515. minimal, but fast, check of what characters are contained in
  516. the string.  See also CRC1.
  517.  
  518.    CALL Checksum (St$, ChkSum%)
  519.  
  520. St$       string to process
  521. -------
  522. ChkSum%   checksum of the characters in the string
  523.  
  524. Name  : Cipher               (Cipher)
  525. Class : String
  526. Level : Any
  527.  
  528. This is a very simple text encryption routine.  It isn't
  529. particularly hard to crack, but will provide a basic level of
  530. security for undemanding applications.  The same routine can be
  531. used either to encrypt or decrypt text.  The original text may
  532. contain any character; likewise, the resulting text.  This is
  533. not well suited for use with sequential files-- if such is
  534. required, see CipherP.
  535.  
  536. I'd suggest using a long password composed of an unlikely
  537. string of characters, e.g. "#*@@!A^%x{.'".
  538.  
  539.    CALL Cipher (St$, Password$)
  540.  
  541. St$        string to encrypt or decrypt
  542. Password$  password
  543. -------
  544. St$        encrypted or decrypted string
  545.  
  546. Name  : CipherP              (Cipher Printable)
  547. Class : String
  548. Level : Any
  549.  
  550. This is a very simple text encryption routine.  It isn't
  551. particularly hard to crack, but will provide a basic level of
  552. security for undemanding applications.  The same routine can be
  553. used either to encrypt or decrypt text.  The original text may
  554. contain any character below CHR$(128), as may the password.
  555. The resulting text will be printable, if bizarre (all
  556. characters will be above CHR$(127)), and may be used with
  557. sequential files.
  558.  
  559. This routine is potentially less secure than the Cipher routine
  560. (see).
  561.  
  562. I'd suggest using a long password composed of an unlikely
  563. string of characters, e.g. "#*@@!A^%x{.'".
  564.  
  565.    CALL CipherP (St$, Password$)
  566.  
  567. St$        string to encrypt or decrypt
  568. Password$  password
  569. -------
  570. St$        encrypted or decrypted string
  571.  
  572. Name  : Clock                (Clock)
  573. Class : Display / Time
  574. Level : Clone
  575.  
  576. This routine allows you to turn a visible time display on or
  577. off.  When on, the time will be continuously displayed at a
  578. selected location while your program continues processing.  The
  579. clock is managed as a background process, in effect doing some
  580. simple multitasking.
  581.  
  582. You should turn the clock off before you terminate your
  583. program, including any time you execute another program with
  584. RUN.  The clock can be safely kept on when you SHELL to another
  585. program, however, as long as you can be sure that control will
  586. return to your program when the other is done.
  587.  
  588. The clock must also be turned off if you change any of its
  589. parameters with the ClockSet routine (see).
  590.  
  591. The clock will only be visible when the display is in text
  592. mode.  The use of PLAY or SOUND statements may shut off the
  593. clock, depending on your version of the BASIC compiler.
  594.  
  595.    CALL Clock (DisplayOn%)
  596.  
  597. DisplayOn%   whether to display the clock (0 if no)
  598.  
  599. Name  : ClockSet             (Clock Settings)
  600. Class : Display / Time
  601. Level : Clone
  602.  
  603. The ClockSet routine is used in conjunction with Clock (see).
  604. It should only be used when the clock is turned off.
  605.  
  606. This routine allows you to set 12-hour or 24-hour time, whether
  607. to display the seconds or not, how often to update the clock
  608. display (in 1/18th seconds; 9 is usually the best choice),
  609. where to display the clock and in what color, and whether to
  610. use flicker-free displays (needed for cheap CGAs only).  The
  611. defaults are 12-hour time, display seconds, put the time (in
  612. white on black) in the upper right corner, and display quickly
  613. (may flicker on some CGAs).
  614.  
  615.    CALL ClockSet (Hours24%, Seconds%, Updates%, Row%, _
  616.       Column%, VAttr%, Fast%)
  617.  
  618. Hours24%   whether to display 24-hour time (0 if no)
  619. Seconds%   whether to display seconds (0 if no)
  620. Updates%   display update frequency in 1/18th seconds
  621. Row%       row on which to display the clock
  622. Col%       column at which to display the clock
  623. VAttr%     color/attribute to use (see CalcAttr)
  624. Fast%      whether to use fast mode (0 no)
  625.  
  626. Name  : ClrCols              (Clear Columns)
  627. Class : Display
  628. Level : BIOS
  629.  
  630. This routine clears the current row between the specified
  631. columns, inclusive. It does not affect the cursor position.
  632.  
  633.    CALL ClrCols (StartCol%, EndCol%)
  634.  
  635. StartCol%  starting column
  636. EndCol%    ending column
  637.  
  638. Name  : ClrEOL               (Clear to End Of Line)
  639. Class : Display
  640. Level : BIOS
  641.  
  642. This routine clears from the cursor to the end of the line,
  643. inclusive.  It does not affect the current cursor position.
  644.  
  645.    CALL ClrEOL
  646.  
  647. Name  : ClrEOP               (Clear to End Of Page)
  648. Class : Display
  649. Level : BIOS
  650.  
  651. This routine clears from the cursor to the end of the display,
  652. inclusive.  It does not affect the current cursor position.
  653.  
  654.    CALL ClrEOP
  655.  
  656. Name  : ClrKbd               (Clear Keyboard buffer)
  657. Class : Input
  658. Level : DOS
  659.  
  660. ClrKbd clears the keyboard buffer, discarding any keys that may
  661. be waiting. This is a good idea for situations where an
  662. unexpected input is made and you don't want to chance it being
  663. answered accidentally by keys that were typed beforehand-- for
  664. instance, in the event of an error or other condition where it
  665. is important that the user see a message or take an action
  666. before pressing a key.
  667.  
  668.    CALL ClrKbd
  669.  
  670. Name  : ClrSOL               (Clear to Start Of Line)
  671. Class : Display
  672. Level : BIOS
  673.  
  674. This routine clears from the start of the line to the cursor,
  675. inclusive.  It does not affect the current cursor position.
  676.  
  677.    CALL ClrSOL
  678.  
  679. Name  : ClrSOP               (Clear to Start Of Page)
  680. Class : Display
  681. Level : BIOS
  682.  
  683. This routine clears from the start of the display to the
  684. cursor, inclusive. It does not affect the current cursor
  685. position.
  686.  
  687.    CALL ClrSOP
  688.  
  689. Name  : CopyFile             (Copy a File)
  690. Class : Disk
  691. Level : DOS
  692.  
  693. This works like the DOS COPY command, although it does not
  694. allow wildcards. One file is copied to another, retaining the
  695. same date and time.  Full path specifications are supported,
  696. including drive and subdirectory specs.
  697.  
  698.    CALL CopyFile (FromFile$, ToFile$, ErrCode%)
  699.  
  700. FromFile$   name of file to copy
  701. ToFile$     name of new file to create
  702. -------
  703. ErrCode%    0 if no error, else DOS Error
  704.  
  705. Name  : CPrintScreen1        (CGA Print Screen [SCREEN 1])
  706. Class : Display / Printer
  707. Level : Clone
  708.  
  709. This routine dumps a SCREEN 1 display (CGA 320x200) to the
  710. printer.  It uses the stdprn device (normally PRN or LPT1) by
  711. default, although this can be altered with the PrtSwap routine.
  712.  
  713.    CALL CPrintScreen1
  714.  
  715. Name  : CPrintScreen2        (CGA Print Screen [SCREEN 2])
  716. Class : Display / Printer
  717. Level : Clone
  718.  
  719. This routine dumps a SCREEN 2 display (CGA 640x200) to the
  720. printer.  It uses the stdprn device (normally PRN or LPT1) by
  721. default, although this can be altered with the PrtSwap routine.
  722.  
  723.    CALL CPrintScreen2
  724.  
  725. Name  : CRC                  (calculate CRC)
  726. Class : String / Serial
  727. Level : Any
  728.  
  729. This routine has become obsolete; the CRC1 routine is much
  730. faster.  However, CRC is still included for backwards
  731. compatibility.
  732.  
  733. This routine calculates a complex 16-bit checksum, called a
  734. Cyclical Redundancy Check (or CRC) on a string.  The results
  735. are compatible with Xmodem and Ymodem CRC routines.  The CRC
  736. provides a fairly reliable check of what characters are
  737. contained in the string.  See also Checksum.
  738.  
  739. If you are using this routine for Xmodem or Ymodem, note that
  740. the string should be padded with two null characters before
  741. calculating a "send" CRC: St$ = St$ + STRING$(2, 0).  On
  742. receive, you should calculate the CRC on the entire data block,
  743. plus the received CRC; if the block was received correctly, the
  744. calculated CRC will be zero in both lsb and msb.
  745.  
  746. Although Intel notation uses "lsb, msb" order, the
  747. Xmodem/Ymodem CRC uses the opposite format, which is why the
  748. parameters are ordered in this fashion.
  749.  
  750.    CALL CRC (St$, CRCmsb%, CRClsb%)
  751.  
  752. St$       string to process
  753. -------
  754. CRCmsb%   most significant byte of CRC
  755. CRClsb%   least significant byte of CRC
  756.  
  757. Name  : CRC1                 (calculate CRC)
  758. Class : String / Serial
  759. Level : Any
  760.  
  761. This routine calculates a complex 16-bit checksum, called a
  762. Cyclical Redundancy Check (or CRC) on a string.  The results
  763. are compatible with Xmodem and Ymodem CRC routines.  The CRC
  764. provides a fairly reliable check of what characters are
  765. contained in the string.  See also Checksum.
  766.  
  767. Note that CRC1 does not work like the older CRC routine.  You
  768. should not pad outgoing strings with a STRING$(2, 0) sequence.
  769.  
  770. Although Intel notation uses "lsb, msb" order, the
  771. Xmodem/Ymodem CRC uses the opposite format, which is why the
  772. parameters are ordered in this fashion.
  773.  
  774.    CALL CRC1 (St$, CRCmsb%, CRClsb%)
  775.  
  776. St$       string to process
  777. -------
  778. CRCmsb%   most significant byte of CRC
  779. CRClsb%   least significant byte of CRC
  780.  
  781. Name  : Crunch               (Crunch repeated characters)
  782. Class : String
  783. Level : Any
  784.  
  785. It was hard to decide on a name for this routine, and I don't
  786. know if I've done the best job.  What Crunch does is to
  787. eliminate repeated sequences of the same character.  For
  788. instance, if you gave it "This    is a   test" and asked it to
  789. crunch spaces, it would return "This is a test".  I use this to
  790. filter information from the COMMAND$ function, but it's a good
  791. general purpose input filter.
  792.  
  793.    CALL Crunch (St$, Ch$, StLen%)
  794.    St$ = LEFT$(St$, StLen%)
  795.  
  796. St$       string to be processed
  797. Ch$       character to crunch out of the string
  798. -------
  799. St$       crunched string
  800. StLen%    length of the crunched string
  801.  
  802. Name  : CursorInfo           (Cursor Information)
  803. Class : Input
  804. Level : Clone
  805.  
  806. While BASIC allows you to set the size and shape of the cursor
  807. with LOCATE, it's fairly hazardous to do so.  There is no way
  808. to find out the maximum size of the cursor, so your cursor may
  809. end up a peculiar shape on some adapters. If you change the
  810. cursor size or visibility in a subprogram, you may be screwing
  811. up the main program.
  812.  
  813. CursorInfo offers a solution to these problems.  It returns the
  814. current cursor visibility and size, plus the maximum size
  815. possible with the current video adapter.  The minimum size will
  816. always be zero, so it is not reported.
  817.  
  818.    CALL CursorInfo (Visible%, StartLine%, EndLine%, MaxLine%)
  819.  
  820. -------
  821. Visible%      whether the cursor is visible (0 no, 1 yes)
  822. StartLine%    starting scan line of cursor
  823. EndLine%      ending scan line of cursor
  824. MaxLine%      maximum possible scan line for cursor
  825.  
  826. Name  : DataSeg              (Data Segment)
  827. Class : Memory
  828. Level : Any
  829.  
  830. It's rare that you need to know the data segment used by BASIC,
  831. but it does happen.  DataSeg tells you that value.  This is the
  832. segment used by (near) strings, static arrays (except in the
  833. editor/environment, if any), some COMMON data, BASIC internal
  834. variables and so forth.  It is also the area specified by a
  835. plain "DEF SEG", though not (usually) by "DEF SEG=xxxx".
  836.  
  837.    CALL DataSeg (DSeg%)
  838.  
  839. -------
  840. DSeg%     data segment for BASIC
  841.  
  842. Name  : Date2Int             (Date to Integer)
  843. Class : Time
  844. Level : Any
  845.  
  846. This routine compresses a date into a single integer.  Note
  847. that this integer is not in a format that lends itself to
  848. simple computation-- you cannot subtract one from another to
  849. find out the length of time between them. However, as long as
  850. the year is in the range 1980-2042, you can compare the two
  851. integers to see if one date is before or after another.
  852.  
  853. You may express the year as either a two-digit or four-digit
  854. number.
  855.  
  856. The ProBas and PBBack versions of this routine do not work the
  857. same way in regards to the year.  ProBas assumed that any
  858. two-digit year was in the 1900s.  In contrast, PBBack assumes
  859. that years 80-99 should be converted to 1980-1999 and that 0-79
  860. should be converted to 2000-2079.  I consider the PBBack method
  861. more appropriate, with the turn of the century moving closer.
  862. The date format used does not allow dates before 1980 anyway,
  863. so nothing is being lost by this change.
  864.  
  865.    CALL Date2Int (MonthNr%, DayNr%, YearNr%, IntDate%)
  866.  
  867. MonthNr%     month number (1-12)
  868. DayNr%       day (1-31)
  869. YearNr%      year (1980-2079; see above for two-digit years)
  870. -------
  871. IntDate%     date compressed into an integer
  872.  
  873. Name  : DateN2S              (Date Numbers to String)
  874. Class : Time
  875. Level : Any / DOS
  876.  
  877. Many of the PBBack routines return the date as a set of
  878. numbers.  This routine provides an easy way to convert those
  879. numbers into string form.  The date format used (year length
  880. and delimiter) will be based on the string which you pass to
  881. the routine.  For instance, "xx-xx-xxxx" will return a date
  882. like "11-26-1990", whereas "xx.xx.xxxx" would return
  883. "11.26.1990", and "xx/xx/xx" would return "11/26/90".
  884.  
  885. If you pass zeroes for the MonthNr%, DayNr%, and YearNr%
  886. values, the current date will be returned in the format that
  887. you specified.
  888.  
  889. The ProBas and PBBack versions of this routine do not work the
  890. same way in regards to the year.  ProBas assumed that any
  891. two-digit year was in the 1900s.  In contrast, PBBack assumes
  892. that years 80-99 should be converted to 1980-1999 and that 0-79
  893. should be converted to 2000-2079.
  894.  
  895.    DateSt$ = "xx-xx-xxxx"
  896.    CALL DateN2S (MonthNr%, DayNr%, YearNr%, DateSt$)
  897.  
  898. MonthNr%  month
  899. DayNr%    day
  900. YearNr%   year
  901. -------
  902. DateSt$   date string.  Init to 8 or 10 chars (see above).
  903.  
  904. Name  : DateS2N              (Date String to Numbers)
  905. Class : Time
  906. Level : Any
  907.  
  908. Many of the PBBack routines need to be passed the date as a set
  909. of numbers. This routine provides an easy way to convert a date
  910. from string form into numbers.  You may use either "xx/xx/xx"
  911. or "xx-xx-xxxx" form to specify the date (the string length is
  912. important, but the delimiter and contents of the string are
  913. ignored).
  914.  
  915. The ProBas and PBBack versions of this routine do not work the
  916. same way in regards to the year.  ProBas assumed that any
  917. two-digit year was in the 1900s.  By contrast, PBBack assumes
  918. that years 80-99 should be converted to 1980-1999 and that 0-79
  919. should be converted to 2000-2079.
  920.  
  921.    CALL DateS2N (MonthNr%, DayNr%, YearNr%, DateSt$)
  922.  
  923. DateSt$   date string.  Init to 8 or 10 characters (see above).
  924. -------
  925. MonthNr%  month
  926. DayNr%    day
  927. YearNr%   year
  928.  
  929. Name  : DClear               (Direct-to-memory Clear)
  930. Class : Display
  931. Level : Any
  932.  
  933. The DClear routine allows you to clear a text-mode display.
  934.  
  935. This routine does not necessarily work on the display itself.
  936. Instead, it allows you to specify the memory location (segment
  937. and offset) of the "screen", which may be an actual screen, a
  938. saved screen in an array, a multitasker's virtual screen, etc.
  939. Among other things, this makes it easy to work with two
  940. displays at once: use a segment of &HB000 for the mono display
  941. and &HB800 for the color display (the offset in each case is
  942. zero).
  943.  
  944.    CALL DClear (DSeg%, DOfs%, VAttr%)
  945.  
  946. DSeg%    segment of "screen" memory
  947. DOfs%    offset of "screen" memory
  948. VAttr%   color/attribute to use (see CalcAttr)
  949.  
  950. Name  : DClearSS             (Direct Clear for Specified Size)
  951. Class : Display
  952. Level : Any
  953.  
  954. Like the CLS statement, this routine allows you to clear a text
  955. display. However, rather than clearing the actual screen,
  956. DClearSS clears a screen that is stored in an array.  This
  957. allows you to design a screen in memory, then flash it onto the
  958. display using PutScreen or a similar routine.
  959.  
  960. This routine is designed for a text screen of any specified
  961. size.
  962.  
  963.    CALL DClearSS (DSeg%, DOfs%, VAttr%, Rows%, Columns%)
  964.  
  965. DSeg%     segment of the array that holds the screen
  966. DOfs%     offset of the array that holds the screen
  967. VAttr%    color/attribute to use (see CalcAttr)
  968. Rows%     length of the screen
  969. Columns%  width of the screen
  970.  
  971. Name  : Dec2Any              (Decimal to Any base)
  972. Class : Numeric
  973. Level : Any
  974.  
  975. This routine converts a normal integer to a number in any
  976. base.  It works like the HEX$ function in BASIC, but rather
  977. than working only in hexadecimal (base 16), it can be used for
  978. binary, octal, or almost anything else.
  979.  
  980. The result will be right-justified in the string you provide.
  981. If you use zeroes, this allows you to ignore the NumberLen%
  982. spec and just trim the string to the desired length, leaving
  983. nothing worse than possible leading zeroes.
  984.  
  985. The length needed by the return string will vary according to
  986. the number, with a maximum length depending on the number base
  987. chosen.  For integers, this will be at most 16 characters
  988. (worst case: base 2 or binary).
  989.  
  990.    Number$ = STRING$(16, "0")
  991.    CALL Dec2Any (DecimalNr%, NrBase%, Number$, NumberLen%)
  992.    Number$ = RIGHT$(Number$, NumberLen%)
  993.  
  994. DecimalNr   integer to convert to another base
  995. NrBase%     desired number base (2-31)
  996. -------
  997. Number$     resulting number in desired base (init >= 16 chars)
  998. NumberLen%  length of the result (-1 if string too short)
  999.  
  1000. Name  : Delay                (Delay for seconds)
  1001. Class : Time
  1002. Level : Clone
  1003.  
  1004. This routine delays for a given number of seconds.  The timing
  1005. will be the same from an 8088 PC through an 80486 AT-- it's
  1006. entirely independent of the processor.  See also Delay18th.
  1007.  
  1008.    CALL Delay (Seconds%)
  1009.  
  1010. Seconds%   number of seconds for which to delay
  1011.  
  1012. Name  : Delay18th            (Delay for 1/18th seconds)
  1013. Class : Time
  1014. Level : Clone
  1015.  
  1016. This routine delays for a given number of 18ths of seconds.
  1017. The timing will be the same from an 8088 PC through an 80486
  1018. AT-- it's entirely independent of the processor.  See also
  1019. Delay.
  1020.  
  1021.    CALL Delay (WaitTime%)
  1022.  
  1023. WaitTime%  number of 18ths of seconds for which to delay
  1024.  
  1025. Name  : DelayV               (Delay based on Video timing)
  1026. Class : Time
  1027. Level : Clone
  1028.  
  1029. This routine delays for a given number of milliseconds.  The
  1030. timing is based on a signal from the video adapter and may vary
  1031. somewhat depending on the adapter.  The delay is largely
  1032. independent of the cpu type and speed, however.
  1033.  
  1034. For anyone unfamiliar with the metric system: there are 1000
  1035. milliseconds in one second.  Depending on the specific display
  1036. adapter, this routine may well be fairly inaccurate; it is
  1037. intended for providing small delays for animation and similar
  1038. purposes, not as a reliable timer.
  1039.  
  1040.    CALL DelayV (MilliSeconds%)
  1041.  
  1042. MilliSeconds%   number of milliseconds for which to delay
  1043.  
  1044. Name  : DelChr               (Delete Character)
  1045. Class : Display
  1046. Level : Clone
  1047.  
  1048. The DelChr routine deletes the character at the specified
  1049. screen location.
  1050.  
  1051.    CALL DelChr (Row%, Column%)
  1052.  
  1053. Row%      row of character
  1054. Column%   column of character
  1055.  
  1056. Name  : DelFile              (Delete File)
  1057. Class : Disk
  1058. Level : DOS
  1059.  
  1060. This works like the DOS DEL (or ERASE) command, although it
  1061. does not allow wildcards.  The specified file is deleted.  Full
  1062. path specifications are supported, including drive and
  1063. subdirectory specs.
  1064.  
  1065.    CALL DelFile (FileName$, ErrCode%)
  1066.  
  1067. FileName$   name of the file to delete
  1068. -------
  1069. ErrCode%    0 if no error, else DOS Error
  1070.  
  1071. Name  : DelLine              (Delete Line)
  1072. Class : Display
  1073. Level : BIOS
  1074.  
  1075. This routine deletes the specified row from the screen.
  1076.  
  1077.    CALL DelLine (Row%, VAttr%)
  1078.  
  1079. Row%      row to delete
  1080. VAttr%    color/attr to use on new bottom row (see CalcAttr)
  1081.  
  1082. Name  : DelSub               (Delete Subdirectory)
  1083. Class : Disk
  1084. Level : DOS
  1085.  
  1086. This works like the DOS RD (or RMDIR) command.  It does not
  1087. allow wildcards. The specified subdirectory is deleted.  Note
  1088. that you may not delete a subdirectory that you're located in,
  1089. or a subdirectory which contains files, or the root directory.
  1090.  
  1091.    CALL DelSub (SubDir$, ErrCode%)
  1092.  
  1093. SubDir$     name of the subdirectory to delete
  1094. -------
  1095. ErrCode%    0 if no error, else DOS Error
  1096.  
  1097. Name  : DFRead               (Direct-to-memory File Read)
  1098. Class : Disk
  1099. Level : DOS
  1100.  
  1101. This routine reads data into an array from a file that was
  1102. opened by FOpen1 or FCreate.  If it wasn't possible to read it
  1103. all from the file, an error code will be returned and the
  1104. BytesRead% value will tell you how many bytes were actually
  1105. read.
  1106.  
  1107.    CALL DFRead (Handle%, DSeg%, DOfs%, Bytes%, BytesRead%, _
  1108.       ErrCode%)
  1109.  
  1110. Handle%     handle of the file from which to read
  1111. DSeg%       segment of the array into which to read the file
  1112. DOfs%       offset of the array into which to read the file
  1113. Bytes%      number of bytes to read
  1114. -------
  1115. BytesWrit%  # of bytes actually read from the file (if error)
  1116. ErrCode%    error code: 0 if no error, else DOS Error
  1117.  
  1118. Name  : DFWrite              (Direct-from-memory File Write)
  1119. Class : Disk
  1120. Level : DOS
  1121.  
  1122. This routine writes data from an array to a file that was
  1123. opened by FOpen1 or FCreate.  If it wasn't possible to write it
  1124. all to the file, an error code will be returned and the
  1125. BytesWrit% value will tell you how many bytes were actually
  1126. written.
  1127.  
  1128.    CALL DFWrite (Handle%, DSeg%, DOfs%, Bytes%, BytesWrit%, _
  1129.       ErrCode%)
  1130.  
  1131. Handle%     handle of the file to which to write
  1132. DSeg%       segment of the data to write to the file
  1133. DOfs%       offset of the data to write to the file
  1134. Bytes%      number of bytes to write
  1135. -------
  1136. BytesWrit%  # of bytes actually written to the file (if error)
  1137. ErrCode%    error code: 0 if no error, else DOS Error
  1138.  
  1139. Name  : DGClear              (Direct-to-memory Graphics Clear)
  1140. Class : Display
  1141. Level : Any
  1142.  
  1143. This routine works like the CLS statement, clearing a CGA
  1144. graphics display. However, rather than clearing the actual
  1145. screen, DClearSS clears a screen that is stored in an array.
  1146. This allows you to design a screen in memory, then flash it
  1147. onto the display using GrafRest.
  1148.  
  1149. This routine is designed for use with SCREEN 1 or SCREEN 2 (CGA
  1150. graphics).
  1151.  
  1152.    CALL DGClear (DSeg%, DOfs%, Colour%)
  1153.  
  1154. DSeg%     segment of the array that holds the screen
  1155. DOfs%     offset of the array that holds the screen
  1156. Colour%   color to use
  1157.  
  1158. Name  : DGetRec              (Direct-from-memory Get Record)
  1159. Class : String
  1160. Level : Clone
  1161.  
  1162. The DGetRec routine allows you to get a string from a specified
  1163. area of memory (numeric array, BIOS data area, display memory,
  1164. or whatever).  The string should be initialized to the desired
  1165. record length in advance.
  1166.  
  1167. This works somewhat like an array of fixed length strings or a
  1168. random file, treating memory as a contiguous series of records
  1169. of a specified length.
  1170.  
  1171.    CALL DGetRec (DSeg%, DOfs%, RecNr%, St$)
  1172.  
  1173. DSeg%      segment of the array to read from
  1174. DOfs%      offset of the array to read from
  1175. RecNr%     record number (starting at 1)
  1176. -------
  1177. St$        returned string.  Init to record length (see above).
  1178.  
  1179. Name  : DGetScreen           (Direct memory Get Screen image)
  1180. Class : Display
  1181. Level : Clone
  1182.  
  1183. This routine saves any portion of the display to an array.
  1184. Only text modes are supported.  If your program uses multiple
  1185. display pages, you can get an image from any of those pages.  A
  1186. special "slow" mode is supported for the CGA, to prevent
  1187. flickering (a problem only with some CGAs).
  1188.  
  1189. The size of the integer array needed to store a specific area
  1190. of the screen can be calculated using the CalcSize routine
  1191. (see).
  1192.  
  1193. The GetScreen routine works the same way as this, but has a
  1194. simpler calling convention.  Also, if you wish to save the
  1195. entire screen, you may find ScrSave easier.
  1196.  
  1197.    CALL DGetScreen (DSeg%, DOfs%, TRow%, LCol%, BRow%, RCol%, _
  1198.       Page%, Fast%)
  1199.  
  1200. DSeg%      segment of the array in which to store the image
  1201. DOfs%      offset of the array in which to store the image
  1202. TRow%      top row of the desired screen area
  1203. LCol%      left column of the desired screen area
  1204. BRow%      bottom row of the desired screen area
  1205. RCol%      right column of the desired screen area
  1206. Page%      page from which to get the display area
  1207. Fast%      whether to use fast mode (0 no)
  1208.  
  1209. Name  : DGQPrint             (Direct Graphics Quick Print)
  1210. Class : Display
  1211. Level : Any
  1212.  
  1213. This is a simple high-speed replacement for the PRINT statement
  1214. which works on a CGA virtual graphics screen (SCREEN 2).  It
  1215. does not interpret control codes or support graphics characters
  1216. (ASCII 128-255).
  1217.  
  1218. DGQPrint allows you to display to a CGA even if it isn't the
  1219. active display (use a segment of &HB800 and offset of 0).  Its
  1220. intended use, however, is to display to a virtual screen kept
  1221. in an array or other memory area.  The results can then be
  1222. displayed using GrafRest.
  1223.  
  1224.    CALL DGQPrint (DSeg%, DOfs%, St$, Row%, Column%)
  1225.  
  1226. DSeg%    segment of CGA virtual screen
  1227. DOfs%    offset of CGA virtual screen
  1228. St$      string to display
  1229. Row%     row (1-25)
  1230. Column%  column (1-80)
  1231.  
  1232. Name  : DGXQPrint            (Direct Graphics Extended Q Print)
  1233. Class : Display
  1234. Level : Any
  1235.  
  1236. This is a simple high-speed replacement for the PRINT statement
  1237. which works on a CGA virtual graphics screen (SCREEN 1).  It
  1238. does not interpret control codes or support graphics characters
  1239. (ASCII 128-255).
  1240.  
  1241. This routine can also be used on a SCREEN 2 display, where it
  1242. will display the string in shades instead of in color (using 40
  1243. columns/row).
  1244.  
  1245. DGXQPrint allows you to display to a CGA even if it isn't the
  1246. active display (use a segment of &HB800 and offset of 0).  Its
  1247. intended use, however, is to display to a virtual screen kept
  1248. in an array or other memory area.  The results can then be
  1249. displayed using GrafRest.
  1250.  
  1251.    CALL DGXQPrint (DSeg%, DOfs%, St$, Row%, Column%, Fore%)
  1252.  
  1253. DSeg%    segment of CGA virtual screen
  1254. DOfs%    offset of CGA virtual screen
  1255. St$      string to display
  1256. Row%     row (1-25)
  1257. Column%  column (1-40)
  1258. Fore%    foreground color (0-3)
  1259.  
  1260. Name  : DGXQPrint1           (Direct Graphics Extended Q Print)
  1261. Class : Display
  1262. Level : Any
  1263.  
  1264. This is a high-speed replacement for the PRINT statement which
  1265. works on a CGA virtual graphics screen (SCREEN 1). It does not
  1266. interpret control codes.
  1267.  
  1268. This routine can also be used on a SCREEN 2 display, where it
  1269. will display the string in shades instead of in color (using 40
  1270. columns/row).
  1271.  
  1272. DGXQPrint1 allows you to display to a CGA even if it isn't the
  1273. active display (use a segment of &HB800 and offset of 0).  Its
  1274. intended use, however, is to display to a virtual screen kept
  1275. in an array or other memory area.  The results can then be
  1276. displayed using GrafRest.
  1277.  
  1278.    CALL DGXQPrint1 (DSeg%, DOfs%, St$, Row%, Column%, _
  1279.       Fore%, Back%)
  1280.  
  1281. DSeg%    segment of CGA virtual screen
  1282. DOfs%    offset of CGA virtual screen
  1283. St$      string to display
  1284. Row%     row (1-25)
  1285. Column%  column (1-40)
  1286. Fore%    foreground color (0-3)
  1287. Back%    background color (0-3)
  1288.  
  1289. Name  : Dissolve             (Dissolve)
  1290. Class : Display
  1291. Level : Clone
  1292.  
  1293. Like CLS, but a bit more fancy, this routine provides an
  1294. interesting way to clear the screen.  See also FadeOut.
  1295.  
  1296. This routine may cause heavy flickering on some CGA displays.
  1297.  
  1298.    CALL Dissolve (VAttr%)
  1299.  
  1300. VAttr%   color/attribute to which to clear (see CalcAttr)
  1301.  
  1302. Name  : DMPrint              (DOS Message Print)
  1303. Class : Display
  1304. Level : DOS
  1305.  
  1306. This routine is similar to PRINT, but goes through DOS output
  1307. services, which allows your program to support output
  1308. redirection, filters, CTTY and other handy things.  See
  1309. DOSInkey for a DOS input service.
  1310.  
  1311. Note that the use of DMPrint means that you should avoid using
  1312. BASIC display handling (CLS, INPUT, LINE INPUT, PRINT, LOCATE,
  1313. CSRLIN, POS, etc).  Instead, you should use ANSI escape
  1314. sequences to control the display.  This requires that an ANSI
  1315. driver (like ANSI.SYS, DVANSI.SYS, NANSI.SYS, or ZANSI.SYS) be
  1316. installed on your system.  See your DOS manual for details on
  1317. ANSI sequences, or grab the documentation on ANSI from one of
  1318. your friendly local BBSes.
  1319.  
  1320. It is -possible- to use BASIC display handling in conjunction
  1321. with DMPrint, but that tends to defeat the purpose of using
  1322. DMPrint in the first place.
  1323.  
  1324. Note that the DMPrint routine does not add a carriage
  1325. return/linefeed to the end of a string.  If you want that, add
  1326. CHR$(13) + CHR$(10) to the end of the string.
  1327.  
  1328.    CALL DMPrint (St$)
  1329.  
  1330. St$    string to display
  1331.  
  1332. Name  : DOSClrEol            (DOS Clear to End Of Line)
  1333. Class : Display
  1334. Level : DOS
  1335.  
  1336. This routine clears from the cursor position to the end of the
  1337. row using DOS output functions.  It requires that ANSI.SYS or
  1338. another ANSI driver be installed.
  1339.  
  1340.    CALL DOSClrEol
  1341.  
  1342. Name  : DOSCls               (DOS Clear Screen)
  1343. Class : Display
  1344. Level : DOS
  1345.  
  1346. This routine clears the screen using DOS output functions.  It
  1347. requires that ANSI.SYS or another ANSI driver be installed.
  1348.  
  1349.    CALL DOSCls
  1350.  
  1351. Name  : DOSColor             (DOS Color)
  1352. Class : Display
  1353. Level : DOS
  1354.  
  1355. This routine sets the screen colors using DOS output
  1356. functions.  It requires that ANSI.SYS or another ANSI driver be
  1357. installed.
  1358.  
  1359.    CALL DOSColor (Fore%, Back%)
  1360.  
  1361. Fore%    foreground color
  1362. Back%    background color
  1363.  
  1364. Name  : DOSInkey             (DOS INKEY$)
  1365. Class : Input
  1366. Level : DOS
  1367.  
  1368. This routine is similar to INKEY$, but goes through DOS input
  1369. services, which allows your program to support input
  1370. redirection, filters, CTTY and other handy things.  See DMPrint
  1371. for a DOS output service.  See also DOSInky$.
  1372.  
  1373.    CALL DOSInkey (CharCode%, CharType%)
  1374.  
  1375. -------
  1376. CharType%    0 if no key, 1 if normal key, 2 if extended key
  1377. CharCode%    ASCII code if normal key, scan code if extended key
  1378.  
  1379. Name  : DOSLocate            (DOS Locate)
  1380. Class : Display
  1381. Level : DOS
  1382.  
  1383. This routine sets the cursor position using DOS output
  1384. functions.  It requires that ANSI.SYS or another ANSI driver be
  1385. installed.
  1386.  
  1387. Note that many ANSI drivers do not fully support EGA or VGA
  1388. modes in that they are limited to a maximum of 25 rows.
  1389.  
  1390.    CALL DOSLocate (Row%, Column%)
  1391.  
  1392. Row%      row
  1393. Column%   column
  1394.  
  1395. Name  : DPutRec              (Direct-to-memory Put Record)
  1396. Class : String
  1397. Level : Clone
  1398.  
  1399. The DPutRec routine allows you to put a string into a specified
  1400. area of memory (numeric array, BIOS data area, display memory,
  1401. or whatever).  The string should be initialized to the desired
  1402. record length in advance.
  1403.  
  1404. This works somewhat like an array of fixed length strings or a
  1405. random file, treating memory as a contiguous series of records
  1406. of a specified length.
  1407.  
  1408.    CALL DPutRec (DSeg%, DOfs%, RecNr%, St$)
  1409.  
  1410. DSeg%      segment of the array to write into
  1411. DOfs%      offset of the array to write into
  1412. RecNr%     record number (starting at 1)
  1413. St$        string to write.  Init to record length (see above).
  1414.  
  1415. Name  : DPutScreen           (Direct-from-memory Put Screen)
  1416. Class : Display
  1417. Level : Clone
  1418.  
  1419. This routine restores a portion of the display (which was saved
  1420. to an array by DGetScreen or GetScreen) to the screen.  Only
  1421. text modes are supported. If your program uses multiple display
  1422. pages, you can put the image onto any of those pages.  A
  1423. special "slow" mode is supported for the CGA, to prevent
  1424. flickering (a problem only with some CGAs).
  1425.  
  1426. The PutScreen routine works the same way as this, but has a
  1427. simpler calling convention.  Also, if you wish to restore the
  1428. entire screen, you may find ScrRest easier (see).
  1429.  
  1430.    CALL DPutScreen (DSeg%, DOfs%, TRow%, LCol%, BRow%, RCol%, _
  1431.       Page%, Fast%)
  1432.  
  1433. DSeg%      segment of the array from which to restore the image
  1434. DOfs%      offset of the array from which to restore the image
  1435. TRow%      top row of the desired screen area
  1436. LCol%      left column of the desired screen area
  1437. BRow%      bottom row of the desired screen area
  1438. RCol%      right column of the desired screen area
  1439. Page%      page on which to restore the display
  1440. Fast%      whether to use fast mode (0 no)
  1441.  
  1442. Name  : DRecDel              (Direct-to-memory Record Deletion)
  1443. Class : Array management
  1444. Level : Any
  1445.  
  1446. This routine allows you to delete an item from an array.  The
  1447. item may consist of one or more array elements.  The size of
  1448. the array isn't actually changed, but the array elements are
  1449. moved as if a deletion took place.
  1450.  
  1451.    CALL DRecDel (DSeg%, DOfs%, RecNr%, RecLen%, Records%)
  1452.  
  1453. DSeg%      segment of the array
  1454. DOfs%      offset of the array
  1455. RecNr%     record/element number (starting at 1)
  1456. RecLen%    record/element length in bytes
  1457. Records%   total number of records/elements in the array
  1458.  
  1459. Name  : DRecIns              (Direct-to-mem Record Insertion)
  1460. Class : Array management
  1461. Level : Any
  1462.  
  1463. This routine allows you to insert an item into an array.  The
  1464. item may consist of one or more array elements.  The size of
  1465. the array isn't actually changed, but the array elements are
  1466. moved as if an insertion took place.  You must of course make
  1467. sure that the array is DIMed large enough to handle this.
  1468.  
  1469.    CALL DRecIns (DSeg%, DOfs%, RecNr%, RecLen%, Records%)
  1470.  
  1471. DSeg%      segment of the array
  1472. DOfs%      offset of the array
  1473. RecNr%     record/element number (starting at 1)
  1474. RecLen%    record/element length in bytes
  1475. Records%   total number of records/elements in the array
  1476.  
  1477. Name  : DRecolor             (Direct-to-memory Recolor)
  1478. Class : Display
  1479. Level : Any
  1480.  
  1481. The DRecolor routine changes all text in one color to another
  1482. color.  It works only in text modes.  The colors are specified
  1483. as attributes (see CalcAttr).
  1484.  
  1485. This routine does not necessarily work on the display itself.
  1486. Instead, it allows you to specify the memory location (segment
  1487. and offset) of the "screen", which may be an actual screen, a
  1488. saved screen in an array, a multitasker's virtual screen, etc.
  1489. Among other things, this makes it easy to work with two
  1490. displays at once: use a segment of &HB000 for the mono display
  1491. and &HB800 for the color display (the offset in each case is
  1492. zero).
  1493.  
  1494.    CALL DRecolor (DSeg%, DOfs%, OldAttr%, NewAttr%)
  1495.  
  1496. DSeg%      segment of "screen" memory
  1497. DOfs%      offset of "screen" memory
  1498. OldAttr%   color to be changed
  1499. NewAttr%   color to which to change
  1500.  
  1501. Name  : DRecolorArea         (Direct-to-memory Recolor Area)
  1502. Class : Display
  1503. Level : Clone
  1504.  
  1505. The DRecolorArea routine changes a specified area of the screen
  1506. to a specified color.  It works only in text modes.  The color
  1507. is specified as an attribute (see CalcAttr).
  1508.  
  1509. One of the more common applications for this routine is marking
  1510. an area of the screen, e.g. menu highlight bars.
  1511.  
  1512.    CALL DRecolorArea (DSeg%, DOfs%, TRow%, LCol%, BRow%, _
  1513.       RCol%, VAttr%)
  1514.  
  1515. This routine does not necessarily work on the display itself.
  1516. Instead, it allows you to specify the memory location (segment
  1517. and offset) of the "screen", which may be an actual screen, a
  1518. saved screen in an array, a multitasker's virtual screen, etc.
  1519. Among other things, this makes it easy to work with two
  1520. displays at once: use a segment of &HB000 for the mono display
  1521. and &HB800 for the color display (the offset in each case is
  1522. zero).
  1523.  
  1524. DSeg%       segment of "screen" memory
  1525. DOfs%       offset of "screen" memory
  1526. TRow%       top row of area to recolor
  1527. LCol%       left column of area to recolor
  1528. BRow%       bottom row of area to recolor
  1529. RCol%       right column of area to recolor
  1530. VAttr%      desired color
  1531.  
  1532. Name  : DrvType              (Drive Type)
  1533. Class : Disk
  1534. Level : DOS 3.1+
  1535.  
  1536. The DrvType routine tells you whether a specified drive is
  1537. fixed or removeable, and whether it is local or remote (network
  1538. drive).
  1539.  
  1540.    CALL DrvType (Drive$, Removeable%, Remote%, ErrCode%)
  1541.  
  1542. Drive$       letter of the drive to examine
  1543. -------
  1544. Removeable%  whether the disk can be removed (0 if no)
  1545. Remote%      whether this is a remote drive (0 if no)
  1546. ErrCode%     error code: 0 if none, else bad DOS version
  1547.  
  1548. Name  : DScrRest             (Direct-from-mem Screen Restore)
  1549. Class : Display
  1550. Level : Clone
  1551.  
  1552. The DScrRest routine restores a display that was saved using
  1553. ScrSave or a similar routine.  It only works in text modes.
  1554. See also ScrRest.
  1555.  
  1556.    CALL DScrRest (DSeg%, DOfs%, Page%, Fast%)
  1557.  
  1558. DSeg%      segment of info to restore to the screen
  1559. DOfs%      offset of info to restore to the screen
  1560. Page%      page on which to restore the display
  1561. Fast%      whether to use fast mode (0 no)
  1562.  
  1563. Name  : DScrSave             (Direct-from-memory Screen Save)
  1564. Class : Display
  1565. Level : Clone
  1566.  
  1567. The DScrSave routine saves the display to an array or other
  1568. storage area. Only text modes are supported.  For an 80x25
  1569. display, the array must hold 4,000 bytes (4,000 string
  1570. characters or 2,000 integers).  See also ScrSave.
  1571.  
  1572.    CALL DScrSave (DSeg%, DOfs%, Page%, Fast%)
  1573.  
  1574. DSeg%      segment of place to store the display
  1575. DOfs%      offset of place to store the display
  1576. Page%      page from which to get the display
  1577. Fast%      whether to use fast mode (0 no)
  1578.  
  1579. Name  : DTR                  (Data Terminal Ready signal)
  1580. Class : Serial
  1581. Level : Clone
  1582.  
  1583. Just as IBM provided the standard for personal computers, Hayes
  1584. provided the standard for modem commands.  Unfortunately, the
  1585. command method of dropping carrier (hanging up the phone) was
  1586. badly designed, and all Hayes-compatible modems have a hard
  1587. time recognizing that command under certain line conditions.
  1588.  
  1589. Fortunately, there's a more reliable way of hanging up: the DTR
  1590. serial signal.  Turning this signal off will cause the modem to
  1591. hang up very quickly.  Most Hayes-compatible modems are
  1592. factory-set to pay attention to the DTR; those that aren't can
  1593. be made to do so either by flipping a hardware switch or with a
  1594. special initialization command.  See your modem manual for
  1595. details.
  1596.  
  1597. BASIC will drop the DTR when you CLOSE the comm port, but this
  1598. isn't always a convenient way to do it.  As a matter of fact,
  1599. this can be a decided nuisance, so many people have patched
  1600. their version of BASIC to avoid it.  If you would like to do
  1601. so, check your local BBS for the method!  With the PBBack DTR
  1602. routine, you can get full control over the DTR without having
  1603. to CLOSE the comm port.
  1604.  
  1605. Note: it may be wise to include a brief delay after dropping
  1606. the DTR, to give the modem a chance to react.  Try Delay18th
  1607. with a wait of around 4.
  1608.  
  1609.    CALL DTR (CommPort%, TurnOn%)
  1610.  
  1611. CommPort%    serial port (1-4, though BASIC only handles 1-2)
  1612. TurnOn%      whether to raise (turn on) the DTR (0 if no)
  1613.  
  1614. Name  : DXQPrint             (Direct Extended Quick Print)
  1615. Class : Display
  1616. Level : Any
  1617.  
  1618. This routine provides a rather crude, but very fast, display
  1619. capability.  It works like the PRINT statement in BASIC, except
  1620. that it doesn't move the cursor or process control codes.  It
  1621. works only in text modes.
  1622.  
  1623. This routine does not necessarily work on the display itself.
  1624. Instead, it allows you to specify the memory location (segment
  1625. and offset) of the "screen", which may be an actual screen, a
  1626. saved screen in an array, a multitasker's virtual screen, etc.
  1627. Among other things, this makes it easy to work with two
  1628. displays at once: use a segment of &HB000 for the mono display
  1629. and &HB800 for the color display (the offset in each case is
  1630. zero).
  1631.  
  1632.    CALL DXQPrint (DSeg%, DOfs%, St$, Row%, Column%, VAttr%)
  1633.  
  1634. DSeg%     segment of "screen" memory
  1635. DOfs%     offset of "screen" memory
  1636. St$       string to display
  1637. Row%      starting row
  1638. Column%   starting column
  1639. VAttr%    color/attribute (see CalcAttr)
  1640.  
  1641. Name  : EGARest7             (EGA Restore for SCREEN 7)
  1642. Class : Display
  1643. Level : Clone
  1644.  
  1645. This routine allows you to restore a SCREEN 7 (EGA, 320x200, 16
  1646. color) display that was saved using EGASave7.
  1647.  
  1648.    CALL EGARest7 (DSeg%, DOfs%)
  1649.  
  1650. DSeg%        segment of storage array
  1651. DOfs%        offset  of storage array
  1652.  
  1653. Name  : EGARest8             (EGA Restore for SCREEN 8)
  1654. Class : Display
  1655. Level : Clone
  1656.  
  1657. This routine allows you to restore a SCREEN 8 (EGA, 640x200, 16
  1658. color) display that was saved using EGASave8.
  1659.  
  1660.    CALL EGARest8 (DSeg%, DOfs%)
  1661.  
  1662. DSeg%        segment of storage array
  1663. DOfs%        offset  of storage array
  1664.  
  1665. Name  : EGARest9             (EGA Restore for SCREEN 9)
  1666. Class : Display
  1667. Level : Clone
  1668.  
  1669. This routine allows you to restore a SCREEN 9 (EGA, 640x350, 16
  1670. color) display that was saved using EGASave9.
  1671.  
  1672.    CALL EGARest9 (DSeg1%, DOfs1%, DSeg2%, DOfs2%)
  1673.  
  1674. DSeg1%       segment of storage array #1
  1675. DOfs1%       offset  of storage array #1
  1676. DSeg2%       segment of storage array #2
  1677. DOfs2%       offset  of storage array #2
  1678.  
  1679. Name  : EGASave7             (EGA Save for SCREEN 7)
  1680. Class : Display
  1681. Level : Clone
  1682.  
  1683. This routine allows you to save a SCREEN 7 (EGA, 320x200, 16
  1684. color) display that can be restored using EGARest7.
  1685.  
  1686. The array used to hold the screen must contain 32,000 bytes.
  1687. For an integer array, this means that you must create the array
  1688. by DIM Array%(1 TO 16000).
  1689.  
  1690.    CALL EGASave7 (DSeg%, DOfs%)
  1691.  
  1692. DSeg%        segment of storage array
  1693. DOfs%        offset  of storage array
  1694.  
  1695. Name  : EGASave8             (EGA Save for SCREEN 8)
  1696. Class : Display
  1697. Level : Clone
  1698.  
  1699. This routine allows you to save a SCREEN 8 (EGA, 640x200, 16
  1700. color) display that can be restored using EGARest8.
  1701.  
  1702. The array used to hold the screen must contain 64,000 bytes.
  1703. For an integer array, this means that you must create the array
  1704. by DIM Array%(1 TO 32000).
  1705.  
  1706.    CALL EGASave8 (DSeg%, DOfs%)
  1707.  
  1708. DSeg%        segment of storage array
  1709. DOfs%        offset  of storage array
  1710.  
  1711. Name  : EGASave9             (EGA Save for SCREEN 9)
  1712. Class : Display
  1713. Level : Clone
  1714.  
  1715. This routine allows you to save a SCREEN 9 (EGA, 640x350, 16
  1716. color) display that can be restored using EGARest9.
  1717.  
  1718. Two arrays must be used to hold the screen, for a total of
  1719. 112,000 bytes.  If you use integer arrays, each array must be
  1720. created by DIM Array%(1 TO 28000).
  1721.  
  1722.    CALL EGASave9 (DSeg%, DOfs%)
  1723.  
  1724. DSeg1%       segment of storage array #1
  1725. DOfs1%       offset  of storage array #1
  1726. DSeg2%       segment of storage array #2
  1727. DOfs2%       offset  of storage array #2
  1728.  
  1729. Name  : EMSBuffer            (EMS Buffer size)
  1730. Class : Memory
  1731. Level : BIOS
  1732.  
  1733. EMSBuffer tells you how many bytes are needed to save the state
  1734. of the EMS array routines.  Used in conjunction with EMSSave
  1735. and EMSRest, it allows you to preserve EMS arrays across a
  1736. CHAIN to another part of your program.
  1737.  
  1738.    CALL EMSBuffer (Bytes%)
  1739.    EMSState$ = SPACE$(Bytes%)
  1740.    CALL EMSSave (EMSState$)
  1741.  
  1742. -------
  1743. Bytes%       bytes needed to save EMS array state
  1744.  
  1745. Name  : EMSClose             (EMS Close)
  1746. Class : Memory
  1747. Level : BIOS
  1748.  
  1749. The EMSClose routine is used when you are finished with an EMS
  1750. array.  It frees the array handle and EMS memory for other
  1751. uses.  If you don't close all EMS arrays before your program
  1752. ends, the memory will be lost until the system is rebooted, so
  1753. it is important to remember EMSClose.
  1754.  
  1755.    CALL EMSClose (ArrayHandle%)
  1756.  
  1757. ArrayHandle%    handle of an EMS array
  1758.  
  1759. Name  : EMSGet               (EMS Get)
  1760. Class : Memory
  1761. Level : BIOS
  1762.  
  1763. This routine gets an element from an EMS array created by
  1764. EMSOpen.  Element numbers start at 0.  Be sure to use the right
  1765. numeric type for the array-- for instance, if you opened the
  1766. array for SINGLE precision, use "Value!".
  1767.  
  1768.    CALL EMSGet (ArrayHandle%, ElementNr%, Value
  1769.  
  1770. ArrayHandle%    handle of an EMS array
  1771. ElementNr%      element number to get
  1772. -------
  1773. Value           result (must be correct type for array)
  1774.  
  1775. Name  : EMSOpen              (EMS Open)
  1776. Class : Memory
  1777. Level : BIOS
  1778.  
  1779. This routine allows you to open a block of EMS (expanded)
  1780. memory which can then be accessed like a numeric array.  The
  1781. array size is limited only by available EMS memory (use GetLIMM
  1782. to find out how much is available).  You may specify any
  1783. numeric type:
  1784.  
  1785.     1   INTEGER
  1786.     2   SINGLE
  1787.     3   DOUBLE
  1788.  
  1789. When the array is opened, you are returned an "array handle"
  1790. which is used to access that array.  Access to the array is
  1791. done via EMSGet and EMSPut.  When you are finished with the
  1792. array, you must close it with EMSClose.
  1793.  
  1794. As many as 25 EMS arrays can be in use at one time, subject to
  1795. limitations which may be imposed by your EMS driver (each array
  1796. requires one EMS handle).
  1797.  
  1798.    CALL EMSOpen (Elements, ElementType%, ArrayHandle%, _
  1799.       ErrCode%)
  1800.  
  1801. Elements%       number of elements in array (like DIM size)
  1802. ElementType%    numeric type of array (see above)
  1803. -------
  1804. ArrayHandle%    handle of an EMS array
  1805. ErrCode%        whether an error occurred (0 no)
  1806.  
  1807. Name  : EMSPut               (EMS Put)
  1808. Class : Memory
  1809. Level : BIOS
  1810.  
  1811. This routine puts an element into an EMS array created by
  1812. EMSOpen.  Element numbers start at 0.  Be sure to use the right
  1813. numeric type for the array-- for instance, if you opened the
  1814. array for SINGLE precision, use "Value!".
  1815.  
  1816.    CALL EMSPut (ArrayHandle%, ElementNr%, Value)
  1817.  
  1818. ArrayHandle%    handle of an EMS array
  1819. ElementNr%      element number to set
  1820. Value           value to store (must be correct type for array)
  1821.  
  1822. Name  : EMSRest              (EMS Restore state)
  1823. Class : Memory
  1824. Level : BIOS
  1825.  
  1826. This routine allows you to restore the state of the EMS array
  1827. handler.  Used in conjunction with EMSBuffer and EMSSave, it
  1828. allows you to preserve EMS arrays across a CHAIN to another
  1829. part of your program.
  1830.  
  1831.    CALL EMSRest (EMSState$)
  1832.  
  1833. EMSState$    saved EMS array state
  1834.  
  1835. Name  : EMSSave              (EMS Save state)
  1836. Class : Memory
  1837. Level : BIOS
  1838.  
  1839. This routine allows you to save the state of the EMS array
  1840. handler.  Used in conjunction with EMSBuffer and EMSRest, it
  1841. allows you to preserve EMS arrays across a CHAIN to another
  1842. part of your program.
  1843.  
  1844.    CALL EMSBuffer (Bytes%)
  1845.    EMSState$ = SPACE$(Bytes%)
  1846.    CALL EMSSave (EMSState$)
  1847.  
  1848. -------
  1849. EMSState$    saved EMS array state
  1850.  
  1851. Name  : EnhKbd               (Enhanced Keyboard)
  1852. Class : Input
  1853. Level : BIOS
  1854.  
  1855. By default, the PBBack routines assume an old-style keyboard is
  1856. in use, for greatest compatibility.  EnhKbd allows you to turn
  1857. on enhanced keyboard handling for the current generation of
  1858. (usually) 101-key keyboards.  This allows access to the F11 and
  1859. F12 function keys as well as codes for key combinations that
  1860. used to be ignored, among other things.
  1861.  
  1862. The KbdType or KbdType2% routine can be used to determine if an
  1863. enhanced keyboard is available (recommended).
  1864.  
  1865. Note that EnhKbd works by intercepting the BIOS keyboard
  1866. handler.  All calls to the BIOS keyboard interrupt are
  1867. converted from the old keyboard functions to the new ones.  YOU
  1868. MUST DISABLE EnhKbd BEFORE YOUR PROGRAM ENDS, so it can restore
  1869. the old setup.  Otherwise, the computer will most probably
  1870. crash.
  1871.  
  1872. A list of the new key codes is given in PBBACK.DOC.
  1873.  
  1874.    CALL EnhKbd (Enable%)
  1875.  
  1876. Enable%     turn on enhanced keyboard support (0 disable)
  1877.  
  1878. Name  : Equipment            (Equipment information)
  1879. Class : Equipment
  1880. Level : BIOS
  1881.  
  1882. This routine gives you some information about the basic
  1883. equipment in your computer.  Note that the "game port"
  1884. information is not reliable, due to changes in the meaning of
  1885. this particular area of the BIOS over many years.
  1886.  
  1887.    CALL Equipment (Memory%, Parallel%, Serial%, Game%)
  1888.  
  1889. -------
  1890. Memory%    kilobytes of conventional memory installed (16 - 640)
  1891. Parallel%  parallel (printer) ports installed (0-4)
  1892. Serial%    serial (communications) ports installed (0-4)
  1893. Game%      game (joystick) ports installed (0-1).  See remarks, above.
  1894.  
  1895. Name  : Exist                (file Existence)
  1896. Class : Disk
  1897. Level : DOS
  1898.  
  1899. Most versions of BASIC give you no way of seeing if a file
  1900. exists before you try to OPEN it, so you end up taking your
  1901. chances.  The Exist routine allows you to test to see if the
  1902. file exists beforehand.  It isn't really necessary for the
  1903. PBBack file routines, which will return an appropriate error
  1904. code, but it's an important safeguard when using the BASIC OPEN
  1905. statement.
  1906.  
  1907. The Exist routine does not support wildcards.  If you need that
  1908. feature, try the FindFirstF and FindNextF routines instead.
  1909.  
  1910.    CALL Exist (FileName$, Found%)
  1911.  
  1912. FileName$   name of the file to look for
  1913. -------
  1914. Found%      whether the file was found (0 if no)
  1915.  
  1916. Name  : EXQPrintC            (EGA Extended Quick Print, Char)
  1917. Class : Display
  1918. Level : Clone
  1919.  
  1920. This routine provides a rather crude, but very fast, display
  1921. capability.  It works like the PRINT statement in BASIC, except
  1922. that it doesn't move the cursor or process control codes.  It
  1923. works in EGA and VGA graphics modes (SCREEN 7 through SCREEN
  1924. 12).  Note that you can control both foreground and background
  1925. colors, unlike BASIC.
  1926.  
  1927.    CALL EXQPrintC (St$, Row%, Column%, Fore%, Back%)
  1928.  
  1929. St$       string to display
  1930. Row%      starting row
  1931. Column%   starting column
  1932. Fore%     foreground color
  1933. Back%     background color
  1934.  
  1935. Name  : ExtMem               (Extended Memory)
  1936. Class : Memory / Equipment
  1937. Level : BIOS (AT)
  1938.  
  1939. This routine allows you to find out how much extended memory is
  1940. available. It should only be used on AT-class computers, since
  1941. older PCs do not support extended memory.
  1942.  
  1943. The amount of memory returned may be either the total amount of
  1944. extended memory installed or just the amount available at this
  1945. time, depending on how previously-installed programs (if any)
  1946. make use of extended memory. Unfortunately, there is no
  1947. standard which defines how a program should use extended memory
  1948. as there is with EMS (expanded memory), so there is no way for
  1949. a program to determine whether or how another program is using
  1950. extended memory.  Microsoft is trying to clear up this
  1951. situation with its HIMEM driver (available at your local BBS,
  1952. or [last I looked] free from Microsoft), but this approach
  1953. hasn't really become standard yet.
  1954.  
  1955.    CALL ExtMem (KBytes%)
  1956.  
  1957. -------
  1958. KBytes%     the number of kilobytes of extended memory
  1959.  
  1960. Name  : FadeOut              (Fade Out)
  1961. Class : Display
  1962. Level : Clone
  1963.  
  1964. Like CLS, but a bit more fancy, this routine provides an
  1965. interesting way to clear the screen.  See also Dissolve.
  1966.  
  1967.    CALL FadeOut (VAttr%)
  1968.  
  1969. VAttr%   color/attribute to which to clear (see CalcAttr)
  1970.  
  1971. Name  : FarPoke              (Far memory Poke)
  1972. Class : Memory
  1973. Level : Clone
  1974.  
  1975. This is like the BASIC POKE statement, but expects both a
  1976. segment and an offset, thus doing away with the need for DEF
  1977. SEG.  This is especially handy for use in subprograms which
  1978. might otherwise inadvertently change the DEF SEG value expected
  1979. by the main program.
  1980.  
  1981.    CALL FarPoke (DSeg%, DOfs%, Value%)
  1982.  
  1983. DSeg%    segment of the location to look at
  1984. DOfs%    offset of the location to look at
  1985. Value%   value to store in the given memory posn (byte: 0-255)
  1986.  
  1987. Name  : FarPokeI             (Far memory Poke Integer)
  1988. Class : Memory
  1989. Level : Clone
  1990.  
  1991. This is like the BASIC POKE statement, but expects both a
  1992. segment and an offset, thus doing away with the need for DEF
  1993. SEG.  This is especially handy for use in subprograms which
  1994. might otherwise inadvertently change the DEF SEG value expected
  1995. by the main program.  Unlike POKE, this routine stores a word
  1996. or integer.
  1997.  
  1998.    CALL FarPokeI (DSeg%, DOfs%, Value%)
  1999.  
  2000. DSeg%    segment of the location to look at
  2001. DOfs%    offset of the location to look at
  2002. Value%   value to store in the given memory posn (word)
  2003.  
  2004. Name  : FClose1              (File Close)
  2005. Class : Disk
  2006. Level : DOS
  2007.  
  2008. This routine closes a file that was opened by FOpen1 or
  2009. FCreate.  It can also be used to close any of the predefined
  2010. device handles.
  2011.  
  2012. These are the predefined device handles that are always
  2013. available:
  2014.  
  2015.    0    CON     stdin     standard input, normally the keyboard
  2016.    1    CON     stdout    standard output, normally the display
  2017.    2    CON     stderr    standard error, almost always display
  2018.    3    AUX     stdaux    auxiliary device, generally COM1
  2019.    4    PRN     stdprn    standard printer, generally LPT1
  2020.  
  2021. If you are running short of handles, you can always close
  2022. stdaux to free up a handle.  The stdprn device can also be
  2023. closed as long as you don't use the printer or if you only
  2024. access the printer through LPRINT.  It is not a good idea to
  2025. close stdin, stdout, or stderr under normal circumstances.
  2026.  
  2027.    CALL FClose1 (Handle%)
  2028.  
  2029. Handle%    handle of the file to close
  2030.  
  2031. Name  : FCreate              (File Create)
  2032. Class : Disk
  2033. Level : DOS
  2034.  
  2035. This routine creates a file and opens it for use by the PBBack
  2036. file handling routines.  If the file already existed, it will
  2037. be wiped out, so you may want to check beforehand if this is a
  2038. problem.  Try the Exist routine.
  2039.  
  2040. The file is opened in read/write mode, allowing both input and
  2041. output.
  2042.  
  2043. You may create the file using any of the following attributes:
  2044.  
  2045.    Normal          0      (nothing special)
  2046.    Read Only       1      file can be read, but not written to
  2047.    Hidden          2      file is "invisible"
  2048.    System          4      special DOS system file
  2049.  
  2050. The attributes can be combined by adding them together.  Don't
  2051. use the System attribute unless you know what you're doing!
  2052.  
  2053. Note that this routine does not support file sharing.  If that
  2054. is a problem, close the file just after it is created and
  2055. reopen it using FOpen1.
  2056.  
  2057.    CALL FCreate (FileName$, FAttr%, Handle%, ErrCode%)
  2058.  
  2059. FileName$  name of the file to create
  2060. FAttr%     attribute(s) of the file
  2061. -------
  2062. Handle%    handle by which to access the file (if no error)
  2063. ErrCode%   error code: 0 if no error, else DOS Error
  2064.  
  2065. Name  : FileCount            (File Count)
  2066. Class : Disk
  2067. Level : DOS
  2068.  
  2069. This routine returns the number of files which match a given
  2070. file specification and attribute.  You need to use this routine
  2071. before LoadDir or LoadDirAll in order to DIM the array to the
  2072. appropriate size.
  2073.  
  2074. The attribute can be any of the usual file attributes:
  2075.    1   Read-Only
  2076.    2   Hidden
  2077.    4   System
  2078.   16   Directory
  2079.  
  2080. You can combine attributes by adding their values.  For
  2081. instance, to search for hidden directories, you'd use an
  2082. attribute of 18.  By default, DOS returns normal files as well
  2083. as files which have the specified attributes, so an attribute
  2084. of 18 would get you normal files, hidden files, directories,
  2085. and hidden directories.  However, FileCount can be made to
  2086. screen out unwanted files-- just negate the attribute to force
  2087. only files of that attribute to be counted.  For example, an
  2088. attribute of -18 would return only hidden subdirectories.
  2089.  
  2090.    CALL FileCount (FileSpec$, FilAttr%, Count%, ErrCode%)
  2091.  
  2092. We use FilAttr% instead of FileAttr%, since BASIC has a
  2093. built-in FILEATTR function in some versions.
  2094.  
  2095. FileSpec$   search filename (may contain wildcards)
  2096. FilAttr%    search file attribute
  2097. -------
  2098. Count%      number of matching files found
  2099. ErrCode%    error code (0 if no error)
  2100.  
  2101. Name  : FindFirstF           (Find First File)
  2102. Class : Disk
  2103. Level : DOS
  2104.  
  2105. The FindFirstF routine is used to find the first file that
  2106. matches search parameters which you specify.  Various
  2107. information about the file that matches (if any) can be
  2108. retrieved by other routines.  See also FindNextF.
  2109.  
  2110. The file name specified may contain a drive and subdirectory
  2111. specification. Wildcards are also allowed.
  2112.  
  2113. Possible search attributes are as follows:
  2114.  
  2115.    Normal          0      (nothing special)
  2116.    Hidden          2      file is "invisible"
  2117.    System          4      special DOS system file
  2118.    Subdirectory   16      subdirectory
  2119.  
  2120. You can combine the attributes by adding them together.  All
  2121. searches will match if any of the specified attributes are
  2122. found, so if you're looking only for a specific attribute, you
  2123. will need to test the results using GetAttrF.
  2124.  
  2125. Routines in this series include:
  2126.    FindFirstF, FindNextF, GetNameF, GetAttrF, GetDateF,
  2127.    GetTimeF
  2128.  
  2129.    CALL FindFirstF (FileName$, FAttr%, ErrCode%)
  2130.  
  2131. FileName$   name of file(s) for which to search
  2132. FAttr%      file attribute(s) to seek
  2133. -------
  2134. ErrCode%    error code (0 if no error, else no matching files)
  2135.  
  2136. Name  : FindNextF            (Find Next File)
  2137. Class : Disk
  2138. Level : DOS
  2139.  
  2140. This routine is for use after FindFirstF, to find any
  2141. additional files which may match your search specifications.
  2142.  
  2143. Routines in this series include:
  2144.    FindFirstF, FindNextF, GetNameF, GetAttrF, GetDateF,
  2145.    GetTimeF
  2146.  
  2147.    CALL FindNextF (ErrCode%)
  2148.  
  2149. -------
  2150. ErrCode%    error code (0 if no error, else no matching files)
  2151.  
  2152. Name  : Floppies             (Floppies installed)
  2153. Class : Equipment / Disk
  2154. Level : BIOS
  2155.  
  2156. The Floppies routine tells you how many floppy drives are
  2157. installed (0-4).
  2158.  
  2159.    CALL Floppies (Drives%)
  2160.  
  2161. -------
  2162. Drives%  number of floppy disk drives installed
  2163.  
  2164. Name  : FloppyType           (Floppy drive Type)
  2165. Class : Equipment / Disk
  2166. Level : Clone (AT)
  2167.  
  2168. This routine tells you what kinds of floppy drives are
  2169. installed, if any.  A code is returned for each drive, as
  2170. follows:
  2171.  
  2172.    0    no drive
  2173.    1    5 1/4"    360K
  2174.    2    5 1/4"    1.2M
  2175.    3    3 1/2"    720K
  2176.    4    3 1/2"    1.44M
  2177.  
  2178. Result codes of 5-7 are available, but not yet defined.  One
  2179. might guess that the 2.88M drive supported by DOS 5.0 will be
  2180. drive type 5.
  2181.  
  2182. Note that this routine supports a maximum of only two drives.
  2183. It is possible for a machine to have up to four drives, but
  2184. there is not currently any good way to find out about them.
  2185.  
  2186. FloppyType should only be used on AT-class machines.  It will
  2187. not work on PC/XT computers and may cause unusual results if
  2188. used on such machines.  It will also not work on some of the
  2189. earliest AT machines which didn't adhere to the standard CMOS
  2190. format.
  2191.  
  2192.    CALL FloppyType (DriveA%, DriveB%)
  2193.  
  2194. -------
  2195. DriveA%    drive type of first floppy drive
  2196. DriveB%    drive type of second floppy drive
  2197.  
  2198. Name  : FlushToDisk          (Flush file buffers To Disk)
  2199. Class : Disk
  2200. Level : DOS
  2201.  
  2202. This is a "file safety" routine for use with files opened by
  2203. FOpen1 or FCreate.  Files are normally buffered by DOS, which
  2204. makes file handling faster but creates the danger of losing the
  2205. file if there is a crash or power outage.  By flushing the file
  2206. to disk, you insure that it is updated to the current moment.
  2207.  
  2208. Note: this routine will need to temporarily create a new file
  2209. handle if DOS versions before 4.0 are used.
  2210.  
  2211.    CALL FlushToDisk (Handle%, ErrCode%)
  2212.  
  2213. Handle%    handle of the file to flush
  2214. -------
  2215. ErrCode%   error code: 0 if none, else DOS Error
  2216.  
  2217. Name  : FOpen1               (File Open)
  2218. Class : Disk
  2219. Level : DOS
  2220.  
  2221. This routine opens an existing file for use with the PBBack
  2222. file handling routines.  If you need to create a file that
  2223. doesn't already exist, use the FCreate routine instead.
  2224.  
  2225. The file may be opened for reading, writing, or both:
  2226.  
  2227.    0   Read
  2228.    1   Write
  2229.    2   Read/Write
  2230.  
  2231. You may specify a file sharing mode for use with networks and
  2232. multitaskers. This will only take effect if the DOS version is
  2233. 3.0 or later and if the DOS SHARE utility has been executed.
  2234. Otherwise, it will be ignored.
  2235.  
  2236.    0   Normal       compatibility mode: no file sharing
  2237.    1   Exclusive    no one else may access the file
  2238.    2   Deny Write   no one else may write to the file
  2239.    3   Deny Read    no one else may read from the file
  2240.    4   Deny None    anyone else may read from or write to file
  2241.  
  2242. Most of the time, "Deny Write" will be appropriate.  This
  2243. allows others to read the file, but not to modify the file on
  2244. you unexpectedly.
  2245.  
  2246. See the discussion of predefined device handles at FClose1.
  2247.  
  2248.    CALL FOpen1 (FileName$, ReadWrite%, Sharing%, Handle%, _
  2249.       ErrCode%)
  2250.  
  2251. FileName$   name of the file to open
  2252. ReadWrite%  whether you want input, output, or both (see above)
  2253. Sharing%    file sharing mode (see above)
  2254. -------
  2255. Handle%    handle by which to access the file (if no error)
  2256. ErrCode%   error code: 0 if no error, else DOS Error
  2257.  
  2258. Name  : FSetEnd              (File Set to End)
  2259. Class : Disk
  2260. Level : DOS
  2261.  
  2262. This moves the file pointer to the end of the file.  It is for
  2263. use with files opened by FOpen1 or FCreate.  The usual purpose
  2264. for this is to append information to an existing file.
  2265.  
  2266. Note that some text files may have a Control-Z or CHR$(26) on
  2267. the end.  For historical reasons, this character is sometimes
  2268. used as an "end of file" marker.  When dealing with text files,
  2269. you may want to examine the last character of the file to make
  2270. sure it isn't a Control-Z.
  2271.  
  2272. Some Microsoft BASICs are among the programs which,
  2273. unfortunately, put a Control-Z at the end of a file (if you
  2274. OPEN for OUTPUT).
  2275.  
  2276.    CALL FSetEnd (Handle%)
  2277.  
  2278. Handle%    handle of the file
  2279.  
  2280. Name  : FSetRec              (File Set location to Record)
  2281. Class : Disk
  2282. Level : DOS
  2283.  
  2284. This sets the file pointer to a specific record in the file.
  2285. It is for use with files opened by FOpen1 or FCreate.
  2286.  
  2287.    CALL FSetRec (Handle%, RecSize%, RecNr%)
  2288.  
  2289. Handle%    handle of the file
  2290. RecSize%   number of bytes per record
  2291. RecNr%     number of record (starting at 1)
  2292.  
  2293. Name  : Get4DOSv             (Get 4DOS Version)
  2294. Class : Equipment
  2295. Level : DOS
  2296.  
  2297. The Get4DOSv routine returns the version of 4DOS being used.
  2298. It returns the results as two integers containing the major and
  2299. minor version numbers. For instance, 4DOS 4.0 would return a
  2300. major number of 4, minor 0.  If 4DOS is not installed, both
  2301. version numbers will be zero.
  2302.  
  2303. If you're not familiar with 4DOS, it's a terrific improved
  2304. replacement for COMMAND.COM.  For more information, write JP
  2305. Software Inc., P.O. Box 1470, Arlington MA 02174, or call your
  2306. local BBS.
  2307.  
  2308.    CALL Get4DOSv (MajorV%, MinorV%)
  2309.  
  2310. -------
  2311. MajorV%   major part of the 4DOS version
  2312. MinorV%   minor part of the 4DOS version
  2313.  
  2314. Name  : GetAttrF             (Get Attribute of File)
  2315. Class : Disk
  2316. Level : DOS
  2317.  
  2318. The GetAttrF routine returns the attributes of a file matched
  2319. by FindFirstF or FindNextF.
  2320.  
  2321.    Normal          0      (nothing special)
  2322.    Read Only       1      file can be read, but not written to
  2323.    Hidden          2      file is "invisible"
  2324.    System          4      special DOS system file
  2325.    Subdirectory   16      subdirectory
  2326.    Archive        32      (used by some backup utilities)
  2327.  
  2328. You can see if a certain value is set using the AND operator:
  2329.  
  2330.    IF FAttr% AND 16 THEN PRINT "Subdirectory"
  2331.  
  2332. Since the values are all powers of two, the AND operator makes
  2333. for a convenient way of decoding the results.
  2334.  
  2335. Routines in this series include:
  2336.    FindFirstF, FindNextF, GetNameF, GetAttrF, GetDateF,
  2337.    GetTimeF
  2338.  
  2339.    CALL GetAttrF (FAttr%)
  2340.  
  2341. -------
  2342. FAttr%   attributes that are set
  2343.  
  2344. Name  : GetCommAddr          (Get Comm Address)
  2345. Class : Serial
  2346. Level : Clone
  2347.  
  2348. This routine allows you to determine the base port address of a
  2349. serial port. You tell it the COM port number (1-4) and it
  2350. returns the port address.  If there is no port installed, zero
  2351. will be returned.
  2352.  
  2353. Note that ports are "supposed" to be assigned sequentially-- in
  2354. other words, if you find a "zero" port address, there will be
  2355. no ports after that.  This is not necessarily the case,
  2356. however.  Some semi-standard machines may have a COM2 without a
  2357. COM1, for instance.  QuickBASIC gets confused in that case, but
  2358. it's no problem with my libraries.
  2359.  
  2360. Aside from purely informational purposes, this routine can be
  2361. useful in conjunction with SetCommAddr in manipulating the
  2362. serial ports.
  2363.  
  2364.    CALL GetCommAddr (PortNr%, PortAddr%)
  2365.  
  2366. PortNr%     COM port number (1-4)
  2367. -------
  2368. PortAddr%   port address
  2369.  
  2370. Name  : GetCRT               (Get CRT)
  2371. Class : Display / Equipment
  2372. Level : Clone
  2373.  
  2374. The GetCRT routine simply tells you whether the current display
  2375. is capable of handling colors or not.  An unsophisticated
  2376. routine, GetCRT assumes that if the display is an MDA/Hercules,
  2377. it can't do color, but otherwise it can.
  2378.  
  2379. See also GetEGA, GetHGA and GetVGA.
  2380.  
  2381.    CALL GetCRT (Colour%)
  2382.  
  2383. -------
  2384. Colour%   whether the display is color (0 if no)
  2385.  
  2386. Name  : GetDateAT            (Get Date from AT clock)
  2387. Class : Time
  2388. Level : BIOS (AT)
  2389.  
  2390. This routine gets the date from the hardware real-time clock in
  2391. AT-class computers.  Depending on the DOS version, this date
  2392. may be partially or completely independent of the date kept by
  2393. DOS in software.  DOS always reads the date from the hardware
  2394. clock when it starts up.  However, use of the DATE command in
  2395. DOS (and the DATE$ function in QuickBASIC) may relate only to
  2396. the software copy of the date, which is not always guaranteed
  2397. to be the same as the date in the hardware clock due to certain
  2398. discrepancies in DOS.
  2399.  
  2400.    CALL GetDateAT (MonthNr%, DayNr%, YearNr%, ErrCode%)
  2401.  
  2402. -------
  2403. MonthNr%     month number (1-12)
  2404. DayNr%       day (1-31)
  2405. YearNr%      year (1980-2079)
  2406. ErrCode%     error code: 0 if no error, else clock has stopped
  2407.  
  2408. Name  : GetDateF             (Get Date of File)
  2409. Class : Disk / Time
  2410. Level : DOS
  2411.  
  2412. The GetDateF routine returns the date of a file matched by
  2413. FindFirstF or FindNextF.
  2414.  
  2415. Routines in this series include:
  2416.    FindFirstF, FindNextF, GetNameF, GetAttrF, GetDateF,
  2417.    GetTimeF
  2418.  
  2419.    CALL GetDateF (MonthNr%, DayNr%, YearNr%)
  2420.  
  2421. -------
  2422. MonthNr%    month
  2423. DayNr%      day
  2424. YearNr%     year
  2425.  
  2426. Name  : GetDOSv              (Get DOS Version)
  2427. Class : Equipment
  2428. Level : DOS
  2429.  
  2430. The GetDOSv routine tells you what version of DOS you're
  2431. using.  It returns the results as two integers containing the
  2432. major and minor version numbers. For instance, MS-DOS 2.11
  2433. would return a major number of 2, minor 11.
  2434.  
  2435. The OS/2 compatibility box returns version numbers beginning at
  2436. 10.00.  For instance, OS/2 v1.1 returns 10.10 and OS/2 v2.0
  2437. returns 20.00.
  2438.  
  2439.    CALL GetDOSv (MajorV%, MinorV%)
  2440.  
  2441. -------
  2442. MajorV%   major part of the DOS version
  2443. MinorV%   minor part of the DOS version
  2444.  
  2445. Name  : GetDrv               (Get default Drive)
  2446. Class : Disk
  2447. Level : DOS
  2448.  
  2449. This routine tells you the letter of the current default drive.
  2450.  
  2451.    Drive$ = "x"
  2452.    CALL GetDrv (Drive$)
  2453.  
  2454. -------
  2455. Drive$    default drive letter.  Init to at least one character.
  2456.  
  2457. Name  : GetDView             (Get DESQview version)
  2458. Class : Miscellaneous
  2459. Level : DOS
  2460.  
  2461. The GetDView routine tells you what version of DESQview is
  2462. loaded.  It returns the results as two integers containing the
  2463. major and minor version numbers.  For instance, DESQview 2.0
  2464. would return a major number of 2 and a minor number of 0.  If
  2465. DESQview is not loaded, zeroes are returned.
  2466.  
  2467. See also GetTView, GetTVScreen, UpdTVScreen.
  2468.  
  2469.    CALL GetDView (MajorV%, MinorV%)
  2470.  
  2471. -------
  2472. MajorV%   major part of the DESQview version (0 if no DESQview)
  2473. MinorV%   minor part of the DESQview version
  2474.  
  2475. Name  : GetEGA               (Get EGA information)
  2476. Class : Display / Equipment
  2477. Level : BIOS
  2478.  
  2479. This routine tells you whether an EGA (or VGA) is available,
  2480. and if so, what kind.  It tells you whether the attached
  2481. display is monochrome or color, and how many kilobytes of RAM
  2482. are installed in the adapter.
  2483.  
  2484. Many early EGAs had only 64K of RAM.  Current adapters have
  2485. 256K or more. Since there are some limitations attached to
  2486. having only 64K, it's a good idea to see if this is the case--
  2487. most PBBack EGA routines won't work properly on 64k adapters.
  2488.  
  2489. See also GetCRT and GetVGA.
  2490.  
  2491.    CALL GetEGA (Display%, KBytes%)
  2492.  
  2493. -------
  2494. Display%  EGA display type: 0 no EGA, 1 EGA color, 2 EGA mono
  2495. KBytes%   kilobytes of display memory
  2496.  
  2497. Name  : GetExecPath          (Get Execution Path of program)
  2498. Class : Disk
  2499. Level : DOS 3.0+
  2500.  
  2501. This routine returns the full path of your program, i.e., the
  2502. drive, subdirectory, and name of the program.  It does not rely
  2503. on the current drive and subdirectory settings or look at the
  2504. PATH setting-- DOS tells it directly.  This makes it an
  2505. excellent way to find the program's "home" directory, where
  2506. (hopefully) any data files associated with the program will
  2507. also be stored.
  2508.  
  2509.    SelfName$ = SPACE$(80)
  2510.    CALL GetExecPath (SelfName$, SelfLen%)
  2511.    SelfName$ = LEFT$(SelfName$, SelfLen%)
  2512.  
  2513. -------
  2514. SelfName$   full path for current program.  Init to 80+ chars.
  2515. SelfLen%    length of the full path spec.
  2516.  
  2517. Name  : GetExtM              (Get Extended Memory)
  2518. Class : Memory / Equipment
  2519. Level : BIOS (AT)
  2520.  
  2521. This routine allows you to find out how much extended memory is
  2522. available. It should only be used on AT-class computers, since
  2523. older PCs do not support extended memory.  Note that some of
  2524. the very early AT machines will return erroneous results.
  2525.  
  2526. The amount of memory returned may be either the total amount of
  2527. extended memory installed or just the amount available at this
  2528. time, depending on how previously-installed programs (if any)
  2529. make use of extended memory. Unfortunately, there is no
  2530. standard which defines how a program should use extended memory
  2531. as there is with EMS (expanded memory), so there is no way for
  2532. a program to determine whether or how another program is using
  2533. extended memory.  Microsoft is trying to clear up this
  2534. situation with its HIMEM driver (available at your local BBS,
  2535. or [last I looked] free from Microsoft), but this approach
  2536. hasn't really become standard yet.
  2537.  
  2538.    CALL GetExtM (KBytes%)
  2539.  
  2540. -------
  2541. KBytes%    the number of kilobytes of extended memory
  2542.  
  2543. Name  : GetFAttr             (Get File Attribute)
  2544. Class : Disk
  2545. Level : DOS
  2546.  
  2547. This routine lets you read the attributes of a file or
  2548. subdirectory.  The attributes may contain a combination of any
  2549. of the following:
  2550.  
  2551.    Normal          0      (nothing special)
  2552.    Read Only       1      file can be read, but not written to
  2553.    Hidden          2      file is "invisible"
  2554.    System          4      special DOS system file
  2555.    Subdirectory   16      subdirectory
  2556.    Archive        32      (used by some backup utilities)
  2557.  
  2558. You can see if a certain value is set by using the AND operator:
  2559.  
  2560.    IF FAttr% AND 2 THEN PRINT "Hidden file"
  2561.  
  2562. Since the values are all powers of two, the AND operator makes
  2563. for a convenient way of decoding the results.
  2564.  
  2565.    CALL GetFAttr (FileName$, FAttr%)
  2566.  
  2567. FileName$   name of the file (or subdirectory) to examine
  2568. -------
  2569. FAttr%      attributes that are set
  2570.  
  2571. Name  : GetFDate             (Get File Date)
  2572. Class : Disk / Time
  2573. Level : DOS
  2574.  
  2575. This routine gets the date of a file.
  2576.  
  2577.    CALL GetFDate (FileName$, MonthNr%, DayNr%, YearNr%)
  2578.  
  2579. FileName$   name of the file to examine
  2580. -------
  2581. MonthNr%    month
  2582. DayNr%      day
  2583. YearNr%     year
  2584.  
  2585. Name  : GetFTime             (Get File Time)
  2586. Class : Disk / Time
  2587. Level : DOS
  2588.  
  2589. This routine gets the time of a file.
  2590.  
  2591.    CALL GetFTime (FileName$, HourNr%, MinuteNr%, SecondNr%)
  2592.  
  2593. FileName$     name of the file to examine
  2594. -------
  2595. HourNr%       hour
  2596. MinuteNr%     minute
  2597. SecondNr%     second (always even, due to DOS storage techniques)
  2598.  
  2599. Name  : GetKbd               (Get Keyboard toggles)
  2600. Class : Input
  2601. Level : Clone
  2602.  
  2603. The GetKbd routine allows you to get the state of the four
  2604. keyboard toggles: Insert, Caps lock, Num lock, and Scroll Lock.
  2605.  
  2606.    CALL GetKbd (Insert%, Caps%, Num%, Scrl%)
  2607.  
  2608. -------
  2609. Insert%    whether "insert" mode is on (0 if no)
  2610. Caps%      whether "caps lock" is on (0 if no)
  2611. Num%       whether "num lock" is on (0 if no)
  2612. Scrl%      whether "scroll lock" is on (0 if no)
  2613.  
  2614. Name  : GetKbd1              (Get Keyboard Shifts)
  2615. Class : Input
  2616. Level : Clone
  2617.  
  2618. The GetKbd1 routine allows you to get the state of the four
  2619. keyboard shift keys: Left shift, Right shift, Control and Alt.
  2620.  
  2621.    CALL GetKbd1 (LShift%, RShift%, Control%, Alt%)
  2622.  
  2623. -------
  2624. LShift%    whether the left shift key is depressed (0 if no)
  2625. RShift%    whether the right shift key is depressed (0 if no)
  2626. Control%   whether a control key is depressed (0 if no)
  2627. Alt%       whether an alt key is depressed (0 if no)
  2628.  
  2629. Name  : GetKbd2              (Get Keyboard Shifts)
  2630. Class : Input
  2631. Level : AT BIOS
  2632.  
  2633. The GetKbd2 routine allows you to get the state of the six
  2634. keyboard shift keys on an "enhanced" keyboard: Left shift,
  2635. Right shift, Left Control, Right Control, Left Alt and Right
  2636. Alt.
  2637.  
  2638. Normally, the BIOS only lets you see one key at a time, which
  2639. can be a barrier when you need more input.  This is a
  2640. particular problem with action games and other real-time
  2641. applications which have complex input requirements. Due to the
  2642. special way the BIOS treats shift keys, GetKbd2 can tell if the
  2643. the various shift keys are pressed simultaneously, allowing
  2644. more flexibility.
  2645.  
  2646.    CALL GetKbd2 (LShift%, RShift%, LCtrl%, RCtrl%, LAlt%, _
  2647.       RAlt%)
  2648.  
  2649. -------
  2650. LShift%    whether the left shift key is depressed (0 if no)
  2651. RShift%    whether the right shift key is depressed (0 if no)
  2652. LCtrl%     whether the left control key is depressed (0 if no)
  2653. RCtrl%     whether the right control key is depressed (0 if no)
  2654. LAlt%      whether the left alt key is depressed (0 if no)
  2655. RAlt%      whether the right alt key is depressed (0 if no)
  2656.  
  2657. Name  : GetKey               (Get Key or mouse)
  2658. Class : Input, Mouse
  2659. Level : BIOS
  2660.  
  2661. This routine is kind of an extended version of INPUT$.  It
  2662. waits until a key is available at the keyboard and returns the
  2663. key pressed.  At your option, it can also return if a mouse
  2664. button is pressed.
  2665.  
  2666.    CALL GetKey (Mouse%, ASCIIcode%, ScanCode%, LButton%, _
  2667.       RButton%)
  2668.  
  2669. Mouse%        whether to check the mouse (0: no)
  2670. -------
  2671. ASCIIcode%    ASCII code of the key pressed
  2672. ScanCode%     scan code of the key pressed (0 if none)
  2673. LButton%   whether the left  mouse button was pressed
  2674. RButton%  whether the right mouse button was pressed
  2675.  
  2676. Name  : GetKey3              (Get Key or 3-button mouse)
  2677. Class : Input, Mouse
  2678. Level : BIOS
  2679.  
  2680. This routine is kind of an extended version of INPUT$.  It
  2681. waits until a key is available at the keyboard and returns the
  2682. key pressed.  At your option, it can also return if a mouse
  2683. button is pressed.
  2684.  
  2685.    CALL GetKey3 (Mouse%, ASCIIcode%, ScanCode%, LButton%, _
  2686.       MButton%, RButton%)
  2687.  
  2688. Mouse%        whether to check the mouse (0: no)
  2689. -------
  2690. ASCIIcode%    ASCII code of the key pressed
  2691. ScanCode%     scan code of the key pressed (0 if none)
  2692. LButton%      whether the left   mouse button is pressed
  2693. MButton%      whether the middle mouse button is pressed
  2694. RButton%      whether the right  mouse button is pressed
  2695.  
  2696. Name  : GetLabel             (Get disk volume Label)
  2697. Class : Disk
  2698. Level : DOS
  2699.  
  2700. This routine gets the volume label for a specified disk.
  2701.  
  2702.    Label$ = SPACE$(11)
  2703.    CALL GetLabel (Drive$, Label$, LabelLen%, ErrCode%)
  2704.    Label$ = LEFT$(Label$, LabelLen%)
  2705.  
  2706. Drive$     letter of the drive to examine
  2707. -------
  2708. Label$     volume label of disk.  Init to >= 11 chars.
  2709. LabelLen%  length of the volume label
  2710. ErrCode%   error code: 0 if no error, else DOS Error
  2711.  
  2712. Name  : GetLIMHandles        (Get L/I/M expanded mem Handles)
  2713. Class : Memory
  2714. Level : DOS
  2715.  
  2716. Early Lotus/Intel/Microsoft expanded memory revisions provided
  2717. a limited number of "handles" which could be used to access
  2718. expanded memory-- often as few as 15 or so.  If your program
  2719. uses expanded memory and the EMS driver is one of the older
  2720. versions, you may want to make sure that enough handles are
  2721. available.  This routine tells you how many handles are in use.
  2722.  
  2723. Note that this routine expects an EMS driver to be installed.
  2724. If you can't be sure of that, use GetLIMM first to avoid an
  2725. unpleasant surprise.
  2726.  
  2727.    CALL GetLIMHandles (Handles%)
  2728.  
  2729. -------
  2730. Handles%  number of EMS handles in use
  2731.  
  2732. Name  : GetLIMM              (Get L/I/M expanded Memory)
  2733. Class : Memory / Equipment
  2734. Level : DOS
  2735.  
  2736. This routine tells you how much expanded memory is installed.
  2737. If there is none, or if the EMS driver hasn't been installed,
  2738. it returns zeroes.  You should use this routine before any
  2739. other of the PBBack routines that access expanded memory,
  2740. since the other routines expect EMS to be available.
  2741.  
  2742. The results are returned in terms of EMS pages.  Each page is
  2743. 16 kilobytes.
  2744.  
  2745.    CALL GetLIMM (TotalPages%, FreePages%)
  2746.  
  2747. -------
  2748. TotalPages%  number of EMS pages installed
  2749. FreePages%   number of EMS pages available for use
  2750.  
  2751. Name  : GetLIMV              (Get L/I/M expanded mem Version)
  2752. Class : Memory / Equipment
  2753. Level : DOS
  2754.  
  2755. The GetLIMV routine tells you the version of EMS driver that is
  2756. being used. The version number is separated into major and
  2757. minor parts.  For example, an EMS 3.1 driver would return a
  2758. major number of 3 and minor number of 1.
  2759.  
  2760. Note that this routine expects an EMS driver to be installed.
  2761. If you can't be sure of that, use GetLIMM first to avoid an
  2762. unpleasant surprise.
  2763.  
  2764.    CALL GetLIMV (MajorVer%, MinorVer%)
  2765.  
  2766. -------
  2767. MajorVer%  major part of the EMS version number
  2768. MinorVer%  minor part of the EMS version number
  2769.  
  2770. Name  : GetLine              (Get Line of text)
  2771. Class : Display
  2772. Level : Any
  2773.  
  2774. This routine retrieves a row of text from a saved (or virtual)
  2775. screen.
  2776.  
  2777. You can use GetLine with a saved screen of any size.  The St$
  2778. parameter must be initialized to the width of the saved screen
  2779. (in columns).
  2780.  
  2781.    St$ = SPACE$(ScrWidth)
  2782.    CALL GetLine (DSeg%, DOfs%, Row%, St$, SLen%)
  2783.    St$ = LEFT$(St$, SLen%)
  2784.  
  2785. DSeg%      segment of saved screen
  2786. DOfs%      offset of saved screen
  2787. Row%       row of saved screen (starting at 1)
  2788. -------
  2789. St$        text at given row (init to width of saved screen)
  2790. SLen       logical length of text
  2791.  
  2792. Name  : GetMouseLoc          (Get Mouse Location)
  2793. Class : Mouse
  2794. Level : BIOS
  2795.  
  2796. This routine allows you to get the current location of the
  2797. mouse cursor.  It doesn't matter if the cursor is visible or
  2798. invisible.  GetMouseLoc is only for use in text mode.
  2799.  
  2800. This routine will not work properly if there is no mouse
  2801. available.  Use the MMCheck routine if you are not sure.
  2802.  
  2803. See also MMGetLoc, which returns the coordinates for graphics
  2804. mode.
  2805.  
  2806.    CALL GetMouseLoc (Row%, Column%)
  2807.  
  2808. -------
  2809. Row%       mouse cursor row
  2810. Column%    mouse cursor column
  2811.  
  2812. Name  : GetMouseVer          (Get Mouse driver Version)
  2813. Class : Mouse
  2814. Level : BIOS
  2815.  
  2816. This routine retrieves various information about the mouse,
  2817. including the driver version number, mouse type, and IRQ used
  2818. by the mouse.
  2819.  
  2820. Note that this is among the mouse routines that makes you
  2821. wonder what Microsoft was thinking when they designed the mouse
  2822. driver.  The mouse driver has no provision for error codes and
  2823. the "get version" function was added comparatively recently, so
  2824. there is no way of knowing with certainty whether this routine
  2825. worked or what the mouse driver version is.  If that could be a
  2826. problem, you can reduce the risk by checking the returned
  2827. values to make sure they appear reasonable.
  2828.  
  2829. This routine will not work properly if there is no mouse
  2830. available.  Use the MMCheck routine if you are not sure.
  2831.  
  2832. The mouse type may be any of the following:
  2833.    1   bus mouse
  2834.    2   serial mouse
  2835.    3   InPort mouse
  2836.    4   PS/2 mouse
  2837.    5   Hewlett-Packard mouse
  2838.  
  2839. The IRQ will be 0 on the PS/2.  Otherwise, it will be 2-5 or 7
  2840. on Microsoft mice.  A mouse designed to take advantage of the
  2841. AT interrupt controller may use higher IRQs (to perhaps 15, I'm
  2842. not sure), so be generous if you do range checking here.
  2843.  
  2844. The version number is divided into two parts.  For instance,
  2845. mouse driver 8.20 would return a major version number of 8 and
  2846. a minor version number of 20.
  2847.  
  2848.    CALL GetMouseVer (MajorV%, MinorV%, MType%, IRQ%)
  2849.  
  2850. -------
  2851. MajorV%    mouse driver major version number
  2852. MinorV%    mouse driver minor version number
  2853. MType%     mouse type
  2854. IRQ%       IRQ used by mouse
  2855.  
  2856. Name  : GetNameF             (Get Name of File)
  2857. Class : Disk
  2858. Level : DOS
  2859.  
  2860. The GetNameF routine returns the name of a file matched by
  2861. FindFirstF or FindNextF.  The name will not contain a drive or
  2862. subdirectory specification.
  2863.  
  2864. Routines in this series include:
  2865.    FindFirstF, FindNextF, GetNameF, GetAttrF, GetDateF,
  2866.    GetTimeF
  2867.  
  2868.    FileName$ = SPACE$(12)
  2869.    CALL GetNameF (FileName$, NameLen%)
  2870.    FileName$ = LEFT$(FileName$, NameLen%)
  2871.  
  2872. -------
  2873. FileName$   file name (init to at least 12 characters)
  2874. NameLen%    length of file name
  2875.  
  2876. Name  : GetPrtAddr           (Get Printer Address)
  2877. Class : Printer
  2878. Level : Clone
  2879.  
  2880. This routine allows you to determine the base port address of a
  2881. parallel port.  You tell it the LPT port number (1-4) and it
  2882. returns the port address. If there is no port installed, zero
  2883. will be returned.
  2884.  
  2885. Note that up to four printer ports are (theoretically)
  2886. supported on most machines.  On PS/2 computers, only three
  2887. ports are allowed, and the fourth port data area is used for
  2888. other purposes.  So, it would probably be a good idea to
  2889. restrict your program to ports 1-3.
  2890.  
  2891. Aside from purely informational purposes, this routine can be
  2892. useful in conjunction with SetPrtAddr in manipulating the
  2893. parallel ports.
  2894.  
  2895.    CALL GetPrtAddr (PortNr%, PortAddr%)
  2896.  
  2897. PortNr%     LPT port number (1-4 or 1-3 [see above])
  2898. -------
  2899. PortAddr%   port address
  2900.  
  2901. Name  : GetRows              (Get Rows on screen)
  2902. Class : Display
  2903. Level : Clone
  2904.  
  2905. This routine tells you how many rows are on the display.  This
  2906. is normally 25, but it may be greater on an EGA or VGA.  Only
  2907. text modes are supported.
  2908.  
  2909.    CALL GetRows (Rows%)
  2910.  
  2911. -------
  2912. Rows%    text rows on the display
  2913.  
  2914. Name  : GetScreen            (Get Screen)
  2915. Class : Display
  2916. Level : Clone
  2917.  
  2918. This routine saves any portion of the display to an array.
  2919. Only text modes are supported.  If your program uses multiple
  2920. display pages, you can get an image from any of those pages.  A
  2921. special "slow" mode is supported for the CGA, to prevent
  2922. flickering (a problem only with some CGAs).
  2923.  
  2924. The size of the integer array needed to store a specific area
  2925. of the screen can be calculated using the CalcSize routine
  2926. (see).
  2927.  
  2928. If you wish to save the entire screen, you may find ScrSave
  2929. easier (see).
  2930.  
  2931.    CALL GetScreen (Array%(), TRow%, LCol%, BRow%, RCol%, _
  2932.       Page%, Fast%)
  2933.  
  2934. TRow%      top row of the desired screen area
  2935. LCol%      left column of the desired screen area
  2936. BRow%      bottom row of the desired screen area
  2937. RCol%      right column of the desired screen area
  2938. Page%      page from which to get the display area
  2939. Fast%      whether to use fast mode (0 no)
  2940. -------
  2941. Array%()   stored image of the selected area of the screen
  2942.  
  2943. Name  : GetSub               (Get default Subdirectory)
  2944. Class : Disk
  2945. Level : DOS
  2946.  
  2947. The GetSub routine gets the current subdirectory on the default
  2948. drive.  It does not put a backslash at the start of the
  2949. subdirectory, so you should add this yourself.
  2950.  
  2951. See also GetSub1, which is a more advanced version of this
  2952. routine.
  2953.  
  2954.    SubDir$ = SPACE$(64)
  2955.    CALL GetSub (SubDir$, SubLen%)
  2956.    SubDir$ = "\" + LEFT$(SubDir$, SubLen%)
  2957.  
  2958. -------
  2959. SubDir$    name of the current subdirectory. Init to 64+ chars
  2960. SubLen%    length of the subdirectory name
  2961.  
  2962. Name  : GetSub1              (Get default Subdirectory)
  2963. Class : Disk
  2964. Level : DOS
  2965.  
  2966. The GetSub1 routine gets the current subdirectory on a
  2967. specified drive. Unlike GetSub, it places a backslash at the
  2968. start of the name.  It also returns an error code, which allows
  2969. you to see if there was a disk error.
  2970.  
  2971.    SubDir$ = SPACE$(65)
  2972.    CALL GetSub1 (Drive$, SubDir$, SubLen%, ErrCode%)
  2973.    SubDir$ = LEFT$(SubDir$, SubLen%)
  2974.  
  2975. Drive$     letter of the drive to check
  2976. -------
  2977. SubDir$    name of the current subdirectory. Init to 65+ chars
  2978. SubLen%    length of the subdirectory name
  2979. ErrCode%   error code: 0 if no error, else DOS Error
  2980.  
  2981. Name  : GetSwitch            (Get Switch character)
  2982. Class : Miscellaneous
  2983. Level : DOS
  2984.  
  2985. An undocumented capability in many DOS versions allows you to
  2986. set the DOS "switch character", which is the delimiter used to
  2987. identify a switch on the DOS command line.  This is normally a
  2988. slash, as in "DIR /W".  However, many people prefer to change
  2989. it to a "-", which is the switch character used by Unix.
  2990.  
  2991. With the normal "/" delimiter, a backslash "\" is used in
  2992. subdirectory specifications.  DOS itself will recognize either
  2993. one as a subdirectory delimiter, but the command line won't
  2994. unless the switch char was changed.
  2995.  
  2996. The upshot of all this is, whereas you might normally use a
  2997. command like:
  2998.    DIR /W C:\GAMES
  2999.  
  3000. Someone with a different switch character might use something
  3001. like this:
  3002.    DIR -W C:/GAMES
  3003.  
  3004. This is exactly the sort of syntax that Unix commands use.
  3005.  
  3006. If you design your program to recognize the different
  3007. delimiters, you will make some people very happy!  The
  3008. GetSwitch routine will detect changed delimiters on those
  3009. versions of DOS which support it, and will return an ordinary
  3010. "/" on those versions of DOS which don't.
  3011.  
  3012.    Switch$ = "x"
  3013.    CALL GetSwitch (Switch$)
  3014.  
  3015. -------
  3016. Switch$    the DOS switch character.  Init to one character.
  3017.  
  3018. Name  : GetTime              (Get Time)
  3019. Class : Time
  3020. Level : DOS
  3021.  
  3022. This routine tells you the time according to DOS.
  3023.  
  3024. The main difference between getting the time from BASIC and
  3025. getting it from DOS is the "hundredths of seconds" value.
  3026. However, this value is not available on some machines, in which
  3027. case it will be set to zero.  It is not accurate on most
  3028. machines, being calculated instead using a semi-random
  3029. approach; it is more of a novelty than a useful value.
  3030.  
  3031.    CALL GetTime (HourNr%, MinuteNr%, SecondNr%, Hundredth%)
  3032.  
  3033. -------
  3034. HourNr%      hour (0-23)
  3035. MinuteNr%    minute
  3036. SecondNr%    second
  3037. Hundredth%   hundredth of a second.  See remarks, above.
  3038.  
  3039. Name  : GetTimeAT            (Get Time from AT clock)
  3040. Class : Time
  3041. Level : BIOS (AT)
  3042.  
  3043. This routine gets the time from the hardware real-time clock in
  3044. AT-class computers.  Depending on the DOS version, this time
  3045. may be partially or completely independent of the time kept by
  3046. DOS in software.  DOS always reads the time from the hardware
  3047. clock when it starts up.  However, use of the TIME command in
  3048. DOS (and the TIME$ function in QuickBASIC) may relate only to
  3049. the software copy of the time, which is not always guaranteed
  3050. to be the same as the time in the hardware clock due to certain
  3051. discrepancies in DOS.
  3052.  
  3053.    CALL GetTimeAT (HourNr%, MinuteNr%, SecondNr%, ErrCode%)
  3054.  
  3055. -------
  3056. HourNr%      hour (0-23)
  3057. MinuteNr%    minute
  3058. SecondNr%    second
  3059. ErrCode%     error code: 0 if no error, else clock has stopped
  3060.  
  3061. Name  : GetTimeF             (Get Time of File)
  3062. Class : Disk / Time
  3063. Level : DOS
  3064.  
  3065. The GetTimeF routine returns the time of a file matched by
  3066. FindFirstF or FindNextF.
  3067.  
  3068. Routines in this series include:
  3069.    FindFirstF, FindNextF, GetNameF, GetAttrF, GetDateF,
  3070.    GetTimeF
  3071.  
  3072.    CALL GetTimeF (HourNr%, MinuteNr%, SecondNr%)
  3073.  
  3074. -------
  3075. HourNr%     hour
  3076. MinuteNr%   minute
  3077. SecondNr%   second
  3078.  
  3079. Name  : GetTView             (Get TopView)
  3080. Class : Miscellaneous
  3081. Level : BIOS
  3082.  
  3083. This routine tells you whether TopView or a compatible
  3084. multitasker (such as TaskView or DESQview) is loaded.
  3085.  
  3086. See also GetDView, GetTVScreen, UpdTVScreen.
  3087.  
  3088.    CALL GetTView (Installed%)
  3089.  
  3090. -------
  3091. Installed%   whether a TopView-type multitasker is loaded
  3092.  
  3093. Name  : GetTVScreen          (Get TopView Screen address)
  3094. Class : Display / Miscellaneous
  3095. Level : BIOS
  3096.  
  3097. GetTVScreen returns the address of the screen buffer used by a
  3098. TopView-type multitasker.  This allows you to use direct screen
  3099. access while remaining within the windows allocated to your
  3100. program by the multitasker.
  3101.  
  3102. You must tell the multitasker the address of the screen you
  3103. would be writing to if the multitasker was not installed.
  3104. Specify a segment of &HB000 if using an MDA or Hercules, or a
  3105. segment of &HB800 for CGA, EGA, MCGA or VGA. The offset should
  3106. always be 0.  This is for use in text modes.
  3107.  
  3108. The routine will return with the new segment and offset for you
  3109. to use. These values can be used with any PBBack screen routine
  3110. that accepts a segment and offset-- DQPrint and DXQPrint, for
  3111. example.
  3112.  
  3113. Note that not all TopView-compatible multitaskers will
  3114. automatically update the screen from the buffer.  The
  3115. UpdTVScreen routine allows you to force a screen update.
  3116.  
  3117. See also GetDView, GetTView, UpdTVScreen.
  3118.  
  3119.    CALL GetTVScreen (DSeg%, DOfs%)
  3120.  
  3121. DSeg%       segment of desired screen
  3122. DOfs%       offset of desired screen
  3123. -------
  3124. DSeg%       segment of screen buffer
  3125. DOfs%       offset of screen buffer
  3126.  
  3127. Name  : GetValidKey          (Get Valid Key)
  3128. Class : Input
  3129. Level : DOS
  3130.  
  3131. This one is useful for getting one of a list of keys from the
  3132. keyboard.  You give it a list of keys (letters should be
  3133. uppercase) to accept.  It will wait until one of the listed
  3134. keys is pressed; for letters, it will accept either lowercase
  3135. or uppercase keys, but will convert the letter to uppercase
  3136. before it returns to you.  If you pass it a blank list, it will
  3137. accept any key.
  3138.  
  3139. This routine is handy for when you want to allow one of a list
  3140. of choices from a menu, for instance.
  3141.  
  3142.    CALL GetValidKey (GoodList$, Result$)
  3143.  
  3144. GoodList$    list of acceptable keys.  See above for remarks.
  3145. -------
  3146. Result$      the key that was accepted (uppercase if letter)
  3147.  
  3148. Name  : GetVerify            (Get Verify setting)
  3149. Class : Disk
  3150. Level : DOS
  3151.  
  3152. The GetVerify routine tells you the state of the DOS VERIFY
  3153. flag.  When VERIFY is on, some checking is done to make sure
  3154. that writing to the disk works as requested.  The checks are
  3155. not very good, however, and VERIFY slows down disk handling, so
  3156. it is usually better to have VERIFY off.
  3157.  
  3158. You can change the state of VERIFY by using the DOS VERIFY
  3159. command or with the SetVerify routine in PBBack.
  3160.  
  3161.    CALL GetVerify (VerifyOn%)
  3162.  
  3163. -------
  3164. VerifyOn%   whether VERIFY is on (0 if no)
  3165.  
  3166. Name  : GetVGA               (Get VGA information)
  3167. Class : Display / Equipment
  3168. Level : BIOS
  3169.  
  3170. This routine tells you whether a VGA is available.
  3171.  
  3172. See also GetCRT, GetEGA and GetHGA.
  3173.  
  3174.    CALL GetVGA (IsVGA%)
  3175.  
  3176. -------
  3177. IsVGA%    whether a VGA is installed (0 if no)
  3178.  
  3179. Name  : GetVGAColor          (Get VGA Color)
  3180. Class : Display
  3181. Level : BIOS
  3182.  
  3183. This routine gets the components of a single VGA palette color.
  3184. It returns the color value associated with a given color number.
  3185.  
  3186. If you are dealing with more than one color at a time, you may
  3187. find GetVGAPalette more appropriate.
  3188.  
  3189.    CALL GetVGAColor (ColorNr%, Red%, Green%, Blue%)
  3190.  
  3191. ColorNr%   color number (1-16 or 1-255, depending on VGA mode)
  3192. -------
  3193. Red%       red intensity (0-63)
  3194. Green%     green intensity (0-63)
  3195. Blue%      blue intensity (0-63)
  3196.  
  3197. Name  : GetVidMode           (Get Video Mode)
  3198. Class : Display
  3199. Level : BIOS
  3200.  
  3201. The GetVidMode routine tells you about the current display
  3202. status from the BIOS' point of view.  Note that the BIOS
  3203. display mode is not the same as the BASIC SCREEN mode (a direct
  3204. translation between the two is messy, because BASIC
  3205. conglomerates several BIOS modes into a single SCREEN mode in
  3206. several instances).
  3207.  
  3208.    CALL GetVidMode (BIOSMode%, ScreenWidth%, ActivePage%)
  3209.  
  3210. -------
  3211. BIOSMode%     BIOS video mode
  3212. ScreenWidth%  number of columns per row
  3213. ActivePage%   active (visible) display page
  3214.  
  3215. Name  : GLoad                (Graphics Load)
  3216. Class : Disk
  3217. Level : DOS
  3218.  
  3219. A replacement for the BASIC BLOAD statement, this routine loads
  3220. a binary memory image from a file into the area of memory it
  3221. formerly occupied.  This is most often used to restore a screen
  3222. display from a file, although PBBack offers more flexible
  3223. alternatives.
  3224.  
  3225.    CALL GLoad (FileName$)
  3226.  
  3227. FileName$    name of the file to load into memory
  3228.  
  3229. Name  : GQPrint              (Graphics Quick Print)
  3230. Class : Display
  3231. Level : Clone
  3232.  
  3233. This is a simple high-speed replacement for the PRINT statement
  3234. which works in CGA graphics mode (SCREEN 2).  It does not
  3235. interpret control codes, support graphics characters (ASCII
  3236. 128-255), or update the cursor position, in return for which it
  3237. is much faster than PRINT.
  3238.  
  3239. The Fast% parameter is ignored at the moment-- top speed is
  3240. always used, which may cause flickering on some CGAs.
  3241.  
  3242.    CALL GQPrint (St$, Row%, Column%, Fast%)
  3243.  
  3244. St$      string to display
  3245. Row%     row (1-25)
  3246. Column%  column (1-80)
  3247. Fast%    not used
  3248.  
  3249. Name  : GrafRest             (Graphics Restore)
  3250. Class : Display
  3251. Level : Clone
  3252.  
  3253. This routine allows you to restore a SCREEN 1 (CGA, 320x200, 4
  3254. color) or SCREEN 2 (CGA, 640x200, 2 color) display that was
  3255. saved using GrafSave (see).
  3256.  
  3257.    CALL GrafRest (DSeg%, DOfs%)
  3258.  
  3259. DSeg%      segment of storage array
  3260. DOfs%      offset  of storage array
  3261.  
  3262. Name  : GrafSave             (Graphics Save)
  3263. Class : Display
  3264. Level : Clone
  3265.  
  3266. This routine allows you to save a SCREEN 1 (CGA, 320x200, 4
  3267. color) or SCREEN 2 (CGA, 640x200, 2 color) display that can be
  3268. restored using GrafRest (see).
  3269.  
  3270. The array used to hold the screen must contain 16,000 bytes.
  3271. For an integer array, this means that you must create the array
  3272. by DIM Array%(1 TO 8000).
  3273.  
  3274.    CALL GrafSave (DSeg%, DOfs%)
  3275.  
  3276. DSeg%      segment of storage array
  3277. DOfs%      offset  of storage array
  3278.  
  3279. Name  : GXQPrint             (Graphics Extended Quick Print)
  3280. Class : Display
  3281. Level : Clone
  3282.  
  3283. This is a simple high-speed replacement for the PRINT statement
  3284. which works in CGA graphics mode (SCREEN 1).  It does not
  3285. interpret control codes, support graphics characters (ASCII
  3286. 128-255), or update the cursor position, in return for which it
  3287. is much faster than PRINT.
  3288.  
  3289. This routine can also be used in SCREEN 2, where it will
  3290. display the string in shades instead of in color (using 40
  3291. columns/row).
  3292.  
  3293. The Fast% parameter is ignored at the moment-- top speed is
  3294. always used, which may cause flickering on some CGAs.
  3295.  
  3296.    CALL GXQPrint (St$, Row%, Column%, Fore%, Fast%)
  3297.  
  3298. St$      string to display
  3299. Row%     row (1-25)
  3300. Column%  column (1-40)
  3301. Fore%    foreground color (0-3)
  3302. Fast%    not used
  3303.  
  3304. Name  : GXQPrint1            (Graphics Extended Quick Print)
  3305. Class : Display
  3306. Level : Clone
  3307.  
  3308. This is a high-speed replacement for the PRINT statement which
  3309. works in CGA graphics mode (SCREEN 1).  It does not interpret
  3310. control codes or update the cursor position, in return for
  3311. which it is much faster than PRINT.
  3312.  
  3313. This routine can also be used in SCREEN 2, where it will
  3314. display the string in shades instead of in color (using 40
  3315. columns/row).
  3316.  
  3317. The Fast% parameter is ignored at the moment-- top speed is
  3318. always used, which may cause flickering on some CGAs.
  3319.  
  3320.    CALL GXQPrint1 (St$, Row%, Column%, Fore%, Back%, Fast%)
  3321.  
  3322. St$      string to display
  3323. Row%     row (1-25)
  3324. Column%  column (1-40)
  3325. Fore%    foreground color (0-3)
  3326. Back%    background color (0-3)
  3327. Fast%    not used
  3328.  
  3329. Name  : HandleInfo           (Handle Information)
  3330. Class : Miscellaneous
  3331. Level : DOS
  3332.  
  3333. HandleInfo tells you whether a file handle refers to a file or
  3334. to a device. If the handle does not exist, an error code will
  3335. be returned.
  3336.  
  3337. This is for file handles as returned by FOpen1 and FCreate. It
  3338. can also be used with file numbers associated with OPEN, via a
  3339. BASIC function that was introduced with QuickBASIC 4.0:
  3340.  
  3341.    Handle% = FILEATTR(FileNumber%, 2)
  3342.  
  3343. See FClose1 for a list of predefined handles.
  3344.  
  3345.    CALL HandleInfo (Handle%, Device%, ErrCode%)
  3346.  
  3347. Handle%    file handle
  3348. -------
  3349. Device%    whether the handle refers to a device (0 no)
  3350. ErrCode%   whether there was an error (0 no)
  3351.  
  3352. Name  : HCls                 (Hercules CLS)
  3353. Class : Display
  3354. Level : Clone
  3355.  
  3356. This routine clears a Hercules graphics screen to the specified
  3357. color.
  3358.  
  3359. Routines in this series are:
  3360.    HCls, HLine, HMode, HPrint, HSetPixel
  3361.  
  3362.    CALL HCls (Colour%)
  3363.  
  3364. Colour%    color (0-1)
  3365.  
  3366. Name  : HiLite               (Highlight)
  3367. Class : Display
  3368. Level : Clone
  3369.  
  3370. This routine allows you to highlight text on the screen.  It
  3371. works in text modes only and always displays to the visible
  3372. screen page.
  3373.  
  3374. See also ReColorArea, which lets you highlight any rectangular
  3375. area of the screen.
  3376.  
  3377.    CALL HiLite (Row%, LCol%, RCol%, VAttr%)
  3378.  
  3379. Row%       row on which to highlight
  3380. LCol%      left column (where highlight starts)
  3381. RCol%      right column (where highlight ends)
  3382. VAttr%     new color (see CalcAttr)
  3383.  
  3384. Name  : HLine                (Hercules LINE)
  3385. Class : Display
  3386. Level : Clone
  3387.  
  3388. This routine draws a line on a Hercules graphics screen.
  3389.  
  3390. Routines in this series are:
  3391.    HCls, HLine, HMode, HPrint, HSetPixel
  3392.  
  3393.    CALL HLine (X1%, Y1%, X2%, Y2%, Colour%)
  3394.  
  3395. X1%        starting graphics column (0-719)
  3396. Y1%        starting graphics row (0-347)
  3397. X2%        ending graphics column (0-719)
  3398. Y2%        ending graphics row (0-347)
  3399. Colour%    color (0-1)
  3400.  
  3401. Name  : HMode                (Hercules Mode)
  3402. Class : Display
  3403. Level : Clone
  3404.  
  3405. This routine switches between text mode and Hercules graphics
  3406. mode.  Use HInit first to initialize the graphics mode
  3407. appropriately.
  3408.  
  3409. HMode will clear page 0 when graphics mode is entered.  Page 1,
  3410. if it exists, is not cleared.  PBBack does not support page 1
  3411. in any respect.
  3412.  
  3413. Routines in this series are:
  3414.    HCls, HLine, HMode, HPrint, HSetPixel
  3415.  
  3416.    CALL HMode (Graphics%)
  3417.  
  3418. Graphics%    display mode to set (0 text, else graphics)
  3419.  
  3420. Name  : HPrint               (Hercules Print)
  3421. Class : Display
  3422. Level : Clone
  3423.  
  3424. This routine displays text in Hercules graphics mode.   It uses
  3425. the full resolution of the screen, so text is 90 columns by 43
  3426. rows.  This gives you more space than even the largest EGA text
  3427. mode, which is only 80x43.
  3428.  
  3429. Routines in this series are:
  3430.    HCls, HLine, HMode, HPrint, HSetPixel
  3431.  
  3432.    CALL HPrint (St$, Row%, Column%)
  3433.  
  3434. St$        text to display
  3435. Row%       row (1-43)
  3436. Column%    column (1-90)
  3437.  
  3438. Name  : HSetPixel            (Hercules Set Pixel)
  3439. Class : Display
  3440. Level : Clone
  3441.  
  3442. This routine draws a dot on a Hercules graphics screen.
  3443.  
  3444. Routines in this series are:
  3445.    HCls, HLine, HMode, HPrint, HSetPixel
  3446.  
  3447.    CALL HSetPixel (X%, Y%, Colour%)
  3448.  
  3449. X%         graphics column (0-719)
  3450. Y%         graphics row (0-347)
  3451. Colour%    color (0-1)
  3452.  
  3453. Name  : InitPtr              (Initialize Pointers)
  3454. Class : Array management
  3455. Level : Any
  3456.  
  3457. This routine initializes an array of pointers for use with the
  3458. pointer sort routines (PSortD, et al).  It may also be useful
  3459. for other purposes.  Each element of the array is set equal to
  3460. its index (the first element is set to 1, the second to 2, and
  3461. so forth).  Arrays are expected to begin at element 1.  You may
  3462. specify the last element to initialize, allowing you to use
  3463. only part of an array.
  3464.  
  3465.    CALL InitPtr (Ptr%(), Elements%)
  3466.  
  3467. Ptr%()      array to initialize
  3468. Elements%   number of elements to initialize
  3469. -------
  3470. Ptr%()      initialized array
  3471.  
  3472. Name  : InsChr               (Insert Character)
  3473. Class : Display
  3474. Level : Clone
  3475.  
  3476. The InsChr routine inserts a space at the specified screen
  3477. location.
  3478.  
  3479.    InsChr Row%, Column%
  3480.  
  3481. Row%      row of character
  3482. Column%   column of character
  3483.  
  3484. Name  : InsLine              (Insert Line)
  3485. Class : Display
  3486. Level : BIOS
  3487.  
  3488. This routine inserts a blank line at the specified row of the
  3489. screen.
  3490.  
  3491.    CALL InsLine (Row%, VAttr%)
  3492.  
  3493. Row%      row to insert
  3494. VAttr%    color/attribute to use on new row (see CalcAttr)
  3495.  
  3496. Name  : Int2Date             (Integer to Date)
  3497. Class : Time
  3498. Level : Any
  3499.  
  3500. This routine undoes the results of the Date2Int routine.  It
  3501. expands a single integer into month, day, and year values.
  3502.  
  3503. The storage format is identical to that used by DOS for file
  3504. dates, by the way, so this routine makes an apt companion for
  3505. LoadDirFull.
  3506.  
  3507.    CALL Int2Date (MonthNr%, DayNr%, YearNr%, IntDate%)
  3508.  
  3509. IntDate%     date compressed into an integer
  3510. -------
  3511. MonthNr%     month number (1-12)
  3512. DayNr%       day (1-31)
  3513. YearNr%      year (1980-2079; see above for two-digit years)
  3514.  
  3515. Name  : Int2Time             (Integer to Time)
  3516. Class : Time
  3517. Level : Any
  3518.  
  3519. This routine undoes the results of the Time2Int routine.  It
  3520. expands a single integer into hour, minute, and second values.
  3521.  
  3522. Note that the seconds will always be even, due to the storage
  3523. format.  The storage format is identical to that used by DOS
  3524. for file times, by the way, so this routine makes an apt
  3525. companion for LoadDirFull.
  3526.  
  3527.    CALL Int2Time (HourNr%, MinuteNr%, SecondNr%, IntTime%)
  3528.  
  3529. IntTime%     time compressed into an integer
  3530. -------
  3531. HourNr%      hour (0-23)
  3532. MinuteNr%    minute
  3533. SecondNr%    second
  3534.  
  3535. Name  : IntVector            (Interrupt Vector)
  3536. Class : Miscellaneous
  3537. Level : DOS
  3538.  
  3539. The IntVector routine retrieves the address of a specified
  3540. interrupt handler. If there is no interrupt handler, the
  3541. results will normally be zero, although early DOS versions did
  3542. not always have the sense to initialize unused vectors that way.
  3543.  
  3544.    CALL IntVector (DSeg%, DOfs%, Interrupt%)
  3545.  
  3546. Interrupt%   interrupt number to examine
  3547. -------
  3548. DSeg%        segment of the interrupt handler
  3549. DOfs%        offset of the interrupt handler
  3550.  
  3551. Name  : IRead                (Integer Read)
  3552. Class : Disk
  3553. Level : DOS
  3554.  
  3555. This routine reads an integer (two binary bytes) from a file.
  3556.  
  3557. The file must have been opened using FCreate or FOpen1.
  3558.  
  3559.    CALL IRead (Handle%, Value%, ErrCode%)
  3560.  
  3561. Handle%    file handle
  3562. -------
  3563. Value%     integer read from file
  3564. ErrCode%   DOS error code (0 if no error)
  3565.  
  3566. Name  : IWrite               (Integer Write)
  3567. Class : Disk
  3568. Level : DOS
  3569.  
  3570. This routine writes an integer (two binary bytes) to a file.
  3571.  
  3572. The file must have been opened using FCreate or FOpen1.
  3573.  
  3574.    CALL IWrite (Handle%, Value%, ErrCode%)
  3575.  
  3576. Handle%    file handle
  3577. Value%     integer to write to file
  3578. -------
  3579. ErrCode%   DOS error code (0 if no error)
  3580.  
  3581. Name  : KbdType              (Keyboard Type)
  3582. Class : Input / Equipment
  3583. Level : Clone
  3584.  
  3585. This routine tells you if an enhanced (101-key) keyboard is
  3586. available.
  3587.  
  3588. If KbdType is not entirely sure that an enhanced keyboard is
  3589. available, it plays safe and assumes there isn't one.  This
  3590. avoids possible disaster on older PCs.
  3591.  
  3592.    CALL KbdType (Enhanced%)
  3593.  
  3594. -------
  3595. Enhanced%    whether keyboard is of the enhanced type (0 no)
  3596.  
  3597. Name  : KeyPress             (detect Key Press)
  3598. Class : Input
  3599. Level : DOS
  3600.  
  3601. This routine works like the Turbo/Power BASIC function INSTAT.
  3602. It tells you whether there is a key waiting to be processed.
  3603.  
  3604.    CALL KeyPress (KeyHit%)
  3605.  
  3606. -------
  3607. KeyHit%   whether a key is waiting (0 if no)
  3608.  
  3609. Name  : LClose               (L/I/M Close)
  3610. Class : Memory
  3611. Level : BIOS
  3612.  
  3613. This routine closes a block of expanded memory that was opened
  3614. for access by LOpen.  It is important to close the block when
  3615. you are finished with it, to return it to the free memory pool.
  3616.  
  3617. Routines in this suite include: LOpen, LGet, LPut, LClose.
  3618.  
  3619.    CALL LClose (EMSHandle%)
  3620.  
  3621. EMSHandle%    handle of the expanded memory block
  3622.  
  3623. Name  : LGet                 (L/I/M Get)
  3624. Class : Memory
  3625. Level : BIOS
  3626.  
  3627. This routine gets a block of data from expanded memory that was
  3628. opened for access by LOpen.  The amount of data is specified in
  3629. words; one word is the same as two bytes.  An integer takes up
  3630. a word, single precision numbers require two words, and double
  3631. precision numbers take four.
  3632.  
  3633. Routines in this suite include: LOpen, LGet, LPut, LClose.
  3634.  
  3635.    CALL LGet (EMSHandle%, DSeg%, DOfs%, Words%)
  3636.  
  3637. EMSHandle%    handle of the expanded memory block
  3638. DSeg%         segment of place to store data
  3639. DOfs%         offset of place to store data
  3640. Words%        words to get from expanded memory
  3641.  
  3642. Name  : LoadDir              (Load Directory)
  3643. Class : Disk
  3644. Level : DOS
  3645.  
  3646. Given a filespec with wildcards and a file attribute, this
  3647. routine loads a list of all matching files into an array.  The
  3648. array must be of fixed-length string type, with 12 characters
  3649. for each filename.  You can find out how large to DIM the array
  3650. by using the FileCount routine.
  3651.  
  3652. The attribute can be any of the usual file attributes:
  3653.    1   Read-Only
  3654.    2   Hidden
  3655.    4   System
  3656.   16   Directory
  3657.  
  3658. You can combine attributes by adding their values.  For
  3659. instance, to search for hidden directories, you'd use an
  3660. attribute of 18.  By default, DOS returns normal files as well
  3661. as files which have the specified attributes, so an attribute
  3662. of 18 would get you normal files, hidden files, directories,
  3663. and hidden directories.  However, LoadDir can be made to screen
  3664. out unwanted files-- just negate the attribute to force only
  3665. files of that attribute to be counted.  For example, an
  3666. attribute of -18 would return only hidden subdirectories.
  3667.  
  3668. NOTE:  we use FilAttr%, not FileAttr%, because BASIC has an
  3669. internal function named FILEATTR in some versions.
  3670.  
  3671.    CALL LoadDir (FileSpec$, FilAttr%, DSeg%, DOfs%, ErrCode%)
  3672.  
  3673. FileSpec$    search file specification (may contain wildcards)
  3674. FilAttr%     search file attribute
  3675. DSeg%        segment of array
  3676. DOfs%        offset of array
  3677. -------
  3678. ErrCode%     error code (0 if no error)
  3679.  
  3680. Name  : Locase               (Lowercase)
  3681. Class : String
  3682. Level : Any
  3683.  
  3684. This routine, like BASIC's LCASE$ function, converts a string
  3685. to lowercase. Since it doesn't have to create a new return
  3686. string (a fairly slow process), it's faster than the BASIC
  3687. equivalent.  Also, older versions of BASIC do not always
  3688. provide the LCASE$ function.
  3689.  
  3690. See also Locase1.
  3691.  
  3692.    CALL Locase (St$)
  3693.  
  3694. St$     string to be put into lowercase
  3695. -------
  3696. St$     lowercase string
  3697.  
  3698. Name  : Locase1              (Lowercase)
  3699. Class : String
  3700. Level : Any
  3701.  
  3702. This routine, like BASIC's LCASE$ function (in some versions),
  3703. converts a string to lowercase. It converts letters in the
  3704. extended character set as well as the usual letters, making it
  3705. well suited for text which may not be in English.
  3706.  
  3707. Note that DOS 5.0 and later versions provide National Language
  3708. Support which includes conversion to uppercase (not lowercase,
  3709. unfortunately).  So, if you merely need the characters in a
  3710. known state, rather than lowercase, you would do better to use
  3711. the Upcase1 routine.  Locase1 assumes the U.S. character set,
  3712. which may well not be appropriate.
  3713.  
  3714. See also Locase.
  3715.  
  3716.    CALL Locase1 (St$)
  3717.  
  3718. St$     string to be put into lowercase
  3719. -------
  3720. St$     lowercase string
  3721.  
  3722. Name  : LOpen                (L/I/M Open)
  3723. Class : Memory
  3724. Level : BIOS
  3725.  
  3726. This routine opens a block of expanded memory for access.  The
  3727. size of the block is specified in words; one word is the same
  3728. as two bytes.  An integer takes up a word, single precision
  3729. numbers require two words, and double precision numbers take
  3730. four.  This allows you to store up to 64K in each EMS block
  3731. that you open.
  3732.  
  3733. Note that LOpen expects an EMS driver to be available.  If you
  3734. are not certain on this point, use GetLIMM beforehand to make
  3735. sure.
  3736.  
  3737. Routines in this suite include: LOpen, LGet, LPut, LClose.
  3738.  
  3739.    CALL LOpen (Words%, EMSHandle%, ErrCode%)
  3740.  
  3741. Words%        size of expanded memory block to allocate
  3742. -------
  3743. EMSHandle%    handle of the expanded memory block
  3744. ErrCode%      error code (0 if no error)
  3745.  
  3746. Name  : LPut                 (L/I/M Put)
  3747. Class : Memory
  3748. Level : BIOS
  3749.  
  3750. This routine puts a block of data into expanded memory that was
  3751. opened for access by LOpen.  The amount of data is specified in
  3752. words; one word is the same as two bytes.  An integer takes up
  3753. a word, single precision numbers require two words, and double
  3754. precision numbers take four.
  3755.  
  3756. Routines in this suite include: LOpen, LGet, LPut, LClose.
  3757.  
  3758.    CALL LPut (EMSHandle%, DSeg%, DOfs%, Words%)
  3759.  
  3760. EMSHandle%    handle of the expanded memory block
  3761. DSeg%         segment of place from which to get data
  3762. DOfs%         offset of place from which to get data
  3763. Words%        words to put into expanded memory
  3764.  
  3765. Name  : LRotate              (Left Rotate string)
  3766. Class : String
  3767. Level : Any
  3768.  
  3769. Many years ago, I wrote one of the first terminal programs for
  3770. the PC.  It died a horrible death when Qmodem came out...
  3771. sigh.  This routine comes from that experience.  It rotates the
  3772. characters in a string left once (e.g., "ABCDE" becomes
  3773. "BCDEA").  I used this in my routine to dial a list of BBSes,
  3774. skipping to the next one if the current one was busy.
  3775.  
  3776. LRotate can also be handy for things like scrolling a long
  3777. message across the screen (you just PRINT LEFT$(Message$, 80);
  3778. delay a bit, LRotate and do it again).
  3779.  
  3780. See also RRotate.
  3781.  
  3782.    CALL LRotate (St$)
  3783.  
  3784. St$     string to be rotated left once
  3785. -------
  3786. St$     string after being rotated left once
  3787.  
  3788. Name  : LScroll              (Left Scroll)
  3789. Class : Display
  3790. Level : Clone
  3791.  
  3792. This routine scrolls any selected part of the display left.
  3793. You may scroll as many times as you like, or scroll "zero"
  3794. times to totally clear the selected part of the display.
  3795.  
  3796.    CALL LScroll (TopRow%, LeftCol%, BottomRow%, RightCol%, _
  3797.       Times%)
  3798.  
  3799. TopRow%      top row of the area to scroll
  3800. LeftCol%     left column of the area to scroll
  3801. BottomRow%   top row of the area to scroll
  3802. RightCol%    left column of the area to scroll
  3803. Times%       number of times (or rows) to scroll
  3804.  
  3805. Name  : MakeSub              (Make Subdirectory)
  3806. Class : Disk
  3807. Level : DOS
  3808.  
  3809. Like the DOS MD (or MKDIR) command, this routine creates a new
  3810. subdirectory.
  3811.  
  3812.    CALL MakeSub (SubDir$, ErrCode%)
  3813.  
  3814. SubDir$    name of new subdirectory
  3815. -------
  3816. ErrCode%   error code: 0 if none, else DOS Error
  3817.  
  3818. Name  : MatchFile            (Match File)
  3819. Class : Disk / String
  3820. Level : Any
  3821.  
  3822. The MatchFile routine tells you whether a given filename
  3823. matches a file specification which may contain wildcards.  The
  3824. filename itself should not contain wildcards.  Neither the
  3825. filename nor filespec should include drive or subdirectory
  3826. specifications.
  3827.  
  3828. One way of using this is in processing file exclusion lists.
  3829. The FindFirstF routine allows you to find files that match a
  3830. given filespec; to this, you could add a MatchFile-based
  3831. routine which would screen out files that match a different
  3832. filespec.  Such a routine would allow you to create utilities
  3833. to do things like "DIR *.* /EXCEPT=*.BAS".
  3834.  
  3835.    CALL MatchFile (FileSpec$, FileName$, IsMatch%)
  3836.  
  3837. FileSpec$   master file pattern (may contain wildcards)
  3838. FileName$   name of file to test against the master pattern
  3839. -------
  3840. IsMatch%    0 if the filename doesn't match the filespec
  3841.  
  3842. Name  : MemSwap              (Memory Swap)
  3843. Class : Memory
  3844. Level : Any
  3845.  
  3846. MemSwap swaps the contents of one area of memory with another.
  3847. This can be used for a variety of things, from swapping a saved
  3848. screen with the actual screen to exchanging the contents of two
  3849. arrays.
  3850.  
  3851.    CALL MemSwap (DSeg1%, DOfs1%, DSeg2%, DOfs2%, Bytes%)
  3852.  
  3853. DSeg1%     segment of first memory area
  3854. DOfs1%     offset of first memory area
  3855. DSeg2%     segment of second memory area
  3856. DOfs2%     offset of second memory area
  3857. Bytes%     bytes to swap
  3858.  
  3859. Name  : MMButton             (Mouse Button)
  3860. Class : Mouse
  3861. Level : BIOS
  3862.  
  3863. The MMButton routine allows you to find out which mouse buttons
  3864. are pressed. Although it will work with any mouse, it is
  3865. designed specifically for a mouse with two buttons (see also
  3866. MMButton3).  If you want to find out which buttons were pressed
  3867. in the past, rather than being pressed now, try MMClick instead.
  3868.  
  3869. This routine will not work properly if there is no mouse
  3870. available.  Use the MMCheck routine if you are not sure.
  3871.  
  3872.    CALL MMButton (LeftB%, RightB%)
  3873.  
  3874. -------
  3875. LeftB%     whether the left button is pressed
  3876. RightB%    whether the right button is pressed
  3877.  
  3878. Name  : MMButton3            (Mouse Button for 3-button mouse)
  3879. Class : Mouse
  3880. Level : BIOS
  3881.  
  3882. The MMButton3 routine allows you to find out which mouse
  3883. buttons are pressed. Although it will work with any mouse, it
  3884. is designed specifically for a mouse with three buttons (see
  3885. also MMButton).  If you want to find out which buttons were
  3886. pressed in the past, rather than being pressed now, try
  3887. MMClick3 instead.
  3888.  
  3889. This routine will not work properly if there is no mouse
  3890. available.  Use the MMCheck routine if you are not sure.
  3891.  
  3892.    CALL MMButton3 (LeftB%, MiddleB%, RightB%)
  3893.  
  3894. -------
  3895. LeftB%     whether the left button is pressed
  3896. MiddleB%   whether the middle button is pressed
  3897. RightB%    whether the right button is pressed
  3898.  
  3899. Name  : MMCheck              (Mouse Check and initialize)
  3900. Class : Mouse
  3901. Level : BIOS
  3902.  
  3903. This routine does a number of things.  Primarily, it is
  3904. intended to let you check to see if a mouse is available.  It
  3905. returns a zero if there is no mouse; if there is a mouse, the
  3906. number of mouse buttons is returned.  The mouse status is also
  3907. initialized, so this is best used once at the beginning of your
  3908. program.
  3909.  
  3910. All of the other mouse routines assume that a mouse is
  3911. available, so you should definitely use MMCheck if you're not
  3912. sure.  Otherwise, results will be unusual at best, and the
  3913. computer may even lock up under some DOS versions.
  3914.  
  3915.    CALL MMCheck (Buttons%)
  3916.  
  3917. -------
  3918. Buttons%   number of mouse buttons (0 if no mouse is installed)
  3919.  
  3920. Name  : MMClick              (Mouse Click)
  3921. Class : Mouse
  3922. Level : BIOS
  3923.  
  3924. The MMClick routine allows you to find out which mouse buttons
  3925. have been pressed since you last checked, and how many times
  3926. they were pressed. Although it will work with any mouse, it is
  3927. designed specifically for a mouse with two buttons (see also
  3928. MMClick3).  If you want to find out which buttons are currently
  3929. being pressed, try MMButton instead.
  3930.  
  3931. This routine will not work properly if there is no mouse
  3932. available.  Use the MMCheck routine if you are not sure.
  3933.  
  3934.    CALL MMClick (LeftB%, RightB%)
  3935.  
  3936. -------
  3937. LeftB%     # of times left button was pressed since last check
  3938. RightB%    # of times right button was pressed since last check
  3939.  
  3940. Name  : MMClick3             (Mouse Click for 3-button mouse)
  3941. Class : Mouse
  3942. Level : BIOS
  3943.  
  3944. The MMClick3 routine allows you to find out which mouse buttons
  3945. have been pressed since you last checked, and how many times
  3946. they were pressed. Although it will work with any mouse, it is
  3947. designed specifically for a mouse with three buttons (see also
  3948. MMClick).  If you want to find out which buttons are currently
  3949. being pressed, try MMButton3 instead.
  3950.  
  3951. This routine will not work properly if there is no mouse
  3952. available.  Use the MMCheck routine if you are not sure.
  3953.  
  3954.    CALL MMClick3 (LeftB%, MiddleB%, RightB%)
  3955.  
  3956. -------
  3957. LeftB%     # of times left button was pressed since last check
  3958. MiddleB%   # of times middle button was pressed since last look
  3959. RightB%    # of times right button was pressed since last check
  3960.  
  3961. Name  : MMCursorOff          (Mouse Cursor Off)
  3962. Class : Mouse
  3963. Level : BIOS
  3964.  
  3965. This routine makes the mouse cursor invisible.  The mouse
  3966. cursor will still function as a location indicator, in the same
  3967. way that the normal cursor still functions when you make it
  3968. invisible.
  3969.  
  3970. Note that the mouse cursor is somewhat bizarre in that an
  3971. "invisibility level" is kept.  Every time you use MMCursorOff,
  3972. the invisibility depth is increased; subsequent attempts to
  3973. make the cursor visible will not actually do so until the
  3974. invisibility depth reaches zero.  In other words, if you call
  3975. MMCursorOff when the cursor is already invisible, the cursor
  3976. will not reappear until you've told it to reappear as many
  3977. times as you told it to disappear.  This is fairly demented,
  3978. but that's the way Microsoft made it.
  3979.  
  3980. This routine will not work properly if no mouse is installed.
  3981. See MMCheck.
  3982.  
  3983.    CALL MMCursorOff
  3984.  
  3985. Name  : MMCursorOn           (Mouse Cursor On)
  3986. Class : Mouse
  3987. Level : BIOS
  3988.  
  3989. This routine makes the mouse cursor visible, or tries to do
  3990. so...
  3991.  
  3992. The mouse cursor is somewhat bizarre in that an "invisibility
  3993. level" is kept.  Every time you use MMCursorOff, the
  3994. invisibility depth is increased; subsequent attempts to make
  3995. the cursor visible will not actually do so until the
  3996. invisibility depth reaches zero.  In other words, if you call
  3997. MMCursorOff when the cursor is already invisible, the cursor
  3998. will not reappear until you've told it to reappear (with
  3999. MMCursorOn) as many times as you told it to disappear.  This is
  4000. fairly demented, but that's the way Microsoft made it.
  4001.  
  4002. This routine will not work properly if no mouse is installed.
  4003. See MMCheck.
  4004.  
  4005.    CALL MMCursorOn
  4006.  
  4007. Name  : MMGetLoc             (Mouse Get Location)
  4008. Class : Mouse
  4009. Level : BIOS
  4010.  
  4011. This routine allows you to get the current location of the
  4012. mouse cursor.  It doesn't matter if the cursor is visible or
  4013. invisible.
  4014.  
  4015. The mouse cursor location is somewhat perverse in CGA and text
  4016. modes, due to the sloppy design of Microsoft's original mouse
  4017. driver.  In text modes and both CGA graphics modes, the cursor
  4018. is returned as if the screen is 640x200. To correct this for
  4019. SCREEN 1, divide the X coordinate by two.  To correct this for
  4020. text modes, divide each coordinate by eight.
  4021.  
  4022. This routine will not work properly if there is no mouse
  4023. available.  Use the MMCheck routine if you are not sure.
  4024.  
  4025. See also GetMouseLoc, which returns the appropriate coordinates
  4026. for text mode.
  4027.  
  4028.    CALL MMGetLoc (X%, Y%)
  4029.  
  4030. -------
  4031. X%         X coordinate ("column")
  4032. Y%         Y coordinate ("row")
  4033.  
  4034. Name  : MMSetLoc             (Mouse Set Location)
  4035. Class : Mouse
  4036. Level : BIOS
  4037.  
  4038. This routine allows you to set the current location of the
  4039. mouse cursor.  It doesn't matter if the cursor is visible or
  4040. invisible.
  4041.  
  4042. The mouse cursor location is somewhat perverse in CGA and text
  4043. modes, due to the sloppy design of Microsoft's original mouse
  4044. driver.  In text modes and both CGA graphics modes, the cursor
  4045. is returned as if the screen is 640x200. To correct this for
  4046. SCREEN 1, double the X coordinate.  To correct this for text
  4047. modes, multiply each coordinate by eight and add four.
  4048.  
  4049. This routine will not work properly if there is no mouse
  4050. available.  Use the MMCheck routine if you are not sure.
  4051.  
  4052. See also SetMouseLoc, which does the coordinate conversions for
  4053. you in text mode.
  4054.  
  4055.    CALL MMSetLoc (X%, Y%)
  4056.  
  4057. X%         X coordinate ("column")
  4058. Y%         Y coordinate ("row")
  4059.  
  4060. Name  : MMSetRange           (Mouse Set Range)
  4061. Class : Mouse
  4062. Level : BIOS
  4063.  
  4064. This routine allows you to set the allowable range of mouse
  4065. cursor locations. The mouse cursor will not be permitted to go
  4066. outside this range.  It doesn't matter if the cursor is visible
  4067. or invisible.
  4068.  
  4069. The mouse cursor location is somewhat perverse in CGA and text
  4070. modes, due to the sloppy design of Microsoft's original mouse
  4071. driver.  In text modes and both CGA graphics modes, the cursor
  4072. is returned as if the screen is 640x200. To correct this for
  4073. SCREEN 1, double the X coordinate.  To correct this for text
  4074. modes, multiply each coordinate by eight and add four.
  4075.  
  4076. This routine will not work properly if there is no mouse
  4077. available.  Use the MMCheck routine if you are not sure.
  4078.  
  4079.    CALL MMSetRange (X1%, Y1%, X2%, Y2%)
  4080.  
  4081. X1%       left   X coordinate (upper left "column")
  4082. Y1%       top    Y coordinate (upper left "row")
  4083. X2%       right  X coordinate (lower right "column")
  4084. Y2%       bottom Y coordinate (lower right "row")
  4085.  
  4086. Name  : Month0               (Month)
  4087. Class : String / Time
  4088. Level : Any
  4089.  
  4090. Given a month number, this routine tells you the name of the
  4091. month.
  4092.  
  4093.    MonthName$ = SPACE$(9)
  4094.    CALL Month0 (MonthName$, NameLen%, MonthNr%)
  4095.    MonthName$ = LEFT$(MonthName$, NameLen)
  4096.  
  4097. MonthNr%    month number (1-12)
  4098. -------
  4099. MonthName$  name of the month.  Init to at least 9 characters.
  4100. NameLen%    length of the month name
  4101.  
  4102. Name  : MouseBuffer          (Mouse Buffer size)
  4103. Class : Mouse
  4104. Level : BIOS
  4105.  
  4106. This routine is used before MouseSave in order to find out how
  4107. many bytes are needed to save the mouse state.
  4108.  
  4109. This routine will not work properly if there is no mouse
  4110. available.  Use the MMCheck routine if you are not sure.
  4111.  
  4112.    CALL MouseBuffer (Bytes%)
  4113.    St$ = SPACE$(Bytes%)
  4114.    CALL MouseSave (St$)
  4115.  
  4116. -------
  4117. Bytes%     number of bytes needed to save the state of the mouse
  4118.  
  4119. Name  : MouseCursor          (Mouse Cursor type)
  4120. Class : Mouse
  4121. Level : BIOS
  4122.  
  4123. The MouseCursor routine allows you to select one of a number of
  4124. graphics mouse cursors.  The following types are supported:
  4125.  
  4126.     0   hourglass ("please wait" symbol)
  4127.     1   standard arrow pointer
  4128.     2   pointing hand
  4129.     3   crosshair
  4130.     4   target (box-in-a-box pointer)
  4131.     5   grabbing hand
  4132.  
  4133. If you'd like other shapes, please suggest a few!  I'll be glad
  4134. to add them.
  4135.  
  4136.    CALL MouseCursor (CursorNr%)
  4137.  
  4138. CursorNr%    type of mouse graphics cursor to use (see above)
  4139.  
  4140. Name  : MousePen             (Mouse light Pen emulation)
  4141. Class : Mouse
  4142. Level : BIOS
  4143.  
  4144. The mouse can be made to emulate a light pen, allowing you to
  4145. use BASIC's light pen routines to provide a certain minimal
  4146. level of support for both light pens and mice.  This emulation
  4147. is on by default, but you can turn it off in case there is an
  4148. actual light pen attached.
  4149.  
  4150. This routine will not work properly if there is no mouse
  4151. available.  Use the MMCheck routine if you are not sure.
  4152.  
  4153.    CALL MousePen (EmulatePen%)
  4154.  
  4155. EmulatePen%   whether mouse should emulate light pen (0 no)
  4156.  
  4157. Name  : MouseRest            (Mouse status Restore)
  4158. Class : Mouse
  4159. Level : BIOS
  4160.  
  4161. This routine is for use in conjunction with MouseSave.  It
  4162. allows you to restore the mouse settings to a state that was
  4163. saved in the past.
  4164.  
  4165. This routine will not work properly if there is no mouse
  4166. available.  Use the MMCheck routine if you are not sure.
  4167.  
  4168.    CALL MouseRest (St$)
  4169.  
  4170. St$        mouse state to restore
  4171.  
  4172. Name  : MouseSave            (Mouse status Save)
  4173. Class : Mouse
  4174. Level : BIOS
  4175.  
  4176. This one is handy for use in subprograms or when SHELLing to
  4177. other programs that may use the mouse.  It allows you to save
  4178. the current mouse settings as a string.  To find out how long
  4179. the string should be, use MouseBuffer.
  4180.  
  4181. This routine will not work properly if there is no mouse
  4182. available.  Use the MMCheck routine if you are not sure.
  4183.  
  4184.    CALL MouseBuffer (Bytes%)
  4185.    St$ = SPACE$(Bytes%)
  4186.    CALL MouseSave (St$)
  4187.  
  4188. -------
  4189. St$        saved mouse state.  Init as shown above.
  4190.  
  4191. Name  : MPrint               (MS-DOS Print)
  4192. Class : Display
  4193. Level : BIOS
  4194.  
  4195. The MPrint routine displays text using mostly DOS services.
  4196. This allows it to handle ANSI codes if an ANSI driver is
  4197. installed.  In addition, the output of MPrint is confined to a
  4198. region of the screen that you may select with MWindow.  By
  4199. default, the region is 1,1 to 25,80: a full 80x25 text screen.
  4200.  
  4201. Using MPrint is similar to using PRINT followed by a semicolon.
  4202. It does not automatically move to the next line.  To do so, you
  4203. must MPrint a carriage return and linefeed: CHR$(13) + CHR$(10).
  4204.  
  4205. To clear the MWindow region, MPrint a formfeed: CHR$(12).
  4206.  
  4207.    CALL MPrint (St$)
  4208.  
  4209. St$         string to display
  4210.  
  4211. Name  : MulMatI              (Multiply Matrix by Integer)
  4212. Class : Array management
  4213. Level : Any
  4214.  
  4215. This routine multiplies as many elements of an integer array as
  4216. you like by a given number, starting at a specified place in
  4217. the array.  If there was a numeric overflow at any point in the
  4218. operation, an error code will be returned.
  4219.  
  4220.    CALL MulMatI (DSeg%, DOfs%, Elements%, Value%, ErrCode%)
  4221.  
  4222. DSeg%      segment of the array element to start at
  4223. DOfs%      offset of the array element to start at
  4224. Elements%  number of array elements to process
  4225. Value%     value to multiply each array element by
  4226. -------
  4227. ErrCode%   error code: 0 if no error
  4228.  
  4229. Name  : MultiAND             (Multiple AND)
  4230. Class : String
  4231. Level : Any
  4232.  
  4233. The MultiAND routine performs an arithmetic "AND" operation on
  4234. each character in a string.
  4235.  
  4236. Among the varied uses for MultiAND is stripping the high bit
  4237. from characters, as you might want to do in telecommunications
  4238. or in converting WordStar files.  In that case, you would use a
  4239. BitMask% of 127.
  4240.  
  4241.    CALL MultiAND (St$, BitMask%)
  4242.  
  4243. St$        string to process
  4244. BitMask%   bit mask (0-255) with which to AND each character
  4245. -------
  4246. St$        processed string
  4247.  
  4248. Name  : MultiOR              (Multiple OR)
  4249. Class : String
  4250. Level : Any
  4251.  
  4252. The MultiOR routine performs an arithmetic "OR" operation on
  4253. each character in a string.
  4254.  
  4255.    CALL MultiOR (St$, BitMask%)
  4256.  
  4257. St$        string to process
  4258. BitMask%   bit mask (0-255) with which to OR each character
  4259. -------
  4260. St$        processed string
  4261.  
  4262. Name  : MultiXOR             (Multiple XOR)
  4263. Class : String
  4264. Level : Any
  4265.  
  4266. The MultiXOR routine performs an arithmetic "XOR" operation on
  4267. each character in a string.
  4268.  
  4269.    CALL MultiXOR (St$, BitMask%)
  4270.  
  4271. St$        string to process
  4272. BitMask%   bit mask (0-255) with which to XOR each character
  4273. -------
  4274. St$        processed string
  4275.  
  4276. Name  : MWindow              (MS-DOS Window)
  4277. Class : Display
  4278. Level : Any
  4279.  
  4280. The MWindow routine works in conjunction with MPrint.  It
  4281. defines an area of the screen in which text displayed by MPrint
  4282. must stay.  The default window is 1,1 to 25,80.
  4283.  
  4284.    CALL MWindow (TopRow%, LeftCol%, BottomRow%, RightCol%)
  4285.  
  4286. TopRow%     top row
  4287. LeftCol%    left column
  4288. BottomRow%  bottom row
  4289. RightCol%   right column
  4290.  
  4291. Name  : NumProc              (Numeric Processor)
  4292. Class : Equipment
  4293. Level : Any
  4294.  
  4295. NumProc returns the type of numeric coprocessor installed.  I
  4296. haven't tried it with a 80486, but I would guess an 80486
  4297. always appears to have an 80387 (unless it's one of those
  4298. brain-damaged 80486SX chips).
  4299.  
  4300. Results are returned as follows:
  4301.  
  4302.    0    no math chip
  4303.    1    8087
  4304.    2    80287
  4305.    3    80387
  4306.  
  4307. If anyone can tell me how to better handle a 486 here, I'd
  4308. appreciate it.
  4309.  
  4310.    CALL NumProc (ProcType%)
  4311.  
  4312. -------
  4313. ProcType%    type of numeric coprocessor (see above)
  4314.  
  4315. Name  : OrSt                 (OR String)
  4316. Class : String
  4317. Level : Any
  4318.  
  4319. This routine ORs each byte in one string with the corresponding
  4320. byte in a second string.  The strings must be the same length.
  4321.  
  4322.    CALL OrSt (St1$, St2$)
  4323.  
  4324. St1$      string to OR
  4325. St2$      string to OR with
  4326. -------
  4327. St1$      result
  4328.  
  4329. Name  : PCDate               (PC Date)
  4330. Class : Equipment
  4331. Level : Clone
  4332.  
  4333. The PCDate routine tells you the date of the BIOS ROM chip.
  4334. This date is not always available on some (mostly older)
  4335. clones, in which case "No Date " is returned.
  4336.  
  4337.    ROMDate$ = SPACE$(8)
  4338.    CALL PCDate (ROMDate$)
  4339.  
  4340. -------
  4341. ROMDate$   date of the BIOS ROM (xx/xx/xx).  Init to 8+ chars.
  4342.  
  4343. Name  : PCType               (PC Type)
  4344. Class : Equipment
  4345. Level : Clone
  4346.  
  4347. This routine returns the machine I.D. code.  This code may not
  4348. be one of the listed values for some (mostly older) clones, but
  4349. the following is usually correct:
  4350.  
  4351.    I.D.  ....Machine....
  4352.    255   PC or XT
  4353.    254   XT
  4354.    253   PCjr
  4355.    252   PC AT
  4356.    251   XT
  4357.    250   PS/2 Model 30
  4358.    249   PC Convertible
  4359.    248   PS/2 Model 70 or 80
  4360.    154   Compaq Portable
  4361.     45   Compaq Portable
  4362.  
  4363. Note that, for identification purposes, a PC and XT are
  4364. essentially the same. The XT is simply a PC with an auto-boot
  4365. hard drive.  New I.D. numbers come out more or less at random
  4366. from IBM, although they aren't as capricious about it as they
  4367. used to be.  It is useful to identify Compaq Portables as
  4368. separate from PCs because those machines had an unusual
  4369. display, which acts like a CGA but has the resolution (in text
  4370. modes) of an MDA.  Hence, the cursor size of a Compaq Portable
  4371. is MDA-sized in text mode, but CGA-sized in graphics modes,
  4372. even though ordinary tests will tell your program that a CGA is
  4373. attached.  If you intend to alter the cursor size, this is an
  4374. important distinction, since the Compaq Portable was a great
  4375. success and is still in wide use.  Current Compaq machines,
  4376. like most other clones, follow the standard IBM I.D. codes.
  4377.  
  4378.    CALL PCType (MachineID%)
  4379.  
  4380. -------
  4381. MachineID%   type of computer
  4382.  
  4383. Name  : PrinterInit          (Printer Initialize)
  4384. Class : Printer
  4385. Level : BIOS
  4386.  
  4387. This routine initializes a printer in the same way as if the
  4388. computer had been rebooted.
  4389.  
  4390. Note that this will not work on serial printers, even if the
  4391. MODE command was used to redirect the port.  It works at the
  4392. BIOS level, so it doesn't know about any fooling around DOS
  4393. does.
  4394.  
  4395.    CALL PrinterInit (Port%)
  4396.  
  4397. Port%         parallel port number (1-3)
  4398.  
  4399. Name  : PrintScreen          (Print Screen)
  4400. Class : Display / Printer
  4401. Level : BIOS
  4402.  
  4403. Just like pressing the PrtSc/PrintScrn key on the keyboard,
  4404. this routine sends the contents of the display to the printer.
  4405. It is mostly designed for text modes, but use of the GRAPHICS
  4406. TSR provided with DOS will allow it to print out CGA graphics
  4407. displays as well.  For some reason, the GRAPHICS utility does
  4408. not handle Hercules, EGA or VGA displays; however, alternative
  4409. utilities which provide such features may be obtained from your
  4410. local BBS.
  4411.  
  4412.    CALL PrintScreen
  4413.  
  4414. Name  : Processor            (Processor)
  4415. Class : Equipment
  4416. Level : Any
  4417.  
  4418. Processor returns the type of processor (CPU) installed.
  4419.  
  4420. Results are returned as follows:
  4421.  
  4422.    0    NEC V20
  4423.    1    8088 or 8086
  4424.    2    80186
  4425.    3    80286
  4426.    4    80386
  4427.    5    80486
  4428.  
  4429. Note that, for most practical purposes, a NEC V20 works just
  4430. like an 80186.
  4431.  
  4432.    CALL Processor (ProcType%)
  4433.  
  4434. -------
  4435. ProcType%    type of CPU (see above)
  4436.  
  4437. Name  : PrtSc                (Print Screen key)
  4438. Class : Input / Printer
  4439. Level : BIOS
  4440.  
  4441. This routine allows you to disable the "print screen" key.
  4442. This only affects the keyboard, not the PrintScreen routine in
  4443. PBBack.
  4444.  
  4445. If you disable the "print screen" key, be sure to enable it
  4446. again before your program ends.  Otherwise, the "print screen"
  4447. key will be left in an undefined state, probably causing the
  4448. computer to crash when it is next pressed.
  4449.  
  4450.    CALL PrtSc (Enable%)
  4451.  
  4452. Enable%   whether "print screen" should be enabled (0 no)
  4453.  
  4454. Name  : PrtSwap              (Printer Swap)
  4455. Class : Printer
  4456. Level : Clone
  4457.  
  4458. It's handy to use LPRINT, but it isn't always practical.
  4459. LPRINT only works on the first printer available (PRN or
  4460. LPT1).  With this routine, it doesn't matter.  PrtSwap allows
  4461. you to swap any two printer ports.
  4462.  
  4463. Note that it's a good idea to swap the ports back to their
  4464. original locations before exiting your program.  You could
  4465. cause major confusion otherwise!
  4466.  
  4467.    CALL PrtSwap (Port1%, Port2%)
  4468.  
  4469. Port1%    number of the first port (1-3)
  4470. Port2%    number of the second port (1-3)
  4471.  
  4472. Name  : PutScreen            (Put Screen)
  4473. Class : Display
  4474. Level : Clone
  4475.  
  4476. This routine restores a portion of the display (which was saved
  4477. to an array by DGetScreen or GetScreen) to the screen.  Only
  4478. text modes are supported. If your program uses multiple display
  4479. pages, you can put the image onto any of those pages.  A
  4480. special "slow" mode is supported for the CGA, to prevent
  4481. flickering (a problem only with some CGAs).
  4482.  
  4483. If you wish to restore the entire screen, you may find ScrRest
  4484. easier (see).
  4485.  
  4486.    CALL PutScreen (Array%(), TRow%, LCol%, BRow%, RCol%, _
  4487.       Page%, Fast%)
  4488.  
  4489. Array%()   array from which to restore the image
  4490. TRow%      top row of the desired screen area
  4491. LCol%      left column of the desired screen area
  4492. BRow%      bottom row of the desired screen area
  4493. RCol%      right column of the desired screen area
  4494. Page%      page on which to restore the display
  4495. Fast%      whether to use fast mode (0 no)
  4496.  
  4497. Name  : QPrint               (Quick Print)
  4498. Class : Display
  4499. Level : Clone
  4500.  
  4501. This is a replacement for the PRINT statement.  It is less
  4502. flexible in that it does not move the cursor or interpret
  4503. control codes, and because it uses the color that is already on
  4504. the screen instead of a specified color value. It also works
  4505. only in text modes.
  4506.  
  4507. In exchange, QPrint gives you much faster display speeds.
  4508.  
  4509. See also XQPrint, which is a bit more flexible (and somewhat
  4510. slower).
  4511.  
  4512.    CALL QPrint (St$, Row%, Column%, Page%, Fast%)
  4513.  
  4514. St$        text to display
  4515. Row%       starting row
  4516. Column%    starting column
  4517. Page%      page on which to display
  4518. Fast%      whether to use fast mode (0 no)
  4519.  
  4520. Name  : ReadBitF             (Read Bit Field)
  4521. Class : Numeric
  4522. Level : Any
  4523.  
  4524. This routine allows you to get an element of a virtual array.
  4525. The actual array can be any numeric type, as it is just being
  4526. used as a storage area. The virtual array is composed of
  4527. numbers of a bit length that you specify (1-8).  This provides
  4528. efficient storage for numbers which have a limited range.
  4529.  
  4530. See also WriteBitF.
  4531.  
  4532.    CALL ReadBitF (DSeg%, DOfs%, ElementNr%, BitLen%, Value%)
  4533.  
  4534. DSeg%        segment of actual array
  4535. DOfs%        offset of actual array
  4536. ElementNr%   virtual element number (starts at 0)
  4537. BitLen%      bits per virtual element (1-8)
  4538. -------
  4539. Value%       result (0-255 or less, depending on BitLen%)
  4540.  
  4541. Name  : Reboot               (Reboot)
  4542. Class : Miscellaneous
  4543. Level : Clone
  4544.  
  4545. This routine restarts the computer, just like typing
  4546. Control-Alt-Del at the keyboard.
  4547.  
  4548.    CALL Reboot
  4549.  
  4550. Name  : Recolor              (Recolor)
  4551. Class : Display
  4552. Level : Clone
  4553.  
  4554. The Recolor routine changes all text in one color to another
  4555. color.  It works only in text modes.  The colors are specified
  4556. as attributes (see CalcAttr).
  4557.  
  4558.    CALL Recolor (OldAttr%, NewAttr%)
  4559.  
  4560. OldAttr%   color to be changed
  4561. NewAttr%   color to which to change
  4562.  
  4563. Name  : RecolorArea          (Recolor Area)
  4564. Class : Display
  4565. Level : Clone
  4566.  
  4567. The RecolorArea routine changes a specified area of the screen
  4568. to a specified color.  It works only in text modes.  The color
  4569. is specified as an attribute (see CalcAttr).
  4570.  
  4571. See also HiLite, which provides an easier way of highlighting
  4572. between two columns on a single row.
  4573.  
  4574.    CALL RecolorArea (TRow%, LCol%, BRow%, RCol%, VAttr%, _
  4575.       Page%, Fast%)
  4576.  
  4577. TRow%       top row of area to recolor
  4578. LCol%       left column of area to recolor
  4579. BRow%       bottom row of area to recolor
  4580. RCol%       right column of area to recolor
  4581. VAttr%      desired color
  4582. Page%       display page (normally zero)
  4583. Fast%       whether to use fast mode (0 no)
  4584.  
  4585. Name  : Rename               (Rename file)
  4586. Class : Disk
  4587. Level : DOS
  4588.  
  4589. This routine allows you to rename an ordinary file.  See also
  4590. RenSub.
  4591.  
  4592.    CALL Rename (CurrentName$, NewName$, ErrCode%)
  4593.  
  4594. CurrentName$   current name of the file
  4595. NewName$       desired name of the file
  4596. -------
  4597. ErrCode%       error code: 0 if no error, else DOS Error
  4598.  
  4599. Name  : RenSub               (Rename Subdirectory)
  4600. Class : Disk
  4601. Level : DOS
  4602.  
  4603. This routine provides a service that was inexplicably left out
  4604. of the DOS command shell.  It allows you to rename a
  4605. subdirectory.
  4606.  
  4607. Note that renaming a subdirectory is only possible using
  4608. old-style FCB file handling.  This means that the subdirectory
  4609. which you specify must be in the current directory (the routine
  4610. doesn't really understand subdirectories per se, but treats
  4611. them like any other file).  In this implementation, no drive
  4612. specification is allowed either.  Finally, if there is an
  4613. error, the error code may be a simple "255" instead of a useful
  4614. disk error number.
  4615.  
  4616.    CALL RenSub (CurrentSub$, NewSub$, ErrCode%)
  4617.  
  4618. CurrentSub$   current name of the subdirectory
  4619. NewSub$       desired name of the subdirectory
  4620. -------
  4621. ErrCode%      error code: 0 if no error, else DOS Error
  4622.  
  4623. Name  : Replace              (Replace character)
  4624. Class : String
  4625. Level : Any
  4626.  
  4627. This routine replaces all occurrences of a given character in a
  4628. string with another character.
  4629.  
  4630.    CALL Replace (St$, CurCh$, NewCh$)
  4631.  
  4632. St$         string to process
  4633. CurCh$      character to be replaced
  4634. NewCh$      character to replace with
  4635. -------
  4636. St$         processed string
  4637.  
  4638. Name  : Retries              (Retries)
  4639. Class : Disk
  4640. Level : DOS 3.1+
  4641.  
  4642. This routine allows you to adjust the handling of file-sharing
  4643. errors.  When such an error occurs, DOS normally retries 3
  4644. times, with a wait of 1 between tries.  This allows temporary
  4645. conditions, such as someone else using the file you want to
  4646. access, to clear up.  In many cases, though, you may want to
  4647. change this delay.  A shorter delay will improve response time,
  4648. allowing your program to handle the error more quickly.  A
  4649. longer delay may be more suited for a busy network, allowing
  4650. the request to proceed after a reasonable waiting period.
  4651.  
  4652. The delay period between each retry is unfortunately
  4653. machine-dependent, i.e., you will need larger delays on faster
  4654. machines to achieve the same effect.  This can only be
  4655. considered a flaw in DOS.
  4656.  
  4657. Note that shorter waiting periods will improve response time
  4658. for your program, but may adversely affect the network.
  4659. Normally, you should use the longest waiting period with which
  4660. you feel comfortable.
  4661.  
  4662.    CALL Retries (Times%, WaitTime%)
  4663.  
  4664. Times%     # of times to retry if file-sharing violation occurs
  4665. WaitTime%  amount of time to delay between retries
  4666.  
  4667. Name  : Reverse              (Reverse)
  4668. Class : String
  4669. Level : Any
  4670.  
  4671. This little fellow reverses the order of the characters in a
  4672. string.  It is one of the vital components of RInstr, but other
  4673. than that I see no real use for it.  On the other hand, George
  4674. Boole thought that Boolean logic was of solely theoretical
  4675. interest, and yet without it there would be no computers. I
  4676. leave it to you to find the earth-shattering possibilities of
  4677. Reverse!
  4678.  
  4679.    CALL Reverse (St$)
  4680.  
  4681. St$      string to be reversed
  4682. -------
  4683. St$      reversed string
  4684.  
  4685. Name  : RotateL              (Rotate Left)
  4686. Class : Numeric
  4687. Level : Any
  4688.  
  4689. This routine rotates the bits in an integer left by a desired
  4690. amount.
  4691.  
  4692.    CALL RotateL (Value%, Count%)
  4693.  
  4694. Value%    number to rotate left
  4695. Count%    bits by which to rotate
  4696. -------
  4697. Value%    rotated number
  4698.  
  4699. Name  : RotateR              (Rotate Right)
  4700. Class : Numeric
  4701. Level : Any
  4702.  
  4703. This routine rotates the bits in an integer right by a desired
  4704. amount.
  4705.  
  4706.    CALL RotateR (Value%, Count%)
  4707.  
  4708. Value%    number to rotate right
  4709. Count%    bits by which to rotate
  4710. -------
  4711. Value%    rotated number
  4712.  
  4713. Name  : RRotate              (Right Rotate string)
  4714. Class : String
  4715. Level : Any
  4716.  
  4717. This routine rotates the characters in a string right once.
  4718. I'll admit that I haven't found a use for this myself, but
  4719. people are always coming up with new uses for things... and it
  4720. complements the more useful LRotate routine.
  4721.  
  4722. See also LRotate.
  4723.  
  4724.    CALL RRotate (St$)
  4725.  
  4726. St$      string to be rotated right once
  4727. -------
  4728. St$      string after being rotated right once
  4729.  
  4730. Name  : RScroll              (Right Scroll)
  4731. Class : Display
  4732. Level : Clone
  4733.  
  4734. This routine scrolls any selected part of the display right.
  4735. You may scroll as many times as you like, or scroll "zero"
  4736. times to totally clear the selected part of the display.
  4737.  
  4738.    CALL RScroll (TopRow%, LeftCol%, BottomRow%, RightCol%, _
  4739.       Times%)
  4740.  
  4741. TopRow%      top row of the area to scroll
  4742. LeftCol%     left column of the area to scroll
  4743. BottomRow%   top row of the area to scroll
  4744. RightCol%    left column of the area to scroll
  4745. Times%       number of times (or rows) to scroll
  4746.  
  4747. Name  : ScanKey              (Scan Keyboard)
  4748. Class : Input
  4749. Level : BIOS
  4750.  
  4751. This one's like INKEY$, but a little bit more subtle.  It will
  4752. tell you if there's a key waiting (and if so, what key it is)
  4753. without actually getting the key.  The key will remain
  4754. available for later retrieval.
  4755.  
  4756. Among the more common uses for this routine is to handle keys
  4757. like Control-S (pause the display) and Control-C (abort).  You
  4758. can see if these keys have been pressed without disturbing
  4759. anything else the user might have typed.  DOS uses exactly this
  4760. technique for handling these keys.  Since BASIC doesn't go
  4761. through DOS I/O, though, the only way for you to support such
  4762. nice features is to write them into your program with ScanKey.
  4763.  
  4764.    CALL ScanKey (CharCode%, CharType%)
  4765.  
  4766. -------
  4767. CharType%   key type: 0 none, 1 normal, 2 extended (scan code)
  4768. CharCode%   key ASCII or scan code
  4769.  
  4770. Name  : Scroll               (Scroll)
  4771. Class : Display
  4772. Level : BIOS
  4773.  
  4774. This routine scrolls any selected part of the display up.  You
  4775. may scroll as many times as you like, or scroll "zero" times to
  4776. totally clear the selected part of the display.
  4777.  
  4778. Note that BIOS-level scrolling can cause the screen to flicker
  4779. on some CGAs due to a combination of unfortunate design factors.
  4780.  
  4781.    CALL Scroll (TopRow%, LeftCol%, BottomRow%, RightCol%, _
  4782.       Times%)
  4783.  
  4784. TopRow      top row of the area to scroll
  4785. LeftCol%    left column of the area to scroll
  4786. BottomRow   top row of the area to scroll
  4787. RightCol%   left column of the area to scroll
  4788. Times%      number of times (or rows) to scroll
  4789.  
  4790. Name  : ScrRest              (Screen Restore)
  4791. Class : Display
  4792. Level : Clone
  4793.  
  4794. The ScrRest routine restores a display that was saved using
  4795. ScrSave or a similar routine.  It only works in text modes, and
  4796. expects an 80x25 screen.  See PutScreen or DPutScreen if you
  4797. need to work with other screen sizes.
  4798.  
  4799.    CALL ScrRest (Array%(), Page%, Fast%)
  4800.  
  4801. Array%()   array holding the display information
  4802. Page%      page on which to restore the display
  4803. Fast%      whether to use fast mode (0 no)
  4804.  
  4805. Name  : ScrSave              (Screen Save)
  4806. Class : Display
  4807. Level : Clone
  4808.  
  4809. The ScrSave routine saves the display to an integer array.
  4810. Only text modes are supported.  For an 80x25 display, the array
  4811. must hold 4,000 bytes, so you would use DIM Array%(1 TO 2000).
  4812.  
  4813. ScrSave expects an 80x25 screen.  Use GetScreen or DGetScreen
  4814. if you need to work with other screen sizes.
  4815.  
  4816.    CALL ScrSave (Array%(), Page%, Fast%)
  4817.  
  4818. Page%      display page to get
  4819. Fast%      whether to use fast mode (0 no)
  4820. -------
  4821. Array%()   saved display information
  4822.  
  4823. Name  : SCrunch              (Screen Crunch)
  4824. Class : Display
  4825. Level : Any
  4826.  
  4827. This routine is designed to be used in conjunction with ScrSave
  4828. and the other routines which store an entire 80x25 text screen
  4829. in an array.  It performs a "screen crunch", compressing the
  4830. original data into a new array.  The average result is about 8x
  4831. smaller than the original screen, resulting in a vast savings
  4832. in memory (4,000 bytes vs 500 or so).  The compression
  4833. algorithm is very fast and will not take any noticeable amount
  4834. of time for most purposes.
  4835.  
  4836. Besides saving main memory, this is great for storing screens
  4837. as disk files! The compression will not only make the file(s)
  4838. smaller, but will make disk access faster since there is less
  4839. information to transfer.
  4840.  
  4841.    CALL SCrunch (DSeg%, DOfs%, CSeg%, COfs%, Bytes%)
  4842.  
  4843. DSeg%     segment of the original screen image
  4844. DOfs%     offset of the original screen image
  4845. CSeg%     segment of array in which to store compressed image
  4846. COfs%     offset of array in which to store compressed image
  4847. -------
  4848. Bytes%    number of bytes in the compressed image
  4849.  
  4850. Name  : SetBit               (Set Bit)
  4851. Class : Numeric
  4852. Level : Any
  4853.  
  4854. This routine sets a single bit "on" in an integer.  Bits are
  4855. numbered 0-15, with 0 being the least significant bit.
  4856.  
  4857.    CALL SetBit (Number%, BitNr%)
  4858.  
  4859. Number%    number for which to set bit
  4860. BitNr%     bit number (0-15) to set
  4861. -------
  4862. Number%    number with the specified bit set
  4863.  
  4864. Name  : SetCGAColor          (Set CGA Color)
  4865. Class : Display
  4866. Level : Clone
  4867.  
  4868. This routine allows you to set certain aspects of CGA colors
  4869. which aren't available otherwise.  It is very CGA-specific,
  4870. however, and may not work on EGA or VGA systems.
  4871.  
  4872. The color specified has different meanings in different CGA
  4873. modes.  In the SCREEN 1 graphics mode, it changes the
  4874. background and border color.  In SCREEN 2, however, it allows
  4875. you to change the foreground color.  While you are still stuck
  4876. with a single foreground color, you can choose what that color
  4877. will be.
  4878.  
  4879.    CALL SetCGAColor (Colour%)
  4880.  
  4881. Colour%    color to set (see above)
  4882.  
  4883. Name  : SetComm              (Set Comm port)
  4884. Class : Serial
  4885. Level : DOS
  4886.  
  4887. Although QuickBASIC has a fair range of communications support,
  4888. it doesn't do the capabilities of the PC full justice.  It's
  4889. also impossible to change the serial parameters "on the fly"
  4890. without risking disconnection, if BASIC alone is used.  SetComm
  4891. gets around those limitations.  It should be used -after- the
  4892. appropriate comm port is OPENed by BASIC.
  4893.  
  4894. Note that the true upper limits of the comm speed are
  4895. determined by your program and by the hardware being used.
  4896. Some PC/XTs may have trouble with 9,600 bps, for instance.  The
  4897. ability to set the serial port to a high speed doesn't
  4898. guarantee that the hardware can handle it!
  4899.  
  4900.    CALL SetComm (CommPort%, Bps%, Parity%, WordLength%, _
  4901.       StopBits%)
  4902.  
  4903. CommPort%    serial port (1-4, though BASIC only uses 1-2)
  4904. Bps%         bits per second ("baud rate"):
  4905.                 0 for   300       5 for   9,600
  4906.                 1 for   600       6 for  19,200
  4907.                 2 for 1,200       7 for  38,400
  4908.                 3 for 2,400       8 for  57,600
  4909.                 4 for 4,800       9 for 115,200
  4910. Parity%      parity:
  4911.                 0  none
  4912.                 1  odd            3  mark  (always on)
  4913.                 2  even           4  space (always off)
  4914. WordLength%  word length (5-8)
  4915. StopBits%    stop bits (1-2; if WordLength=5, "2" means 1 1/2)
  4916.  
  4917. Name  : SetCommAddr          (Set Comm Address)
  4918. Class : Serial
  4919. Level : Clone
  4920.  
  4921. This routine allows you to set the base port address of a
  4922. serial port.
  4923.  
  4924. One use for SetCommAddr is to give QuickBASIC access to the
  4925. comm port on those unusual machines which have a COM2 but no
  4926. COM1.  Use GetCommAddr to get the address of COM2, set the COM1
  4927. address accordingly, and tell QuickBASIC to use COM1.
  4928.  
  4929. BASIC will normally handle COM1 and COM2, but not COM3 or
  4930. COM4.  Although there is no way to use more two ports at once,
  4931. you can fool BASIC into using COM3 by swapping it with COM1, or
  4932. COM4 by swapping it with COM2.
  4933.  
  4934. Don't forget to set the ports back to their original values
  4935. before your program ends!
  4936.  
  4937.    CALL SetCommAddr (PortNr%, PortAddr%)
  4938.  
  4939. PortNr%     COM port number (1-4)
  4940. PortAddr%   port address
  4941.  
  4942. Name  : SetDateAT            (Set Date of AT clock)
  4943. Class : Time
  4944. Level : BIOS (AT)
  4945.  
  4946. This routine sets the date of the hardware real-time clock in
  4947. AT-class computers.  Depending on the DOS version, this date
  4948. may be partially or completely independent of the date kept by
  4949. DOS in software.  DOS always reads the date from the hardware
  4950. clock when it starts up.  However, use of the DATE command in
  4951. DOS (and the DATE$ function in QuickBASIC) may relate only to
  4952. the software copy of the date, which is not always guaranteed
  4953. to be the same as the date in the hardware clock due to certain
  4954. discrepancies in DOS.
  4955.  
  4956. You may express the year as either a two-digit or four-digit
  4957. number.
  4958.  
  4959. The ProBas and PBBack versions of this routine do not work the
  4960. same way in regards to the year.  ProBas assumed that any
  4961. two-digit year was in the 1900s.  In contrast, PBBack assumes
  4962. that years 80-99 should be converted to 1980-1999 and that 0-79
  4963. should be converted to 2000-2079.  I consider the PBBack method
  4964. more appropriate, with the turn of the century moving closer.
  4965. The date format used does not allow dates before 1980 anyway,
  4966. so nothing is being lost by this change.
  4967.  
  4968.    CALL SetDateAT (MonthNr%, DayNr%, YearNr%)
  4969.  
  4970. MonthNr%    month number (1-12)
  4971. DayNr%      day (1-31)
  4972. YearNr%     year (1980-2079; see above for two-digit years)
  4973.  
  4974. Name  : SetDrv               (Set default Drive)
  4975. Class : Disk
  4976. Level : DOS
  4977.  
  4978. This routine sets the default disk drive.
  4979.  
  4980. If the specified drive does not exist, the current default
  4981. drive will remain the default.
  4982.  
  4983.    CALL SetDrv (Drive$)
  4984.  
  4985. Drive$    drive letter
  4986.  
  4987. Name  : SetError             (Set Error code)
  4988. Class : Miscellaneous
  4989. Level : DOS
  4990.  
  4991. The SetError routine allows you to set the "error level" to be
  4992. returned by DOS when your program ends.  This is particularly
  4993. handy for returning information to batch files.
  4994.  
  4995. Note that SetError is best used just before your program ENDs,
  4996. to avoid complications.
  4997.  
  4998.    CALL SetError (ErrorLevel%)
  4999.  
  5000. ErrorLevel%   exit code to be returned by your program
  5001.  
  5002. Name  : SetFAttr             (Set File Attribute)
  5003. Class : Disk
  5004. Level : DOS
  5005.  
  5006. This routine allows you to set the attribute of a file or
  5007. subdirectory.  Any combination of the following may be set:
  5008.  
  5009.    Normal          0      (nothing special)
  5010.    Read Only       1      file can be read, but not written to
  5011.    Hidden          2      file will be "invisible"
  5012.    System          4      (for special DOS files-- leave alone)
  5013.    Archive        32      (used by some backup utils- leave be)
  5014.  
  5015. To set more than one attribute, just add the numbers for the
  5016. desired attributes together.  The attributes marked "leave
  5017. alone" shouldn't be used casually, but if you're sure you know
  5018. what you're doing...
  5019.  
  5020.    CALL SetFAttr (FileName$, FAttr%)
  5021.  
  5022. FileName$   name of the file (or subdirectory) to manipulate
  5023. FAttr%      attribute(s) to set
  5024.  
  5025. Name  : SetFTD               (Set File Time and Date)
  5026. Class : Disk
  5027. Level : DOS
  5028.  
  5029. This routine lets you set the time and date of a specified
  5030. file.  You may give the year either as two digits or four
  5031. digits.
  5032.  
  5033. The ProBas and PBBack versions of this routine do not work the
  5034. same way in regards to the year.  ProBas assumed that any
  5035. two-digit year was in the 1900s.  In contrast, PBBack assumes
  5036. that years 80-99 should be converted to 1980-1999 and that 0-79
  5037. should be converted to 2000-2079.  I consider the PBBack method
  5038. more appropriate, with the turn of the century moving closer.
  5039. The DOS date format does not allow dates before 1980 anyway, so
  5040. nothing is being lost by this change.
  5041.  
  5042. Note that the Second% value, if odd, will be rounded down to an
  5043. even number. This is due to the way DOS compresses the time
  5044. format, rather than any limitation in this routine.
  5045.  
  5046.    CALL SetFTD (File$, MonthNr%, DayNr%, YearNr%, HourNr%, _
  5047.       MinuteNr%, SecondNr%)
  5048.  
  5049. File$        name of file for which to set the time and date
  5050. MonthNr%     month number (1-12)
  5051. DayNr%       day (1-31)
  5052. YearNr%      year (1980-2079; see above for two-digit years)
  5053. HourNr%      hour (0-23)
  5054. MinuteNr%    minute (0-59)
  5055. SecondNr%    second (0-59; if odd, rounded down to even number)
  5056. -------
  5057. MonthNr%     -1 if there was an error, else unchanged
  5058.  
  5059. Name  : SetKbd               (Set Keyboard toggles)
  5060. Class : Input
  5061. Level : Clone
  5062.  
  5063. The SetKbd routine allows you to set the state of any of the
  5064. four keyboard toggles: Insert, Caps lock, Num lock, and Scroll
  5065. Lock.  You can give your input routines a professional touch by
  5066. setting this toggles instead of making the user remember to do
  5067. so.
  5068.  
  5069. It's considered proper to restore the original keyboard toggles
  5070. before your program exits, unless of course the purpose of the
  5071. program is to leave the toggles in a particular state!  The
  5072. GetKbd routine can be used in conjunction with SetKbd to do
  5073. this.
  5074.  
  5075.    CALL SetKbd (Insert%, Caps%, Num%, Scrl%)
  5076.  
  5077. Insert%    whether to turn on "insert" mode (0 if no)
  5078. Caps%      whether to turn on "caps lock" (0 if no)
  5079. Num%       whether to put the keypad into numeric mode (0 no)
  5080. Scrl%      whether to turn on "scroll lock" (0 if no)
  5081.  
  5082. Name  : SetMatI              (Set Matrix to Integer)
  5083. Class : Numeric
  5084. Level : Any
  5085.  
  5086. This routine sets as many elements of an integer array as you
  5087. like, starting at a specified place in the array.  A good use
  5088. for it is to initialize an array (or a portion of it) to a
  5089. given value.
  5090.  
  5091.    CALL SetMatI (DSeg%, DOfs%, Elements%, Value%)
  5092.  
  5093. DSeg%      segment of the first array element to add
  5094. DOfs%      offset of the first array element to add
  5095. Elements%  number of array elements to which to add
  5096. Value%     value to which to set each array element
  5097.  
  5098. Name  : SetMouseLoc          (Set Mouse Location)
  5099. Class : Mouse
  5100. Level : BIOS
  5101.  
  5102. This routine allows you to set the current location of the
  5103. mouse cursor.  It doesn't matter if the cursor is visible or
  5104. invisible.  SetMouseLoc is only for use in text mode.
  5105.  
  5106. This routine will not work properly if there is no mouse
  5107. available.  Use the MMCheck routine if you are not sure.
  5108.  
  5109. See also MMSetLoc, which is for use in graphics modes.
  5110.  
  5111.    CALL SetMouseLoc (Row%, Column%)
  5112.  
  5113. Row%       mouse cursor row
  5114. Column%    mouse cursor column
  5115.  
  5116. Name  : SetPrtAddr           (Set Printer Address)
  5117. Class : Printer
  5118. Level : Clone
  5119.  
  5120. This routine allows you to set the base port address of a
  5121. parallel port.
  5122.  
  5123. One use for this routine is to fool BASIC into using a
  5124. different port than LPT1 for LPRINT.  See also PRTSWAP.
  5125.  
  5126. Note that PS/2 systems only have ports 1-3 available.  They use
  5127. the fourth port data area for holding other information.  It
  5128. may be a good idea to restrict yourself to ports 1-3 for
  5129. compatibility purposes, although other computers allow ports
  5130. 1-4.
  5131.  
  5132. Don't forget to set the ports back to their original values
  5133. before your program ends!
  5134.  
  5135.    CALL SetPrtAddr (PortNr%, PortAddr%)
  5136.  
  5137. PortNr%     LPT port number (1-4 or 1-3 [see above])
  5138. PortAddr%   port address
  5139.  
  5140. Name  : SetSub               (Set default Subdirectory)
  5141. Class : Disk
  5142. Level : DOS
  5143.  
  5144. Just like the DOS CD (or CHDIR) command, this routine allows
  5145. you to change the current subdirectory.  Unlike the
  5146. corresponding DOS command, you may not use a period or double
  5147. period as shorthand for a directory.  However, you may specify
  5148. either an absolute or relative path, as usual, and can also use
  5149. either slashes or backslashes as delimiters.
  5150.  
  5151.    CALL SetSub (SubDir$, ErrCode%)
  5152.  
  5153. SubDir$    subdirectory name
  5154. -------
  5155. ErrCode%   error code: 0 if no error, else a DOS Error number
  5156.  
  5157. Name  : SetTimeAT            (Set Time of AT clock)
  5158. Class : Time
  5159. Level : BIOS (AT)
  5160.  
  5161. This routine sets the time to the hardware real-time clock in
  5162. AT-class computers.  Depending on the DOS version, this time
  5163. may be partially or completely independent of the time kept by
  5164. DOS in software.  DOS always reads the time from the hardware
  5165. clock when it starts up.  However, use of the TIME command in
  5166. DOS (and the TIME$ function in QuickBASIC) may relate only to
  5167. the software copy of the time, which is not always guaranteed
  5168. to be the same as the time in the hardware clock due to certain
  5169. discrepancies in DOS.
  5170.  
  5171.    CALL SetTimeAT (HourNr%, MinuteNr%, SecondNr%)
  5172.  
  5173. HourNr%      hour (0-23)
  5174. MinuteNr%    minute
  5175. SecondNr%    second
  5176.  
  5177. Name  : SetVerify            (Set Verify state)
  5178. Class : Disk
  5179. Level : DOS
  5180.  
  5181. The SetVerify routine allows you to set the state of the DOS
  5182. VERIFY flag. When VERIFY is on, some checking is done to make
  5183. sure that writing to the disk works as requested.  The checks
  5184. are not very good, however, and VERIFY slows down disk
  5185. handling, so it is usually better to have VERIFY off.
  5186.  
  5187.    CALL SetVerify (VerifyOn%)
  5188.  
  5189. VerifyOn%   whether to turn VERIFY on (0 if no)
  5190.  
  5191. Name  : SetVGAColor          (Set VGA Color)
  5192. Class : Display
  5193. Level : BIOS
  5194.  
  5195. This routine sets the color associated with a given color
  5196. number.  The color is specified as a combination of red, green,
  5197. and blue intensities.  Each intensity may range from off (0) to
  5198. very bright (63).
  5199.  
  5200.    CALL SetVGAColor (ColorNr%, Red%, Green%, Blue%)
  5201.  
  5202. ColorNr%   color number (1-16 or 1-255, depending on VGA mode)
  5203. Red%       red intensity (0-63)
  5204. Green%     green intensity (0-63)
  5205. Blue%      blue intensity (0-63)
  5206.  
  5207. Name  : SFRead               (String File Read)
  5208. Class : Disk / String
  5209. Level : DOS
  5210.  
  5211. This routine reads a string from a file that was opened by
  5212. FOpen1 or FCreate. The length of the string you provide
  5213. determines how many characters should be read.  If it wasn't
  5214. possible to read all the characters desired, an error code will
  5215. be returned and the BytesRead% value will tell you how many
  5216. characters were actually retrieved.
  5217.  
  5218.    St$ = SPACE$(BytesToRead%)
  5219.    CALL SFRead (Handle%, St$, BytesRead%, ErrCode%)
  5220.  
  5221. Handle%     handle of the file from which to read
  5222. -------
  5223. St$         data read from the file.  Init to # of chars wanted
  5224. BytesRead%  number of bytes read from the file (if error)
  5225. ErrCode%    error code: 0 if no error, else DOS Error
  5226.  
  5227. Name  : SFWrite              (String File Write)
  5228. Class : Disk / String
  5229. Level : DOS
  5230.  
  5231. This routine writes a string to a file that was opened by
  5232. FOpen1 or FCreate.  The length of the string you provide
  5233. determines how many characters will be written.  If it wasn't
  5234. possible to write the entire string to the file, an error code
  5235. will be returned and the BytesWrit% value will tell you how
  5236. many characters were actually written.
  5237.  
  5238.    CALL SFWrite (Handle%, St$, BytesWrit%, ErrCode%)
  5239.  
  5240. Handle%     handle of the file to which to write
  5241. St$         data to write to the file.
  5242. -------
  5243. BytesWrit%  number of bytes written to the file (if error)
  5244. ErrCode%    error code: 0 if no error, else DOS Error
  5245.  
  5246. Name  : ShiftL               (Shift Left)
  5247. Class : Numeric
  5248. Level : Any
  5249.  
  5250. This routine shifts the bits in an integer left by a desired
  5251. amount.  The effect of this is similar to multiplying the
  5252. number by a power of two, if the number is positive, but is
  5253. much faster.
  5254.  
  5255.    CALL ShiftL (Value%, Count%)
  5256.  
  5257. Value%    number to shift left
  5258. Count%    bits by which to shift
  5259. -------
  5260. Value%    shifted number
  5261.  
  5262. Name  : ShiftR               (Shift Right)
  5263. Class : Numeric
  5264. Level : Any
  5265.  
  5266. This routine shifts the bits in an integer right by a desired
  5267. amount.  The effect of this is similar to dividing the number
  5268. by a power of two, if the number is positive, but is much
  5269. faster.
  5270.  
  5271.    CALL ShiftR (Value%, Count%)
  5272.  
  5273. Value%    number to shift right
  5274. Count%    bits by which to shift
  5275. -------
  5276. Value%    shifted number
  5277.  
  5278. Name  : ShlSt                (Shift Left String of bits)
  5279. Class : String
  5280. Level : Any
  5281.  
  5282. This routine shifts the bits in a string left by a desired
  5283. amount.  This may be helpful for manupulating strings
  5284. containing bit flags, images, et al.
  5285.  
  5286.    CALL ShlSt (St$, Count%)
  5287.  
  5288. St$       string to shift left
  5289. Count%    bits by which to shift
  5290. -------
  5291. St$       shifted string
  5292.  
  5293. Name  : ShrSt                (Shift Right String of bits)
  5294. Class : String
  5295. Level : Any
  5296.  
  5297. This routine shifts the bits in a string right by a desired
  5298. amount.  This may be helpful for manupulating strings
  5299. containing bit flags, images, et al.
  5300.  
  5301.    CALL ShrSt (St$, Count%)
  5302.  
  5303. St$       string to shift right
  5304. Count%    bits by which to shift
  5305. -------
  5306. St$       shifted string
  5307.  
  5308. Name  : SortI                (Sort Integer)
  5309. Class : Array management
  5310. Level : Any
  5311.  
  5312. This routine sorts the elements in an array of integers.
  5313.  
  5314. The array is assumed to start at element 1.  You may specify
  5315. the last element in the array, allowing you to sort only part
  5316. of an array if you like.
  5317.  
  5318. If you would like the results to be largest-to-smallest, rather
  5319. than smallest-to-largest, just call ReverseI after this routine.
  5320.  
  5321.    CALL SortI (Array%(), Elements%)
  5322.  
  5323. Array%()    array to be sorted
  5324. Elements%   number of elements in array
  5325. -------
  5326. Array%()    sorted array
  5327.  
  5328. Name  : Soundex              (Soundex code)
  5329. Class : String
  5330. Level : Any
  5331.  
  5332. This is a string comparison routine which returns a code that
  5333. is loosely based on the "sound" of a word.  It removes the
  5334. vowels and repeated characters from a word, then converts it
  5335. into a numeric code.  Any words with the same code are
  5336. considered to sound alike.
  5337.  
  5338. While not perfect, this algorithm does a fast and reasonably
  5339. good job.  It can be helpful in applications like spelling
  5340. checkers and phone books, where a search based on exact text
  5341. may not be appropriate.
  5342.  
  5343.    Code$ = St$
  5344.    CALL Soundex (St$, Code$, CodeLen%)
  5345.    Code$ = LEFT$(St$, CodeLen%)
  5346.  
  5347. St$       string to be encoded
  5348. -------
  5349. Code$     result code.  Init to >= length of original string.
  5350. CodeLen%  length of the result code
  5351.  
  5352. Name  : SpeedKey             (Speed up Keyboard)
  5353. Class : Input
  5354. Level : BIOS (AT)
  5355.  
  5356. This routine provides control over the keyboard repeat rate for
  5357. AT-class machines.  Increasing the repeat rate can make the
  5358. computer seem a lot more responsive and pleasant to deal with.
  5359.  
  5360.   RepDelay%   Delay Time
  5361.      0        250 milliseconds
  5362.      1        500 ms
  5363.      2        750 ms
  5364.      3        1 second
  5365.  
  5366.   RepRate% is the key repeat rate, 0-31 (from around 30 cps to
  5367.   around 2 cps)
  5368.  
  5369.    CALL SpeedKey (RepDelay%, RepRate%)
  5370.  
  5371. RepDelay%   delay before starting to repeat (0-3, default 1)
  5372. RepRate%    rate at which to repeat key (0-31, default 11)
  5373.  
  5374. Name  : Split                (Split screen image)
  5375. Class : Display
  5376. Level : Clone
  5377.  
  5378. This provides an elegant way to clear a text-mode screen.  It
  5379. splits the display into four parts, scrolling each part up or
  5380. down until it slides off the screen.
  5381.  
  5382.    CALL Split
  5383.  
  5384. Name  : Spooler              (check for print Spooler)
  5385. Class : Printer
  5386. Level : DOS
  5387.  
  5388. The Spooler routine allows you to see whether the print spooler
  5389. (installed by the DOS PRINT utility) is available.
  5390.  
  5391.    CALL Spooler (Status%)
  5392.  
  5393. -------
  5394. Status%   spooler status:
  5395.              -1   it's installed
  5396.               0   it isn't installed, but can be
  5397.               1   it isn't installed, and can't be
  5398.  
  5399. Name  : StrDel               (String Delete)
  5400. Class : String
  5401. Level : Any
  5402.  
  5403. StrDel deletes a character from a string.  Actually, it doesn't
  5404. make the string any shorter, but it acts like a delete.  The
  5405. end of the string is filled with a space.
  5406.  
  5407.    CALL StrDel (St$, Posn%)
  5408.  
  5409. St$       string from which to delete a character
  5410. Posn%     position of the character to delete (1-LEN(St$))
  5411. -------
  5412. St$       processed string
  5413.  
  5414. Name  : StrIns               (String Insert)
  5415. Class : String
  5416. Level : Any
  5417.  
  5418. StrIns inserts a space into a string.  Actually, it doesn't
  5419. make the string any longer, but it acts like an insert.  The
  5420. former end of the string is discarded.
  5421.  
  5422.    CALL StrIns (St$, Posn%)
  5423.  
  5424. St$       string in which to insert a space
  5425. Posn%     where to insert the space (1-LEN(St$))
  5426. -------
  5427. St$       processed string
  5428.  
  5429. Name  : StripBlanks          (Strip Blanks)
  5430. Class : String
  5431. Level : Any
  5432.  
  5433. This routine strips leading and/or trailing white space from a
  5434. string.  This includes control characters as well as blanks
  5435. (anything below CHR$(33)).
  5436.  
  5437. See also StripSpaces.
  5438.  
  5439.    CALL StripBlanks (St$, Which%, StLen%)
  5440.    St$ = LEFT$(St$, StLen%)
  5441.  
  5442. St$      string to process
  5443. Which%   1: strip left, 2: strip right, 3: strip left and right
  5444. -------
  5445. St$      processed string
  5446. StLen    length of processed string
  5447.  
  5448. Name  : StripChar            (Strip Characters)
  5449. Class : String
  5450. Level : Any
  5451.  
  5452. This routine strips all occurrences of a given list of
  5453. characters out of a string.  Among the uses for this are
  5454. cleaning up user-entered values.  For instance, a strip list of
  5455. "$," would remove commas and dollar signs from a number, and
  5456. "()- " will remove telephone delimiters.
  5457.  
  5458.    CALL StripChar (St$, StripList$, StLen%)
  5459.    St$ = LEFT$(St$, StLen%)
  5460.  
  5461. St$         string to process
  5462. StripList$  characters to remove from the string
  5463. -------
  5464. St$         processed string
  5465. StLen%      length of processed string
  5466.  
  5467. Name  : StripRange           (Strip Range of characters)
  5468. Class : String
  5469. Level : Any
  5470.  
  5471. This routine strips an inclusive range of characters out of a
  5472. string.  The range is specified as the first and last ASCII
  5473. codes to strip.  For instance, using a low character of "0" and
  5474. a high of "9" would remove all digits from a string.
  5475.  
  5476.    CALL StripRange (St$, ASC(LowChar$), ASC(HighChar$), StLen%)
  5477.    St$ = LEFT$(St$, StLen%)
  5478.  
  5479. St$         string to process
  5480. LowChar$    lowest character to strip
  5481. HighChar$   highest character to strip
  5482. -------
  5483. St$         processed string
  5484. StLen%      length of processed string
  5485.  
  5486. Name  : StripSpaces          (Strip Spaces)
  5487. Class : String
  5488. Level : Any
  5489.  
  5490. This routine strips leading and/or trailing spaces from a
  5491. string.
  5492.  
  5493. See also StripBlanks.
  5494.  
  5495.    CALL StripSpaces (St$, Which%, StLen%)
  5496.    St$ = LEFT$(St$, StLen%)
  5497.  
  5498. St$      string to process
  5499. Which%   1: strip left, 2: strip right, 3: strip left and right
  5500. -------
  5501. St$      processed string
  5502. StLen%   length of processed string
  5503.  
  5504. Name  : SubExist             (Subdirectory Existence)
  5505. Class : Disk
  5506. Level : DOS
  5507.  
  5508. This routine lets you see if a given drive and/or subdirectory
  5509. actually exists.
  5510.  
  5511.    CALL SubExist (SubDir$, Found%)
  5512.  
  5513. SubDir$   name of the path to check
  5514. -------
  5515. Found%    whether the path exists (0 if no, -1 if yes)
  5516.  
  5517. Name  : Time2Int             (Time to Integer)
  5518. Class : Time
  5519. Level : Any
  5520.  
  5521. This routine compresses a time into a single integer.  Note
  5522. that this integer is not in a format that lends itself to
  5523. simple computation-- you cannot subtract one from another to
  5524. find out the length of time between them.  If that's what you
  5525. want, try the Elapsed routine.
  5526.  
  5527. Note that odd numbers of seconds will be rounded down to the
  5528. previous even number.  This is a result of the storage format
  5529. used.
  5530.  
  5531.    CALL Time2Int (HourNr%, MinuteNr%, SecondNr%, IntTimeNr%)
  5532.  
  5533. HourNr%      hour (0-23)
  5534. MinuteNr%    minute
  5535. SecondNr%    second
  5536. -------
  5537. IntTime%     time compressed into an integer
  5538.  
  5539. Name  : TimeN2S              (Time Numbers to String)
  5540. Class : Time
  5541. Level : Any / DOS
  5542.  
  5543. Many of the PBBack routines return the time as a set of
  5544. numbers.  This routine provides an easy way to convert those
  5545. numbers into string form.  The time format used (whether
  5546. seconds are included) will be based on the length of the string
  5547. which you pass to the routine.  For instance, a string like
  5548. "xx:xx" would return a time like "21:35", whereas "xx:xx:xx"
  5549. would return "21:35:08".
  5550.  
  5551.    TimeSt$ = "xx:xx:xx"
  5552.    CALL TimeN2S (HourNr%, MinuteNr%, SecondNr%, TimeSt$)
  5553.  
  5554. HourNr%     hour (0-23)
  5555. MinuteNr%   minute
  5556. SecondNr%   second
  5557. -------
  5558. TimeSt$     time string.  Init to 5 or 8 characters (see above).
  5559.  
  5560. Name  : TimeS2N              (Time String to Numbers)
  5561. Class : Time
  5562. Level : Any
  5563.  
  5564. Many of the PBBack routines need to be passed the time as a set
  5565. of numbers. This routine provides an easy way to convert a time
  5566. from string form into numbers.  You may use either "xx:xx:xx"
  5567. or "xx:xx" form to specify the time (the string length is
  5568. important, but the delimiter and contents of the string are
  5569. ignored).  If the 5-character short form is used, the Second%
  5570. value will be zero.
  5571.  
  5572.    CALL TimeS2N (HourNr%, MinuteNr%, SecondNr%, TimeSt$)
  5573.  
  5574. TimeSt$     time string.  Init to 5 or 8 characters (see above).
  5575. -------
  5576. HourNr%     hour (0-23)
  5577. MinuteNr%   minute
  5578. SecondNr%   second (0 if 5-char format)
  5579.  
  5580. Name  : TInstr               (Typed INSTR)
  5581. Class : String
  5582. Level : Any
  5583.  
  5584. As you might guess from the "Instr" part of the name, this
  5585. routine searches a string.  Instead of searching for a specific
  5586. character or substring, though, it looks for a specific type of
  5587. character-- letters, numbers, control codes, or whatever.  You
  5588. can search for the first of a combination of types, too, which
  5589. also allows searching for "anything but" a specific type.
  5590.  
  5591. The character type code is specified by adding any of the
  5592. following:
  5593.  
  5594.     1    alphabetic
  5595.     2    numeric
  5596.     4    symbolic
  5597.     8    control
  5598.    16    graphics
  5599.    32    space
  5600.  
  5601. The TInstr routine is handy for parsing and cleaning up user
  5602. input, among other uses.
  5603.  
  5604.    CALL TInstr (St$, ChrType%, Place%)
  5605.  
  5606. St$          string to search
  5607. ChrType%     type of character(s) to search for
  5608. -------
  5609. Place%       position of first char of desired type, or 0
  5610.  
  5611. Name  : TypeIn               (Type In)
  5612. Class : Input
  5613. Level : Clone
  5614.  
  5615. This is an unusual routine which combines both output and
  5616. input.  It sends a string to the keyboard buffer, where it acts
  5617. as if it had been typed in by someone.  The string may be up to
  5618. 15 key codes in length (anything past 15 keys will be ignored,
  5619. due to the limited length of the keyboard buffer).
  5620.  
  5621. Normal keys can be put into the string simply as characters.
  5622. Extended keys, like Alt-key combinations, arrow keys, and
  5623. function keys, must be encoded as CHR$(0) + CHR$(ScanCode),
  5624. where the ScanCode is the key's scan code.  You can look up
  5625. such scan codes in your BASIC manual or use GetKey to find out
  5626. what they are.  Extended keys, although apparently taking up
  5627. two characters, only take up one space in the keyboard buffer.
  5628. The TypeIn routine allows for this fact.
  5629.  
  5630. Among other things, this routine can be used to provide default
  5631. answers to input routines, or to execute another program once
  5632. your program exits.
  5633.  
  5634.    CALL TypeIn (St$)
  5635.  
  5636. St$     keys to be "typed" into the keyboard buffer
  5637.  
  5638. Name  : UnCalcAttr           (Undo Calculated Attribute)
  5639. Class : Display
  5640. Level : Any
  5641.  
  5642. Many of the display routines in this library require an
  5643. "attribute" rather than foreground and background colors.  An
  5644. attribute is a combination of the foreground and background
  5645. colors in a format which is used by all types of displays when
  5646. in text mode.  The UnCalcAttr routine allows you to decode the
  5647. original colors given the attribute.
  5648.  
  5649. Foreground colors are usually specified as 0-31, with
  5650. backgrounds as 0-7.  If you turn blinking off (see Blink), it
  5651. may be more convenient to express the same thing as foreground
  5652. 0-15, background 0-15.  The CalcAttr routine will accept either
  5653. way of expressing it.
  5654.  
  5655. Note, however, that UnCalcAttr will always return the former
  5656. pair of results, since it has no way of knowing whether Blink
  5657. has been used (foreground 0-31, background 0-15).  The below
  5658. routine shows how to get around this, if needed.
  5659.  
  5660.    CALL UnCalcAttr (Foreground%, Background%, VAttr%)
  5661.    ' the following is optional and may not be desired...
  5662.    ' it converts colors to "no blink" equivalents (see above)
  5663.    IF Foreground% AND 16 THEN _
  5664.       Foreground% = Foreground% - 16: _
  5665.       Background% = Background% + 8
  5666.  
  5667. VAttr%        color "attribute"
  5668. -------
  5669. Foreground%   foreground color
  5670. Background%   background color
  5671.  
  5672. Name  : UnSCrunch            (Undo Screen Crunch)
  5673. Class : Display
  5674. Level : Any
  5675.  
  5676. This routine is designed to be used in conjunction with ScrRest
  5677. and the other routines which restore an entire 80x25 text
  5678. screen from an array.  It expands screens that were compressed
  5679. by Scrunch to their full original size. The uncompression
  5680. algorithm is very fast and will not take any noticeable amount
  5681. of time for most purposes.
  5682.  
  5683. The array must be large enough to hold an 80x25 screen-- 4,000
  5684. bytes, or 2,000 integers: DIM FullScreen%(2000) will do it.
  5685.  
  5686.    CALL UnSCrunch (DSeg%, DOfs%, CSeg%, COfs%)
  5687.  
  5688. DSeg%     segment of array in which to store expanded image
  5689. DOfs%     offset of array in which to store expanded image
  5690. CSeg%     segment of the compressed image
  5691. COfs%     offset of the compressed image
  5692.  
  5693. Name  : Upcase               (Uppercase)
  5694. Class : String
  5695. Level : Any
  5696.  
  5697. This routine, like BASIC's UCASE$ function (in some versions),
  5698. converts a string to uppercase.  Since it doesn't have to
  5699. create a new return string (a fairly slow process), it's faster
  5700. than the BASIC equivalent, and it works in any version of
  5701. BASIC.
  5702.  
  5703. The Upcase routine is designed for the U.S. character set.  If
  5704. your program is intended for distribution, you would be well
  5705. advised to use Upcase1 instead, as it supports international
  5706. character sets.
  5707.  
  5708.    CALL Upcase (St$)
  5709.  
  5710. St$     string to be capitalized
  5711. -------
  5712. St$     capitalized string
  5713.  
  5714. Name  : Upcase1              (Uppercase)
  5715. Class : String
  5716. Level : DOS
  5717.  
  5718. This routine, like BASIC's UCASE$ function (in some versions),
  5719. converts a string to uppercase. It converts letters in the
  5720. extended character set as well as the usual letters, making it
  5721. well suited for text which may not be in English.
  5722.  
  5723. Note that DOS 5.0 is required for optimal performance.  With
  5724. older DOS versions, this routine makes assumptions about the
  5725. character set which may not be appropriate.
  5726.  
  5727.    CALL Upcase1 (St$)
  5728.  
  5729. St$     string to be capitalized
  5730. -------
  5731. St$     capitalized string
  5732.  
  5733. Name  : UpdTVScreen          (Update TopView Screen)
  5734. Class : Display
  5735. Level : BIOS
  5736.  
  5737. UpdTVScreen tells a TopView-compatible multitasker to update
  5738. the screen using a specified screen buffer (use GetTVScreen to
  5739. get the buffer location).  Some multitaskers will do this
  5740. automatically, but some won't.  It's safe to use this routine
  5741. either way.
  5742.  
  5743. See also GetDView, GetTView, GetTVScreen.
  5744.  
  5745.    CALL UpdTVScreen (DSeg%, DOfs%)
  5746.  
  5747. DSeg%       segment of screen buffer
  5748. DOfs%       offset of screen buffer
  5749.  
  5750. Name  : VGARest13            (VGA Restore for SCREEN 13)
  5751. Class : Display
  5752. Level : Clone
  5753.  
  5754. This routine allows you to restore a SCREEN 13 (VGA, 320x200,
  5755. 256 color) display that was saved using VGASave13 (see).
  5756.  
  5757.    CALL VGARest13 (DSeg%, DOfs%)
  5758.  
  5759. DSeg%        segment of storage array
  5760. DOfs%        offset  of storage array
  5761.  
  5762. Name  : VGASave13            (VGA Save of SCREEN 13)
  5763. Class : Display
  5764. Level : Clone
  5765.  
  5766. This routine allows you to save a SCREEN 13 (VGA, 320x200, 256
  5767. color) display that can be restored using VGARest13 (see).
  5768.  
  5769. The array used to hold the screen must contain 64,000 bytes.
  5770. For an integer array, this means that you must create the array
  5771. by DIM Array%(1 TO 32000).
  5772.  
  5773.    CALL VGASave13 (DSeg%, DOfs%)
  5774.  
  5775. DSeg%        segment of storage array
  5776. DOfs%        offset  of storage array
  5777.  
  5778. Name  : WeekDay0             (Week Day)
  5779. Class : Time
  5780. Level : DOS
  5781.  
  5782. This routine tells you what the day of the week is, just the
  5783. thing for calendar programs and whatnot.  The day is returned
  5784. as a number from 1-7, which identifies a day from Sunday
  5785. through Saturday.
  5786.  
  5787.    CALL WeekDay0 (DayNr%)
  5788.  
  5789. -------
  5790. DayNr%     current day
  5791.  
  5792. Name  : WinCheck             (Windows Check)
  5793. Class : Equipment
  5794. Level : BIOS
  5795.  
  5796. The WinCheck routine tells you what version of Microsoft
  5797. Windows is in use, if any.  It returns the results as two
  5798. integers containing the major and minor version numbers.  For
  5799. instance, Windows 3.0 would return a major number of 3, minor
  5800. 0.  Windows/386 v2.x will be identified as 2.0.  If Windows is
  5801. not running, 0.0 will be returned.  NOTE that this routine is
  5802. not able to detect Windows 1.x versions!
  5803.  
  5804.    CALL WinCheck (MajorV%, MinorV%)
  5805.  
  5806. -------
  5807. MajorV%   major part of the Windows version
  5808. MinorV%   minor part of the Windows version
  5809.  
  5810. Name  : WriteBitF            (Write Bit Field)
  5811. Class : Numeric
  5812. Level : Any
  5813.  
  5814. This routine allows you to set an element of a virtual array.
  5815. The actual array can be any numeric type, as it is just being
  5816. used as a storage area. The virtual array is composed of
  5817. numbers of a bit length that you specify (1-8).  This provides
  5818. efficient storage for numbers which have a limited range.
  5819.  
  5820. Here's how you DIM the actual array, assuming an integer array
  5821. is used:
  5822.    DIM Array%(1 TO (VirtElements * VirtBits + 15) \ 16)
  5823.  
  5824. "VirtElements" is the number of elements in the virtual array
  5825. and "VirtBits" is the number of bits per element.
  5826.  
  5827. See also ReadBitF.
  5828.  
  5829.    CALL WriteBitF (DSeg%, DOfs%, ElementNr%, BitLen%, Value%)
  5830.  
  5831. DSeg%        segment of actual array
  5832. DOfs%        offset of actual array
  5833. ElementNr%   virtual element number (starts at 0)
  5834. BitLen%      bits per virtual element (1-8)
  5835. Value%       value to set element to (range depends on BitLen%)
  5836.  
  5837. Name  : Xlate                (Translate)
  5838. Class : String
  5839. Level : Any
  5840.  
  5841. The Xlate routine allows for translating a string, character by
  5842. character, very quickly.  It uses a translation table that you
  5843. provide.  This table is 256 bytes long, one byte for each
  5844. character in the ASCII table.  The translation is done by
  5845. position-- for instance, if the original character was "A"
  5846. (ASCII 65), the translated character will be whatever is in the
  5847. translation table at position 66.  Why 66, when "A" is 65?
  5848. Because ASCII runs from 0-255, but the translation string is
  5849. 1-256: everything is one higher in the string than the ASCII
  5850. character it represents.
  5851.  
  5852. Translation capabilities are handy in communications software.
  5853. They can also be used in other things.  One simple use would be
  5854. to set up a translation table where all lowercase characters
  5855. would be converted to uppercase.  You might ask why, since
  5856. BASIC has a UCASE$ function (in later versions, anyway) and
  5857. PBBack has an Upcase routine. Well, Upcase is faster than
  5858. UCASE$, since it doesn't have to create a return string; but
  5859. Xlate would be even faster, since it translates every character
  5860. directly instead of deciding whether it's a lowercase letter!
  5861.  
  5862. Simple encoding, WordStar file decryption, string reversal,
  5863. uppercase / lowercase conversion, and many other things can be
  5864. done with Xlate.
  5865.  
  5866. Remember to initialize all 256 characters in the translation
  5867. table!
  5868.  
  5869.    CALL Xlate (St$, XlateTable$)
  5870.  
  5871. St$          string to translate
  5872. XlateTable$  translation table
  5873. -------
  5874. St$          translated string
  5875.  
  5876. Name  : XMPrint              (Translate and MS-DOS Print)
  5877. Class : Display
  5878. Level : DOS
  5879.  
  5880. A combination of the Xlate and DMPrint routines, this 'un
  5881. allows you to display using DOS services while being able to
  5882. translate or screen out characters.  Each character of the
  5883. string to display is passed through a translation table you
  5884. provide (256 bytes, where each position corresponds directly to
  5885. the ASCII code of the same number [0-255]).  If the result is
  5886. 0, the character is not displayed.  Otherwise, the translated
  5887. character is displayed using DOS display services.  The new
  5888. cursor position is returned so you can inform BASIC about it.
  5889.  
  5890. Note that the new cursor position may not be accurate!  Some
  5891. ANSI drivers do not update the BIOS cursor position info, in
  5892. which case the results won't be useful.  That's a hazard of
  5893. using DOS output.
  5894.  
  5895.    CALL XMPrint (St$, XlateTable$, Row%, Column%)
  5896.    LOCATE Row%, Column%
  5897.  
  5898. St$          string to display
  5899. XlateTable$  translation table
  5900. -------
  5901. Row%         current row
  5902. Column%      current column
  5903.  
  5904. Name  : XorSt                (XOR String)
  5905. Class : String
  5906. Level : Any
  5907.  
  5908. This routine XORs each byte in one string with the
  5909. corresponding byte in a second string.  The strings must be the
  5910. same length.
  5911.  
  5912.    CALL XorSt (St1$, St2$)
  5913.  
  5914. St1$      string to XOR
  5915. St2$      string to XOR with
  5916. -------
  5917. St1$      result
  5918.  
  5919. Name  : XQPrint              (Extended Quick Print)
  5920. Class : Display
  5921. Level : Clone
  5922.  
  5923. This routine provides a rather crude, but very fast, display
  5924. capability.  It works like the PRINT statement in BASIC, except
  5925. that it doesn't move the cursor or process control codes.  It
  5926. works only in text modes.
  5927.  
  5928. See also QPrint, a slightly less flexible (but even faster)
  5929. routine.
  5930.  
  5931.    CALL XQPrint (St$, Row%, Column%, VAttr%, Page%, Fast%)
  5932.  
  5933. St$       string to display
  5934. Row%      starting row
  5935. Column%   starting column
  5936. VAttr%    color/attribute (see CalcAttr)
  5937. Page%     display page (unused on MDA/Herc; normally 0)
  5938. Fast%     whether to use fast mode (0 no)
  5939.  
  5940. Name  : XQPrintOver          (Extended Quick Print Overwrite)
  5941. Class : Display
  5942. Level : Clone
  5943.  
  5944. This routine provides a rather crude, but very fast, display
  5945. capability.  It works like the PRINT statement in BASIC, except
  5946. that it doesn't move the cursor or process control codes.  It
  5947. works only in text modes.
  5948.  
  5949. This is a slightly unusual variant on a print routine.  It
  5950. displays all characters except spaces.  If your string contains
  5951. a space, that position on the screen will be skipped.  In other
  5952. words, it acts kind of like an overlay. This can be handy when
  5953. you have text in alternating colors.
  5954.  
  5955. I came up with this routine when I designed a program with a
  5956. function key display at the bottom of the screen-- the names of
  5957. the function keys were one color and the associated definitions
  5958. were another color.  It was obvious that the easiest way of
  5959. handling that would be to use an "overlay" approach.  The
  5960. function key definitions were laid down with XQPrint.  I then
  5961. overlaid the line with the function key names in a different
  5962. color, using XQPrintOver.
  5963.  
  5964. If you need a "solid" space, rather than a "transparent" space,
  5965. use CHR$(255) instead of CHR$(32).
  5966.  
  5967.    CALL XQPrintOver (St$, Row%, Column%, VAttr%, Page%, Fast%)
  5968.  
  5969. St$       string to display
  5970. Row%      starting row
  5971. Column%   starting column
  5972. VAttr%    color/attribute (see CalcAttr)
  5973. Page%     display page (unused on MDA/Herc; normally 0)
  5974. Fast%     whether to use fast mode (0 no)
  5975.  
  5976.