X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=src%2Fld65%2Fconfig.h;h=6dc4a7b6b9f1d2533f3221a9c8373063adda4283;hb=35e1184901ca38bdb2e56d154ed3b71f6096eacc;hp=f815fc398c1d8341ba584e70e28ffb8fb444b05b;hpb=edde7a3f453ae863d958d6b8db0a95e1062bfe77;p=cc65 diff --git a/src/ld65/config.h b/src/ld65/config.h index f815fc398..6dc4a7b6b 100644 --- a/src/ld65/config.h +++ b/src/ld65/config.h @@ -6,10 +6,10 @@ /* */ /* */ /* */ -/* (C) 1998-2003 Ullrich von Bassewitz */ -/* Römerstrasse 52 */ -/* D-70794 Filderstadt */ -/* EMail: uz@cc65.org */ +/* (C) 1998-2011, Ullrich von Bassewitz */ +/* Roemerstrasse 52 */ +/* D-70794 Filderstadt */ +/* EMail: uz@cc65.org */ /* */ /* */ /* This software is provided 'as-is', without any expressed or implied */ @@ -38,6 +38,12 @@ +/* common */ +#include "coll.h" +#include "filepos.h" + +/* ld65 */ +#include "lineinfo.h" #include "segments.h" @@ -48,77 +54,46 @@ +/* Forward for struct MemoryArea */ +struct MemoryArea; + /* File list entry */ typedef struct File File; struct File { unsigned Name; /* Name index of the file */ - File* Next; /* Pointer to next entry in list */ - unsigned Flags; - unsigned Format; /* Output format */ - struct Memory* MemList; /* List of memory areas in this file */ - struct Memory* MemLast; /* Last memory area in this file */ -}; - -/* Segment list node. Needed because there are two lists (RUN & LOAD) */ -typedef struct MemListNode MemListNode; -struct MemListNode { - MemListNode* Next; /* Next entry */ - struct SegDesc* Seg; /* Segment */ -}; - -/* Memory list entry */ -typedef struct Memory Memory; -struct Memory { - unsigned Name; /* Name index of the memory section */ - Memory* Next; /* Pointer to next entry in list */ - Memory* FNext; /* Next in file list */ - unsigned Attr; /* Which values are valid? */ - unsigned Flags; /* Set of bitmapped flags */ - unsigned long Start; /* Start address */ - unsigned long Size; /* Length of memory section */ - unsigned long FillLevel; /* Actual fill level of segment */ - unsigned char FillVal; /* Value used to fill rest of seg */ - MemListNode* SegList; /* List of segments for this section */ - MemListNode* SegLast; /* Last segment in this section */ - File* F; /* File that contains the entry */ + unsigned Flags; + unsigned Format; /* Output format */ + unsigned long Size; /* Size of the generated file */ + Collection MemoryAreas; /* List of memory areas in this file */ }; /* Segment descriptor entry */ typedef struct SegDesc SegDesc; struct SegDesc { unsigned Name; /* Index of the name */ - SegDesc* Next; /* Pointer to next entry in list */ + LineInfo* LI; /* Position of definition */ Segment* Seg; /* Pointer to segment structure */ unsigned Attr; /* Attributes for segment */ unsigned Flags; /* Set of bitmapped flags */ - Memory* Load; /* Load memory section */ - Memory* Run; /* Run memory section */ + struct MemoryArea* Load; /* Load memory section */ + struct MemoryArea* Run; /* Run memory section */ unsigned long Addr; /* Start address or offset into segment */ - unsigned char Align; /* Alignment if given */ + unsigned long RunAlignment; /* Run area alignment if given */ + unsigned long LoadAlignment; /* Load area alignment if given */ }; -/* Segment list */ -extern SegDesc* SegDescList; /* Single linked list */ -extern unsigned SegDescCount; /* Number of entries in list */ - -/* Memory flags */ -#define MF_DEFINE 0x0001 /* Define start and size */ -#define MF_FILL 0x0002 /* Fill segment */ -#define MF_RO 0x0004 /* Read only memory area */ - /* Segment flags */ #define SF_RO 0x0001 /* Read only segment */ #define SF_BSS 0x0002 /* Segment is BSS style segment */ #define SF_ZP 0x0004 /* Zeropage segment (o65 only) */ -#define SF_WPROT 0x0008 /* Write protected segment */ -#define SF_DEFINE 0x0010 /* Define start and size */ -#define SF_ALIGN 0x0020 /* Align the segment */ -#define SF_OFFSET 0x0040 /* Segment has offset in memory */ +#define SF_DEFINE 0x0008 /* Define start and size */ +#define SF_ALIGN 0x0010 /* Align segment in run area */ +#define SF_ALIGN_LOAD 0x0020 /* Align segment in load area */ +#define SF_OFFSET 0x0040 /* Segment has offset in memory */ #define SF_START 0x0080 /* Segment has fixed start address */ #define SF_OPTIONAL 0x0100 /* Segment is optional (must not exist) */ -#define SF_LOAD_AND_RUN 0x1000 /* LOAD and RUN given */ -#define SF_RUN_DEF 0x2000 /* RUN symbols already defined */ -#define SF_LOAD_DEF 0x4000 /* LOAD symbols already defined */ +#define SF_RUN_DEF 0x0200 /* RUN symbols already defined */ +#define SF_LOAD_DEF 0x0400 /* LOAD symbols already defined */ @@ -131,8 +106,14 @@ extern unsigned SegDescCount; /* Number of entries in list */ void CfgRead (void); /* Read the configuration */ -void CfgAssignSegments (void); -/* Assign segments, define linker symbols where requested */ +unsigned CfgProcess (void); +/* Process the config file after reading in object files and libraries. This + * includes postprocessing of the config file data but also assigning segments + * and defining segment/memory area related symbols. The function will return + * the number of memory area overflows (so zero means anything went ok). + * In case of overflows, a short mapfile can be generated later, to ease the + * task of rearranging segments for the user. + */ void CfgWriteTarget (void); /* Write the target file(s) */