2012-02-27 21:14:46 +00:00
|
|
|
|
|
|
|
|
|
|
|
ACME
|
|
|
|
|
|
|
|
...the ACME Crossassembler for Multiple Environments
|
|
|
|
|
|
|
|
--- error messages ---
|
|
|
|
|
|
|
|
|
|
|
|
Here's a sorted list of all error messages ACME can give, possible
|
|
|
|
reasons and what you can do to sort it out.
|
|
|
|
|
|
|
|
|
|
|
|
----------------------------------------------------------------------
|
|
|
|
Section: Errors on startup
|
|
|
|
----------------------------------------------------------------------
|
|
|
|
|
|
|
|
Cannot open toplevel file "FILENAME".
|
|
|
|
Maybe you mistyped its name?
|
|
|
|
|
|
|
|
Error in CLI arguments: ...
|
|
|
|
There are several of these errors, but they should be quite self-
|
|
|
|
explanatory.
|
|
|
|
|
|
|
|
|
|
|
|
----------------------------------------------------------------------
|
|
|
|
Section: Warnings during assembly
|
|
|
|
----------------------------------------------------------------------
|
|
|
|
|
|
|
|
!warn: ...
|
|
|
|
This is given when the pseudo opcode "!warn" is executed. The
|
|
|
|
actual message varies according to the pseudo opcode's arguments.
|
|
|
|
|
|
|
|
Assembling buggy JMP($xxff) instruction
|
|
|
|
The original 6502 processor has a bug: When executing an indirect
|
|
|
|
JMP instruction where the low byte of the argument equals $ff, it
|
|
|
|
fetches the high byte of the jump target address not from memory
|
2013-06-26 23:01:00 +00:00
|
|
|
location ARGUMENT + 1, but from ARGUMENT - 255. Therefore ACME
|
|
|
|
issues this warning if you are about to generate such an
|
|
|
|
instruction.
|
2012-02-27 21:14:46 +00:00
|
|
|
Note that this warning is only given for CPU types 6502 and 6510,
|
|
|
|
because 65c02 and 65816 have been fixed in this respect.
|
|
|
|
|
2014-03-10 00:17:10 +00:00
|
|
|
Assembling unstable LXA #NONZERO instruction
|
|
|
|
This warning is only ever given for CPU type 6510. LXA is one of
|
|
|
|
the undocumented ("illegal") opcodes of this CPU (opcode 0xab),
|
|
|
|
and it only works reliably if its argument is zero. Therefore ACME
|
|
|
|
issues this warning if you are about to generate this instruction
|
|
|
|
with a non-zero argument.
|
|
|
|
|
2012-02-27 21:14:46 +00:00
|
|
|
Bug in ACME, code follows
|
|
|
|
A situation has been encountered implying there is a bug in ACME.
|
|
|
|
See the last section in this file.
|
|
|
|
|
|
|
|
Implicit label definition not in leftmost column.
|
|
|
|
An implicit label definition has blanks before the label name.
|
|
|
|
Imagine this source code:
|
|
|
|
lda #00
|
|
|
|
imx
|
|
|
|
rts
|
|
|
|
Obviously, there's a typo in the middle line (imx instead of inx),
|
|
|
|
but ACME does not recognize this: It looks just like an implicit
|
|
|
|
label definition! Therefore releases 0.89 and higher warn you when
|
|
|
|
an implicit label does not start in column 1. Releases 0.94 and
|
|
|
|
higher support a command line option to switch off this warning
|
|
|
|
("-Wno-label-indent").
|
|
|
|
|
|
|
|
Label dump file already chosen.
|
|
|
|
The "!sl" command was given more than once (or in addition to the
|
|
|
|
"--labeldump" command line option). Only use it once.
|
|
|
|
|
|
|
|
Label name starts with a shift-space character.
|
|
|
|
The name of a global label starts with a shift-space character. It
|
|
|
|
is highly likely that this is a typing error, therefore this
|
|
|
|
warning is issued.
|
|
|
|
|
|
|
|
Memory already initialised.
|
|
|
|
The "!initmem" command was given more than once (or in addition to
|
|
|
|
the "--initmem" command line option). Only use it once.
|
|
|
|
|
|
|
|
Output file already chosen.
|
|
|
|
The "!to" command was given more than once (or in addition to the
|
|
|
|
"--outfile" command line option). Only use it once.
|
|
|
|
|
|
|
|
Segment reached another one, overwriting it.
|
|
|
|
The program counter has just reached the start of another segment.
|
|
|
|
Because some people might want to assemble "onto" a binary file
|
|
|
|
that was loaded before, this warning can be switched off using
|
2014-03-10 00:17:10 +00:00
|
|
|
modifier keywords when changing the program counter via "* =".
|
2012-02-27 21:14:46 +00:00
|
|
|
Future versions of ACME might throw an error instead of a warning
|
|
|
|
in this case.
|
|
|
|
|
|
|
|
Segment starts inside another one, overwriting it.
|
2014-03-10 00:17:10 +00:00
|
|
|
The given value in a "* =" command is located inside another
|
2012-02-27 21:14:46 +00:00
|
|
|
segment. Because some people might want to assemble "onto" a
|
|
|
|
binary file that was loaded before, this warning can be switched
|
|
|
|
off using modifier keywords when changing the program counter via
|
2014-03-10 00:17:10 +00:00
|
|
|
"* =".
|
2012-02-27 21:14:46 +00:00
|
|
|
Future versions of ACME might throw an error instead of a warning
|
|
|
|
in this case.
|
|
|
|
|
|
|
|
Used "!to" without file format indicator. Defaulting to "cbm".
|
|
|
|
Now that "!to" can be given a file format keyword (either "plain"
|
|
|
|
or "cbm"), using "cbm" as default seems inappropriate. It still
|
|
|
|
works though.
|
|
|
|
|
|
|
|
Using oversized addressing mode.
|
|
|
|
ACME just assembled a command using an addressing mode that was
|
|
|
|
larger than needed. This only happens if ACME could not work out
|
|
|
|
the argument's value in the first pass, therefore assuming a 16-
|
|
|
|
bit addressing mode. If, in a later pass, ACME finds out that the
|
|
|
|
argument is small enough to fit in 8 bits, then this warning is
|
|
|
|
shown. If you define all your zeropage labels *before* they are
|
|
|
|
first used, this shouldn't happen. If you know that a specific
|
|
|
|
argument fits in 8 bits, you can force ACME to use 8 bits
|
|
|
|
addressing by postfixing the command with "+1". Example:
|
|
|
|
lda+1 label
|
|
|
|
ACME will then use an 8-bit addressing mode, regardless of whether
|
|
|
|
the label is known or not. If the label value happens to be too
|
|
|
|
large to fit in 8 bits, ACME will show an error of course (To
|
|
|
|
always truncate a value to 8 bits, use the '<' operator).
|
|
|
|
More about the postfixing method can be found in "AddrModes.txt".
|
|
|
|
|
|
|
|
|
|
|
|
----------------------------------------------------------------------
|
|
|
|
Section: Errors during assembly
|
|
|
|
----------------------------------------------------------------------
|
|
|
|
|
|
|
|
"ACME" environment variable not found.
|
|
|
|
This will be shown if the source code references any files from
|
|
|
|
the library, but the library location variable wasn't set. This
|
|
|
|
can only be given on systems using the said variable.
|
|
|
|
|
2014-03-10 00:17:10 +00:00
|
|
|
"!cbm" is obsolete; use "!ct pet" instead.
|
|
|
|
This is given when the now obsolete "!cbm" pseudo opcode is
|
|
|
|
encountered.
|
|
|
|
|
|
|
|
"!pseudopc/!realpc" is obsolete; use "!pseudopc {}" instead.
|
|
|
|
This is given when one of the now obsolete !pseudopc/!realpc
|
|
|
|
pseudo opcodes is encountered.
|
|
|
|
|
|
|
|
"!subzone {}" is obsolete; use "!zone {}" instead.
|
|
|
|
This is given when the now obsolete "!subzone" pseudo opcode is
|
|
|
|
encountered.
|
|
|
|
|
2012-02-27 21:14:46 +00:00
|
|
|
!error: ...
|
|
|
|
This is given when the pseudo opcode "!error" is executed. The
|
|
|
|
actual message varies according to the pseudo opcode's arguments.
|
|
|
|
|
|
|
|
Cannot open input file.
|
|
|
|
ACME had problems opening an input file ("!bin", "!convtab" or
|
|
|
|
"!src"). Maybe you mistyped its name.
|
|
|
|
|
|
|
|
Conversion table incomplete.
|
|
|
|
The conversion table file is too small. It needs to be exactly 256
|
|
|
|
bytes in size.
|
|
|
|
|
|
|
|
Division by zero.
|
|
|
|
Guess what - you attempted to divide by zero.
|
|
|
|
|
|
|
|
Exponent is negative.
|
2013-06-26 23:01:00 +00:00
|
|
|
Using negative exponents only give sensible results when using
|
|
|
|
floating point maths.
|
2012-02-27 21:14:46 +00:00
|
|
|
|
|
|
|
File name quotes not found ("" or <>).
|
|
|
|
File names have to be given in quotes. Either "" quoting for files
|
|
|
|
located in the current directory or <> quoting for library files.
|
|
|
|
|
|
|
|
Found '}' instead of end-of-file.
|
|
|
|
ACME encountered a '}' character when it expected the file to end
|
|
|
|
instead (because no blocks were open).
|
|
|
|
|
|
|
|
Garbage data at end of statement.
|
|
|
|
There are still arguments when there should not be any more.
|
|
|
|
|
|
|
|
Illegal combination of command and addressing mode.
|
|
|
|
The given command cannot be used with the given addressing mode on
|
|
|
|
the CPU you have chosen.
|
|
|
|
|
|
|
|
Illegal combination of command and postfix.
|
|
|
|
The given command cannot be used with the addressing mode
|
|
|
|
indicated by the given postfix.
|
|
|
|
|
|
|
|
Illegal postfix.
|
|
|
|
You used a postfix other than "+1", "+2" or "+3".
|
|
|
|
|
|
|
|
Label already defined.
|
|
|
|
You defined a label that already had a different value. To change
|
|
|
|
a label's value, use the "!set" pseudo opcode.
|
|
|
|
|
|
|
|
Macro already defined.
|
|
|
|
Macros can only be defined once. If you define a macro twice, ACME
|
|
|
|
will help you find the definitions by giving a warning for the
|
|
|
|
first definition and a serious error (stopping assembly) for the
|
|
|
|
second definition.
|
|
|
|
|
|
|
|
Macro not defined (or wrong signature).
|
|
|
|
You tried to call a macro that either wasn't defined yet (always
|
|
|
|
define macros before using them) or was called with an illegal
|
|
|
|
argument list. There must be a 1:1 match between the definition's
|
|
|
|
formal parameters and the call's actual arguments.
|
|
|
|
|
|
|
|
Macro parameter twice.
|
|
|
|
The same label name is used two (or more) times in the same macro
|
|
|
|
parameter list.
|
|
|
|
|
|
|
|
Negative value - cannot choose addressing mode.
|
|
|
|
Because the argument is a negative value, ACME does not know what
|
|
|
|
addressing mode (8 bits, 16 bits, on a 65816 even 24 bits) to use.
|
|
|
|
You can overcome this problem using the postfix method. Or correct
|
|
|
|
your program to use positive addresses instead.
|
|
|
|
|
|
|
|
No string given.
|
|
|
|
ACME expects a string but doesn't find it.
|
|
|
|
|
|
|
|
Number out of range.
|
|
|
|
A value is too high or too low.
|
|
|
|
|
|
|
|
Program counter is unset.
|
|
|
|
You didn't set the program counter, so ACME didn't know where to
|
|
|
|
start.
|
|
|
|
|
|
|
|
Quotes still open at end of line.
|
|
|
|
You forgot the closing quotes.
|
|
|
|
|
|
|
|
Source file contains illegal character.
|
|
|
|
Your source code file contained a null byte.
|
|
|
|
|
|
|
|
Syntax error.
|
|
|
|
Guess what - there's a syntax error.
|
|
|
|
|
2013-06-26 23:01:00 +00:00
|
|
|
Target not in bank (0xTARGET).
|
|
|
|
You tried to branch to an address not in the 0x0000..0xffff range.
|
|
|
|
Relative addressing (branch commands or PER) cannot leave the
|
|
|
|
current code bank of 64 KiB.
|
|
|
|
|
2012-03-16 20:21:09 +00:00
|
|
|
Target out of range (N; M too far).
|
2013-06-26 23:01:00 +00:00
|
|
|
Branch commands use relative addressing, which only has a limited
|
|
|
|
range. You exceeded it. N is the attempted offset, M is the
|
|
|
|
difference to the limit - so if you succeed in optimizing M bytes
|
|
|
|
away, the code would assemble.
|
2012-02-27 21:14:46 +00:00
|
|
|
|
|
|
|
There's more than one character.
|
|
|
|
You used a text string in an arithmetic expression, but the string
|
|
|
|
contained more than a single character.
|
|
|
|
|
|
|
|
Too late for postfix.
|
|
|
|
You can only postfix labels at the start, before they are used for
|
|
|
|
the first time.
|
|
|
|
|
|
|
|
Too many '('.
|
|
|
|
A formula ends before all parentheses were closed.
|
|
|
|
|
|
|
|
Too many ')'.
|
|
|
|
There are more closing than opening parentheses in a formula.
|
|
|
|
|
|
|
|
Unknown encoding.
|
|
|
|
You used the "!convtab" command with a keyword ACME does not know.
|
|
|
|
|
|
|
|
Unknown operator.
|
|
|
|
You used an arithmetic/logical operator ACME does not know.
|
|
|
|
|
|
|
|
Unknown output format.
|
|
|
|
You used the "!to" command with a keyword ACME does not know.
|
|
|
|
|
|
|
|
Unknown processor.
|
|
|
|
You used the "!cpu" command with a keyword ACME does not know.
|
|
|
|
|
|
|
|
Unknown pseudo opcode.
|
|
|
|
You have mistyped a "!" command.
|
|
|
|
|
2014-03-10 00:17:10 +00:00
|
|
|
Unknown "* =" segment modifier.
|
2012-02-27 21:14:46 +00:00
|
|
|
You used a modifier keyword ACME does not know.
|
|
|
|
|
|
|
|
Value not yet defined.
|
|
|
|
A value could not be worked out. Maybe you mistyped a label name.
|
|
|
|
Whether this is given as a "normal" or as a serious error depends
|
|
|
|
on the currently parsed pseudo opcode.
|
|
|
|
|
|
|
|
|
|
|
|
----------------------------------------------------------------------
|
|
|
|
Section: Serious errors (stopping assembly)
|
|
|
|
----------------------------------------------------------------------
|
|
|
|
|
|
|
|
!serious: ...
|
|
|
|
This is given when the pseudo opcode "!serious" is executed. The
|
|
|
|
actual message varies according to the pseudo opcode's arguments.
|
|
|
|
|
|
|
|
Found end-of-file instead of '}'.
|
|
|
|
The file ended when ACME expected the block to be closed instead
|
|
|
|
(because there was at least one block left open).
|
|
|
|
|
|
|
|
Loop count is negative.
|
|
|
|
You used the "!for" command with a negative loop count.
|
|
|
|
|
|
|
|
Macro already defined.
|
|
|
|
Macros can only be defined once. If you define a macro twice, ACME
|
|
|
|
will help you find both definitions by giving a warning for the
|
|
|
|
first definition and a serious error (stopping assembly) for the
|
|
|
|
second definition.
|
|
|
|
|
|
|
|
Missing '{'.
|
|
|
|
ACME didn't find the expected '{' character. Remember that '{'
|
|
|
|
characters must be given on the same line as the command they
|
|
|
|
belong to.
|
|
|
|
|
|
|
|
Out of memory.
|
|
|
|
When ACME runs out of memory, it stops assembly, giving this
|
|
|
|
error. Free some memory and try again. It's highly unlikely anyone
|
|
|
|
will ever see this error, though. ;)
|
|
|
|
|
|
|
|
Produced too much code.
|
|
|
|
The program counter reached address $10000, leaving the output
|
|
|
|
buffer. At the moment, ACME can only produce a maximum of 64 KB.
|
|
|
|
|
|
|
|
Syntax error.
|
|
|
|
This is only given as a _serious_ error if it's in a "!do" loop
|
|
|
|
condition.
|
|
|
|
|
|
|
|
Too deeply nested. Recursive macro calls?
|
|
|
|
The only reason for ACME to have a limit on macro call nesting
|
|
|
|
at all is to find infinite recursions. Current limit is 64.
|
|
|
|
|
|
|
|
Too deeply nested. Recursive "!source"?
|
|
|
|
The only reason for ACME to still have a limit on "!source"
|
|
|
|
nesting at all is to find infinite recursions. Current limit is
|
|
|
|
64.
|
|
|
|
|
|
|
|
Value not yet defined.
|
|
|
|
A value could not be worked out. Maybe you mistyped a label name.
|
|
|
|
Whether this is given as a "normal" or as a serious error depends
|
|
|
|
on the currently parsed pseudo opcode.
|
|
|
|
|
|
|
|
|
|
|
|
----------------------------------------------------------------------
|
|
|
|
Section: Errors on closedown
|
|
|
|
----------------------------------------------------------------------
|
|
|
|
|
|
|
|
Cannot open label dump file "FILENAME".
|
|
|
|
Cannot open output file "FILENAME".
|
|
|
|
Make sure the name doesn't contain wildcard characters and you
|
|
|
|
have write access to the directory.
|
|
|
|
|
|
|
|
No output file specified (use the "-o" option or the "!to" pseudo opcode).
|
|
|
|
You didn't specify the output file, so ACME did not create one.
|
|
|
|
|
|
|
|
|
|
|
|
----------------------------------------------------------------------
|
|
|
|
Section: Bugs in ACME
|
|
|
|
----------------------------------------------------------------------
|
|
|
|
|
|
|
|
The warning "Bug in ACME, code follows" is always followed by a
|
|
|
|
serious error message, stopping assembly. The second message
|
|
|
|
actually gives a hint about the bug's location in the source code.
|
|
|
|
If you ever get this combination of warning and serious error,
|
|
|
|
please send me an e-mail and tell me about it. If possible,
|
|
|
|
include a piece of source code that triggers it.
|
|
|
|
|
|
|
|
Please don't get this wrong - there are no known bugs. I just left
|
|
|
|
some debugging code in place in case there is a bug I failed to
|
|
|
|
notice during testing. In practice, this warning is not expected
|
|
|
|
to be given at all. That's the reason why I want to be notified if
|
|
|
|
it *does* decide to show up.
|
|
|
|
|
|
|
|
The hint messages are of no real interest to the end user, but here
|
|
|
|
they are for completeness' sake.
|
|
|
|
|
|
|
|
IllegalGroupIndex
|
|
|
|
The mnemonic tree contains a group that I didn't add.
|
|
|
|
|
|
|
|
IllegalBlockTerminator
|
|
|
|
A RAM block (macro or loop) was terminated incorrectly.
|
|
|
|
|
|
|
|
IllegalOperatorHandle
|
|
|
|
The expression parser found an operator that does not exist.
|
|
|
|
|
|
|
|
OperandStackNotEmpty
|
|
|
|
The expression parser has finished though there are still operands
|
|
|
|
left to parse.
|
|
|
|
|
|
|
|
OperatorStackNotEmpty
|
|
|
|
The expression parser has finished though there are still
|
|
|
|
operators left to parse.
|
|
|
|
|
|
|
|
StrangeInputMode
|
|
|
|
The input state machine has reached a state that does not exist.
|
|
|
|
|
|
|
|
StrangeParenthesis
|
|
|
|
The expression parser found a non-existing operator.
|