/* */
/* */
/* */
-/* (C) 1999-2009, Ullrich von Bassewitz */
+/* (C) 1999-2010, Ullrich von Bassewitz */
/* Roemerstrasse 52 */
/* D-70794 Filderstadt */
/* EMail: uz@cc65.org */
#include "fileio.h"
#include "global.h"
#include "lineinfo.h"
+#include "memarea.h"
#include "o65.h"
#include "spool.h"
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 */
*/
{
/* 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;
}
}
}
-
- /* Next segment */
- N = N->Next;
}
/* If we found a segment, use it and adjust the offset */
/* Write this segment */
if (DoWrite) {
- SegWrite (D->F, S->Seg, O65WriteExpr, D);
+ SegWrite (D->Filename, D->F, S->Seg, O65WriteExpr, D);
}
/* Mark the segment as dumped */
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 */
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)) {
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 */
/* 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)) {
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;
}
}