ChangeLog
---------

Version 1.3.0 - 18-Jan-2024:
 - splib:
   - system.inc:
     - Added check that OPTION EXPLICIT is set; throws ERROR if not.
     - Added sys.run_shell(), sys.read_shell_file$() and sys.write_shell_file()
       to support a new mechanism for launching a program from a "shell"
       program and then returning to the "shell" when finished.
     - Removed internal use of sys.is_platform%() with the intent of removing
       the function entirely in the future.
     - Fixed syntax error in sys.format_firmware_version$().
   - array.inc:
     - Added array.find_string$() function.
   - ctrl.inc:
     - Added Linux/USB gamepad support.
     - Added PicoMiteVGA Wii controller support.
     - Added missing entries to PS/2 scan-code map.
     - Added ctrl.default_driver$() and ctrl.open_no_error%() functions.
     - Added mapping from ENTER key to SELECT in keys_cursor_ext() function.
     - Fixed bug where a controller driver that failed to open would be
       recorded as opened.
     - Several other minor changes.
   - file.inc:
    - Fixed bug in file.mkdir%() where it was not skipping the path string's
      length byte and thus failing when the length was the ASCII code for
      '/' (47) or '\' (92).
   - game.inc:
     - Replaces 'gamemite.inc' adding several new routines to support
       Game*Pack:
         - game.init_window()
         - game.on_break()
         - game.on_window_event()
         - game.highscore_file$()
         - game.highscore_read()
         - game.highscore_write()
     - Changed game.end() to return to menu/shell even when the break% flag is
       set.
     - Removed gamemite.file$() function; replaced by the new "shell" mechanism
       and/or local routines in the Game*Mite startup and menu programs.
   - menu.inc:
     - Changed to use 'keys_cursor_ext' keyboard driver and respond to
       ctrl.HOME.
   - msgbox.inc:
     - Changed to backup and restore display after the message box has been
       dismissed.
   - txtwm.inc:
     - Added global twm.console_only% flag to allow use without a graphics
       display.
 - sptest:
   - Added assert_string_neq() subroutine.
   - Fixed bug when error text > 255 characters.
   - Fixed bug on MMB4L caused by calling the non-existent (in MMB4L) DRIVE
     command.
 - sptrans:
   - Added support for replacing literal strings using !REPLACE directives.
   - Fixed bug in symbol processing that was caused by the 8-digit hex words
     in CSUB/DEFINEFONT being treated as TK_IDENTIFIER tokens; they now have
     a unique TK_WORD type.

Version 1.2.0 - 3-Feb-2024:
 - splib:
   - Added subs/functions to 'bits.inc' to handle bit-sets > 64 bits:
       bits.big_clear()
       bits.big_fill()
       bits.big_get%()
       bits.big_set()
     and also for 64-bit sets:
       bits.fill()
   - Added str.reverse$() function
     - reverses the characters in a string.
   - Added str.rtrim$() function
     - right trims spaces from string.
   - Added array.qsort_ints%() function
     - quick sorts array of integers using user specified comparison function.
   - Added sys.HOME$(), sys.SEPARATOR$() and sys.TMPDIR$() functions
     - replaces sys.string_prop$().
   - Added sys.PLATFORM$() function
     - returns value of MM.INFO$(PLATFORM) if implemented and non-empty,
       otherwise value of MM.DEVICE$.
   - Added gamemite.file$() function
     - given a non-absolute path looks for and returns file relative to
       "A:/GameMite" or if not found, "B:/GameMite".
   - Added 'spupdate' utility which updates a local copy of the 'splib'
     directory from a checkout of the 'master' branch.
   - Changed menu.msgbox%() to support
     - message boxes with only one button.
     - optional frame colour.
   - Changed sys.format_firmware$() to handle new (v0.6.0+) MMB4L version
     number.
   - Renamed sys.is_device%() => sys.is_platform%().
   - Fixed bug in sys.is_device%("gamemite") which would always return 1 if not
     pre-processed.
   - Fixed bug in map2.put() when element already present.
 - sptest:
   - Added option 'use_hex%' flag to assert_int_array_equals() which if set
     causes it to use hexadecimal format.
 - sptrans:
   - Added new features/options:
     -L, --list-all    Output lists of identifiers, functions/subs,
                       references and orphan functions/subs.
     -T, --tree-shake  Remove unused functions/subs.
   - Added new directives:
     !DYNAMIC_CALL <fn-name>       Flags function/sub so it isn't removed by
                                   tree-shaking, required if a function/sub is
                                   only called via the CALL command/function.
     !DISABLE_FORMAT [ ON | OFF ]  Disables/re-enables auto-formatting for a
                                   section of code.
   - Fixed indentation when auto-formatting END IF construct.
   - Changed auto-formatting to always include space after FLOAT,INTEGER,STRING
     keywords.
   - Added missing entries to keyword list.

Version 1.1.0 - 1-Oct-2023:
 - gonzo:
   - Fixed --version command line argument.
   - Fixed undeclared variable bug in gonzo.check_arg_min%().
 - splib:
   - Changed sys.VERSION to be a 6 or 7-digit integer: {A}ABBCDD
     - {A}A is the 1 or 2-digit major version.
     - BB   is the 2-digit minor version.
     - C    = 0 for alpha
            = 1 for beta
            = 2 for release candidate
            = 3..9 for release.
     - DD   is the micro version if c <= 3.
            If c > 3 Then CDD - 300 is the micro version.
     e.g. 1234567 would be version 12.34.267
   - Added function sys.format_firmware_version$()
     - replaces the 'fw%' parameter to sys.format_version$().
   - Added subroutine menu.process_key().
 - spsh:
   - Fixed --version command line argument.
 - sptrans:
   - Fixed BOUND and CHOICE not being recognised as keywords.

Version 1.0.0 - 13-Sep-2023:
 - First official release including another three years worth of
   undocumented changes; I hope to do better going forward.
 - This is the version used to build the GameMite v1.0.0 code.

Version 1b3 - Unreleased:
 - Changed maximum number of tokens supported per line from 100 => 255.
 - Fixed bug where internal error was reported when input file was not found.
 - Added additional utility code to 'src/common'.
 - Changed naming standard for all code to use a '.' instead of an '_' to
   separate the 'package' prefix from the function/subroutine/variable name.

Version 1b2 - 18-Aug-2020:
 - The package has been renamed to "SP Tools" and the GitHub address changed
   correspondingly: https://github.com/thwill1000/sptools

   It currently consists of 3 programs:

     spflow  - Generates graph of function/subroutine dependencies for MMBasic.

     sptest  - Unit-test framework for MMBasic,
               * rudimentary at the moment and requires Option Base 0.

     sptrans - Transpiler and code-formatter for MMBasic.
               * code-formatting is ropey as I've found out trying to use it
                 on the "Welcome Tape" project.

   See https://github.com/thwill1000/sptools/blob/master/README.md for more
   details.

 - Increased maximum number of tokens supported per line from 50 => 100.
 - Added support for identifiers with ! or % suffixes; $ was already supported.

Version 1b1 - 22-Jul-2020:
 - Initial public beta.
