acme/docs/Changes.txt

712 lines
30 KiB
Plaintext

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.97
----------------------------------------------------------------------
FINALLY strings can be assigned to symbols!
"anything in double quotes" is a string, while characters in
single quotes are, just as before, immediately converted to their
character code. Go and read "docs/Upgrade.txt" to learn about
compatibility issues.
Added backslash escaping in all string literals:
\0 is a null byte, \t is a TAB, \n is a line feed, \r is a
carriage return, \" is a double quote, \' is a single quote and
\\ is a backslash. Go and read "docs/Upgrade.txt" to learn about
compatibility issues.
Added "--dialect" CLI switch:
Because string symbols and backslash escaping introduce a few
incompatibilities to older versions, ACME can now be told to mimic
the behavior of older versions. So it's still possible to assemble
older sources.
Added lists:
Lists can be used to pass an arbitrary number of arguments to
macros, or to store any number of items (including other lists) in
a single symbol. Example: my_list = [1, 2, label, "string", 9]
Added "len()" operator:
This returns the number of elements in a string or list.
Added "[]" operator (for indexing):
This returns a single element from a string or list. Negative
indices are supported as well, they access the string/list from
the other end. Examples: a = my_list[2] b = my_string[-1]
Added "&" operator:
This operator converts labels or the program counter from its
value inside a "!pseudopc" block to the value outside of that
block. Thanks to markusC64 for the suggestion!
Added "!while {}" pseudo opcode.
Added "else if", "else ifdef" and "else ifndef" possibilities.
Added "M65" cpu:
This instruction set includes the MEGA65 extensions, namely 32-bit
pointers and 32-bit data operations using prefix bytes.
Added "NMOS6502" as an alias for "6510" cpu.
Improved NMOS6502/6510 mode:
DOP and TOP can now also be written as NOP.
Improved 65816 mode:
MVN and MVP can now also be written with '#' before arguments.
Added "--test" CLI switch:
This is for people who want to help test experimental features.
Improved error messages:
"Garbage data at end of statement" now includes the unexpected
character.
"Symbol not defined" is only output once per symbol.
Added warning:
ACME complains about binary literals with an "unusual" number of
digits. Thanks to groepaz for the suggestion!
The warning can be disabled using the "-Wno-bin-len" CLI switch.
Added warning:
All mnemonics without indirect addressing now complain about
unneeded parentheses.
Fix: Characters are now unsigned (had been architecture-dependent).
Improved error handling of "--cpu" and "--format" switches.
Added opcode table for NMOS6502 cpu to docs.
Added some test sources.
Added support for "hashbang" lines (if file starts with a '#'
character, the first line is ignored)
Fixed some minor bugs no-one ever seems to have encountered.
Rewritten "docs/Upgrade.txt".
----------------------------------------------------------------------
Section: New in release 0.96.5
----------------------------------------------------------------------
Allowed C++-style comments via "//". Thanks to awsm for the
suggestion (and please accept my apologies for taking so long to
release this)
Added "--ignore-zeroes" CLI switch. This disables the "leading zeroes
determine number size" algorithm. Thanks to groepaz for the
suggestion.
Added "--strict-segments" CLI switch. This changes warnings about
overlapping memory segments into errors. Thanks to groepaz for the
suggestion.
Added 6502 family tree to docs/cpu_types/all.txt
----------------------------------------------------------------------
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 "--msvc" CLI switch so error output can be configured to be in
Visual Studio format. Thanks to Martin Piper for writing this
patch!
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. :-)