diff --git a/src/ca65/error.c b/src/ca65/error.c index fc984268b..162080d7b 100644 --- a/src/ca65/error.c +++ b/src/ca65/error.c @@ -75,6 +75,7 @@ void WarningMsg (const FilePos* Pos, unsigned WarnNum, va_list ap) { 2, "Symbol `%s' is defined but never used" }, { 2, "Symbol `%s' is imported but never used" }, { 1, "Cannot track processor status byte" }, + { 1, "Suspicious address expression" }, { 0, "User warning: %s" }, }; diff --git a/src/ca65/error.h b/src/ca65/error.h index 665664531..ca7ef370e 100644 --- a/src/ca65/error.h +++ b/src/ca65/error.h @@ -55,6 +55,7 @@ enum Warnings { WARN_SYM_NOT_REFERENCED, WARN_IMPORT_NOT_REFERENCED, WARN_CANNOT_TRACK_STATUS, + WARN_SUSPICIOUS_ADDREXPR, WARN_USER, WARN_COUNT /* Warning count */ }; diff --git a/src/ca65/instr.c b/src/ca65/instr.c index 942650816..6cd78b62c 100644 --- a/src/ca65/instr.c +++ b/src/ca65/instr.c @@ -48,6 +48,7 @@ #include "global.h" #include "nexttok.h" #include "objcode.h" +#include "symtab.h" #include "instr.h" @@ -606,21 +607,42 @@ static void PutAll (const InsDesc* Ins) * modes. */ if (Expr && (AddrModeSet & AM_ZP) && !IsByteExpr (Expr)) { - AddrModeSet &= ~AM_ZP; + AddrModeSet &= ~AM_ZP; } /* Check if we have any adressing modes left */ if (AddrModeSet == 0) { - Error (ERR_ILLEGAL_ADDR_MODE); - return; + Error (ERR_ILLEGAL_ADDR_MODE); + return; } AddrMode = BitFind (AddrModeSet); + /* If the instruction has a one byte operand and immediate addressing is + * allowed but not used, check for an operand expression in the form + *