X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=src%2Fcc65%2Fsegments.c;h=dd7817b8887149d68ead2401edad3c0b0c411653;hb=73dfa23c987d8a7f1154801b85c171f9e01dcd58;hp=654927908c329124f0b0b3e0dcce2e7bfe1da29b;hpb=e6484f85c7f440aa8b12bbf956bed0b87e4ddeed;p=cc65 diff --git a/src/cc65/segments.c b/src/cc65/segments.c index 654927908..dd7817b88 100644 --- a/src/cc65/segments.c +++ b/src/cc65/segments.c @@ -40,11 +40,15 @@ #include "chartype.h" #include "check.h" #include "coll.h" +#include "scanner.h" +#include "segnames.h" #include "xmalloc.h" /* cc65 */ +#include "codeent.h" #include "codeseg.h" #include "dataseg.h" +#include "textseg.h" #include "segments.h" @@ -58,6 +62,9 @@ /* Pointer to the current segment list. Output goes here. */ Segments* CS = 0; +/* Pointer to the global segment list */ +Segments* GS = 0; + /* Actual names for the segments */ static char* SegmentNames[SEG_COUNT]; @@ -79,10 +86,10 @@ static Collection SegmentStack = STATIC_COLLECTION_INITIALIZER; void InitSegNames (void) /* Initialize the segment names */ { - SegmentNames [SEG_BSS] = xstrdup ("BSS"); - SegmentNames [SEG_CODE] = xstrdup ("CODE"); - SegmentNames [SEG_DATA] = xstrdup ("DATA"); - SegmentNames [SEG_RODATA] = xstrdup ("RODATA"); + SegmentNames [SEG_BSS] = xstrdup (SEGNAME_BSS); + SegmentNames [SEG_CODE] = xstrdup (SEGNAME_CODE); + SegmentNames [SEG_DATA] = xstrdup (SEGNAME_DATA); + SegmentNames [SEG_RODATA] = xstrdup (SEGNAME_RODATA); } @@ -97,27 +104,6 @@ void NewSegName (segment_t Seg, const char* Name) -int ValidSegName (const char* Name) -/* Return true if the given segment name is valid, return false otherwise */ -{ - /* Must start with '_' or a letter */ - if ((*Name != '_' && !IsAlpha(*Name)) || strlen(Name) > 80) { - return 0; - } - - /* Can have letters, digits or the underline */ - while (*++Name) { - if (*Name != '_' && !IsAlNum(*Name)) { - return 0; - } - } - - /* Name is ok */ - return 1; -} - - - static Segments* NewSegments (SymEntry* Func) /* Initialize a Segments structure (set all fields to NULL) */ { @@ -125,6 +111,7 @@ static Segments* NewSegments (SymEntry* Func) Segments* S = xmalloc (sizeof (Segments)); /* Initialize the fields */ + S->Text = NewTextSeg (Func); S->Code = NewCodeSeg (SegmentNames[SEG_CODE], Func); S->Data = NewDataSeg (SegmentNames[SEG_DATA], Func); S->ROData = NewDataSeg (SegmentNames[SEG_RODATA], Func); @@ -184,47 +171,55 @@ struct DataSeg* GetDataSeg (void) case SEG_BSS: return CS->BSS; case SEG_DATA: return CS->Data; case SEG_RODATA: return CS->ROData; - default: FAIL ("Invalid data segment"); + default: + FAIL ("Invalid data segment"); + return 0; } } -void AddCodeLine (const char* Format, ...) -/* Add a line of code to the current code segment */ +void AddTextLine (const char* Format, ...) +/* Add a line of code to the current text segment */ { va_list ap; va_start (ap, Format); CHECK (CS != 0); - AddCodeEntry (CS->Code, Format, ap); + TS_AddVLine (CS->Text, Format, ap); va_end (ap); } -void AddDataLine (const char* Format, ...) -/* Add a line of data to the current data segment */ +void AddCodeLine (const char* Format, ...) +/* Add a line of code to the current code segment */ { va_list ap; va_start (ap, Format); CHECK (CS != 0); - AddDataEntry (GetDataSeg(), Format, ap); + CS_AddVLine (CS->Code, CurTok.LI, Format, ap); va_end (ap); } -static void PrintFunctionHeader (const SymEntry* Entry, FILE* F) +void AddCode (opc_t OPC, am_t AM, const char* Arg, struct CodeLabel* JumpTo) +/* Add a code entry to the current code segment */ { - /* Print a comment with the function signature */ - fprintf (F, - "; ---------------------------------------------------------------\n" - "; "); - PrintFuncSig (F, Entry->Name, Entry->Type); - fprintf (F, - "\n" - "; ---------------------------------------------------------------\n" - "\n"); + CHECK (CS != 0); + CS_AddEntry (CS->Code, NewCodeEntry (OPC, AM, Arg, JumpTo, CurTok.LI)); +} + + + +void AddDataLine (const char* Format, ...) +/* Add a line of data to the current data segment */ +{ + va_list ap; + va_start (ap, Format); + CHECK (CS != 0); + DS_AddVLine (GetDataSeg(), Format, ap); + va_end (ap); } @@ -232,18 +227,22 @@ static void PrintFunctionHeader (const SymEntry* Entry, FILE* F) void OutputSegments (const Segments* S, FILE* F) /* Output the given segments to the file */ { - /* If the code segment is associated with a function, print a function header */ - if (S->Code->Func) { - PrintFunctionHeader (S->Code->Func, F); - } + /* Output the function prologue if the segments came from a function */ + CS_OutputPrologue (S->Code, F); + + /* Output the text segment */ + TS_Output (S->Text, F); /* Output the three data segments */ - OutputDataSeg (S->Data, F); - OutputDataSeg (S->ROData, F); - OutputDataSeg (S->BSS, F); + DS_Output (S->Data, F); + DS_Output (S->ROData, F); + DS_Output (S->BSS, F); /* Output the code segment */ - OutputCodeSeg (S->Code, F); + CS_Output (S->Code, F); + + /* Output the code segment epiloque */ + CS_OutputEpilogue (S->Code, F); }