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

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