home *** CD-ROM | disk | FTP | other *** search
/ World of Shareware - Software Farm 2 / wosw_2.zip / wosw_2 / QBAS / QBTINY11.ZIP / QBTINY.DOC < prev    next >
Text File  |  1992-07-28  |  24KB  |  610 lines

  1.                       The QBTiny Library                 page 1
  2.                     =--------------------=
  3.                           Version 1.1
  4.  
  5.        QBTiny  Copyright (c) 1992  Thomas G. Hanlin III
  6.  
  7.  
  8.  
  9. The QBTiny library replaces the default runtime library for
  10. QuickBasic 4.x and PDS 7.x compilers. Using it can reduce the
  11. size of your compiled programs to 20% of their original size.
  12.  
  13. QBTiny does not support floating point math, event trapping, or
  14. several other BASIC features.  The differences between QBTiny
  15. and the default support library are discussed in this manual.
  16.  
  17. The QBTiny collection is copyrighted and may be distributed
  18. only according to the following rule:
  19.  
  20.    All QBTiny files must be distributed together as a unit in
  21.    unmodified form.  No files may be left out or added.
  22.  
  23. You use QBTiny at your own risk.  It has been tested by me on
  24. my own computers, but I will not assume any responsibility for
  25. any problems it may cause you.  QBTiny is a complex library.
  26. IT QUITE PROBABLY HAS SOME BUGS.  If you come across a problem,
  27. please let me know about it, and I'll do what I can to fix it.
  28.  
  29. It is expected that if you find QBTiny useful, you will
  30. register your copy. You may not use QBTiny routines in programs
  31. that are intended for distribution unless you have registered.
  32. Registration entitles you to receive the latest version of
  33. QBTiny, complete with full source code in assembly language,
  34. plus a special version of QBTiny for 80286 and later CPUs. The
  35. asm code is designed for MASM 6.0 and may need modifications if
  36. you wish to use it with OPTASM, TASM, or earlier versions of
  37. MASM.  For information on registration, see REGISTER.TXT.  If
  38. your copy of QBTiny is over a year old, it may be obsolete--
  39. see WHERE.BBS for locations which have the current version.
  40.  
  41. This manual always refers to the default support library as
  42. BCOM45.LIB, which is for QuickBasic 4.5.  If you are using a
  43. different compiler, you will have a different support library:
  44.   BCOM40.LIB    QuickBasic 4.0 (early release)
  45.   BCOM41.LIB    QuickBasic 4.0 (later release)
  46.   BCL70ENR.LIB  PDS 7.0 (normal default)
  47.   BCL71ENR.LIB  PDS 7.1 (normal default)
  48. Substitute the appropriate library for BCOM45.LIB.  Likewise,
  49. when I say QuickBasic, I am also referring to PDS.
  50.  
  51. The QBTiny library is called QBTINY.LIB.  Registered QBTiny
  52. owners also have QBTINYAT.LIB (for 80286-80486) and QBTINY3.LIB
  53. (for 80386-80486).  The same procedure works for all of them.
  54.  
  55.                        Table of Contents                 page 2
  56.  
  57.  
  58.  
  59.  Overview and Legal Info ................................... 1
  60.  
  61.  What Is QBTiny? ........................................... 3
  62.  
  63.  How to Use QBTiny ......................................... 4
  64.  
  65.  Compatibility Issues ...................................... 5
  66.  
  67.  Statements Not Supported .................................. 9
  68.  
  69.  Crescent's P.D.Q. ........................................ 10
  70.  
  71.  Which Runtime? ........................................... 11
  72.  
  73.  Author's Notes ........................................... 12
  74.  
  75.  The Future ............................................... 13
  76.  
  77.                        What Is QBTiny?                   page 3
  78.  
  79.  
  80.  
  81. Microsoft's QuickBasic compiler turns your BASIC source code
  82. into an executable (.EXE) file.  It does this by converting the
  83. source code into assembly language.  The simplest statements,
  84. like A% = A% + 1, are converted directly to assembly language.
  85. It would be inefficient to convert more complex statements
  86. directly to assembly language, though, since it would cause a
  87. lot of duplicated code.  Instead of entering complex statements
  88. directly into assembly language, the compiler generates a call
  89. to a standard library routine which takes care of the work.
  90. Most BASIC commands have their own library routines.  For
  91. example, the ASC function causes a call to a library routine
  92. named B$FASC (an abbreviation for Basic Function ASC).  When
  93. you compile a QuickBasic program to a stand-alone .EXE, it
  94. normally uses the BCOM45.LIB library to supply the proper
  95. support code.  The QBTINY.LIB library replaces this.
  96.  
  97. The first question that might pop into your mind is, why bother
  98. with replacing the default library to begin with?  It's free
  99. with the compiler and seems to work just fine as-is!
  100.  
  101. Well, the problem with the default library is that it was
  102. developed over a period of many years by many people.  As you
  103. might expect, this is not a particularly efficient way to make
  104. a library-- there are routines in BCOM45.LIB which are never
  105. even called any more!  The modularity of the routines is also
  106. not at its best.  Now, QBTiny does not (yet) support all of the
  107. routines that the default library does, but it was designed
  108. over a period of months by a single expert assembly language
  109. programmer.  This is why the simple program:
  110.  
  111.    PRINT "Hello, world!"
  112.  
  113. comes out to 12,308 bytes when linked with BCOM45, but only
  114. 2,550 bytes when linked with QBTiny.  Yep, the QBTiny version
  115. is a mere 21% of the size of the BCOM45 version!  The more
  116. complex MWORD demo (linked with my BasWiz and PBClone libraries
  117. as well as QBTiny) comes out to 8,716 bytes with QBTiny, as
  118. compared to 34,662 bytes when linked with BCOM45.  You won't
  119. always get savings of this magnitude, but for most small to
  120. medium programs the size difference is quite dramatic.
  121.  
  122. With a few exceptions that will be noted later on, you will not
  123. take any performance penalties for using QBTiny instead of
  124. BCOM45, either.  In fact, many QBTiny routines are faster than
  125. the equivalent routines in the default support library.
  126.  
  127. When you register QBTiny, you also get QBTINYAT.LIB (for 80286
  128. and later processors) and QBTINY3.LIB (for 80386 and later
  129. processors).  If you don't need to support older machines, you
  130. can use these new libraries for even smaller and faster code!
  131.  
  132. QBTiny does not support all of the routines that the default
  133. library does. In a few cases, it supports a routine, but not in
  134. quite the same way.  These differences are discussed later.
  135.  
  136.                       How to Use QBTiny                  page 4
  137.  
  138.  
  139.  
  140. Before using QBTiny, you must compile your program from the
  141. command line.  The /o switch is required to tell the compiler
  142. to create an .OBJ which can become a stand-alone EXE file.  Few
  143. of the other switches are compatible with QBTiny.  Compilation
  144. goes like this:
  145.  
  146.    BC program/o;
  147.  
  148. That's the standard way of compiling from the command line--
  149. nothing new there.  The differences come in at LINK time.
  150. Instead of your old LINK syntax, which may have looked a bit
  151. like this:
  152.  
  153.    LINK program/EX;
  154.  
  155. you would use a special syntax, like so:
  156.  
  157.    LINK program/NOD/EX,,NUL,QBTINY;
  158.  
  159. Note that the /EX (sometimes abbreviated /E, which isn't quite
  160. safe) usually makes QuickBasic programs smaller.  LINK isn't
  161. too bright, though, and will apply /EX whether or not it really
  162. shrinks the program.  In the case of QBTiny, you'll sometimes
  163. get better results by leaving the /EX off-- try it both ways to
  164. be sure.  Most programs do benefit from the /EX switch.
  165.  
  166. If LINK reports "unresolved externals" errors, you are using
  167. capabilities which QBTiny doesn't provide.  LINK will tell you
  168. what routine names are missing.  Use SYMDEX to find out what
  169. BASIC statement uses these routines.  If you're not sure where
  170. in your program this BASIC statement is, try creating a pseudo
  171. ASM listing-- BC.EXE will show you the code it generates in
  172. assembly language form, more or less, if you ask politely:
  173.  
  174.    BC program/O/A,program,program;
  175.  
  176. This creates a program.LST file which will help you track down
  177. where the problem lies.
  178.  
  179. If you have the registered version of QBTiny and are using the
  180. QBTINYAT.LIB (286+) or QBTINY3.LIB (386+) libraries with PDS,
  181. be sure to compile your BASIC programs using the /G2 switch.
  182. That tells PDS to create code for the 80286 and later CPUs.
  183.  
  184.                       Compatibility Issues               page 5
  185.  
  186.  
  187.  
  188. The QBTiny library is designed to mimic the default support
  189. library as closely as possible.  However, it is still a work in
  190. progress, and differences remain.  There are slight differences
  191. in the handling of some individual routines and certain types
  192. of routines are not yet supported at all.
  193.  
  194. QBTiny does not support floating point math.  It does not allow
  195. single-precision or double-precision numbers or any routines
  196. which require them.  It does not support event trapping-- no ON
  197. COM, ON ERROR, ON KEY, ON PEN, ON STICK, ON STRIG, or ON
  198. UEVENT.  It does not yet support dynamic arrays, READ/DATA,
  199. RANDOM file mode, INPUT, or many graphics statements.
  200.  
  201. It will be wise to debug your programs with the default support
  202. library before using QBTiny.  In the interest of efficiency,
  203. QBTiny does little error checking on items that are assumed to
  204. be within the control of the programmer.  For instance, QBTiny
  205. will not know if you use an invalid display page with SCREEN.
  206. However, it will report an error if there is a problem with
  207. OPEN or PRINT#, for example.
  208.  
  209. Still with me?  That may have seemed like a lot, I know.  Many
  210. of these capabilities will be added in later versions of
  211. QBTiny.  There are also new capabilities provided by QBTiny
  212. which provide alternatives to the missing routines which are
  213. actually more convenient than the originals.  For instance,
  214. although ON ERROR isn't allowed, the ERR variable is still
  215. updated as you'd expect.  You don't need slow and bulky error
  216. trapping to check for errors with QBTiny!
  217.  
  218. You can also use the QBTiny library along with other libraries,
  219. which can more than make up for any missing routines.  So you
  220. can't use RANDOMIZE and RND?  No problem!  The RAND function in
  221. my PBClone library is faster, smaller, and easier to use.
  222.  
  223. No need to search through your existing programs to figure out
  224. whether they'll work with QBTiny as-is.  When you link them
  225. with QBTiny, LINK itself will tell you which routines it was
  226. expecting that are not provided by QBTiny.  The SYMDEX utility
  227. (included) translates routine names to the names of the BASIC
  228. statements to which they refer.  BASDEX converts the other way.
  229. Between the two, you will be able to cross-reference BASIC
  230. statements with their symbols. We'll get into more details on
  231. that presently.  Right now, let's take a look at any individual
  232. differences between QBTiny and the default support library.
  233.  
  234.                       Compatibility Issues               page 6
  235.  
  236.  
  237.  
  238. Graphics
  239.  
  240. The QBTiny graphics handler is unlike BCOM45 in a number of
  241. respects.  It does not provide a simulated cursor, allow
  242. graphics paging, or set a default palette on entering a mode.
  243.  
  244.  
  245.  
  246. Keyboard
  247.  
  248. If input is not redirected, keyboard handling is done through
  249. BIOS calls.  The keyboard handler relies on 0000:0496h bit 4 to
  250. tell it whether an enhanced keyboard driver is available.  This
  251. may be incorrectly set on some old PC clones, making keyboard
  252. input unavailable.  If you have this problem, please get in
  253. touch, and I'll try to find a work-around for your machine.
  254. This problem brought to you courtesy of Microsoft, which did
  255. not see fit to provide DOS with enhanced keyboard support,
  256. giving me no alternative but to go with direct machine access.
  257.  
  258.  
  259.  
  260. KILL
  261.  
  262. The QBTiny version of KILL does not support wildcards.
  263.  
  264.  
  265.  
  266. LINE
  267.  
  268. The QBTiny version of LINE does not support patterns in quite
  269. the same way as QuickBASIC.  QuickBASIC always draws lines from
  270. left to right, but does up and down according to the order of
  271. the coordinates you give it.  QBTiny always sorts the
  272. coordinates and goes from the smaller coordinates to the larger
  273. coordinates.  In addition, QuickBASIC uses a somewhat peculiar
  274. procedure for handling patterns when drawing box frames, and
  275. ignores patterns when drawing filled boxes.  QBTiny handles
  276. patterns for box frames more the way you'd expect and supports
  277. patterns for filled boxes.
  278.  
  279. The current QBTiny LINE support is based on the BIOS and is
  280. very compact but also quite slow.  It will be converted to
  281. larger but much faster methods in later versions.  The method
  282. of pattern handling will also be changed.
  283.  
  284.  
  285.  
  286. LONG math
  287.  
  288. The QBTiny library does not support division or MOD for LONG
  289. integers, unless you are using QBTINY3.LIB (the 386 version).
  290. I'll fix this when I come up with a reasonably efficient way of
  291. implementing 32-bit division on a 16-bit processor.
  292.  
  293.                       Compatibility Issues               page 7
  294.  
  295.  
  296.  
  297. OPEN
  298.  
  299. The QBTiny version of OPEN does not support the RANDOM file
  300. mode.  It does not support BASIC devices (COMn:, CONS:, KYBD:,
  301. LPTn:, SCRN:).  However, DOS devices (AUX, COMn, CON, LPTn,
  302. PRN) are supported.  Note that INPUT# and LINE INPUT# are not
  303. yet available, so the INPUT file mode is rather limited.
  304.  
  305.  
  306.  
  307. PALETTE
  308.  
  309. The QBTiny version of PALETTE does not support the version of
  310. PALETTE without parameters.
  311.  
  312.  
  313.  
  314. SETMEM
  315.  
  316. Since QBTiny only uses as much memory as it needs, unlike
  317. BCOM45 (which allocates all base memory), the SETMEM function
  318. has no real purpose in QBTiny.  This may change when support
  319. for dynamic arrays is added.  In the meantime, the parameter
  320. passed to SETMEM is meaningless and is ignored.
  321.  
  322.  
  323.  
  324. SWAP
  325.  
  326. The QBTiny version of SWAP does not allow you to swap normal
  327. strings with other data types (such as fixed-length strings or
  328. TYPEd variables).
  329.  
  330.  
  331.  
  332. TIMER
  333.  
  334. The BASIC function TIMER is designed to use floating point,
  335. then convert the result to the appropriate numeric type.  The
  336. QBTiny version has been modified to skip the floating point
  337. handling, and only supports TIMER for long integers.
  338.  
  339. To make sure TIMER returns a long integer, you should enclose
  340. it in CLNG unless it is returning the result directly to a
  341. variable.  For example, these are ok:
  342.  
  343.    A& = TIMER
  344.    PRINT CLNG(TIMER)
  345.  
  346. But not this, since the type isn't apparent (and is assumed to
  347. be floating point):
  348.  
  349.    PRINT TIMER
  350.  
  351.                       Compatibility Issues               page 8
  352.  
  353.  
  354.  
  355. WIDTH
  356.  
  357. The QBTiny version of WIDTH supports 40 and 80 column modes. It
  358. ignores attempts to change the number of rows, however.  While
  359. it does support changing the width of open files, it does not
  360. allow you to change the width of BASIC devices (QBTiny supports
  361. only DOS devices, not BASIC devices).
  362.  
  363.  
  364.  
  365. VAL
  366.  
  367. The BASIC function VAL is designed to use floating point, then
  368. convert the result to the appropriate numeric type.  The QBTiny
  369. version has been modified to skip the floating point handling,
  370. and only supports VAL for integers and longs.  One side effect
  371. is that the QBTiny version won't always detect VAL overflows.
  372.  
  373. To make sure VAL returns an integer or long integer, you should
  374. enclose it in CINT or CLNG unless it is returning the result
  375. directly to a variable.  For example, these are ok:
  376.  
  377.    A% = VAL(St$)
  378.    A% = CINT(VAL(St$)
  379.    PRINT CINT(VAL(St$))
  380.  
  381. But not this, since the type isn't apparent (and is assumed to
  382. be floating point):
  383.  
  384.    PRINT VAL(St$)
  385.  
  386. The QBTiny version of VAL does not mimic certain BASIC bugs
  387. which appear with hex and octal numbers.  It won't gratuitously
  388. sign-extend long integer hex and octal, either.  For example:
  389.  
  390.    Function              QBTiny Result     BASIC Result
  391.    -------------        ---------------   -------------------
  392.    VAL("&H")                   0                 203
  393.    VAL("-&1")                  0          Type Mismatch Error
  394.    CLNG(VAL("&HFFFF"))       65535                -1
  395.  
  396.                    Statements Not Supported              page 9
  397.  
  398.  
  399.  
  400. Floating point:
  401.  
  402.  ATN       CDBL      COS       CSNG      CVD       CVDMBF
  403.  EXP       INT       FIX       LOG       MKD$      MKDMBF$
  404.  MKS$      MKSMBF$   RANDOMIZE RND       SIN       SOUND
  405.  SQR       TAN
  406.  
  407.  
  408.  
  409. Graphics:
  410.  
  411.  CIRCLE    GET       PAINT     PMAP      PUT       VIEW
  412.  WINDOW
  413.  
  414.  
  415.  
  416. Event trapping:
  417.  
  418.  COM       KEY       PEN       PLAY      STRIG     TIMER
  419.  UEVENT
  420.  
  421.  ON ERROR GOTO
  422.  
  423.  
  424.  
  425. Miscellaneous:
  426.  
  427.  CHAIN     CLEAR     DATA      DRAW      ENVIRON   ERASE
  428.  ERDEV     ERDEV$    ERL       FIELD     FILES     INPUT
  429.  INPUT#    IOCTL     IOCTL$    KEY ON    LINE INPUT#
  430.  LOCK      LPRINT USING        PLAY      PRINT USING
  431.  PRINT# USING        READ      REDIM     RESTORE   RESUME
  432.  RUN       SHELL     TROFF     TRON      UNLOCK    VARPTR$
  433.  
  434.  
  435.  
  436.  DIM           (for $DYNAMIC arrays)
  437.  OPEN          (for RANDOM)
  438.  MOD or \ with LONG integers (only allowed with QBTINY3.LIB)
  439.  Floating point math
  440.  
  441.  
  442.  
  443. PDS:
  444.  
  445.  CVC       EVENT     MKC$      PRESERVE  STACK
  446.  
  447.  Far strings
  448.  Currency math
  449.  ISAM support
  450.  
  451.                       Crescent's P.D.Q.                 page 10
  452.  
  453.  
  454.  
  455. Many of you are probably familiar with Crescent Software's
  456. P.D.Q. library.  P.D.Q. is similar to QBTiny in that it is a
  457. replacement for the default support library.  P.D.Q. provides
  458. some powerful advantages which QBTiny does not have, including
  459. the ability to make TSRs and interrupt handlers.  Crescent also
  460. provides printed manuals, phone tech support, and support for
  461. BASCOM/PDS as well as QuickBasic.  P.D.Q. runs about $150.
  462. Crescent Software is available at the following:
  463.  
  464.    800-35-BASIC    orders only, voice line | 9:00-5:00 EST
  465.    203-438-5300    tech info, voice line   | (Connecticut)
  466.  
  467.    11 Bailey Avenue
  468.    Ridgefield, CT 06877
  469.  
  470. It must be noted that QBTiny provides the first competition for
  471. P.D.Q., which has had the market to its own for quite some
  472. years now.  In consequence, perhaps it is not surprising that
  473. QBTiny provides much better QuickBasic compatibility than
  474. P.D.Q. and also results in smaller .EXE files.  Still, each
  475. product has its advantages, and you will not do badly with
  476. P.D.Q. if price is no object and you need the capabilities it
  477. provides which QBTiny lacks.  Crescent Software provides one of
  478. the better commercial outlets for BASIC libraries.
  479.  
  480. Late-breaking news: I am led to understand that P.D.Q. actually
  481. can produce smaller .EXE files than QBTiny, although it takes
  482. considerably more effort.  By linking in appropriate "stub"
  483. files (out of several dozen Crescent provides) and using
  484. Crescent's .EXE compression utility, you can reduce the size of
  485. an .EXE below even what QBTiny can create.  Well, we'll just
  486. have to see about that <grin>.
  487.  
  488.                         Which Runtime?                  page 11
  489.  
  490.  
  491.  
  492. It is possible for your program to automatically detect which
  493. of the three runtime libraries (default, P.D.Q., QBTiny) it is
  494. using.  Of course, the program is unlikely to compile if it
  495. uses a feature that isn't provided by the specified library.
  496. Still, since there are differences in the way each library
  497. handles specific routines, it may be helpful to know which one
  498. is being used.
  499.  
  500. The VAL function is implemented differently by each library.
  501. The P.D.Q. version has an incompatibility in the way it handles
  502. spaces.  The QBTiny version does not mimic certain obscure bugs
  503. that are present in the default library.  The following program
  504. fragment makes use of these differences to identify which
  505. runtime library is in use:
  506.  
  507.    IF CINT(VAL("1 2")) = 1 THEN   ' P.D.Q. stops at spaces
  508.       PRINT "PDQ.LIB"
  509.    ELSEIF CINT(VAL("&H")) THEN    ' BCOM45 has a hex bug
  510.       PRINT "BCOM45.LIB"
  511.    ELSE                           ' otherwise, must be QBTiny
  512.       PRINT "QBTINY.LIB"
  513.    END IF
  514.  
  515.                         Author's Notes                  page 12
  516.  
  517.  
  518.  
  519. Perhaps the most striking thing I found about writing QBTiny is
  520. that it was so easy.  Oh, I don't mean that it didn't take a
  521. lot of work-- QuickBasic has a lot of complexities, and QBTiny
  522. has corresponding depths to it.  I'm sure assorted bugs and/or
  523. incompatibilities will surface in the coming months.  Still, it
  524. involved more of massive work than of programming difficulty.
  525.  
  526. QBTiny is a product which, aside from an essential skeleton, is
  527. no different than any other BASIC library.  Simply by arriving
  528. at this conclusion first, Crescent Software managed to steal
  529. several years on its competition.  By virtue of being the
  530. frontrunner, they had a tough path to beat.  I had it easier,
  531. and I can certainly appreciate that-- I am grateful for their
  532. excellent work, although I hope to surpass it.  "If I have seen
  533. farther than others, it is because I have stood on the
  534. shoulders of giants."  Of course, the game of life is a totem
  535. pole, and today's giants are tomorrow's dwarves...
  536.  
  537. In examining Microsoft's work, I have found many things
  538. astonishing.  Sometimes I have been stunned by the delightful
  539. elegance of their design, other times by the thoughtless jumble
  540. that confronted me.  The default support library is a product
  541. born of genius, fools, and the hurry to get a product out.  It
  542. has some of the best and worst programming I have seen.  I've
  543. learned considerably in studying it, and have become a much
  544. better programmer thereby; and will no longer castigate
  545. Microsoft for some decisions which, although they might seem
  546. awful to the uninitiated, really do make sense when all is
  547. understood.  Then again, some of the best of the odd things
  548. they do in BASIC are only necessary because of severe lacks in
  549. DOS itself, which Microsoft also designed... but perhaps I will
  550. understand these problems better when I have completed DosTiny!
  551.  
  552. If you wish to become an expert in the ways of BASIC and have a
  553. better comprehension of its varied history along these many
  554. years, I can recommend few better approaches than studying the
  555. QBTiny source code, which brings a single understanding to the
  556. support library which underlies the whole of Microsoft's BASIC.
  557.  
  558. Crescent Software charges $150 for their P.D.Q., as of this
  559. writing.  I charge only $35 for QBTiny.  I don't think you'll
  560. find a better value anywhere.
  561.  
  562.                           The Future                    page 13
  563.  
  564.  
  565.  
  566. One of the great mistakes that Crescent made, I think, was in
  567. giving in to the urge to improve on Microsoft's failures.
  568. Sure, there are many obvious errors in Microsoft's design,
  569. especially in retrospect <smile>.  Still, current programs are
  570. written using that design, however flawed it may be. Crescent
  571. Software's P.D.Q. causes more chaos than anything else when it
  572. attempts to both solve the problems and provide compatibility.
  573. QBTiny was designed with the idea of QuickBasic compatibility
  574. *paramount*.  You will find it little effort to convert from QB
  575. to QBTiny, as long as a few basic rules are followed.  There
  576. will be even less work involved as QBTiny progresses.
  577.  
  578. However, there are other directions which may be taken as well.
  579. QBTiny follows Microsoft even if the path leads over a bridge.
  580. Later, I will introduce another library which will diverge from
  581. the Microsoft standard where it makes sense to do so.
  582.  
  583. For instance, have you considered the COLOR statement?  In
  584. graphics modes, the existing COLOR doesn't set foreground and
  585. background statements.  In fact, it *never* sets the background
  586. color.  Frequently, it serves as a palette changer, which would
  587. seem to be better handled by PALETTE.  Wouldn't it be nice to
  588. have both foreground and background colors in graphics modes?
  589. No problem!  ...but that's not compatible with QuickBasic!  Too
  590. bad?  Not really.  With one of my future libraries, you will be
  591. able to use COLOR the way it *ought* to be used, PALETTE
  592. likewise, DIM arrays in EMS and XMS memory, and otherwise gain
  593. advantages which current BASIC versions don't provide.
  594.  
  595. QB limitations will be forgotten when you can replace the very
  596. foundation library for BASIC itself.  QBTiny proves it can be
  597. done.  Future replacement libraries based on the QBTiny idea
  598. need not follow Microsoft so slavishly.
  599.  
  600. As a library writer, I have been confounded by some of the
  601. limitations Microsoft has placed on the ways subprograms and
  602. functions can access strings and arrays.  These limitations
  603. will be removed by my library replacements in the future.  I
  604. intend to document the improvements so that all programmers
  605. will be able to take advantage of them.
  606.  
  607. In short, BASIC is in for a wild ride, and we're going to have
  608. fun!  Stay tuned!
  609.  
  610.