//
// RMAC - Reboot's Macro Assembler for all Atari computers
// PARMODE.C - Addressing Modes Parser Include
-// Copyright (C) 199x Landon Dyer, 2011-2018 Reboot and Friends
+// Copyright (C) 199x Landon Dyer, 2011-2020 Reboot and Friends
// RMAC derived from MADMAC v1.07 Written by Landon Dyer, 1986
// Source utilised with the kind permission of Landon Dyer
//
}
else if ((*tok >= KW_D0) && (*tok <= KW_D7))
{
- //Since index register isn't used here, store register number in this field
+ // Since index register isn't used here, store register number in this field
AnIXREG = *tok++ & 7; // (Dn)
if (*tok == ')')
// expr[.L]
AMn = ABSL;
- // Defined, absolute values from $FFFF8000..$00007FFF get optimized
- // to absolute short
- if (CHECK_OPTS(OPT_ABS_SHORT)
- && ((AnEXATTR & (TDB | DEFINED)) == DEFINED)
- && (((uint32_t)AnEXVAL + 0x8000) < 0x10000))
- {
- AMn = ABSW;
-
- if (sbra_flag)
- warn("absolute value from $FFFF8000..$00007FFF optimised to absolute short");
- }
+ // When PC relative is enforced, check for any symbols that aren't
+ // EQU'd, in this case it's an illegal mode
+ if (optim_pc)
+ if (AnEXATTR & REFERENCED)
+ if (AnEXATTR & DEFINED)
+ if (!(AnEXATTR & EQUATED))
+ return error("relocation not allowed");
- // Is .L forced here?
+ // .L is forced here
if (*tok == DOTL)
{
tok++;
AMn = ABSL;
}
+ else
+ {
+ // Defined, absolute values from $FFFF8000..$00007FFF get
+ // optimized to absolute short
+ if (CHECK_OPTS(OPT_ABS_SHORT)
+ && ((AnEXATTR & (TDB | DEFINED)) == DEFINED)
+ && (((uint32_t)AnEXVAL + 0x8000) < 0x10000))
+ {
+ AMn = ABSW;
+
+ if (sbra_flag)
+ warn("absolute value from $FFFF8000..$00007FFF optimised to absolute short");
+ }
+ }
goto AnOK;
}