home *** CD-ROM | disk | FTP | other *** search
/ Monster Media 1994 #1 / monster.zip / monster / PROG_BAS / PBC23A.ZIP / PBCLONE.DOC < prev    next >
Text File  |  1994-03-14  |  54KB  |  1,163 lines

  1.                       The PBClone Library
  2.                     =---------------------=
  3.                           Version 2.3
  4.  
  5.     PBCLONE  Copyright (c) 1990-1994  Thomas G. Hanlin III
  6.  
  7.  
  8.  
  9. Use of LIBWIZ is strongly recommended for creating the initial
  10. PBClone library. You should be able to get this utilities from
  11. the same place you got this library.
  12.  
  13. This is PBClone, a library of over 610 assembly language and
  14. BASIC routines for use with Microsoft's BASIC compilers: Bascom,
  15. PDS, QuickBasic and Visual BASIC for DOS. The PBClone collection
  16. is copyrighted and may be distributed only under the following
  17. conditions:
  18.  
  19.    All PBClone files must be distributed together as a unit.
  20.    No files may be altered, added, or deleted from this unit.
  21.    Assembly language source code may not be distributed.
  22.  
  23. YOU USE THIS LIBRARY AT YOUR OWN RISK. I have tested it on my
  24. own computer, but I will not assume any responsibility for any
  25. problems which PBClone may cause you. If you do run into a
  26. problem, please let me know about it, and I will do my best to
  27. verify and repair it.
  28.  
  29. It is expected that if you find PBClone useful, you will
  30. register your copy. You may not use PBClone routines in programs
  31. intended for sale unless you have registered.
  32.  
  33. Registration gets you the latest version of PBClone, complete
  34. with full source code. The assembly language code is designed
  35. for MASM 6.0 and may require alteration for other assemblers.
  36.  
  37. You will need to have a complete set of PBClone .OBJ files for
  38. LibWiz to work. Create a fresh subdirectory and extract the
  39. BASIC sources from PBC$BAS.ZIP (or .LZH, etc). Compile them all.
  40. The following DOS command will do it:
  41.  
  42.    FOR %x IN (*.BAS) DO BC %x /o;
  43.  
  44. Now extract the .OBJ files from PBC$MAIN.LIB into the same
  45. directory, using the UnLib utility that comes with LibWiz.
  46. Finally, extract the .OBJ files from PBC$NEAR.LIB as well. This
  47. gives you a complete set of .OBJs for PBClone, allowing LibWiz
  48. to create a custom PBClone library for you.
  49.  
  50. The VB-DOS compiler always uses far strings. For it, you must
  51. use the .OBJs from PBC$FAR.LIB instead of PBC$NEAR.LIB.
  52.  
  53. With PDS, you have a choice between near and far strings. To use
  54. far strings, use the /FS switch when compiling, and use the
  55. .OBJs from PBC$FAR.LIB instead of PBC$NEAR.LIB.
  56.  
  57.                       Creating .QLB files
  58.  
  59.  
  60.  
  61. If you like to use the BASIC editor/environment, you will need
  62. to create a .QLB version of the library to complement the .LIB
  63. version. LIBWIZ can do it for you, or you can do it manually.
  64. This is done using the LINK.EXE utility that came with your
  65. compiler. The exact parameters differ slightly depending on
  66. which version of the compiler you have. For QuickBasic, it looks
  67. something like this:
  68.  
  69.    LINK libname.LIB/Q/SE:1024,libname.QLB,NUL,BQLB45;
  70.  
  71. The BQLB45 file is for QuickBasic 4.5. This should be replaced
  72. by BQLB40 or BQLB41 for QuickBasic 4.0 (check your files to see
  73. which you have). For BASCOM 6.0-7.1, also called Professional
  74. Development System or PDS, use QBXQLB instead of BQLB45. For
  75. VB-DOS, use VBDOSQLB instead of BQLB45.
  76.  
  77. Since you'll probably want to do this again in the future when
  78. you get a new version of BasWiz or PBClone, I'd suggest you
  79. create a batch file or alias to do the work for you. If you have
  80. 4DOS, an alias such as the following will do it:
  81.  
  82.    ALIAS QLB LINK %%1.LIB/Q/SE:1024,%%1.QLB,NUL,BQLB45;
  83.  
  84. In this case, you can do the conversion simply by typing:
  85.  
  86.    QLB libname
  87.  
  88.                       The TSR File Viewer
  89.  
  90.  
  91.  
  92. Since there are hundreds of routines in PBClone, it isn't always
  93. exactly easy to remember which routine you want or how to use
  94. it. This is a particular problem when you're in the middle of
  95. writing a program. So, I've written a TSR file viewer... it's
  96. crude, but it gets the job done.
  97.  
  98. Just type "FV" to install the TSR. Alt-V activates it. "FV /D"
  99. removes it from memory.
  100.  
  101.      !!! ----== NOTE ==---- !!!
  102. Please check FV with a nonessential application first! It
  103. appears to work fine in the QuickBasic environment, but it locks
  104. up my favorite editor, so I can't guarantee that it will behave
  105. properly in all circumstances.
  106.  
  107. First, FV will ask you for the file to view. This may contain
  108. drive and subdirectory information as well as the file name.
  109. Second, you will be asked for a search string. If you enter a
  110. search string, viewing will start at the part of the file that
  111. contains that search string. If you just press enter, viewing
  112. will start at the beginning of the file. The file will be
  113. presented to you one page at a time. I suggest viewing
  114. PBCLONE.DOC or PBCLONE.INF.
  115.  
  116. FV was written in BASIC using Crescent's P.D.Q. library, with
  117. the "simplified" TSR handler (which doesn't seem to have been
  118. entirely debugged). Then again, TSRs are a tricky matter,
  119. especially with BASIC...
  120.  
  121.                          General Notes
  122.  
  123.  
  124.  
  125. The initial version of PBClone had only one manual. However,
  126. since there are so many routines, I've split the manual into a
  127. general documentation file and a reference manual. You won't
  128. want to print PBCLONE.MAN unless you have a lot of time and
  129. printer paper! In contrast, this file (PBCLONE.DOC) has been
  130. kept small to allow ready printing. It contains general notes,
  131. cross-reference listings of the routines, and assorted charts.
  132.  
  133. Many of the routines in PBClone are similar to routines of the
  134. same name in ADVBAS and/or ProBas. The key here is "similar"--
  135. they don't necessarily work the same way and may not produce the
  136. same results. If you intend to convert from ADVBAS or ProBas to
  137. PBClone, read the documentation carefully.
  138.  
  139. When a PBClone returns a Boolean (on or off) value, it will
  140. always be 0 if off, -1 if on; this is unlike ProBas, which would
  141. often return any non-zero value for an "on" state. Booleans
  142. passed to PBClone may still use any non-zero value to indicate a
  143. "true" or "on" condition, however.
  144.  
  145. Critical error handling has been incorporated into all disk and
  146. device routines. You will never have to worry about "R>etry,
  147. A>bort, I>gnore" again, so long as you use PBClone for your disk
  148. and device management.
  149.  
  150. PBClone file handling is very flexible but may be confusing to
  151. people used to BASIC's strongly-moded files. PBClone file
  152. handling is most similar to BASIC files opened in BINARY mode.
  153. You may read or write any amount of information at a time. After
  154. each read or write takes place, the file pointer is updated
  155. appropriately, so you can use sequential access techniques
  156. without further effort. Random access is also possible, using
  157. FSetLoc/FSetOfs/FSetRec to set the file pointer position. Those
  158. of you who are familiar with C or Pascal file handling will
  159. notice strong similarities in this approach, which is based on
  160. techniques that have long been standard in the industry.
  161.  
  162. Many routines are available both as SUBprograms and as
  163. FUNCTIONs. The former is for compatibility with older programs
  164. which were designed before BASIC was capable of using FUNCTIONs.
  165. You may use either, of course, although the FUNCTION version of
  166. a routine is often more convenient.
  167.  
  168.                          General Notes
  169.  
  170.  
  171.  
  172. The PBClone library can be used in conjunction with other
  173. libraries. If there is a conflict in routine names between the
  174. two libraries, the OBJTOOL utility can be used to rename one or
  175. the other routine. Due to the large size of PBClone, you will
  176. probably need to select just the routines you need, rather than
  177. combining the entire libraries, in order to avoid overflowing
  178. LINK limitations. OBJTOOL can help you find out which routines
  179. are in what modules. The LIB utility can be used to alter
  180. existing libraries, or you can build your own custom libraries
  181. from the ground up, using LibWiz. See the LIB_BI.DOC and
  182. LIBRARY.TXT files if you are not familiar with libraries.
  183.  
  184. LibMatic, LibWiz and ObjTool are included on the sampler disk
  185. that comes with the registered version of PBClone. They should
  186. also be available at your local BBS.
  187.  
  188. If you have not used ADVBAS, ProBas, or PBClone before, you may
  189. be unfamiliar with the array handling conventions used here. In
  190. almost all array routines, you will see a pair of parameters
  191. (e.g. DSeg% and DOfs%) used to represent an array. These values
  192. are obtained by the BASIC functions VARSEG and VARPTR:
  193.  
  194.    DSeg% = VARSEG(Array(1))    ' or whatever the first...
  195.    DOfs% = VARPTR(Array(1))    ' ...desired element may be
  196.  
  197. This is the way that current versions of QuickBasic and BASCOM
  198. pass arrays, TYPEd values, and fixed-length STRING values to
  199. assembly-language routines. It tells the routine where in memory
  200. to find the value(s). Since these values may move around in
  201. memory, it is important to get the VARSEG and VARPTR just before
  202. you call the routine. Any routine that accepts a segment and an
  203. offset can be used with arrays, TYPEd values, and fixed-length
  204. strings interchangeably. This allows for considerable
  205. flexibility.
  206.  
  207. Virtually all of the variables used in PBClone are integers. In
  208. this manual, integers are indicated specifically by use of the
  209. "%" integer postfix. The use of DEFINT A-Z in your program will
  210. cause your variables to be integers by default, which I would
  211. recommend unless you use floating point heavily.
  212.  
  213.                          General Notes
  214.  
  215.  
  216.  
  217. Most of the routines in ProBas (and all of the routines in
  218. ADVBAS) did not require a DECLARE if the CALL syntax was used.
  219. This is not true of PBClone, which requires DECLAREs. There are
  220. numerous advantages to this:
  221.  
  222.    1) BASIC can more easily detect syntax errors.
  223.    2) You may use CALL or the new simplified syntax.
  224.    3) Many of the routines are smaller and faster due to
  225.       use of the DECLARE option BYVAL.
  226.  
  227. The DECLAREs are generated in a .BI file by LIBWIZ. Assuming you
  228. named the library PBC, you can include the DECLAREs in your
  229. program with this statement:
  230.  
  231.    REM $INCLUDE: 'PBC.BI'
  232.  
  233. The PBC.BI file must be in the same directory as your program,
  234. or you can put it into a specific directory by setting an
  235. environment variable. I keep my include files in a directory
  236. called C:\INCLUDE, so I have the following line in my
  237. AUTOEXEC.BAT:
  238.  
  239.    SET INCLUDE=C:\INCLUDE
  240.  
  241. As mentioned, there are now two ways of calling any subprogram.
  242. You can use the CALL keyword or an implicit call. In the case of
  243. the CopyFile routine, for instance, you could use either of
  244. these calls interchangeably:
  245.  
  246.    CALL CopyFile (FromFile$, ToFile$, ErrCode%)
  247.  
  248.    CopyFile FromFile$, ToFile$, ErrCode%
  249.  
  250. The latter technique is more elegant, to my tastes, and is the
  251. one used throughout the PBClone documentation and examples. You
  252. may use whichever method you prefer-- BASIC generates the same
  253. code either way.
  254.  
  255. How you capitalize the names of the variables and routines is up
  256. to you. I like mixed uppercase and lowercase, but it really
  257. doesn't matter. You can also change the names of the variables
  258. or even replace them with constants, as long as you maintain the
  259. correct type:
  260.  
  261.    COPYfile "C:\AUTOEXEC.BAT", "A:AUTOEXEC.BAT", errornumber%
  262.  
  263.                          General Notes
  264.  
  265.  
  266.  
  267. If you have registered PBClone and wish to reassemble all of the
  268. routines written in assembly language, first place these
  269. routines in their own subdirectory. Then:
  270.  
  271.    FOR %x IN (*.ASM) DO MASM %x ;
  272.  
  273. Note that you will need to use "%%x" instead of "%x" if you
  274. place this statement in a batch file.
  275.  
  276. The .OBJ files created by this process will be compatible with
  277. QuickBasic strings and PDS near strings. If you have PDS and
  278. would like to create a far string version of PBClone, you must
  279. set the FarString label when assembling. Far strings are also
  280. required for the VB-DOS compiler.
  281.  
  282.    FOR %x IN (*.ASM) DO MASM %x /DFarString ;
  283.  
  284. You can most readily create a library from the resulting .OBJ
  285. files by using the LibMatic or LibWiz utilities. Due to the size
  286. of PBClone, manual library creation is not recommended.
  287.  
  288. If you find any bugs or problems with PBClone, or have any
  289. suggestions to make, please let me know. You can reach me
  290. through any of the BBSes listed in WHERE.BBS, or write to me by
  291. conventional mail. Please DO NOT call me directly! I loathe a
  292. ringing phone. Phones were meant for modem use only!
  293.  
  294.                        Routine Reference
  295.  
  296.  
  297.  
  298. Array Management:
  299.    AddMatI       add to each element of an integer array
  300.    AddMatL       add to each element of a long integer array
  301.    BinSeekD      search a sorted array of double-precision nos.
  302.    BinSeekI      search a sorted array of integers
  303.    BinSeekL      search a sorted array of long integers
  304.    BinSeekS      search a sorted array of single-precision nos.
  305.    BinSeekSt     search a sorted array of strings
  306.    DRecDel       delete a record or element from an array
  307.    DRecIns       insert a record or element into an array
  308.    InitPtr       initialize an array of pointers
  309.    MatShuffleD   shuffle an array of double-prec numbers
  310.    MatShuffleI   shuffle an array of integers
  311.    MatShuffleL   shuffle an array of long integers
  312.    MatShuffleS   shuffle an array of single-prec numbers
  313.    MatShuffleSt  shuffle an array of strings
  314.    MeanAverageD  calculate the average of a double-prec. array
  315.    MeanAverageI  calculate the average of an integer array
  316.    MeanAverageL  calculate the average of a long integer array
  317.    MeanAverageS  calculate the average of a single-prec. array
  318.    MulMatI       multiply each element of an integer array
  319.    PSortD        pointer-sort a double-prec. array
  320.    PSortI        pointer-sort an integer array
  321.    PSortL        pointer-sort a long integer array
  322.    PSortS        pointer-sort a single-prec. array
  323.    PSortSt       pointer-sort a string array
  324.    ReverseD      reverse the elements in a double-prec. array
  325.    ReverseI      reverse the elements in an integer array
  326.    ReverseL      reverse the elements in a long integer array
  327.    ReverseS      reverse the elements in a single-prec. array
  328.    ReverseSt     reverse the elements in a string array
  329.    SetMatD       set each element of a double-precision array
  330.    SetMatI       set each element of an integer array
  331.    SetMatL       set each element of a long integer array
  332.    SetMatS       set each element of a single-precision array
  333.    SortD         sort an array of double-precision numbers
  334.    SortI         sort an array of integers
  335.    SortL         sort an array of long integers
  336.    SortS         sort an array of single-precision numbers
  337.    SortSt        sort an array of strings
  338.  
  339.                       Routine Reference
  340.  
  341.  
  342.  
  343. Disk:
  344.    BootDrive$    determine the drive used to boot the computer
  345.    CDROM         see if a CD-ROM is installed and get info
  346.    CheckDisk     see if a disk is ready to be accessed
  347.    CheckDsk%     see if a disk is ready to be accessed
  348.    CheckShare    determine whether SHARE is installed
  349.    CheckShare2%  determine whether SHARE is installed
  350.    Cylinders%    get number of cylinders for a given drive
  351.    DblSpace%     determine whether DBLSPACE is installed
  352.    DelSub        delete a subdirectory
  353.    DiskStat      get information on disk memory
  354.    DReadAbs      read absolute disk sector (drive <32M)
  355.    DReadAbsBig   read absolute disk sector (any size drive)
  356.    DriveSpace&   see how much space is free on a disk
  357.    DrvType       see if a drive is removeable and/or networked
  358.    DWriteAbs     write absolute disk sector (drive <32M)
  359.    DWriteAbsBig  write absolute disk sector (any size drive)
  360.    FDescRead$    read a 4DOS-style file description
  361.    FindFirstF    find the first file to match specs
  362.    FindFirstFx   find the first file to match specs
  363.    FindNextF     find any other files which match specs
  364.    FindNextFx    find any other files which match specs
  365.    Floppies      see how many floppy drives are attached
  366.    Floppies2%    see how many floppy drives are attached
  367.    FloppyType    see what types of floppy drives are installed
  368.    FReadLine     read a line of text from a file (LINE INPUT#)
  369.    GetAttrF      get attribute of a file matched by FindFirstF
  370.    GetAttrFx%    get attribute of a file matched by FindFirstFx
  371.    GetDateF      get date of a file matched by FindFirstF
  372.    GetDateFx$    get date of a file matched by FindFirstFx
  373.    GetDrive$     get the default drive
  374.    GetExecPath   get drive, subdir, name of current program
  375.    GetLabel      get a disk volume label
  376.    GetLogiDrive  get logical drive (useful for 1-floppy setups)
  377.    GetNameF      get the name of a file matched by FindFirstF
  378.    GetNameFx$    get the name of a file matched by FindFirstFx
  379.    GetPath       get the default drive and subdirectory
  380.    GetSerial     get a disk serial number
  381.    GetSizeFL     get the size of a file matched by FindFirstF
  382.    GetSizeFx&    get the size of a file matched by FindFirstFx
  383.    GetSub        get the default subdirectory
  384.    GetSub1       get the default subdirectory on a given drive
  385.    GetTimeF      get the time of a file matched by FindFirstF
  386.    GetTimeFx$    get the time of a file matched by FindFirstFx
  387.    GetVerify     determine status of the DOS "verify" setting
  388.    Heads%        get number of heads for a given drive
  389.    LoadDir       load names of matching files into an array
  390.    LoadDirAll    load all info about matching files into array
  391.    LogicalDrives% see how many logical drives are available
  392.    MakeSub       create a subdirectory
  393.    RenSub        rename a subdirectory
  394.    Retries       set the retries used for file networking
  395.    SDFlush       flush SMARTDRV disk caches
  396.    SDVersion     get SMARTDRV driver version
  397.    SDRCached%    see whether a drive is read cached by SMARTDRV
  398.    SDReset       reset SMARTDRV disk caches
  399.    SDStats       get SMARTDRV cache hit and miss information
  400.    SDWCached%    see whether a drive is write cached by SMARTDRV
  401.    SetDrv        set the default drive
  402.    SetLabel      set a disk volume label
  403.    SetLogiDrive  set logical drive (useful for 1-floppy setups)
  404.    SetPath       set the default drive and subdirectory
  405.    SetSub        set the default subdirectory
  406.    SetVerify     set the state of the DOS "verify" switch
  407.    SubExist      determine whether a subdirectory exists
  408.    SubExist2%    determine whether a subdirectory exists
  409.  
  410.                       Routine Reference
  411.  
  412.  
  413.  
  414. Display:
  415.    BigPrint      display text in huge letters
  416.    BkSpace       backspace destructively with wrap
  417.    BkScroll      scroll an area of the screen down
  418.    Blink         switch blinking vs. intense background colors
  419.    CalcAttr      calc color/attribute from fore & background
  420.    CalcAttr2%    calc color/attribute from fore & background
  421.    CalcSize      calc array size needed to save a screen area
  422.    CalcVGAColor  calculate a VGA palette color setting
  423.    ClearArea     clear an area of the screen w/ special effects
  424.    Clock         display a clock on the screen constantly
  425.    ClockSet      set various parameters for the clock
  426.    ClrCols       clear between specified columns on a row
  427.    ClrEOL        clear to the end of the row
  428.    ClrEOP        clear to the end of the screen
  429.    ClrSOL        clear to the start of the row
  430.    ClrSOP        clear to the start of the screen
  431.    CPrintScreen1 send a SCREEN 1 display to the printer
  432.    CPrintScreen2 send a SCREEN 2 display to the printer
  433.    CursorInfo    return cursor visibility, current & max sizes
  434.    CWindowManC   display pop-up window in CGA graphics mode
  435.    DClear        clear a display being kept in an array
  436.    DClearSS      clear a display of unusual size in an array
  437.    DelChr        delete a character from the screen
  438.    DelLine       delete a row from the screen
  439.    DGClear       clear a CGA virtual screen
  440.    DGetScreen    get an area of the screen into an array
  441.    DGQPrint      write to a CGA virtual screen (SCREEN 1 type)
  442.    DGXQPrint     write to a CGA virtual screen (SCREEN 2 type)
  443.    DGXQPrint1    write to a CGA virtual screen (SCREEN 2 type)
  444.    Dissolve      clear the screen with special effects
  445.    DMPrint       display text directly through DOS services
  446.    DOSClrEol     clear from the cursor to end of line via DOS
  447.    DOSCls        clears the screen using DOS output
  448.    DOSColor      sets the screen color using DOS output
  449.    DOSLocate     sets the cursor position using DOS output
  450.    DPutScreen    put an array onto an area of the screen
  451.    DRecolor      recolor text of a specified color in an array
  452.    DRecolorArea  recolor a block of text in an array
  453.    DScrRest      restore a saved screen from an array
  454.    DScrSave      save a screen to an array or other memory
  455.    DWindowMan    make a pop-up window in an array
  456.    DWindowMan2   pop-up window in an array (definable frames)
  457.    DWindowMan3   pop-up window in an array (array-based parms)
  458.    DWindowMan4   pop-up window in an array (spartan version)
  459.    DXQPrint      write text into an array
  460.    EGARest7      restore a saved screen to EGA SCREEN 7 display
  461.    EGARest8      restore a saved screen to EGA SCREEN 8 display
  462.    EGARest9      restore a saved screen to EGA SCREEN 9 display
  463.    EGASave7      save an EGA SCREEN 7 display to an array
  464.    EGASave8      save an EGA SCREEN 8 display to an array
  465.    EGASave9      save an EGA SCREEN 9 display to an array
  466.  
  467.                       Routine Reference
  468.  
  469.  
  470.  
  471. Display:
  472.    EWindowManC   display pop-up window on EGA/VGA graphics
  473.    EXQPrintC     display text at high speed on EGA/VGA graphics
  474.    FadeOut       clear the screen with special effects
  475.    GetColor      get the current colors being used by BASIC
  476.    GetCRT%       determine whether the display is color or mono
  477.    GetEGA        see if an EGA is in use and get info about it
  478.    GetEGA2%      see if an EGA is in use
  479.    GetHGA%       see if a Hercules mono adapter is in use
  480.    GetLine       get a row of text from virtual or saved screen
  481.    GetRows%      see how many rows are on the screen
  482.    GetScreen     get an area of the screen into an array
  483.    GetVGA        see if a VGA is in use
  484.    GetVGA2%      see if a VGA is in use
  485.    GetVGAColor   get the specified VGA palette setting
  486.    GetVGAPalette get the specified VGA palette settings
  487.    GetVidMode    get display mode and other screen info
  488.    GQPrint       display text quickly in CGA SCREEN 2 mode
  489.    GrafPrint     display sized text at graphics coordinates
  490.    GrafRest      restore a saved CGA graphics screen
  491.    GrafSave      save a CGA graphics screen to an array
  492.    GXQPrint      display text quickly in CGA SCREEN 1
  493.    GXQPrint1     display text quickly in CGA SCREEN 1
  494.    HCls          clear screen in Hercules graphics mode
  495.    HiLite        highlight text on the screen
  496.    HLine         draw a line in Hercules graphics mode
  497.    HMode         switch between text and Herc graphics modes
  498.    HPrint        display text in Hercules graphics mode
  499.    HSetPixel     plot a point in Hercules graphics mode
  500.    HTestPixel    get the color of a point in Herc graphics mode
  501.    InsChr        insert a space onto the screen
  502.    InsLine       insert a blank row onto the screen
  503.    LScroll       scroll an area of the screen left
  504.    MPrint        display text through DOS, obeying MWindow
  505.    MWindow       sets a display region for MPrint
  506.    PrintBox      display a box of characters or strings
  507.    PrintScreen   print the screen on a printer
  508.    PutScreen     put an array onto an area of the screen
  509.    QPrint        display text very quickly
  510.    ReadScreen    read a string from the screen
  511.    ReColor       change text of a selected color to a new color
  512.    ReColorArea   change text in a selected area to a new color
  513.    RScroll       scroll an area of the screen right
  514.    Scroll        scroll an area of the screen up
  515.    ScrRest       restore a saved screen from an array
  516.    ScrSave       save a screen to an array
  517.    SCrunch       compress an 80x25 text screen in an array
  518.    SCrunchSS     compress any size of text screen in an array
  519.    SetCGAColor   set various aspects of CGA colors
  520.    SetVGAColor   set the specified VGA palette info (1 color)
  521.    SetVGAPalette set the specified VGA palette info (1+ colors)
  522.    ShowBMP       display a Windows bitmap file (.BMP)
  523.    ShowIcon      display a Windows icon file (.ICO)
  524.    Split         clear the screen by scrolling different ways
  525.    TypePrint     display text as if it is being typed
  526.  
  527.                       Routine Reference
  528.  
  529.  
  530.  
  531. Display:
  532.    UnCalcAttr    convert color/attribute to fore & background
  533.    UnSCrunch     uncompress a "scrunched" screen (80x25 only)
  534.    UnSCrunchSS   uncompress a "scrunched" screen (any size)
  535.    UnSplit       restore saved screen by scroll. different ways
  536.    VerticalPrint display a string vertically
  537.    VGARest13     restore a saved screen in VGA SCREEN 13 mode
  538.    VGASave13     save a VGA SCREEN 13 display to an array
  539.    WindowMan     display a pop-up window
  540.    WindowMan2    display a pop-up window (user-defined frames)
  541.    WindowMan3    display a pop-up window (array-based parms)
  542.    WindowMan4    display a pop-up window (spartan version)
  543.    XMPrint       display text through DOS after translation
  544.    XQPrint       display text very quickly
  545.    XQPrintOver   quick text display, overlaying existing text
  546.  
  547. Equipment:
  548.    AllExtMem&    see how much extended memory was found at boot
  549.    BootDrive     determine the drive used to boot the computer
  550.    BootDrive2$   determine the drive used to boot the computer
  551.    CDROM         see if a CD-ROM is installed and get info
  552.    CPUSpeed%     get the CPU speed in MHz
  553.    Equipment     find out about basic equipment (ports, memory)
  554.    ExtMem        see how much extended memory is available
  555.    Floppies      see how many floppy drives are available
  556.    Floppies2%    see how many floppy drives are available
  557.    FloppyType    see what types of floppy drives are installed
  558.    Get4DOSv      get installed version of 4DOS, if any
  559.    GetCRT%       determine whether the display is color or mono
  560.    GetDOSv       get the DOS version
  561.    GetEGA        see if an EGA is in use and get info about it
  562.    GetEGA2%      see if an EGA is in use
  563.    GetExtM       see how much extended memory is available
  564.    GetHGA%       see if a Hercules mono adapter is in use
  565.    GetLIMm       see how much expanded memory is available
  566.    GetLIMv       get the EMS driver version
  567.    GetMouseVer   get mouse driver version and hardware info
  568.    GetVGA        see if a VGA is in use
  569.    GetVGA2%      see if a VGA is in use
  570.    GetXMSm       see how much XMS memory is available
  571.    GetXMSv       get the XMS driver version
  572.    KbdType       see if the keyboard is enhanced (101-key)
  573.    KbdType2%     see if the keyboard is enhanced (101-key)
  574.    LogicalDrives% see how many logical drives are available
  575.    MMCheck       see if a mouse is available and # of buttons
  576.    MMCheck2%     see if a mouse is available and # of buttons
  577.    NumProc       see what kind of numeric coprocessor is in use
  578.    NumProc2%     see what kind of numeric coprocessor is in use
  579.    PCDat$        get the date of the ROM BIOS
  580.    PCDate        get the date of the ROM BIOS
  581.    PCType        get the machine I.D. from the ROM BIOS
  582.    PCType2%      get the machine I.D. from the ROM BIOS
  583.    Processor     see what kind of CPU is in use
  584.    Processor2%   see what kind of CPU is in use
  585.    SDVersion     get SMARTDRV driver version
  586.    WinCheck      see what version of Windows is running, if any
  587.  
  588.                       Routine Reference
  589.  
  590.  
  591.  
  592. File:
  593.    BRead         read a byte from a file into an integer
  594.    BWrite        write a byte to a file from an integer
  595.    CloseA        close an archive opened by FindFirstA
  596.    CopyFile      copy a single file
  597.    DelFile       delete a file
  598.    DFRead        read from a file into an array or other mem.
  599.    DFWrite       write to a file from an array or other memory
  600.    Exist         see if a file exists
  601.    Exist2%       see if a file exists
  602.    ExplainFAttr$ return a text explanation of a file attribute
  603.    ExtendFSpec   check, complete, and format a filespec
  604.    FClose1       close a file
  605.    FCreate       create a file and open it for access
  606.    FGetLoc       get the position of a file pointer
  607.    FGetLoc2&     get the position of a file pointer
  608.    FileCopy      copy one or more files
  609.    FileCount     count the number of matching files
  610.    FileCRC       calculate a 32-bit CRC for a file
  611.    FindFirstA    find the first file in an archive
  612.    FindNextA     find any other files in an archive
  613.    FindPatch     find where to patch an .EXE
  614.    FLock         lock any part of a file
  615.    FlushToDisk   flush a file to disk (force it to be updated)
  616.    FOpen1        open a file
  617.    ForceMatch$   force a filename to match a wildcard pattern
  618.    FReadLine     read a line of text from an ASCII file
  619.    FSetEnd       move to the end of a file
  620.    FSetLoc       move to a specific location in a file
  621.    FSetOfs       move backwards or forwards within a file
  622.    FSetRec       move to a specific record location in a file
  623.    FSetSize      set the size of a file
  624.    FSize         get the size of a file
  625.    FSize2&       get the size of a file
  626.    FUnlock       unlock any part of a file (use w/ FLock)
  627.    GetCRCA       get CRC-16 of a file matched by FindFirstA
  628.    GetCRCAL      get CRC-32 of a file matched by FindFirstA
  629.    GetDateA      get date of a file matched by FindFirstA
  630.    GetFAttr      get attribute of a file
  631.    GetFDate      get the date of a file
  632.    GetFSize&     get the size of a file
  633.    GetFTime      get the time of a file
  634.    GetNameA      get the name of a file matched by FindFirstA
  635.    GetSizeAL     get the size of a file matched by FindFirstA
  636.    GetStoreA     get storage type of file matched by FindFirstA
  637.    GetTimeA      get the time of a file matched by FindFirstA
  638.    GLoad         load a binary image from a file (like BLOAD)
  639.    IdentifyFile  try to identify a file
  640.    IRead         read an integer from a file
  641.    IWrite        write an integer to a file
  642.  
  643.                       Routine Reference
  644.  
  645.  
  646.  
  647. File:
  648.    LIRead        read an integer from a file into a long int
  649.    LIWrite       write an integer to a file from a long integer
  650.    LRead         read a long integer from a file
  651.    LWrite        write a long integer to a file
  652.    MatchFile     see if a filename matches a wildcard filespec
  653.    ObjScan       scan an .OBJ file, return publics & externals
  654.    ParseFSpec    split filespec into drive, subdir, filename
  655.    PatchDone     terminates patching of an .EXE file
  656.    RandFile$     return a random file name
  657.    Rename        rename a file
  658.    SetFAttr      set the attribute of a file
  659.    SetFTD        set the time and date of a file
  660.    SetPatch      installs a patch into an .EXE file
  661.    SFRead        read from a file into a string
  662.    SFWrite       write from a string into a file
  663.    ShowBMP       display a Windows bitmap file (.BMP)
  664.    ShowIcon      display a Windows icon file (.ICO)
  665.  
  666.                       Routine Reference
  667.  
  668.  
  669.  
  670. Input:
  671.    AltKey        returns letter from ASCII & scan codes of key
  672.    BarMenu       bar menu (single row) for keyboard only
  673.    BarMenuM      bar menu (single row) for keyboard or mouse
  674.    BIOSInkey     get a key from BIOS if any is waiting
  675.    BoxMenu       box menu (single column) for picking one item
  676.    BoxMenu1      box menu (single column) for picking items
  677.    BreakCheck    see if Break has been pressed
  678.    BreakOff      make sure Break doesn't interrupt the program
  679.    BreakOffDone  remove Break handler
  680.    CheckKey      get a key if any is waiting, or a mouse button
  681.    CheckKey3     get a key if any is waiting, or a mouse button
  682.    ClrKbd        clear the keyboard buffer
  683.    CtrlKey       returns letter, given ASCII code of Ctrl key
  684.    DInput        formatted dollar input routine
  685.    DOSInkey      get a key from DOS if any is waiting
  686.    DOSInky$      get a key from DOS if any is waiting
  687.    EnhKbd        enable/disable enhanced keyboard handling
  688.    FileMenu      menu for picking a file
  689.    GetKbd        get state of keyboard toggles (CapsLock, etc)
  690.    GetKbd1       get state of shift keys (Control, Alt, etc)
  691.    GetKbd2       get state of shift keys (Left/Right Alt, etc)
  692.    GetKey        get a key or mouse click (wait; 2-button)
  693.    GetKey3       get a key or mouse click (wait; 3-button)
  694.    GetPrtSc%     get whether Print Screen was pressed
  695.    GetValidKey   get one of a list of valid keys
  696.    JButtonA1%    get state of joystick A button 1
  697.    JButtonA2%    get state of joystick A button 2
  698.    JButtonB1%    get state of joystick B button 1
  699.    JButtonB2%    get state of joystick B button 2
  700.    JButtons      get state of all joystick buttons
  701.    JPos          get X,Y positions of joysticks
  702.    KbdType       see if the keyboard is enhanced (101-key)
  703.    KbdType2%     see if the keyboard is enhanced (101-key)
  704.    KeyPress      see if a key is waiting to be retrieved
  705.    PrtSc         disable the PrtSc/PrintScreen key
  706.    ScanKey       get a key, if any, w/o taking it from buffer
  707.    SetKbd        set state of keyboard toggles (CapsLock, etc)
  708.    SetMouseLoc   set the mouse cursor position (text mode)
  709.    SInput        flexible replacement for LINE INPUT
  710.    SInputSet     set SInput parms (fill, exitmode, beeps, fast)
  711.    SInputSet1    set SInput parms (cursor position, full exit)
  712.    SInputSet2    set SInput parms (capitalize, tab exit)
  713.    SpeedKey      change the keyboard repeat rate
  714.    TypeIn        stuff keys into buffer as if they were typed
  715.  
  716.                       Routine Reference
  717.  
  718.  
  719.  
  720. Memory:
  721.    BlockMove     copy data from one area of memory to another
  722.    DataSeg       determine the default data segment (dgroup)
  723.    DataSeg2%     determine the default data segment (dgroup)
  724.    EMSBuffer     get the bytes needed to save EMS array state
  725.    EMSClose      close an EMS array
  726.    EMSGet        get an element from an EMS array
  727.    EMSOpen       create an EMS array
  728.    EMSPut        put an element into an EMS array
  729.    EMSRest       restore the EMS array state
  730.    EMSSave       save the EMS array state
  731.    ExtGet        get data from extended memory
  732.    ExtMem        see how much extended memory is available
  733.    ExtPut        put data into extended memory
  734.    FarPeek%      get byte from memory (like PEEK w/o DEF SEG)
  735.    FarPeekI%     get word from memory (like two PEEKs)
  736.    FarPeekL&     get dword from memory (like four PEEKs)
  737.    FarPoke       put byte into memory (like POKE w/o DEF SEG)
  738.    FarPokeI      put word into memory (like two POKEs)
  739.    FarPokeL      put dword into memory (like four POKEs)
  740.    GetExtM       see how much extended memory is available
  741.    GetLIMHandles get the number of EMS handles being used
  742.    GetLIMm       see how much expanded memory is available
  743.    GetLIMv       get the EMS driver version
  744.    GetMemBox     get location and size of MEMBOX TSR memory
  745.    GetPSP%       get the segment of the Program Segment Prefix
  746.    GetXMSm       see how much XMS memory is available
  747.    GetXMSv       get the EMS driver version
  748.    LClose        close a block of expanded memory
  749.    LGet          get a block of data from expanded memory
  750.    LOpen         open a block of expanded memory
  751.    LPut          put a block of data into expanded memory
  752.    MemSwap       swap contents of one area of memory w/ another
  753.  
  754. Miscellaneous:
  755.    CreditCard$   see if a credit card number is maybe valid
  756.    Command2$     get the original DOS command line
  757.    DOSErrM$      convert a DOS error code into a text message
  758.    DOSInt%       execute a DOS function (like CALL INTERRUPT)
  759.    DupeVar       copy a TYPEd variable into a different TYPE
  760.    CatchError    set up to grab exit code from SHELLed program
  761.    GetError      get the exit code from a SHELLed program
  762.    GetError2%    get the exit code from a SHELLed program
  763.    GetSwitch$    get the DOS switch character
  764.    HandleInfo    see if a handle refers to a file or a device
  765.    IntVector     get the address of an interrupt handler
  766.    Reboot        boot the computer (like Control-Alt-Del)
  767.    RedirectIn    see whether input has been redirected
  768.    RedirectOut   see whether output has been redirected
  769.    SetError      set exit code to return when program ends
  770.    TVIdle        return clock ticks to TopView, DESQview, et al
  771.  
  772.                       Routine Reference
  773.  
  774.  
  775.  
  776. Mouse:
  777.    CheckKey      get a key if any is waiting, or a mouse button
  778.    CheckKey3     get a key if any is waiting, or a mouse button
  779.    GetKey        get key or mouse click (wait for it; 2-button)
  780.    GetKey3       get key or mouse click (wait for it; 3-button)
  781.    GetMouseLoc   get the mouse cursor position (text mode)
  782.    GetMouseVer   get mouse driver version and hardware info
  783.    LClickLoc     get mouse position at last left click
  784.    MClickLoc     get mouse position at last middle click
  785.    MMButton      see which mouse buttons are pressed (2-button)
  786.    MMButton3     see which mouse buttons are pressed (3-button)
  787.    MMCheck       see if a mouse is installed & no. of buttons
  788.    MMCheck2%     see if a mouse is installed & no. of buttons
  789.    MMClick       see which buttons have been pressed (2-button)
  790.    MMClick3      see which buttons have been pressed (3-button)
  791.    MMCursorOff   make the mouse cursor invisible
  792.    MMCursorOn    make the mouse cursor visible
  793.    MMGetLoc      get the mouse cursor position
  794.    MMSetLoc      set the mouse cursor position
  795.    MMSetRange    set the allowable range of the mouse cursor
  796.    MouseBuffer   get no. of bytes needed to save mouse state
  797.    MouseCursor   set the mouse graphics cursor type
  798.    MousePen      turn light pen emulation by the mouse on/off
  799.    MouseRest     restore a saved mouse state
  800.    MouseSave     save the current state of the mouse
  801.    RClickLoc     get mouse position at last right click
  802.    SetMouseLoc   set the mouse cursor position (text mode)
  803.  
  804.                       Routine Reference
  805.  
  806.  
  807.  
  808. Numeric:
  809.    Any2Dec       convert a number from any base into an integer
  810.    CeilD#        return the smallest integer >= number
  811.    CeilS!        return the smallest integer >= number
  812.    Dec2Any       convert an integer to any base
  813.    FloorD#       return the largest integer <= number
  814.    FloorS#       return the largest integer <= number
  815.    HiByte%       return the high byte of an integer
  816.    HiWord%       return the high word of a long integer
  817.    IVal%         convert a string to an integer
  818.    KVal%         convert a string to a long integer / 1024
  819.    LoByte%       return the low byte of an integer
  820.    LoWord%       return the low word of a long integer
  821.    LVal%         convert a string to a long integer
  822.    Max%          return the greater of two integers
  823.    MaxD#         return the greater of two double-prec. numbers
  824.    MaxL&         return the greater of two long integers
  825.    MaxS!         return the greater of two single-prec. numbers
  826.    Min%          return the smaller of two integers
  827.    MinD#         return the smaller of two double-prec. numbers
  828.    MinL&         return the smaller of two long integers
  829.    MinS!         return the smaller of two single-prec. numbers
  830.    Num2Phone$    convert a compressed phone number to a string
  831.    NumFormat     format a number as a string, like PRINT USING
  832.    Odd%          return whether an integer is odd
  833.    OddL%         return whether a long integer is odd
  834.    Phone2Num&    compress a phone number into a long integer
  835.    Rand%         return pseudo-random number in specified range
  836.    ReadBitF      read value of given bit length from an array
  837.    RndI%         return pseudo-random number in specified range
  838.    RotateL       rotate the bits in an integer left
  839.    RotateLL      rotate the bits in a long integer left
  840.    RotateR       rotate the bits in an integer right
  841.    RotateRL      rotate the bits in a long integer right
  842.    SetBit        set a specified bit in an integer
  843.    ShiftL        shift the bits in an integer left
  844.    ShiftLL       shift the bits in a long integer left
  845.    ShiftR        shift the bits in an integer right
  846.    ShiftRL       shift the bits in a long integer right
  847.    WriteBitF     write value of given bit length into an array
  848.  
  849. Printer:
  850.    CPrintScreen1 send a SCREEN 1 display to the printer
  851.    CPrintScreen2 send a SCREEN 2 display to the printer
  852.    GetPrtAddr    get the address of a printer port
  853.    PrinterReady% see if a printer is ready
  854.    PrinterInit   initialize a printer
  855.    PrintFile     send a file to the printer
  856.    PrintScreen   print the screen on the printer
  857.    PrtSc         disable the PrtSc/PrintScreen key
  858.    PrtSwap       swap any two printer ports
  859.    SetPrtAddr    set the address of a printer port
  860.    Spooler       see if DOS print spooler (PRINT.COM) is loaded
  861.  
  862.                       Routine Reference
  863.  
  864.  
  865.  
  866. Serial:
  867.    Carrier       determine if a carrier is present
  868.    CheckCAS%     determine if a CAS driver is present
  869.    Checksum      calculate an 8-bit checksum for a string
  870.    Checksum2%    calculate an 8-bit checksum for a string
  871.    CRC           calculate a 16-bit CRC for a string (obsolete)
  872.    CRC1          calculate a 16-bit CRC for a string
  873.    CRC32Calc     calculate a 32-bit CRC for a string
  874.    CRC32Done%    return a 32-bit CRC for a string
  875.    CRC32Init     initialize 32-bit CRC string calculations
  876.    DTR           set the state of the DTR line
  877.    GetCommAddr   get the address of a comm port
  878.    SetComm       set communications parameters
  879.    SetCommAddr   set the address of a comm port
  880.  
  881.  
  882.  
  883. SoundBlaster:
  884.    SBFreeHandles% get number of free SBSIM XMS handles
  885.    SBFreeXMS     release an SBSIM XMS handle
  886.    SBGetActive   get which devices are active
  887.    SBGetDrivers  get which devices are currently supported
  888.    SBGetVer      get SBSIM driver version number
  889.    SBGetVolume   get volume levels for a sound source
  890.    SBInitSrcFile initialize SBSIM to read from a sound file
  891.    SBInitSrcXMS  initialize SBSIM to load a .VOC into XMS
  892.    SBInt%        get SBSIM interrupt (0 if not installed)
  893.    SBIsFree%     get whether an SBSIM XMS handle is in use
  894.    SBLoadXMS     load a .VOC file into XMS memory
  895.    SBMapMIDI     set MIDI mapping
  896.    SBPause       pause the playing of a sound
  897.    SBPlay        play a sound
  898.    SBResume      resume playing a sound (used after SBPause)
  899.    SBSetVolume   set volume level of a sound source
  900.    SBStatus%     get status of a driver
  901.    SBStop        stop playing a sound
  902.  
  903.                       Routine Reference
  904.  
  905.  
  906.  
  907. String:
  908.    AndSt         AND the bytes in two strings together
  909.    AscI%         get the ASCII value of a character (like ASC)
  910.    AscM%         get the ASCII value of any char in a string
  911.    Bickel        compare two strings using Bickel's algorithm
  912.    Bickel2%      compare two strings using Bickel's algorithm
  913.    BSq           compress the blanks out of a text string
  914.    BUsq          restore a string that was compressed by BSq
  915.    BUsqLen       determine expanded length of a BSq'ed string
  916.    CenterSt$     center a string
  917.    Checksum      calculate an 8-bit checksum for a string
  918.    Checksum2%    calculate an 8-bit checksum for a string
  919.    Cipher        perform simple string encryption/decryption
  920.    CipherP       like Cipher, only the results are printable
  921.    CRC           calculate a 16-bit CRC for a string (obsolete)
  922.    CRC1          calculate a 16-bit CRC for a string
  923.    CRC32Calc     calculate a 32-bit CRC for a string
  924.    CRC32Done%    return a 32-bit CRC for a string
  925.    CRC32Init     initialize 32-bit CRC string calculations
  926.    Crunch        remove repeated values from a string
  927.    DGetRec       get a string from memory in a record format
  928.    DGetSt        get string from numeric array or other memory
  929.    DPutRec       put a string into memory in a record format
  930.    DPutSt        put string into numeric array or other memory
  931.    ExtendFSpec   check, complete, and format a filespec
  932.    Extract       extract a delimited substring from a string
  933.    ForceMatch$   force a filename to match a wildcard pattern
  934.    FormatPhone$  format a phone number
  935.    FromPostal$   convert a postal abbreviation to a state name
  936.    IsAlNum%      test whether a char. is alphabetic or numeric
  937.    IsAlpha%      test whether a character is alphabetic
  938.    IsASCII%      test whether a character is ASCII
  939.    IsCntrl%      test whether a character is a control code
  940.    IsDigit%      test whether a character is a digit
  941.    IsLower%      test whether a char. is lowercase alphabetic
  942.    IsPrint%      test whether a character is printable
  943.    IsPunct%      test whether a character is punctuation
  944.    IsSpace%      test whether a character is white space
  945.    IStr$         convert an integer to a string (like STR$)
  946.    IStrNB$       convert an integer to a string w/o blank
  947.    IsUpper%      test whether a char. is uppercase alphabetic
  948.    IsXDigit%     test whether a char. is a hexadecimal digit
  949.    Locase        convert a string to lowercase (U.S. only)
  950.    Locase1       convert a string to lowercase (international)
  951.    LRotate       rotate the characters in a string left once
  952.    MatchFile     see if filename matches a wildcard filespec
  953.    Month0        return the name of the month, given month no.
  954.    MultiAND      perform an arithmetic AND operation on string
  955.    MultiOR       perform an arithmetic OR operation on a string
  956.    MultiXOR      perform an arithmetic XOR operation on string
  957.  
  958.                        Routine Reference
  959.  
  960.  
  961.  
  962. String:
  963.    NameCase      capitalize a string correctly for a name
  964.    NameCase2$    capitalize a string correctly for a name
  965.    Num2Phone$    convert a compressed phone number to a string
  966.    OrSt          OR bytes in one string with those in another
  967.    Phone2Num&    compress a phone number into a long integer
  968.    Replace       replace one character with another
  969.    ReplaceSt     replace one substring with another
  970.    Reverse       reverse a string
  971.    RInstr        find last occurrence of substring w/in string
  972.    RolSt         rotate the bits in a string left
  973.    RorSt         rotate the bits in a string right
  974.    RRotate       rotate the characters in a string right once
  975.    SFRead        read a string from a file
  976.    SFWrite       write a string to a file
  977.    ShlSt         shift the bits in a string left
  978.    ShrSt         shift the bits in a string right
  979.    ShuffleSt     shuffle the characters in a string
  980.    Soundex       determine what a string "sounds" like
  981.    SSrch         see if one string is within another
  982.    StrDel        delete a character from a string
  983.    StrIns        insert a space into a string
  984.    Strip         strip the blanks from both sides of a string
  985.    Strip2$       strip the blanks from both sides of a string
  986.    StripBlanks   strip the blanks from side(s) of a string
  987.    StripChar     strip a specified list of chars from a string
  988.    StripRange    strip a specified range of chars from a string
  989.    StripSpaces   strip the spaces from side(s) of a string
  990.    StrSqu$       compress text string using 2&3-gram compress.
  991.    StrSqu2       compress text string using 2-gram compression
  992.    StrSqu3       compress text string using 3-gram compression
  993.    StrSquLen2    determine 2-gram compressed length of string
  994.    StrSquLen3    determine 3-gram compressed length of string
  995.    StrUnsq$      uncompress a 2 & 3-gram compressed string
  996.    StrUnsqu2     uncompress a 2-gram compressed string
  997.    StrUnsqu3     uncompress a 3-gram compressed string
  998.    StrUnsquLen2  calc full length of 2-gram compressed string
  999.    StrUnsquLen3  calc full length of 3-gram compressed string
  1000.    TInstr        search for a specific kind of char in a string
  1001.    ToPostal$     convert state name to its postal abbreviation
  1002.    Upcase        convert a string to uppercase (U.S. only)
  1003.    Upcase1       convert a string to uppercase (international)
  1004.    UpcaseI       convert an ASCII code to uppercase (U.S. only)
  1005.    UpcaseI1      convert ASCII to uppercase (international)
  1006.    ValidSt%      see if a string contains only approved chars
  1007.    Xlate         run each char of a string through translation
  1008.    XorSt         XOR bytes in one string with those in another
  1009.  
  1010.                        Routine Reference
  1011.  
  1012.  
  1013.  
  1014. Time:
  1015.    CalcDate      get date a number of days from a starting date
  1016.    CheckDate     check a date to determine whether it is valid
  1017.    Clock         display a clock on the screen, constantly
  1018.    ClockSet      set the parameters for the clock
  1019.    Date2Int      squash a date into a single integer
  1020.    DateA2R       convert a date to a number you can calc with
  1021.    DateN2S       convert a date from numbers into a string
  1022.    DateR2A       convert a number to a date
  1023.    DateS2N       convert a date from string form into numbers
  1024.    DCal          draw a calendar into an array for ScrRest
  1025.    DCalendar     draw a calendar & let user to select date
  1026.    Delay         delay for a given number of seconds
  1027.    Delay18th     delay for a given number of 18ths of seconds
  1028.    DelayV        delay for a very small amount of time
  1029.    Elapsed       determine the elapsed time between two times
  1030.    ElapsedTime$  determine the elapsed time between two times
  1031.    EuropeDate    convert a date to European format
  1032.    FormatDate    convert a date to any desired format
  1033.    GetDateA      get the date of a file matched by FindFirstA
  1034.    GetDateAT     get the date from the AT hardware clock
  1035.    GetDateF      get date of a file matched with FindFirstF
  1036.    GetDateFx$    get date of a file matched with FindFirstFx
  1037.    GetFDate      get the date of a file
  1038.    GetFTime      get the time of a file
  1039.    GetTick&      get timer tick count (1/18th seconds)
  1040.    GetTime       get time from DOS, including 100th seconds
  1041.    GetTimeA      get the time of a file matched by FindFirstA
  1042.    GetTimeAT     get the time from the AT hardware clock
  1043.    GetTimeF      get time of a file matched with FindFirstF
  1044.    GetTimeFx$    get time of a file matched with FindFirstFx
  1045.    Int2Date      unsquash date from single integer to numbers
  1046.    Int2DateSt$   unsquash date from single integer to string
  1047.    Int2Time      unsquash time from single integer to numbers
  1048.    Int2TimeSt$   unsquash time from single integer to string
  1049.    Month0        return name of month, given the month number
  1050.    Sec2Time$     convert seconds past midnight to time string
  1051.    SetDateAT     set the date of the AT hardware clock
  1052.    SetTimeAT     set the time of the AT hardware clock
  1053.    Time2Int      squash a time into a single integer
  1054.    Time2Sec&     convert time string to seconds past midnight
  1055.    TimeN2S       convert a time from numbers into a string
  1056.    TimeS2N       convert a time from a string into numbers
  1057.    WeekDay0      get the day of the week
  1058.    WeekDay1      returns the day of the week for a given date
  1059.  
  1060.                       Enhanced Key Codes
  1061.  
  1062.  
  1063.  
  1064. This is a list of the new key codes available when you use
  1065. EnhKbd to enable enhanced keyboard support. Note that the codes
  1066. are direct from the BIOS, and may not always match what INKEY$
  1067. returns. QuickBasic 4.5 provides only minimal support for the
  1068. enhanced keys; QBX does much better. As long as you use PBClone
  1069. for input, of course, you don't have to worry about it.
  1070.  
  1071. The format used is ScanCode, ASCIIcode.
  1072.  
  1073.  
  1074. Middle keypad key (num lock off):   0,76
  1075. Middle key, with Control:           0,143
  1076.  
  1077.              plain     shift     control     alt
  1078.              -----     -----     -------    -----
  1079.    F11       0,133     0,135      0,137     0,139
  1080.    F12       0,134     0,136      0,138     0,140
  1081.  
  1082. The middle cursor pad returns the same scan codes as the
  1083. cursor/numeric pad when NumLock is off, but with an ASCII code
  1084. of 224 instead of 0. If you want the middle cursor pad and
  1085. cursor/numeric pad to return the same values, you should have
  1086. your code do this:
  1087.  
  1088.    ' ...get key code...
  1089.    IF ASCIIcode = 224 AND ScanCode <> 0 THEN ASCIIcode = 0
  1090.  
  1091. Why test both ASCII and scan codes? Because it is possible for
  1092. the user to enter a plain 224 by holding ALT and using the
  1093. numeric keypad, which could cause confusion.
  1094.  
  1095. The arrows in the middle cursor pad will return special codes if
  1096. pressed in combination with an ALT key:
  1097.  
  1098.    up    arrow     0,152
  1099.    down  arrow     0,160
  1100.    left  arrow     0,155
  1101.    right arrow     0,157
  1102.  
  1103. Finally, the arrow keys on either cursor pad will return special
  1104. codes if pressed in combination with a CONTROL key:
  1105.  
  1106.                    middle pad     cursor/num pad
  1107.                    ----------     --------------
  1108.    up    arrow       224,141          0,141
  1109.    down  arrow       224,145          0,145
  1110.    left  arrow       224,115          0,115
  1111.    right arrow       224,116          0,116
  1112.  
  1113.                         DOS Error Codes
  1114.  
  1115.  
  1116.  
  1117. Note that the number of error codes available depends on the
  1118. version of DOS in use. Older versions return fewer error codes,
  1119. meaning that the nature of the error may not be specified as
  1120. precisely as you might like. This is not a complete list of all
  1121. possible codes, but it covers the most common ones.
  1122.  
  1123. The DOSErrM$ function can be used to generate a complete error
  1124. list if needed, current at least through DOS 3.31. If later
  1125. versions of DOS have new error codes, I'm not aware of 'em.
  1126.  
  1127.  
  1128.   -1    Unable to read or write all of the data requested
  1129.    0    No error
  1130.    1    Invalid function number
  1131.    2    File not found
  1132.    3    Path not found
  1133.    4    No handle available (too many files open)
  1134.    5    Access denied (file already in use or "read only")
  1135.    6    Invalid handle
  1136.    8    Insufficient memory
  1137.   15    Invalid disk drive
  1138.   16    Attempt to remove current directory
  1139.   18    No more matching files
  1140.   19    Disk is write-protected
  1141.   20    Unknown unit
  1142.   21    Drive not ready
  1143.   22    Invalid command
  1144.   23    Data CRC error
  1145.   25    Seek error
  1146.   26    Disk is not in DOS format
  1147.   27    Sector not found
  1148.   28    Printer is out of paper
  1149.   29    Write fault
  1150.   30    Read fault
  1151.   31    General failure
  1152.   32    Sharing violation
  1153.   33    Lock violation
  1154.   34    Invalid disk change
  1155.   35    No FCB available
  1156.   36    No room in file sharing buffer
  1157.   39    Out of disk space
  1158.   80    File already exists
  1159.   82    Unable to create subdirectory
  1160.   86    Invalid password
  1161.   90    Required system component not installed
  1162.  
  1163.