]> git.sur5r.net Git - cc65/blobdiff - src/ld65/o65.c
For modules, the ZP memory area must be written to the output file. This is
[cc65] / src / ld65 / o65.c
index 6f31909e4ef0bc2db5e2fc6f51c095f3c0e5d98b..6845efed112d8acad023b1d3efaa7f289eb284fa 100644 (file)
@@ -6,7 +6,7 @@
 /*                                                                           */
 /*                                                                           */
 /*                                                                           */
-/* (C) 1999-2009, Ullrich von Bassewitz                                      */
+/* (C) 1999-2010, Ullrich von Bassewitz                                      */
 /*                Roemerstrasse 52                                           */
 /*                D-70794 Filderstadt                                        */
 /* EMail:         uz@cc65.org                                                */
@@ -53,6 +53,7 @@
 #include "fileio.h"
 #include "global.h"
 #include "lineinfo.h"
+#include "memarea.h"
 #include "o65.h"
 #include "spool.h"
 
@@ -175,7 +176,7 @@ struct ExprDesc {
     O65Desc*               D;                  /* File format descriptor */
     long                   Val;                /* The offset value */
     int                    TooComplex;         /* Expression too complex */
-    Memory*         MemRef;             /* Memory reference if any */
+    MemoryArea*     MemRef;             /* Memory reference if any */
     Segment*        SegRef;             /* Segment reference if any */
     Section*               SecRef;             /* Section reference if any */
     ExtSym*                ExtRef;             /* External reference if any */
@@ -244,20 +245,18 @@ static void CvtMemoryToSegment (ExprDesc* ED)
  */
 {
     /* Get the memory area from the expression */
-    Memory* M = ED->MemRef;
-
-    /* Get the list of segments in this memory area */
-    MemListNode* N = M->SegList;
+    MemoryArea* M = ED->MemRef;
 
     /* Remember the "nearest" segment and its offset */
     Segment* Nearest   = 0;
     unsigned long Offs = ULONG_MAX;
 
     /* Walk over all segments */
-    while (N != 0) {
+    unsigned I;
+    for (I = 0; I < CollCount (&M->SegList); ++I) {
 
-        /* Get the segment from this node and check if it's a run segment */
-        SegDesc* S = N->Seg;
+        /* Get the segment and check if it's a run segment */
+       SegDesc* S = CollAtUnchecked (&M->SegList, I);
         if (S->Run == M) {
 
             unsigned long O;
@@ -277,9 +276,6 @@ static void CvtMemoryToSegment (ExprDesc* ED)
                 }
             }
         }
-
-        /* Next segment */
-        N = N->Next;
     }
 
     /* If we found a segment, use it and adjust the offset */
@@ -783,13 +779,15 @@ static void O65WriteSeg (O65Desc* D, SegDesc** Seg, unsigned Count, int DoWrite)
        /* Get the segment from the list node */
                S = Seg [I];
 
+        /* Relocate line info for this segment */
+        RelocLineInfo (S->Seg);
+
        /* Keep the user happy */
        Print (stdout, 1, "    Writing `%s'\n", GetString (S->Name));
 
        /* Write this segment */
                if (DoWrite) {
-                   RelocLineInfo (S->Seg);
-                   SegWrite (D->F, S->Seg, O65WriteExpr, D);
+                   SegWrite (D->Filename, D->F, S->Seg, O65WriteExpr, D);
                }
 
                /* Mark the segment as dumped */
@@ -1220,9 +1218,7 @@ void O65SetExport (O65Desc* D, unsigned Ident)
 static void O65SetupSegments (O65Desc* D, File* F)
 /* Setup segment assignments */
 {
-    Memory* M;
-    MemListNode* N;
-    SegDesc* S;
+    unsigned I;
     unsigned TextIdx, DataIdx, BssIdx, ZPIdx;
 
     /* Initialize the counters */
@@ -1232,14 +1228,16 @@ static void O65SetupSegments (O65Desc* D, File* F)
     D->ZPCount   = 0;
 
     /* Walk over the memory list */
-    M = F->MemList;
-    while (M) {
+    for (I = 0; I < CollCount (&F->MemoryAreas); ++I) {
+        /* Get this entry */
+        MemoryArea* M = CollAtUnchecked (&F->MemoryAreas, I);
+
         /* Walk through the segment list and count the segment types */
-        N = M->SegList;
-        while (N) {
+        unsigned J;
+        for (J = 0; J < CollCount (&M->SegList); ++J) {
 
-            /* Get the segment from the list node */
-            S = N->Seg;
+            /* Get the segment */
+            SegDesc* S = CollAtUnchecked (&M->SegList, J);
 
             /* Check the segment type. */
             switch (O65SegType (S)) {
@@ -1247,14 +1245,9 @@ static void O65SetupSegments (O65Desc* D, File* F)
                 case O65SEG_DATA:   D->DataCount++; break;
                 case O65SEG_BSS:    D->BssCount++;  break;
                 case O65SEG_ZP:            D->ZPCount++;   break;
-                default:           Internal ("Invalid return from O65SegType");
+                default:                   Internal ("Invalid return from O65SegType");
             }
-
-            /* Next segment node */
-            N = N->Next;
         }
-        /* Next memory area */
-        M = M->FNext;
     }
 
     /* Allocate memory according to the numbers */
@@ -1265,14 +1258,16 @@ static void O65SetupSegments (O65Desc* D, File* F)
 
     /* Walk again through the list and setup the segment arrays */
     TextIdx = DataIdx = BssIdx = ZPIdx = 0;
-    M = F->MemList;
-    while (M) {
+    for (I = 0; I < CollCount (&F->MemoryAreas); ++I) {
+        /* Get this entry */
+        MemoryArea* M = CollAtUnchecked (&F->MemoryAreas, I);
 
-        N = M->SegList;
-        while (N) {
+        /* Walk over the segment list and check the segment types */
+        unsigned J;
+        for (J = 0; J < CollCount (&M->SegList); ++J) {
 
-            /* Get the segment from the list node */
-            S = N->Seg;
+            /* Get the segment */
+            SegDesc* S = CollAtUnchecked (&M->SegList, J);
 
             /* Check the segment type. */
             switch (O65SegType (S)) {
@@ -1282,12 +1277,7 @@ static void O65SetupSegments (O65Desc* D, File* F)
                 case O65SEG_ZP:            D->ZPSeg [ZPIdx++]     = S; break;
                 default:           Internal ("Invalid return from O65SegType");
             }
-
-            /* Next segment node */
-            N = N->Next;
         }
-        /* Next memory area */
-        M = M->FNext;
     }
 }