X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=src%2Fld65%2Fo65.c;h=6845efed112d8acad023b1d3efaa7f289eb284fa;hb=4786caf496bd8e6989abee74017aa098df860c41;hp=d2385be5a69ab0a22d04c9069b84ffe93a2db457;hpb=8cd583d591aff4af8a3d2623a52f605f6addd47a;p=cc65 diff --git a/src/ld65/o65.c b/src/ld65/o65.c index d2385be5a..6845efed1 100644 --- a/src/ld65/o65.c +++ b/src/ld65/o65.c @@ -6,10 +6,10 @@ /* */ /* */ /* */ -/* (C) 1999-2005 Ullrich von Bassewitz */ -/* Römerstraße 52 */ -/* D-70794 Filderstadt */ -/* EMail: uz@cc65.org */ +/* (C) 1999-2010, Ullrich von Bassewitz */ +/* Roemerstrasse 52 */ +/* D-70794 Filderstadt */ +/* EMail: uz@cc65.org */ /* */ /* */ /* This software is provided 'as-is', without any expressed or implied */ @@ -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 */ @@ -353,7 +349,7 @@ static void O65ParseExpr (ExprNode* Expr, ExprDesc* D, int Sign) switch (Expr->Op) { case EXPR_LITERAL: - D->Val += (Sign * Expr->V.Val); + D->Val += (Sign * Expr->V.IVal); break; case EXPR_SYMBOL: @@ -479,12 +475,12 @@ static void O65RelocPutByte (O65RelocTab* R, unsigned B) /* Do we have enough space in the buffer? */ if (R->Fill == R->Size) { /* We need to grow the buffer */ - unsigned NewSize = (R->Size == 0)? 1024 : R->Size * 2; - unsigned char* NewBuf = xmalloc (NewSize); - memcpy (NewBuf, R->Buf, R->Size); - xfree (R->Buf); - R->Size = NewSize; - R->Buf = NewBuf; + if (R->Size) { + R->Size *= 2; + } else { + R->Size = 1024; /* Initial size */ + } + R->Buf = xrealloc (R->Buf, R->Size); } /* Put the byte into the buffer */ @@ -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 */ @@ -1155,11 +1153,6 @@ void O65SetOS (O65Desc* D, unsigned OS, unsigned Version, unsigned Id) /* Write the correct option length */ switch (OS) { - case O65OS_OSA65: - case O65OS_LUNIX: - /* No id for these two */ - O65SetOption (D, O65OPT_OS, Opt, 2); - break; case O65OS_CC65: /* Set the 16 bit id */ @@ -1169,7 +1162,10 @@ void O65SetOS (O65Desc* D, unsigned OS, unsigned Version, unsigned Id) break; default: - Internal ("Trying to set invalid O65 operating system: %u", OS); + /* No id for OS/A65, Lunix, and unknown OSes */ + O65SetOption (D, O65OPT_OS, Opt, 2); + break; + } } @@ -1222,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 */ @@ -1234,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)) { @@ -1249,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 */ @@ -1267,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)) { @@ -1284,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; } } @@ -1387,7 +1375,7 @@ void O65WriteTarget (O65Desc* D, File* F) } OptBuf[OptLen] = '\0'; O65SetOption (D, O65OPT_TIMESTAMP, OptBuf, OptLen + 1); - sprintf (OptBuf, "ld65 V%u.%u.%u", VER_MAJOR, VER_MINOR, VER_PATCH); + sprintf (OptBuf, "ld65 V%s", GetVersionAsString ()); O65SetOption (D, O65OPT_ASM, OptBuf, strlen (OptBuf) + 1); /* Write the header */