#include "nexttok.h"
#include "ea.h"
-
+
/*****************************************************************************/
/* Code */
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;
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;
} else {
- A->AddrModeSet = AM_ABS | AM_DIR;
+ A->AddrModeSet = AM_ABS_LONG | AM_ABS | AM_DIR;
}
}
}
+
+ /* Apply addressing mode overrides */
+ A->AddrModeSet &= Restrictions;
}
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;
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;
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 */