New stuff in v2.11b
  - cosmetic fix-up, QLIB211a.zip was ZIPed incorrectly.
  - included Qdebug v1.10 Fix #2 - Heavily improved debugger

New stuff in v2.11a
  - missing many files, nothing was working.
  - pasm v2.01 - uses memicmp() now (was memcmp()) when checking for INCLUDE
    and other strings.
  - QLIB v2.20 is now under Work, totally different, totally cool...(win32)

New stuff in v2.11 *Final*
  - If you do not know, QLIB.H now holds the following #define's
      #define ERROR (-1)
      #define SUCCESS (0)
  - setfattr(), getfattr() - Now return standard C error codes
      ERROR (-1)         
      SUCCESS (0)        
  - Minor Fix : Text color was not properly retrieved, so clrscr() would not
    use the proper color.
  - DLLs are now much smaller (the old DLL files are no longer supported).

New stuff in v2.11 Beta #5
  - NEW : QLINK now gives a 2nd option to .SET BAT files.  The DOS extender
    name (pmodew, dos4g, wdosx, qdll).  The 1st option is still the EXE
    filename.
  - UPDATE : The HTML help has a lot more help (still far from complete)
  - NEW : t_setmode() now support 80x43 mode.
  - FIX : I think I nailed the mouse grafix bug !!!
  - FIX : irq13 handler in signal() works always now.  Have to send
    EOI to Slave and Master PICs. (was only sending to Slave)
    This also fixes the problem of TRIG.EXE from stopping all IRQ activity.
    \test\MATH2.C now works everytime.
  - New Functions:
      CRC16/32 functions:
        CRC16init(); - setup a table for 16bit CRC16()
        CRC32init(); - setup a table for 32bit CRC32()
        CRC16();     - compute 16bit CRC of data block
        CRC32();     - compute 32bit CRC of data block
        See help files or example (\samples\crc) for more help.
      DMA:
        dma_setup()  - setup DMAC (8/16bit), this is to complement
                       the dma_alloc...() functions. See help for more info
      LZW compression:  (has been greatly optimized and changed a lot)
        CompressBuffer()     - compress data buffer
        DecompressBuffer()   - decompress data buffer
        CompressBufferSize() - returns size of data buffer if expanded
        See \help\txt\compress.txt (or the HTML help file - QHLP.BAT)
        See \samples\compress\ for example of usage
  - creat() now uses S_IWRITE
    _creat() uses FA_...
    open() still assumes S_IWRITE until I can figure a way around problems
  - FIX : QCOMP.EXE now uses /z option properly (way missing a space
    before which would not allow compile)
  - FIX : QBIND.EXE has been fixed again.
  - c2pascal() and pascal2c() now use BYTE length coded strings as really
    used in Pascal.  (was words)
  - BC[pp]2OBJ.BAT now uses %include%.  I thought they were but only Watcom
    uses %include% automatically.
  - FIX : findnext() now restores DTA area with ffb in cause DTA was
    destroyed between calls.  I was unaware the DOS still needed the info
    in the DTA for findnext() _before_ calling INT 21h.

New stuff in v2.11 Beta #4a
  - fixed major bugs in QBIND and PACKIT that I found almost immediately
    after releasing Beta#4 - this always happens (Murphys Law!)

New stuff in v2.11 Beta #4
  - startup code now detects CPU itself instead of relying on DPMI server.
    Win95 does not detect my i586 (Pentium)!
  - FIX : realloc() now maintains DWORD alignment (was not a bug!)
  - FIX : the order of parameters to findfirst() where wrong
  - Two new tools to help compile have been added.
    QLINK is now an EXE.
    QCOMP is a new EXE that is used by all the ...2EXE.BAT files so
      that very little enviroment space is needed now.
    Option Changes:
      /C -> /L
    This is because QCOMP accepts /C to just compile.
    Run QCOMP and QLINK for more help.  You don't need to use QCOMP though
    since the BAT files will use it already, unless you want to.
  - QLIB now offers 2 new tools
      QBIND - Bind utility
        Add/Replace/Remove EXE stubs (aka DOS Extenders) to LE/PE/NE/PM
        images.
      QBUILD - Build incrementor
        Each time a project (EXE) is compiled an Equate (or #Definition)
        is incremented in the build file (BLD).
        Use QBUILD /C <filename.BLD> to create a 'C' build file.
        Use QBUILD /ASM <filename.BLD> to create a 'ASM' build file.
      QBuild is auto used if a .BLD file exists that is the same filename
        as what is being linked with QLINK or ...2EXE.BAT files.
  - The Build utility is now used to increment \src\qlib\lib\qlib.bld when
    ever \src\qlib\makelib.bat is used.
    The Build is used in _qlib_info dd ? which is a string of QLIB version.
    See \test\detect.asm for it's usage. (not really important)
  - QLITE.BAT now uses QBIND to "keep" PMWSETUP info in the PMODE/W DOS
    extender.
  - The *.SET files have changed a lot since QLITE has changed now.
    The SET BAT file is now only called once before QLITE is used
    during QLINK.  The SET file is called with one parameter
    which is just the EXE filename.  See \test\ram.* for example.
  - Currently the help files are being converted to HTML format for ease
    of use. They are not done yet.
    QHLP.BAT will run a netbrowser (if it can find one) to load
    this new help file (help\html\index.htm).  Long file names are NOT
    required.
  - moved \format to \help\format
  - the 2 header files in \txt have been moved to \bin
      Place these in your compiler's \H directory so when compiling QLIB files
      in it's IDE these headers will be usable.
  - QLIB now can detect WDOSX v0.94+
    _dosXtyp = DOSX_WDOSX (defined in QLIB.H(.INC))
  - PACKIT.EXE now operates slightly different.  The /h=<filename> option
    is required to generate PAH files.
      Usage : PACKIT [/h=filehdr] fileout [files...]
    You can now indicate which files you want to pack (instead of everything)
    if you like.  [files...] must not include any paths.
  - putch(8) now moves the cursor back (non-destructive)
  - added DLL support, now you can load/unload code/data on demand.
    See \help\txt\dll.txt (or \help\html\index.htm) for help.
    See \samples\dll\*.* for examples.
    The new option is /x to create DLLs.  Run QLINK to see.
    This new DLL implementation is not done yet, but is useable so far.
    I want to do the following with it yet:
      - add compression to QDLs
      - not force EXE to include everything in QLIB.LIB because of the
        DLL tables used.
      - wrappers to call DLL functions which will auto. call dll_import...()
        auto.
  - added many new functions:
      g_getpal(void *);   //read entire video palette
      g_getcol(byte n,byte *r,byte *g,byte *b);  //read video palette color
      chmod() - as in C
      setfattr(), getfattr() - as in Pascal (returns NULL on error)
      fsplit(char *full,char *path,char *name,char *ext); - splits file into
        components
  - fixed up include files a lot
  - added _SYS_TIMER macro to get system timer ticks (dword).
    Defined in stdlib.h/.inc
  - OS Detection :
    - added detection for WinNT v4.0 - but it does not known the version,
      just that WinNT is present
    - OS_WIN95 is now OS_WIN32
    - OS/2 detection is complete, but I don't know if the major/minor
      version returned is in the correct order.  Can someone tell me
      that is running OS/2 (is anyone still running this?)
  - I've found a bug in WLINK where if you do not use the 'option stub=xxx'
    it will provide a small EXE header which is corrupt.  I've created
    nullstub.exe in \bin that should be used as a NULL stub instead of
    omitting the 'stub' option.  Although the QBIND utility can detect
    these faulty stubs and correct them.
  - Bug : PMODE/W uses only 1/2 the memory set by PMWSETUP.EXE.
  - I discovered an amazing new discover!
    While creating my QBIND utility (mentioned below) I've noticed that
    when an EXE is bound to a LE/PE/NE/PM(PMODE/W compressed LE image)
    that the EXE's header is expanded (from 2 paras to 4 paras) and at
    offset 60 (0x3c) in the header is the offset of the image.
    This new technique is used by QSETUP and QBIND now.
    Instead of the old method of calculating the offset based on the EXE
    file while does not always work, since Watcom outputs a faulty EXE
    if no stub is used.

New stuff in v2.11 Beta #3
  - signal() now properly releases rmode callback(s)
  - fixed many bugs while I've been running QLIB under DOS v6.22
    - seems as though DOS v6.22 does not set carry on unsupported functions
      unless you set the carry before the call.
      Therefore LFN support was thought to be supported (which really
      messed things up)
  - fixed many \test examples (some were using old function names)
  - fixed many bugs where SS:SP was not cleared before calling INT 31h/300h
      which caused bugs in some code.

New stuff in v2.11 Beta #2
  - NOTE : Qdebug's detection code has changed.  See newdebug.txt (included
    with QDebug) for the code.  QLIB now uses this new code to overcome a
    PMODE/W bug.  So if you are using an older version of Qdebug (before
    v1.04) QLIB's startup code will not insert an 'INT 3' before calling
    main().  That's not really that bad since QDEBUG is compiled with
    WDOSX anyways.  Had to do this though cause I can not call INT 3
    with PMODE/W since it considers it an exception.
  - Please read \bugs for new important info
  - I've added UNPACK.EXE to QLIB that extracts files created with PACKIT.EXE.
    It can be used on PAK and PAH files.  If it's a PAH files you'll need
    to provide the header file also.
  - Major update : signal() and raise() have been added to QLIB.
    They support Borland C++ extensions (plus more).
    Please read/see:
      \txt\signal.txt
      \txt\raise.txt
      \test\signal.c  (for an example)
    CheckCtrlBreak() - is now obsolete and has been removed.
  - Major update : printf() and scanf() now adhere closely to ANSI-C
    standards.
    So you must now use all those ugly %lf, %hu, etc.
    I've added one new thing though. 'H' means 'really short' and is for
    8bit integers.
    See \txt\printf.txt and \txt\scanf.txt for more info.
    NOTE : the 'l' size modifier does nothing in printf() in 32bit mode
    They do have significance in scanf() though.
      %lf == %f == "double"
      %li == %i == "signed dword"
    But you should use the proper 16bit format if you also plan on using
    your source in a 16bit compiler.
    All compilers must expand "floats" to "doubles".
  - Major LFN support added.  Before I created lfn_find...().  Now comes
    the rest.  Added:
      lfn_open(), lfn_creat(), lfn_chdir(), lfn_mkdir(), lfn_rmdir(),
      lfn_unlink(), lfn_rename(), lfn_getcwd(), lfn_getdcwd()
    See \txt\lfn.txt for more info.
  - GetExceptHandler(), SetExceptHandler() are obsolete and have been
    replaced with the familiar signal(), raise() functions.
  - Major Bug Fix : the new optimized macros I created had presented a
    problem in the last beta release.  BL was being destoryed in some
    functions and was not preserved.  Fixed now.
  - BUG : callp macro does not expand "real4" into "real8" as now needed.
    I suggest start using 'C' for floating stuff.  I've changed
    \test\printf.asm and \test\scanf.asm into 'C' programs to overcome
    this bug.
  - Increased LIB granularity by spliting up math functions.
    sin(), cos(), etc. are all now in individual src files.
  - New functions:
      putchar(), fgets()
  - bug fix : enable() was using cli (or was is vise versa).
    Anyways it's fixed.  That's what you get for block copying.
  - bug fix : ftoa() and etoa() were not properly rounding
  - bug fix : ctype.h did not have extern "C" {} inserted
  - I've added new text functions:
      t_printf()     - prints to video temp area
      t_printxy()    - prints to video temp area
      t_box1()       - draws a 1 line box in the temp area
      t_box2()       - draws a 2 line box in the temp area
      t_backboxfill()- changes color of box in the temp area
      t_boxfill()    - changes char in box in the temp area
    You still must use g_setbuf() and g_copy() to update the screen as if
    in grafix mode.
    Please read \txt\video.txt for more info.
  - I've updated the memory heap management functions to include those
    provided by Watcom C/C++.
      _memavl()      - total memory free (same as coreleft())
      _memmax()      - largest memory block free
      _memused()     - total memory used so far
      _memtotal()    - total memory used and free (minus headers used by QLIB)
      _heapset(fill) - fills free memory with 'fill'
      _heapwalk(_heapinfo*)
                     - walks thru memory heap, _heapinfo is a struct that
                       holds the info
                         struct _heapinfo {
                           void *_pentry;
                           dword _size;
                           byte _useflag;
                       }
                     - If _pentry is NULL on call to _heapwalk() then
                       1st memory block is returned,
                         else next block is returned.
      _heapchk()     - checks heap for problems and returns:
                         _HEAPOK - no problems
                         _HEAPBADNODE - a node is trashed
                         _HEAPEMPTY - there is no heap
      _heapfrag()    - checks heap for fragmentation level
             Returns : (# of free blocks) / (total # of blocks) * 100%
  - qfree() is obsolete!
  - Any of these new functions will set errno and return _HEAP...
    if possible.
  - bug fix : f...() file IO was being corrupted but the problem has
    gone away now due to the massive rewritting I've done.
  - currently ftoa() does not have the range I wish it did, I may fix this
    before v2.11 *final*.  Currently it will only print number in the range
    of 1e+8 and -1e+8.  If anything is out of this range then ftoa() will
    simply call etoa() instead.

New stuff in v2.11 Beta #1
  - WARNING : There still remains 1 mouse bug in QLIB.  I will
    fix this problem before the final release of QLIB v2.11.
    The bug deals with VESA 1.2 video modes (mouse JMPs to location
    0,0 sometimes but only in high-color-depth modes (>8bpp))
    This bug is not the serious.
  - fixed a major bug in which all fprintf() calls were always redir
    to stdout.
  - I've included ?CCPP.OBJ in the \src\qlib directory since those are
    difficult to compile.  Just in case you wanna recompile the whole QLIB
    library.
  - fixed scanf() to perform more like ANSI C.
  - fixed a small bug in the stream file IO fgetc() function.  Was
    return EOF _with_ the last char.
  - Please copy \txt\*.h into your C compilers include directories.
    These will help (not always though) to compile C files that use "qlib.h"
    in your C compilers IDE.  Just something I needed.
  - I've updated \test\vigor.asm a lot.  It now vigorously tests the
    perfected memory allocation routines.  malloc(), realloc() and free()
    now work flawlessly.  Fragmented memory managers are a pAin in the ass.
  - Watcom V11.0 now support _ASM {} and __ASM {} blocks.
    IASM will still be used in the WC??2OBJ.BAT files for v10.6 users.
    If you do not wish to use IASM and you have v11.0 then read
    \BIN\WC??2OBJ.BAT for help on removing IASM.
  - When I was testing out QLIB with Watcom v10.6 I've notived many problems
    a) WLINK v10.6 crashes if I use 'option eliminate'
    b) WLINK v10.6 for some reason does not see my STACK segment.
    I've fixed the stack problem (Stack needed to use combine 'STACK')
    and I've removed the eliminate option since I can not see any
    difference in using it.  Now QLIB can be used with WLINK v10.6 again.
  - it seems as though a QLIB source file has been missing for a long time.
    The hardware in/out functions (inp(), outp(), etc) have not been within
    QLIB, and for some reason I took them out of the makefile too?
    Anyways, I've fixed this.  Got the io.asm file from QLIB v2.03.
  - perrer() has been fixed.  The sys_errlist was not in the proper order.
  - stdin,stdout,etc. are now within the BSS instead of thru malloc()
    so that QLIB can run on no XMS memory.
  - I've replaced all "echo y | del *.*" with "deltree /y <dir>" so that
    it will work in all countries, as I've been told the old method will
    not.
  - added debug info messages to the video drivers.
    Just set _v_debug to TRUE (non-zero) and while calling g_getmode()
    debug messages will be printed on the screen.  You must be in text
    mode to see them.  Mostly just VESA messages.  See \test\gfx-g.inc
    for a good example (it's part of \test\grafix.asm).
  - the DPMI func 800h/801h have been renamed (as they were suppose to of
    been a long time ago)
      alloc_phys()  =>  _DPMI_phys_alloc(addr:dword,siz:dword)
      free_phys()   =>  _DPMI_phys_free(addr:dword)
  - QGRAFIX.LIB has been combined with QLIB.LIB since I've now been able
    to force Watcom to removed unused OBJs.  This makes compiling much
    easier.  Therefore many MAK files have been removed since the simply
    MASM2EXE and BC2EXE BAT files will do the trick now.
  - two new grafix functions that are very important:
      g_copyblk(x1,y1,x2,y2);
      g_copybuf(buf,x1,y1,x2,y2);
    g_copyblk() will copy a portion of the temparea to the video memory.
      Instead of using g_copy() to update the whole screen you can now use
      g_copyblk() to update only what you have changed.  Or
      use g_copybuf() to copy from another buffer.
    I've changed \test\grafix.asm to use it and the grafix fly now.
    I've wanted to add this feature for such a long time and finally I've
      done it.
  - I've added many new Direct drawing grafix functions
      gd_get() , gd_put() , gd_put0() , gd_putb0()
    these work just like the normal versions except these draw directly
    to the screen (not the temparea).  The mouse MUST be hidden if you
    use these functions (unlike the others that do not matter).  I mostly
    just use these for my mouse driver to print the mouse pointer but
    thought I would make these 'public' since they could have other
    purposes.  They will also work in text modes too.  (as long as you
    use t_setmode())
  - fixed many problems within the grafix engine that have arised from
    the massive amounts of changes I've made to it.  vesa_func06 was not
    working properly, and the attempt to make logical=physical in vesa
    modes was failing.  All works perfectly again.
  BTW : This is the same version as the very 1st DOS I ever owned.  Gee,
        v7.10 is what I use now.

New stuff in v2.10c *Patch*
  - I've tried (err... failed) to make INC files TASM compatible.
    To do this I had to change
    A LOT of struct names to accomidate TASM's inability to conform to
    ASM standards.  So if you use TASM some struct element names are different
    then what I use.  See inc\__tasm.inc for what has changed.
    Note : To detect which assembler you are using a Define must be
    placed with the assembler.  ie: /D__MASM__ , /d__TASM__ , etc.
    See the BAT files.  So make sure you use the BAT files.
    ie: TASM2OBJ.BAT , MASM2EXE.BAT , etc.
  - this was never released cause I gave up on TASM.  If you use TASM
    or WASM or NASM you'll just get errors if you try and include anything
    inside \INC.  Please get MASM, it's available on any of my warez sites.
    I know, I know, MS made it but it has all the features every programmer
    should have.

New stuff in v2.10b *Patch*
  - fixed font/pointer loading routines (would only load bit-packed types)
  - fixed callp macro  (had some illegal '!' where they were not allow to be)
  - updated the grafix.asm demo program (added a text scrolly)

New stuff in v2.10a *Patch*
  - fixed some header errors and added a few things
    added:
      malloc.h  (just includes alloc.h)
      assert.h  (added assert macro)
  - fixed bugs I placed into system() and spawn...() in the previous version.
    I moved around variables before without thinking...

New stuff in v2.10 *Final*
  - pack_init() and pack_uninit() have been removed.  Now pack_open() and
    pack_close() will automatically grow/shrink it's tables.  The pack init
    is completed thru the startup code.
    Just remove all calls to these 2 functions and everything will work now.
    Remember : pack_open() now opens PAK and PAH files.  And if you are
    opening a PAH file you must also supply the header offset in memory.
    See \test\pack\pack.asm
  - I've finally removed BSS from the EXEs. In order for a BSS segment not
    to be put into the EXE you must follow these guide lines:
      Do not use the 'align' directive within the segment
      Do not use initilized data (oviously)
    This is not so bad though, QLIB.LIB does not use the same BSS segment
    that your code will, so when you start your BSS segment assume it
    will be DWORD aligned.
    If you do accidentally force your BSS segment to be put into the EXE
    or a 'C' compiler does this, QLIB's BSS segments will still NOT be put
    into the EXE since it's BSS segment comes after the default BSS segment
    in the segment order.  The stack is the last segment and is always
    not put into the EXE.

New stuff in v2.10 Beta #2
  - The only thing left to do is FORCE WLINK to not put BSS and STACK
    into the EXE file.  The BSS and STACK are already at the end of the
    EXE and the class is right but there are still there, why?
    Because of this I've tried to remove a lot of BSS stuff from my utils
    and made them get these buffers dynamically.
  - QLINK.BAT and all *2EXE.BAT files have changed slightly
    A new option /l can be used to specify LIBs that will be supplied to
    WLINK as an 'library' instead of just 'file' which can decrease the
    size of the output EXE.
    See \test\grafix.mak or just run QLINK.BAT to see the new format.
    If you do not do this is does not matter, your EXE just may contain
    OBJs within the LIBs that are not used.
  - thru a lot of effort I've made the output EXE a lot smaller.
    After searching thru more Watcom Help files it seems as though in
    order for WLINK not to use unreferenced code/data it must exist
    in it's own segment.  So I created \inc\src\qlib.inc that when used
    will cause new segment names to be created for each file generated.
    See any of the source files for examples \src\*.asm
    I've also made QLINK.BAT use QLIB.LIB as a library which elimated
    massive amounts of overhead in the EXEs.
  - PASM v2.00 & iASM v2.00 : Now handles things much better.
    No longer create massive files but instead copy all pre-compiled
    files into a temp directory.  The problems of iASM going thru infinite
    #include's has been fixed.  iASM is used in the Watcom BAT files again.
    Errors should be more easier to spot out now. (still quite hard though)
    Note : The output dirs are \pasm.tmp and \iasm.tmp.
  - added cprintf(), cputs(), window(), textcolor(), textbackground(),
    textattr(), gettextinfo()
    See \test\window.c for a good test.
  - fixed many problems in FILE* stuff and added more FILE functions
    feof(), clearerr()
    See \test\file.c for a good test.
  - I've moved enough stuff from the Grafix LIB to QLIB.LIB so that you
    can call t_setmode() and the other text functions (just 2 others)
    without having to also link in the Grafix LIB.

New stuff in v2.10 Beta #1
  - added these new grafix routines:
      g_line(x1,y1,x2,y2,clr);
      g_putpixel(x,y,clr);
      g_getpixel(x,y);
  - you can now place two double quotes in the arguments to pass
    one quote to a QLIB program without argments being grouped together
    See \test\args.exe to test this out.
  - fixed some problems in the headers files (lzw.h and many BYTE* that are
    now CHAR*)
  - The pack file open functions have changed slightly.
    Instead of two functions as before there is now one simply function.
      pack_open(char *filename,...);
    If the pack file that is being opened does not have an entry list (*.PAH)
    then you must provide the pre-loaded list as the second parameter.
    The pack_open() function will determine what type of Pack file it is.
    If you do not provide the list and it is a PAH file you can expect your
    machine to explode or something to that effect.
  - pack_open() now handles problems better
  - fixed many more bugs in realloc() again!
  - I've added the \FORMAT directory which holds lot of useful info
    on all the file formats I've created and use in QLIB.
  - FILE* streams has been added and it's great!
    fopen(), fclose(), fscanf(), etc. have been added.
    getch() and ungetch() now work thru stdin, not even Borland's do that.
    This means that you can use ungetch() as many times as you like (not
    just once as I've seen in Borland's LIBs - and as all their online
    help says).  ungetc() and ungetch() will only work untill they fill the
    streams buffer (which I set at 4k).
  - QLIB now forces Watcom to pass doubles back thru st(0) to conform
    with all the other compilers that are not as flexable as Watcom is.
    This makes the math libraries much smaller and therefore I simply
    merged them into the QLIB.LIB file.  Plus the options to use
    different Math LIBs has been removed.
    The option to include WDOSX has changed to simply '/w'.  Since that
    option to use Watcom Math LIBs is no longer needed.
    Run QLINK.BAT to see all the details.
  - str2num() has changed a lot
    There use to be str2num...() for each version (hex,octal,dec,bin,etc).
    But now I use the radix to make code smaller/faster.
      int str2num(char * string,byte radix);
  - num2str...() also have new versions that will left padd the output
    with zeros.  The new functions are num2str0(), num2strc0(), num2strs0()
    and num2strsc0().
  - Q Profiler has had many bugs fixed and reports proper results now.
    Before MSR1 and MSR2 were reversed and now \profiler\profiler.asm
    always uses the same number of cycles for each case.  Before it was
    different for each case which I still can not figure out why, but
    I fixed it anyways by using one function instead of two.
    Also the cache problem has been solved.  I quickly run thru 8k of code
    to flush the cache.
  - _DPMI_desc_free() was given the wrong name in the source file and has
    been fixed.
  - pack.asm was not included into dos.asm (by accident I swear!)
    I was playing around with masm2obj.bat to swap asm.tmp and the
    actually source before compiling and then swap them back.  This
    way the 'name' in the OBJ file is the actual filename instead of
    just ASM.TMP.  But if there are any problems, your source is pissed.
    Well it happened to dos.asm so I tried to rebuild it but I missed
    one small line (hehe).

New stuff in v2.07 *Final*
  - nothing changed since v2.07 Beta#7b.

New stuff in v2.07 Beta #7b
  - QDebug is now an EXE file.  The file is already compiled under \bin.
    Read \src\debug\debug.asm for more info.
  - \test\stats.asm can now display LE header info.  This info is displayed
    after the EXE header info.  And it will also work on unbound LE images.
  - a glitch in Qprofiler has been fixed.  The 64bit subtraction has
    been fixed properly. See \test\sub64.asm to see how easy it is.
    The problem only was seen when counter flipped so you could only see
    it for a split second.
  b]no longer contains QDebug at all

New stuff in v2.07 Beta #6
  - added Q Profiler (Pentium Profiling) to test the speed of any code.
    You can call these functions easily from within your programs or test
    out fragments easily under \PROFILER
    Use MAKE.BAT to compile any of the examples there.  Please see
    \PROFILER\EXAMPLE.PRO for a good example there.
    Also see \TXT\PROFILER.TXT for other help.
  - DETECT.ASM MMX detection fixed. (since I have an MMX now to test it on)
  - QLIB's startup code now detects for CPUID and MMX.
    The system variables are:
      _cpuid db ?
      _mmx db ?
    Each are 1 if it is available.  MMX can not be available without CPUID.
  - callp now pushes TBYTE (and REAL10) properly.


New stuff in v2.07 Beta #5
  - QDEBUG is now automatically called during startup from C0.ASM so you
    no longer need to call it from your own code.
    You still need to compile with or without the /bug option.
    NOTE : You can not use QDEBUG with PMODE/W when not under a
           DPMI host or it will not work.  Seems like PMODE/W just
           can't cut it.  The /bug option forces WDOSX (again).
    Much of QDEBUG has been fixed now.
    See the source, debug.txt and qdebug.txt.
    Please see debug.asm in \test for a good example. Use the following to
    compile it:
      masm2exe /bug debug
  - New macros/funcs have been created for adding break points.
      _brkpt_ = macro for ASM programs to insert an INT 3
      _int3_() = function for ASM/C programs to insert an INT 3
    These 2 will not call the INT 3 if WD or QDEBUG is not loaded.
    (Actually the only way to detect for WD is just to detect for DOS/4GW
     since DOS/4GW will simply ignore INT 3 if you are not using WD).

New stuff in v2.07 Beta #4
  - QDEBUG fully works now under Windows95 and DOS !!!
    It fully works with PMODE/W and WDOSX, seems to call INT 21h/4C00h
      immediately under DOS/4GW.  See debug.txt for complete info.
  - fixed a bug in STDDEF.H, where callstruct struct was all wrong!
    thanx to someone who noticed
  - Long Filename support added.  see lfn.txt
    New functions are:
      lfn_findfirst()
      lfn_findnext()
      lfn_freefind()
    See \test\ff.asm for an example of it's use
  - many grafix fixes
  - the 24/32bit fonts were incorrectly created (again)
  - the VESA setmode function was optimized to force the logical scan line
    lengths to the physical length which was not always the cause
    in certain vide modes.  There wierd modes were slowing down g_copy()
    performance and other grafix related functions.
  - another new font format.
    Bit Packed Mono-Coloured fonts.
    Just as they say...and take up a lot less disk space.  I was using a
    whole byte before for each pixel in mono-coloured fonts, well I
    finally got around to making the simply bit-packed version (but a
    little slower).
    FONT.C in the \utils has also changed to creat these new fonts (/B
      option).
    The old format unpacked mono-coloured is still supported.
  - I've just noticed that if ANSI.SYS is loaded then you must use
    mouse_off() when ever printing stuff in text mode, and then use
    mouse_on() when you are done printing (if you have the mouse enabled).
    The Grafix Test program has been updated to demonstate this.

New stuff in v2.07 Beta #3
  - QDEBUG now operates under Windoze 95 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    The problem in Beta #2 was that the stack provided under exception
    handlers was too small, so I made some stack switching rountines.
    Check out stacks.asm if you get the source code (really cool).

    NOTE : The debugger is still very unstable.  But it works a little.

  - Micro$oft Visual C/C++ Pure Virtual Function handler is now supported.
  - the DPMI Locking funcs (60xh) where not complied into the QLIB.LIB file
    It is now.
  - a new utility has been added.  CleanASM.C.  It's not compiled but you
    may use it if you like, I needed to make it for the QDEBUG source code
    cause the original source code was very messy.
  - Adding the QDEBUGger has changed.  Please see debug.txt.
  - a new option '/bug' was added to add QDEBUG support.  So you no
    longer should add the LIB file yourself manually.
  - if the debugger is not added a NULL debugger is used instead. So you
    don't have to edit your code everytime you wanna debug it.
  - QLINK.BAT now includes the enviroment string "LIB" in the LIBPATH
    option for when using WLINK.
  - removed the compiled file 'IASM.EXE', the source is still there
    and you can obtain the compiled file in my Files Page on my HomePage.
    I am no longer using this utility in QLIB.
  - added g_getbuf()
  - math constants are placed in Math.h and math.inc (ie: M_PI, etc.)
  - memset was dword optimized

New stuff in v2.07 Beta #2
  - The video drivers properly uninit in the case of a 'C' exception
    ie: the Ctrl+break and pure virtual functions called.
    So calling t_setmode() in your own exception handler will properly
      switch to text mode and uninit the mouse if it is shown.
  - A new debugger has been added:
    This debugger is the same from DOS32 v3.5 rev 6.
    I've heavily modified the debugger to work under DPMI hosts.
    It should even work under Win95 (not yet though).
    See debug.txt for more details.
    See \test\debug.asm for an example.  Use :
      "qmake debug"
      to compile it. (requires MS Make)
    Note : It only works with the WDOSX dos extender, all others (PMODE/W
      and DOS/4GW) are too strict and do not allow the debugger to use system
      resources.

New stuff in v2.07 Beta #1
  MAJOR CHANGES!!!
  Please read the new TXT files:
    \txt\dpmi.txt
    \txt\except.txt
  For more new info.
  And see the new test files:
    \test\pure.cpp
    \test\ctrlbrk.c
    \test\dpmi.c
  For examples on new functions.
  - all DPMI functions now have C callable rountines to be used
    All these new DPMI functions start with '_DPMI_':
    Here are a few:
      _DPMI_setpmint(byte,pmPROCstruct *);  //PMODE
      _DPMI_getpmint(byte,pmPROCstruct *);
      _DPMI_setrmint(byte,pmPROCstruct *);  //RMODE
      _DPMI_getrmint(byte,pmPROCstruct *);
      _DPMI_callback_alloc(rmPROCstruct *,pmPROCstruct *,callstruct *);
      ...
      Note the old functions have been removed : setint, getint, getrmint...
      see \test\dpmi.c for a good example
  - see DPMI.H for all the functions available.
  - Note : pmPROCstruct and rmPROCstruct are used to hold addresses:
    they are defined as follows:
      struct pmPROCstruct {
        word _sel;
        dword _off;
      }
      struct rmPROCstruct {
        word _seg;
        word _off;
      }
  - _cexit now calls _c_exit as it should (this was done before in exit())
  - calling a pure virtual function will now properly terminate the
    application
  - SetExceptHandler( int exctype, handler);
    This sets a 'C' exception handler (not CPU exceptions)
      Current exceptions handled:
        EH_PURE_VIRTUAL - pure virtual function called. (C++ only)
        EH_CTRL_BREAK - Control break handler.
      Others may be added in future.
      Usage:  SetExceptHandler(EH_PURE_VIRTUAL , myhandler);
        - You should not cause the pure virtual exception handler to occur
          in an IRQ handler because the handler will exit in an IRQ which
          is not suppose to happen under a DPMI host.
    IMPORTANT : Read except.txt for more info.
    See \text\pure.cpp and \test\ctrlbrk.c for an example
  - GetExceptHand ( int exctype);
      Returns current installed exception handler.
      Default handlers are within QLIB.
  - Except.h(.inc) - new headers file for the above new functions.
  - FS.EXE has been removed since I never use it anymore
    The source is still there though, which now uses the new Ctrl+Break
      handlers (use WDOSX only though /wx)

New stuff in v2.06 *Final*
  - clrscr() now uses ANSI codes if ANSI.SYS is loaded
  - NEW :
     _ansi_sys db ?    ;New within c0.obj that is set during init if ANSI.SYS
                       ;is loaded (0ffh=yes  0=no)
     utils.mak - Make file to help creat EXEs in \utils
     default.mak - a new template to creat your make files from.  Very nice

New stuff in v2.06 Beta #3
  - NEW :
      SRV_UNKNOWN
        _dosXtyp equals this if the server that the DOS extender is using.
        QLIB no longer tries to "guess" what it is using.
  - packit was recompiled to fix some weird bug (?)
  - note: all the fonts/ptrs within \TEST were packed into grafix.dat
    see \UTILS\MAKEALL.BAT to see how it twas done.
    \TEST\GFXINIT.ASM is included by programs that need the files within it.
  - fixed a bug I placed in the last beta release in the grafix libs (VGA)

New stuff in v2.06 Beta #2
  - major modeX bug fix : was not allowing the use of any modeX video modes.

New stuff in v2.06 Beta #1
  - Improved C++ support : INIT and UNINIT code is now executed.
    - This includes all global class constructors and destructors.
    - WC++, BC++ and MC++ are all supported.
    - c0c3.asm is a new file that handles these things within
      the startup code. \src\startup
  - the '#pragma' for WC++ has been changed to preserve all regs as BC
    expects.  This will allow mixing of WC++ (wpp386.exe) and BC.
  - NEW :
    - void * mouse_loadcursor(char * filename);
       This is a new function to load the new mouse pointers.
    - g_mousehead struct -> contains header for new mouse cursor files.
    - ptr.c within \UTILS will create some mouse cursors.
    - a complete GUI interface LIB added.  See \txt\gui.txt for info.
       The GUI's library is 'QGUI.LIB'.  The source is C++ !  The GUI is
       incomplete.
    - BCPP2ASM.BAT and BC2ASM.BAT added.  They do just as they should.
       But the BCPP2ASM may fail with BCv5.0.  
  - CHANGED :
     fnthead => g_fnthead
     void mouse_setcursor(void *);
       this now accepts the mouse pointer that was returned by
       mouse_loadcursor()
  - renamed dir '\C' to '\UTILS'
  - wrote some important info to check out: (in \TXT)
      cpp.txt
      fastcall.txt
  - fixed a minor possible bug in qsetup.c.  If QLIB_MEM crossed a 64k file
    boundry it would not be detected and qsetup would ignore the file.  Not
    likely to happen to often, but twas fixed anyhow.
  - more fixes in the header files (*.h) to stop M$C's whining.
  - a new linker option has been added to make creating MAP files each (/m)
    It can be used with ...2exe.bat and qlink.bat

New stuff in v2.05 *Final*
  - operator delete has been added
    Now the \test\testcpp.cpp program fully compiles using:
     BCPP2EXE.BAT or
     WCPP2EXE.BAT or
     MCPP2EXE.BAT
    It was not easy.  Check out the \SRC\QLIB directory and look at
    ?CCPP.CPP files.  Each compiler has it's own C++ calling convention,
    so the new() and delete() operators are compiled with each compiler.
  - packit.exe was corrupted and recompiled
  - fixed problems in lzw.h and stdlib.h
  - fixed bug in str2numx(), recompiled QSETUP to fix problem (v1.01a)
  - NASM v0.94 has been supported:
      NASM2EXE.BAT and NASM2OBJ.BAT have been added.
      Note: NASM does not support the files within the \INC directory
      so your own your own.  I'll try and come up with something.
      (TASM does not really support those INC files either, I'll have to
      try and accomidate them all).
     See : \test\nasmtest.asm
  - WASM has also been supported:
      Use WASM2EXE.BAT and WASM2OBJ.BAT (it also does not support those INCs)

New stuff in v2.04 *Final*
  - supports Watcom C++ v11.0
    - it seems that the (-7) option I was using is no longer supported but
      (-fpi87) does the same trick and is supported by both 10.6 and 11.0

New stuff in v2.04 Beta #2
  - Now supports Visual C++ Compilers (32bit) CL.EXE
    new BAT files are:
      MC2OBJ.BAT & MCPP2OBJ.BAT - compile to OBJ file
      MC2EXE.BAT & MCPP2EXE.BAT - compile to EXE file
  - outp... fixed (now returns value you gave)
  - fixed scanf() and gets() to use new key codes (use to use old made-up
    key codes)
  - the exec...() bugs have been finaly removed, I've found that Borland
    does it the same way I do so it never really was a bug...

New stuff in v2.04 Beta #1
  - now supports WDOSX dos extender
  - Major Bug fix : filelength() and tell() were using the old 21/42h funcs
      when QLIB was using DOS32 dos extender.  Now fixed to use CX:DX as
      PMODE/W does not extend that func.  This was how DOS/4GW does it too.
  - QLINK executes the SET file differently now.  See compile.txt.
  - All ...2EXE.BAT files will accept OBJs and LIBs to be linked in final EXE
    (ie:  bc2exe prog qgrafix.lib)
  - FIX: random() was not preserving regs
  - NEW:
      void *t_savestate() = saves current video mode (text mode only)
                  - will use malloc()
      void t_restorestate(void *) = restores video mode
                  - does not free memory (just use free() if you no longer
                    need it)

New stuff in v2.03 *Final*
  - added : delay(), sleep(), sound(), nosound()

New stuff in v2.03 Beta #5
  - iASM has been removed from the BAT files cause it causes too many
    problems (see iasm.txt to find out why)
  - grafix fixes : g_put0()
  - grafix additions : g_setfntcolor()
    Sets color to draw mono-coloured fonts.  Mono-coloured fonts are new
    but all they are is just the flags bit in the fnt header set to "1".
    If coloured fonts are loaded then g_setfntcolor() will fail.
  - g_fntcolor() has been removed. (it was used to physically change a loaded
    font to another color instead)
  - the grafix routines have been slightly optimized.
  - stdin,stdout,stderr,etc. were placed back in stdio.h since I removed
    them when I was trying to add Stream IO.  Note they are still just handles
    NOT streams! (fprintf() uses handles not streams)
  - fix : font.c was not creating 32bit fonts properly
  - new : font.c can now create mono-color fonts (option /m)

New stuff in v2.03 Beta #4
  - fixed a major bug in iASM (v1.01 released)
  - fixed a major bug in grafix LIBs that was introduced in last Beta release
  - fixed a major bug in QSETUP (v1.01 released)
  - fixed a minor bug where if main() had parameters then Watcom added
    an 'extern argc' (without the underscore) for no reason.
  - fixed a minor bug in QLINK.BAT where it would not run .SET files
    if DOS/4GW was used instead of PMODE/W
  - time() has been renamed to _time() due to naming conflicts
  - fixed clock() and _time(), were not preserving all regs
  - fixed a bug in realloc()
  - moved directoies around a little
  - The MAKE Bat files in \test have been replaced with actual MAK files
  - QMAKE was created to help a little (actually does not really do
    anything special but what the hay)

New stuff in v2.03 Beta #3
  - fixed more typos in Header files
  - fixed a MAJOR bug in lseek()
    It seems that DOS32 extends DOS func 42h but PMODE/W and DOS/4gw don't
    and since QLIB was orginially desiged for DOS32 it was expecting it to
    be extended.  The result was that seeks beyond 64k would wrap around.
    
New stuff in v2.03 Beta #2
  - fixed major bug in int86...() funcs
  - fixed typos in Header files

New stuff in v2.03 Beta #1
  - Windoze 95 title/close awareness functions added
    see \TEST\Win95.c
  - now CPP compatible !  (but QLIB still does not support streams)
  - wherex() and wherey() added
  - time() and clock() added with time.h (time.inc)

New stuff in v2.02
  - getch() now supports multi-language kbds, so now getch() returns ASCII
    keys in compliance with ANSI C.  My special keys are no longer returned
    but the key_tables are still there and maintained by the IRQ handler.
  - ungetch() was added
  - another total grafix update  (major improvement!!)
    The Grafix Funcs have become more easier to use.  I've made it more
    consistant when setting up video modes.  The 3 funcs are:
    g_getmode(x,y,bpp) - checks if mode is avail. Supports VGA,VESA 1.2 & 2.0
      and modeX.
    g_setmode(void) - sets last mode that was checked with g_getmode()
    t_setmode(x,y) - sets text mode to (x,y)
    Please read VIDEO.TXT within the TXT dir.
    Note : The grafix LIBs are now a seperate LIB from QLIB.  It's called
      QGRAFIX.LIB and you should use QLINK to link it in with your projects.
      See M-GRAFIX.BAT within \TEST for a good example.
  - the DMA alloc funcs have been changed slightly
  - spawn...() was fixed.  Preivously new enviroments were not setup
    correctly

New stuff in v2.01
  - updated PACK file sub-system greatly
    - no funcs were reserving regs (bug)
    - pack_open_hdr() added which is the same as pack_open() but the new
      one requires a header already loaded in memory and a ptr that
      pts to it (see pack.txt) The header comes from a new option with PACKIT
    - lseek has more error trapping
    - pack_init() now takes 2 parameters (see pack.txt)
    - pack_uninit() added : frees buffer and such (disables the whole thing)
      closes all files
    - pack_close() added : closes packed files
  - added random funcs
    - rand(),srand(),random(),randomize()
  - gets(), puts() added (never really needed them before)
  - fixed a bug in callp (v1.05)
  - added BIN2ASM, a utility to convert files into ASM files so you can insert
    them into your EXE file easily
  - clrscr() was clearing too much video RAM and erasing b800h for 16k.
    a mirracle it was never detected until today when for some reason
    my programs where no longer working

New stuff in v2.00 *FINAL*
  - nothin' same as Beta #8

New stuff in v2.00 Beta #8
  - scanf() fixed heavily
  - Watcom Math LIBs fixed (again)

New stuff in v2.00 Beta #7
  - added support for %e (...scanf() supports it too)
  - change OS detection slightly (new variables, see os.txt)
  - and other bug fixes
  - spawn...() bugs have been traced down to a PMODE/W bug, so QLIB was
    working the whole time. (use DOS/4GW until this is resolved)
  - atof() bug fix and supports exp numbers (ie: 4.43e4)
  - ctype.h now includes all those is... macros (stolen from BCv5.0)
    Sorry, not avail in ctype.inc (come on, ASM doesn't need it)

New stuff in v2.00 Beta #6
  - fixed Math LIBs greatly
  - also fixed WC2EXE and WPP2EXE to use Watcom Math LIBs by default which
    for some reason was not setup (that's what you get for block copying)
  - fixed width specs for %f
  - NOTE : the new stdio funcs presented in Beta #5 DO NOT use
    streams, they just use file IO handles.

New stuff in v2.00 Beta #5
  - alloc_phys() now returns NULL on error (as does malloc,calloc and getenv)
  - free_phys() fixed
  - added many math funcs (exp, log, log2 ,log10, pow, sqrt)
  - added some stdio funcs (fprintf, vfprintf)
    These func do not use streams but the stdin,stdout DOS handles!
  - added perror(), sys_errlist, sys_nerr (under 2k)
  - ftoa() now support +/-NAN and +/-INF !!!

New stuff in v2.00 Beta #4
  - pasm now handles single quotes inside the double quotes for you
    Before you had to double them up so that inside _str_.tmp they would
    work.  Anyways...it's fixed
  - fixed realloc() (not even tested before)
  - callp macro now can push REAL10
  Note : I will release this as "v2.00 FINAL" as soon as ALL known bugs are
         squashed. (like the damn spawn...() bug)

New stuff in v2.00 Beta #3ab
  - make.bat in \lib\src was updated to support newer Add-ons to appear soon
  - gui was taken out because a newer version will be introduced soon with
    a visual editor (this will be an Add-on)
  - play was taken out because it will be replaced with AVI support some
    day
  - Add-ons will be GUI,M32(updated and with an editor),SC(sound card services
    supporting SB,GUS)  All this will hopefully happen over the next year.
  - 'play' and the old 'gui' will be available as Add-ons but will be outdated
    someday
  a] fixed alloc.h (realloc() was wrong)
  b] recompiled all EXEs making them smaller because GUI and PLAY were removed

New stuff in v2.00 Beta #2
  - QSETUP was added to control memory alloc during startup
    - fixes a bug that prevented spawn...() and system() from
      working under Windoze (or any DPMI server)
  - HEAP_MIN and HEAP_MAX may be zero now, making the EXE require no XMS.
  - QLITE bat file made (to make compressing easier)
  - bug fixed : vsprintf() was not preserving regs

New stuff in v2.00 Beta #1
  - Now requires PMODE/W
  - dropped the debugger
  - major changes to the video drivers (see video.txt in \txt for
    explaination - functions have been added/renamed!)
    VESA 2.0 is no longer required to use the mouse and stuff (VESA 1.2 is)
    modeX grafix added
  - removed setvect,getvect cause I don't know how they should work in PMODE
    just use setint,getint,setrmint,getrmint
  - support for Borland C complier (bcc32.exe) added (required to make seperate
    math LIB)
  - created new header files which are now more C compatible (see examples)
  - all Video function now are prefixed with 'g_' to unclutter things
    and a few where totally renamed
      v_copy = g_copy
      gset = g_setbuf
  - added support for BCv5.0
  - final switch back to C convention where the underscore is appended to
    all globals/externs (placed a #pragma aux default "_*"; in QLIB.H
    when using the Watcom compiler to allow this)
  - renamed some num2str... procs (see next line)
  - added many, many functions
      getche(), num2strb(str,binary), num2strx(str,hex), num2stro(str,octal)
      ALL "C" string functions (ie: strccpy, strcspn, stricmp, etc.)


--- End of v2.xx ---
