

                                 ACME

         ...the ACME Crossassembler for Multiple Environments

                          --- change log ---


This text only contains descriptions of changes independent of the
platform used. There should be another help file in this archive
outlining the platform specific changes.


----------------------------------------------------------------------
Section:   New in release 0.96.4
----------------------------------------------------------------------

Bugfix: Removed warnings about zero page wrap-around for the 65816's
    24-bit pointers (because wrap-around does not actually happen).
    Thanks to Johann Klasek for reporting this.
Added "!xor" pseudo opcode to compensate for the shortcomings of the
    "!scrxor" pseudo opcode. Thanks to spider-j for the initial bug
    report.
Added "-I" CLI switch to add search paths for input files. Thanks to
    peiselulli for the suggestion.


----------------------------------------------------------------------
Section:   New in release 0.96.3
----------------------------------------------------------------------

Added "!h"/"!hex" pseudo opcode: Now external source code generator
    tools can easily put data in sources with minimal syntax overhead.
Added "!skip" pseudo opcode: "!skip N" works like "*=*+N" without
    starting a new segment.
Added "cheap locals": Labels with '@' prefix have automatic scoping,
    bounded by the preceding and the following global labels.
Added "--fullstop" CLI switch to change pseudo opcode prefix from '!'
    to '.' (so other assemblers' sources need less conversion work)
Fixed a bug where expressions like "1)+1" crashed ACME. Thanks to
    Bitbreaker for reporting this.
Added warning when using zp-indirect addressing modes where argument
    is $ff because pointer wraps around to $00. Thanks to Gerrit for
    the suggestion.


----------------------------------------------------------------------
Section:   New in release 0.96.2
----------------------------------------------------------------------

Added "--color" CLI switch to enable colored error output using ANSI
    escape codes. Thanks to Clifford Carnmo for submitting this patch.


----------------------------------------------------------------------
Section:   New in release 0.96.1
----------------------------------------------------------------------

Fixed bug where 65ce02's "(zp),z" addressing mode could be used in
    65816 mode.


----------------------------------------------------------------------
Section:   New in release 0.96
----------------------------------------------------------------------

Added experimental support for instruction sets of Rockwell 65C02,
    WDC 65C02(S), CSG 65CE02 and CSG 4502.
Stack indexing can now be given either as ",s" or as ",sp" (only
    relevant for 65816 and 65CE02).


----------------------------------------------------------------------
Section:   New in release 0.95.8
----------------------------------------------------------------------

Warnings and errors inside macros now cause the call stack to be
    displayed as well (does not yet work for serious errors, though).


----------------------------------------------------------------------
Section:   New in release 0.95.7
----------------------------------------------------------------------

New pseudo opcodes:
    "!be16", "!be24" and "!be32" for big-endian byte order output.
    "!le16", "!le24" and "!le32" for little-endian byte order output.
    The old pseudo opcodes ("!16", "!24", "!32") will now use the
    correct byte order for the chosen CPU (which is always little-
    endian, because there is no support for any big-endian CPU yet.;))


----------------------------------------------------------------------
Section:   New in release 0.95.6
----------------------------------------------------------------------

Fixed a bug: The "C64 DTV2" does not support the undocumented
    ("illegal") opcodes 0x0b and 0x2b, therefore the "ANC #8"
    mnemonic was removed from the "!cpu c64dtv2" mode. Thanks to
    peiselulli for testing and reporting this.
"Value not defined" error message now includes the name of the
    undefined symbol. Thanks to Thomas Woinke for suggesting this
    improvement.
Fixed a bug in type system: "!for" loop counters were not correctly
    flagged as "address" or "non-address".
The "addr()" function can now also be written as "address()".
Fixed a bug in report listing generator: CR characters in input caused
    additional blank lines in output. Thanks to Johann Klasek for
    submitting this patch.


----------------------------------------------------------------------
Section:   New in release 0.95.5
----------------------------------------------------------------------

Fixed a bug causing crashes on program exit (a pointer to a local
    struct kept being used later on, trashing the stack). Thanks to
    Hoeppie for reporting this.


----------------------------------------------------------------------
Section:   New in release 0.95.4
----------------------------------------------------------------------

Added the last remaining undocumented ("illegal") opcodes: LAS, TAS,
    SHA, SHX, SHY and ANE.


----------------------------------------------------------------------
Section:   New in release 0.95.3
----------------------------------------------------------------------

Added "c64dtv2" cpu type so you can use its SIR, SAC and BRA opcodes;
    along with the undocumented ("illegal") opcodes of the 6510.
Added Martin Piper's "--msvc" patch so error output can be configured
    to be in Visual Studio format.
Merged third-party patch (who wrote it?) to output label dump in VICE
    format. Still needs work to be configurable about the types of
    symbols actually output.


----------------------------------------------------------------------
Section:   New in release 0.95.2
----------------------------------------------------------------------

Changed "save labels" to "symbol list" in a lot of code, error
    messages and docs.
Added "!symbollist" alias for "!sl" pseudo opcode.
Change in undocumented ("illegal") opcodes: ANC #8 now generates 0x0b
    instead of 0x2b (both opcodes do the same thing).
Added experimental support for generating a report listing. Thanks to
    Johann Klasek for writing this extension patch.


----------------------------------------------------------------------
Section:   New in release 0.95.1
----------------------------------------------------------------------

Fixed a bug: Anonymous forward labels were allowed to be redefined.
Tweaked type system: When negating a value, address reference count
    will now be negated as well.
When using type system, label dump file will now contain "!addr" to
    mark addresses.
Changed "label" to "symbol" in a lot of code, error messages and docs.


----------------------------------------------------------------------
Section:   New in release 0.95
----------------------------------------------------------------------

Added an experimental type system to tell addresses and non-addresses
    apart (per default disabled; must be activated using the
    "-Wtype-mismatch" CLI switch). The new "!address" pseudo opcode is
    used to mark label definitions as setting address values.
Added "-Wno-old-for" switch to disable warning about old "!for"
    syntax. However, this will in turn enable warnings about using the
    *new* syntax.


----------------------------------------------------------------------
Section:   New in release 0.94.12
----------------------------------------------------------------------

Finally created new "!for" syntax so counting can start at zero. The
    old syntax still works, but gives a warning. See AllPOs.txt for
    more info.
Added "0b" as alternative prefix for binary values.


----------------------------------------------------------------------
Section:   New in release 0.94.11
----------------------------------------------------------------------

If !warn, !error and !serious are called with numbers, those will now
    be output in hex format as well. Also mentioned this in docs.


----------------------------------------------------------------------
Section:   New in release 0.94.10
----------------------------------------------------------------------

Warning about shift-space as first character of label name now works
    for UTF-8 as well.
Operator priority list in docs now contains built-in function calls.


----------------------------------------------------------------------
Section:   New in release 0.94.9
----------------------------------------------------------------------

C-style equality checking ("==" operator) is now recognized (but gives
    a warning). Thanks to groepaz for the suggestion.


----------------------------------------------------------------------
Section:   New in release 0.94.8
----------------------------------------------------------------------

Finally disabled pseudo opcode "!cbm". It now gives an error instead
    of a warning.
Finally disabled pseudo opcode "!realpc". It now gives an error
    instead of a warning. Therefore, "!pseudopc" now *must* be used
    with a block in {} braces.
Finally disabled pseudo opcode "!subzone". It now gives an error
    instead of a warning.
Added support for one more undocumented ("illegal") opcode: lxa. See
    Illegals.txt for more info.
Removed "Offset assembly still active at end of segment" warning. New
    segments can now be started even from within pseudopc sections.


----------------------------------------------------------------------
Section:   New in release 0.94.7
----------------------------------------------------------------------

Fixed bug: Setting the program counter to an address > $ffff and
    writing a byte hung ACME. Thanks to groepaz/VICEteam for reporting
    this.
Verbose output now uses "0x" instead of "$" to indicate hexadecimal in
    more places.


----------------------------------------------------------------------
Section:   New in release 0.94.6
----------------------------------------------------------------------

Made "power-of" operator right-associative.


----------------------------------------------------------------------
Section:   New in release 0.94.5
----------------------------------------------------------------------

Fixed bug: wrap-around branches (from $ff80+ to zp and back) were
    reported as errors. Thanks to Bitbreaker/VOZ for reporting this.
Fixed bug: left-shifting float values went wrong for large shifts.
New error message: "Target not in bank (0xTARGET)" for branches.
Fixed example program to get it to assemble with current library.
Streamlined "Floats.txt" docs.

Changes in library files:
<cbm/basicWHATEVER.a> files now contain opcode_* constants in addition
    to macros.
Added <cbm/mflpt.a>, containing a macro to store a float value in the
    five-byte format used by CBM basic (and while writing that macro,
    found the left-shift-float bug mentioned above, so the macro needs
    this fixed version to work).
Added <cbm/c64/float.a>, containing definitions for using the BASIC
    interpreter's float functions and constants.


----------------------------------------------------------------------
Section:   New in release 0.94.4
----------------------------------------------------------------------

Added "apple" output format.


----------------------------------------------------------------------
Section:   New in release 0.94.3
----------------------------------------------------------------------

"Target out of range" error now includes info on how much the range
    was exceeded. Thanks to Bitbreaker/VOZ for the suggestion.


----------------------------------------------------------------------
Section:   New in release 0.94.2
----------------------------------------------------------------------

Added missing newline after "no output file specified" message.
Fixed bug in "!to" and "!sl" (colon in filename is interpreted as
    command separator in later passes).
Changed verbose output hex prefix from $ to 0x.
Changed --help output
Changed EOR to XOR in docs and comments (the ACME operator, not the
    6502 opcode)


----------------------------------------------------------------------
Section:   New in release 0.94.1
----------------------------------------------------------------------

New CLI switch: "-D" allows to set global labels via the command line.
New CLI switch: "-Wno-label-indent" switches off warnings about
    indented implicit label definitions.
New PO: "!ifndef" (finally a companion for "!ifdef"...)
When setting the program counter via "* =", modifiers ("overlay" and
    "invisible") allow to suppress warnings about segment overlap.
Float values without leading digits are now accepted.


----------------------------------------------------------------------
Section:   New in release 0.93
----------------------------------------------------------------------

Change: If "Offset assembly still active at end of segment", it no
    longer gets switched off.
Change: Operators ASR and LSL/ASL now can also handle FP (LSR still
    makes no sense).
Change: Added distinction between '/' and "DIV" operators: DIV always
    gives integer results, while '/' depends on operands.
New functions: added int() and float() functions.
Internal change: default fill value for !align is now CPU-specific
    (but still 234)
New CLI switch: "--use-stdout" prints errors to stdout instead of
    stderr (a fix for the "Relaunch64" IDE I have nothing to do with)


----------------------------------------------------------------------
Section:   New in release 0.92
----------------------------------------------------------------------

Text versions of arithmetic/logic operators (XOR, DIV, MOD, etc.) no
    longer need to be in upper case.
Experimental support for floating point maths.
Support for mathematical functions:
    sin(), cos(), tan(), arcsin(), arccos(), arctan()
New errors:
    "Argument out of range.", "Unknown function."
These operators always deliver ints:
    not, and, or, xor, lowbyteof, highbyteof, bankbyteof, mod, asl,
    lsl, asr, lsr


----------------------------------------------------------------------
Section:   New in release 0.91
----------------------------------------------------------------------

Added anonymous labels (- + -- ++ --- +++ etc.). Every other assembler
    seems to support them, so I added them to ACME as well... :)
New POs: "!warn MESSAGE", "!error MESSAGE", "!serious MESSAGE"
New CLI option: "--maxdepth NUMBER" sets maximum recursion depth for
    macro calls and the "!source" pseudo opcode.
ACME now gives a warning when assembling JMP($xxff) on 6502/6510
    because that instruction is broken on those CPUs.
After giving the error "Target out of range", the error "Number out of
    range" is now suppressed.
Corrected code example in QuickRef.txt (why didn't anyone tell me? :))
Added additional example source code.


----------------------------------------------------------------------
Section:   New in release 0.90
----------------------------------------------------------------------

Arithmetic shift right now has some watchdog code and should work
    regardless of compiler.
Corrected some typos in error messages and docs.
New CLI option: "--cpu CPU_TYPE"
The output file format chosen with "--format FORMAT" is now used as
    default when "!to" is used without format keyword.
Again: Tidier code.


----------------------------------------------------------------------
Section:   New in release 0.89
----------------------------------------------------------------------

Support for more undocumented ("illegal") opcodes: anc, arr, asr, sbx,
    dop, top, jam. See Illegals.txt for more info.
Change in shift operators: Logical shift right (">>" or "LSR") has on
    most platforms actually been an arithmetic shift right all the
    time! Therefore, ">>" now *officially* performs an arithmetic
    shift right (can also be written as "ASR"), while ">>>" has been
    added to perform a logical shift right (can also be written as
    "LSR"). Note: This is about ACME's maths parser and has nothing to
    do with the 6502 mnemonics "asl" and "lsr".
Finally added a "-o" command line option to set the output file! See
    QuickRef.txt for info on the other new CLI options (--format,
    --labeldump, --maxerrors, --setpc, --initmem, --version).
Fixed bug: "!align" could be used while program counter undefined.
Fixed bug: Numbers before mnemonics are no longer skipped (or rather,
    implicit label definitions are no longer accepted if the label
    name starts with a digit).
Change: Much better algorithm to compute to-the-power-of (read: it's
    no longer braindead).
Some more internal tidying.


----------------------------------------------------------------------
Section:   New in release 0.88
----------------------------------------------------------------------

Fixed architecture-dependent bug introduced in release 0.87.
Fixed bug: Unknown !cpu keywords could cause crashes.
Fixed bug in !ct "filename" nesting.


----------------------------------------------------------------------
Section:   New in release 0.87
----------------------------------------------------------------------

Support for some undocumented ("illegal") opcodes: slo, rla, sre, rra,
    sax, lax, dcp, isc. To use these, choose the 6510 cpu.
Two error messages gone: "Sorry, feature not yet implemented." and
    "Chosen CPU does not support this command and/or addressing mode."
Explanation of new error message ("There's more than one character.")
    added to docs.


----------------------------------------------------------------------
Section:   New in release 0.86
----------------------------------------------------------------------

The "!convtab" pseudo opcode can now be given the file name of a
    conversion table. The file must hold exactly 256 bytes.
Improved docs a bit (more and better examples, more info on verbosity
    CLI switch).
If no "!to" pseudo opcode has been found, ACME will tell you so.


----------------------------------------------------------------------
Section:   New in release 0.86 beta
----------------------------------------------------------------------

Macros can now be used with call-by-reference semantics, therefore
    allowing some kind of return value. Call-by-reference is
    indicated by prefixing the relevant parameter(s) with a '~'
    character. This has to be done at both the macro definition and
    the macro call.
Different macros are allowed to have the same name as long as their
    parameter lists differ in size (number of arguments) or type
    (call-by-value vs. call-by-reference)
Macros do not have a limit on parameter count anymore.
Macro size is unlimited now.
The expression parser does not have a limit on recursion depth
    anymore, so you can use as many parentheses as you like.
Loop block size is unlimited now.
Label name and string lengths are unlimited now.
The recursion depth of "!source" and macro calls is set to 64. The
    only reason there still *is* a limit is to be able to spot
    infinite recursions.
Offset assembly now has block support and can be nested. Using the old
    syntax still works, but gives a warning.
Pseudo opcodes "!convtab", "!cpu", "!al", "!as", "!rl" and "!rs" now
    have block support and can be nested.
Using "!to" without file format indicator now gives a warning (but
    still works).
Fixed bug: The statement
	!to "outfile" ANY_SPECIAL_CHARACTER_BUT_COMMA GARBAGE
    wasn't flagged as an error.
Fixed bug: The statement
	!source "a file that cannot be opened"
    did not give an error, but was just ignored.
If a global label starts with a shift-space character, a warning is
    issued (because it is highly likely that it is a typing error).
*Much* cleaner internals. *Very* *much* cleaner internals actually.
More bug checking at runtime.
Tree lookups should be a bit faster.
Initialising the memory should be a bit faster.
Writing the output file should be a bit faster.
The expression parser now uses repeated multiplication instead of the
    math library's pow() call, so it is no longer necessary to include
    the C math library when compiling.
The number of errors displayed before assembly stops was reduced from
    20 to 10. I really should make this configurable via a CLI switch.


----------------------------------------------------------------------
Section:   New in release 0.85 alpha
----------------------------------------------------------------------

Fixed bug: Handling of parentheses in new expression parser was badly
    screwed up. Thanks go to Nathan Smith for reporting that bug.
Verbosity messages for segments and output file now contain size info.


----------------------------------------------------------------------
Section:   New in release 0.84 alpha
----------------------------------------------------------------------

Some changes in documentation (mainly corrected typos)
Usage count for labels (Unused ones are marked in label dump file)
New PO: "!8" (for 8-bit values, as "!byte" / "!by" / "!08")
Finally removed the dreaded only-two-input-files restriction
Improved PO: "!to" has parameter for choosing output file format
Fixed bug: Blanks after "!for"'s "}" character stopped assembly
Rewritten expression parser and label tree handler (should be faster)
Generally tidied up the source.
Skipped some version numbers to get a "less frightening" one. :)


----------------------------------------------------------------------
Section:   New in release 0.08 beta
----------------------------------------------------------------------

Fixed really serious bug: The 65816's indirect DP addressing caused
    wrong opcodes to be generated. Thanks to Doc Bacardi/The Dreams
    for reporting it.


----------------------------------------------------------------------
Section:   New in release 0.07 beta
----------------------------------------------------------------------

Fixed really serious bug: Indirect JMP / JSR were assembled without
    target addresses. Thanks to YTM/Alliance for reporting that one.
Fixed bug in value parser's handling of parentheses: Expressions like
    "a*(b-c)+d" gave "a*((b-c)+d)", obviously not the same.
Fixed bug: "!set LABEL = VALUE" now *really* works correctly.
Fixed bug: ACME gave "too late for postfix" error when reading a
    predefined label of known size. Only occurred when using macros.
Fixed bug: Error messages given from within macro definitions used
    truncated file names.
Fixed bug: Calling of local macros didn't work at all.
Fixed bug: "}" chars directly after macro calls were not found.
Fixed bug: Spaces after ":" and "{" gave syntax errors.
Fixed bug: Line counting inside loops was screwed up.
Fixed bug: Changed argument order of MVP and MVN (now it's "opcode,
    source, target")
New PO: "!08" (for 8-bit values, as "!byte" / "!by")
New PO: "!16" (for 16-bit values, as "!word" / "!wo")
New PO: "!24" (for 24-bit values)
New PO: "!32" (for *signed* 32-bit values)
New PO: "!pseudopc" (starts offset assembly)
New PO: "!realpc" (ends offset assembly)
New PO: "!for LABEL, TIMES { LINES }" for easier loops.
New PO: "!initmem BYTE" to define empty memory.
New PO: "!endoffile" (short "!eof") replaces "!end".
New PO: "!ifdef" (only use this if you *really* know what you are
    doing. Otherwise, just don't use it)
New PO: "!convtab CONVERSION" (short "!ct") selects the default
    character conversion, making "!cbm" obsolete.
Improved PO: "!binary" now has "skip" parameter.
Change: "!cbm" outputs a warning when used - use "!ct pet" instead.
Change: "!end" no longer works - use "!eof" instead.
Change: "* = VALUE" is now segment change instead of offset assembly.
Change: Argument order of MVN/MVP is now as is standard.
The typecast system has been rewritten - now it works as intended.
BIT without any parameters no longer works - use a macro instead.
Leading zeros are stored in label structures and acted upon.
The documentation is in several files now.
Negative numbers are now handled much more sensibly.
'ACME' environment variable only needed when *really* needed.


----------------------------------------------------------------------
Section:   New in release 0.05 beta
----------------------------------------------------------------------

Fixed bug: No more multiple error messages.
Fixed bug: Zone names now work correctly (First char wasn't stored).
Fixed bug: "!set label = label" now works correctly (I hope).
Fixed bug: "stz ...,y" gave "number too big" instead of "illegal
    combination of command and addressing mode"
New PO: "!subzone" (short "!sz") for nested zones.
Added support for library tree when using "!source" or "!binary".
Single-character strings can now be given in single quotes as well.
Real icons.
Startup errors now exit correctly with EXIT_FAILURE code.
Example program now includes "Expected_Output" file.
Further tidied up the sources.
Tidied up the general help file:
 -Changed "Freeware" to "free software"
 -Corrected the information given on "!align".
 -Added examples for most of the pseudo opcodes.


----------------------------------------------------------------------
Section:   New in release 0.04 beta
----------------------------------------------------------------------

Corrected some small bugs.
New PO: "!zone" (short "!zn") replaces "!module" (short "!mod")
Tidied up the sources a lot.
Changed bad style C code reported by lint.
Added GNU GPL hint in every source file.
Added startup message in verbose mode.
Added "Error: " to startup error messages.
Added Amiga, Linux and OS/2 versions


----------------------------------------------------------------------
Section:   New in release 0.03 beta
----------------------------------------------------------------------

Generally tidied up the source.
Moved RISC OS-specific CLI options to platform file.
Added pathname conversion from UNIX style to current platform style.
Added context variables (enabling "!source"s and macros).
Translated all documentation to english.
Changed string pseudo opcodes to allow numeric values.
Added verbose mode (CLI option "v").
Added output buffer, removing the need for additional output pass (and
    now the "!to" pseudo opcode can be placed anywhere).
More than one "label = pc" definition per statement now illegal.
Instead added possibility to have several statements on a single line
    by using ":" as a separator character.
Added new keywords: "!set", "!if", "else", "!do", "until", "while" and
    "!macro"
Added support for "!source".
Added basic support for blocks.
Added support for "!if {...} else {...}".
Added support for zone titles.
Added support for loops (endless loops are only detected if producing
    code).
Added support for macros (even nested definitions are possible now).
Added DOS version.


----------------------------------------------------------------------
Section:   New in release 0.02 alpha
----------------------------------------------------------------------

Er, I don't know anymore. It was a bad ugly hack and it only ran on
    RISC OS. :-)
