-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
Solace Revision History
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

Release 3.2: Sep 26, 2005

-- New Features --

 *) Previously, Solace's speed regulation routine would kill time until
    the next time slice by polling the message queue.  This caused Solace
    to appear to use 100% of the CPU cycles (which it was), but in fact
    if any other application needed CPU attention, the constant polling
    of the message queue caused Solace to yield.  Nevertheless, it did
    cause more than one person to think Solace was a CPU hog, so I've
    changed the speed regulation logic to use the Sleep() function, even
    though it has very poor granularity.

    Related to this, I changed the code that updates the status bar with
    emulation performance statistics to update about once per second
    whether or not the emulator was in unregulated speed mode.  It is
    easier to read now, and the stats shown are the average over that
    previous second.

 *) Internal change (same flush, different plumbing):
    Code now dynamically attaches handlers to I/O port addresses instead
    of the old static scheme.

-- Bug Fixes --

 *) The emulator rate control was broken for AMD-based systems, at least
    for the Athlon system that I recently upgraded to.  The high-
    resolution performance counter runs 1000x faster than the same
    counter on my Celeron, which resulted in some overflows using 32
    bit math.  I rearranged the calculations to prevent that overflow.

 *) I dropped a line of code somehow, resulting in overlays not working
    properly when more than one was enabled simultaneously.

 *) The debugger SAVE and SAVEH commands were both saving in Intel HEX
    format.

 *) There was a bug where audio, once disabled, couldn't be re-enabled
    after starting up again.  Now you can enable/disable it at will
    without problems.

 *) If the user was viewing the tail part of the log in the debugger
    window and then resized the window to make it larger, the region
    after the end of the log would appear as garbage; now it gets cleared
    properly.

 *) When a program does an IN from an undriven I/O address, the emulator
    used to return 0x00.  It now returns 0xFF because the real hardware
    has pullups on the data bus so undriven addresses return 0xFF.  This
    was caught because the program STARW.ECB was counting on this to
    detect if there was a joystick at a given I/O port.

-- Known Bugs --

 *) If audio is enabled and the CPU is in unregulated speed mode,
    and disk accesses are made sporadically (say from doing CP/M DIR
    commands), the peak CPU speed achieved will settle down to different
    values.  For instance, on my machine, the emulated speed will be
    117 MHz, but sometimes after performing a DIR, the speed will become
    77 MHz, and a subsequent DIR may nudge it back to 117 or not.  This
    will be investigated for the next release.

 *) The code relating to the virtual disk access is in a horrible state.
    A number of times I've started putting in the plumbing to support
    both virtual northstar (.svn) and virtual helios (.svh) disk files
    along with the emulation of the helios disk controller.  Distractions
    have kept me from that task, and rather than delay this bug fix
    release, the code is going out as-is.  Don't look at it or you may
    go blind.


-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
Release 3.1: May 14, 2002

-- New Features --

 * Added source level disassembly to debugger.  From the debugger, type
   "help overlay" to get the details on this overwrought command.
   Also, when loading a ROM/ENT/HEX file from the menu, Solace will
   see if there is a corresponding .PRN file in the same directory
   and will load that as a source code overlay automatically.

 * Enhanced the debugger to put a "splitter bar" between the disassembly
   window and the command log window.  That is, drag the bar between
   these two windows to change the percentage of debugger window real
   estate dedicated for these two functions.

 * Added a "Help" button to the options dialog.  Unfortunately, it
   isn't simple to launch a given URL that contains a target tag
   (e.g., "solace_options.html#DIP3").

 * Solace now emulates the P.T. Music System audio generation hack.
   This is a simple RC filter on the S-100 interrupt enable line,
   which drives an audio amp.  By toggling this line via EI and DI
   instructions, multivoiced music can be produced.  Control this
   option via the "Options/Audio" panel.  In general this should
   be disabled unless running the Music System software because
   otherwise programs that execute EI/DI (such as CP/M) will cause
   annoying clicks on the audio at various times.  The audio can
   also be dumped to a WAV file.

 * Having added simple support for audio, I went overboard and added
   support for sound effects (idea inspired by Bob Stek).  Various
   system activities can be enabled and disabled and volume can be
   mixed to your annoyance threshold.

   The audio generation isn't threaded, so that the illusion can be
   entirely violated simply by selecting a menu item -- audio just stops.

   Another problem is that I used the older Windows multimedia system
   instead of the newer DirectX audio API for maximum compatibility,
   but the net result is that latency from when a sound is initiated
   until it actually drives the speaker can be considerable.


-- Bug Fixes --

 *) Some of the main menu items were missing their status line help

 *) in the debuger command window, hitting <CR> used to ring a bell.
    it got quite annoying very quickly.  I didn't debug it before
    because my PC didn't have a sound card, but now that it does,
    this became a priority!  the solution was to handle the WM_CHAR
    message in the command entry window edit control subclass handler.

 *) if you run Solace on a PC that doesn't have a high resolution timer
    (a really old 386?  a x86 emulator?) and it doesn't support the
    multimedia timer (1ms resolution), solace warns about it but runs
    without speed regulation.  that much is unchanged.  it used to be
    that in these conditions you could still select a CPU speed.  now
    these options are grayed out.

 *) while fixing that previous bug, I noticed a bug in the emulation's
    speed regulation code that had a minor impact if the high resolution
    timer was used but could even hang the emulator if the 1ms timer was
    used.

 *) the toolbar wasn't getting notification when the window was resized,
    so if you made the window too big, the right side of the toolbar
    wasn't there.

 *) the scripting feature (main menu File/Run Script...) was found
    not to work for entering scores for the P.T. Music System
    program.  For whatever reason, the program appears to drop
    keystrokes if it gets a new keystroke every time the keyboard
    status port is polled.  Solace has a new heuristic that when
    scripting is enabled, a new key is returned only once every
    ten times the status register is polled.  Scripting now works
    for MUSIC.


-- Unimplemented Features --

    1) the serial port interface
    2) the parallel port interface
    3) Helios disk system


-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
Release 3.0: Dec 22, 2001

-- New Features --

 * Redesigned the menu system and options control panel.  The intent
   is to reduce menu clutter and to make the control panel easier to
   navigate.  Also, the old "immediate" top level menu items
   ("Options!" and "Debug!") were pretty non-standard uses of the
   menu and are replaced by the more standard toolbar.

   As part of this, the solace.ini file format has changed slightly.
   There is now an entry for the ini file format.  If the version
   string isn't found, it is assumed that the solace.ini file was
   generated by a pre-3.0 version of Solace.

   Also, the windows/main entry used to be the (top,left,bottom,right)
   coordinates of the main emulator window.  However, by adding a
   toolbar, this would end up effectively shrinking the part of the
   window used to display the emulated Sol window.  For pre-3.0 ini
   files, a guess is made how high the toolbar is the window size
   adjusted accordingly.  For 3.0 (and later), the windows/main string
   indicates the window origin and the size of the emulated Sol screen.
   This allows the size and style of the frame to change without
   affecting how much of the Sol screen is displayed.

 * Added support for emulating a Northstar disk controller, along with
   virtual disks usable with that controller.  The actual file on the
   filesystem has a suffix of ".svn" for Solace Virtual Northstar format.
   There is a new control panel for selecting some options, such as:
      + install or remove the disk controller
      + control disk controller board location.  it is strongly advised
        that you leave it at 0xE800 unless you bother to create a virtual
        disk that expects it at a different location.  All the virtual
        disks on the Sol Archive will expect 0xE800 unless otherwise noted.
      + debugging support.  if you ever decide to debug a disk driver,
        the emulator can check that certain disk control lines are
        driven properly.  with the debugging option set, warning boxes
        pop up and allow you to either ignore the warning or invoke
        Solace's 8080 debugger

 * Added "Disk Factory" modal dialog box in support of virutal disk
   feature.  With this dialog box, you can:
      + create a new virtual disk, optionally installing CP/M boot tracks
      + inspect format of an existing virtual disk
      + edit the disk label
      + set/clear the write protect tab
      + dump the contents of a virtual disk in a simple text format

 * Created a new SOLOS image, located in the ROMs subdirectory.
   solos_cpm.rom removes an annoyance in the standard SOLOS when
   running CP/M that caused all user entered command lines to be
   erased as they were entered.

 * Added a few specially trapped illegal 8080 opcode sequences that
   can be used for performing magic under 8080 program control.
   These features are used by the CP/M utilities "import.com" and
   "export.com" for transferring files between CP/M and the host
   system in a most convenient fashion.

 * Made it so the position of the options window is saved between
   sessions when "Save Options" is selected.

 * Made it so the size, position, and open/closed state of the
   debugger window is saved between sessions when "Save Options"
   is selected.

 * Restructured breakpoint/exception handling.  The old way was
   more efficient, but caused havoc with the disk controller if
   a breakpoint was hit during that code.

 * The built-in personality ROM image is now the standard v1.3
   SOLOS modified with a patch to make it work better with CP/M.


-- Bug Fixes --

 *) 8080 used P flag strictly for parity, eg, even "ADD A,nn".
    The Z80 uses it as parity for some instructions and for
    overflow (V) for other, such as "ADD A,nn".  Solace uses
    a Z80 emulator written by Marat Fayzullin to emulate the
    8080.  I wasn't aware of this difference, so Solace used
    to treat the P flag like the Z80's P/V flag.  This didn't
    seem to cause any programs to misbehave, but you never know...

 *) In certain cases, a multiline string would be sent to the
    debugger command history window, but it didn't always deal
    with the embedded newlines properly, and the display would
    look a bit odd (it all came out as one like with a box symbol
    where the newline should have been).

 *) In the debugger, using the "exit" command would cause the
    debugging session to forget all of its state (history,
    breakpoints, etc).

 *) A couple of the top-level menu items were missing their
    help strings that show up in the status bar area

 *) scrolling debugger dasm window to before 0x0000 caused the
    instruction at 0x0000 to be displayed repeatedly.

 *) using the integrated debugger, if you added some breakpoints,
    then removed some breakpoints, then added some breakpoints,
    the breakpoints would work OK, but the wrong breakpoint number
    would be indicated (and sometimes an error message).

 *) release 2.3 broke saving to tape in realtime mode.  fixed.

 *) not exactly a bug, but a change of heart.  For some reason,
    I had things set up to complain if the solace couldn't find
    a ROM image in a default place when it started up, and then
    use the built-in ROM image.  I've decided that was too
    harsh and obtrusive.  Instead, I've set things up to complain
    only if there is a solace.ini and it explicitly specifies an
    external ROM image.  So by default, Solace will silently use
    its internal ROM image unless told to try something else.


-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
Release 2.3: May 27, 2001

-- New Features --

 * At the request of Paul Schaper, I added these three debugger commands,
   based on similar commands from NSDOS' debugger: MM CM SM

 * Typing normal text while the input focus is on the tape player
   dialog will redirect the keystroke to the main window and will
   shift focus there as well.  (idea from Dudley Henderson)

 * A defeaturing, actually.  Solace used to force the numlock state
   to TRUE when the main window caught focus, and then it would return
   numlock state back to whatever it was when focus was lost unless
   the user had actually changed the numlock state in between.  The
   option to have this behavior is still in the code, but it is
   compiled out by the setting of the DIDDLE_NUMLOCK var defined in
   solace.h.  It didn't work on NT anyway; diddling numlock must be
   different on that platform.

 * Added a new feature to the tape dialog: optionally there is a
   checkbox that allows a user to force the tape motor enable input
   to the recorder.  Oftentimes a user would like to rewind, play,
   or fast forward a tape yet the Sol is busy running some program.
   Normally the user would have to quit/suspend the program, do
   some tape command like CAT to energize the tape motor enable
   relay, then forward or rewind the tape, then go back to the
   application.  Instead, some users either pulled the motor
   "remote" wire out, or they added a switch to force the motor
   enable.  Thus, while that progrm was running on the Sol, if they
   wanted to rewind they just throw the switch, rewind, then turn
   the switch off.  (Requested by Dudley Henderson)

   To enable this option, go to the "Options/Tape" tab and select
   the "Allow Forcing Motor Enable" checkbox.

 * Added a couple of scripting features, at the suggestion of Paul
   Schaper.

   There is now a "File/Run Script..." menu item on the main window.
   A filename is given and then simulated Sol keyboard input comes
   from the specified file.  Files can be nested three deep; a new
   file is invoked by having a line in the following format:
         \<include anotherfile.name>
   However, there should be no leading spaces on the \<....
   Each end of line automatically generates a simulated RETURN key
   stroke.  Files can also have "metakeys" that can be one of the
   following strings on the left, with the corresponding keystroke
   value on the right:
        \<LF>     (0x0A)
        \<CR>     (0x0D)
        \<DEL>    (0x7F)
        \<MODE>   (0x80)
        \<LEFT>   (0x81)
        \<CLEAR>  (0x8B)
        \<LOAD>   (0x8C)
        \<HOME>   (0x8E)
        \<RIGHT>  (0x93)
        \<UP>     (0x97)
        \<DOWN>   (0x9A)
   Finally, a specific keycode can be specifed in hex.  Eg:
        \3D       (=)
        \5C       (\)
        \7F       (DEL)

   The debugger has a script interface that is invoked by
   typing the command
        include filename.scr
   where "filename.scr" is the name of the actual script
   to be read in.  Nesting is also three deep here and is
   invoked by including a line of the form:
         \<include anotherfile.name>
   Unlike the scripting facility of the main program, the
   debugger scripting does not interpret metakeys.

   NOTE: SOLOS and other programs often poll the keyboard
         while they are performing output to the screen;
         they may be looking for the MODE key or CTRL-C or
         a press of the space bar.  At any rate, this will
         characters from any script that is running unless
         something is done about it.  The script facility
         in Solace has the following heuristic to try and
         prevent this.  It isn't perfect, but it is better
         than nothing.

         Any time the script produces a carriage return,
         a timer is set for 100 ms to suppress any further
         script interpretation until the timer times out.
         If any of the memory mapped locations are written
         to, indicating output from the program, the timer
         is reset back to 100 ms.  This works OK for the
         most part, but it isn't perfect.  If you have a
         better idea, let me know about it.


-- Bug Fixes --

 * The SVT file format presumed that all filenames would consist only
   of printable ASCII characters, zero padded if less than five chars
   long.  This isn't necessarily so.  The file name now has an
   escape mechanism for specifying odd names.  The escape is the
   backslash (\) character, followed by two hex digits.  If the real
   filename contains a backslash, it should be represented by "\5C".
   If a name is less than five characters long, it will be padded out
   with 00 bytes (which is what SOLOS does on the command line).  If
   you need space padding, say on filename "ABC", do it like this:

        H ABC\20\20 42 0100 0100 0100

   otherwise it will be assumed to be ABC\00\00.

 * When an SVT is read into memory off of disk, if there is an error
   in the file format, Solace will not indicate the line in error.
   Before, it simply said that something was wrong with the file with
   no indication as to where.

 * If the write protect tab of a virtual tape was changed but nothing
   else was modified on the tape, Solace didn't consider the tape
   "dirty" and thus wouldn't prompt the user to save the change on exit.

 * Dip switch 1 and 4 have only six switches; Solace used to have
   eight switches there, although switch 7 and 8 were n/c's.

 * If the display was scrolled while the bottom of the display was
   offscreen, the scroll would mess up.

 * If both tape drives motor were enabled, odd things could happen.
   The emulation still isn't perfect, but better than it was.  For
   instance, if you do a CAT and both tapes are playing, in real life
   noting intelligible would result, but in solace one or the other
   will be read.

   Doing things with both motors enabled isn't heavily tested.
   Don't push your luck.


-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
Release 2.2: Feb 19, 2001

-- New Features --

 * The most significant change is that Solace now supports virtual tapes.
   There can be two tape decks.  The file extension for the virtual tapes
   is .SVT, for Sol Virtual Tape.  The file format is ASCII, which makes
   for easier construction and debugging.  This feature now allows
   running and saving data and programs from cassette BASIC.

 * solace.ini now logs more information:
      - the main window size and position
      - the tape drive open/closed state and position
      - the default file for the boot ROM
      - the default dir for binaries
      - the virtual tape configuration options

 * If Solace can't find the ROM image on disk, it defaults to a
   built-in image of SOLOS.

 * Whenever the run state changes from running to halted (including
   after each step or next command), the current state of the
   registers is logged along with a disassembly of the next
   instruction to be executed.  This is very useful when single-
   stepping.

 * When ever a breakpoint is hit, the debbuger now blist's the breakpoint,
   rather than blandly saying "breakpoint #n has been hit"

 * When adding, enabling or disabling a breakpoint in the debugger,
   rather than just saying "breakpoint n" has been added or changed,
   it is blist'ed.

 * When the debugger window first popped up, it defaulted to whatever
   size windows thought appropriate.  For high-res displays, it was
   ridiculously large.  Now it is set to 640x480 by default.

 * Not a new feature, but fileio.c was renamed to hexfile.c and was
   significantly rewritten to allow serialized access to either an
   ENT file or a HEX file.  Part of this new functionality was
   required by the virtual tape feature (source file indirection).

 * The Devanagri font uses 8b per scan row instead of 7b like the
   normal font.  Changed to use 8b.

 * The About box now has a button that brings up the web page.

 * Added "Help/Debugger" and "Help/Virtual Tapes" menu items.

 * Restructured the release directory structure to make the top
   level less cluttered.


-- Bug Fixes --

 * The status bar menu help message that pops up associated with
   FILE/SNAPSHOT always indicated that snap0000.bmp would be
   created.  It now dyamically shows the real next file name to
   be created.

 * Changed REGS debugger window to show decimal values without
   leading zeros.

 * Dumping memory to an intel-format hex file started with the line
   "ENTER xxxx", which for the ENT format, not the intel hex format.

 * solos.ini and snap0000.bmp used to be saved in whichever dir
   was most recently visited (say, after a "load program") instead
   of in the same directory where solace.exe lives.

 * fixed quite a few win32 handle leaks and cases where an object
   was deleted just before it was deselected from a DC.

 * Got rid of the "TICK" field in the debugger registers subwindow.
   It wasn't hooked up to anything.

 * The horizontal scrollbar in the debugger DASM window was often
   active even though the screen was quite wide.

 * Adding, removing, then adding more breakpoints could cause
   weird behavior.

 * Removing a breakpoint echoed the array index in the status
   message rather than the logical breakpoint number.

 * If more than 9 breakpoints had been defined at some time, the
   debugger interpreter could get confused whether we were using
   decimal or hexidecimal arguments.

 * The status message that was logged when the PC hit a breakpoint
   was reporting a 32b PC value instead of 16b, with the top 16b as
   garbage.

 * The screen snapshot code didn't take the scrollshade state into
   account.

 * If the bottom few lines of the screen were clipped, scrolling
   could cause an incorrect display.


-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

Release 2.1: Dec 2, 2000

This is a brief note on the state of the Solace Sol computer emulator.
Please also read the todo.txt file for some insight into my priorities
of things to fix and planned enhancements.

-- New Features --

 * added scrollshade behavior, even though no known program other
   than my test program uses it.  :-)

 * added emulation of IN 0xFE port, hsync and scroll timer.
   no program that I know of uses them.

 * added emulation of IN 0xFE port, the sense switches.

 * changed SW1/SW2/SW3/SW4 menus to instead be a tabbed,
   modeless, dialog box.  besides removing some clutter from
   the menu bar, there are a few generic 8080 programs around
   that expect input from the sense switches in real time
   (programs that originated on altair, imsai, and the like).
   manipulating the sense switches from a menu was difficult.

 * SW1-1 now resets the emulated computer, as it should

 * moved character generator selection to the new tabbed
   "options" dialog box.  added mode to support alternate
   font selection as implemented by Dudley Henderson in
   his Sol.  It allows editing in Tibetan fonts!  This mode
   is disabled by default as it is rather specific.

 * Solace now looks for "solace.ini" in the current directory
   on start up to initialize various options.  there is a
   corresponding menu option (underneath the File menu) to
   save the current options to "solace.ini".

 * added LOAD, SAVE, and SAVEH commands to debugger CLI

 * added the debugger command "KEY nn" to force a keystroke.
   pinched the idea from applewin, the apple II emulator.

 * improved keyboard emulation.  in previous versions of Solace
   holding down the CAPSLOCK and F1 keys (emulating reset from the
   keyboard) would cause the emulator to repeatedly reset.  Now,
   the screen goes black until either key is released.

   also, like a real Sol, you can get typematic action by holding
   down <REPT><someotherkey> or <somekey><REPT> (ie, in either
   order).  It used to be that <REPT> had to be the first one
   held down.

 * emulate non-infinitessimal duration of keyboard strobe.  when
   a key is pressed on the keyboard, there is an async strobe of
   approximately 6 uS where the strobe is active.  normally, this
   strobe is gone before the software gets around to reading the
   key.  however, if the key is read while the strobe is still
   active, the "key ready" flop remains set and it looks like the
   key was hit twice.  here is a small program that you can run
   on Solace or on a real sol to show the problem, courtesy of
   Paul Schaper:

        EN 0
        0000: DB FC FE 97 C8 32 00 CC C3 00 00/

        IN 0FCH
        CPI 97H     ; check for up-arrow
        RZ
        STA 0CC00H
        JMP 0

        It displays the last key pressed onto the screen.  While
        running, any key I press is displayed.  If I press the
        arrow key, it returns to Solos.  In Solace, I always get
        just a prompt.  On my Sol, I get a prompt and then the
        prompt jumps up a line (Solos acted on the up-arrow) 90%
        of the time.  (That is, I press LF, ^, LF, ^ to enter/exit
        the program but 10% of the time, Solos didn't execute an ^.)

 * added a program icon.  I'm no artist, that's for sure.
   Looks OK in 32x32 mode, but terrible in 16x16.


-- Bug Fixes --

 * the "solos.rom" ROM image that was distributed with earlier
   versions of Solace was functional, but unfortunately wasn't
   very compatible with the vast majority of Solos ROMs out there.
   A slight change in the code caused the starting address of many
   routine entry points to change.  Although it shouldn't make a
   difference, many programs made use of those ROM-resident routines
   and thus broke.

 * fixed a bug in disassembler pane scroll logic where scrolling
   backwords would sometimes trigger an assert.

 * fixed a bug in stack debugger window where a change in the
   even/oddness of SP wasn't accounted for.

 * changed OnPaint handler in command log window to greatly
   reduce the amount of flashing on a resize event (especially
   when doing dynamic resizing).

 * whenever a breakpoint was added or changed in the debugger,
   the dasm window would go and scroll the current PC back into
   view.  now it only does that after entering debug mode, after
   single step, or after changing the PC manually (set pc xxxx).

 * the disassembler window would sometimes go wild.  While I was
   at it, I made the current PC appear on the 4th line of the
   window whenever the current PC wasn't already displayed
   somewhere in the current window.


-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

Release 2.0: October 30, 2000, limited release

-- New Features --

 * added debugger interface.  allows disassembly, breakpoints,
   single step, memory & register viewing & modification.  it
   is a combination CLI (command line interface) and GUI affair.

 * removed support for Z80.  no point in having it; it isn't
   historically accurate, it complicated the debugger, and it
   made the binary bigger.


-- Bug Fixes --

 * fixed small bug; chars of exactly value 0x80 in display didn't
   track on/off/blink state

 * fixed small bug: refresh display after loading a program just
   in case all/part of the loaded data fell into screen space


-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

Release 1.1: July 11, 2000
    First public release.

-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

