]> git.sur5r.net Git - cc65/commitdiff
Set the "simple" bit in the .o65 mode word only if text, data, and bss 117/head
authorChristian Groessler <chris@groessler.org>
Wed, 21 May 2014 21:43:56 +0000 (23:43 +0200)
committerChristian Groessler <chris@groessler.org>
Wed, 21 May 2014 21:49:56 +0000 (23:49 +0200)
are adjacent.

src/ld65/o65.c

index ad793b48b23e3caa1951b40c5f2c311b9ae17d31..8274d6b06105a991cd918ce8e79ea97e5e375903 100644 (file)
@@ -1320,18 +1320,26 @@ static void O65SetupHeader (O65Desc* D)
         SegDesc* FirstSeg = D->ZPSeg [0];
         D->Header.ZPBase  = FirstSeg->Seg->PC;
     }
+}
+
+
 
-    /* If we have byte wise relocation and an alignment of 1, we can set
-     * the "simple addressing" bit in the header.
+static void O65UpdateHeader  (O65Desc* D)
+/* Update mode word, currently only the "simple" bit */
+{
+    /* If we have byte wise relocation and an alignment of 1, and text
+     * and data are adjacent, we can set the "simple addressing" bit
+     * in the header.
      */
     if ((D->Header.Mode & MF_RELOC_MASK) == MF_RELOC_BYTE &&
-        (D->Header.Mode & MF_ALIGN_MASK) == MF_ALIGN_1) {
+        (D->Header.Mode & MF_ALIGN_MASK) == MF_ALIGN_1 &&
+        D->Header.TextBase + D->Header.TextSize == D->Header.DataBase &&
+        D->Header.DataBase + D->Header.DataSize == D->Header.BssBase) {
         D->Header.Mode = (D->Header.Mode & ~MF_ADDR_MASK) | MF_ADDR_SIMPLE;
     }
 }
 
 
-
 void O65WriteTarget (O65Desc* D, File* F)
 /* Write an o65 output file */
 {
@@ -1411,6 +1419,9 @@ void O65WriteTarget (O65Desc* D, File* F)
     /* Write the list of exports */
     O65WriteExports (D);
 
+    /* Update header flags */
+    O65UpdateHeader (D);
+
     /* Seek back to the start and write the updated header */
     fseek (D->F, 0, SEEK_SET);
     O65WriteHeader (D);