+
+ // ([bd,An/PC],Xn,od)
+ // Is .W forced here?
+ if (*tok == DOTW)
+ {
+ tok++;
+ // od[.W]
+ AnEXTEN |= EXT_IISPOSW; // Word outer displacement
+ AMn = MEMPOST + ea_PC;
+ }
+ else
+ {
+ // Is .L forced here?
+ if (*tok == DOTL)
+ tok++; // Doesn't matter, we're going for .L anyway
+
+ WORD od_ea = 0;
+
+ // od.L
+ if (!(AnEXTEN & EXT_BS))
+ od_ea = EXT_IISPOSL; // Long outer displacement
+ else
+ {
+ // bd is suppressed, so sticking the od size in bd
+ od_ea = EXT_BDSIZEL;
+ // And of course the expression has to be copied to
+ // AnBEXPR instead of AnEXPR. Yay. :-/
+ int i = 0;
+
+ do
+ {
+ AnBEXPR[i] = AnEXPR[i];
+ i++;
+ }
+ while (AnEXPR[i] != 'E');
+
+ AnBEXPR[i] = 'E';
+ }
+
+ AMn = MEMPOST + ea_PC;
+
+ // Defined, absolute values from $FFFF8000..$00007FFF get
+ // optimized to absolute short
+ if (CHECK_OPTS(OPT_020_DISP)
+ && ((AnEXATTR & (TDB | DEFINED)) == DEFINED)
+ && (((uint32_t)AnEXVAL + 0x8000) < 0x10000))
+ {
+ od_ea = EXT_IISPOSW; // Word outer displacement
+ AMn = MEMPOST + ea_PC;
+
+ if (optim_warn_flag)
+ warn("absolute value in outer displacement ranging $FFFF8000..$00007FFF optimised to absolute short");
+ }
+ AnEXTEN |= od_ea;
+ }
+
+ // Check for final closing parenthesis
+ if (*tok == ')')
+ {
+ tok++;
+ goto AnOK;
+ }
+ else
+ return error("Closing parenthesis missing on addressing mode");
+
+IS_SUPPRESSEDn:
+
+ // Check for od
+ if (*tok == ')') // ([bd,An/PC],Xn)
+ {
+ // od is non existent, get out of jail free card
+ AMn = MEMPOST + ea_PC; // let's say it's ([bd,An],Xn,od) with od=0 then
+ AnEXTEN |= EXT_IISNOIN; // No outer displacement
+ tok++;
+ goto AnOK;
+ }
+ else if (*tok!=',')
+ return error("comma expected");
+ else
+ tok++; // eat the comma
+
+ if ((*tok != CONST) && (*tok != SYMBOL))
+ goto badmode;
+
+ expr(AnEXPR, &AnEXVAL, &AnEXATTR, &AnESYM);
+
+ if (CHECK_OPTS(OPT_020_DISP) && (AnEXVAL == 0))
+ {
+ // od=0 so optimise it out
+ AMn = MEMPOST + ea_PC; // let's say it's ([bd,An],Xn,od) with od=0 then
+ AnEXTEN |= EXT_IISNOIN; // No outer displacement
+ tok++;
+ goto AnOK;
+ }
+
+ // ([bd,An/PC],Xn,od)
+ if (*tok == DOTL)
+ {
+ // expr.L
+ tok++;
+ AMn = MEMPOST + ea_PC;
+ AnEXTEN |= EXT_IISNOIL; // Long outer displacement with IS suppressed
+ }
+ else
+ {
+ // expr[.W][]
+ AnEXTEN |= EXT_IISNOIW; // Word outer displacement with IS suppressed
+ AMn = MEMPRE + ea_PC;;
+
+ if (*tok == DOTW)
+ {
+ //AnEXTEN|=EXT_IISNOIW; // Word outer displacement
+ AMn = MEMPOST + ea_PC;
+ tok++;
+ }
+ // Defined, absolute values from $FFFF8000..$00007FFF get
+ // optimized to absolute short
+ else if (CHECK_OPTS(OPT_020_DISP)
+ && ((AnEXATTR & (TDB | DEFINED)) == DEFINED)
+ && (((uint32_t)AnEXVAL + 0x8000) < 0x10000))
+ {
+ //AnEXTEN|=EXT_IISNOIW; // Word outer displacement with IS suppressed
+ if (optim_warn_flag)
+ warn("outer displacement absolute value from $FFFF8000..$00007FFF optimised to absolute short");
+ }
+ }
+
+ // Check for final closing parenthesis
+ if (*tok == ')')
+ {
+ tok++;
+ goto AnOK;
+ }
+ else
+ return error("Closing parenthesis missing on addressing mode");