/* */
/* */
/* (C) 1998-2003 Ullrich von Bassewitz */
-/* Römerstrasse 52 */
+/* Römerstraße 52 */
/* D-70794 Filderstadt */
/* EMail: uz@cc65.org */
/* */
static Segment* HashTab [HASHTAB_SIZE];
static unsigned SegCount = 0; /* Segment count */
-static Segment* SegRoot = 0; /* List of all segments */
+static Segment* SegRoot = 0; /* List of all segments */
-static Segment* NewSegment (unsigned Name, unsigned char Type)
+static Segment* NewSegment (unsigned Name, unsigned char AddrSize)
/* Create a new segment and initialize it */
{
unsigned Hash;
S->AlignObj = 0;
S->Align = 0;
S->FillVal = 0;
- S->Type = Type;
+ S->AddrSize = AddrSize;
S->ReadOnly = 0;
S->Relocatable = 0;
S->Dumped = 0;
-Segment* GetSegment (unsigned Name, unsigned char Type, const char* ObjName)
+Segment* GetSegment (unsigned Name, unsigned char AddrSize, const char* ObjName)
/* Search for a segment and return an existing one. If the segment does not
* exist, create a new one and return that. ObjName is only used for the error
* message and may be NULL if the segment is linker generated.
*/
if (S == 0) {
/* Create a new segment */
- S = NewSegment (Name, Type);
+ S = NewSegment (Name, AddrSize);
} else {
- /* Check if the existing segment has the requested type */
- if (S->Type != Type) {
+ /* Check if the existing segment has the requested address size */
+ if (S->AddrSize != AddrSize) {
/* Allow an empty object name */
if (ObjName == 0) {
ObjName = "[linker generated]";
-Section* NewSection (Segment* Seg, unsigned char Align, unsigned char Type)
+Section* NewSection (Segment* Seg, unsigned char Align, unsigned char AddrSize)
/* Create a new section for the given segment */
{
unsigned long V;
S->FragLast = 0;
S->Size = 0;
S->Align = Align;
- S->Type = Type;
+ S->AddrSize = AddrSize;
/* Calculate the alignment bytes needed for the section */
V = (0x01UL << S->Align) - 1;
case FRAG_EXPR:
printf (" Expression (%u bytes):\n", F->Size);
printf (" ");
- DumpExpr (F->Expr);
+ DumpExpr (F->Expr, 0);
break;
case FRAG_SEXPR:
printf (" Signed expression (%u bytes):\n", F->Size);
printf (" ");
- DumpExpr (F->Expr);
+ DumpExpr (F->Expr, 0);
break;
case FRAG_FILL:
/* Call the users function and evaluate the result */
switch (F (Frag->Expr, Sign, Frag->Size, Offs, Data)) {
- case SEG_EXPR_OK:
- break;
+ case SEG_EXPR_OK:
+ break;
- case SEG_EXPR_RANGE_ERROR:
- Error ("Range error in module `%s', line %lu",
- GetSourceFileName (Frag->Obj, Frag->Pos.Name),
- Frag->Pos.Line);
- break;
+ case SEG_EXPR_RANGE_ERROR:
+ Error ("Range error in module `%s', line %lu",
+ GetSourceFileName (Frag->Obj, Frag->Pos.Name),
+ Frag->Pos.Line);
+ break;
- case SEG_EXPR_TOO_COMPLEX:
- Error ("Expression too complex in module `%s', line %lu",
- GetSourceFileName (Frag->Obj, Frag->Pos.Name),
+ case SEG_EXPR_TOO_COMPLEX:
+ Error ("Expression too complex in module `%s', line %lu",
+ GetSourceFileName (Frag->Obj, Frag->Pos.Name),
Frag->Pos.Line);
break;
if (S->Size > 0) {
/* Print the segment data */
- fprintf (F, "segment\t\"%s\", 0x%06lX, 0x%04lX, %s, %s\n",
+ fprintf (F, "segment\t\"%s\",start=0x%06lX,size=0x%04lX,addrsize=%s,type=%s\n",
GetString (S->Name), S->PC, S->Size,
- SegTypeToStr (S->Type),
+ AddrSizeToStr (S->AddrSize),
S->ReadOnly? "ro" : "rw");
}