diff --git a/src/ca65/ea.c b/src/ca65/ea.c index 00303a47f..a0998b5a2 100644 --- a/src/ca65/ea.c +++ b/src/ca65/ea.c @@ -40,7 +40,7 @@ #include "nexttok.h" #include "ea.h" - + /*****************************************************************************/ /* Code */ @@ -51,12 +51,36 @@ void GetEA (EffAddr* A) /* Parse an effective address, return the result in A */ { + unsigned long Restrictions; + /* Clear the output struct */ A->AddrModeSet = 0; A->Bank = 0; A->Expr = 0; + /* Handle an addressing size override */ + switch (Tok) { + case TOK_OVERRIDE_ZP: + Restrictions = AM_DIR | AM_DIR_X | AM_DIR_Y; + NextTok (); + break; + case TOK_OVERRIDE_ABS: + Restrictions = AM_ABS | AM_ABS_X | AM_ABS_Y; + NextTok (); + break; + + case TOK_OVERRIDE_FAR: + Restrictions = AM_ABS_LONG | AM_ABS_LONG_X; + NextTok (); + break; + + default: + Restrictions = ~0UL; /* None */ + break; + } + + /* Parse the effective address */ if (TokIsSep (Tok)) { A->AddrModeSet = AM_IMPLICIT; @@ -167,7 +191,7 @@ void GetEA (EffAddr* A) switch (Tok) { case TOK_X: - A->AddrModeSet = AM_ABS_X | AM_DIR_X; + A->AddrModeSet = AM_ABS_LONG_X | AM_ABS_X | AM_DIR_X; NextTok (); break; @@ -188,11 +212,14 @@ void GetEA (EffAddr* A) } else { - A->AddrModeSet = AM_ABS | AM_DIR; + A->AddrModeSet = AM_ABS_LONG | AM_ABS | AM_DIR; } } } + + /* Apply addressing mode overrides */ + A->AddrModeSet &= Restrictions; } diff --git a/src/ca65/scanner.c b/src/ca65/scanner.c index 39f04174d..cec7284a5 100644 --- a/src/ca65/scanner.c +++ b/src/ca65/scanner.c @@ -767,13 +767,31 @@ Again: ReadIdent (0); /* Check for special names */ - if (SVal [1] == '\0') { + if (SVal[1] == '\0') { switch (toupper (SVal [0])) { case 'A': - Tok = TOK_A; + if (C == ':') { + NextChar (); + Tok = TOK_OVERRIDE_ABS; + } else { + Tok = TOK_A; + } return; + case 'F': + if (C == ':') { + NextChar (); + Tok = TOK_OVERRIDE_FAR; + } else { + Tok = TOK_IDENT; + } + return; + + case 'S': + Tok = TOK_S; + return; + case 'X': Tok = TOK_X; return; @@ -782,9 +800,14 @@ Again: Tok = TOK_Y; return; - case 'S': - Tok = TOK_S; - return; + case 'Z': + if (C == ':') { + NextChar (); + Tok = TOK_OVERRIDE_ZP; + } else { + Tok = TOK_IDENT; + } + return; default: Tok = TOK_IDENT; diff --git a/src/ca65/scanner.h b/src/ca65/scanner.h index 46549b91e..0bf4617b4 100644 --- a/src/ca65/scanner.h +++ b/src/ca65/scanner.h @@ -105,6 +105,10 @@ enum Token { TOK_LBRACK, /* [ */ TOK_RBRACK, /* ] */ + TOK_OVERRIDE_ZP, /* z: */ + TOK_OVERRIDE_ABS, /* a: */ + TOK_OVERRIDE_FAR, /* f: */ + TOK_MACPARAM, /* Macro parameter, not generated by scanner */ TOK_REPCOUNTER, /* Repeat counter, not generated by scanner */