changeset 497:b02f1bfce53b

Improve and clean up section parsing support.
author Matti Hamalainen <ccr@tnsp.org>
date Sat, 17 Nov 2012 14:21:42 +0200
parents 966617f0f6cd
children 270a2d695607
files objlink.c
diffstat 1 files changed, 48 insertions(+), 27 deletions(-) [+]
line wrap: on
line diff
--- a/objlink.c	Sat Nov 17 01:52:59 2012 +0200
+++ b/objlink.c	Sat Nov 17 14:21:42 2012 +0200
@@ -22,7 +22,6 @@
     ssize_t start, end;	// Start and end address
     int type;           // Type
     char *name;         // Name of the block
-    ssize_t size;
     int placement;
 } DMMemBlock;
 
@@ -80,28 +79,28 @@
  */
 const DMMemModel memoryModels[] = {
     { "C64 unrestricted", "$01 = $34", (64*1024), 0, {
-    { 0, 0, 0, NULL, 0, 0 }
+    { 0, 0, 0, NULL, 0 }
     }},
 
     { "C64 normal (IO+Basic+Kernal)", "$01 = $37", (64*1024), 3, {
-    { 0xA000, 0xBFFF,    MTYPE_ROM_WT,    "Basic ROM", 0, PLACE_STATIC },
-    { 0xD000, 0xDFFF,    MTYPE_IO,        "I/O", 0, PLACE_STATIC },
-    { 0xE000, 0xFFFF,    MTYPE_ROM_WT,    "Kernal ROM", 0, PLACE_STATIC },
+    { 0xA000, 0xBFFF,    MTYPE_ROM_WT,    "Basic ROM",  PLACE_STATIC },
+    { 0xD000, 0xDFFF,    MTYPE_IO,        "I/O",  PLACE_STATIC },
+    { 0xE000, 0xFFFF,    MTYPE_ROM_WT,    "Kernal ROM",  PLACE_STATIC },
     }},
 
     { "C64 modified (IO+Kernal)", "$01 = $36", (64*1024), 2, {
-    { 0xD000, 0xDFFF,    MTYPE_IO,        "I/O", 0, PLACE_STATIC },
-    { 0xE000, 0xFFFF,    MTYPE_ROM_WT,    "Kernal ROM", 0, PLACE_STATIC },
+    { 0xD000, 0xDFFF,    MTYPE_IO,        "I/O",  PLACE_STATIC },
+    { 0xE000, 0xFFFF,    MTYPE_ROM_WT,    "Kernal ROM",  PLACE_STATIC },
     }},
 
     { "C64 modified (IO only)", "$01 = $35", (64*1024), 1, {
-    { 0xD000, 0xDFFF,    MTYPE_IO,        "I/O", 0, PLACE_STATIC },
+    { 0xD000, 0xDFFF,    MTYPE_IO,        "I/O",  PLACE_STATIC },
     }},
 
     { "C64 modified (Char+Kernal+Basic)", "$01 = $33", (64*1024), 3, {
-    { 0xA000, 0xBFFF,    MTYPE_ROM_WT,    "Basic ROM", 0, PLACE_STATIC },
-    { 0xD000, 0xDFFF,    MTYPE_ROM,       "Char ROM", 0, PLACE_STATIC },
-    { 0xE000, 0xFFFF,    MTYPE_ROM_WT,    "Kernal ROM", 0, PLACE_STATIC },
+    { 0xA000, 0xBFFF,    MTYPE_ROM_WT,    "Basic ROM",  PLACE_STATIC },
+    { 0xD000, 0xDFFF,    MTYPE_ROM,       "Char ROM", PLACE_STATIC },
+    { 0xE000, 0xFFFF,    MTYPE_ROM_WT,    "Kernal ROM", PLACE_STATIC },
     }},
 
 /*
@@ -146,7 +145,7 @@
     {  0, '?', "help",        "Show this help", OPT_NONE },
     {  1, 'r', "input-raw",   "RAW input: -r <file>:<addr>", OPT_ARGREQ },
     {  2, 'p', "input-prg",   "PRG input: -p <file>[:<addr>]", OPT_ARGREQ },
-    { 12, 's', "section",     "Reserved section: -s <start>-<end> or <start>:<len>", OPT_ARGREQ },
+    { 12, 's', "section",     "Reserved section: -s <start>-<end>[,name] or <start>:<len>[,name]", OPT_ARGREQ },
     {  5, 'o', "output",      "Specify output file, -o <file>", OPT_ARGREQ },
     {  6, 'O', "overlap",     "Allow overlapping memory areas", OPT_NONE },
     {  7, 'm', "model",       "Set memory model", OPT_ARGREQ },
@@ -207,10 +206,9 @@
     if (nmemBlocks < MAX_FILENAMES)
     {
         memBlocks[nmemBlocks].start = startAddr;
-        memBlocks[nmemBlocks].end = endAddr;
-        memBlocks[nmemBlocks].size = (endAddr - startAddr + 1);
-        memBlocks[nmemBlocks].name = dm_strdup(blockName);
-        memBlocks[nmemBlocks].type = blockType;
+        memBlocks[nmemBlocks].end   = endAddr;
+        memBlocks[nmemBlocks].name  = dm_strdup(blockName);
+        memBlocks[nmemBlocks].type  = blockType;
         nmemBlocks++;
     }
     else
@@ -229,9 +227,9 @@
 }
 
 
-BOOL dmParseSection(const char *arg, ssize_t *sectStart, ssize_t *sectEnd, ssize_t *sectLen)
+BOOL dmParseSection(const char *arg, ssize_t *sectStart, ssize_t *sectEnd, char **sectName, BOOL canHasName)
 {
-    char sectMode, *sep, *str;
+    char sectMode, *sep, *str, *namesep;
     ssize_t tmpi;
 
     // Define reserved section
@@ -258,6 +256,28 @@
         dmError("Section start address '%s' in '%s' invalid.\n", str, arg);
         goto error;
     }
+    
+    // Check for name
+    namesep = strchr(sep + 1, ',');
+    if (canHasName && namesep != NULL)
+    {
+        *namesep = 0;
+        namesep++;
+        if (*namesep == 0)
+        {
+            dmError("Section definition '%s' name is empty. Either specify name or leave it out.\n",
+                arg);
+            goto error;
+        }
+        *sectName = dm_strdup(namesep);
+    }
+    else
+    if (namesep != NULL)
+    {
+        dmError("Section definition does not allow a name, syntax error in '%s' at '%s'.\n",
+            arg, namesep);
+        goto error;
+    }
 
     // Get end address or length
     if (!dmGetIntVal(sep + 1, &tmpi))
@@ -270,8 +290,7 @@
 
     if (sectMode == ':')
     {
-        *sectEnd = *sectStart + tmpi;
-        *sectLen = tmpi;
+        *sectEnd = *sectStart + tmpi - 1;
     }
     else
     {
@@ -281,7 +300,6 @@
                 arg);
             goto error;
         }
-        *sectLen = tmpi - *sectStart + 1;
         *sectEnd = tmpi;
     }
 
@@ -428,24 +446,27 @@
 
     case 12:
         {
+            char *sectName = "Clear";
             ssize_t sectStart, sectEnd, sectLen;
-            if (!dmParseSection(optArg, &sectStart, &sectEnd, &sectLen))
+            if (!dmParseSection(optArg, &sectStart, &sectEnd, &sectName, TRUE))
                 return FALSE;
 
             // Allocate memory block
-            dmMsg(1, "Reserve $%.4x - $%.4x ($%x, %d bytes) as 'Clear'\n",
-                sectStart, sectEnd, sectLen, sectLen);
+            sectLen = sectEnd - sectStart + 1;
+            dmMsg(1, "Reserve $%.4x - $%.4x ($%x, %d bytes) as '%s'\n",
+                sectStart, sectEnd, sectLen, sectLen, sectName);
 
-            reserveMemBlock(sectStart, sectEnd, "Clear", MTYPE_RES);
+            reserveMemBlock(sectStart, sectEnd, sectName, MTYPE_RES);
         }
         break;
 
     case 13:
         {
-            ssize_t cropLen;
-            if (!dmParseSection(optArg, &optCropStart, &optCropEnd, &cropLen))
+            size_t cropLen;
+            if (!dmParseSection(optArg, &optCropStart, &optCropEnd, NULL, FALSE))
                 return FALSE;
 
+            cropLen = optCropEnd - optCropEnd + 1;
             dmMsg(1, "Cutting output to $%.4x - $%.4x ($%x, %d bytes)\n",
                 optCropStart, optCropEnd, cropLen, cropLen);