//
// RMAC - Reboot's Macro Assembler for all Atari computers
// EXPR.C - Expression Analyzer
-// Copyright (C) 199x Landon Dyer, 2011-2017 Reboot and Friends
+// Copyright (C) 199x Landon Dyer, 2011-2018 Reboot and Friends
// RMAC derived from MADMAC v1.07 Written by Landon Dyer, 1986
// Source utilised with the kind permission of Landon Dyer
//
// All other binary operators must have two ABS items to work with.
// They all produce an ABS value.
+ // Shamus: Is this true? There's at least one counterexample of legit
+ // code where this assumption fails to produce correct code.
default:
//printf("evexpr(): default\n");
- // GH - Removed for v1.0.15 as part of the fix for indexed loads.
- //if ((*sattr & (TEXT|DATA|BSS)) || (*--sattr & (TEXT|DATA|BSS)))
- //error(seg_error);
switch ((int)tk.u32[-1])
{
}
//printf("%i\n", *sval);
- *sattr = ABS | DEFINED | attr; // Expr becomes absolute
+//no *sattr = ABS | DEFINED | attr; // Expr becomes absolute
break;
case '/':
}
//printf("%i\n", *sval);
- *sattr = ABS | DEFINED | attr; // Expr becomes absolute
+//no *sattr = ABS | DEFINED | attr; // Expr becomes absolute
break;
case '%':
return error("mod (%) by zero");
*sval %= sval[1];
- *sattr = ABS | DEFINED; // Expr becomes absolute
+//no *sattr = ABS | DEFINED; // Expr becomes absolute
break;
case SHL:
return error("floating point numbers not allowed with operator '<<'.");
*sval <<= sval[1];
- *sattr = ABS | DEFINED; // Expr becomes absolute
+//no *sattr = ABS | DEFINED; // Expr becomes absolute
break;
case SHR:
return error("floating point numbers not allowed with operator '>>'.");
*sval >>= sval[1];
- *sattr = ABS | DEFINED; // Expr becomes absolute
+//no *sattr = ABS | DEFINED; // Expr becomes absolute
break;
case '&':
return error("floating point numbers not allowed with operator '&'.");
*sval &= sval[1];
- *sattr = ABS | DEFINED; // Expr becomes absolute
+//no *sattr = ABS | DEFINED; // Expr becomes absolute
break;
case '^':
return error("floating point numbers not allowed with operator '^'.");
*sval ^= sval[1];
- *sattr = ABS | DEFINED; // Expr becomes absolute
+//no *sattr = ABS | DEFINED; // Expr becomes absolute
break;
case '|':
return error("floating point numbers not allowed with operator '|'.");
*sval |= sval[1];
- *sattr = ABS | DEFINED; // Expr becomes absolute
+//no *sattr = ABS | DEFINED; // Expr becomes absolute
break;
default:
return OK;
}
+
+//
+// Count the # of tokens in the passed in expression
+// N.B.: 64-bit constants count as two tokens each
+//
+uint16_t ExpressionLength(TOKEN * tk)
+{
+ uint16_t length;
+
+ for(length=0; tk[length]!=ENDEXPR; length++)
+ {
+ // Add one to length for 2X tokens, two for 3X tokens
+ if (tk[length] == SYMBOL)
+ length++;
+ else if ((tk[length] == CONST) || (tk[length] == FCONST))
+ length += 2;
+ }
+
+ // Add 1 for ENDEXPR
+ length++;
+
+ return length;
+}
+