Anything contained in this readme.doc file supercedes anything
in the lowsrc.doc file.

CHANGES
=======
   Version 1.02 - First general release

   Version 1.03 - Fixed bug in UltraSetVolume()

   Version 1.04 - FIxed bug in UltraMaxAlloc()

   Version 1.05 - Linear volume functions are now linear.
		- Source files split up so objs are separate. This
		  will make your code smaller.
		- Microsoft libraries provided.
		- Changed some prototypes from int to unsigned char.
		  My lint checker liked ints better. The values
		  were 8 bit so I set the prototyes appropriately.
		- Added support for 2 Adlib-type timers.
		- Included interrupt callback functions. These
		  were done before but inadvertantly left out of
		  the libraries.

   Version 1.06 - Added functions to return state of DMA channel(s)
		  UltraDramDmaBusy,UltraSampleDmaBusy
		- Fixed potential problem with UltraPeekData and
		  UltraPokeData
		- Fixed bug in UltraVoiceStopped and UltraVolumeStopped
		- Added an support functions for sending/recieving data
		  thru midi port.

   Version 1.07 - Fixed bug in restoring the interrupt vectors when
		  closing out the card. A benign problem for the most
		  part. Deadly if irq 7 was used.

   Version 1.08 - Changed the upload & download functions to accept
		  a far pointer to the buffer of data to send/receive.
		- Added some of the recording functions. More complete
		  documentation to follow.
		- Fixed a bug in the download. Problem downloading if
		  buffer ended on a 256K page boundary. The memory
		  allocation structures would be blitzed.
		- IRQ and DMA channel's can now be NOT programmed for
		  the board. If any of the parameters are set to 0,
		  the corresponding latch on the board will be setup
		  such that it will not be used. This will allow the
		  application NOT to use up a PC resource. This can
		  be handy if resources are tight.

   Version 1.09 - Documentation change. UltraPokeData takes 3 arguments.
		  Prototype was correct, documentation was wrong.
		- Cleaned up documentation, added couple prototypes.
		- Added cdecl's for those who might need it.

   Version 1.10 - Added functions to allocate/deallocate voices. These
		  could have been done by the application, but is useful
		  to add here.
		- Fixed documentation on UltraMemFree(). Had arguments
		  flipped.
		- Changed some of the source code to make recompiling for
		  Watcom C.
		- Added support for 3D sound implementation

   Version 2.00 - General documentation cleanup. Spelling, grammer etc..
		- Added a lot of hardware specific documentation
		  (Theory of operation, register level defs etc)
		- Fixed bug in volume ramping. Problems when the ramp
		  values are the same.

   Version 2.01 - Fixed bug in UltraAngPosition()
		- Changed init procedure to set locations 0&1 to 0. All
		  voices point there & will cause problems if their
		  volumes are raised. (clipping when they are summed in).

   Version 2.02 - Some of the 3D functions had their names spelled
		  with a capital D. They were changed to a small d to
		  be consistant with the documentation. Some compilers
		  would generate an error since the case didn't match.
		- UltraMidiEnableRecv and UltraMidiEnableXmit were flipped.
		  They turned each other's IRQs on instead of their own.
		- UltraMidiDisableRecv and UltraMidiDisableXmit were flipped.
		  They turned each other's IRQs off instead of their own.
		- Fixed documentation on UltraStartVoice. When playing a
		  sample in reverse, the BEGIN location should be the
		  largest, the start of the loop should be next and the
		  end loop address should be the smallest.
		- Fixed bug in UltraStartVoice(). A sampled attack was
		  not done properly. Playing a sample backwards was also
		  incorrect.
		- Fixed documenation Appendix C. Bit 6 is the direction
		  bit. 0 means increasing addresses. 1 means decreasing.
		  It is not normally necessary to set this bit.
		  UltraStartVoice will set it if the start address is
		  greater than the end address.
		- Cleaned up the makefiles a bit.
		- Corrected doc on return values for UltraRecordDmaBusy()
		- Changed the segment group names for Borland tiny model.
		  Makes a .sys driver easier.....
		- Added a UltraDup3d function. Will create another handle for
		  the same 3D data. Saves DRAM. UltraCloseDup3d added also.
		- Fixed bug in UltraAlocVoice. Didn't init variable and
		  could return OK when there were no free voices.
		- Moved some misc. global variables into _gf1_data struct
		- Changed initial mixer setting to everything disabled
		- Added support for the rollover bit
		- changed    inportw to inpw
			     outportw to outpw
			     inport to inp
			     outport to outp
			 so it will compile with Borland C++ 3.1
		- Fixed bug. Stopping a 3D sound abruptly would leave the
		  volume at whatever level it was at. It should have
		  ramped it down to zero.
		    - Made functions use ANSI calling sequence.
		- Add support for rollover bit

   Version 2.10 - PASCAL routines added by Kurt Kennett of Ingenuity
		  Software.  These routines are a direct analog translation.
		- The documentation was completely reworked to allow for
		  this interface.  As a result, new sections were added
		  to chapter 1, chapter 3 was slimmed down, and the
		  appendices were changed to accomodate both languages.
		  The section with the least # of changes was chapter 2.
		- The addition of PASCAL calls and the total rework of
		  the documentation justified a full minor revision
		  update. (2.02 to 2.10).

   Version 2.11 - Fixed bug in PASCAL version : UltraGetVoice returned
		  only one voice before not allowing any more voices to
		  be allocated.  Pascal 'LoadMod' example file fixed.
		  Source code included in this version.


