}
/* Define the symbol */
- SymDef (SymName, LiteralExpr (Val), 0);
+ SymDef (SymName, LiteralExpr (Val), 0, 0);
}
/* Skip the '=' */
NextTok ();
/* Define the symbol with the expression following the '=' */
- SymDef (Ident, Expression (), 0);
+ SymDef (Ident, Expression(), 0, 0);
/* Don't allow anything after a symbol definition */
Done = 1;
} else {
/* Define a label */
- SymDef (Ident, CurrentPC (), IsZPSeg ());
+ SymDef (Ident, CurrentPC(), IsZPSeg(), 1);
/* Skip the colon. If NoColonLabels is enabled, allow labels
* without a colon if there is no whitespace before the
* identifier.
#define SF_GLOBAL 0x0010 /* Global symbol */
#define SF_ZP 0x0020 /* Declared as zeropage symbol */
#define SF_ABS 0x0040 /* Declared as absolute symbol */
+#define SF_LABEL 0x0080 /* Used as a label */
#define SF_INDEXED 0x0800 /* Index is valid */
#define SF_CONST 0x1000 /* The symbol has a constant value */
#define SF_MULTDEF 0x2000 /* Multiply defined symbol */
-void SymDef (const char* Name, ExprNode* Expr, int ZP)
+void SymDef (const char* Name, ExprNode* Expr, int ZP, int Label)
/* Define a new symbol */
{
/* Do we have such a symbol? */
if (ZP) {
S->Flags |= SF_ZP;
}
+ if (Label) {
+ S->Flags |= SF_LABEL;
+ }
/* If the symbol is a ZP symbol, check if the value is in correct range */
if (S->Flags & SF_ZP) {
+static unsigned char GetExprMask (SymEntry* S)
+/* Return the expression bits for the given symbol table entry */
+{
+ unsigned char ExprMask;
+
+ /* Check if the symbol is const */
+ ExprMask = (SymIsConst (S))? EXP_CONST : EXP_EXPR;
+
+ /* Add zeropage/abs bits */
+ ExprMask |= (S->Flags & SF_ZP)? EXP_ZP : EXP_ABS;
+
+ /* Add the label/equate bits */
+ ExprMask |= (S->Flags & SF_LABEL)? EXP_LABEL : EXP_EQUATE;
+
+ /* Return the mask */
+ return ExprMask;
+}
+
+
+
void WriteExports (void)
/* Write the exports list to the object file */
{
/* Finalize an associated expression if we have one */
SymFinalize (S);
- /* Check if the symbol is const */
- ExprMask = (SymIsConst (S))? EXP_CONST : EXP_EXPR;
-
- /* Add zeropage/abs bits */
- ExprMask |= (S->Flags & SF_ZP)? EXP_ZP : EXP_ABS;
+ /* Get the expression bits */
+ ExprMask = GetExprMask (S);
/* Count the number of ConDes types */
for (Type = 0; Type < CD_TYPE_COUNT; ++Type) {
for (Type = 0; Type < CD_TYPE_COUNT; ++Type) {
unsigned char Prio = S->ConDesPrio[Type];
if (Prio != CD_PRIO_NONE) {
- ObjWrite8 (CD_BUILD (Type, Prio));
+ ObjWrite8 (CD_BUILD (Type, Prio));
}
}
}
/* Finalize an associated expression if we have one */
SymFinalize (S);
- /* Check if the symbol is const */
- ExprMask = (SymIsConst (S))? EXP_CONST : EXP_EXPR;
-
- /* Add zeropage/abs bits */
- ExprMask |= (S->Flags & SF_ZP)? EXP_ZP : EXP_ABS;
+ /* Get the expression bits */
+ ExprMask = GetExprMask (S);
/* Write the type */
ObjWrite8 (ExprMask);
/*****************************************************************************/
-/* Code */
+/* Code */
/*****************************************************************************/
void SymLeaveLevel (void);
/* Leave the current lexical level */
-void SymDef (const char* Name, ExprNode* Expr, int ZP);
+void SymDef (const char* Name, ExprNode* Expr, int ZP, int Label);
/* Define a new symbol */
SymEntry* SymRef (const char* Name);