Version 2.6:
- Added IVT structure generation. It uses a new syntax to specify the IVT contents.
	
	ivt (
		entry=0,
		dcd=0,
		boot_data=0,
		self=0,
		csf=0
	)

- All fields of the IVT are optional. Each field can be assigned to any constant expression, including
  symbol references like elffile:_start, etc.
- An IVT definition can be used anywhere you can specify a data source. Most usefully, in a load command.

	load ivt (entry=myfile:_start) > 0x100;

- The IVT definition is fairly smart about the self pointer. If the self pointer is not specified, it will
  be assigned the value of the load address. So in the above example, self would be set to 0x100 automatically.
  If the self pointer is explicitly set in the definition, then the IVT has a natural address (equal to the
  self pointer) and can be loaded without having to give a target address. The example below is equivalent to
  the one above:

	load ivt (entry=myfile:_start, self=0x100);

- To invoke the IVT and call the entry point address, you need to use the hab call/jump command. To invoke
  the IVT loaded by one of the above examples, you could use:

	hab jump 0x100;

  The address specified in the call/jump statement is not the entry point itself, but the address of the
  IVT structure in memory.
- One argument may be specified in the call/jump statement, just as with normal call/jump statements. For
  instance, passing 1 to the entry point:

	hab jump 0x100 (1);

Version 2.5.1:
- Removed -s/--key-set option used only for 36xx.
- Extended the -k/--key option to work for 36xx. In 36xx mode, the first -k option on the command
  line is used to specify the 
path to the key set file.

- This was done to simplify the command line interface and make the 36xx support less noticeable.

Version 2.5:
- Added 'mx28', 'imx28', and 'i.mx28' chip families.
- Only the mx28 families now enable the HAB related keywords ("dcd", and "hab"). If you try to use
  those keywords with other chip families, an error will be reported.
- Otherwise, the mx28 families are the same as 37xx.

Version 2.5b1:
- First version with HAB support.
- Added 'mx233', 'imx233', and 'i.mx233' chip families that are aliases to '378x'.
- The load statement now takes an optional "dcd" keyword after "load". When this keyword is present,
  a flag bit is set in the load command telling the ROM that this is a DCD load.
- Similarly, the call and jump statements now accept a "hab" prefix keyword that also sets a command
  flag interpreted by the ROM.
- New command variant syntaxes:

	load dcd <source> [ '>' <target> ];

	hab call <target> [ '(' <arg> ')' ];

	hab jump <target> [ '(' <arg> ')' ];

Version 2.2.6:
- Changed how comma-separated lists of section names work. Previously, each successive section
  name would filter the results of all previous ones. Now, positive section names add matches while
  negative ones (with a '~' prefix) subtract matches from the combined set of all previous section
  names. Another way to think of this is as a Boolean expression, where positive section names are
  an OR and negatives are an AND NOT.

Version 2.2.5:
- product and component version numbers are now written in the correct byte order

Version 2.2.4:
- the sizeof() operator now accepts a source name, for which it will return the file size in bytes

Version 2.2.3:
- fixed an awful bug that prevented elftosb from ever seeing .secinfo sections

Version 2.2.2:
- added second 'sgtl' signature to the file header to distinguish it from the 36xx .sb format
- binary sections now accept any data that can be loaded with a load statement
	- for instance:

		section (0) <= "put a string in this binary section";
		section (1) <= {{ 00 01 02 03 }}; // raw binary data

- there is also a new shorthand syntax for selecting a subset of sections from an ELF file
	- this syntax can be used for binary sections or load statements
	- the grammar:

		TOK_SOURCE_NAME '[' section_list ']'

	- examples:

		section (2) <= app_elf [ $.pageable.* ];
		
		section (3) {
			load app_elf [ ~$.pageable.* ];
		}

Version 2.2.1:
- dramatically improved processing time for large S-record files

New features for elftosb 2.2 from 2.1:

- search paths
	- use the -p/--search-path command line switch to add a search path
	- any number of search paths are allowed
	- search paths are searched in the order they were added
	- the cwd is an implicit search path at the beginning of the list
	- all input files (bd, sources, keys, etc.) use the search paths

- support for "true" and "false" values set from the command line
	- applies to setting option or constant values using -O or -C
		- example: -O enableSections=true
	- as in the bd file, true=1 and false=0

- improved formatting for dumping 36xx .sb commands

- support for sections in the 36xx .sb format
	- uses previously unused command 0x8 as SECTION_TAG_CMD
		- address field is the section size in bytes, following the tag command
		- byte count field is the section identifier ranging from 0-0x3fff
			- a warning is logged if the identifier exceeds this range
	- this feature will only work in cooperation with a ROM patch that adds section support
	- section support is disabled by default
	- to enable, set the "enableSections" option to 1 (the keyword "true" works nicely)

- ability to set options that apply only to a section
	- the syntax is:
		section (0; option=const_expr, option=const_expr, ...)
	- after the section identifier, you can place an optional semicolon and comma-separated
	  list of option assignments
	- this works for both bootable sections and data sections

- new options that apply to 37xx .sb sections
	- "alignment"
		- accepts any power of 2 greater than 16 (the minimum alignment, guaranteed by
		  the cipher block size of the 37xx .sb format)
		- values of 16 or less are ignored
		- aligns the start of the section contents, not the boot tag
		- padding is filled with nop boot commands
	- "cleartext"
		- accepts a boolean value (0 or non-zero, true or false, etc.)
		- when true, the section(s) to which it applies will remain unencrypted even
		  when the rest of the boot image is encrypted
		- a ROM_SECTION_CLEARTEXT (0x2) flag is set on the section
	- as with all options, these can be set globally or just for individual sections

- new if statement for use in bootable sections
	- syntax is:
		if bool_expr
		{
			stmt_list;
		}
		else if bool_expr
		{
			stmt_list;
		}
		else
		{
			stmt_list;
		}
	- "else" and "else if" branches are optional
	- curly braces are not optional
	- there can be any number of "else if" branches
	- boolean operators: >, >=, <, <=, ==, !=, &&, ||, and unary !
		- && and || operators short-circuit
	- parentheses are not required around the boolean expression but may be used if desired
	- special function operators that can be used in boolean expressions:
		- exists(src_file)
			- simply returns true if the named source file is valid
		- defined(const_name)
			- returns true if the constant has been assigned a value either in a
			  constants block or from the command line
			- because && and || are short-circuit operators you can do this:
				if defined(value) && value > 0 {
					// do something
				}
			  and the second use of value will not cause an error if the
			  defined operator returns false.
	- if statements can be used within from statements and vice versa
	- if statements can themselves be nested any number of times
	- example:
		section (0; alignment=4K)
		{
			if exists(helloFile) && frump > 10
			{
				info "loading $(helloFile)";
				load helloFile;
				call helloFile;
			}
			else if exists(anotherFile)
			{
				info "loading $(anotherFile)";
				load anotherFile;
				call anotherFile;
			}
			else
			{
				error "no files present to load!";
			}
		}

- sources are now optional
	- if a source file is listed and not used, it is OK if it doesn't exist
	- applies to both extern sources and ones with an explicitly listed path
	- instead of an error being generated when scanning the sources block, you will now
	  get an error at the point of use if you try to use a source file that does
	  not exist or was not provided on the command line (in the case of externs)
	- in verbose output mode a message will be printed if a source file cannot be found
	  while processing the sources block

- the format version set in 37xx .sb boot images is now set to 1.1
	- this is to denote the alignment support, new section flag (ROM_SECTION_CLEARTEXT),
	  and new drive tag field in the header
	- the 37xx ROM ignores the minor version, so it won't have an issue with this change

- errors are now returned if a key file cannot be found or opened

- Both C multi-line command and C++ style end-of-line comments are now supported
	- /* like this */
	- // and like this
	- The older shell style comments are still supported as well.

- fixed a bug related to insertion of padding for data sections whose size is not evenly
  divisible by the cipher block size

- fixed some minor memory leaks

- new statements to print messages to stdout
	- syntax is:
		info "message string";
		warning "message string";
		error "message string";
	- info just prints the message as-is
	- warning prefixes the message with "warning: "
	- error raises an error and stops the conversion process
	- integer constant values and source paths can be substituted in the message
		- uses the standard "$(name)" syntax
		- parentheses are required

- symbol references may be used in any integer expression
	- syntax:
		[source_file]:symbol_name
	- the source file is optional if within a from statement, otherwise it is required
	- the symbol reference has the value of the symbol, usually its address
	- if the symbol does not exist, the reference has a value of 0

- sizeof operator
	- syntax:
		sizeof(const_name)
		sizeof([source_file]:symbol_name)
	- parentheses are required
	- may take the size in bytes of either a constant or a symbol
	- if the symbol does not exist, its size is 0
	- it is an error to take the size of a nonexistant constant
	- the sizeof operator can be used in any integer expression

- options, constants, and sources blocks are more flexible
	- any number and order of these blocks is supported, as long as they are all before
	  the first section definition
	- this lets you define constants used in an option setting, and so on

- the "driveTag" option is supported for 37xx boot images now (in addition to 36xx)
	- the value is placed in a new field in the header
	- the field is where padding was previously, so the header remains the same size

New features for elftosb 2.1 from 2.0:

- escape sequences within strings are now ignored so paths don't have to escape backslashes

- ability to set and override options from the command line
	- new -O/--option command line switch takes name=value argument
	- for integer values, you can use metric multipliers as with constants
	- for string values, the value must be enclosed in double quotes
		- the quotes must be escaped in most shells
		- example: --option toolset=\"GHS\"

- capable of generating STMP36xx format .sb files as well as STMP37xx format
	- use the -f/--chip-family command line option to control the output format
	- only the lexically first command section is used to generate boot commands
		- others produce warnings
	- the lexically first binary data section is used as the user data region
		- other binary data sections produce warnings
	- options available for this format
		- "userDataAlignment"
			- takes an integer power of 2
			- start of the user data is aligned to this value
			- for example, to align by 4K, set "userDataAlignment = 4K;"
		- "romVersion"
			- integer set in the ROM version header field
		- "driveTag"
			- integer set in the drive tag header field
	- new -s/--key-set command line option for specifying the key

- now ignores sections that don't have the SHF_ALLOC flag set

- new 'secinfoClear' option for GHS ELF files
	- place in the options block
	- values are "default", "ignore", "rom", "c" (must be in double quotes)
		- default is "c"
		- ignore: ignore .secinfo section and use normal ELF loading rules
		- rom: load NOBITS sections only if listed in .secinfo section
		- c: let C startup code do all clearing of NOBITS sections
	- most users never need set this option
	- this option only applies when a .secinfo section is present
	- if there is no .secinfo section, behaviour is equivalent to "ignore"

Example:

options {
	toolset = "GHS";	# this is the default toolset
	secinfoClear = "rom";
}
