]> git.sur5r.net Git - cc65/commitdiff
Added INPUTOFFS and INPUTSIZE
authorcuz <cuz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Sat, 23 Aug 2003 16:03:58 +0000 (16:03 +0000)
committercuz <cuz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Sat, 23 Aug 2003 16:03:58 +0000 (16:03 +0000)
git-svn-id: svn://svn.cc65.org/cc65/trunk@2411 b7a2c559-68d2-44c3-8de9-860c34a00d81

doc/da65.sgml
src/da65/code.c
src/da65/global.c
src/da65/global.h
src/da65/infofile.c
src/da65/main.c
src/da65/scanner.h

index cd9b6315b505c6cfa72b2e70ed9d44cafc7fdc3e..9513ab9f333b4a950551a2a95a8a6ac92dec53ff 100644 (file)
@@ -79,7 +79,7 @@ Here is a description of all the command line options:
   <tag><tt>--comments n</tt></tag>
 
   Set the comment level for the output. Valid arguments are 0..4. Greater
-  values will increase the level of additional information written to the 
+  values will increase the level of additional information written to the
   output file in form of comments.
 
 
@@ -261,6 +261,20 @@ following attributes are recognized:
   input file name on the command line.
 
 
+  <tag><tt>INPUTOFFS</tt></tag>
+
+  The attribute is followed by a numerical value that gives an offset into
+  the input file which is skipped before reading data. The attribute may be
+  used to skip headers or unwanted code sections in the input file.
+
+
+  <tag><tt>INPUTSIZE</tt></tag>
+
+  INPUTSIZE is followed by a numerical value that gives the amount of data
+  to read from the input file. Data beyond <tt/INPUTOFFS+INPUTSIZE/ is 
+  ignored.
+
+
   <tag><tt>OUTPUTNAME</tt></tag>
 
   The attribute is followed by string value, which gives the name of the
index cef4ef2ddf3fb8e2a05ef237434c23a6b3fa6361..ceb303fd509b835553fa915a06434266bc2fae66 100644 (file)
@@ -86,18 +86,43 @@ void LoadCode (void)
        Error ("Cannot seek on file `%s': %s", InFile, strerror (errno));
     }
     Size = ftell (F);
-    rewind (F);
+
+    /* The input offset must be smaller than the size */
+    if (InputOffs >= 0) {
+        if (InputOffs >= Size) {
+            Error ("Input offset is greater than file size");
+        }
+    } else {
+        /* Use a zero offset */
+        InputOffs = 0;
+    }
+
+    /* Seek to the input offset and correct size to contain the remainder of
+     * the file.
+     */
+    if (fseek (F, InputOffs, SEEK_SET) != 0) {
+       Error ("Cannot seek on file `%s': %s", InFile, strerror (errno));
+    }
+    Size -= InputOffs;
+
+    /* Limit the size to the maximum input size if one is given */
+    if (InputSize >= 0) {
+        if (InputSize > Size) {
+            Error ("Input size is greater than what is available");
+        }
+        Size = InputSize;
+    }
 
     /* If the start address was not given, set it so that the code loads to
      * 0x10000 - Size. This is a reasonable default assuming that the file
      * is a ROM that contains the hardware vectors at $FFFA.
      */
     if (StartAddr < 0) {
-       if (Size > 0x10000) {
-           StartAddr = 0;
-       } else {
-           StartAddr = 0x10000 - Size;
-       }
+       if (Size > 0x10000) {
+           StartAddr = 0;
+       } else {
+           StartAddr = 0x10000 - Size;
+       }
     }
 
     /* Calculate the maximum code size */
@@ -105,7 +130,7 @@ void LoadCode (void)
 
     /* Check if the size is larger than what we can read */
     if (Size == 0) {
-               Error ("File `%s' contains no data", InFile);
+               Error ("Nothing to read from input file `%s'", InFile);
     }
     if (Size > MaxCount) {
                Warning ("File `%s' is too large, ignoring %ld bytes",
index 2742cb8dc708d416c492a616bd66f6559ef876dd..7051d68b8b3329909a60e2e5946ae78c8d5007a0 100644 (file)
@@ -53,15 +53,17 @@ const char CfgExt[]               = ".cfg"; /* Config file extension */
 
 /* Flags and other command line stuff */
 unsigned char DebugInfo       = 0;      /* Add debug info to the object file */
-unsigned char FormFeeds              = 0;      /* Add form feeds to the output? */
-unsigned char PassCount              = 2;      /* How many passed do we do? */
-long         StartAddr       = -1;     /* Start/load address of the program */
+unsigned char FormFeeds              = 0;      /* Add form feeds to the output? */
+unsigned char PassCount              = 2;      /* How many passed do we do? */
+long         StartAddr       = -1L;    /* Start/load address of the program */
+long          InputOffs       = -1L;    /* Offset into input file */
+long          InputSize       = -1L;    /* Number of bytes to read from input */
 
 /* Stuff needed by many routines */
-unsigned char Pass           = 0;      /* Disassembler pass */
+unsigned      Pass           = 0;      /* Disassembler pass */
 
 /* Comments */
-unsigned char Comments        = 0;      /* Add which comments to the output? */
+unsigned      Comments        = 0;      /* Add which comments to the output? */
 
 /* Page formatting */
 unsigned PageLength                  = 0;      /* Length of a listing page */
index 96f11c912d47bb0eece4493eb02d57f847f91bcc..9d46feae4a91d6e7ec19188a970c341758d1d52d 100644 (file)
@@ -44,7 +44,7 @@
 
 
 
-/* File names */
+/* File stuff */
 extern const char*     InFile;         /* Name of input file */
 extern const char*     OutFile;        /* Name of output file */
 
@@ -57,15 +57,16 @@ extern unsigned char    DebugInfo;      /* Add debug info to the object file */
 extern unsigned char   FormFeeds;      /* Add form feeds to the output? */
 extern unsigned char   PassCount;      /* How many passed do we do? */
 extern long                    StartAddr;      /* Start/load address of the program */
-
+extern long             InputOffs;      /* Offset into input file */
+extern long             InputSize;      /* Number of bytes to read from input */
 
 /* Stuff needed by many routines */
-extern unsigned char   Pass;           /* Disassembler pass */
+extern unsigned         Pass;          /* Disassembler pass */
 
 /* Comments */
 #define MIN_COMMENTS    0
 #define MAX_COMMENTS    4
-extern unsigned char    Comments;       /* Add which comments to the output? */
+extern unsigned         Comments;       /* Add which comments to the output? */
 
 /* Page formatting */
 #define MIN_PAGE_LEN   32
index 4f32661ba4d92966eef5b55771b2f10be8ddb383..bf756ac0f5b63e4daa6deccab2b47de2f54b7b34 100644 (file)
@@ -70,6 +70,8 @@ static void GlobalSection (void)
         {   "COMMENTS",         INFOTOK_COMMENTS        },
                {   "CPU",              INFOTOK_CPU             },
                {   "INPUTNAME",        INFOTOK_INPUTNAME       },
+        {   "INPUTOFFS",        INFOTOK_INPUTOFFS       },
+        {   "INPUTSIZE",        INFOTOK_INPUTSIZE       },
        {   "OUTPUTNAME",       INFOTOK_OUTPUTNAME      },
        {   "PAGELENGTH",       INFOTOK_PAGELENGTH      },
        {   "STARTADDR",        INFOTOK_STARTADDR       },
@@ -119,6 +121,21 @@ static void GlobalSection (void)
                InfoNextTok ();
                break;
 
+            case INFOTOK_INPUTOFFS:
+               InfoNextTok ();
+               InfoAssureInt ();
+               InputOffs = InfoIVal;
+               InfoNextTok ();
+               break;
+
+            case INFOTOK_INPUTSIZE:
+               InfoNextTok ();
+               InfoAssureInt ();
+                InfoRangeCheck (1, 0x10000);
+               InputSize = InfoIVal;
+               InfoNextTok ();
+               break;
+
            case INFOTOK_OUTPUTNAME:
                InfoNextTok ();
                InfoAssureStr ();
@@ -174,7 +191,7 @@ static void RangeSection (void)
        {   "CODE",             INFOTOK_CODE     },
        {   "BYTETABLE",        INFOTOK_BYTETAB  },
         {   "DBYTETABLE",       INFOTOK_DBYTETAB },
-       {   "WORDTABLE",        INFOTOK_WORDTAB  },       
+       {   "WORDTABLE",        INFOTOK_WORDTAB  },
        {   "DWORDTABLE",       INFOTOK_DWORDTAB },
        {   "ADDRTABLE",        INFOTOK_ADDRTAB  },
        {   "RTSTABLE",         INFOTOK_RTSTAB   },
index 3d3d96d9aca391c9064022d76c5c70d8a431fb35..6fcd5821845e9f8a8da39bff10e37c51f61de6d7 100644 (file)
@@ -247,7 +247,7 @@ static void OneOpcode (unsigned RemainingBytes)
      *   - ...if we have enough bytes remaining for the code at this address.
      *   - ...if the current instruction is valid for the given CPU.
      *   - ...if there is no label somewhere between the instruction bytes.
-     * If any of these conditions is true, switch to data mode.
+     * If any of these conditions is false, switch to data mode.
      */
     if (GetStyleAttr (PC) == atDefault) {
        if (D->Size > RemainingBytes) {
index a8af803b9e439e5e858990de8976f66c51e0300e..28e24784b97edfc939f42a3a07719af8c205b669 100644 (file)
@@ -68,6 +68,8 @@ typedef enum token_t {
     INFOTOK_COMMENTS,
     INFOTOK_CPU,
     INFOTOK_INPUTNAME,
+    INFOTOK_INPUTOFFS,
+    INFOTOK_INPUTSIZE,
     INFOTOK_OUTPUTNAME,
     INFOTOK_PAGELENGTH,
     INFOTOK_STARTADDR,
@@ -78,7 +80,7 @@ typedef enum token_t {
     INFOTOK_TYPE,
 
     INFOTOK_CODE,
-    INFOTOK_BYTETAB, 
+    INFOTOK_BYTETAB,
     INFOTOK_DBYTETAB,
     INFOTOK_WORDTAB,
     INFOTOK_DWORDTAB,