]> git.sur5r.net Git - cc65/commitdiff
Working on the new backend
authorcuz <cuz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Sat, 5 May 2001 13:51:42 +0000 (13:51 +0000)
committercuz <cuz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Sat, 5 May 2001 13:51:42 +0000 (13:51 +0000)
git-svn-id: svn://svn.cc65.org/cc65/trunk@715 b7a2c559-68d2-44c3-8de9-860c34a00d81

21 files changed:
src/cc65/asmcode.c
src/cc65/codeent.c
src/cc65/codeent.h
src/cc65/codegen.c
src/cc65/codegen.h
src/cc65/codelab.c
src/cc65/codelab.h
src/cc65/codeopt.c
src/cc65/codeseg.c
src/cc65/codeseg.h
src/cc65/dataseg.c
src/cc65/dataseg.h
src/cc65/function.c
src/cc65/main.c
src/cc65/make/gcc.mak
src/cc65/pragma.c
src/cc65/pragma.h
src/cc65/segments.c [new file with mode: 0644]
src/cc65/segments.h [new file with mode: 0644]
src/cc65/symentry.h
src/cc65/symtab.c

index 3522ce1694424fa58bb9195bc744d1eee397e1f9..046043f2b43c6fa8cf9dbb3379e6bd1396d4b056 100644 (file)
@@ -40,6 +40,7 @@
 #include "codeopt.h"
 #include "codeseg.h"
 #include "dataseg.h"
+#include "segments.h"
 #include "symtab.h"
 #include "asmcode.h"
 
@@ -62,7 +63,7 @@ void AddCodeHint (const char* Hint)
 CodeMark GetCodePos (void)
 /* Get a marker pointing to the current output position */
 {
-    return GetCodeSegEntries (CS);
+    return GetCodeSegEntries (CS->Code);
 }
 
 
@@ -70,22 +71,7 @@ CodeMark GetCodePos (void)
 void RemoveCode (CodeMark M)
 /* Remove all code after the given code marker */
 {
-    DelCodeSegAfter (CS, M);
-}
-
-
-
-static void PrintFunctionHeader (FILE* F, SymEntry* Entry)
-{
-    /* Print a comment with the function signature */
-    fprintf (F,
-            "; ---------------------------------------------------------------\n"
-            "; ");
-    PrintFuncSig (F, Entry->Name, Entry->Type);
-    fprintf (F,
-                    "\n"
-            "; ---------------------------------------------------------------\n"
-            "\n");
+    DelCodeSegAfter (CS->Code, M);
 }
 
 
@@ -96,9 +82,9 @@ void WriteOutput (FILE* F)
     SymTable* SymTab;
     SymEntry* Entry;
 
-    /* Output the data segment (the global code segment should be empty) */
-    OutputDataSeg (F, DS);
-    CHECK (GetCodeSegEntries (CS) == 0);
+    /* Output the global data segment */
+    CHECK (GetCodeSegEntries (CS->Code) == 0);
+    OutputSegments (CS, F);
 
     /* Output all global or referenced functions */
     SymTab = GetGlobalSymTab ();
@@ -108,13 +94,9 @@ void WriteOutput (FILE* F)
            (Entry->Flags & SC_DEF) != 0        &&
            (Entry->Flags & (SC_REF | SC_EXTERN)) != 0) {
            /* Function which is defined and referenced or extern */
-           PrintFunctionHeader (F, Entry);
-           MergeCodeLabels (Entry->V.F.CS);
-           RunOpt (Entry->V.F.CS);
-           fprintf (F, "; Data segment for function %s:\n", Entry->Name);
-           OutputDataSeg (F, Entry->V.F.DS);
-           fprintf (F, "; Code segment for function %s:\n", Entry->Name);
-           OutputCodeSeg (F, Entry->V.F.CS);
+           MergeCodeLabels (Entry->V.F.Seg->Code);
+           RunOpt (Entry->V.F.Seg->Code);
+           OutputSegments (Entry->V.F.Seg, F);
        }
        Entry = Entry->NextSym;
     }
index 09e4b3ef87d77f07cc064d714f36ec9c2084cf9b..9ac25317ccd177b43e131ec0d8b5f0a6baa4e5e4 100644 (file)
@@ -119,7 +119,7 @@ int CodeEntryHasLabel (const CodeEntry* E)
 
 
 
-void OutputCodeEntry (FILE* F, const CodeEntry* E)
+void OutputCodeEntry (const CodeEntry* E, FILE* F)
 /* Output the code entry to a file */
 {
     const OPCDesc* D;
@@ -129,7 +129,7 @@ void OutputCodeEntry (FILE* F, const CodeEntry* E)
     unsigned LabelCount = CollCount (&E->Labels);
     unsigned I;
     for (I = 0; I < LabelCount; ++I) {
-       OutputCodeLabel (F, CollConstAt (&E->Labels, I));
+       OutputCodeLabel (CollConstAt (&E->Labels, I), F);
     }
 
     /* Get the opcode description */
index 61cd3b55f10e1374059bd3bf9b6cb79be82f0f27..785ed974e797433a48e5178a1ecd29a94b6f075c 100644 (file)
@@ -91,7 +91,7 @@ void FreeCodeEntry (CodeEntry* E);
 int CodeEntryHasLabel (const CodeEntry* E);
 /* Check if the given code entry has labels attached */
 
-void OutputCodeEntry (FILE* F, const CodeEntry* E);
+void OutputCodeEntry (const CodeEntry* E, FILE* F);
 /* Output the code entry to a file */
 
 
index ce7ef5d2c5dda83b18fca451ae313013b0c014fa..183a91ce9d3f47c886a6c47bb5e7b202c306b467 100644 (file)
 
 /* cc65 */
 #include "asmcode.h"
-#include "asmlabel.h"                        
+#include "asmlabel.h"
 #include "codeseg.h"
 #include "cpu.h"
 #include "dataseg.h"
 #include "error.h"
 #include "global.h"
-#include "segname.h"
+#include "segments.h"
 #include "util.h"
 #include "codegen.h"
 
 /* Compiler relative stack pointer */
 int oursp      = 0;
 
-/* Current segment */
-segment_t CurSeg = SEG_INV;
-
 
 
 /*****************************************************************************/
-/*                                 Helpers                                  */
+/*                                         Helpers                                  */
 /*****************************************************************************/
 
 
@@ -142,84 +139,50 @@ static char* GetLabelName (unsigned flags, unsigned long label, unsigned offs)
 void g_preamble (void)
 /* Generate the assembler code preamble */
 {
-    /* Generate the global segments and push them */
-    PushCodeSeg (NewCodeSeg (SegmentNames[SEG_CODE], ""));
-    PushDataSeg (NewDataSeg (""));
+    /* Create a new segment list */
+    PushSegments (0);
 
     /* Identify the compiler version */
-    AddDataSegLine (DS, "; File generated by cc65 v %u.%u.%u",
-                   VER_MAJOR, VER_MINOR, VER_PATCH);
+    AddDataLine ("; File generated by cc65 v %u.%u.%u",
+                VER_MAJOR, VER_MINOR, VER_PATCH);
 
     /* Insert some object file options */
-    AddDataSegLine (DS, ".fopt\t\tcompiler,\"cc65 v %u.%u.%u\"",
+    AddDataLine (".fopt\t\tcompiler,\"cc65 v %u.%u.%u\"",
                    VER_MAJOR, VER_MINOR, VER_PATCH);
 
     /* If we're producing code for some other CPU, switch the command set */
     if (CPU == CPU_65C02) {
-       AddDataSegLine (DS, ".pc02");
+       AddDataLine (".pc02");
     }
 
     /* Allow auto import for runtime library routines */
-    AddDataSegLine (DS, ".autoimport\ton");
+    AddDataLine (".autoimport\ton");
 
     /* Switch the assembler into case sensitive mode */
-    AddDataSegLine (DS, ".case\t\ton");
+    AddDataLine (".case\t\ton");
 
     /* Tell the assembler if we want to generate debug info */
-    AddDataSegLine (DS, ".debuginfo\t%s", (DebugInfo != 0)? "on" : "off");
+    AddDataLine (".debuginfo\t%s", (DebugInfo != 0)? "on" : "off");
 
     /* Import the stack pointer for direct auto variable access */
-    AddDataSegLine (DS, ".importzp\tsp, sreg, regsave, regbank, tmp1, ptr1");
+    AddDataLine (".importzp\tsp, sreg, regsave, regbank, tmp1, ptr1");
 
     /* Define long branch macros */
-    AddDataSegLine (DS, ".macpack\tlongbranch");
+    AddDataLine (".macpack\tlongbranch");
 }
 
 
 
 /*****************************************************************************/
-/*                             Segment support                              */
+/*                             Segment support                              */
 /*****************************************************************************/
 
 
 
-static void UseSeg (int NewSeg)
-/* Switch to a specific segment */
-{
-    if (CurSeg != NewSeg) {
-       CurSeg = (segment_t) NewSeg;
-       if (CurSeg != SEG_CODE) {
-           AddDataSegLine (DS, ".segment\t\"%s\"", SegmentNames [CurSeg]);
-       }
-    }
-}
-
-
-
-void g_pushseg (struct CodeSeg** FCS, struct DataSeg** FDS, const char* FuncName)
-/* Push the current segments and generate new ones for the given function */
-{
-    PushCodeSeg (NewCodeSeg (SegmentNames[SEG_CODE], FuncName));
-    *FCS = CS;
-    PushDataSeg (NewDataSeg (FuncName));
-    *FDS = DS;
-}
-
-
-
-void g_popseg (void)
-/* Restore the old segments */
-{
-    PopCodeSeg ();
-    PopDataSeg ();
-}
-
-
-
 void g_userodata (void)
 /* Switch to the read only data segment */
 {
-    UseSeg (SEG_RODATA);
+    UseDataSeg (SEG_RODATA);
 }
 
 
@@ -227,7 +190,7 @@ void g_userodata (void)
 void g_usedata (void)
 /* Switch to the data segment */
 {
-    UseSeg (SEG_DATA);
+    UseDataSeg (SEG_DATA);
 }
 
 
@@ -235,56 +198,7 @@ void g_usedata (void)
 void g_usebss (void)
 /* Switch to the bss segment */
 {
-    UseSeg (SEG_BSS);
-}
-
-
-
-static void SegName (segment_t Seg, const char* Name)
-/* Set the name of a segment */
-{
-    /* Free the old name and set a new one */
-    NewSegName (Seg, Name);
-
-    /* If the new segment is the current segment, emit a segment directive
-     * with the new name.
-     */
-    if (Seg == CurSeg) {
-               CurSeg = SEG_INV;       /* Invalidate */
-       UseSeg (Seg);
-    }
-}
-
-
-
-void g_codename (const char* Name)
-/* Set the name of the CODE segment */
-{
-    SegName (SEG_CODE, Name);
-}
-
-
-
-void g_rodataname (const char* Name)
-/* Set the name of the RODATA segment */
-{
-    SegName (SEG_RODATA, Name);
-}
-
-
-
-void g_dataname (const char* Name)
-/* Set the name of the DATA segment */
-{
-    SegName (SEG_DATA, Name);
-}
-
-
-
-void g_bssname (const char* Name)
-/* Set the name of the BSS segment */
-{
-    SegName (SEG_BSS, Name);
+    UseDataSeg (SEG_BSS);
 }
 
 
@@ -372,7 +286,7 @@ static unsigned MakeByteOffs (unsigned Flags, unsigned Offs)
 void g_defcodelabel (unsigned label)
 /* Define a local code label */
 {
-    AddCodeLabel (CS, LocalLabelName (label));
+    AddCodeLabel (CS->Code, LocalLabelName (label));
 }
 
 
@@ -380,7 +294,7 @@ void g_defcodelabel (unsigned label)
 void g_defdatalabel (unsigned label)
 /* Define a local data label */
 {
-    AddDataSegLine (DS, "%s:", LocalLabelName (label));
+    AddDataLine ("%s:", LocalLabelName (label));
 }
 
 
@@ -395,7 +309,7 @@ void g_defgloblabel (const char* Name)
 /* Define a global label with the given name */
 {
     /* Global labels are always data labels */
-    AddDataSegLine (DS, "_%s:", Name);
+    AddDataLine ("_%s:", Name);
 }
 
 
@@ -404,9 +318,9 @@ void g_defexport (const char* Name, int ZP)
 /* Export the given label */
 {
     if (ZP) {
-               AddDataSegLine (DS, "\t.exportzp\t_%s", Name);
+               AddDataLine ("\t.exportzp\t_%s", Name);
     } else {
-       AddDataSegLine (DS, "\t.export\t\t_%s", Name);
+       AddDataLine ("\t.export\t\t_%s", Name);
     }
 }
 
@@ -416,9 +330,9 @@ void g_defimport (const char* Name, int ZP)
 /* Import the given label */
 {
     if (ZP) {
-               AddDataSegLine (DS, "\t.importzp\t_%s", Name);
+               AddDataLine ("\t.importzp\t_%s", Name);
     } else {
-       AddDataSegLine (DS, "\t.import\t\t_%s", Name);
+       AddDataLine ("\t.import\t\t_%s", Name);
     }
 }
 
@@ -433,7 +347,7 @@ void g_defimport (const char* Name, int ZP)
 static void ldaconst (unsigned val)
 /* Load a with a constant */
 {
-    AddCodeSegLine (CS, "lda #$%02X", val & 0xFF);
+    AddCodeLine ("lda #$%02X", val & 0xFF);
 }
 
 
@@ -441,7 +355,7 @@ static void ldaconst (unsigned val)
 static void ldxconst (unsigned val)
 /* Load x with a constant */
 {
-    AddCodeSegLine (CS, "ldx #$%02X", val & 0xFF);
+    AddCodeLine ("ldx #$%02X", val & 0xFF);
 }
 
 
@@ -449,7 +363,7 @@ static void ldxconst (unsigned val)
 static void ldyconst (unsigned val)
 /* Load y with a constant */
 {
-    AddCodeSegLine (CS, "ldy #$%02X", val & 0xFF);
+    AddCodeLine ("ldy #$%02X", val & 0xFF);
 }
 
 
@@ -476,7 +390,7 @@ void g_enter (unsigned flags, unsigned argsize)
        funcargs = argsize;
     } else {
                funcargs = -1;
-               AddCodeSegLine (CS, "jsr enter");
+               AddCodeLine ("jsr enter");
     }
 }
 
@@ -509,14 +423,14 @@ void g_leave (int flags, int val)
        k += funcargs;
        if (k == 0) {
            AddCodeHint ("y:-");        /* Y register no longer used */
-           AddCodeSegLine (CS, "rts");
+           AddCodeLine ("rts");
        } else if (k <= 8) {
            AddCodeHint ("y:-");        /* Y register no longer used */
-           AddCodeSegLine (CS, "jmp incsp%d", k);
+           AddCodeLine ("jmp incsp%d", k);
        } else {
            CheckLocalOffs (k);
            ldyconst (k);
-           AddCodeSegLine (CS, "jmp addysp");
+           AddCodeLine ("jmp addysp");
        }
 
     } else {
@@ -551,7 +465,7 @@ void g_leave (int flags, int val)
        }
 
        /* Output the jump */
-       AddCodeSegLine (CS, buf);
+       AddCodeLine (buf);
     }
 }
 
@@ -569,14 +483,14 @@ void g_save_regvars (int RegOffs, unsigned Bytes)
     /* Don't loop for up to two bytes */
     if (Bytes == 1) {
 
-       AddCodeSegLine (CS, "lda regbank%+d", RegOffs);
-               AddCodeSegLine (CS, "jsr pusha");
+       AddCodeLine ("lda regbank%+d", RegOffs);
+               AddCodeLine ("jsr pusha");
 
     } else if (Bytes == 2) {
 
-               AddCodeSegLine (CS, "lda regbank%+d", RegOffs);
-       AddCodeSegLine (CS, "ldx regbank%+d", RegOffs+1);
-               AddCodeSegLine (CS, "jsr pushax");
+               AddCodeLine ("lda regbank%+d", RegOffs);
+       AddCodeLine ("ldx regbank%+d", RegOffs+1);
+               AddCodeLine ("jsr pushax");
 
     } else {
 
@@ -586,11 +500,11 @@ void g_save_regvars (int RegOffs, unsigned Bytes)
        ldyconst (Bytes - 1);
        ldxconst (Bytes);
        g_defcodelabel (Label);
-       AddCodeSegLine (CS, "lda regbank%+d,x", RegOffs-1);
-       AddCodeSegLine (CS, "sta (sp),y");
-       AddCodeSegLine (CS, "dey");
-       AddCodeSegLine (CS, "dex");
-       AddCodeSegLine (CS, "bne %s", LocalLabelName (Label));
+       AddCodeLine ("lda regbank%+d,x", RegOffs-1);
+       AddCodeLine ("sta (sp),y");
+       AddCodeLine ("dey");
+       AddCodeLine ("dex");
+       AddCodeLine ("bne %s", LocalLabelName (Label));
 
     }
 
@@ -611,17 +525,17 @@ void g_restore_regvars (int StackOffs, int RegOffs, unsigned Bytes)
     if (Bytes == 1) {
 
        ldyconst (StackOffs);
-       AddCodeSegLine (CS, "lda (sp),y");
-       AddCodeSegLine (CS, "sta regbank%+d", RegOffs);
+       AddCodeLine ("lda (sp),y");
+       AddCodeLine ("sta regbank%+d", RegOffs);
 
     } else if (Bytes == 2) {
 
        ldyconst (StackOffs);
-       AddCodeSegLine (CS, "lda (sp),y");
-       AddCodeSegLine (CS, "sta regbank%+d", RegOffs);
-       AddCodeSegLine (CS, "iny");
-       AddCodeSegLine (CS, "lda (sp),y");
-       AddCodeSegLine (CS, "sta regbank%+d", RegOffs+1);
+       AddCodeLine ("lda (sp),y");
+       AddCodeLine ("sta regbank%+d", RegOffs);
+       AddCodeLine ("iny");
+       AddCodeLine ("lda (sp),y");
+       AddCodeLine ("sta regbank%+d", RegOffs+1);
 
     } else {
 
@@ -630,11 +544,11 @@ void g_restore_regvars (int StackOffs, int RegOffs, unsigned Bytes)
        ldyconst (StackOffs+Bytes-1);
        ldxconst (Bytes);
        g_defcodelabel (Label);
-       AddCodeSegLine (CS, "lda (sp),y");
-       AddCodeSegLine (CS, "sta regbank%+d,x", RegOffs-1);
-       AddCodeSegLine (CS, "dey");
-       AddCodeSegLine (CS, "dex");
-       AddCodeSegLine (CS, "bne %s", LocalLabelName (Label));
+       AddCodeLine ("lda (sp),y");
+       AddCodeLine ("sta regbank%+d,x", RegOffs-1);
+       AddCodeLine ("dey");
+       AddCodeLine ("dex");
+       AddCodeLine ("bne %s", LocalLabelName (Label));
 
     }
 }
@@ -668,39 +582,39 @@ void g_getimmed (unsigned flags, unsigned long val, unsigned offs)
 
            case CF_LONG:
                if (val < 0x100) {
-                   AddCodeSegLine (CS, "ldx #$00");
-                   AddCodeSegLine (CS, "stx sreg+1");
-                   AddCodeSegLine (CS, "stx sreg");
-                   AddCodeSegLine (CS, "lda #$%02X", (unsigned char) val);
+                   AddCodeLine ("ldx #$00");
+                   AddCodeLine ("stx sreg+1");
+                   AddCodeLine ("stx sreg");
+                   AddCodeLine ("lda #$%02X", (unsigned char) val);
                } else if ((val & 0xFFFF00FF) == 0) {
-                   AddCodeSegLine (CS, "lda #$00");
-                   AddCodeSegLine (CS, "sta sreg+1");
-                   AddCodeSegLine (CS, "sta sreg");
-                   AddCodeSegLine (CS, "ldx #$%02X", (unsigned char) (val >> 8));
+                   AddCodeLine ("lda #$00");
+                   AddCodeLine ("sta sreg+1");
+                   AddCodeLine ("sta sreg");
+                   AddCodeLine ("ldx #$%02X", (unsigned char) (val >> 8));
                } else if ((val & 0xFFFF0000) == 0 && CodeSizeFactor > 140) {
-                   AddCodeSegLine (CS, "lda #$00");
-                   AddCodeSegLine (CS, "sta sreg+1");
-                   AddCodeSegLine (CS, "sta sreg");
-                   AddCodeSegLine (CS, "lda #$%02X", (unsigned char) val);
-                   AddCodeSegLine (CS, "ldx #$%02X", (unsigned char) (val >> 8));
+                   AddCodeLine ("lda #$00");
+                   AddCodeLine ("sta sreg+1");
+                   AddCodeLine ("sta sreg");
+                   AddCodeLine ("lda #$%02X", (unsigned char) val);
+                   AddCodeLine ("ldx #$%02X", (unsigned char) (val >> 8));
                } else if ((val & 0xFFFFFF00) == 0xFFFFFF00) {
-                   AddCodeSegLine (CS, "ldx #$FF");
-                   AddCodeSegLine (CS, "stx sreg+1");
-                   AddCodeSegLine (CS, "stx sreg");
+                   AddCodeLine ("ldx #$FF");
+                   AddCodeLine ("stx sreg+1");
+                   AddCodeLine ("stx sreg");
                    if ((val & 0xFF) == 0xFF) {
-                       AddCodeSegLine (CS, "txa");
+                       AddCodeLine ("txa");
                    } else {
-                       AddCodeSegLine (CS, "lda #$%02X", (unsigned char) val);
+                       AddCodeLine ("lda #$%02X", (unsigned char) val);
                    }
                } else if ((val & 0xFFFF00FF) == 0xFFFF00FF) {
-                   AddCodeSegLine (CS, "lda #$FF");
-                   AddCodeSegLine (CS, "sta sreg+1");
-                   AddCodeSegLine (CS, "sta sreg");
-                   AddCodeSegLine (CS, "ldx #$%02X", (unsigned char) (val >> 8));
+                   AddCodeLine ("lda #$FF");
+                   AddCodeLine ("sta sreg+1");
+                   AddCodeLine ("sta sreg");
+                   AddCodeLine ("ldx #$%02X", (unsigned char) (val >> 8));
                } else {
                    /* Call a subroutine that will load following value */
-                   AddCodeSegLine (CS, "jsr ldeax");
-                   AddCodeSegLine (CS, ".dword $%08lX", val & 0xFFFFFFFF);
+                   AddCodeLine ("jsr ldeax");
+                   AddCodeLine (".dword $%08lX", val & 0xFFFFFFFF);
                }
                break;
 
@@ -716,8 +630,8 @@ void g_getimmed (unsigned flags, unsigned long val, unsigned offs)
        const char* Label = GetLabelName (flags, val, offs);
 
        /* Load the address into the primary */
-       AddCodeSegLine (CS, "lda #<(%s)", Label);
-       AddCodeSegLine (CS, "ldx #>(%s)", Label);
+       AddCodeLine ("lda #<(%s)", Label);
+       AddCodeLine ("ldx #>(%s)", Label);
 
     }
 }
@@ -735,41 +649,41 @@ void g_getstatic (unsigned flags, unsigned long label, unsigned offs)
 
        case CF_CHAR:
            if ((flags & CF_FORCECHAR) || (flags & CF_TEST)) {
-               AddCodeSegLine (CS, "lda %s", lbuf);    /* load A from the label */
+               AddCodeLine ("lda %s", lbuf);   /* load A from the label */
                    } else {
                ldxconst (0);
-               AddCodeSegLine (CS, "lda %s", lbuf);    /* load A from the label */
+               AddCodeLine ("lda %s", lbuf);   /* load A from the label */
                if (!(flags & CF_UNSIGNED)) {
                    /* Must sign extend */
-                   AddCodeSegLine (CS, "bpl *+3");
-                   AddCodeSegLine (CS, "dex");
+                   AddCodeLine ("bpl *+3");
+                   AddCodeLine ("dex");
                    AddCodeHint ("x:!");                /* X is invalid now */
                }
            }
            break;
 
        case CF_INT:
-           AddCodeSegLine (CS, "lda %s", lbuf);
+           AddCodeLine ("lda %s", lbuf);
            if (flags & CF_TEST) {
-               AddCodeSegLine (CS, "ora %s+1", lbuf);
+               AddCodeLine ("ora %s+1", lbuf);
            } else {
-               AddCodeSegLine (CS, "ldx %s+1", lbuf);
+               AddCodeLine ("ldx %s+1", lbuf);
            }
            break;
 
        case CF_LONG:
            if (flags & CF_TEST) {
-               AddCodeSegLine (CS, "lda %s+3", lbuf);
-               AddCodeSegLine (CS, "ora %s+2", lbuf);
-               AddCodeSegLine (CS, "ora %s+1", lbuf);
-               AddCodeSegLine (CS, "ora %s+0", lbuf);
+               AddCodeLine ("lda %s+3", lbuf);
+               AddCodeLine ("ora %s+2", lbuf);
+               AddCodeLine ("ora %s+1", lbuf);
+               AddCodeLine ("ora %s+0", lbuf);
            } else {
-               AddCodeSegLine (CS, "lda %s+3", lbuf);
-               AddCodeSegLine (CS, "sta sreg+1");
-               AddCodeSegLine (CS, "lda %s+2", lbuf);
-               AddCodeSegLine (CS, "sta sreg");
-               AddCodeSegLine (CS, "ldx %s+1", lbuf);
-               AddCodeSegLine (CS, "lda %s", lbuf);
+               AddCodeLine ("lda %s+3", lbuf);
+               AddCodeLine ("sta sreg+1");
+               AddCodeLine ("lda %s+2", lbuf);
+               AddCodeLine ("sta sreg");
+               AddCodeLine ("ldx %s+1", lbuf);
+               AddCodeLine ("lda %s", lbuf);
            }
            break;
 
@@ -791,23 +705,23 @@ void g_getlocal (unsigned flags, int offs)
        case CF_CHAR:
            if ((flags & CF_FORCECHAR) || (flags & CF_TEST)) {
                if (CPU == CPU_65C02 && offs == 0) {
-                   AddCodeSegLine (CS, "lda (sp)");
+                   AddCodeLine ("lda (sp)");
                } else {
                    ldyconst (offs);
-                   AddCodeSegLine (CS, "lda (sp),y");
+                   AddCodeLine ("lda (sp),y");
                }
            } else {
                if (offs == 0) {
-                   AddCodeSegLine (CS, "ldx #$00");
-                   AddCodeSegLine (CS, "lda (sp,x)");
+                   AddCodeLine ("ldx #$00");
+                   AddCodeLine ("lda (sp,x)");
                } else {
                    ldyconst (offs);
-                   AddCodeSegLine (CS, "ldx #$00");
-                   AddCodeSegLine (CS, "lda (sp),y");
+                   AddCodeLine ("ldx #$00");
+                   AddCodeLine ("lda (sp),y");
                }
                if ((flags & CF_UNSIGNED) == 0) {
-                   AddCodeSegLine (CS, "bpl *+3");
-                   AddCodeSegLine (CS, "dex");
+                   AddCodeLine ("bpl *+3");
+                   AddCodeLine ("dex");
                    AddCodeHint ("x:!");        /* X is invalid now */
                }
            }
@@ -817,22 +731,22 @@ void g_getlocal (unsigned flags, int offs)
            CheckLocalOffs (offs + 1);
                    if (flags & CF_TEST) {
                ldyconst (offs + 1);
-               AddCodeSegLine (CS, "lda (sp),y");
-               AddCodeSegLine (CS, "dey");
-               AddCodeSegLine (CS, "ora (sp),y");
+               AddCodeLine ("lda (sp),y");
+               AddCodeLine ("dey");
+               AddCodeLine ("ora (sp),y");
            } else {
                if (CodeSizeFactor > 180) {
                    ldyconst (offs + 1);
-                   AddCodeSegLine (CS, "lda (sp),y");
-                   AddCodeSegLine (CS, "tax");
-                   AddCodeSegLine (CS, "dey");
-                   AddCodeSegLine (CS, "lda (sp),y");
+                   AddCodeLine ("lda (sp),y");
+                   AddCodeLine ("tax");
+                   AddCodeLine ("dey");
+                   AddCodeLine ("lda (sp),y");
                } else {
                    if (offs) {
                        ldyconst (offs+1);
-                               AddCodeSegLine (CS, "jsr ldaxysp");
+                               AddCodeLine ("jsr ldaxysp");
                    } else {
-                       AddCodeSegLine (CS, "jsr ldax0sp");
+                       AddCodeLine ("jsr ldax0sp");
                    }
                }
            }
@@ -841,9 +755,9 @@ void g_getlocal (unsigned flags, int offs)
        case CF_LONG:
            if (offs) {
                ldyconst (offs+3);
-               AddCodeSegLine (CS, "jsr ldeaxysp");
+               AddCodeLine ("jsr ldeaxysp");
            } else {
-               AddCodeSegLine (CS, "jsr ldeax0sp");
+               AddCodeLine ("jsr ldeax0sp");
            }
                    break;
 
@@ -873,22 +787,22 @@ void g_getind (unsigned flags, unsigned offs)
            if (offs) {
                ldyconst (offs);
                if (flags & CF_UNSIGNED) {
-                   AddCodeSegLine (CS, "jsr ldauidx");
+                   AddCodeLine ("jsr ldauidx");
                        } else {
-                   AddCodeSegLine (CS, "jsr ldaidx");
+                   AddCodeLine ("jsr ldaidx");
                }
            } else {
                if (flags & CF_UNSIGNED) {
                    if (CodeSizeFactor > 250) {
-                       AddCodeSegLine (CS, "sta ptr1");
-                       AddCodeSegLine (CS, "stx ptr1+1");
-                       AddCodeSegLine (CS, "ldx #$00");
-                       AddCodeSegLine (CS, "lda (ptr1,x)");
+                       AddCodeLine ("sta ptr1");
+                       AddCodeLine ("stx ptr1+1");
+                       AddCodeLine ("ldx #$00");
+                       AddCodeLine ("lda (ptr1,x)");
                    } else {
-                       AddCodeSegLine (CS, "jsr ldaui");
+                       AddCodeLine ("jsr ldaui");
                    }
                } else {
-                           AddCodeSegLine (CS, "jsr ldai");
+                           AddCodeLine ("jsr ldai");
                }
                    }
            break;
@@ -896,30 +810,30 @@ void g_getind (unsigned flags, unsigned offs)
        case CF_INT:
            if (flags & CF_TEST) {
                ldyconst (offs);
-               AddCodeSegLine (CS, "sta ptr1");
-               AddCodeSegLine (CS, "stx ptr1+1");
-               AddCodeSegLine (CS, "lda (ptr1),y");
-               AddCodeSegLine (CS, "iny");
-               AddCodeSegLine (CS, "ora (ptr1),y");
+               AddCodeLine ("sta ptr1");
+               AddCodeLine ("stx ptr1+1");
+               AddCodeLine ("lda (ptr1),y");
+               AddCodeLine ("iny");
+               AddCodeLine ("ora (ptr1),y");
            } else {
                if (offs == 0) {
-                   AddCodeSegLine (CS, "jsr ldaxi");
+                   AddCodeLine ("jsr ldaxi");
                } else {
                    ldyconst (offs+1);
-                   AddCodeSegLine (CS, "jsr ldaxidx");
+                   AddCodeLine ("jsr ldaxidx");
                }
            }
            break;
 
                case CF_LONG:
            if (offs == 0) {
-               AddCodeSegLine (CS, "jsr ldeaxi");
+               AddCodeLine ("jsr ldeaxi");
            } else {
                ldyconst (offs+3);
-               AddCodeSegLine (CS, "jsr ldeaxidx");
+               AddCodeLine ("jsr ldeaxidx");
            }
            if (flags & CF_TEST) {
-                       AddCodeSegLine (CS, "jsr tsteax");
+                       AddCodeLine ("jsr tsteax");
            }
            break;
 
@@ -939,27 +853,27 @@ void g_leasp (int offs)
 
     /* For value 0 we do direct code */
     if (offs == 0) {
-               AddCodeSegLine (CS, "lda sp");
-               AddCodeSegLine (CS, "ldx sp+1");
+               AddCodeLine ("lda sp");
+               AddCodeLine ("ldx sp+1");
     } else {
                if (CodeSizeFactor < 300) {
                    ldaconst (offs);                    /* Load A with offset value */
-                   AddCodeSegLine (CS, "jsr leaasp");  /* Load effective address */
+                   AddCodeLine ("jsr leaasp"); /* Load effective address */
                } else {
                    if (CPU == CPU_65C02 && offs == 1) {
-                       AddCodeSegLine (CS, "lda sp");
-                       AddCodeSegLine (CS, "ldx sp+1");
-                       AddCodeSegLine (CS, "ina");
-                       AddCodeSegLine (CS, "bne *+3");
-                       AddCodeSegLine (CS, "inx");
+                       AddCodeLine ("lda sp");
+                       AddCodeLine ("ldx sp+1");
+                       AddCodeLine ("ina");
+                       AddCodeLine ("bne *+3");
+                       AddCodeLine ("inx");
                        AddCodeHint ("x:!");            /* Invalidate X */
                    } else {
                        ldaconst (offs);
-                       AddCodeSegLine (CS, "clc");
-                       AddCodeSegLine (CS, "ldx sp+1");
-                       AddCodeSegLine (CS, "adc sp");
-                       AddCodeSegLine (CS, "bcc *+3");
-                       AddCodeSegLine (CS, "inx");
+                       AddCodeLine ("clc");
+                       AddCodeLine ("ldx sp+1");
+                       AddCodeLine ("adc sp");
+                       AddCodeLine ("bcc *+3");
+                       AddCodeLine ("inx");
                        AddCodeHint ("x:!");            /* Invalidate X */
                    }
                }
@@ -987,22 +901,22 @@ void g_leavariadic (int Offs)
 
     /* Get the size of all parameters. */
     if (ArgSizeOffs == 0 && CPU == CPU_65C02) {
-               AddCodeSegLine (CS, "lda (sp)");
+               AddCodeLine ("lda (sp)");
     } else {
                ldyconst (ArgSizeOffs);
-               AddCodeSegLine (CS, "lda (sp),y");
+               AddCodeLine ("lda (sp),y");
     }
 
     /* Add the value of the stackpointer */
     if (CodeSizeFactor > 250) {
-               AddCodeSegLine (CS, "ldx sp+1");
-               AddCodeSegLine (CS, "clc");
-               AddCodeSegLine (CS, "adc sp");
-               AddCodeSegLine (CS, "bcc *+3");
-               AddCodeSegLine (CS, "inx");
+               AddCodeLine ("ldx sp+1");
+               AddCodeLine ("clc");
+               AddCodeLine ("adc sp");
+               AddCodeLine ("bcc *+3");
+               AddCodeLine ("inx");
                AddCodeHint ("x:!");            /* Invalidate X */
     } else {
-               AddCodeSegLine (CS, "jsr leaasp");
+               AddCodeLine ("jsr leaasp");
     }
 
     /* Add the offset to the primary */
@@ -1031,21 +945,21 @@ void g_putstatic (unsigned flags, unsigned long label, unsigned offs)
     switch (flags & CF_TYPE) {
 
        case CF_CHAR:
-           AddCodeSegLine (CS, "sta %s", lbuf);
+           AddCodeLine ("sta %s", lbuf);
            break;
 
        case CF_INT:
-           AddCodeSegLine (CS, "sta %s", lbuf);
-           AddCodeSegLine (CS, "stx %s+1", lbuf);
+           AddCodeLine ("sta %s", lbuf);
+           AddCodeLine ("stx %s+1", lbuf);
            break;
 
        case CF_LONG:
-           AddCodeSegLine (CS, "sta %s", lbuf);
-           AddCodeSegLine (CS, "stx %s+1", lbuf);
-           AddCodeSegLine (CS, "ldy sreg");
-           AddCodeSegLine (CS, "sty %s+2", lbuf);
-           AddCodeSegLine (CS, "ldy sreg+1");
-           AddCodeSegLine (CS, "sty %s+3", lbuf);
+           AddCodeLine ("sta %s", lbuf);
+           AddCodeLine ("stx %s+1", lbuf);
+           AddCodeLine ("ldy sreg");
+           AddCodeLine ("sty %s+2", lbuf);
+           AddCodeLine ("ldy sreg+1");
+           AddCodeLine ("sty %s+3", lbuf);
            break;
 
                default:
@@ -1065,59 +979,59 @@ void g_putlocal (unsigned Flags, int Offs, long Val)
 
        case CF_CHAR:
            if (Flags & CF_CONST) {
-               AddCodeSegLine (CS, "lda #$%02X", (unsigned char) Val);
+               AddCodeLine ("lda #$%02X", (unsigned char) Val);
            }
            if (CPU == CPU_65C02 && Offs == 0) {
-               AddCodeSegLine (CS, "sta (sp)");
+               AddCodeLine ("sta (sp)");
            } else {
                ldyconst (Offs);
-               AddCodeSegLine (CS, "sta (sp),y");
+               AddCodeLine ("sta (sp),y");
            }
            break;
 
        case CF_INT:
            if (Flags & CF_CONST) {
                ldyconst (Offs+1);
-               AddCodeSegLine (CS, "lda #$%02X", (unsigned char) (Val >> 8));
-               AddCodeSegLine (CS, "sta (sp),y");
+               AddCodeLine ("lda #$%02X", (unsigned char) (Val >> 8));
+               AddCodeLine ("sta (sp),y");
                if ((Flags & CF_NOKEEP) == 0) {
                    /* Place high byte into X */
-                   AddCodeSegLine (CS, "tax");
+                   AddCodeLine ("tax");
                }
                if (CPU == CPU_65C02 && Offs == 0) {
-                   AddCodeSegLine (CS, "lda #$%02X", (unsigned char) Val);
-                   AddCodeSegLine (CS, "sta (sp)");
+                   AddCodeLine ("lda #$%02X", (unsigned char) Val);
+                   AddCodeLine ("sta (sp)");
                } else {
                    if ((Val & 0xFF) == Offs+1) {
                        /* The value we need is already in Y */
-                       AddCodeSegLine (CS, "tya");
-                       AddCodeSegLine (CS, "dey");
+                       AddCodeLine ("tya");
+                       AddCodeLine ("dey");
                    } else {
-                       AddCodeSegLine (CS, "dey");
-                       AddCodeSegLine (CS, "lda #$%02X", (unsigned char) Val);
+                       AddCodeLine ("dey");
+                       AddCodeLine ("lda #$%02X", (unsigned char) Val);
                    }
-                   AddCodeSegLine (CS, "sta (sp),y");
+                   AddCodeLine ("sta (sp),y");
                }
            } else {
                if ((Flags & CF_NOKEEP) == 0 || CodeSizeFactor < 160) {
                    if (Offs) {
                        ldyconst (Offs);
-                       AddCodeSegLine (CS, "jsr staxysp");
+                       AddCodeLine ("jsr staxysp");
                    } else {
-                       AddCodeSegLine (CS, "jsr stax0sp");
+                       AddCodeLine ("jsr stax0sp");
                    }
                } else {
                    if (CPU == CPU_65C02 && Offs == 0) {
-                       AddCodeSegLine (CS, "sta (sp)");
+                       AddCodeLine ("sta (sp)");
                        ldyconst (1);
-                       AddCodeSegLine (CS, "txa");
-                       AddCodeSegLine (CS, "sta (sp),y");
+                       AddCodeLine ("txa");
+                       AddCodeLine ("sta (sp),y");
                    } else {
                        ldyconst (Offs);
-                       AddCodeSegLine (CS, "sta (sp),y");
-                       AddCodeSegLine (CS, "iny");
-                       AddCodeSegLine (CS, "txa");
-                       AddCodeSegLine (CS, "sta (sp),y");
+                       AddCodeLine ("sta (sp),y");
+                       AddCodeLine ("iny");
+                       AddCodeLine ("txa");
+                       AddCodeLine ("sta (sp),y");
                    }
                }
            }
@@ -1129,9 +1043,9 @@ void g_putlocal (unsigned Flags, int Offs, long Val)
            }
            if (Offs) {
                ldyconst (Offs);
-               AddCodeSegLine (CS, "jsr steaxysp");
+               AddCodeLine ("jsr steaxysp");
            } else {
-               AddCodeSegLine (CS, "jsr steax0sp");
+               AddCodeLine ("jsr steax0sp");
            }
            break;
 
@@ -1156,17 +1070,17 @@ void g_putind (unsigned Flags, unsigned Offs)
     if ((Offs & 0xFF) > 256 - sizeofarg (Flags | CF_FORCECHAR)) {
 
        /* Overflow - we need to add the low byte also */
-       AddCodeSegLine (CS, "ldy #$00");
-       AddCodeSegLine (CS, "clc");
-       AddCodeSegLine (CS, "pha");
-       AddCodeSegLine (CS, "lda #$%02X", Offs & 0xFF);
-       AddCodeSegLine (CS, "adc (sp),y");
-       AddCodeSegLine (CS, "sta (sp),y");
-       AddCodeSegLine (CS, "iny");
-               AddCodeSegLine (CS, "lda #$%02X", (Offs >> 8) & 0xFF);
-       AddCodeSegLine (CS, "adc (sp),y");
-       AddCodeSegLine (CS, "sta (sp),y");
-       AddCodeSegLine (CS, "pla");
+       AddCodeLine ("ldy #$00");
+       AddCodeLine ("clc");
+       AddCodeLine ("pha");
+       AddCodeLine ("lda #$%02X", Offs & 0xFF);
+       AddCodeLine ("adc (sp),y");
+       AddCodeLine ("sta (sp),y");
+       AddCodeLine ("iny");
+               AddCodeLine ("lda #$%02X", (Offs >> 8) & 0xFF);
+       AddCodeLine ("adc (sp),y");
+       AddCodeLine ("sta (sp),y");
+       AddCodeLine ("pla");
 
        /* Complete address is on stack, new offset is zero */
        Offs = 0;
@@ -1174,13 +1088,13 @@ void g_putind (unsigned Flags, unsigned Offs)
     } else if ((Offs & 0xFF00) != 0) {
 
        /* We can just add the high byte */
-       AddCodeSegLine (CS, "ldy #$01");
-       AddCodeSegLine (CS, "clc");
-       AddCodeSegLine (CS, "pha");
-       AddCodeSegLine (CS, "lda #$%02X", (Offs >> 8) & 0xFF);
-       AddCodeSegLine (CS, "adc (sp),y");
-       AddCodeSegLine (CS, "sta (sp),y");
-       AddCodeSegLine (CS, "pla");
+       AddCodeLine ("ldy #$01");
+       AddCodeLine ("clc");
+       AddCodeLine ("pha");
+       AddCodeLine ("lda #$%02X", (Offs >> 8) & 0xFF);
+       AddCodeLine ("adc (sp),y");
+       AddCodeLine ("sta (sp),y");
+       AddCodeLine ("pla");
 
        /* Offset is now just the low byte */
        Offs &= 0x00FF;
@@ -1192,27 +1106,27 @@ void g_putind (unsigned Flags, unsigned Offs)
        case CF_CHAR:
            if (Offs) {
                ldyconst (Offs);
-               AddCodeSegLine (CS, "jsr staspidx");
+               AddCodeLine ("jsr staspidx");
            } else {
-               AddCodeSegLine (CS, "jsr staspp");
+               AddCodeLine ("jsr staspp");
            }
            break;
 
        case CF_INT:
            if (Offs) {
                ldyconst (Offs);
-               AddCodeSegLine (CS, "jsr staxspidx");
+               AddCodeLine ("jsr staxspidx");
            } else {
-               AddCodeSegLine (CS, "jsr staxspp");
+               AddCodeLine ("jsr staxspp");
            }
            break;
 
        case CF_LONG:
            if (Offs) {
                ldyconst (Offs);
-               AddCodeSegLine (CS, "jsr steaxspidx");
+               AddCodeLine ("jsr steaxspidx");
            } else {
-               AddCodeSegLine (CS, "jsr steaxspp");
+               AddCodeLine ("jsr steaxspp");
            }
            break;
 
@@ -1241,9 +1155,9 @@ void g_toslong (unsigned flags)
        case CF_CHAR:
        case CF_INT:
            if (flags & CF_UNSIGNED) {
-               AddCodeSegLine (CS, "jsr tosulong");
+               AddCodeLine ("jsr tosulong");
            } else {
-               AddCodeSegLine (CS, "jsr toslong");
+               AddCodeLine ("jsr toslong");
            }
            push (CF_INT);
            break;
@@ -1268,7 +1182,7 @@ void g_tosint (unsigned flags)
            break;
 
        case CF_LONG:
-           AddCodeSegLine (CS, "jsr tosint");
+           AddCodeLine ("jsr tosint");
            pop (CF_INT);
            break;
 
@@ -1289,13 +1203,13 @@ void g_reglong (unsigned flags)
            if (flags & CF_UNSIGNED) {
                if (CodeSizeFactor >= 200) {
                    ldyconst (0);
-                   AddCodeSegLine (CS, "sty sreg");
-                   AddCodeSegLine (CS, "sty sreg+1");
+                   AddCodeLine ("sty sreg");
+                   AddCodeLine ("sty sreg+1");
                } else {
-                   AddCodeSegLine (CS, "jsr axulong");
+                   AddCodeLine ("jsr axulong");
                }
            } else {
-               AddCodeSegLine (CS, "jsr axlong");
+               AddCodeLine ("jsr axlong");
            }
            break;
 
@@ -1416,7 +1330,7 @@ void g_scale (unsigned flags, long val)
                case CF_CHAR:
                    if (flags & CF_FORCECHAR) {
                        while (p2--) {
-                           AddCodeSegLine (CS, "asl a");
+                           AddCodeLine ("asl a");
                        }
                        break;
                    }
@@ -1424,26 +1338,26 @@ void g_scale (unsigned flags, long val)
 
                case CF_INT:
                    if (CodeSizeFactor >= (p2+1)*130U) {
-                       AddCodeSegLine (CS, "stx tmp1");
+                       AddCodeLine ("stx tmp1");
                        while (p2--) {
-                           AddCodeSegLine (CS, "asl a");
-                           AddCodeSegLine (CS, "rol tmp1");
+                           AddCodeLine ("asl a");
+                           AddCodeLine ("rol tmp1");
                        }
-                       AddCodeSegLine (CS, "ldx tmp1");
+                       AddCodeLine ("ldx tmp1");
                    } else {
                        if (flags & CF_UNSIGNED) {
-                           AddCodeSegLine (CS, "jsr shlax%d", p2);
+                           AddCodeLine ("jsr shlax%d", p2);
                        } else {
-                           AddCodeSegLine (CS, "jsr aslax%d", p2);
+                           AddCodeLine ("jsr aslax%d", p2);
                        }
                    }
                    break;
 
                case CF_LONG:
                    if (flags & CF_UNSIGNED) {
-                       AddCodeSegLine (CS, "jsr shleax%d", p2);
+                       AddCodeLine ("jsr shleax%d", p2);
                    } else {
-                       AddCodeSegLine (CS, "jsr asleax%d", p2);
+                       AddCodeLine ("jsr asleax%d", p2);
                    }
                    break;
 
@@ -1472,12 +1386,12 @@ void g_scale (unsigned flags, long val)
                    if (flags & CF_FORCECHAR) {
                        if (flags & CF_UNSIGNED) {
                            while (p2--) {
-                               AddCodeSegLine (CS, "lsr a");
+                               AddCodeLine ("lsr a");
                            }
                            break;
                        } else if (p2 <= 2) {
-                           AddCodeSegLine (CS, "cmp #$80");
-                           AddCodeSegLine (CS, "ror a");
+                           AddCodeLine ("cmp #$80");
+                           AddCodeLine ("ror a");
                            break;
                        }
                    }
@@ -1486,35 +1400,35 @@ void g_scale (unsigned flags, long val)
                case CF_INT:
                    if (flags & CF_UNSIGNED) {
                        if (CodeSizeFactor >= (p2+1)*130U) {
-                           AddCodeSegLine (CS, "stx tmp1");
+                           AddCodeLine ("stx tmp1");
                            while (p2--) {
-                               AddCodeSegLine (CS, "lsr tmp1");
-                               AddCodeSegLine (CS, "ror a");
+                               AddCodeLine ("lsr tmp1");
+                               AddCodeLine ("ror a");
                            }
-                           AddCodeSegLine (CS, "ldx tmp1");
+                           AddCodeLine ("ldx tmp1");
                        } else {
-                           AddCodeSegLine (CS, "jsr lsrax%d", p2);
+                           AddCodeLine ("jsr lsrax%d", p2);
                        }
                    } else {
                        if (CodeSizeFactor >= (p2+1)*150U) {
-                           AddCodeSegLine (CS, "stx tmp1");
+                           AddCodeLine ("stx tmp1");
                            while (p2--) {
-                               AddCodeSegLine (CS, "cpx #$80");
-                               AddCodeSegLine (CS, "ror tmp1");
-                               AddCodeSegLine (CS, "ror a");
+                               AddCodeLine ("cpx #$80");
+                               AddCodeLine ("ror tmp1");
+                               AddCodeLine ("ror a");
                            }
-                           AddCodeSegLine (CS, "ldx tmp1");
+                           AddCodeLine ("ldx tmp1");
                        } else {
-                           AddCodeSegLine (CS, "jsr asrax%d", p2);
+                           AddCodeLine ("jsr asrax%d", p2);
                        }
                    }
                    break;
 
                case CF_LONG:
                    if (flags & CF_UNSIGNED) {
-                       AddCodeSegLine (CS, "jsr lsreax%d", p2);
+                       AddCodeLine ("jsr lsreax%d", p2);
                    } else {
-                       AddCodeSegLine (CS, "jsr asreax%d", p2);
+                       AddCodeLine ("jsr asreax%d", p2);
                    }
                    break;
 
@@ -1550,24 +1464,24 @@ void g_addlocal (unsigned flags, int offs)
     switch (flags & CF_TYPE) {
 
        case CF_CHAR:
-           AddCodeSegLine (CS, "ldy #$%02X", offs & 0xFF);
-           AddCodeSegLine (CS, "clc");
-           AddCodeSegLine (CS, "adc (sp),y");
-           AddCodeSegLine (CS, "bcc *+3");
-           AddCodeSegLine (CS, "inx");
+           AddCodeLine ("ldy #$%02X", offs & 0xFF);
+           AddCodeLine ("clc");
+           AddCodeLine ("adc (sp),y");
+           AddCodeLine ("bcc *+3");
+           AddCodeLine ("inx");
            AddCodeHint ("x:!");
            break;
 
        case CF_INT:
-           AddCodeSegLine (CS, "ldy #$%02X", offs & 0xFF);
-           AddCodeSegLine (CS, "clc");
-           AddCodeSegLine (CS, "adc (sp),y");
-           AddCodeSegLine (CS, "pha");
-           AddCodeSegLine (CS, "txa");
-           AddCodeSegLine (CS, "iny");
-           AddCodeSegLine (CS, "adc (sp),y");
-           AddCodeSegLine (CS, "tax");
-           AddCodeSegLine (CS, "pla");
+           AddCodeLine ("ldy #$%02X", offs & 0xFF);
+           AddCodeLine ("clc");
+           AddCodeLine ("adc (sp),y");
+           AddCodeLine ("pha");
+           AddCodeLine ("txa");
+           AddCodeLine ("iny");
+           AddCodeLine ("adc (sp),y");
+           AddCodeLine ("tax");
+           AddCodeLine ("pla");
            break;
 
        case CF_LONG:
@@ -1594,21 +1508,21 @@ void g_addstatic (unsigned flags, unsigned long label, unsigned offs)
     switch (flags & CF_TYPE) {
 
        case CF_CHAR:
-           AddCodeSegLine (CS, "clc");
-           AddCodeSegLine (CS, "adc %s", lbuf);
-           AddCodeSegLine (CS, "bcc *+3");
-           AddCodeSegLine (CS, "inx");
+           AddCodeLine ("clc");
+           AddCodeLine ("adc %s", lbuf);
+           AddCodeLine ("bcc *+3");
+           AddCodeLine ("inx");
            AddCodeHint ("x:!");
            break;
 
        case CF_INT:
-           AddCodeSegLine (CS, "clc");
-           AddCodeSegLine (CS, "adc %s", lbuf);
-           AddCodeSegLine (CS, "tay");
-           AddCodeSegLine (CS, "txa");
-           AddCodeSegLine (CS, "adc %s+1", lbuf);
-           AddCodeSegLine (CS, "tax");
-           AddCodeSegLine (CS, "tya");
+           AddCodeLine ("clc");
+           AddCodeLine ("adc %s", lbuf);
+           AddCodeLine ("tay");
+           AddCodeLine ("txa");
+           AddCodeLine ("adc %s+1", lbuf);
+           AddCodeLine ("tax");
+           AddCodeLine ("tya");
            break;
 
        case CF_LONG:
@@ -1666,25 +1580,25 @@ void g_addeqstatic (unsigned flags, unsigned long label, unsigned offs,
 
                case CF_CHAR:
                    if (flags & CF_FORCECHAR) {
-               AddCodeSegLine (CS, "ldx #$00");
+               AddCodeLine ("ldx #$00");
                        if (flags & CF_CONST) {
                    if (val == 1) {
-                       AddCodeSegLine (CS, "inc %s", lbuf);
-                       AddCodeSegLine (CS, "lda %s", lbuf);
+                       AddCodeLine ("inc %s", lbuf);
+                       AddCodeLine ("lda %s", lbuf);
                    } else {
-                               AddCodeSegLine (CS, "lda #$%02X", (int)(val & 0xFF));
-                       AddCodeSegLine (CS, "clc");
-                       AddCodeSegLine (CS, "adc %s", lbuf);
-                       AddCodeSegLine (CS, "sta %s", lbuf);
+                               AddCodeLine ("lda #$%02X", (int)(val & 0xFF));
+                       AddCodeLine ("clc");
+                       AddCodeLine ("adc %s", lbuf);
+                       AddCodeLine ("sta %s", lbuf);
                    }
                        } else {
-                   AddCodeSegLine (CS, "clc");
-                           AddCodeSegLine (CS, "adc %s", lbuf);
-                   AddCodeSegLine (CS, "sta %s", lbuf);
+                   AddCodeLine ("clc");
+                           AddCodeLine ("adc %s", lbuf);
+                   AddCodeLine ("sta %s", lbuf);
                        }
                if ((flags & CF_UNSIGNED) == 0) {
-                   AddCodeSegLine (CS, "bpl *+3");
-                   AddCodeSegLine (CS, "dex");
+                   AddCodeLine ("bpl *+3");
+                   AddCodeLine ("dex");
                    AddCodeHint ("x:!");                /* Invalidate X */
                }
                        break;
@@ -1695,54 +1609,54 @@ void g_addeqstatic (unsigned flags, unsigned long label, unsigned offs,
                    if (flags & CF_CONST) {
                if (val == 1) {
                    unsigned L = GetLocalLabel ();
-                   AddCodeSegLine (CS, "inc %s", lbuf);
-                   AddCodeSegLine (CS, "bne %s", LocalLabelName (L));
-                   AddCodeSegLine (CS, "inc %s+1", lbuf);
+                   AddCodeLine ("inc %s", lbuf);
+                   AddCodeLine ("bne %s", LocalLabelName (L));
+                   AddCodeLine ("inc %s+1", lbuf);
                    g_defcodelabel (L);
-                   AddCodeSegLine (CS, "lda %s", lbuf);                /* Hmmm... */
-                   AddCodeSegLine (CS, "ldx %s+1", lbuf);
+                   AddCodeLine ("lda %s", lbuf);               /* Hmmm... */
+                   AddCodeLine ("ldx %s+1", lbuf);
                } else {
-                           AddCodeSegLine (CS, "lda #$%02X", (int)(val & 0xFF));
-                   AddCodeSegLine (CS, "clc");
-                   AddCodeSegLine (CS, "adc %s", lbuf);
-                   AddCodeSegLine (CS, "sta %s", lbuf);
+                           AddCodeLine ("lda #$%02X", (int)(val & 0xFF));
+                   AddCodeLine ("clc");
+                   AddCodeLine ("adc %s", lbuf);
+                   AddCodeLine ("sta %s", lbuf);
                    if (val < 0x100) {
                        unsigned L = GetLocalLabel ();
-                       AddCodeSegLine (CS, "bcc %s", LocalLabelName (L));
-                       AddCodeSegLine (CS, "inc %s+1", lbuf);
+                       AddCodeLine ("bcc %s", LocalLabelName (L));
+                       AddCodeLine ("inc %s+1", lbuf);
                                g_defcodelabel (L);
-                       AddCodeSegLine (CS, "ldx %s+1", lbuf);
+                       AddCodeLine ("ldx %s+1", lbuf);
                    } else {
-                               AddCodeSegLine (CS, "lda #$%02X", (unsigned char)(val >> 8));
-                       AddCodeSegLine (CS, "adc %s+1", lbuf);
-                       AddCodeSegLine (CS, "sta %s+1", lbuf);
-                       AddCodeSegLine (CS, "tax");
-                       AddCodeSegLine (CS, "lda %s", lbuf);
+                               AddCodeLine ("lda #$%02X", (unsigned char)(val >> 8));
+                       AddCodeLine ("adc %s+1", lbuf);
+                       AddCodeLine ("sta %s+1", lbuf);
+                       AddCodeLine ("tax");
+                       AddCodeLine ("lda %s", lbuf);
                    }
                }
                    } else {
-               AddCodeSegLine (CS, "clc");
-                       AddCodeSegLine (CS, "adc %s", lbuf);
-                       AddCodeSegLine (CS, "sta %s", lbuf);
-                       AddCodeSegLine (CS, "txa");
-                       AddCodeSegLine (CS, "adc %s+1", lbuf);
-                       AddCodeSegLine (CS, "sta %s+1", lbuf);
-                       AddCodeSegLine (CS, "tax");
-               AddCodeSegLine (CS, "lda %s", lbuf);
+               AddCodeLine ("clc");
+                       AddCodeLine ("adc %s", lbuf);
+                       AddCodeLine ("sta %s", lbuf);
+                       AddCodeLine ("txa");
+                       AddCodeLine ("adc %s+1", lbuf);
+                       AddCodeLine ("sta %s+1", lbuf);
+                       AddCodeLine ("tax");
+               AddCodeLine ("lda %s", lbuf);
            }
                    break;
 
                case CF_LONG:
            if (flags & CF_CONST) {
                if (val < 0x100) {
-                   AddCodeSegLine (CS, "ldy #<(%s)", lbuf);
-                   AddCodeSegLine (CS, "sty ptr1");
-                   AddCodeSegLine (CS, "ldy #>(%s+1)", lbuf);
+                   AddCodeLine ("ldy #<(%s)", lbuf);
+                   AddCodeLine ("sty ptr1");
+                   AddCodeLine ("ldy #>(%s+1)", lbuf);
                    if (val == 1) {
-                       AddCodeSegLine (CS, "jsr laddeq1");
+                       AddCodeLine ("jsr laddeq1");
                    } else {
-                       AddCodeSegLine (CS, "lda #$%02X", (int)(val & 0xFF));
-                       AddCodeSegLine (CS, "jsr laddeqa");
+                       AddCodeLine ("lda #$%02X", (int)(val & 0xFF));
+                       AddCodeLine ("jsr laddeqa");
                    }
                } else {
                    g_getstatic (flags, label, offs);
@@ -1750,10 +1664,10 @@ void g_addeqstatic (unsigned flags, unsigned long label, unsigned offs,
                    g_putstatic (flags, label, offs);
                }
            } else {
-               AddCodeSegLine (CS, "ldy #<(%s)", lbuf);
-               AddCodeSegLine (CS, "sty ptr1");
-               AddCodeSegLine (CS, "ldy #>(%s+1)", lbuf);
-               AddCodeSegLine (CS, "jsr laddeq");
+               AddCodeLine ("ldy #<(%s)", lbuf);
+               AddCodeLine ("sty ptr1");
+               AddCodeLine ("ldy #>(%s+1)", lbuf);
+               AddCodeLine ("jsr laddeq");
            }
                    break;
 
@@ -1777,34 +1691,34 @@ void g_addeqlocal (unsigned flags, int offs, unsigned long val)
                case CF_CHAR:
                    if (flags & CF_FORCECHAR) {
                        if (offs == 0) {
-                           AddCodeSegLine (CS, "ldx #$00");
+                           AddCodeLine ("ldx #$00");
                            if (flags & CF_CONST) {
-                               AddCodeSegLine (CS, "clc");
-                               AddCodeSegLine (CS, "lda #$%02X", (int)(val & 0xFF));
-                               AddCodeSegLine (CS, "adc (sp,x)");
-                               AddCodeSegLine (CS, "sta (sp,x)");
+                               AddCodeLine ("clc");
+                               AddCodeLine ("lda #$%02X", (int)(val & 0xFF));
+                               AddCodeLine ("adc (sp,x)");
+                               AddCodeLine ("sta (sp,x)");
                            } else {
-                               AddCodeSegLine (CS, "clc");
-                               AddCodeSegLine (CS, "adc (sp,x)");
-                               AddCodeSegLine (CS, "sta (sp,x)");
+                               AddCodeLine ("clc");
+                               AddCodeLine ("adc (sp,x)");
+                               AddCodeLine ("sta (sp,x)");
                            }
                        } else {
                            ldyconst (offs);
-                   AddCodeSegLine (CS, "ldx #$00");
+                   AddCodeLine ("ldx #$00");
                    if (flags & CF_CONST) {
-                       AddCodeSegLine (CS, "clc");
-                               AddCodeSegLine (CS, "lda #$%02X", (int)(val & 0xFF));
-                       AddCodeSegLine (CS, "adc (sp),y");
-                       AddCodeSegLine (CS, "sta (sp),y");
+                       AddCodeLine ("clc");
+                               AddCodeLine ("lda #$%02X", (int)(val & 0xFF));
+                       AddCodeLine ("adc (sp),y");
+                       AddCodeLine ("sta (sp),y");
                    } else {
-                       AddCodeSegLine (CS, "clc");
-                       AddCodeSegLine (CS, "adc (sp),y");
-                       AddCodeSegLine (CS, "sta (sp),y");
+                       AddCodeLine ("clc");
+                       AddCodeLine ("adc (sp),y");
+                       AddCodeLine ("sta (sp),y");
                    }
                }
                if ((flags & CF_UNSIGNED) == 0) {
-                   AddCodeSegLine (CS, "bpl *+3");
-                   AddCodeSegLine (CS, "dex");
+                   AddCodeLine ("bpl *+3");
+                   AddCodeLine ("dex");
                    AddCodeHint ("x:!");        /* Invalidate X */
                }
                        break;
@@ -1816,10 +1730,10 @@ void g_addeqlocal (unsigned flags, int offs, unsigned long val)
                g_getimmed (flags, val, 0);
            }
            if (offs == 0) {
-               AddCodeSegLine (CS, "jsr addeq0sp");
+               AddCodeLine ("jsr addeq0sp");
            } else {
                ldyconst (offs);
-               AddCodeSegLine (CS, "jsr addeqysp");
+               AddCodeLine ("jsr addeqysp");
            }
                    break;
 
@@ -1828,10 +1742,10 @@ void g_addeqlocal (unsigned flags, int offs, unsigned long val)
                g_getimmed (flags, val, 0);
            }
            if (offs == 0) {
-               AddCodeSegLine (CS, "jsr laddeq0sp");
+               AddCodeLine ("jsr laddeq0sp");
            } else {
                ldyconst (offs);
-               AddCodeSegLine (CS, "jsr laddeqysp");
+               AddCodeLine ("jsr laddeqysp");
            }
                    break;
 
@@ -1855,47 +1769,47 @@ void g_addeqind (unsigned flags, unsigned offs, unsigned long val)
     switch (flags & CF_TYPE) {
 
                case CF_CHAR:
-           AddCodeSegLine (CS, "sta ptr1");
-           AddCodeSegLine (CS, "stx ptr1+1");
+           AddCodeLine ("sta ptr1");
+           AddCodeLine ("stx ptr1+1");
            if (offs == 0) {
-               AddCodeSegLine (CS, "ldx #$00");
-               AddCodeSegLine (CS, "lda #$%02X", (int)(val & 0xFF));
-               AddCodeSegLine (CS, "clc");
-               AddCodeSegLine (CS, "adc (ptr1,x)");
-               AddCodeSegLine (CS, "sta (ptr1,x)");
+               AddCodeLine ("ldx #$00");
+               AddCodeLine ("lda #$%02X", (int)(val & 0xFF));
+               AddCodeLine ("clc");
+               AddCodeLine ("adc (ptr1,x)");
+               AddCodeLine ("sta (ptr1,x)");
            } else {
-               AddCodeSegLine (CS, "ldy #$%02X", offs);
-                       AddCodeSegLine (CS, "ldx #$00");
-                       AddCodeSegLine (CS, "lda #$%02X", (int)(val & 0xFF));
-                       AddCodeSegLine (CS, "clc");
-                       AddCodeSegLine (CS, "adc (ptr1),y");
-                       AddCodeSegLine (CS, "sta (ptr1),y");
+               AddCodeLine ("ldy #$%02X", offs);
+                       AddCodeLine ("ldx #$00");
+                       AddCodeLine ("lda #$%02X", (int)(val & 0xFF));
+                       AddCodeLine ("clc");
+                       AddCodeLine ("adc (ptr1),y");
+                       AddCodeLine ("sta (ptr1),y");
            }
            break;
 
                case CF_INT:
            if (CodeSizeFactor >= 200) {
                /* Lots of code, use only if size is not important */
-                       AddCodeSegLine (CS, "sta ptr1");
-               AddCodeSegLine (CS, "stx ptr1+1");
-               AddCodeSegLine (CS, "ldy #$%02X", offs);
-               AddCodeSegLine (CS, "lda #$%02X", (int)(val & 0xFF));
-               AddCodeSegLine (CS, "clc");
-               AddCodeSegLine (CS, "adc (ptr1),y");
-               AddCodeSegLine (CS, "sta (ptr1),y");
-               AddCodeSegLine (CS, "pha");
-               AddCodeSegLine (CS, "iny");
-               AddCodeSegLine (CS, "lda #$%02X", (unsigned char)(val >> 8));
-               AddCodeSegLine (CS, "adc (ptr1),y");
-               AddCodeSegLine (CS, "sta (ptr1),y");
-               AddCodeSegLine (CS, "tax");
-               AddCodeSegLine (CS, "pla");
+                       AddCodeLine ("sta ptr1");
+               AddCodeLine ("stx ptr1+1");
+               AddCodeLine ("ldy #$%02X", offs);
+               AddCodeLine ("lda #$%02X", (int)(val & 0xFF));
+               AddCodeLine ("clc");
+               AddCodeLine ("adc (ptr1),y");
+               AddCodeLine ("sta (ptr1),y");
+               AddCodeLine ("pha");
+               AddCodeLine ("iny");
+               AddCodeLine ("lda #$%02X", (unsigned char)(val >> 8));
+               AddCodeLine ("adc (ptr1),y");
+               AddCodeLine ("sta (ptr1),y");
+               AddCodeLine ("tax");
+               AddCodeLine ("pla");
                break;
            }
            /* FALL THROUGH */
 
                case CF_LONG:
-                   AddCodeSegLine (CS, "jsr pushax");          /* Push the address */
+                   AddCodeLine ("jsr pushax");         /* Push the address */
            push (flags);                       /* Correct the internal sp */
            g_getind (flags, offs);             /* Fetch the value */
            g_inc (flags, val);                 /* Increment value in primary */
@@ -1921,27 +1835,27 @@ void g_subeqstatic (unsigned flags, unsigned long label, unsigned offs,
 
                case CF_CHAR:
                    if (flags & CF_FORCECHAR) {
-                       AddCodeSegLine (CS, "ldx #$00");
+                       AddCodeLine ("ldx #$00");
                        if (flags & CF_CONST) {
                            if (val == 1) {
-                               AddCodeSegLine (CS, "dec %s", lbuf);
-                               AddCodeSegLine (CS, "lda %s", lbuf);
+                               AddCodeLine ("dec %s", lbuf);
+                               AddCodeLine ("lda %s", lbuf);
                            } else {
-                               AddCodeSegLine (CS, "sec");
-                               AddCodeSegLine (CS, "lda %s", lbuf);
-                               AddCodeSegLine (CS, "sbc #$%02X", (int)(val & 0xFF));
-                               AddCodeSegLine (CS, "sta %s", lbuf);
+                               AddCodeLine ("sec");
+                               AddCodeLine ("lda %s", lbuf);
+                               AddCodeLine ("sbc #$%02X", (int)(val & 0xFF));
+                               AddCodeLine ("sta %s", lbuf);
                            }
                        } else {
-                           AddCodeSegLine (CS, "sec");
-                           AddCodeSegLine (CS, "sta tmp1");
-                           AddCodeSegLine (CS, "lda %s", lbuf);
-                           AddCodeSegLine (CS, "sbc tmp1");
-                           AddCodeSegLine (CS, "sta %s", lbuf);
+                           AddCodeLine ("sec");
+                           AddCodeLine ("sta tmp1");
+                           AddCodeLine ("lda %s", lbuf);
+                           AddCodeLine ("sbc tmp1");
+                           AddCodeLine ("sta %s", lbuf);
                        }
                        if ((flags & CF_UNSIGNED) == 0) {
-                           AddCodeSegLine (CS, "bpl *+3");
-                           AddCodeSegLine (CS, "dex");
+                           AddCodeLine ("bpl *+3");
+                           AddCodeLine ("dex");
                            AddCodeHint ("x:!");                /* Invalidate X */
                        }
                        break;
@@ -1949,49 +1863,49 @@ void g_subeqstatic (unsigned flags, unsigned long label, unsigned offs,
                    /* FALLTHROUGH */
 
                case CF_INT:
-           AddCodeSegLine (CS, "sec");
+           AddCodeLine ("sec");
            if (flags & CF_CONST) {
-               AddCodeSegLine (CS, "lda %s", lbuf);
-               AddCodeSegLine (CS, "sbc #$%02X", (unsigned char)val);
-               AddCodeSegLine (CS, "sta %s", lbuf);
+               AddCodeLine ("lda %s", lbuf);
+               AddCodeLine ("sbc #$%02X", (unsigned char)val);
+               AddCodeLine ("sta %s", lbuf);
                if (val < 0x100) {
                    unsigned L = GetLocalLabel ();
-                   AddCodeSegLine (CS, "bcs %s", LocalLabelName (L));
-                   AddCodeSegLine (CS, "dec %s+1", lbuf);
+                   AddCodeLine ("bcs %s", LocalLabelName (L));
+                   AddCodeLine ("dec %s+1", lbuf);
                    g_defcodelabel (L);
-                   AddCodeSegLine (CS, "ldx %s+1", lbuf);
+                   AddCodeLine ("ldx %s+1", lbuf);
                } else {
-                   AddCodeSegLine (CS, "lda %s+1", lbuf);
-                   AddCodeSegLine (CS, "sbc #$%02X", (unsigned char)(val >> 8));
-                   AddCodeSegLine (CS, "sta %s+1", lbuf);
-                   AddCodeSegLine (CS, "tax");
-                   AddCodeSegLine (CS, "lda %s", lbuf);
+                   AddCodeLine ("lda %s+1", lbuf);
+                   AddCodeLine ("sbc #$%02X", (unsigned char)(val >> 8));
+                   AddCodeLine ("sta %s+1", lbuf);
+                   AddCodeLine ("tax");
+                   AddCodeLine ("lda %s", lbuf);
                }
            } else {
-               AddCodeSegLine (CS, "sta tmp1");
-               AddCodeSegLine (CS, "lda %s", lbuf);
-               AddCodeSegLine (CS, "sbc tmp1");
-               AddCodeSegLine (CS, "sta %s", lbuf);
-                       AddCodeSegLine (CS, "stx tmp1");
-               AddCodeSegLine (CS, "lda %s+1", lbuf);
-               AddCodeSegLine (CS, "sbc tmp1");
-               AddCodeSegLine (CS, "sta %s+1", lbuf);
-               AddCodeSegLine (CS, "tax");
-               AddCodeSegLine (CS, "lda %s", lbuf);
+               AddCodeLine ("sta tmp1");
+               AddCodeLine ("lda %s", lbuf);
+               AddCodeLine ("sbc tmp1");
+               AddCodeLine ("sta %s", lbuf);
+                       AddCodeLine ("stx tmp1");
+               AddCodeLine ("lda %s+1", lbuf);
+               AddCodeLine ("sbc tmp1");
+               AddCodeLine ("sta %s+1", lbuf);
+               AddCodeLine ("tax");
+               AddCodeLine ("lda %s", lbuf);
            }
                    break;
 
                case CF_LONG:
            if (flags & CF_CONST) {
                if (val < 0x100) {
-                   AddCodeSegLine (CS, "ldy #<(%s)", lbuf);
-                   AddCodeSegLine (CS, "sty ptr1");
-                   AddCodeSegLine (CS, "ldy #>(%s+1)", lbuf);
+                   AddCodeLine ("ldy #<(%s)", lbuf);
+                   AddCodeLine ("sty ptr1");
+                   AddCodeLine ("ldy #>(%s+1)", lbuf);
                    if (val == 1) {
-                       AddCodeSegLine (CS, "jsr lsubeq1");
+                       AddCodeLine ("jsr lsubeq1");
                    } else {
-                       AddCodeSegLine (CS, "lda #$%02X", (unsigned char)val);
-                       AddCodeSegLine (CS, "jsr lsubeqa");
+                       AddCodeLine ("lda #$%02X", (unsigned char)val);
+                       AddCodeLine ("jsr lsubeqa");
                    }
                } else {
                    g_getstatic (flags, label, offs);
@@ -1999,10 +1913,10 @@ void g_subeqstatic (unsigned flags, unsigned long label, unsigned offs,
                    g_putstatic (flags, label, offs);
                }
            } else {
-               AddCodeSegLine (CS, "ldy #<(%s)", lbuf);
-               AddCodeSegLine (CS, "sty ptr1");
-               AddCodeSegLine (CS, "ldy #>(%s+1)", lbuf);
-               AddCodeSegLine (CS, "jsr lsubeq");
+               AddCodeLine ("ldy #<(%s)", lbuf);
+               AddCodeLine ("sty ptr1");
+               AddCodeLine ("ldy #>(%s+1)", lbuf);
+               AddCodeLine ("jsr lsubeq");
                    }
                    break;
 
@@ -2026,20 +1940,20 @@ void g_subeqlocal (unsigned flags, int offs, unsigned long val)
                case CF_CHAR:
                    if (flags & CF_FORCECHAR) {
                ldyconst (offs);
-               AddCodeSegLine (CS, "ldx #$00");
-                       AddCodeSegLine (CS, "sec");
+               AddCodeLine ("ldx #$00");
+                       AddCodeLine ("sec");
                if (flags & CF_CONST) {
-                   AddCodeSegLine (CS, "lda (sp),y");
-                   AddCodeSegLine (CS, "sbc #$%02X", (unsigned char)val);
+                   AddCodeLine ("lda (sp),y");
+                   AddCodeLine ("sbc #$%02X", (unsigned char)val);
                } else {
-                   AddCodeSegLine (CS, "sta tmp1");
-                   AddCodeSegLine (CS, "lda (sp),y");
-                   AddCodeSegLine (CS, "sbc tmp1");
+                   AddCodeLine ("sta tmp1");
+                   AddCodeLine ("lda (sp),y");
+                   AddCodeLine ("sbc tmp1");
                }
-                       AddCodeSegLine (CS, "sta (sp),y");
+                       AddCodeLine ("sta (sp),y");
                if ((flags & CF_UNSIGNED) == 0) {
-                   AddCodeSegLine (CS, "bpl *+3");
-                   AddCodeSegLine (CS, "dex");
+                   AddCodeLine ("bpl *+3");
+                   AddCodeLine ("dex");
                    AddCodeHint ("x:!");                /* Invalidate X */
                }
                        break;
@@ -2051,10 +1965,10 @@ void g_subeqlocal (unsigned flags, int offs, unsigned long val)
                g_getimmed (flags, val, 0);
            }
            if (offs == 0) {
-               AddCodeSegLine (CS, "jsr subeq0sp");
+               AddCodeLine ("jsr subeq0sp");
            } else {
                ldyconst (offs);
-               AddCodeSegLine (CS, "jsr subeqysp");
+               AddCodeLine ("jsr subeqysp");
            }
                    break;
 
@@ -2063,10 +1977,10 @@ void g_subeqlocal (unsigned flags, int offs, unsigned long val)
                g_getimmed (flags, val, 0);
            }
            if (offs == 0) {
-               AddCodeSegLine (CS, "jsr lsubeq0sp");
+               AddCodeLine ("jsr lsubeq0sp");
            } else {
                ldyconst (offs);
-               AddCodeSegLine (CS, "jsr lsubeqysp");
+               AddCodeLine ("jsr lsubeqysp");
            }
                    break;
 
@@ -2090,47 +2004,47 @@ void g_subeqind (unsigned flags, unsigned offs, unsigned long val)
     switch (flags & CF_TYPE) {
 
                case CF_CHAR:
-           AddCodeSegLine (CS, "sta ptr1");
-           AddCodeSegLine (CS, "stx ptr1+1");
+           AddCodeLine ("sta ptr1");
+           AddCodeLine ("stx ptr1+1");
            if (offs == 0) {
-               AddCodeSegLine (CS, "ldx #$00");
-               AddCodeSegLine (CS, "lda (ptr1,x)");
-                       AddCodeSegLine (CS, "sec");
-               AddCodeSegLine (CS, "sbc #$%02X", (unsigned char)val);
-               AddCodeSegLine (CS, "sta (ptr1,x)");
+               AddCodeLine ("ldx #$00");
+               AddCodeLine ("lda (ptr1,x)");
+                       AddCodeLine ("sec");
+               AddCodeLine ("sbc #$%02X", (unsigned char)val);
+               AddCodeLine ("sta (ptr1,x)");
            } else {
-                       AddCodeSegLine (CS, "ldy #$%02X", offs);
-               AddCodeSegLine (CS, "ldx #$00");
-               AddCodeSegLine (CS, "lda (ptr1),y");
-               AddCodeSegLine (CS, "sec");
-               AddCodeSegLine (CS, "sbc #$%02X", (unsigned char)val);
-               AddCodeSegLine (CS, "sta (ptr1),y");
+                       AddCodeLine ("ldy #$%02X", offs);
+               AddCodeLine ("ldx #$00");
+               AddCodeLine ("lda (ptr1),y");
+               AddCodeLine ("sec");
+               AddCodeLine ("sbc #$%02X", (unsigned char)val);
+               AddCodeLine ("sta (ptr1),y");
            }
            break;
 
                case CF_INT:
            if (CodeSizeFactor >= 200) {
                /* Lots of code, use only if size is not important */
-               AddCodeSegLine (CS, "sta ptr1");
-                       AddCodeSegLine (CS, "stx ptr1+1");
-               AddCodeSegLine (CS, "ldy #$%02X", offs);
-               AddCodeSegLine (CS, "lda (ptr1),y");
-               AddCodeSegLine (CS, "sec");
-               AddCodeSegLine (CS, "sbc #$%02X", (unsigned char)val);
-               AddCodeSegLine (CS, "sta (ptr1),y");
-               AddCodeSegLine (CS, "pha");
-               AddCodeSegLine (CS, "iny");
-               AddCodeSegLine (CS, "lda (ptr1),y");
-               AddCodeSegLine (CS, "sbc #$%02X", (unsigned char)(val >> 8));
-               AddCodeSegLine (CS, "sta (ptr1),y");
-               AddCodeSegLine (CS, "tax");
-               AddCodeSegLine (CS, "pla");
+               AddCodeLine ("sta ptr1");
+                       AddCodeLine ("stx ptr1+1");
+               AddCodeLine ("ldy #$%02X", offs);
+               AddCodeLine ("lda (ptr1),y");
+               AddCodeLine ("sec");
+               AddCodeLine ("sbc #$%02X", (unsigned char)val);
+               AddCodeLine ("sta (ptr1),y");
+               AddCodeLine ("pha");
+               AddCodeLine ("iny");
+               AddCodeLine ("lda (ptr1),y");
+               AddCodeLine ("sbc #$%02X", (unsigned char)(val >> 8));
+               AddCodeLine ("sta (ptr1),y");
+               AddCodeLine ("tax");
+               AddCodeLine ("pla");
                break;
            }
            /* FALL THROUGH */
 
                case CF_LONG:
-                   AddCodeSegLine (CS, "jsr pushax");          /* Push the address */
+                   AddCodeLine ("jsr pushax");         /* Push the address */
            push (flags);                       /* Correct the internal sp */
            g_getind (flags, offs);             /* Fetch the value */
            g_dec (flags, val);                 /* Increment value in primary */
@@ -2158,21 +2072,21 @@ void g_addaddr_local (unsigned flags, int offs)
     if (offs != 0) {
        /* We cannot address more then 256 bytes of locals anyway */
        CheckLocalOffs (offs);
-       AddCodeSegLine (CS, "clc");
-       AddCodeSegLine (CS, "adc #$%02X", offs & 0xFF);
-               AddCodeSegLine (CS, "bcc *+4"); /* Do also skip the CLC insn below */
-       AddCodeSegLine (CS, "inx");
+       AddCodeLine ("clc");
+       AddCodeLine ("adc #$%02X", offs & 0xFF);
+               AddCodeLine ("bcc *+4");        /* Do also skip the CLC insn below */
+       AddCodeLine ("inx");
        AddCodeHint ("x:!");                    /* Invalidate X */
     }
 
     /* Add the current stackpointer value */
-    AddCodeSegLine (CS, "clc");
-    AddCodeSegLine (CS, "adc sp");
-    AddCodeSegLine (CS, "tay");
-    AddCodeSegLine (CS, "txa");
-    AddCodeSegLine (CS, "adc sp+1");
-    AddCodeSegLine (CS, "tax");
-    AddCodeSegLine (CS, "tya");
+    AddCodeLine ("clc");
+    AddCodeLine ("adc sp");
+    AddCodeLine ("tay");
+    AddCodeLine ("txa");
+    AddCodeLine ("adc sp+1");
+    AddCodeLine ("tax");
+    AddCodeLine ("tya");
 }
 
 
@@ -2184,13 +2098,13 @@ void g_addaddr_static (unsigned flags, unsigned long label, unsigned offs)
     char* lbuf = GetLabelName (flags, label, offs);
 
     /* Add the address to the current ax value */
-    AddCodeSegLine (CS, "clc");
-    AddCodeSegLine (CS, "adc #<(%s)", lbuf);
-    AddCodeSegLine (CS, "tay");
-    AddCodeSegLine (CS, "txa");
-    AddCodeSegLine (CS, "adc #>(%s)", lbuf);
-    AddCodeSegLine (CS, "tax");
-    AddCodeSegLine (CS, "tya");
+    AddCodeLine ("clc");
+    AddCodeLine ("adc #<(%s)", lbuf);
+    AddCodeLine ("tay");
+    AddCodeLine ("txa");
+    AddCodeLine ("adc #>(%s)", lbuf);
+    AddCodeLine ("tax");
+    AddCodeLine ("tya");
 }
 
 
@@ -2209,18 +2123,18 @@ void g_save (unsigned flags)
 
        case CF_CHAR:
            if (flags & CF_FORCECHAR) {
-               AddCodeSegLine (CS, "pha");
+               AddCodeLine ("pha");
                break;
            }
            /* FALLTHROUGH */
 
        case CF_INT:
-           AddCodeSegLine (CS, "sta regsave");
-           AddCodeSegLine (CS, "stx regsave+1");
+           AddCodeLine ("sta regsave");
+           AddCodeLine ("stx regsave+1");
            break;
 
        case CF_LONG:
-           AddCodeSegLine (CS, "jsr saveeax");
+           AddCodeLine ("jsr saveeax");
            break;
 
        default:
@@ -2238,18 +2152,18 @@ void g_restore (unsigned flags)
 
        case CF_CHAR:
            if (flags & CF_FORCECHAR) {
-               AddCodeSegLine (CS, "pla");
+               AddCodeLine ("pla");
                break;
            }
            /* FALLTHROUGH */
 
        case CF_INT:
-           AddCodeSegLine (CS, "lda regsave");
-           AddCodeSegLine (CS, "ldx regsave+1");
+           AddCodeLine ("lda regsave");
+           AddCodeLine ("ldx regsave+1");
            break;
 
        case CF_LONG:
-           AddCodeSegLine (CS, "jsr resteax");
+           AddCodeLine ("jsr resteax");
            break;
 
        default:
@@ -2269,15 +2183,15 @@ void g_cmp (unsigned flags, unsigned long val)
 
        case CF_CHAR:
            if (flags & CF_FORCECHAR) {
-               AddCodeSegLine (CS, "cmp #$%02X", (unsigned char)val);
+               AddCodeLine ("cmp #$%02X", (unsigned char)val);
                break;
            }
            /* FALLTHROUGH */
 
        case CF_INT:
-           AddCodeSegLine (CS, "cmp #$%02X", (unsigned char)val);
-                   AddCodeSegLine (CS, "bne *+4");
-           AddCodeSegLine (CS, "cpx #$%02X", (unsigned char)(val >> 8));
+           AddCodeLine ("cmp #$%02X", (unsigned char)val);
+                   AddCodeLine ("bne *+4");
+           AddCodeLine ("cpx #$%02X", (unsigned char)(val >> 8));
            break;
 
         case CF_LONG:
@@ -2326,19 +2240,19 @@ static void oper (unsigned flags, unsigned long val, char** subs)
        /* Constant value given */
        if (val == 0 && subs [offs+0]) {
            /* Special case: constant with value zero */
-           AddCodeSegLine (CS, "jsr %s", subs [offs+0]);
+           AddCodeLine ("jsr %s", subs [offs+0]);
        } else if (val < 0x100 && subs [offs+1]) {
            /* Special case: constant with high byte zero */
            ldaconst (val);             /* Load low byte */
-           AddCodeSegLine (CS, "jsr %s", subs [offs+1]);
+           AddCodeLine ("jsr %s", subs [offs+1]);
        } else {
            /* Others: arbitrary constant value */
            g_getimmed (flags, val, 0);                 /* Load value */
-           AddCodeSegLine (CS, "jsr %s", subs [offs+2]);
+           AddCodeLine ("jsr %s", subs [offs+2]);
        }
     } else {
        /* Value not constant (is already in (e)ax) */
-       AddCodeSegLine (CS, "jsr %s", subs [offs+2]);
+       AddCodeLine ("jsr %s", subs [offs+2]);
     }
 
     /* The operation will pop it's argument */
@@ -2354,21 +2268,21 @@ void g_test (unsigned flags)
 
        case CF_CHAR:
            if (flags & CF_FORCECHAR) {
-               AddCodeSegLine (CS, "tax");
+               AddCodeLine ("tax");
                break;
            }
            /* FALLTHROUGH */
 
        case CF_INT:
-           AddCodeSegLine (CS, "stx tmp1");
-           AddCodeSegLine (CS, "ora tmp1");
+           AddCodeLine ("stx tmp1");
+           AddCodeLine ("ora tmp1");
            break;
 
        case CF_LONG:
            if (flags & CF_UNSIGNED) {
-               AddCodeSegLine (CS, "jsr utsteax");
+               AddCodeLine ("jsr utsteax");
            } else {
-               AddCodeSegLine (CS, "jsr tsteax");
+               AddCodeLine ("jsr tsteax");
            }
            break;
 
@@ -2393,9 +2307,9 @@ void g_push (unsigned flags, unsigned long val)
            /* Handle as 8 bit value */
            if (CodeSizeFactor >= 165 || val > 2) {
                ldaconst (val);
-               AddCodeSegLine (CS, "jsr pusha");
+               AddCodeLine ("jsr pusha");
            } else {
-               AddCodeSegLine (CS, "jsr pushc%d", (int) val);
+               AddCodeLine ("jsr pushc%d", (int) val);
            }
 
        } else {
@@ -2403,15 +2317,15 @@ void g_push (unsigned flags, unsigned long val)
            /* Handle as 16 bit value */
            hi = (unsigned char) (val >> 8);
            if (val <= 7) {
-               AddCodeSegLine (CS, "jsr push%u", (unsigned) val);
+               AddCodeLine ("jsr push%u", (unsigned) val);
            } else if (hi == 0 || hi == 0xFF) {
                /* Use special function */
                ldaconst (val);
-                       AddCodeSegLine (CS, "jsr %s", (hi == 0)? "pusha0" : "pushaFF");
+                       AddCodeLine ("jsr %s", (hi == 0)? "pusha0" : "pushaFF");
            } else {
                /* Long way ... */
                g_getimmed (flags, val, 0);
-               AddCodeSegLine (CS, "jsr pushax");
+               AddCodeLine ("jsr pushax");
            }
        }
 
@@ -2429,16 +2343,16 @@ void g_push (unsigned flags, unsigned long val)
            case CF_CHAR:
                if (flags & CF_FORCECHAR) {
                    /* Handle as char */
-                   AddCodeSegLine (CS, "jsr pusha");
+                   AddCodeLine ("jsr pusha");
                    break;
                }
                /* FALL THROUGH */
            case CF_INT:
-               AddCodeSegLine (CS, "jsr pushax");
+               AddCodeLine ("jsr pushax");
                break;
 
            case CF_LONG:
-               AddCodeSegLine (CS, "jsr pusheax");
+               AddCodeLine ("jsr pusheax");
                break;
 
            default:
@@ -2463,11 +2377,11 @@ void g_swap (unsigned flags)
 
        case CF_CHAR:
        case CF_INT:
-           AddCodeSegLine (CS, "jsr swapstk");
+           AddCodeLine ("jsr swapstk");
            break;
 
        case CF_LONG:
-           AddCodeSegLine (CS, "jsr swapestk");
+           AddCodeLine ("jsr swapestk");
            break;
 
        default:
@@ -2485,7 +2399,7 @@ void g_call (unsigned Flags, const char* Label, unsigned ArgSize)
        /* Pass the argument count */
        ldyconst (ArgSize);
     }
-    AddCodeSegLine (CS, "jsr _%s", Label);
+    AddCodeLine ("jsr _%s", Label);
     oursp += ArgSize;          /* callee pops args */
 }
 
@@ -2498,7 +2412,7 @@ void g_callind (unsigned Flags, unsigned ArgSize)
        /* Pass arg count */
        ldyconst (ArgSize);
     }
-    AddCodeSegLine (CS, "jsr callax"); /* do the call */
+    AddCodeLine ("jsr callax");        /* do the call */
     oursp += ArgSize;                  /* callee pops args */
 }
 
@@ -2507,7 +2421,7 @@ void g_callind (unsigned Flags, unsigned ArgSize)
 void g_jump (unsigned Label)
 /* Jump to specified internal label number */
 {
-    AddCodeSegLine (CS, "jmp %s", LocalLabelName (Label));
+    AddCodeLine ("jmp %s", LocalLabelName (Label));
 }
 
 
@@ -2519,11 +2433,11 @@ void g_switch (unsigned Flags)
 
        case CF_CHAR:
        case CF_INT:
-           AddCodeSegLine (CS, "jsr switch");
+           AddCodeLine ("jsr switch");
            break;
 
        case CF_LONG:
-           AddCodeSegLine (CS, "jsr lswitch");
+           AddCodeLine ("jsr lswitch");
            break;
 
        default:
@@ -2541,14 +2455,14 @@ void g_case (unsigned flags, unsigned label, unsigned long val)
 
        case CF_CHAR:
        case CF_INT:
-           AddCodeSegLine (CS, ".word $%04X, %s",
+           AddCodeLine (".word $%04X, %s",
                         (unsigned)(val & 0xFFFF),
                         LocalLabelName (label));
                    break;
 
        case CF_LONG:
-           AddCodeSegLine (CS, ".dword $%08lX", val);
-           AddCodeSegLine (CS, ".word %s", LocalLabelName (label));
+           AddCodeLine (".dword $%08lX", val);
+           AddCodeLine (".word %s", LocalLabelName (label));
            break;
 
        default:
@@ -2562,7 +2476,7 @@ void g_case (unsigned flags, unsigned label, unsigned long val)
 void g_truejump (unsigned flags, unsigned label)
 /* Jump to label if zero flag clear */
 {
-    AddCodeSegLine (CS, "jne %s", LocalLabelName (label));
+    AddCodeLine ("jne %s", LocalLabelName (label));
 }
 
 
@@ -2570,7 +2484,7 @@ void g_truejump (unsigned flags, unsigned label)
 void g_falsejump (unsigned flags, unsigned label)
 /* Jump to label if zero flag set */
 {
-    AddCodeSegLine (CS, "jeq %s", LocalLabelName (label));
+    AddCodeLine ("jeq %s", LocalLabelName (label));
 }
 
 
@@ -2578,11 +2492,11 @@ void g_falsejump (unsigned flags, unsigned label)
 static void mod_internal (int k, char* verb1, char* verb2)
 {
     if (k <= 8) {
-       AddCodeSegLine (CS, "jsr %ssp%c", verb1, k + '0');
+       AddCodeLine ("jsr %ssp%c", verb1, k + '0');
     } else {
        CheckLocalOffs (k);
        ldyconst (k);
-       AddCodeSegLine (CS, "jsr %ssp", verb2);
+       AddCodeLine ("jsr %ssp", verb2);
     }
 }
 
@@ -2603,7 +2517,7 @@ void g_space (int space)
 void g_cstackcheck (void)
 /* Check for a C stack overflow */
 {
-    AddCodeSegLine (CS, "jsr cstkchk");
+    AddCodeLine ("jsr cstkchk");
 }
 
 
@@ -2611,7 +2525,7 @@ void g_cstackcheck (void)
 void g_stackcheck (void)
 /* Check for a stack overflow */
 {
-    AddCodeSegLine (CS, "jsr stkchk");
+    AddCodeLine ("jsr stkchk");
 }
 
 
@@ -2700,27 +2614,27 @@ void g_mul (unsigned flags, unsigned long val)
                    switch (val) {
 
                        case 3:
-                           AddCodeSegLine (CS, "sta tmp1");
-                           AddCodeSegLine (CS, "asl a");
-                           AddCodeSegLine (CS, "clc");
-                           AddCodeSegLine (CS, "adc tmp1");
+                           AddCodeLine ("sta tmp1");
+                           AddCodeLine ("asl a");
+                           AddCodeLine ("clc");
+                           AddCodeLine ("adc tmp1");
                            return;
 
                        case 5:
-                           AddCodeSegLine (CS, "sta tmp1");
-                           AddCodeSegLine (CS, "asl a");
-                           AddCodeSegLine (CS, "asl a");
-                           AddCodeSegLine (CS, "clc");
-                           AddCodeSegLine (CS, "adc tmp1");
+                           AddCodeLine ("sta tmp1");
+                           AddCodeLine ("asl a");
+                           AddCodeLine ("asl a");
+                           AddCodeLine ("clc");
+                           AddCodeLine ("adc tmp1");
                            return;
 
                        case 10:
-                           AddCodeSegLine (CS, "sta tmp1");
-                           AddCodeSegLine (CS, "asl a");
-                           AddCodeSegLine (CS, "asl a");
-                           AddCodeSegLine (CS, "clc");
-                           AddCodeSegLine (CS, "adc tmp1");
-                           AddCodeSegLine (CS, "asl a");
+                           AddCodeLine ("sta tmp1");
+                           AddCodeLine ("asl a");
+                           AddCodeLine ("asl a");
+                           AddCodeLine ("clc");
+                           AddCodeLine ("adc tmp1");
+                           AddCodeLine ("asl a");
                            return;
                    }
                }
@@ -2826,7 +2740,7 @@ void g_or (unsigned flags, unsigned long val)
            case CF_CHAR:
                if (flags & CF_FORCECHAR) {
                    if ((val & 0xFF) != 0xFF) {
-                               AddCodeSegLine (CS, "ora #$%02X", (unsigned char)val);
+                               AddCodeLine ("ora #$%02X", (unsigned char)val);
                    }
                    return;
                }
@@ -2834,14 +2748,14 @@ void g_or (unsigned flags, unsigned long val)
 
            case CF_INT:
                if (val <= 0xFF) {
-                   AddCodeSegLine (CS, "ora #$%02X", (unsigned char)val);
+                   AddCodeLine ("ora #$%02X", (unsigned char)val);
                    return;
                }
                break;
 
            case CF_LONG:
                if (val <= 0xFF) {
-                   AddCodeSegLine (CS, "ora #$%02X", (unsigned char)val);
+                   AddCodeLine ("ora #$%02X", (unsigned char)val);
                    return;
                }
                break;
@@ -2884,7 +2798,7 @@ void g_xor (unsigned flags, unsigned long val)
            case CF_CHAR:
                if (flags & CF_FORCECHAR) {
                    if ((val & 0xFF) != 0) {
-                               AddCodeSegLine (CS, "eor #$%02X", (unsigned char)val);
+                               AddCodeLine ("eor #$%02X", (unsigned char)val);
                    }
                    return;
                }
@@ -2893,15 +2807,15 @@ void g_xor (unsigned flags, unsigned long val)
            case CF_INT:
                if (val <= 0xFF) {
                    if (val != 0) {
-                       AddCodeSegLine (CS, "eor #$%02X", (unsigned char)val);
+                       AddCodeLine ("eor #$%02X", (unsigned char)val);
                    }
                    return;
                } else if ((val & 0xFF) == 0) {
-                   AddCodeSegLine (CS, "pha");
-                   AddCodeSegLine (CS, "txa");
-                   AddCodeSegLine (CS, "eor #$%02X", (unsigned char)(val >> 8));
-                   AddCodeSegLine (CS, "tax");
-                   AddCodeSegLine (CS, "pla");
+                   AddCodeLine ("pha");
+                   AddCodeLine ("txa");
+                   AddCodeLine ("eor #$%02X", (unsigned char)(val >> 8));
+                   AddCodeLine ("tax");
+                   AddCodeLine ("pla");
                    return;
                }
                break;
@@ -2909,7 +2823,7 @@ void g_xor (unsigned flags, unsigned long val)
            case CF_LONG:
                if (val <= 0xFF) {
                    if (val != 0) {
-                               AddCodeSegLine (CS, "eor #$%02X", (unsigned char)val);
+                               AddCodeLine ("eor #$%02X", (unsigned char)val);
                    }
                    return;
                }
@@ -2951,7 +2865,7 @@ void g_and (unsigned flags, unsigned long val)
 
            case CF_CHAR:
                if (flags & CF_FORCECHAR) {
-                   AddCodeSegLine (CS, "and #$%02X", (unsigned char)val);
+                   AddCodeLine ("and #$%02X", (unsigned char)val);
                    return;
                }
                /* FALLTHROUGH */
@@ -2962,23 +2876,23 @@ void g_and (unsigned flags, unsigned long val)
                        if (val == 0) {
                            ldaconst (0);
                        } else if (val != 0xFF) {
-                           AddCodeSegLine (CS, "and #$%02X", (unsigned char)val);
+                           AddCodeLine ("and #$%02X", (unsigned char)val);
                        }
                    } else if ((val & 0xFF00) == 0xFF00) {
-                       AddCodeSegLine (CS, "and #$%02X", (unsigned char)val);
+                       AddCodeLine ("and #$%02X", (unsigned char)val);
                    } else if ((val & 0x00FF) == 0x0000) {
-                       AddCodeSegLine (CS, "txa");
-                       AddCodeSegLine (CS, "and #$%02X", (unsigned char)(val >> 8));
-                       AddCodeSegLine (CS, "tax");
+                       AddCodeLine ("txa");
+                       AddCodeLine ("and #$%02X", (unsigned char)(val >> 8));
+                       AddCodeLine ("tax");
                        ldaconst (0);
                    } else {
-                       AddCodeSegLine (CS, "tay");
-                       AddCodeSegLine (CS, "txa");
-                       AddCodeSegLine (CS, "and #$%02X", (unsigned char)(val >> 8));
-                       AddCodeSegLine (CS, "tax");
-                       AddCodeSegLine (CS, "tya");
+                       AddCodeLine ("tay");
+                       AddCodeLine ("txa");
+                       AddCodeLine ("and #$%02X", (unsigned char)(val >> 8));
+                       AddCodeLine ("tax");
+                       AddCodeLine ("tya");
                        if ((val & 0x00FF) != 0x00FF) {
-                           AddCodeSegLine (CS, "and #$%02X", (unsigned char)val);
+                           AddCodeLine ("and #$%02X", (unsigned char)val);
                        }
                    }
                }
@@ -2987,16 +2901,16 @@ void g_and (unsigned flags, unsigned long val)
            case CF_LONG:
                if (val <= 0xFF) {
                    ldxconst (0);
-                   AddCodeSegLine (CS, "stx sreg+1");
-                   AddCodeSegLine (CS, "stx sreg");
+                   AddCodeLine ("stx sreg+1");
+                   AddCodeLine ("stx sreg");
                    if ((val & 0xFF) != 0xFF) {
-                        AddCodeSegLine (CS, "and #$%02X", (unsigned char)val);
+                        AddCodeLine ("and #$%02X", (unsigned char)val);
                    }
                    return;
                } else if (val == 0xFF00) {
                    ldaconst (0);
-                   AddCodeSegLine (CS, "sta sreg+1");
-                   AddCodeSegLine (CS, "sta sreg");
+                   AddCodeLine ("sta sreg+1");
+                   AddCodeLine ("sta sreg");
                    return;
                }
                break;
@@ -3039,13 +2953,13 @@ void g_asr (unsigned flags, unsigned long val)
            case CF_INT:
                if (val >= 1 && val <= 3) {
                    if (flags & CF_UNSIGNED) {
-                       AddCodeSegLine (CS, "jsr shrax%ld", val);
+                       AddCodeLine ("jsr shrax%ld", val);
                    } else {
-                       AddCodeSegLine (CS, "jsr asrax%ld", val);
+                       AddCodeLine ("jsr asrax%ld", val);
                    }
                    return;
                } else if (val == 8 && (flags & CF_UNSIGNED)) {
-                   AddCodeSegLine (CS, "txa");
+                   AddCodeLine ("txa");
                    ldxconst (0);
                    return;
                }
@@ -3054,30 +2968,30 @@ void g_asr (unsigned flags, unsigned long val)
            case CF_LONG:
                if (val >= 1 && val <= 3) {
                    if (flags & CF_UNSIGNED) {
-                       AddCodeSegLine (CS, "jsr shreax%ld", val);
+                       AddCodeLine ("jsr shreax%ld", val);
                    } else {
-                       AddCodeSegLine (CS, "jsr asreax%ld", val);
+                       AddCodeLine ("jsr asreax%ld", val);
                    }
                    return;
                } else if (val == 8 && (flags & CF_UNSIGNED)) {
-                   AddCodeSegLine (CS, "txa");
-                   AddCodeSegLine (CS, "ldx sreg");
-                   AddCodeSegLine (CS, "ldy sreg+1");
-                   AddCodeSegLine (CS, "sty sreg");
-                   AddCodeSegLine (CS, "ldy #$00");
-                   AddCodeSegLine (CS, "sty sreg+1");
+                   AddCodeLine ("txa");
+                   AddCodeLine ("ldx sreg");
+                   AddCodeLine ("ldy sreg+1");
+                   AddCodeLine ("sty sreg");
+                   AddCodeLine ("ldy #$00");
+                   AddCodeLine ("sty sreg+1");
                    return;
                } else if (val == 16) {
-                   AddCodeSegLine (CS, "ldy #$00");
-                   AddCodeSegLine (CS, "ldx sreg+1");
+                   AddCodeLine ("ldy #$00");
+                   AddCodeLine ("ldx sreg+1");
                    if ((flags & CF_UNSIGNED) == 0) {
-                       AddCodeSegLine (CS, "bpl *+3");
-                       AddCodeSegLine (CS, "dey");
+                       AddCodeLine ("bpl *+3");
+                       AddCodeLine ("dey");
                        AddCodeHint ("y:!");
                    }
-                   AddCodeSegLine (CS, "lda sreg");
-                   AddCodeSegLine (CS, "sty sreg+1");
-                   AddCodeSegLine (CS, "sty sreg");
+                   AddCodeLine ("lda sreg");
+                   AddCodeLine ("sty sreg+1");
+                   AddCodeLine ("sty sreg");
                    return;
                }
                break;
@@ -3121,14 +3035,14 @@ void g_asl (unsigned flags, unsigned long val)
            case CF_INT:
                if (val >= 1 && val <= 3) {
                    if (flags & CF_UNSIGNED) {
-                       AddCodeSegLine (CS, "jsr shlax%ld", val);
+                       AddCodeLine ("jsr shlax%ld", val);
                    } else {
-                       AddCodeSegLine (CS, "jsr aslax%ld", val);
+                       AddCodeLine ("jsr aslax%ld", val);
                    }
                    return;
                } else if (val == 8) {
-                   AddCodeSegLine (CS, "tax");
-                   AddCodeSegLine (CS, "lda #$00");
+                   AddCodeLine ("tax");
+                   AddCodeLine ("lda #$00");
                    return;
                }
                break;
@@ -3136,23 +3050,23 @@ void g_asl (unsigned flags, unsigned long val)
            case CF_LONG:
                if (val >= 1 && val <= 3) {
                    if (flags & CF_UNSIGNED) {
-                       AddCodeSegLine (CS, "jsr shleax%ld", val);
+                       AddCodeLine ("jsr shleax%ld", val);
                    } else {
-                       AddCodeSegLine (CS, "jsr asleax%ld", val);
+                       AddCodeLine ("jsr asleax%ld", val);
                    }
                    return;
                } else if (val == 8) {
-                   AddCodeSegLine (CS, "ldy sreg");
-                   AddCodeSegLine (CS, "sty sreg+1");
-                   AddCodeSegLine (CS, "stx sreg");
-                   AddCodeSegLine (CS, "tax");
-                   AddCodeSegLine (CS, "lda #$00");
+                   AddCodeLine ("ldy sreg");
+                   AddCodeLine ("sty sreg+1");
+                   AddCodeLine ("stx sreg");
+                   AddCodeLine ("tax");
+                   AddCodeLine ("lda #$00");
                    return;
                } else if (val == 16) {
-                   AddCodeSegLine (CS, "stx sreg+1");
-                   AddCodeSegLine (CS, "sta sreg");
-                   AddCodeSegLine (CS, "lda #$00");
-                   AddCodeSegLine (CS, "tax");
+                   AddCodeLine ("stx sreg+1");
+                   AddCodeLine ("sta sreg");
+                   AddCodeLine ("lda #$00");
+                   AddCodeLine ("tax");
                    return;
                }
                break;
@@ -3181,11 +3095,11 @@ void g_neg (unsigned flags)
 
        case CF_CHAR:
        case CF_INT:
-           AddCodeSegLine (CS, "jsr negax");
+           AddCodeLine ("jsr negax");
            break;
 
        case CF_LONG:
-           AddCodeSegLine (CS, "jsr negeax");
+           AddCodeLine ("jsr negeax");
            break;
 
        default:
@@ -3201,15 +3115,15 @@ void g_bneg (unsigned flags)
     switch (flags & CF_TYPE) {
 
        case CF_CHAR:
-           AddCodeSegLine (CS, "jsr bnega");
+           AddCodeLine ("jsr bnega");
            break;
 
        case CF_INT:
-           AddCodeSegLine (CS, "jsr bnegax");
+           AddCodeLine ("jsr bnegax");
            break;
 
        case CF_LONG:
-           AddCodeSegLine (CS, "jsr bnegeax");
+           AddCodeLine ("jsr bnegeax");
            break;
 
        default:
@@ -3226,11 +3140,11 @@ void g_com (unsigned flags)
 
        case CF_CHAR:
        case CF_INT:
-           AddCodeSegLine (CS, "jsr complax");
+           AddCodeLine ("jsr complax");
            break;
 
        case CF_LONG:
-           AddCodeSegLine (CS, "jsr compleax");
+           AddCodeLine ("jsr compleax");
            break;
 
        default:
@@ -3256,11 +3170,11 @@ void g_inc (unsigned flags, unsigned long val)
            if (flags & CF_FORCECHAR) {
                if (CPU == CPU_65C02 && val <= 2) {
                    while (val--) {
-                       AddCodeSegLine (CS, "ina");
+                       AddCodeLine ("ina");
                    }
                } else {
-                   AddCodeSegLine (CS, "clc");
-                   AddCodeSegLine (CS, "adc #$%02X", (unsigned char)val);
+                   AddCodeLine ("clc");
+                   AddCodeLine ("adc #$%02X", (unsigned char)val);
                }
                break;
            }
@@ -3268,18 +3182,18 @@ void g_inc (unsigned flags, unsigned long val)
 
        case CF_INT:
            if (CPU == CPU_65C02 && val == 1) {
-               AddCodeSegLine (CS, "ina");
-               AddCodeSegLine (CS, "bne *+3");
-               AddCodeSegLine (CS, "inx");
+               AddCodeLine ("ina");
+               AddCodeLine ("bne *+3");
+               AddCodeLine ("inx");
                /* Tell the optimizer that the X register may be invalid */
                AddCodeHint ("x:!");
            } else if (CodeSizeFactor < 200) {
                /* Use jsr calls */
                if (val <= 8) {
-                   AddCodeSegLine (CS, "jsr incax%lu", val);
+                   AddCodeLine ("jsr incax%lu", val);
                } else if (val <= 255) {
                    ldyconst (val);
-                   AddCodeSegLine (CS, "jsr incaxy");
+                   AddCodeLine ("jsr incaxy");
                } else {
                    g_add (flags | CF_CONST, val);
                }
@@ -3287,31 +3201,31 @@ void g_inc (unsigned flags, unsigned long val)
                /* Inline the code */
                if (val < 0x300) {
                    if ((val & 0xFF) != 0) {
-                       AddCodeSegLine (CS, "clc");
-                       AddCodeSegLine (CS, "adc #$%02X", (unsigned char) val);
-                       AddCodeSegLine (CS, "bcc *+3");
-                       AddCodeSegLine (CS, "inx");
+                       AddCodeLine ("clc");
+                       AddCodeLine ("adc #$%02X", (unsigned char) val);
+                       AddCodeLine ("bcc *+3");
+                       AddCodeLine ("inx");
                        /* Tell the optimizer that the X register may be invalid */
                                AddCodeHint ("x:!");
                    }
                    if (val >= 0x100) {
-                       AddCodeSegLine (CS, "inx");
+                       AddCodeLine ("inx");
                    }
                    if (val >= 0x200) {
-                       AddCodeSegLine (CS, "inx");
+                       AddCodeLine ("inx");
                    }
                } else {
-                   AddCodeSegLine (CS, "clc");
+                   AddCodeLine ("clc");
                    if ((val & 0xFF) != 0) {
-                       AddCodeSegLine (CS, "adc #$%02X", (unsigned char) val);
+                       AddCodeLine ("adc #$%02X", (unsigned char) val);
                        /* Tell the optimizer that the X register may be invalid */
                        AddCodeHint ("x:!");
                    }
-                   AddCodeSegLine (CS, "pha");
-                   AddCodeSegLine (CS, "txa");
-                   AddCodeSegLine (CS, "adc #$%02X", (unsigned char) (val >> 8));
-                   AddCodeSegLine (CS, "tax");
-                   AddCodeSegLine (CS, "pla");
+                   AddCodeLine ("pha");
+                   AddCodeLine ("txa");
+                   AddCodeLine ("adc #$%02X", (unsigned char) (val >> 8));
+                   AddCodeLine ("tax");
+                   AddCodeLine ("pla");
                }
            }
            break;
@@ -3319,7 +3233,7 @@ void g_inc (unsigned flags, unsigned long val)
                case CF_LONG:
            if (val <= 255) {
                ldyconst (val);
-               AddCodeSegLine (CS, "jsr inceaxy");
+               AddCodeLine ("jsr inceaxy");
            } else {
                g_add (flags | CF_CONST, val);
            }
@@ -3349,11 +3263,11 @@ void g_dec (unsigned flags, unsigned long val)
            if (flags & CF_FORCECHAR) {
                if (CPU == CPU_65C02 && val <= 2) {
                    while (val--) {
-                       AddCodeSegLine (CS, "dea");
+                       AddCodeLine ("dea");
                    }
                } else {
-                   AddCodeSegLine (CS, "sec");
-                   AddCodeSegLine (CS, "sbc #$%02X", (unsigned char)val);
+                   AddCodeLine ("sec");
+                   AddCodeLine ("sbc #$%02X", (unsigned char)val);
                }
                break;
            }
@@ -3363,10 +3277,10 @@ void g_dec (unsigned flags, unsigned long val)
            if (CodeSizeFactor < 200) {
                /* Use subroutines */
                if (val <= 8) {
-                   AddCodeSegLine (CS, "jsr decax%d", (int) val);
+                   AddCodeLine ("jsr decax%d", (int) val);
                } else if (val <= 255) {
                    ldyconst (val);
-                   AddCodeSegLine (CS, "jsr decaxy");
+                   AddCodeLine ("jsr decaxy");
                } else {
                    g_sub (flags | CF_CONST, val);
                }
@@ -3374,31 +3288,31 @@ void g_dec (unsigned flags, unsigned long val)
                /* Inline the code */
                if (val < 0x300) {
                    if ((val & 0xFF) != 0) {
-                       AddCodeSegLine (CS, "sec");
-                       AddCodeSegLine (CS, "sbc #$%02X", (unsigned char) val);
-                       AddCodeSegLine (CS, "bcs *+3");
-                       AddCodeSegLine (CS, "dex");
+                       AddCodeLine ("sec");
+                       AddCodeLine ("sbc #$%02X", (unsigned char) val);
+                       AddCodeLine ("bcs *+3");
+                       AddCodeLine ("dex");
                        /* Tell the optimizer that the X register may be invalid */
                                AddCodeHint ("x:!");
                    }
                    if (val >= 0x100) {
-                       AddCodeSegLine (CS, "dex");
+                       AddCodeLine ("dex");
                    }
                    if (val >= 0x200) {
-                       AddCodeSegLine (CS, "dex");
+                       AddCodeLine ("dex");
                    }
                } else {
-                   AddCodeSegLine (CS, "sec");
+                   AddCodeLine ("sec");
                    if ((val & 0xFF) != 0) {
-                       AddCodeSegLine (CS, "sbc #$%02X", (unsigned char) val);
+                       AddCodeLine ("sbc #$%02X", (unsigned char) val);
                        /* Tell the optimizer that the X register may be invalid */
                        AddCodeHint ("x:!");
                    }
-                   AddCodeSegLine (CS, "pha");
-                   AddCodeSegLine (CS, "txa");
-                   AddCodeSegLine (CS, "sbc #$%02X", (unsigned char) (val >> 8));
-                   AddCodeSegLine (CS, "tax");
-                   AddCodeSegLine (CS, "pla");
+                   AddCodeLine ("pha");
+                   AddCodeLine ("txa");
+                   AddCodeLine ("sbc #$%02X", (unsigned char) (val >> 8));
+                   AddCodeLine ("tax");
+                   AddCodeLine ("pla");
                }
            }
            break;
@@ -3406,7 +3320,7 @@ void g_dec (unsigned flags, unsigned long val)
        case CF_LONG:
            if (val <= 255) {
                ldyconst (val);
-               AddCodeSegLine (CS, "jsr deceaxy");
+               AddCodeLine ("jsr deceaxy");
            } else {
                g_sub (flags | CF_CONST, val);
            }
@@ -3447,17 +3361,17 @@ void g_eq (unsigned flags, unsigned long val)
 
            case CF_CHAR:
                if (flags & CF_FORCECHAR) {
-                   AddCodeSegLine (CS, "cmp #$%02X", (unsigned char)val);
-                   AddCodeSegLine (CS, "jsr booleq");
+                   AddCodeLine ("cmp #$%02X", (unsigned char)val);
+                   AddCodeLine ("jsr booleq");
                    return;
                }
                /* FALLTHROUGH */
 
            case CF_INT:
-               AddCodeSegLine (CS, "cpx #$%02X", (unsigned char)(val >> 8));
-                       AddCodeSegLine (CS, "bne *+4");
-               AddCodeSegLine (CS, "cmp #$%02X", (unsigned char)val);
-               AddCodeSegLine (CS, "jsr booleq");
+               AddCodeLine ("cpx #$%02X", (unsigned char)(val >> 8));
+                       AddCodeLine ("bne *+4");
+               AddCodeLine ("cmp #$%02X", (unsigned char)val);
+               AddCodeLine ("jsr booleq");
                return;
 
            case CF_LONG:
@@ -3500,17 +3414,17 @@ void g_ne (unsigned flags, unsigned long val)
 
            case CF_CHAR:
                if (flags & CF_FORCECHAR) {
-                   AddCodeSegLine (CS, "cmp #$%02X", (unsigned char)val);
-                   AddCodeSegLine (CS, "jsr boolne");
+                   AddCodeLine ("cmp #$%02X", (unsigned char)val);
+                   AddCodeLine ("jsr boolne");
                    return;
                }
                /* FALLTHROUGH */
 
            case CF_INT:
-               AddCodeSegLine (CS, "cpx #$%02X", (unsigned char)(val >> 8));
-               AddCodeSegLine (CS, "bne *+4");
-               AddCodeSegLine (CS, "cmp #$%02X", (unsigned char)val);
-               AddCodeSegLine (CS, "jsr boolne");
+               AddCodeLine ("cpx #$%02X", (unsigned char)(val >> 8));
+               AddCodeLine ("bne *+4");
+               AddCodeLine ("cmp #$%02X", (unsigned char)val);
+               AddCodeLine ("jsr boolne");
                return;
 
            case CF_LONG:
@@ -3558,11 +3472,11 @@ void g_lt (unsigned flags, unsigned long val)
 
            case CF_CHAR:
                if (flags & CF_FORCECHAR) {
-                   AddCodeSegLine (CS, "cmp #$%02X", (unsigned char)val);
+                   AddCodeLine ("cmp #$%02X", (unsigned char)val);
                    if (flags & CF_UNSIGNED) {
-                       AddCodeSegLine (CS, "jsr boolult");
+                       AddCodeLine ("jsr boolult");
                    } else {
-                       AddCodeSegLine (CS, "jsr boollt");
+                       AddCodeLine ("jsr boollt");
                    }
                    return;
                }
@@ -3573,16 +3487,16 @@ void g_lt (unsigned flags, unsigned long val)
                    /* If we have a signed compare against zero, we only need to
                     * test the high byte.
                     */
-                   AddCodeSegLine (CS, "txa");
-                   AddCodeSegLine (CS, "jsr boollt");
+                   AddCodeLine ("txa");
+                   AddCodeLine ("jsr boollt");
                    return;
                }
                /* Direct code only for unsigned data types */
                if (flags & CF_UNSIGNED) {
-                   AddCodeSegLine (CS, "cpx #$%02X", (unsigned char)(val >> 8));
-                           AddCodeSegLine (CS, "bne *+4");
-                   AddCodeSegLine (CS, "cmp #$%02X", (unsigned char)val);
-                   AddCodeSegLine (CS, "jsr boolult");
+                   AddCodeLine ("cpx #$%02X", (unsigned char)(val >> 8));
+                           AddCodeLine ("bne *+4");
+                   AddCodeLine ("cmp #$%02X", (unsigned char)val);
+                   AddCodeLine ("jsr boolult");
                    return;
                }
                break;
@@ -3628,11 +3542,11 @@ void g_le (unsigned flags, unsigned long val)
 
            case CF_CHAR:
                if (flags & CF_FORCECHAR) {
-                   AddCodeSegLine (CS, "cmp #$%02X", (unsigned char)val);
+                   AddCodeLine ("cmp #$%02X", (unsigned char)val);
                    if (flags & CF_UNSIGNED) {
-                       AddCodeSegLine (CS, "jsr boolule");
+                       AddCodeLine ("jsr boolule");
                    } else {
-                       AddCodeSegLine (CS, "jsr boolle");
+                       AddCodeLine ("jsr boolle");
                    }
                    return;
                }
@@ -3640,10 +3554,10 @@ void g_le (unsigned flags, unsigned long val)
 
            case CF_INT:
                if (flags & CF_UNSIGNED) {
-                   AddCodeSegLine (CS, "cpx #$%02X", (unsigned char)(val >> 8));
-                           AddCodeSegLine (CS, "bne *+4");
-                   AddCodeSegLine (CS, "cmp #$%02X", (unsigned char)val);
-                   AddCodeSegLine (CS, "jsr boolule");
+                   AddCodeLine ("cpx #$%02X", (unsigned char)(val >> 8));
+                           AddCodeLine ("bne *+4");
+                   AddCodeLine ("cmp #$%02X", (unsigned char)val);
+                   AddCodeLine ("jsr boolule");
                    return;
                }
                break;
@@ -3689,19 +3603,19 @@ void g_gt (unsigned flags, unsigned long val)
 
            case CF_CHAR:
                if (flags & CF_FORCECHAR) {
-                   AddCodeSegLine (CS, "cmp #$%02X", (unsigned char)val);
+                   AddCodeLine ("cmp #$%02X", (unsigned char)val);
                    if (flags & CF_UNSIGNED) {
                        /* If we have a compare > 0, we will replace it by
                         * != 0 here, since both are identical but the latter
                         * is easier to optimize.
                         */
                        if (val & 0xFF) {
-                           AddCodeSegLine (CS, "jsr boolugt");
+                           AddCodeLine ("jsr boolugt");
                        } else {
-                           AddCodeSegLine (CS, "jsr boolne");
+                           AddCodeLine ("jsr boolne");
                        }
                    } else {
-                       AddCodeSegLine (CS, "jsr boolgt");
+                       AddCodeLine ("jsr boolgt");
                    }
                    return;
                }
@@ -3714,14 +3628,14 @@ void g_gt (unsigned flags, unsigned long val)
                     * is easier to optimize.
                     */
                    if ((val & 0xFFFF) == 0) {
-                       AddCodeSegLine (CS, "stx tmp1");
-                       AddCodeSegLine (CS, "ora tmp1");
-                       AddCodeSegLine (CS, "jsr boolne");
+                       AddCodeLine ("stx tmp1");
+                       AddCodeLine ("ora tmp1");
+                       AddCodeLine ("jsr boolne");
                    } else {
-                               AddCodeSegLine (CS, "cpx #$%02X", (unsigned char)(val >> 8));
-                       AddCodeSegLine (CS, "bne *+4");
-                       AddCodeSegLine (CS, "cmp #$%02X", (unsigned char)val);
-                               AddCodeSegLine (CS, "jsr boolugt");
+                               AddCodeLine ("cpx #$%02X", (unsigned char)(val >> 8));
+                       AddCodeLine ("bne *+4");
+                       AddCodeLine ("cmp #$%02X", (unsigned char)val);
+                               AddCodeLine ("jsr boolugt");
                    }
                    return;
                        }
@@ -3773,11 +3687,11 @@ void g_ge (unsigned flags, unsigned long val)
 
            case CF_CHAR:
                if (flags & CF_FORCECHAR) {
-                   AddCodeSegLine (CS, "cmp #$%02X", (unsigned char)val);
+                   AddCodeLine ("cmp #$%02X", (unsigned char)val);
                    if (flags & CF_UNSIGNED) {
-                       AddCodeSegLine (CS, "jsr booluge");
+                       AddCodeLine ("jsr booluge");
                    } else {
-                       AddCodeSegLine (CS, "jsr boolge");
+                       AddCodeLine ("jsr boolge");
                    }
                    return;
                }
@@ -3785,10 +3699,10 @@ void g_ge (unsigned flags, unsigned long val)
 
            case CF_INT:
                if (flags & CF_UNSIGNED) {
-                           AddCodeSegLine (CS, "cpx #$%02X", (unsigned char)(val >> 8));
-                           AddCodeSegLine (CS, "bne *+4");
-                   AddCodeSegLine (CS, "cmp #$%02X", (unsigned char)val);
-                   AddCodeSegLine (CS, "jsr booluge");
+                           AddCodeLine ("cpx #$%02X", (unsigned char)(val >> 8));
+                           AddCodeLine ("bne *+4");
+                   AddCodeLine ("cmp #$%02X", (unsigned char)val);
+                   AddCodeLine ("jsr booluge");
                    return;
                }
                break;
@@ -3822,7 +3736,7 @@ void g_ge (unsigned flags, unsigned long val)
 void g_res (unsigned n)
 /* Reserve static storage, n bytes */
 {
-    AddDataSegLine (DS, "\t.res\t%u,$00", n);
+    AddDataLine ("\t.res\t%u,$00", n);
 }
 
 
@@ -3836,15 +3750,15 @@ void g_defdata (unsigned flags, unsigned long val, unsigned offs)
        switch (flags & CF_TYPE) {
 
            case CF_CHAR:
-               AddDataSegLine (DS, "\t.byte\t$%02lX", val & 0xFF);
+               AddDataLine ("\t.byte\t$%02lX", val & 0xFF);
                break;
 
            case CF_INT:
-               AddDataSegLine (DS, "\t.word\t$%04lX", val & 0xFFFF);
+               AddDataLine ("\t.word\t$%04lX", val & 0xFFFF);
                break;
 
            case CF_LONG:
-               AddDataSegLine (DS, "\t.dword\t$%08lX", val & 0xFFFFFFFF);
+               AddDataLine ("\t.dword\t$%08lX", val & 0xFFFFFFFF);
                break;
 
            default:
@@ -3859,7 +3773,7 @@ void g_defdata (unsigned flags, unsigned long val, unsigned offs)
        const char* Label = GetLabelName (flags, val, offs);
 
        /* Labels are always 16 bit */
-       AddDataSegLine (DS, "\t.word\t%s", Label);
+       AddDataLine ("\t.word\t%s", Label);
 
     }
 }
@@ -3896,7 +3810,7 @@ void g_defbytes (const void* Bytes, unsigned Count)
        } while (Chunk);
 
        /* Output the line */
-               AddDataSegLine (DS, Buf);
+               AddDataLine (Buf);
     }
 }
 
@@ -3905,7 +3819,7 @@ void g_defbytes (const void* Bytes, unsigned Count)
 void g_zerobytes (unsigned n)
 /* Output n bytes of data initialized with zero */
 {
-    AddDataSegLine (DS, "\t.res\t%u,$00", n);
+    AddDataLine ("\t.res\t%u,$00", n);
 }
 
 
@@ -3922,9 +3836,9 @@ void g_asmcode (const char* Line, int Len)
  */
 {
     if (Len >= 0) {
-       AddCodeSegLine (CS, "%.*s", Len, Line);
+       AddCodeLine ("%.*s", Len, Line);
     } else {
-       AddCodeSegLine (CS, "%s", Line);
+       AddCodeLine ("%s", Line);
     }
 }
 
@@ -3949,31 +3863,31 @@ void g_strlen (unsigned flags, unsigned long val, unsigned offs)
        char* lbuf = GetLabelName (flags, val, offs);
 
        /* Generate the strlen code */
-       AddCodeSegLine (CS, "ldy #$FF");
+       AddCodeLine ("ldy #$FF");
        g_defcodelabel (label);
-       AddCodeSegLine (CS, "iny");
-       AddCodeSegLine (CS, "lda %s,y", lbuf);
-       AddCodeSegLine (CS, "bne %s", LocalLabelName (label));
-               AddCodeSegLine (CS, "tax");
-       AddCodeSegLine (CS, "tya");
+       AddCodeLine ("iny");
+       AddCodeLine ("lda %s,y", lbuf);
+       AddCodeLine ("bne %s", LocalLabelName (label));
+               AddCodeLine ("tax");
+       AddCodeLine ("tya");
 
     } else {
 
                /* Address not constant but in primary */
        if (CodeSizeFactor < 400) {
            /* This is too much code, so call strlen instead of inlining */
-           AddCodeSegLine (CS, "jsr _strlen");
+           AddCodeLine ("jsr _strlen");
        } else {
            /* Inline the function */
-           AddCodeSegLine (CS, "sta ptr1");
-           AddCodeSegLine (CS, "stx ptr1+1");
-           AddCodeSegLine (CS, "ldy #$FF");
+           AddCodeLine ("sta ptr1");
+           AddCodeLine ("stx ptr1+1");
+           AddCodeLine ("ldy #$FF");
            g_defcodelabel (label);
-           AddCodeSegLine (CS, "iny");
-           AddCodeSegLine (CS, "lda (ptr1),y");
-           AddCodeSegLine (CS, "bne %s", LocalLabelName (label));
-                   AddCodeSegLine (CS, "tax");
-           AddCodeSegLine (CS, "tya");
+           AddCodeLine ("iny");
+           AddCodeLine ("lda (ptr1),y");
+           AddCodeLine ("bne %s", LocalLabelName (label));
+                   AddCodeLine ("tax");
+           AddCodeLine ("tya");
        }
     }
 }
index b04b5c9d848382e78fcfaaebbd48ec8c9c7ab61f..02b9fadeee440a8ec2425799cb19c526c5c56859 100644 (file)
 
 
 
-/*****************************************************************************/
-/*                                Forwards                                  */
-/*****************************************************************************/
-
-
-
-struct CodeSeg;
-struct DataSeg;
+/* cc65 */
+#include "segments.h"
 
 
 
@@ -109,12 +103,6 @@ void g_preamble (void);
 
 
 
-void g_pushseg (struct CodeSeg** CS, struct DataSeg** DS, const char* FuncName);
-/* Push the current segments and generate new ones for the given function */
-
-void g_popseg (void);
-/* Restore the old segments */
-
 void g_userodata (void);
 /* Switch to the read only data segment */
 
@@ -124,18 +112,6 @@ void g_usedata (void);
 void g_usebss (void);
 /* Switch to the bss segment */
 
-void g_codename (const char* Name);
-/* Set the name of the CODE segment */
-
-void g_rodataname (const char* Name);
-/* Set the name of the RODATA segment */
-
-void g_dataname (const char* Name);
-/* Set the name of the DATA segment */
-
-void g_bssname (const char* Name);
-/* Set the name of the BSS segment */
-
 
 
 /*****************************************************************************/
index 55069c3f96e9cab1670df2ae1ad8243042e63ce1..237e50a326113a3984ef74636fa56fc0878eba28 100644 (file)
@@ -36,7 +36,7 @@
 /* common */
 #include "xmalloc.h"
 
-/* cc65 */      
+/* cc65 */
 #include "codeent.h"
 #include "codelab.h"
 
@@ -107,7 +107,7 @@ unsigned RemoveLabelRef (CodeLabel* L, const struct CodeEntry* E)
 
 
 
-void OutputCodeLabel (FILE* F, const CodeLabel* L)
+void OutputCodeLabel (const CodeLabel* L, FILE* F)
 /* Output the code label to a file */
 {
     fprintf (F, "%s:", L->Name);
index 203d16bd899299f5fdf76806cfaafa0598ab7d90..6198428625fcf0605350c98b9bb879062d047e0d 100644 (file)
@@ -95,7 +95,7 @@ void AddLabelRef (CodeLabel* L, struct CodeEntry* E);
 unsigned RemoveLabelRef (CodeLabel* L, const struct CodeEntry* E);
 /* Remove a reference to this label, return the number of remaining references */
 
-void OutputCodeLabel (FILE* F, const CodeLabel* L);
+void OutputCodeLabel (const CodeLabel* L, FILE* F);
 /* Output the code label to a file */
 
 
index a0c7be7178fb75893dc42b3a6dff382a1cf10925..15fc482504001a056bd09737c431372992ece043 100644 (file)
@@ -88,7 +88,7 @@ static void OptDeadJumps (CodeSeg* S)
        if (E->AM == AM_BRA && E->JumpTo && E->JumpTo->Owner == CollAt (&S->Entries, I+1)) {
 
            /* Delete the dead jump */
-           DelCodeSegLine (S, I);
+           DelCodeEntry (S, I);
 
            /* Keep the number of entries updated */
            --Count;
@@ -140,7 +140,7 @@ static void OptDeadCode (CodeSeg* S)
                    !CodeEntryHasLabel (CollAt (&S->Entries, I+1))) {
 
            /* Delete the next entry */
-           DelCodeSegLine (S, I+1);
+           DelCodeEntry (S, I+1);
 
            /* Keep the number of entries updated */
            --Count;
index 264bee2f7ca1c2aace6c437fdfeae07e8727c414..c0be35a021ce5cec53b9a823cae17dbcbb9fab3c 100644 (file)
 
 
 
-/*****************************************************************************/
-/*                                  Data                                    */
-/*****************************************************************************/
-
-
-
-/* Pointer to current code segment */
-CodeSeg* CS = 0;
-
-
-
 /*****************************************************************************/
 /*                   Functions for parsing instructions                     */
 /*****************************************************************************/
@@ -309,7 +298,7 @@ static CodeEntry* ParseInsn (CodeSeg* S, const char* L)
 
 
 
-CodeSeg* NewCodeSeg (const char* SegName, const char* FuncName)
+CodeSeg* NewCodeSeg (const char* SegName, SymEntry* Func)
 /* Create a new code segment, initialize and return it */
 {
     unsigned I;
@@ -318,9 +307,8 @@ CodeSeg* NewCodeSeg (const char* SegName, const char* FuncName)
     CodeSeg* S = xmalloc (sizeof (CodeSeg));
 
     /* Initialize the fields */
-    S->Next     = 0;
     S->SegName  = xstrdup (SegName);
-    S->FuncName        = xstrdup (FuncName);
+    S->Func    = Func;
     InitCollection (&S->Entries);
     InitCollection (&S->Labels);
     for (I = 0; I < sizeof(S->LabelHash) / sizeof(S->LabelHash[0]); ++I) {
@@ -336,39 +324,12 @@ CodeSeg* NewCodeSeg (const char* SegName, const char* FuncName)
 void FreeCodeSeg (CodeSeg* S)
 /* Free a code segment including all code entries */
 {
-    FAIL ("Not implemented");
+    Internal ("Not implemented");
 }
 
 
 
-void PushCodeSeg (CodeSeg* S)
-/* Push the given code segment onto the stack */
-{
-    S->Next = CS;
-    CS     = S;
-}
-
-
-
-CodeSeg* PopCodeSeg (void)
-/* Remove the current code segment from the stack and return it */
-{
-    /* Remember the current code segment */
-    CodeSeg* S = CS;
-
-    /* Cannot pop on empty stack */
-    PRECONDITION (S != 0);
-
-    /* Pop */
-    CS = S->Next;
-
-    /* Return the popped code segment */
-    return S;
-}
-
-
-
-void AddCodeSegLine (CodeSeg* S, const char* Format, ...)
+void AddCodeEntry (CodeSeg* S, const char* Format, va_list ap)
 /* Add a line to the given code segment */
 {
     const char* L;
@@ -376,11 +337,8 @@ void AddCodeSegLine (CodeSeg* S, const char* Format, ...)
     char       Token[64];
 
     /* Format the line */
-    va_list ap;
     char Buf [256];
-    va_start (ap, Format);
     xvsprintf (Buf, sizeof (Buf), Format, ap);
-    va_end (ap);
 
     /* Skip whitespace */
     L = SkipSpace (Buf);
@@ -436,7 +394,7 @@ void AddCodeSegLine (CodeSeg* S, const char* Format, ...)
 
 
 
-void DelCodeSegLine (CodeSeg* S, unsigned Index)
+void DelCodeEntry (CodeSeg* S, unsigned Index)
 /* Delete an entry from the code segment. This includes deleting any associated
  * labels, removing references to labels and even removing the referenced labels
  * if the reference count drops to zero.
@@ -592,7 +550,7 @@ void DelCodeSegAfter (CodeSeg* S, unsigned Last)
 
 
 
-void OutputCodeSeg (FILE* F, const CodeSeg* S)
+void OutputCodeSeg (const CodeSeg* S, FILE* F)
 /* Output the code segment data to a file */
 {
     unsigned I;
@@ -600,31 +558,26 @@ void OutputCodeSeg (FILE* F, const CodeSeg* S)
     /* Get the number of entries in this segment */
     unsigned Count = CollCount (&S->Entries);
 
-    fprintf (F, "; Labels: ");
-    for (I = 0; I < CS_LABEL_HASH_SIZE; ++I) {
-       const CodeLabel* L = S->LabelHash[I];
-       while (L) {
-           fprintf (F, "%s ", L->Name);
-           L = L->Next;
-       }
+    /* If the code segment is empty, bail out here */
+    if (Count == 0) {
+       return;
     }
-    fprintf (F, "\n");
 
     /* Output the segment directive */
     fprintf (F, ".segment\t\"%s\"\n\n", S->SegName);
 
     /* If this is a segment for a function, enter a function */
-    if (S->FuncName[0] != '\0') {
-       fprintf (F, ".proc\t_%s\n\n", S->FuncName);
+    if (S->Func) {
+       fprintf (F, ".proc\t_%s\n\n", S->Func->Name);
     }
 
     /* Output all entries */
     for (I = 0; I < Count; ++I) {
-       OutputCodeEntry (F, CollConstAt (&S->Entries, I));
+       OutputCodeEntry (CollConstAt (&S->Entries, I), F);
     }
 
     /* If this is a segment for a function, leave the function */
-    if (S->FuncName[0] != '\0') {
+    if (S->Func) {
        fprintf (F, "\n.endproc\n\n");
     }
 }
index d09f07a8ce6efc295120c49692f7b41e6aa07b76..91b8536ecdff28267399268d3f5a0db31aff63cb 100644 (file)
@@ -37,7 +37,8 @@
 #define CODESEG_H
 
 
-
+                 
+#include <stdarg.h>
 #include <stdio.h>
 
 /* common */
 
 /* cc65 */
 #include "codelab.h"
+#include "symentry.h"
 
 
 
 /*****************************************************************************/
-/*                                  Data                                    */
+/*                                  Data                                    */
 /*****************************************************************************/
 
 
 /* Code segment structure */
 typedef struct CodeSeg CodeSeg;
 struct CodeSeg {
-    CodeSeg*   Next;                           /* Pointer to next CodeSeg */
     char*      SegName;                        /* Segment name */
-    char*      FuncName;                       /* Name of function */
+    SymEntry*  Func;                           /* Owner function */
     Collection Entries;                        /* List of code entries */
     Collection Labels;                         /* Labels for next insn */
     CodeLabel*         LabelHash [CS_LABEL_HASH_SIZE]; /* Label hash table */
 };
 
-/* Pointer to current code segment */
-extern CodeSeg* CS;
-
 
 
 /*****************************************************************************/
-/*                                          Code                                    */
+/*                                          Code                                    */
 /*****************************************************************************/
 
 
 
-CodeSeg* NewCodeSeg (const char* SegName, const char* FuncName);
+CodeSeg* NewCodeSeg (const char* SegName, SymEntry* Func);
 /* Create a new code segment, initialize and return it */
 
 void FreeCodeSeg (CodeSeg* S);
 /* Free a code segment including all code entries */
 
-void PushCodeSeg (CodeSeg* S);
-/* Push the given code segment onto the stack */
-
-CodeSeg* PopCodeSeg (void);
-/* Remove the current code segment from the stack and return it */
-
-void AddCodeSegLine (CodeSeg* S, const char* Format, ...) attribute ((format(printf,2,3)));
+void AddCodeEntry (CodeSeg* S, const char* Format, va_list ap) attribute ((format(printf,2,0)));
 /* Add a line to the given code segment */
 
-void DelCodeSegLine (CodeSeg* S, unsigned Index);
+void DelCodeEntry (CodeSeg* S, unsigned Index);
 /* Delete an entry from the code segment. This includes deleting any associated
  * labels, removing references to labels and even removing the referenced labels
  * if the reference count drops to zero.
@@ -113,7 +105,7 @@ void AddCodeSegHint (CodeSeg* S, unsigned Hint);
 void DelCodeSegAfter (CodeSeg* S, unsigned Last);
 /* Delete all entries including the given one */
 
-void OutputCodeSeg (FILE* F, const CodeSeg* S);
+void OutputCodeSeg (const CodeSeg* S, FILE* F);
 /* Output the code segment data to a file */
 
 CodeLabel* FindCodeLabel (CodeSeg* S, const char* Name, unsigned Hash);
index 72f7828532db504d7154e8b72a6556f3a2edd97f..980246a05e48d674520bfbb6cc4f6f235cc531f6 100644 (file)
 #include "xsprintf.h"
 
 /* cc65 */
+#include "error.h"
 #include "dataseg.h"
 
 
 
-/*****************************************************************************/
-/*                                  Data                                    */
-/*****************************************************************************/
-
-
-
-/* Pointer to current data segment */
-DataSeg* DS = 0;
-
-
-
 /*****************************************************************************/
 /*                                          Code                                    */
 /*****************************************************************************/
 
 
 
-DataSeg* NewDataSeg (const char* Name)
+DataSeg* NewDataSeg (const char* Name, SymEntry* Func)
 /* Create a new data segment, initialize and return it */
 {
     /* Allocate memory */
-    DataSeg* S = xmalloc (sizeof (DataSeg));
+    DataSeg* S = xmalloc (sizeof (DataSeg));
 
     /* Initialize the fields */
-    S->Next = 0;
-    S->Name = xstrdup (Name);
+    S->SegName = xstrdup (Name);
+    S->Func    = Func;
     InitCollection (&S->Lines);
 
     /* Return the new struct */
@@ -80,50 +70,7 @@ DataSeg* NewDataSeg (const char* Name)
 void FreeDataSeg (DataSeg* S)
 /* Free a data segment including all line entries */
 {
-    unsigned I, Count;
-                            
-    /* Free the name */
-    xfree (S->Name);
-
-    /* Free the lines */
-    Count = CollCount (&S->Lines);
-    for (I = 0; I < Count; ++I) {
-       xfree (CollAt (&S->Lines, I));
-    }
-
-    /* Free the collection */
-    DoneCollection (&S->Lines);
-
-    /* Free the struct */
-    xfree (S);
-}
-
-
-
-void PushDataSeg (DataSeg* S)
-/* Push the given data segment onto the stack */
-{
-    /* Push */
-    S->Next = DS;
-    DS     = S;
-}
-
-
-
-DataSeg* PopDataSeg (void)
-/* Remove the current data segment from the stack and return it */
-{
-    /* Remember the current data segment */
-    DataSeg* S = DS;
-
-    /* Cannot pop on empty stack */
-    PRECONDITION (S != 0);
-
-    /* Pop */
-    DS = S->Next;
-
-    /* Return the popped data segment */
-    return S;
+    Internal ("Not implemented");
 }
 
 
@@ -142,16 +89,12 @@ void AppendDataSeg (DataSeg* Target, const DataSeg* Source)
 
 
 
-void AddDataSegLine (DataSeg* S, const char* Format, ...)
+void AddDataEntry (DataSeg* S, const char* Format, va_list ap)
 /* Add a line to the given data segment */
 {
-    va_list ap;
-    char Buf [256];
-
     /* Format the line */
-    va_start (ap, Format);
+    char Buf [256];
     xvsprintf (Buf, sizeof (Buf), Format, ap);
-    va_end (ap);
 
     /* Add a copy to the data segment */
     CollAppend (&S->Lines, xstrdup (Buf));
@@ -159,7 +102,7 @@ void AddDataSegLine (DataSeg* S, const char* Format, ...)
 
 
 
-void OutputDataSeg (FILE* F, const DataSeg* S)
+void OutputDataSeg (const DataSeg* S, FILE* F)
 /* Output the data segment data to a file */
 {
     unsigned I;
@@ -167,10 +110,21 @@ void OutputDataSeg (FILE* F, const DataSeg* S)
     /* Get the number of entries in this segment */
     unsigned Count = CollCount (&S->Lines);
 
+    /* If the segment is actually empty, bail out */
+    if (Count == 0) {
+       return;
+    }
+
+    /* Output the segment directive */
+    fprintf (F, ".segment\t\"%s\"\n\n", S->SegName);
+
     /* Output all entries */
     for (I = 0; I < Count; ++I) {
        fprintf (F, "%s\n", (const char*) CollConstAt (&S->Lines, I));
     }
+
+    /* Add an additional newline after the segment output */
+    fprintf (F, "\n");
 }
 
 
index e03c3721165797db579bb2b253b77634d850d083..ab62442d98c61efedb4e1129cc1c2d6e1780ac0e 100644 (file)
 
 
 
+#include <stdarg.h>
 #include <stdio.h>
 
 /* common */
 #include "attrib.h"
 #include "coll.h"
 
+/* cc65 */
+#include "symentry.h"
+
 
 
 /*****************************************************************************/
-/*                                  Data                                    */
+/*                                  Data                                    */
 /*****************************************************************************/
 
 
 
 typedef struct DataSeg DataSeg;
 struct DataSeg {
-    DataSeg*           Next;           /* Pointer to next DataSeg */
-    char*              Name;           /* Segment name */
+    char*              SegName;        /* Segment name */
+    SymEntry*          Func;           /* Owner function */
     Collection                 Lines;          /* List of code lines */
 };
 
-/* Pointer to current data segment */
-extern DataSeg* DS;
-
 
 
 /*****************************************************************************/
@@ -70,25 +71,19 @@ extern DataSeg* DS;
 
 
 
-DataSeg* NewDataSeg (const char* Name);
+DataSeg* NewDataSeg (const char* SegName, SymEntry* Func);
 /* Create a new data segment, initialize and return it */
 
 void FreeDataSeg (DataSeg* S);
 /* Free a data segment including all line entries */
 
-void PushDataSeg (DataSeg* S);
-/* Push the given data segment onto the stack */
-
-DataSeg* PopDataSeg (void);
-/* Remove the current data segment from the stack and return it */
-
 void AppendDataSeg (DataSeg* Target, const DataSeg* Source);
 /* Append the data from Source to Target. */
 
-void AddDataSegLine (DataSeg* S, const char* Format, ...) attribute ((format(printf,2,3)));
+void AddDataEntry (DataSeg* S, const char* Format, va_list ap) attribute ((format(printf,2,0)));
 /* Add a line to the given data segment */
 
-void OutputDataSeg (FILE* F, const DataSeg* S);
+void OutputDataSeg (const DataSeg* S, FILE* F);
 /* Output the data segment data to a file */
 
 
index 39f9b5bb6e146ded863aa888eb88fec9d3c3c796..69b6536658375595e59aeeef39f8d02c8b28b723 100644 (file)
@@ -47,6 +47,7 @@
 #include "litpool.h"
 #include "locals.h"
 #include "scanner.h"
+#include "segments.h"
 #include "stmt.h"
 #include "symtab.h"
 #include "function.h"
@@ -246,7 +247,7 @@ void NewFunc (SymEntry* Func)
     InitRegVars ();
 
     /* Allocate code and data segments for this function */
-    g_pushseg (&Func->V.F.CS, &Func->V.F.DS, Func->Name);
+    Func->V.F.Seg = PushSegments (Func);
 
     /* If this is a fastcall function, push the last parameter onto the stack */
     if (IsFastCallFunc (Func->Type) && D->ParamCount > 0) {
@@ -336,7 +337,7 @@ void NewFunc (SymEntry* Func)
     LeaveFunctionLevel ();
 
     /* Switch back to the old segments */
-    g_popseg ();
+    PopSegments ();                  
 
     /* Reset the current function pointer */
     FreeFunction (CurrentFunc);
index 6f3d0bbcfb009daf2802c8dba25aa046d455f8a3..65346db94952aab495956730016891d1da9b9d97 100644 (file)
@@ -59,7 +59,7 @@
 #include "input.h"
 #include "macrotab.h"
 #include "scanner.h"
-#include "segname.h"
+#include "segments.h"
 
 
 
index 4f839e4e1fcc1750969f81a0b305790bf1f6c9bd..d9d374e1bfa2d16bfeb346ec10461745abc190e8 100644 (file)
@@ -56,14 +56,14 @@ OBJS =      anonname.o      \
        opcodes.o       \
        preproc.o       \
        pragma.o        \
-       scanner.o       \
-       segname.o       \
-       stdfunc.o       \
-       stmt.o          \
-       symentry.o      \
-       symtab.o        \
-       typecmp.o       \
-       util.o
+       scanner.o       \
+       segments.o      \
+       stdfunc.o       \
+       stmt.o          \
+       symentry.o      \
+       symtab.o        \
+       typecmp.o       \
+       util.o
 
 LIBS = $(COMMON)/common.a
 
index 51a2dbdc4f314ac2de8ab50258ed01b8b82396b9..4f51995d66b74be37ab1354154e1e6fa77757b18 100644 (file)
@@ -6,10 +6,10 @@
 /*                                                                           */
 /*                                                                           */
 /*                                                                           */
-/* (C) 1998-2000 Ullrich von Bassewitz                                       */
+/* (C) 1998-2001 Ullrich von Bassewitz                                       */
 /*               Wacholderweg 14                                             */
 /*               D-70597 Stuttgart                                           */
-/* EMail:        uz@musoftware.de                                            */
+/* EMail:        uz@cc65.org                                                 */
 /*                                                                           */
 /*                                                                           */
 /* This software is provided 'as-is', without any expressed or implied       */
 #include <string.h>
 
 /* cc65 */
-#include "codegen.h"
 #include "error.h"
 #include "expr.h"
 #include "global.h"
 #include "litpool.h"
 #include "scanner.h"
-#include "segname.h"
+#include "segments.h"
 #include "symtab.h"
 #include "pragma.h"
 
@@ -138,7 +137,7 @@ static void StringPragma (void (*Func) (const char*))
 
 
 
-static void SegNamePragma (void (*Func) (const char*))
+static void SegNamePragma (segment_t Seg)
 /* Handle a pragma that expects a segment name parameter */
 {
     if (curtok != TOK_SCONST) {
@@ -150,8 +149,8 @@ static void SegNamePragma (void (*Func) (const char*))
        /* Check if the name is valid */
        if (ValidSegName (Name)) {
 
-                   /* Call the given function to set the name */
-           Func (Name);
+                   /* Set the new name */
+           NewSegName (Seg, Name);
 
        } else {
 
@@ -216,7 +215,7 @@ void DoPragma (void)
     switch (Pragma) {
 
        case PR_BSSSEG:
-           SegNamePragma (g_bssname);
+           SegNamePragma (SEG_BSS);
            break;
 
        case PR_CHECKSTACK:
@@ -224,11 +223,11 @@ void DoPragma (void)
            break;
 
        case PR_CODESEG:
-           SegNamePragma (g_codename);
+           SegNamePragma (SEG_CODE);
            break;
 
        case PR_DATASEG:
-           SegNamePragma (g_dataname);
+           SegNamePragma (SEG_DATA);
            break;
 
        case PR_REGVARADDR:
@@ -236,7 +235,7 @@ void DoPragma (void)
            break;
 
        case PR_RODATASEG:
-           SegNamePragma (g_rodataname);
+           SegNamePragma (SEG_RODATA);
            break;
 
        case PR_SIGNEDCHARS:
index 65794a037c6268c1759b268f5f7edcd9750114f1..82026b35c465756f274140c4976c865607659935 100644 (file)
@@ -6,10 +6,10 @@
 /*                                                                           */
 /*                                                                           */
 /*                                                                           */
-/* (C) 1998     Ullrich von Bassewitz                                        */
-/*              Wacholderweg 14                                              */
-/*              D-70597 Stuttgart                                            */
-/* EMail:       uz@musoftware.de                                             */
+/* (C) 1998-2001 Ullrich von Bassewitz                                       */
+/*               Wacholderweg 14                                             */
+/*               D-70597 Stuttgart                                           */
+/* EMail:        uz@cc65.org                                                 */
 /*                                                                           */
 /*                                                                           */
 /* This software is provided 'as-is', without any expressed or implied       */
diff --git a/src/cc65/segments.c b/src/cc65/segments.c
new file mode 100644 (file)
index 0000000..6549279
--- /dev/null
@@ -0,0 +1,250 @@
+/*****************************************************************************/
+/*                                                                           */
+/*                               segments.c                                 */
+/*                                                                           */
+/*                  Lightweight segment management stuff                    */
+/*                                                                           */
+/*                                                                           */
+/*                                                                           */
+/* (C) 2001      Ullrich von Bassewitz                                       */
+/*               Wacholderweg 14                                             */
+/*               D-70597 Stuttgart                                           */
+/* EMail:        uz@cc65.org                                                 */
+/*                                                                           */
+/*                                                                           */
+/* This software is provided 'as-is', without any expressed or implied       */
+/* warranty.  In no event will the authors be held liable for any damages    */
+/* arising from the use of this software.                                    */
+/*                                                                           */
+/* Permission is granted to anyone to use this software for any purpose,     */
+/* including commercial applications, and to alter it and redistribute it    */
+/* freely, subject to the following restrictions:                            */
+/*                                                                           */
+/* 1. The origin of this software must not be misrepresented; you must not   */
+/*    claim that you wrote the original software. If you use this software   */
+/*    in a product, an acknowledgment in the product documentation would be  */
+/*    appreciated but is not required.                                       */
+/* 2. Altered source versions must be plainly marked as such, and must not   */
+/*    be misrepresented as being the original software.                      */
+/* 3. This notice may not be removed or altered from any source              */
+/*    distribution.                                                          */
+/*                                                                           */
+/*****************************************************************************/
+
+
+
+#include <stdarg.h>
+#include <string.h>
+
+/* common */
+#include "chartype.h"
+#include "check.h"
+#include "coll.h"
+#include "xmalloc.h"
+
+/* cc65 */
+#include "codeseg.h"
+#include "dataseg.h"
+#include "segments.h"
+
+
+
+/*****************************************************************************/
+/*                                  Data                                    */
+/*****************************************************************************/
+
+
+
+/* Pointer to the current segment list. Output goes here. */
+Segments* CS = 0;
+
+/* Actual names for the segments */
+static char* SegmentNames[SEG_COUNT];
+
+/* We're using a collection for the stack instead of a linked list. Since
+ * functions may not be nested (at least in the current implementation), the
+ * maximum stack depth is 2, so there is not really a need for a better
+ * implementation.
+ */
+static Collection SegmentStack = STATIC_COLLECTION_INITIALIZER;
+
+
+
+/*****************************************************************************/
+/*                                  Code                                    */
+/*****************************************************************************/
+
+
+
+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");
+}
+
+
+
+void NewSegName (segment_t Seg, const char* Name)
+/* Set a new name for a segment */
+{
+    /* Free the old name and set a new one */
+    xfree (SegmentNames [Seg]);
+    SegmentNames [Seg] = xstrdup (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) */
+{
+    /* Allocate memory */
+    Segments* S = xmalloc (sizeof (Segments));
+
+    /* Initialize the fields */
+    S->Code    = NewCodeSeg (SegmentNames[SEG_CODE], Func);
+    S->Data    = NewDataSeg (SegmentNames[SEG_DATA], Func);
+    S->ROData  = NewDataSeg (SegmentNames[SEG_RODATA], Func);
+    S->BSS     = NewDataSeg (SegmentNames[SEG_BSS], Func);
+    S->CurDSeg         = SEG_DATA;
+
+    /* Return the new struct */
+    return S;
+}
+
+
+
+Segments* PushSegments (SymEntry* Func)
+/* Make the new segment list current but remember the old one */
+{
+    /* Push the current pointer onto the stack */
+    CollAppend (&SegmentStack, CS);
+
+    /* Create a new Segments structure */
+    CS = NewSegments (Func);
+
+    /* Return the new struct */
+    return CS;
+}
+
+
+
+void PopSegments (void)
+/* Pop the old segment list (make it current) */
+{
+    /* Must have something on the stack */
+    PRECONDITION (CollCount (&SegmentStack) > 0);
+
+    /* Pop the last segment and set it as current */
+    CS = CollPop (&SegmentStack);
+}
+
+
+
+void UseDataSeg (segment_t DSeg)
+/* For the current segment list, use the data segment DSeg */
+{
+    /* Check the input */
+    PRECONDITION (CS && DSeg != SEG_CODE);
+
+    /* Set the new segment to use */
+    CS->CurDSeg = DSeg;
+}
+
+
+
+struct DataSeg* GetDataSeg (void)
+/* Return the current data segment */
+{
+    PRECONDITION (CS != 0);
+    switch (CS->CurDSeg) {
+       case SEG_BSS:     return CS->BSS;
+       case SEG_DATA:    return CS->Data;
+       case SEG_RODATA:  return CS->ROData;
+       default:          FAIL ("Invalid 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);
+    AddCodeEntry (CS->Code, Format, ap);
+    va_end (ap);
+}
+
+
+
+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);
+    AddDataEntry (GetDataSeg(), Format, ap);
+    va_end (ap);
+}
+
+
+
+static void PrintFunctionHeader (const SymEntry* Entry, FILE* F)
+{
+    /* Print a comment with the function signature */
+    fprintf (F,
+            "; ---------------------------------------------------------------\n"
+            "; ");
+    PrintFuncSig (F, Entry->Name, Entry->Type);
+    fprintf (F,
+                    "\n"
+            "; ---------------------------------------------------------------\n"
+            "\n");
+}
+
+
+
+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 three data segments */
+    OutputDataSeg (S->Data, F);
+    OutputDataSeg (S->ROData, F);
+    OutputDataSeg (S->BSS, F);
+
+    /* Output the code segment */
+    OutputCodeSeg (S->Code, F);
+}
+
+
+
diff --git a/src/cc65/segments.h b/src/cc65/segments.h
new file mode 100644 (file)
index 0000000..de66af9
--- /dev/null
@@ -0,0 +1,132 @@
+/*****************************************************************************/
+/*                                                                           */
+/*                               segments.h                                 */
+/*                                                                           */
+/*                           Segment management                             */
+/*                                                                           */
+/*                                                                           */
+/*                                                                           */
+/* (C) 2000-2001 Ullrich von Bassewitz                                       */
+/*               Wacholderweg 14                                             */
+/*               D-70597 Stuttgart                                           */
+/* EMail:        uz@cc65.org                                                 */
+/*                                                                           */
+/*                                                                           */
+/* This software is provided 'as-is', without any expressed or implied       */
+/* warranty.  In no event will the authors be held liable for any damages    */
+/* arising from the use of this software.                                    */
+/*                                                                           */
+/* Permission is granted to anyone to use this software for any purpose,     */
+/* including commercial applications, and to alter it and redistribute it    */
+/* freely, subject to the following restrictions:                            */
+/*                                                                           */
+/* 1. The origin of this software must not be misrepresented; you must not   */
+/*    claim that you wrote the original software. If you use this software   */
+/*    in a product, an acknowledgment in the product documentation would be  */
+/*    appreciated but is not required.                                       */
+/* 2. Altered source versions must be plainly marked as such, and must not   */
+/*    be misrepresented as being the original software.                      */
+/* 3. This notice may not be removed or altered from any source              */
+/*    distribution.                                                          */
+/*                                                                           */
+/*****************************************************************************/
+
+
+
+#ifndef SEGMENTS_H
+#define SEGMENTS_H
+
+
+
+#include <stdio.h>
+
+/* common */
+#include "attrib.h"
+
+
+
+/*****************************************************************************/
+/*                                Forwards                                  */
+/*****************************************************************************/
+
+
+
+struct CodeSeg;
+struct DataSeg;
+struct SymEntry;
+
+
+
+/*****************************************************************************/
+/*                                  Data                                    */
+/*****************************************************************************/
+
+
+
+/* Segment types */
+typedef enum segment_t {
+    SEG_CODE,
+    SEG_RODATA,
+    SEG_DATA,
+    SEG_BSS,
+    SEG_COUNT
+} segment_t;
+
+/* A list of all segments used when generating code */
+typedef struct Segments Segments;
+struct Segments {
+    struct CodeSeg*    Code;           /* Code segment */
+    struct DataSeg*    Data;           /* Data segment */
+    struct DataSeg*    ROData;         /* Readonly data segment */
+    struct DataSeg*    BSS;            /* Segment for uninitialized data */
+    segment_t                  CurDSeg;        /* Current data segment */
+};
+
+/* Pointer to the current segment list. Output goes here. */
+extern Segments* CS;
+
+
+
+/*****************************************************************************/
+/*                                  Code                                    */
+/*****************************************************************************/
+
+
+
+void InitSegNames (void);
+/* Initialize the segment names */
+
+void NewSegName (segment_t Seg, const char* Name);
+/* Set a new name for a segment */
+
+int ValidSegName (const char* Name);
+/* Return true if the given segment name is valid, return false otherwise */
+
+Segments* PushSegments (struct SymEntry* Func);
+/* Make the new segment list current but remember the old one */
+
+void PopSegments (void);
+/* Pop the old segment list (make it current) */
+
+void UseDataSeg (segment_t DSeg);
+/* For the current segment list, use the data segment DSeg */
+
+struct DataSeg* GetDataSeg (void);
+/* Return the current data segment */
+
+void AddCodeLine (const char* Format, ...) attribute ((format (printf, 1, 2)));
+/* Add a line of code to the current code segment */
+
+void AddDataLine (const char* Format, ...) attribute ((format (printf, 1, 2)));
+/* Add a line of data to the current data segment */
+
+void OutputSegments (const Segments* S, FILE* F);
+/* Output the given segments to the file */
+
+
+
+/* End of segments.h */
+#endif
+
+
+
index ff0b63cea5535dcb9844e6edc24f640a0cee7f1e..6fe4ce7f04515e1532805227dc9ec598da9b3214 100644 (file)
 
 #include <stdio.h>
 
+/* cc65 */
 #include "datatype.h"
 
 
 
 /*****************************************************************************/
-/*                             struct SymEntry                              */
+/*                                 Forwards                                 */
+/*****************************************************************************/
+
+
+
+struct Segments;
+
+
+
+/*****************************************************************************/
+/*                             struct SymEntry                              */
 /*****************************************************************************/
 
 
 
 /* Storage classes and flags */
-#define SC_AUTO        0x0001U
+#define SC_AUTO        0x0001U
 #define SC_REGISTER            0x0002U /* Register variable, is in static storage */
 #define SC_STATIC      0x0004U
 #define SC_EXTERN      0x0008U
 
 #define SC_ENUM                0x0030U /* An enum (numeric constant) */
-#define SC_CONST       0x0020U /* A numeric constant with a type */
+#define SC_CONST       0x0020U /* A numeric constant with a type */
 #define SC_LABEL               0x0040U /* A goto label */
 #define SC_PARAM               0x0080U /* This is a function parameter */
-#define SC_FUNC                0x0100U /* Function entry */
+#define SC_FUNC                0x0100U /* Function entry */
 
 #define SC_STORAGE             0x0400U /* Symbol with associated storage */
 #define SC_DEFAULT             0x0800U /* Flag: default storage class was used */
@@ -83,7 +94,7 @@ struct SymEntry {
     SymEntry*                          NextHash; /* Next entry in hash list */
     SymEntry*                          PrevSym;  /* Previous symbol in dl list */
     SymEntry*                          NextSym;  /* Next symbol double linked list */
-    SymEntry*                          Link;     /* General purpose single linked list */
+    SymEntry*                          Link;     /* General purpose single linked list */
     struct SymTable*           Owner;    /* Symbol table the symbol is in */
     unsigned                           Flags;    /* Symbol flags */
     type*                              Type;     /* Symbol type */
@@ -109,18 +120,17 @@ struct SymEntry {
        /* Data for functions */
        struct {
            struct FuncDesc*    Func;     /* Function descriptor */
-           struct CodeSeg*     CS;       /* Code for function */
-           struct DataSeg*     DS;       /* Data segment for function */
+                   struct Segments*    Seg;      /* Segments for this function */
                } F;
 
     } V;
-    char                              Name[1]; /* Name, dynamically allocated */
+    char                              Name[1]; /* Name, dynamically allocated */
 };
 
 
 
 /*****************************************************************************/
-/*                                  Code                                    */
+/*                                  Code                                    */
 /*****************************************************************************/
 
 
index 0fc336dbe9d8dc13ae05d996bdeec65a3bee29d5..5431cf0dc80e554999495d4800dacdbe3958d855 100644 (file)
@@ -744,8 +744,7 @@ SymEntry* AddGlobalSym (const char* Name, const type* Type, unsigned Flags)
         */
        if (IsFunc) {
            Entry->V.F.Func = GetFuncDesc (Entry->Type);
-           Entry->V.F.CS   = 0;
-           Entry->V.F.DS   = 0;
+           Entry->V.F.Seg  = 0;
        }
 
        /* Add the entry to the symbol table */