]> git.sur5r.net Git - cc65/commitdiff
New feature: startaddress
authorcuz <cuz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Tue, 3 Dec 2002 22:32:38 +0000 (22:32 +0000)
committercuz <cuz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Tue, 3 Dec 2002 22:32:38 +0000 (22:32 +0000)
git-svn-id: svn://svn.cc65.org/cc65/trunk@1713 b7a2c559-68d2-44c3-8de9-860c34a00d81

src/ld65/config.c
src/ld65/global.c
src/ld65/global.h
src/ld65/main.c
src/ld65/scanner.h

index 6e310a8d52ef41090c1799914d5166d65cb40793..c06824ecbe97242122ecbf2d04b88c31b9caa871 100644 (file)
@@ -1152,37 +1152,115 @@ static void ParseConDes (void)
 
 
 
+static void ParseStartAddress (void)
+/* Parse the STARTADDRESS feature */
+{
+    static const IdentTok Attributes [] = {
+               {   "DEFAULT",  CFGTOK_DEFAULT },
+    };
+
+
+    /* Attribute values. */
+    unsigned long DefStartAddr = 0;
+
+    /* Bitmask to remember the attributes we got already */
+    enum {
+       atNone          = 0x0000,
+               atDefault       = 0x0001
+    };
+    unsigned AttrFlags = atNone;
+
+    /* Parse the attributes */
+    while (1) {
+
+       /* Map the identifier to a token */
+       cfgtok_t AttrTok;
+               CfgSpecialToken (Attributes, ENTRY_COUNT (Attributes), "Attribute");
+       AttrTok = CfgTok;
+
+       /* An optional assignment follows */
+       CfgNextTok ();
+       CfgOptionalAssign ();
+
+       /* Check which attribute was given */
+       switch (AttrTok) {
+
+           case CFGTOK_DEFAULT:
+               /* Don't allow this twice */
+               FlagAttr (&AttrFlags, atDefault, "DEFAULT");
+               /* We expect a number */
+               CfgAssureInt ();
+                CfgRangeCheck (0, 0xFFFFFF);
+               /* Remember the value for later */
+                DefStartAddr = CfgIVal;
+               break;
+
+           default:
+               FAIL ("Unexpected attribute token");
+
+       }
+
+               /* Skip the attribute value */
+       CfgNextTok ();
+
+       /* Semicolon ends the ConDes decl, otherwise accept an optional comma */
+       if (CfgTok == CFGTOK_SEMI) {
+           break;
+       } else if (CfgTok == CFGTOK_COMMA) {
+           CfgNextTok ();
+       }
+    }
+
+    /* Check if we have all mandatory attributes */
+    AttrCheck (AttrFlags, atDefault, "DEFAULT");
+
+    /* If no start address was given on the command line, use the one given
+     * here
+     */
+    if (!HaveStartAddr) {
+        StartAddr = DefStartAddr;
+    }
+}
+
+
+
 static void ParseFeatures (void)
 /* Parse a features section */
 {
     static const IdentTok Features [] = {
-               {   "CONDES",   CFGTOK_CONDES   },
+               {   "CONDES",       CFGTOK_CONDES       },
+        {   "STARTADDRESS", CFGTOK_STARTADDRESS },
     };
 
     while (CfgTok == CFGTOK_IDENT) {
 
-       /* Map the identifier to a token */
-       cfgtok_t FeatureTok;
+       /* Map the identifier to a token */
+       cfgtok_t FeatureTok;
                CfgSpecialToken (Features, ENTRY_COUNT (Features), "Feature");
                FeatureTok = CfgTok;
 
-       /* Skip the name and the following colon */
-       CfgNextTok ();
-       CfgConsumeColon ();
+       /* Skip the name and the following colon */
+       CfgNextTok ();
+       CfgConsumeColon ();
 
-       /* Parse the format options */
-       switch (FeatureTok) {
+       /* Parse the format options */
+       switch (FeatureTok) {
 
-           case CFGTOK_CONDES:
-               ParseConDes ();
-               break;
+           case CFGTOK_CONDES:
+               ParseConDes ();
+               break;
 
-           default:
-               Error ("Unexpected feature token");
-       }
+            case CFGTOK_STARTADDRESS:
+                ParseStartAddress ();
+                break;
 
-       /* Skip the semicolon */
-       CfgConsumeSemi ();
+
+           default:
+               Error ("Unexpected feature token");
+       }
+
+       /* Skip the semicolon */
+       CfgConsumeSemi ();
     }
 }
 
index a121673068ba669cfd49a804f70bbbea4e7d037e..6ac6f9cce3e3d7016126e80edcb79ff332cfc781 100644 (file)
 const char* OutputName     = "a.out";  /* Name of output file */
 
 unsigned ModuleId           = 0;        /* Id for o65 module */
-unsigned long StartAddr            = 0x200;    /* Start address */
+
+/* Start address */
+unsigned char HaveStartAddr = 0;        /* Start address not given */
+unsigned long StartAddr     = 0x200;    /* Start address */
 
 unsigned char VerboseMap    = 0;       /* Verbose map file */
 const char* MapFileName            = 0;        /* Name of the map file */
index d68b69029185f1c4703505f60dfe82611378d521..a56daf19f8820a59ce2a7d2a2ca4562e9ee15c07 100644 (file)
 
 
 extern const char*     OutputName;     /* Name of output file */
-                                                                           
+
 extern unsigned         ModuleId;       /* Id for o65 module */
+
+extern unsigned char    HaveStartAddr;  /* True if start address was given */
 extern unsigned long   StartAddr;      /* Start address */
 
 extern unsigned char   VerboseMap;     /* Verbose map file */
index 4500889713638af43ac65680bcf9a06ab3d44acf..528c7c095d1ae5159acf87ea13cfc119e0ff0d0e 100644 (file)
@@ -270,6 +270,7 @@ static void OptStartAddr (const char* Opt, const char* Arg)
 /* Set the default start address */
 {
     StartAddr = CvtNumber (Opt, Arg);
+    HaveStartAddr = 1;
 }
 
 
index 744abdb9a490b4dae36d05d3d0b52f9055cf871e..d2af2af429a4c9d784728efae582d1cc73e041d8 100644 (file)
@@ -106,6 +106,8 @@ typedef enum {
     CFGTOK_CC65,
 
     CFGTOK_CONDES,
+    CFGTOK_STARTADDRESS,
+
     CFGTOK_SEGMENT,
     CFGTOK_LABEL,
     CFGTOK_COUNT,
@@ -115,7 +117,9 @@ typedef enum {
     CFGTOK_DESTRUCTOR,
 
     CFGTOK_DECREASING,
-    CFGTOK_INCREASING
+    CFGTOK_INCREASING,
+
+    CFGTOK_DEFAULT
 
 } cfgtok_t;