]> git.sur5r.net Git - cc65/commitdiff
Temp fix for some address size problems
authorcuz <cuz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Tue, 18 Nov 2003 20:50:55 +0000 (20:50 +0000)
committercuz <cuz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Tue, 18 Nov 2003 20:50:55 +0000 (20:50 +0000)
git-svn-id: svn://svn.cc65.org/cc65/trunk@2674 b7a2c559-68d2-44c3-8de9-860c34a00d81

src/ca65/expr.c
src/ca65/expr.h
src/ca65/scanner.c
src/ca65/symentry.c

index 417632f09a0d9d03b8f96e0cbcaf64408f36e248..3a13f4c8f01aa574ef453a1323bbfc7d28c18a09 100644 (file)
@@ -196,7 +196,15 @@ int IsByteRange (long Val)
 int IsWordRange (long Val)
 /* Return true if this is a word value */
 {
-    return (Val & ~0xFFFF) == 0;
+    return (Val & ~0xFFFFL) == 0;
+}
+
+
+
+int IsFarRange (long Val)
+/* Return true if this is a far (24 bit) value */
+{
+    return (Val & ~0xFFFFFFL) == 0;
 }
 
 
@@ -276,7 +284,7 @@ static ExprNode* FuncConst (void)
 
     /* Done */
     return Result;
-}                                                             
+}
 
 
 
@@ -403,7 +411,7 @@ static ExprNode* FuncReferenced (void)
 
 static ExprNode* FuncSizeOf (void)
 /* Handle the .SIZEOF function */
-{                                                          
+{
     long Size;
 
     /* Get the struct for the scoped struct name */
index d7b046f62dcd62ed24ba9892a707f1d8f8ec58c9..a3827e873af53a9fbd7bd9e83320a39c2b6bbd32 100644 (file)
@@ -66,7 +66,7 @@ void FreeExpr (ExprNode* Root);
 ExprNode* SimplifyExpr (ExprNode* Expr);
 /* Try to simplify the given expression tree */
 
-ExprNode* GenLiteralExpr (long Val);                   
+ExprNode* GenLiteralExpr (long Val);
 /* Return an expression tree that encodes the given literal value */
 
 ExprNode* GenSymExpr (struct SymEntry* Sym);
@@ -113,6 +113,9 @@ int IsByteRange (long Val);
 int IsWordRange (long Val);
 /* Return true if this is a word value */
 
+int IsFarRange (long Val);
+/* Return true if this is a far (24 bit) value */
+
 ExprNode* CloneExpr (ExprNode* Expr);
 /* Clone the given expression tree. The function will simply clone symbol
  * nodes, it will not resolve them.
index cb4712a65b81fbacf5da17f3e2b3c3b0bc57767a..56aadd74c873b3533e60085f10fc217926b25ae5 100644 (file)
@@ -1152,6 +1152,7 @@ unsigned char ParseAddrSize (void)
         "DIRECT", "ZEROPAGE", "ZP",
         "ABSOLUTE", "ABS", "NEAR",
         "FAR",
+        "LONG", "DWORD",
     };
 
     /* Check for an identifier */
@@ -1169,6 +1170,8 @@ unsigned char ParseAddrSize (void)
         case 4:
         case 5: return ADDR_SIZE_ABS;
         case 6: return ADDR_SIZE_FAR;
+        case 7:
+        case 8: return ADDR_SIZE_LONG;
         default:
             Error ("Address size specifier expected");
             return ADDR_SIZE_DEFAULT;
index a47fde9a64237f25ff6c35cc7ce616894a496368..6d3dbc30c0d270a17bf768c58d35b2abc4136dc6 100644 (file)
@@ -195,8 +195,16 @@ void SymDef (SymEntry* S, ExprNode* Expr, unsigned char AddrSize, unsigned Flags
     /* Map a default address size to a real value */
     if (AddrSize == ADDR_SIZE_DEFAULT) {
         long Val;
-        if (IsConstExpr (Expr, &Val) && IsByteRange (Val)) {
-            AddrSize = ADDR_SIZE_ZP;
+        if (IsConstExpr (Expr, &Val)) {
+            if (IsByteRange (Val)) {
+                AddrSize = ADDR_SIZE_ZP;
+            } else if (IsWordRange (Val)) {
+                AddrSize = ADDR_SIZE_ABS;
+            } else if (IsFarRange (Val)) {
+                AddrSize = ADDR_SIZE_FAR;
+            } else {
+                AddrSize = ADDR_SIZE_LONG;
+            }
         } else {
             AddrSize = SymAddrSize (S);
         }