]> git.sur5r.net Git - cc65/blobdiff - src/cc65/codegen.c
Removed (pretty inconsistently used) tab chars from source code base.
[cc65] / src / cc65 / codegen.c
index a852e19b6903fd5ff1fcaebe9798296542e856a3..2d41c4a95e39b68b497fa5b80455a974dda4969f 100644 (file)
@@ -1,15 +1,15 @@
 /*****************************************************************************/
 /*                                                                           */
-/*                                 codegen.c                                */
+/*                                 codegen.c                                 */
 /*                                                                           */
-/*                            6502 code generator                           */
+/*                            6502 code generator                            */
 /*                                                                           */
 /*                                                                           */
 /*                                                                           */
-/* (C) 1998-2009 Ullrich von Bassewitz                                       */
-/*               Roemerstrasse 52                                            */
-/*               D-70794 Filderstadt                                         */
-/* EMail:        uz@cc65.org                                                 */
+/* (C) 1998-2013, Ullrich von Bassewitz                                      */
+/*                Roemerstrasse 52                                           */
+/*                D-70794 Filderstadt                                        */
+/* EMail:         uz@cc65.org                                                */
 /*                                                                           */
 /*                                                                           */
 /* This software is provided 'as-is', without any expressed or implied       */
@@ -41,9 +41,9 @@
 #include "check.h"
 #include "cpu.h"
 #include "strbuf.h"
-#include "version.h"
 #include "xmalloc.h"
 #include "xsprintf.h"
+#include "version.h"
 
 /* cc65 */
 #include "asmcode.h"
@@ -62,7 +62,7 @@
 
 
 /*****************************************************************************/
-/*                                  Helpers                                 */
+/*                                  Helpers                                  */
 /*****************************************************************************/
 
 
@@ -71,10 +71,10 @@ static void typeerror (unsigned type)
 /* Print an error message about an invalid operand type */
 {
     /* Special handling for floats here: */
-    if ((type & CF_TYPE) == CF_FLOAT) {
+    if ((type & CF_TYPEMASK) == CF_FLOAT) {
         Fatal ("Floating point type is currently unsupported");
     } else {
-        Internal ("Invalid type in CF flags: %04X, type = %u", type, type & CF_TYPE);
+        Internal ("Invalid type in CF flags: %04X, type = %u", type, type & CF_TYPEMASK);
     }
 }
 
@@ -103,16 +103,16 @@ static const char* GetLabelName (unsigned Flags, unsigned long Label, long Offs)
             if (Offs) {
                 xsprintf (Buf, sizeof (Buf), "%s%+ld", LocalLabelName (Label), Offs);
             } else {
-                       xsprintf (Buf, sizeof (Buf), "%s", LocalLabelName (Label));
+                xsprintf (Buf, sizeof (Buf), "%s", LocalLabelName (Label));
             }
             break;
 
         case CF_EXTERNAL:
             /* External label */
             if (Offs) {
-               xsprintf (Buf, sizeof (Buf), "_%s%+ld", (char*) Label, Offs);
+                xsprintf (Buf, sizeof (Buf), "_%s%+ld", (char*) Label, Offs);
             } else {
-               xsprintf (Buf, sizeof (Buf), "_%s", (char*) Label);
+                xsprintf (Buf, sizeof (Buf), "_%s", (char*) Label);
             }
             break;
 
@@ -137,7 +137,7 @@ static const char* GetLabelName (unsigned Flags, unsigned long Label, long Offs)
 
 
 /*****************************************************************************/
-/*                           Pre- and postamble                             */
+/*                            Pre- and postamble                             */
 /*****************************************************************************/
 
 
@@ -145,19 +145,14 @@ static const char* GetLabelName (unsigned Flags, unsigned long Label, long Offs)
 void g_preamble (void)
 /* Generate the assembler code preamble */
 {
-    /* Create a new (global) segment list and remember it */
-    PushSegments (0);
-    GS = CS;
-
     /* Identify the compiler version */
     AddTextLine (";");
-    AddTextLine ("; File generated by cc65 v %u.%u.%u",
-                VER_MAJOR, VER_MINOR, VER_PATCH);
+    AddTextLine ("; File generated by cc65 v %s", GetVersionAsString ());
     AddTextLine (";");
 
     /* Insert some object file options */
-    AddTextLine ("\t.fopt\t\tcompiler,\"cc65 v %u.%u.%u\"",
-                   VER_MAJOR, VER_MINOR, VER_PATCH);
+    AddTextLine ("\t.fopt\t\tcompiler,\"cc65 v %s\"",
+                 GetVersionAsString ());
 
     /* If we're producing code for some other CPU, switch the command set */
     switch (CPU) {
@@ -182,8 +177,9 @@ void g_preamble (void)
     /* Tell the assembler if we want to generate debug info */
     AddTextLine ("\t.debuginfo\t%s", (DebugInfo != 0)? "on" : "off");
 
-    /* Import the stack pointer for direct auto variable access */
-    AddTextLine ("\t.importzp\tsp, sreg, regsave, regbank, tmp1, ptr1, ptr2");
+    /* Import zero page variables */
+    AddTextLine ("\t.importzp\tsp, sreg, regsave, regbank");
+    AddTextLine ("\t.importzp\ttmp1, tmp2, tmp3, tmp4, ptr1, ptr2, ptr3, ptr4");
 
     /* Define long branch macros */
     AddTextLine ("\t.macpack\tlongbranch");
@@ -205,7 +201,7 @@ void g_fileinfo (const char* Name, unsigned long Size, unsigned long MTime)
 
 
 /*****************************************************************************/
-/*                             Segment support                              */
+/*                              Segment support                              */
 /*****************************************************************************/
 
 
@@ -253,7 +249,7 @@ void g_segname (segment_t Seg)
 
 
 /*****************************************************************************/
-/*                                          Code                                    */
+/*                                   Code                                    */
 /*****************************************************************************/
 
 
@@ -261,7 +257,7 @@ void g_segname (segment_t Seg)
 unsigned sizeofarg (unsigned flags)
 /* Return the size of a function argument type that is encoded in flags */
 {
-    switch (flags & CF_TYPE) {
+    switch (flags & CF_TYPEMASK) {
 
         case CF_CHAR:
             return (flags & CF_FORCECHAR)? 1 : 2;
@@ -330,7 +326,7 @@ static unsigned MakeByteOffs (unsigned Flags, unsigned Offs)
 
 
 /*****************************************************************************/
-/*                     Functions handling local labels                      */
+/*                      Functions handling local labels                      */
 /*****************************************************************************/
 
 
@@ -351,8 +347,26 @@ void g_defdatalabel (unsigned label)
 
 
 
+void g_aliasdatalabel (unsigned label, unsigned baselabel, long offs)
+/* Define label as a local alias for baselabel+offs */
+{
+    /* We need an intermediate buffer here since LocalLabelName uses a
+     * static buffer which changes with each call.
+     */
+    StrBuf L = AUTO_STRBUF_INITIALIZER;
+    SB_AppendStr (&L, LocalLabelName (label));
+    SB_Terminate (&L);
+    AddDataLine ("%s\t:=\t%s+%ld",
+                 SB_GetConstBuf (&L),
+                 LocalLabelName (baselabel),
+                 offs);
+    SB_Done (&L);
+}
+
+
+
 /*****************************************************************************/
-/*                    Functions handling global labels                      */
+/*                     Functions handling global labels                      */
 /*****************************************************************************/
 
 
@@ -407,37 +421,7 @@ void g_importmainargs (void)
 
 
 /*****************************************************************************/
-/*                   Load functions for various registers                   */
-/*****************************************************************************/
-
-
-
-static void ldaconst (unsigned val)
-/* Load a with a constant */
-{
-    AddCodeLine ("lda #$%02X", val & 0xFF);
-}
-
-
-
-static void ldxconst (unsigned val)
-/* Load x with a constant */
-{
-    AddCodeLine ("ldx #$%02X", val & 0xFF);
-}
-
-
-
-static void ldyconst (unsigned val)
-/* Load y with a constant */
-{
-    AddCodeLine ("ldy #$%02X", val & 0xFF);
-}
-
-
-
-/*****************************************************************************/
-/*                          Function entry and exit                         */
+/*                          Function entry and exit                          */
 /*****************************************************************************/
 
 
@@ -468,39 +452,30 @@ void g_leave (void)
 /* Function epilogue */
 {
     /* How many bytes of locals do we have to drop? */
-    unsigned k = (unsigned) -StackPtr;
+    unsigned ToDrop = (unsigned) -StackPtr;
 
     /* If we didn't have a variable argument list, don't call leave */
     if (funcargs >= 0) {
 
-        /* Drop stackframe if needed. We can only drop 255 bytes at a time. */
-        k += funcargs;
-        while (k > 0) {
-            unsigned ToDrop = (k > 255)? 255 : k;
-            if (ToDrop <= 8) {
-                AddCodeLine ("jsr incsp%d", k);
-            } else {
-                       ldyconst (ToDrop);
-                       AddCodeLine ("jsr addysp");
-            }
-            k -= ToDrop;
-        }
+        /* Drop stackframe if needed */
+        g_drop (ToDrop + funcargs);
 
-    } else {
+    } else if (StackPtr != 0) {
 
-        if (k == 0) {
-            /* Nothing to drop */
+        /* We've a stack frame to drop */
+        if (ToDrop > 255) {
+            g_drop (ToDrop);            /* Inlines the code */
             AddCodeLine ("jsr leave");
         } else {
-            /* We've a stack frame to drop */
-            while (k > 255) {
-                ldyconst (255);
-                AddCodeLine ("jsr addysp");
-                k -= 255;
-            }
-            ldyconst (k);
+            AddCodeLine ("ldy #$%02X", ToDrop);
             AddCodeLine ("jsr leavey");
         }
+
+    } else {
+
+        /* Nothing to drop */
+        AddCodeLine ("jsr leave");
+
     }
 
     /* Add the final rts */
@@ -510,7 +485,7 @@ void g_leave (void)
 
 
 /*****************************************************************************/
-/*                                   Register variables                             */
+/*                            Register variables                             */
 /*****************************************************************************/
 
 
@@ -523,14 +498,13 @@ void g_swap_regvars (int StackOffs, int RegOffs, unsigned Bytes)
     CheckLocalOffs (StackOffs);
 
     /* Generate code */
+    AddCodeLine ("ldy #$%02X", StackOffs & 0xFF);
     if (Bytes == 1) {
 
         if (IS_Get (&CodeSizeFactor) < 165) {
-            ldyconst (StackOffs);
-            ldxconst (RegOffs);
+            AddCodeLine ("ldx #$%02X", RegOffs & 0xFF);
             AddCodeLine ("jsr regswap1");
         } else {
-            ldyconst (StackOffs);
             AddCodeLine ("lda (sp),y");
             AddCodeLine ("ldx regbank%+d", RegOffs);
             AddCodeLine ("sta regbank%+d", RegOffs);
@@ -540,15 +514,13 @@ void g_swap_regvars (int StackOffs, int RegOffs, unsigned Bytes)
 
     } else if (Bytes == 2) {
 
-        ldyconst (StackOffs);
-        ldxconst (RegOffs);
+        AddCodeLine ("ldx #$%02X", RegOffs & 0xFF);
         AddCodeLine ("jsr regswap2");
 
     } else {
 
-        ldyconst (StackOffs);
-        ldxconst (RegOffs);
-        ldaconst (Bytes);
+        AddCodeLine ("ldx #$%02X", RegOffs & 0xFF);
+        AddCodeLine ("lda #$%02X", Bytes & 0xFF);
         AddCodeLine ("jsr regswap");
     }
 }
@@ -575,8 +547,8 @@ void g_save_regvars (int RegOffs, unsigned Bytes)
         /* More than two bytes - loop */
         unsigned Label = GetLocalLabel ();
         g_space (Bytes);
-        ldyconst (Bytes - 1);
-        ldxconst (Bytes);
+        AddCodeLine ("ldy #$%02X", (unsigned char) (Bytes - 1));
+        AddCodeLine ("ldx #$%02X", (unsigned char) Bytes);
         g_defcodelabel (Label);
         AddCodeLine ("lda regbank%+d,x", RegOffs-1);
         AddCodeLine ("sta (sp),y");
@@ -602,13 +574,13 @@ void g_restore_regvars (int StackOffs, int RegOffs, unsigned Bytes)
     /* Don't loop for up to two bytes */
     if (Bytes == 1) {
 
-        ldyconst (StackOffs);
+        AddCodeLine ("ldy #$%02X", StackOffs);
         AddCodeLine ("lda (sp),y");
         AddCodeLine ("sta regbank%+d", RegOffs);
 
     } else if (Bytes == 2) {
 
-        ldyconst (StackOffs);
+        AddCodeLine ("ldy #$%02X", StackOffs);
         AddCodeLine ("lda (sp),y");
         AddCodeLine ("sta regbank%+d", RegOffs);
         AddCodeLine ("iny");
@@ -617,7 +589,7 @@ void g_restore_regvars (int StackOffs, int RegOffs, unsigned Bytes)
 
     } else if (Bytes == 3 && IS_Get (&CodeSizeFactor) >= 133) {
 
-        ldyconst (StackOffs);
+        AddCodeLine ("ldy #$%02X", StackOffs);
         AddCodeLine ("lda (sp),y");
         AddCodeLine ("sta regbank%+d", RegOffs);
         AddCodeLine ("iny");
@@ -634,7 +606,7 @@ void g_restore_regvars (int StackOffs, int RegOffs, unsigned Bytes)
          * code that uses just one index register.
          */
         unsigned Label = GetLocalLabel ();
-        ldyconst (StackOffs);
+        AddCodeLine ("ldy #$%02X", StackOffs);
         g_defcodelabel (Label);
         AddCodeLine ("lda (sp),y");
         AddCodeLine ("sta regbank%+d,y", RegOffs - StackOffs);
@@ -649,8 +621,8 @@ void g_restore_regvars (int StackOffs, int RegOffs, unsigned Bytes)
          */
         unsigned Label = GetLocalLabel ();
         AddCodeLine ("stx tmp1");
-        ldyconst (StackOffs + Bytes - 1);
-        ldxconst (Bytes - 1);
+        AddCodeLine ("ldy #$%02X", (unsigned char) (StackOffs + Bytes - 1));
+        AddCodeLine ("ldx #$%02X", (unsigned char) (Bytes - 1));
         g_defcodelabel (Label);
         AddCodeLine ("lda (sp),y");
         AddCodeLine ("sta regbank%+d,x", RegOffs);
@@ -665,7 +637,7 @@ void g_restore_regvars (int StackOffs, int RegOffs, unsigned Bytes)
 
 
 /*****************************************************************************/
-/*                           Fetching memory cells                          */
+/*                           Fetching memory cells                           */
 /*****************************************************************************/
 
 
@@ -680,17 +652,17 @@ void g_getimmed (unsigned Flags, unsigned long Val, long Offs)
     if ((Flags & CF_CONST) != 0) {
 
         /* Numeric constant */
-        switch (Flags & CF_TYPE) {
+        switch (Flags & CF_TYPEMASK) {
 
             case CF_CHAR:
                 if ((Flags & CF_FORCECHAR) != 0) {
-                    ldaconst (Val);
+                    AddCodeLine ("lda #$%02X", (unsigned char) Val);
                     break;
                 }
                 /* FALL THROUGH */
             case CF_INT:
-                ldxconst ((Val >> 8) & 0xFF);
-                ldaconst (Val & 0xFF);
+                AddCodeLine ("ldx #$%02X", (unsigned char) (Val >> 8));
+                AddCodeLine ("lda #$%02X", (unsigned char) Val);
                 break;
 
             case CF_LONG:
@@ -714,7 +686,7 @@ void g_getimmed (unsigned Flags, unsigned long Val, long Offs)
                     AddCodeLine ("stx sreg+1");
                     Done |= 0x08;
                 }
-               if ((Done & 0x04) == 0 && B1 != B3) {
+                if ((Done & 0x04) == 0 && B1 != B3) {
                     AddCodeLine ("lda #$%02X", B3);
                     AddCodeLine ("sta sreg");
                     Done |= 0x04;
@@ -763,21 +735,21 @@ void g_getstatic (unsigned flags, unsigned long label, long offs)
     const char* lbuf = GetLabelName (flags, label, offs);
 
     /* Check the size and generate the correct load operation */
-    switch (flags & CF_TYPE) {
+    switch (flags & CF_TYPEMASK) {
 
         case CF_CHAR:
             if ((flags & CF_FORCECHAR) || (flags & CF_TEST)) {
-                AddCodeLine ("lda %s", lbuf);  /* load A from the label */
+                AddCodeLine ("lda %s", lbuf);   /* load A from the label */
             } else {
-               ldxconst (0);
-               AddCodeLine ("lda %s", lbuf);   /* load A from the label */
-               if (!(flags & CF_UNSIGNED)) {
-                   /* Must sign extend */
+                AddCodeLine ("ldx #$00");
+                AddCodeLine ("lda %s", lbuf);   /* load A from the label */
+                if (!(flags & CF_UNSIGNED)) {
+                    /* Must sign extend */
                     unsigned L = GetLocalLabel ();
-                   AddCodeLine ("bpl %s", LocalLabelName (L));
-                   AddCodeLine ("dex");
+                    AddCodeLine ("bpl %s", LocalLabelName (L));
+                    AddCodeLine ("dex");
                     g_defcodelabel (L);
-               }
+                }
             }
             break;
 
@@ -792,13 +764,13 @@ void g_getstatic (unsigned flags, unsigned long label, long offs)
 
         case CF_LONG:
             if (flags & CF_TEST) {
-               AddCodeLine ("lda %s+3", lbuf);
+                AddCodeLine ("lda %s+3", lbuf);
                 AddCodeLine ("ora %s+2", lbuf);
                 AddCodeLine ("ora %s+1", lbuf);
                 AddCodeLine ("ora %s+0", lbuf);
             } else {
-               AddCodeLine ("lda %s+3", lbuf);
-               AddCodeLine ("sta sreg+1");
+                AddCodeLine ("lda %s+3", lbuf);
+                AddCodeLine ("sta sreg+1");
                 AddCodeLine ("lda %s+2", lbuf);
                 AddCodeLine ("sta sreg");
                 AddCodeLine ("ldx %s+1", lbuf);
@@ -814,59 +786,59 @@ void g_getstatic (unsigned flags, unsigned long label, long offs)
 
 
 
-void g_getlocal (unsigned flags, int offs)
+void g_getlocal (unsigned Flags, int Offs)
 /* Fetch specified local object (local var). */
 {
-    offs -= StackPtr;
-    CheckLocalOffs (offs);
-    switch (flags & CF_TYPE) {
+    Offs -= StackPtr;
+    switch (Flags & CF_TYPEMASK) {
 
         case CF_CHAR:
-            if ((flags & CF_FORCECHAR) || (flags & CF_TEST)) {
-                ldyconst (offs);
+            CheckLocalOffs (Offs);
+            if ((Flags & CF_FORCECHAR) || (Flags & CF_TEST)) {
+                AddCodeLine ("ldy #$%02X", Offs);
                 AddCodeLine ("lda (sp),y");
             } else {
-                ldyconst (offs);
+                AddCodeLine ("ldy #$%02X", Offs);
                 AddCodeLine ("ldx #$00");
                 AddCodeLine ("lda (sp),y");
-               if ((flags & CF_UNSIGNED) == 0) {
+                if ((Flags & CF_UNSIGNED) == 0) {
                     unsigned L = GetLocalLabel();
-                   AddCodeLine ("bpl %s", LocalLabelName (L));
-                   AddCodeLine ("dex");
+                    AddCodeLine ("bpl %s", LocalLabelName (L));
+                    AddCodeLine ("dex");
                     g_defcodelabel (L);
-               }
+                }
             }
             break;
 
         case CF_INT:
-            CheckLocalOffs (offs + 1);
-            if (flags & CF_TEST) {
-               ldyconst (offs + 1);
-               AddCodeLine ("lda (sp),y");
+            CheckLocalOffs (Offs + 1);
+            AddCodeLine ("ldy #$%02X", (unsigned char) (Offs+1));
+            if (Flags & CF_TEST) {
+                AddCodeLine ("lda (sp),y");
                 AddCodeLine ("dey");
                 AddCodeLine ("ora (sp),y");
             } else {
-                ldyconst (offs+1);
                 AddCodeLine ("jsr ldaxysp");
             }
             break;
 
         case CF_LONG:
-            ldyconst (offs+3);
+            CheckLocalOffs (Offs + 3);
+            AddCodeLine ("ldy #$%02X", (unsigned char) (Offs+3));
             AddCodeLine ("jsr ldeaxysp");
-            if (flags & CF_TEST) {
-               g_test (flags);
+            if (Flags & CF_TEST) {
+                g_test (Flags);
             }
             break;
 
         default:
-            typeerror (flags);
+            typeerror (Flags);
     }
 }
 
 
 
-void g_getind (unsigned flags, unsigned offs)
+void g_getind (unsigned Flags, unsigned Offs)
 /* Fetch the specified object type indirect through the primary register
  * into the primary register
  */
@@ -875,84 +847,110 @@ void g_getind (unsigned flags, unsigned offs)
      * the primary. This way we get an easy addition and use the low byte
      * as the offset
      */
-    offs = MakeByteOffs (flags, offs);
+    Offs = MakeByteOffs (Flags, Offs);
 
     /* Handle the indirect fetch */
-    switch (flags & CF_TYPE) {
+    switch (Flags & CF_TYPEMASK) {
 
         case CF_CHAR:
             /* Character sized */
-            if (flags & CF_UNSIGNED) {
-                ldyconst (offs);
+            AddCodeLine ("ldy #$%02X", Offs);
+            if (Flags & CF_UNSIGNED) {
                 AddCodeLine ("jsr ldauidx");
             } else {
-                ldyconst (offs);
                 AddCodeLine ("jsr ldaidx");
             }
             break;
 
         case CF_INT:
-            if (flags & CF_TEST) {
-               ldyconst (offs);
+            if (Flags & CF_TEST) {
+                AddCodeLine ("ldy #$%02X", Offs);
                 AddCodeLine ("sta ptr1");
                 AddCodeLine ("stx ptr1+1");
                 AddCodeLine ("lda (ptr1),y");
                 AddCodeLine ("iny");
                 AddCodeLine ("ora (ptr1),y");
             } else {
-                ldyconst (offs+1);
+                AddCodeLine ("ldy #$%02X", Offs+1);
                 AddCodeLine ("jsr ldaxidx");
             }
             break;
 
         case CF_LONG:
-            ldyconst (offs+3);
+            AddCodeLine ("ldy #$%02X", Offs+3);
             AddCodeLine ("jsr ldeaxidx");
-            if (flags & CF_TEST) {
-                g_test (flags);
+            if (Flags & CF_TEST) {
+                g_test (Flags);
             }
             break;
 
         default:
-            typeerror (flags);
+            typeerror (Flags);
 
     }
 }
 
 
 
-void g_leasp (int offs)
+void g_leasp (int Offs)
 /* Fetch the address of the specified symbol into the primary register */
 {
+    unsigned char Lo, Hi;
+
     /* Calculate the offset relative to sp */
-    offs -= StackPtr;
+    Offs -= StackPtr;
 
-    /* For value 0 we do direct code */
-    if (offs == 0) {
-        AddCodeLine ("lda sp");
-        AddCodeLine ("ldx sp+1");
-    } else {
-        if (IS_Get (&CodeSizeFactor) < 300) {
-            ldaconst (offs);                   /* Load A with offset value */
-            AddCodeLine ("jsr leaasp");        /* Load effective address */
+    /* Get low and high byte */
+    Lo = (unsigned char) Offs;
+    Hi = (unsigned char) (Offs >> 8);
+
+    /* Generate code */
+    if (Lo == 0) {
+        if (Hi <= 3) {
+            AddCodeLine ("lda sp");
+            AddCodeLine ("ldx sp+1");
+            while (Hi--) {
+                AddCodeLine ("inx");
+            }
         } else {
+            AddCodeLine ("lda sp+1");
+            AddCodeLine ("clc");
+            AddCodeLine ("adc #$%02X", Hi);
+            AddCodeLine ("tax");
+            AddCodeLine ("lda sp");
+        }
+    } else if (Hi == 0) {
+        /* 8 bit offset */
+        if (IS_Get (&CodeSizeFactor) < 200) {
+            /* 8 bit offset with subroutine call */
+            AddCodeLine ("lda #$%02X", Lo);
+            AddCodeLine ("jsr leaa0sp");
+        } else {
+            /* 8 bit offset inlined */
             unsigned L = GetLocalLabel ();
-            if ((CPUIsets[CPU] & CPU_ISET_65SC02) != 0 && offs == 1) {
-               AddCodeLine ("lda sp");
-               AddCodeLine ("ldx sp+1");
-               AddCodeLine ("ina");
-               AddCodeLine ("bne %s", LocalLabelName (L));
-               AddCodeLine ("inx");
-            } else {
-               ldaconst (offs);
-               AddCodeLine ("ldx sp+1");
-               AddCodeLine ("clc");
-               AddCodeLine ("adc sp");
-               AddCodeLine ("bcc %s", LocalLabelName (L));
-               AddCodeLine ("inx");
-            }
+            AddCodeLine ("lda sp");
+            AddCodeLine ("ldx sp+1");
+            AddCodeLine ("clc");
+            AddCodeLine ("adc #$%02X", Lo);
+            AddCodeLine ("bcc %s", LocalLabelName (L));
+            AddCodeLine ("inx");
             g_defcodelabel (L);
         }
+    } else if (IS_Get (&CodeSizeFactor) < 170) {
+        /* Full 16 bit offset with subroutine call */
+        AddCodeLine ("lda #$%02X", Lo);
+        AddCodeLine ("ldx #$%02X", Hi);
+        AddCodeLine ("jsr leaaxsp");
+    } else {
+        /* Full 16 bit offset inlined */
+        AddCodeLine ("lda sp");
+        AddCodeLine ("clc");
+        AddCodeLine ("adc #$%02X", Lo);
+        AddCodeLine ("pha");
+        AddCodeLine ("lda sp+1");
+        AddCodeLine ("adc #$%02X", Hi);
+        AddCodeLine ("tax");
+        AddCodeLine ("pla");
     }
 }
 
@@ -976,7 +974,7 @@ void g_leavariadic (int Offs)
     CheckLocalOffs (ArgSizeOffs);
 
     /* Get the size of all parameters. */
-    ldyconst (ArgSizeOffs);
+    AddCodeLine ("ldy #$%02X", ArgSizeOffs);
     AddCodeLine ("lda (sp),y");
 
     /* Add the value of the stackpointer */
@@ -989,7 +987,8 @@ void g_leavariadic (int Offs)
         AddCodeLine ("inx");
         g_defcodelabel (L);
     } else {
-        AddCodeLine ("jsr leaasp");
+        AddCodeLine ("ldx #$00");
+        AddCodeLine ("jsr leaaxsp");
     }
 
     /* Add the offset to the primary */
@@ -1003,7 +1002,7 @@ void g_leavariadic (int Offs)
 
 
 /*****************************************************************************/
-/*                            Store into memory                             */
+/*                             Store into memory                             */
 /*****************************************************************************/
 
 
@@ -1015,7 +1014,7 @@ void g_putstatic (unsigned flags, unsigned long label, long offs)
     const char* lbuf = GetLabelName (flags, label, offs);
 
     /* Check the size and generate the correct store operation */
-    switch (flags & CF_TYPE) {
+    switch (flags & CF_TYPEMASK) {
 
         case CF_CHAR:
             AddCodeLine ("sta %s", lbuf);
@@ -1048,19 +1047,19 @@ void g_putlocal (unsigned Flags, int Offs, long Val)
 {
     Offs -= StackPtr;
     CheckLocalOffs (Offs);
-    switch (Flags & CF_TYPE) {
+    switch (Flags & CF_TYPEMASK) {
 
         case CF_CHAR:
             if (Flags & CF_CONST) {
-               AddCodeLine ("lda #$%02X", (unsigned char) Val);
+                AddCodeLine ("lda #$%02X", (unsigned char) Val);
             }
-            ldyconst (Offs);
+            AddCodeLine ("ldy #$%02X", Offs);
             AddCodeLine ("sta (sp),y");
             break;
 
         case CF_INT:
             if (Flags & CF_CONST) {
-                ldyconst (Offs+1);
+                AddCodeLine ("ldy #$%02X", Offs+1);
                 AddCodeLine ("lda #$%02X", (unsigned char) (Val >> 8));
                 AddCodeLine ("sta (sp),y");
                 if ((Flags & CF_NOKEEP) == 0) {
@@ -1077,11 +1076,10 @@ void g_putlocal (unsigned Flags, int Offs, long Val)
                 }
                 AddCodeLine ("sta (sp),y");
             } else {
+                AddCodeLine ("ldy #$%02X", Offs);
                 if ((Flags & CF_NOKEEP) == 0 || IS_Get (&CodeSizeFactor) < 160) {
-                    ldyconst (Offs);
                     AddCodeLine ("jsr staxysp");
                 } else {
-                    ldyconst (Offs);
                     AddCodeLine ("sta (sp),y");
                     AddCodeLine ("iny");
                     AddCodeLine ("txa");
@@ -1092,9 +1090,9 @@ void g_putlocal (unsigned Flags, int Offs, long Val)
 
         case CF_LONG:
             if (Flags & CF_CONST) {
-               g_getimmed (Flags, Val, 0);
+                g_getimmed (Flags, Val, 0);
             }
-            ldyconst (Offs);
+            AddCodeLine ("ldy #$%02X", Offs);
             AddCodeLine ("jsr steaxysp");
             break;
 
@@ -1150,20 +1148,18 @@ void g_putind (unsigned Flags, unsigned Offs)
     }
 
     /* Check the size and determine operation */
-    switch (Flags & CF_TYPE) {
+    AddCodeLine ("ldy #$%02X", Offs);
+    switch (Flags & CF_TYPEMASK) {
 
         case CF_CHAR:
-            ldyconst (Offs);
             AddCodeLine ("jsr staspidx");
             break;
 
         case CF_INT:
-            ldyconst (Offs);
             AddCodeLine ("jsr staxspidx");
             break;
 
         case CF_LONG:
-            ldyconst (Offs);
             AddCodeLine ("jsr steaxspidx");
             break;
 
@@ -1179,7 +1175,7 @@ void g_putind (unsigned Flags, unsigned Offs)
 
 
 /*****************************************************************************/
-/*                    type conversion and similiar stuff                    */
+/*                    type conversion and similiar stuff                     */
 /*****************************************************************************/
 
 
@@ -1187,7 +1183,7 @@ void g_putind (unsigned Flags, unsigned Offs)
 void g_toslong (unsigned flags)
 /* Make sure, the value on TOS is a long. Convert if necessary */
 {
-    switch (flags & CF_TYPE) {
+    switch (flags & CF_TYPEMASK) {
 
         case CF_CHAR:
         case CF_INT:
@@ -1212,7 +1208,7 @@ void g_toslong (unsigned flags)
 void g_tosint (unsigned flags)
 /* Make sure, the value on TOS is an int. Convert if necessary */
 {
-    switch (flags & CF_TYPE) {
+    switch (flags & CF_TYPEMASK) {
 
         case CF_CHAR:
         case CF_INT:
@@ -1235,7 +1231,7 @@ void g_regint (unsigned Flags)
 {
     unsigned L;
 
-    switch (Flags & CF_TYPE) {
+    switch (Flags & CF_TYPEMASK) {
 
         case CF_CHAR:
             if (Flags & CF_FORCECHAR) {
@@ -1269,7 +1265,7 @@ void g_reglong (unsigned Flags)
 {
     unsigned L;
 
-    switch (Flags & CF_TYPE) {
+    switch (Flags & CF_TYPEMASK) {
 
         case CF_CHAR:
             if (Flags & CF_FORCECHAR) {
@@ -1301,15 +1297,15 @@ void g_reglong (unsigned Flags)
 
         case CF_INT:
             if (Flags & CF_UNSIGNED) {
-               if (IS_Get (&CodeSizeFactor) >= 200) {
-                   ldyconst (0);
-                   AddCodeLine ("sty sreg");
-                   AddCodeLine ("sty sreg+1");
-               } else {
-                           AddCodeLine ("jsr axulong");
-               }
+                if (IS_Get (&CodeSizeFactor) >= 200) {
+                    AddCodeLine ("ldy #$00");
+                    AddCodeLine ("sty sreg");
+                    AddCodeLine ("sty sreg+1");
+                } else {
+                    AddCodeLine ("jsr axulong");
+                }
             } else {
-               AddCodeLine ("jsr axlong");
+                AddCodeLine ("jsr axlong");
             }
             break;
 
@@ -1333,15 +1329,15 @@ unsigned g_typeadjust (unsigned lhs, unsigned rhs)
     unsigned result;
 
     /* Get the type spec from the flags */
-    ltype = lhs & CF_TYPE;
-    rtype = rhs & CF_TYPE;
+    ltype = lhs & CF_TYPEMASK;
+    rtype = rhs & CF_TYPEMASK;
 
     /* Check if a conversion is needed */
     if (ltype == CF_LONG && rtype != CF_LONG && (rhs & CF_CONST) == 0) {
         /* We must promote the primary register to long */
         g_reglong (rhs);
         /* Get the new rhs type */
-        rhs = (rhs & ~CF_TYPE) | CF_LONG;
+        rhs = (rhs & ~CF_TYPEMASK) | CF_LONG;
         rtype = CF_LONG;
     } else if (ltype != CF_LONG && (lhs & CF_CONST) == 0 && rtype == CF_LONG) {
         /* We must promote the lhs to long */
@@ -1351,7 +1347,7 @@ unsigned g_typeadjust (unsigned lhs, unsigned rhs)
             g_toslong (lhs);
         }
         /* Get the new rhs type */
-        lhs = (lhs & ~CF_TYPE) | CF_LONG;
+        lhs = (lhs & ~CF_TYPEMASK) | CF_LONG;
         ltype = CF_LONG;
     }
 
@@ -1381,8 +1377,8 @@ unsigned g_typecast (unsigned lhs, unsigned rhs)
     unsigned ltype, rtype;
 
     /* Get the type spec from the flags */
-    ltype = lhs & CF_TYPE;
-    rtype = rhs & CF_TYPE;
+    ltype = lhs & CF_TYPEMASK;
+    rtype = rhs & CF_TYPEMASK;
 
     /* Check if a conversion is needed */
     if ((rhs & CF_CONST) == 0) {
@@ -1430,32 +1426,32 @@ void g_scale (unsigned flags, long val)
         if ((p2 = PowerOf2 (val)) > 0 && p2 <= 4) {
 
             /* Factor is 2, 4, 8 and 16, use special function */
-            switch (flags & CF_TYPE) {
+            switch (flags & CF_TYPEMASK) {
 
                 case CF_CHAR:
                     if (flags & CF_FORCECHAR) {
-                       while (p2--) {
-                           AddCodeLine ("asl a");
-                       }
-                       break;
-                   }
-                   /* FALLTHROUGH */
-
-               case CF_INT:
+                        while (p2--) {
+                            AddCodeLine ("asl a");
+                        }
+                        break;
+                    }
+                    /* FALLTHROUGH */
+
+                case CF_INT:
                     if (flags & CF_UNSIGNED) {
                         AddCodeLine ("jsr shlax%d", p2);
                     } else {
                         AddCodeLine ("jsr aslax%d", p2);
                     }
-                   break;
+                    break;
 
-               case CF_LONG:
-                   if (flags & CF_UNSIGNED) {
-                       AddCodeLine ("jsr shleax%d", p2);
-                   } else {
-                       AddCodeLine ("jsr asleax%d", p2);
-                   }
-                   break;
+                case CF_LONG:
+                    if (flags & CF_UNSIGNED) {
+                        AddCodeLine ("jsr shleax%d", p2);
+                    } else {
+                        AddCodeLine ("jsr asleax%d", p2);
+                    }
+                    break;
 
                 default:
                     typeerror (flags);
@@ -1476,17 +1472,17 @@ void g_scale (unsigned flags, long val)
         if ((p2 = PowerOf2 (val)) > 0 && p2 <= 4) {
 
             /* Factor is 2, 4, 8 and 16 use special function */
-            switch (flags & CF_TYPE) {
+            switch (flags & CF_TYPEMASK) {
 
                 case CF_CHAR:
                     if (flags & CF_FORCECHAR) {
                         if (flags & CF_UNSIGNED) {
                             while (p2--) {
-                               AddCodeLine ("lsr a");
+                                AddCodeLine ("lsr a");
                             }
                             break;
                         } else if (p2 <= 2) {
-                           AddCodeLine ("cmp #$80");
+                            AddCodeLine ("cmp #$80");
                             AddCodeLine ("ror a");
                             break;
                         }
@@ -1503,9 +1499,9 @@ void g_scale (unsigned flags, long val)
 
                 case CF_LONG:
                     if (flags & CF_UNSIGNED) {
-                       AddCodeLine ("jsr lsreax%d", p2);
+                        AddCodeLine ("jsr lsreax%d", p2);
                     } else {
-                               AddCodeLine ("jsr asreax%d", p2);
+                        AddCodeLine ("jsr asreax%d", p2);
                     }
                     break;
 
@@ -1526,7 +1522,7 @@ void g_scale (unsigned flags, long val)
 
 
 /*****************************************************************************/
-/*             Adds and subs of variables fix a fixed address               */
+/*              Adds and subs of variables fix a fixed address               */
 /*****************************************************************************/
 
 
@@ -1540,7 +1536,7 @@ void g_addlocal (unsigned flags, int offs)
     offs -= StackPtr;
     CheckLocalOffs (offs);
 
-    switch (flags & CF_TYPE) {
+    switch (flags & CF_TYPEMASK) {
 
         case CF_CHAR:
             L = GetLocalLabel();
@@ -1587,7 +1583,7 @@ void g_addstatic (unsigned flags, unsigned long label, long offs)
     /* Create the correct label name */
     const char* lbuf = GetLabelName (flags, label, offs);
 
-    switch (flags & CF_TYPE) {
+    switch (flags & CF_TYPEMASK) {
 
         case CF_CHAR:
             L = GetLocalLabel();
@@ -1624,42 +1620,42 @@ void g_addstatic (unsigned flags, unsigned long label, long offs)
 
 
 /*****************************************************************************/
-/*                          Special op= functions                           */
+/*                           Special op= functions                           */
 /*****************************************************************************/
 
 
 
 void g_addeqstatic (unsigned flags, unsigned long label, long offs,
-                   unsigned long val)
+                    unsigned long val)
 /* Emit += for a static variable */
 {
     /* Create the correct label name */
     const char* lbuf = GetLabelName (flags, label, offs);
 
     /* Check the size and determine operation */
-    switch (flags & CF_TYPE) {
+    switch (flags & CF_TYPEMASK) {
 
         case CF_CHAR:
             if (flags & CF_FORCECHAR) {
-                       AddCodeLine ("ldx #$00");
-               if (flags & CF_CONST) {
-                   if (val == 1) {
-                       AddCodeLine ("inc %s", lbuf);
-                       AddCodeLine ("lda %s", lbuf);
-                   } else {
-                               AddCodeLine ("lda #$%02X", (int)(val & 0xFF));
-                       AddCodeLine ("clc");
-                       AddCodeLine ("adc %s", lbuf);
-                       AddCodeLine ("sta %s", lbuf);
-                   }
-                       } else {
-                   AddCodeLine ("clc");
-                   AddCodeLine ("adc %s", lbuf);
-                   AddCodeLine ("sta %s", lbuf);
-               }
-               if ((flags & CF_UNSIGNED) == 0) {
+                AddCodeLine ("ldx #$00");
+                if (flags & CF_CONST) {
+                    if (val == 1) {
+                        AddCodeLine ("inc %s", lbuf);
+                        AddCodeLine ("lda %s", lbuf);
+                    } else {
+                        AddCodeLine ("lda #$%02X", (int)(val & 0xFF));
+                        AddCodeLine ("clc");
+                        AddCodeLine ("adc %s", lbuf);
+                        AddCodeLine ("sta %s", lbuf);
+                    }
+                } else {
+                    AddCodeLine ("clc");
+                    AddCodeLine ("adc %s", lbuf);
+                    AddCodeLine ("sta %s", lbuf);
+                }
+                if ((flags & CF_UNSIGNED) == 0) {
                     unsigned L = GetLocalLabel();
-                   AddCodeLine ("bpl %s", LocalLabelName (L));
+                    AddCodeLine ("bpl %s", LocalLabelName (L));
                     AddCodeLine ("dex");
                     g_defcodelabel (L);
                 }
@@ -1675,25 +1671,25 @@ void g_addeqstatic (unsigned flags, unsigned long label, long offs,
                     AddCodeLine ("bne %s", LocalLabelName (L));
                     AddCodeLine ("inc %s+1", lbuf);
                     g_defcodelabel (L);
-                    AddCodeLine ("lda %s", lbuf);              /* Hmmm... */
+                    AddCodeLine ("lda %s", lbuf);               /* Hmmm... */
                     AddCodeLine ("ldx %s+1", lbuf);
                 } else {
-                           AddCodeLine ("lda #$%02X", (int)(val & 0xFF));
+                    AddCodeLine ("lda #$%02X", (int)(val & 0xFF));
                     AddCodeLine ("clc");
                     AddCodeLine ("adc %s", lbuf);
                     AddCodeLine ("sta %s", lbuf);
                     if (val < 0x100) {
-                               unsigned L = GetLocalLabel ();
-                               AddCodeLine ("bcc %s", LocalLabelName (L));
-                               AddCodeLine ("inc %s+1", lbuf);
-                               g_defcodelabel (L);
-                               AddCodeLine ("ldx %s+1", lbuf);
+                        unsigned L = GetLocalLabel ();
+                        AddCodeLine ("bcc %s", LocalLabelName (L));
+                        AddCodeLine ("inc %s+1", lbuf);
+                        g_defcodelabel (L);
+                        AddCodeLine ("ldx %s+1", lbuf);
                     } else {
-                               AddCodeLine ("lda #$%02X", (unsigned char)(val >> 8));
-                               AddCodeLine ("adc %s+1", lbuf);
-                               AddCodeLine ("sta %s+1", lbuf);
-                               AddCodeLine ("tax");
-                               AddCodeLine ("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 {
@@ -1702,9 +1698,9 @@ void g_addeqstatic (unsigned flags, unsigned long label, long offs,
                 AddCodeLine ("sta %s", lbuf);
                 AddCodeLine ("txa");
                 AddCodeLine ("adc %s+1", lbuf);
-               AddCodeLine ("sta %s+1", lbuf);
-               AddCodeLine ("tax");
-               AddCodeLine ("lda %s", lbuf);
+                AddCodeLine ("sta %s+1", lbuf);
+                AddCodeLine ("tax");
+                AddCodeLine ("lda %s", lbuf);
             }
             break;
 
@@ -1718,7 +1714,7 @@ void g_addeqstatic (unsigned flags, unsigned long label, long offs,
                         AddCodeLine ("jsr laddeq1");
                     } else {
                         AddCodeLine ("lda #$%02X", (int)(val & 0xFF));
-                       AddCodeLine ("jsr laddeqa");
+                        AddCodeLine ("jsr laddeqa");
                     }
                 } else {
                     g_getstatic (flags, label, offs);
@@ -1740,19 +1736,19 @@ void g_addeqstatic (unsigned flags, unsigned long label, long offs,
 
 
 
-void g_addeqlocal (unsigned flags, int offs, unsigned long val)
+void g_addeqlocal (unsigned flags, int Offs, unsigned long val)
 /* Emit += for a local variable */
 {
     /* Calculate the true offset, check it, load it into Y */
-    offs -= StackPtr;
-    CheckLocalOffs (offs);
+    Offs -= StackPtr;
+    CheckLocalOffs (Offs);
 
     /* Check the size and determine operation */
-    switch (flags & CF_TYPE) {
+    switch (flags & CF_TYPEMASK) {
 
         case CF_CHAR:
             if (flags & CF_FORCECHAR) {
-                ldyconst (offs);
+                AddCodeLine ("ldy #$%02X", Offs);
                 AddCodeLine ("ldx #$00");
                 if (flags & CF_CONST) {
                     AddCodeLine ("clc");
@@ -1764,18 +1760,18 @@ void g_addeqlocal (unsigned flags, int offs, unsigned long val)
                     AddCodeLine ("adc (sp),y");
                     AddCodeLine ("sta (sp),y");
                 }
-               if ((flags & CF_UNSIGNED) == 0) {
+                if ((flags & CF_UNSIGNED) == 0) {
                     unsigned L = GetLocalLabel();
-                   AddCodeLine ("bpl %s", LocalLabelName (L));
-                   AddCodeLine ("dex");
+                    AddCodeLine ("bpl %s", LocalLabelName (L));
+                    AddCodeLine ("dex");
                     g_defcodelabel (L);
-               }
-               break;
+                }
+                break;
             }
             /* FALLTHROUGH */
 
         case CF_INT:
-            ldyconst (offs);
+            AddCodeLine ("ldy #$%02X", Offs);
             if (flags & CF_CONST) {
                 if (IS_Get (&CodeSizeFactor) >= 400) {
                     AddCodeLine ("clc");
@@ -1794,15 +1790,15 @@ void g_addeqlocal (unsigned flags, int offs, unsigned long val)
                     AddCodeLine ("jsr addeqysp");
                 }
             } else {
-               AddCodeLine ("jsr addeqysp");
+                AddCodeLine ("jsr addeqysp");
             }
             break;
 
         case CF_LONG:
             if (flags & CF_CONST) {
-               g_getimmed (flags, val, 0);
+                g_getimmed (flags, val, 0);
             }
-            ldyconst (offs);
+            AddCodeLine ("ldy #$%02X", Offs);
             AddCodeLine ("jsr laddeqysp");
             break;
 
@@ -1823,7 +1819,7 @@ void g_addeqind (unsigned flags, unsigned offs, unsigned long val)
     offs = MakeByteOffs (flags, offs);
 
     /* Check the size and determine operation */
-    switch (flags & CF_TYPE) {
+    switch (flags & CF_TYPEMASK) {
 
         case CF_CHAR:
             AddCodeLine ("sta ptr1");
@@ -1837,32 +1833,12 @@ void g_addeqind (unsigned flags, unsigned offs, unsigned long val)
             break;
 
         case CF_INT:
-            if (IS_Get (&CodeSizeFactor) >= 200) {
-                /* Lots of code, use only if size is not important */
-                       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:
-            AddCodeLine ("jsr pushax");        /* Push the address */
-            push (CF_PTR);                     /* Correct the internal sp */
-            g_getind (flags, offs);            /* Fetch the value */
-            g_inc (flags, val);                        /* Increment value in primary */
-            g_putind (flags, offs);            /* Store the value back */
+            AddCodeLine ("jsr pushax");         /* Push the address */
+            push (CF_PTR);                      /* Correct the internal sp */
+            g_getind (flags, offs);             /* Fetch the value */
+            g_inc (flags, val);                 /* Increment value in primary */
+            g_putind (flags, offs);             /* Store the value back */
             break;
 
         default:
@@ -1880,46 +1856,46 @@ void g_subeqstatic (unsigned flags, unsigned long label, long offs,
     const char* lbuf = GetLabelName (flags, label, offs);
 
     /* Check the size and determine operation */
-    switch (flags & CF_TYPE) {
+    switch (flags & CF_TYPEMASK) {
 
         case CF_CHAR:
             if (flags & CF_FORCECHAR) {
                 AddCodeLine ("ldx #$00");
-               if (flags & CF_CONST) {
+                if (flags & CF_CONST) {
                     if (val == 1) {
                         AddCodeLine ("dec %s", lbuf);
                         AddCodeLine ("lda %s", lbuf);
                     } else {
-                       AddCodeLine ("lda %s", lbuf);
-                               AddCodeLine ("sec");
-                       AddCodeLine ("sbc #$%02X", (int)(val & 0xFF));
-                       AddCodeLine ("sta %s", lbuf);
+                        AddCodeLine ("lda %s", lbuf);
+                        AddCodeLine ("sec");
+                        AddCodeLine ("sbc #$%02X", (int)(val & 0xFF));
+                        AddCodeLine ("sta %s", lbuf);
                     }
-               } else {
+                } else {
                     AddCodeLine ("eor #$FF");
                     AddCodeLine ("sec");
-                           AddCodeLine ("adc %s", lbuf);
+                    AddCodeLine ("adc %s", lbuf);
                     AddCodeLine ("sta %s", lbuf);
-               }
+                }
                 if ((flags & CF_UNSIGNED) == 0) {
                     unsigned L = GetLocalLabel();
                     AddCodeLine ("bpl %s", LocalLabelName (L));
                     AddCodeLine ("dex");
                     g_defcodelabel (L);
-               }
-               break;
+                }
+                break;
             }
             /* FALLTHROUGH */
 
         case CF_INT:
             if (flags & CF_CONST) {
-                       AddCodeLine ("lda %s", lbuf);
+                AddCodeLine ("lda %s", lbuf);
                 AddCodeLine ("sec");
-               AddCodeLine ("sbc #$%02X", (unsigned char)val);
-               AddCodeLine ("sta %s", lbuf);
-               if (val < 0x100) {
-                   unsigned L = GetLocalLabel ();
-                   AddCodeLine ("bcs %s", LocalLabelName (L));
+                AddCodeLine ("sbc #$%02X", (unsigned char)val);
+                AddCodeLine ("sta %s", lbuf);
+                if (val < 0x100) {
+                    unsigned L = GetLocalLabel ();
+                    AddCodeLine ("bcs %s", LocalLabelName (L));
                     AddCodeLine ("dec %s+1", lbuf);
                     g_defcodelabel (L);
                     AddCodeLine ("ldx %s+1", lbuf);
@@ -1933,11 +1909,11 @@ void g_subeqstatic (unsigned flags, unsigned long label, long offs,
             } else {
                 AddCodeLine ("eor #$FF");
                 AddCodeLine ("sec");
-                       AddCodeLine ("adc %s", lbuf);
+                AddCodeLine ("adc %s", lbuf);
                 AddCodeLine ("sta %s", lbuf);
                 AddCodeLine ("txa");
                 AddCodeLine ("eor #$FF");
-                       AddCodeLine ("adc %s+1", lbuf);
+                AddCodeLine ("adc %s+1", lbuf);
                 AddCodeLine ("sta %s+1", lbuf);
                 AddCodeLine ("tax");
                 AddCodeLine ("lda %s", lbuf);
@@ -1972,19 +1948,19 @@ void g_subeqstatic (unsigned flags, unsigned long label, long offs,
 
 
 
-void g_subeqlocal (unsigned flags, int offs, unsigned long val)
+void g_subeqlocal (unsigned flags, int Offs, unsigned long val)
 /* Emit -= for a local variable */
 {
     /* Calculate the true offset, check it, load it into Y */
-    offs -= StackPtr;
-    CheckLocalOffs (offs);
+    Offs -= StackPtr;
+    CheckLocalOffs (Offs);
 
     /* Check the size and determine operation */
-    switch (flags & CF_TYPE) {
+    switch (flags & CF_TYPEMASK) {
 
         case CF_CHAR:
             if (flags & CF_FORCECHAR) {
-               ldyconst (offs);
+                AddCodeLine ("ldy #$%02X", Offs);
                 AddCodeLine ("ldx #$00");
                 if (flags & CF_CONST) {
                     AddCodeLine ("lda (sp),y");
@@ -1993,32 +1969,32 @@ void g_subeqlocal (unsigned flags, int offs, unsigned long val)
                 } else {
                     AddCodeLine ("eor #$FF");
                     AddCodeLine ("sec");
-                   AddCodeLine ("adc (sp),y");
+                    AddCodeLine ("adc (sp),y");
                 }
-               AddCodeLine ("sta (sp),y");
+                AddCodeLine ("sta (sp),y");
                 if ((flags & CF_UNSIGNED) == 0) {
-                   unsigned L = GetLocalLabel();
-                           AddCodeLine ("bpl %s", LocalLabelName (L));
-                   AddCodeLine ("dex");
-                   g_defcodelabel (L);
-               }
-               break;
+                    unsigned L = GetLocalLabel();
+                    AddCodeLine ("bpl %s", LocalLabelName (L));
+                    AddCodeLine ("dex");
+                    g_defcodelabel (L);
+                }
+                break;
             }
             /* FALLTHROUGH */
 
         case CF_INT:
             if (flags & CF_CONST) {
-               g_getimmed (flags, val, 0);
+                g_getimmed (flags, val, 0);
             }
-            ldyconst (offs);
+            AddCodeLine ("ldy #$%02X", Offs);
             AddCodeLine ("jsr subeqysp");
             break;
 
         case CF_LONG:
             if (flags & CF_CONST) {
-               g_getimmed (flags, val, 0);
+                g_getimmed (flags, val, 0);
             }
-            ldyconst (offs);
+            AddCodeLine ("ldy #$%02X", Offs);
             AddCodeLine ("jsr lsubeqysp");
             break;
 
@@ -2039,7 +2015,7 @@ void g_subeqind (unsigned flags, unsigned offs, unsigned long val)
     offs = MakeByteOffs (flags, offs);
 
     /* Check the size and determine operation */
-    switch (flags & CF_TYPE) {
+    switch (flags & CF_TYPEMASK) {
 
         case CF_CHAR:
             AddCodeLine ("sta ptr1");
@@ -2053,32 +2029,12 @@ void g_subeqind (unsigned flags, unsigned offs, unsigned long val)
             break;
 
         case CF_INT:
-            if (IS_Get (&CodeSizeFactor) >= 200) {
-                /* Lots of code, use only if size is not important */
-                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:
-            AddCodeLine ("jsr pushax");        /* Push the address */
-            push (CF_PTR);                     /* Correct the internal sp */
-            g_getind (flags, offs);            /* Fetch the value */
-            g_dec (flags, val);                        /* Increment value in primary */
-            g_putind (flags, offs);            /* Store the value back */
+            AddCodeLine ("jsr pushax");         /* Push the address */
+            push (CF_PTR);                      /* Correct the internal sp */
+            g_getind (flags, offs);             /* Fetch the value */
+            g_dec (flags, val);                 /* Increment value in primary */
+            g_putind (flags, offs);             /* Store the value back */
             break;
 
         default:
@@ -2089,7 +2045,7 @@ void g_subeqind (unsigned flags, unsigned offs, unsigned long val)
 
 
 /*****************************************************************************/
-/*                 Add a variable address to the value in ax                */
+/*                 Add a variable address to the value in ax                 */
 /*****************************************************************************/
 
 
@@ -2147,7 +2103,7 @@ void g_addaddr_static (unsigned flags, unsigned long label, long offs)
 
 
 /*****************************************************************************/
-/*                                                                          */
+/*                                                                           */
 /*****************************************************************************/
 
 
@@ -2156,11 +2112,11 @@ void g_save (unsigned flags)
 /* Copy primary register to hold register. */
 {
     /* Check the size and determine operation */
-    switch (flags & CF_TYPE) {
+    switch (flags & CF_TYPEMASK) {
 
         case CF_CHAR:
             if (flags & CF_FORCECHAR) {
-               AddCodeLine ("pha");
+                AddCodeLine ("pha");
                 break;
             }
             /* FALLTHROUGH */
@@ -2185,12 +2141,12 @@ void g_restore (unsigned flags)
 /* Copy hold register to primary. */
 {
     /* Check the size and determine operation */
-    switch (flags & CF_TYPE) {
+    switch (flags & CF_TYPEMASK) {
 
         case CF_CHAR:
             if (flags & CF_FORCECHAR) {
-                       AddCodeLine ("pla");
-               break;
+                AddCodeLine ("pla");
+                break;
             }
             /* FALLTHROUGH */
 
@@ -2218,12 +2174,12 @@ void g_cmp (unsigned flags, unsigned long val)
     unsigned L;
 
     /* Check the size and determine operation */
-    switch (flags & CF_TYPE) {
+    switch (flags & CF_TYPEMASK) {
 
         case CF_CHAR:
             if (flags & CF_FORCECHAR) {
-                       AddCodeLine ("cmp #$%02X", (unsigned char)val);
-                       break;
+                AddCodeLine ("cmp #$%02X", (unsigned char)val);
+                break;
             }
             /* FALLTHROUGH */
 
@@ -2248,17 +2204,17 @@ void g_cmp (unsigned flags, unsigned long val)
 
 static void oper (unsigned Flags, unsigned long Val, const char** Subs)
 /* Encode a binary operation. subs is a pointer to four strings:
- *      0      --> Operate on ints
- *      1      --> Operate on unsigneds
- *      2      --> Operate on longs
- *      3      --> Operate on unsigned longs
+ *      0       --> Operate on ints
+ *      1       --> Operate on unsigneds
+ *      2       --> Operate on longs
+ *      3       --> Operate on unsigned longs
  */
 {
     /* Determine the offset into the array */
     if (Flags & CF_UNSIGNED) {
         ++Subs;
     }
-    if ((Flags & CF_TYPE) == CF_LONG) {
+    if ((Flags & CF_TYPEMASK) == CF_LONG) {
         Subs += 2;
     }
 
@@ -2280,7 +2236,7 @@ static void oper (unsigned Flags, unsigned long Val, const char** Subs)
 void g_test (unsigned flags)
 /* Test the value in the primary and set the condition codes */
 {
-    switch (flags & CF_TYPE) {
+    switch (flags & CF_TYPEMASK) {
 
         case CF_CHAR:
             if (flags & CF_FORCECHAR) {
@@ -2296,9 +2252,9 @@ void g_test (unsigned flags)
 
         case CF_LONG:
             if (flags & CF_UNSIGNED) {
-               AddCodeLine ("jsr utsteax");
+                AddCodeLine ("jsr utsteax");
             } else {
-               AddCodeLine ("jsr tsteax");
+                AddCodeLine ("jsr tsteax");
             }
             break;
 
@@ -2313,13 +2269,13 @@ void g_test (unsigned flags)
 void g_push (unsigned flags, unsigned long val)
 /* Push the primary register or a constant value onto the stack */
 {
-    if (flags & CF_CONST && (flags & CF_TYPE) != CF_LONG) {
+    if (flags & CF_CONST && (flags & CF_TYPEMASK) != CF_LONG) {
 
         /* We have a constant 8 or 16 bit value */
-        if ((flags & CF_TYPE) == CF_CHAR && (flags & CF_FORCECHAR)) {
+        if ((flags & CF_TYPEMASK) == CF_CHAR && (flags & CF_FORCECHAR)) {
 
             /* Handle as 8 bit value */
-            ldaconst (val);
+            AddCodeLine ("lda #$%02X", (unsigned char) val);
             AddCodeLine ("jsr pusha");
 
         } else {
@@ -2338,7 +2294,7 @@ void g_push (unsigned flags, unsigned long val)
         }
 
         /* Push the primary register */
-        switch (flags & CF_TYPE) {
+        switch (flags & CF_TYPEMASK) {
 
             case CF_CHAR:
                 if (flags & CF_FORCECHAR) {
@@ -2352,7 +2308,7 @@ void g_push (unsigned flags, unsigned long val)
                 break;
 
             case CF_LONG:
-               AddCodeLine ("jsr pusheax");
+                AddCodeLine ("jsr pusheax");
                 break;
 
             default:
@@ -2373,7 +2329,7 @@ void g_swap (unsigned flags)
  * of *both* values (must have same size).
  */
 {
-    switch (flags & CF_TYPE) {
+    switch (flags & CF_TYPEMASK) {
 
         case CF_CHAR:
         case CF_INT:
@@ -2397,7 +2353,7 @@ void g_call (unsigned Flags, const char* Label, unsigned ArgSize)
 {
     if ((Flags & CF_FIXARGC) == 0) {
         /* Pass the argument count */
-        ldyconst (ArgSize);
+        AddCodeLine ("ldy #$%02X", ArgSize);
     }
     AddCodeLine ("jsr _%s", Label);
     StackPtr += ArgSize;                /* callee pops args */
@@ -2412,7 +2368,7 @@ void g_callind (unsigned Flags, unsigned ArgSize, int Offs)
         /* Address is in a/x */
         if ((Flags & CF_FIXARGC) == 0) {
             /* Pass arg count */
-            ldyconst (ArgSize);
+            AddCodeLine ("ldy #$%02X", ArgSize);
         }
         AddCodeLine ("jsr callax");
     } else {
@@ -2460,26 +2416,56 @@ void g_falsejump (unsigned flags attribute ((unused)), unsigned label)
 
 
 
-static void mod_internal (int k, char* verb1, char* verb2)
+void g_drop (unsigned Space)
+/* Drop space allocated on the stack */
 {
-    if (k <= 8) {
-        AddCodeLine ("jsr %ssp%c", verb1, k + '0');
-    } else {
-        CheckLocalOffs (k);
-        ldyconst (k);
-        AddCodeLine ("jsr %ssp", verb2);
+    if (Space > 255) {
+        /* Inline the code since calling addysp repeatedly is quite some
+         * overhead.
+         */
+        AddCodeLine ("pha");
+        AddCodeLine ("lda #$%02X", (unsigned char) Space);
+        AddCodeLine ("clc");
+        AddCodeLine ("adc sp");
+        AddCodeLine ("sta sp");
+        AddCodeLine ("lda #$%02X", (unsigned char) (Space >> 8));
+        AddCodeLine ("adc sp+1");
+        AddCodeLine ("sta sp+1");
+        AddCodeLine ("pla");
+    } else if (Space > 8) {
+        AddCodeLine ("ldy #$%02X", Space);
+        AddCodeLine ("jsr addysp");
+    } else if (Space != 0) {
+        AddCodeLine ("jsr incsp%u", Space);
     }
 }
 
 
 
-void g_space (int space)
+void g_space (int Space)
 /* Create or drop space on the stack */
 {
-    if (space < 0) {
-        mod_internal (-space, "inc", "addy");
-    } else if (space > 0) {
-        mod_internal (space, "dec", "suby");
+    if (Space < 0) {
+        /* This is actually a drop operation */
+        g_drop (-Space);
+    } else if (Space > 255) {
+        /* Inline the code since calling subysp repeatedly is quite some
+         * overhead.
+         */
+        AddCodeLine ("pha");
+        AddCodeLine ("lda sp");
+        AddCodeLine ("sec");
+        AddCodeLine ("sbc #$%02X", (unsigned char) Space);
+        AddCodeLine ("sta sp");
+        AddCodeLine ("lda sp+1");
+        AddCodeLine ("sbc #$%02X", (unsigned char) (Space >> 8));
+        AddCodeLine ("sta sp+1");
+        AddCodeLine ("pla");
+    } else if (Space > 8) {
+        AddCodeLine ("ldy #$%02X", Space);
+        AddCodeLine ("jsr subysp");
+    } else if (Space != 0) {
+        AddCodeLine ("jsr decsp%u", Space);
     }
 }
 
@@ -2509,7 +2495,7 @@ void g_add (unsigned flags, unsigned long val)
     };
 
     if (flags & CF_CONST) {
-        flags &= ~CF_FORCECHAR;        /* Handle chars as ints */
+        flags &= ~CF_FORCECHAR; /* Handle chars as ints */
         g_push (flags & ~CF_CONST, 0);
     }
     oper (flags, val, ops);
@@ -2525,7 +2511,7 @@ void g_sub (unsigned flags, unsigned long val)
     };
 
     if (flags & CF_CONST) {
-        flags &= ~CF_FORCECHAR;        /* Handle chars as ints */
+        flags &= ~CF_FORCECHAR; /* Handle chars as ints */
         g_push (flags & ~CF_CONST, 0);
     }
     oper (flags, val, ops);
@@ -2565,44 +2551,44 @@ void g_mul (unsigned flags, unsigned long val)
      */
     if (flags & CF_CONST) {
 
-        switch (flags & CF_TYPE) {
+        switch (flags & CF_TYPEMASK) {
 
             case CF_CHAR:
                 if (flags & CF_FORCECHAR) {
                     /* Handle some special cases */
                     switch (val) {
 
-                       case 3:
-                           AddCodeLine ("sta tmp1");
-                           AddCodeLine ("asl a");
-                           AddCodeLine ("clc");
-                           AddCodeLine ("adc tmp1");
-                           return;
-
-                       case 5:
-                           AddCodeLine ("sta tmp1");
-                           AddCodeLine ("asl a");
-                           AddCodeLine ("asl a");
-                           AddCodeLine ("clc");
-                           AddCodeLine ("adc tmp1");
-                           return;
-
-                       case 6:
-                           AddCodeLine ("sta tmp1");
-                           AddCodeLine ("asl a");
-                           AddCodeLine ("clc");
-                           AddCodeLine ("adc tmp1");
+                        case 3:
+                            AddCodeLine ("sta tmp1");
+                            AddCodeLine ("asl a");
+                            AddCodeLine ("clc");
+                            AddCodeLine ("adc tmp1");
+                            return;
+
+                        case 5:
+                            AddCodeLine ("sta tmp1");
+                            AddCodeLine ("asl a");
+                            AddCodeLine ("asl a");
+                            AddCodeLine ("clc");
+                            AddCodeLine ("adc tmp1");
+                            return;
+
+                        case 6:
+                            AddCodeLine ("sta tmp1");
+                            AddCodeLine ("asl a");
+                            AddCodeLine ("clc");
+                            AddCodeLine ("adc tmp1");
+                            AddCodeLine ("asl a");
+                            return;
+
+                        case 10:
+                            AddCodeLine ("sta tmp1");
                             AddCodeLine ("asl a");
-                           return;
-
-                       case 10:
-                           AddCodeLine ("sta tmp1");
-                           AddCodeLine ("asl a");
-                           AddCodeLine ("asl a");
-                           AddCodeLine ("clc");
-                           AddCodeLine ("adc tmp1");
-                           AddCodeLine ("asl a");
-                           return;
+                            AddCodeLine ("asl a");
+                            AddCodeLine ("clc");
+                            AddCodeLine ("adc tmp1");
+                            AddCodeLine ("asl a");
+                            return;
                     }
                 }
                 /* FALLTHROUGH */
@@ -2640,7 +2626,7 @@ void g_mul (unsigned flags, unsigned long val)
         /* If we go here, we didn't emit code. Push the lhs on stack and fall
          * into the normal, non-optimized stuff.
          */
-        flags &= ~CF_FORCECHAR;        /* Handle chars as ints */
+        flags &= ~CF_FORCECHAR; /* Handle chars as ints */
         g_push (flags & ~CF_CONST, 0);
 
     }
@@ -2667,7 +2653,7 @@ void g_div (unsigned flags, unsigned long val)
         /* Generate a division */
         if (flags & CF_CONST) {
             /* lhs is not on stack */
-            flags &= ~CF_FORCECHAR;    /* Handle chars as ints */
+            flags &= ~CF_FORCECHAR;     /* Handle chars as ints */
             g_push (flags & ~CF_CONST, 0);
         }
         oper (flags, val, ops);
@@ -2692,7 +2678,7 @@ void g_mod (unsigned flags, unsigned long val)
         /* Do it the hard way... */
         if (flags & CF_CONST) {
             /* lhs is not on stack */
-            flags &= ~CF_FORCECHAR;    /* Handle chars as ints */
+            flags &= ~CF_FORCECHAR;     /* Handle chars as ints */
             g_push (flags & ~CF_CONST, 0);
         }
         oper (flags, val, ops);
@@ -2713,12 +2699,12 @@ void g_or (unsigned flags, unsigned long val)
      */
     if (flags & CF_CONST) {
 
-        switch (flags & CF_TYPE) {
+        switch (flags & CF_TYPEMASK) {
 
             case CF_CHAR:
                 if (flags & CF_FORCECHAR) {
                     if ((val & 0xFF) != 0) {
-                               AddCodeLine ("ora #$%02X", (unsigned char)val);
+                        AddCodeLine ("ora #$%02X", (unsigned char)val);
                     }
                     return;
                 }
@@ -2733,7 +2719,7 @@ void g_or (unsigned flags, unsigned long val)
                     if ((val & 0xFF) != 0) {
                         AddCodeLine ("ora #$%02X", (unsigned char)val);
                     }
-                    ldxconst (0xFF);
+                    AddCodeLine ("ldx #$FF");
                 } else if (val != 0) {
                     AddCodeLine ("ora #$%02X", (unsigned char)val);
                     AddCodeLine ("pha");
@@ -2784,12 +2770,12 @@ void g_xor (unsigned flags, unsigned long val)
      */
     if (flags & CF_CONST) {
 
-        switch (flags & CF_TYPE) {
+        switch (flags & CF_TYPEMASK) {
 
             case CF_CHAR:
                 if (flags & CF_FORCECHAR) {
                     if ((val & 0xFF) != 0) {
-                               AddCodeLine ("eor #$%02X", (unsigned char)val);
+                        AddCodeLine ("eor #$%02X", (unsigned char)val);
                     }
                     return;
                 }
@@ -2798,14 +2784,14 @@ void g_xor (unsigned flags, unsigned long val)
             case CF_INT:
                 if (val <= 0xFF) {
                     if (val != 0) {
-                       AddCodeLine ("eor #$%02X", (unsigned char)val);
+                        AddCodeLine ("eor #$%02X", (unsigned char)val);
                     }
-                       } else if (val != 0) {
+                } else if (val != 0) {
                     if ((val & 0xFF) != 0) {
                         AddCodeLine ("eor #$%02X", (unsigned char)val);
                     }
                     AddCodeLine ("pha");
-                   AddCodeLine ("txa");
+                    AddCodeLine ("txa");
                     AddCodeLine ("eor #$%02X", (unsigned char)(val >> 8));
                     AddCodeLine ("tax");
                     AddCodeLine ("pla");
@@ -2815,7 +2801,7 @@ void g_xor (unsigned flags, unsigned long val)
             case CF_LONG:
                 if (val <= 0xFF) {
                     if (val != 0) {
-                               AddCodeLine ("eor #$%02X", (unsigned char)val);
+                        AddCodeLine ("eor #$%02X", (unsigned char)val);
                     }
                     return;
                 }
@@ -2851,56 +2837,62 @@ void g_and (unsigned Flags, unsigned long Val)
      */
     if (Flags & CF_CONST) {
 
-        switch (Flags & CF_TYPE) {
+        switch (Flags & CF_TYPEMASK) {
 
             case CF_CHAR:
                 if (Flags & CF_FORCECHAR) {
-                    if ((Val & 0xFF) != 0xFF) {
+                    if ((Val & 0xFF) == 0x00) {
+                        AddCodeLine ("lda #$00");
+                    } else if ((Val & 0xFF) != 0xFF) {
                         AddCodeLine ("and #$%02X", (unsigned char)Val);
                     }
-                           return;
-                       }
-                       /* FALLTHROUGH */
+                    return;
+                }
+                /* FALLTHROUGH */
             case CF_INT:
-                       if ((Val & 0xFFFF) != 0xFFFF) {
-                           if (Val <= 0xFF) {
-                               ldxconst (0);
-                               if (Val == 0) {
-                                   ldaconst (0);
-                               } else if (Val != 0xFF) {
-                                   AddCodeLine ("and #$%02X", (unsigned char)Val);
-                               }
-                           } else if ((Val & 0xFF00) == 0xFF00) {
-                               AddCodeLine ("and #$%02X", (unsigned char)Val);
-                           } else if ((Val & 0x00FF) == 0x0000) {
-                               AddCodeLine ("txa");
-                               AddCodeLine ("and #$%02X", (unsigned char)(Val >> 8));
-                       AddCodeLine ("tax");
-                       ldaconst (0);
+                if ((Val & 0xFFFF) != 0xFFFF) {
+                    if (Val <= 0xFF) {
+                        AddCodeLine ("ldx #$00");
+                        if (Val == 0) {
+                            AddCodeLine ("lda #$00");
+                        } else if (Val != 0xFF) {
+                            AddCodeLine ("and #$%02X", (unsigned char)Val);
+                        }
+                    } else if ((Val & 0xFFFF) == 0xFF00) {
+                        AddCodeLine ("lda #$00");
+                    } else if ((Val & 0xFF00) == 0xFF00) {
+                        AddCodeLine ("and #$%02X", (unsigned char)Val);
+                    } else if ((Val & 0x00FF) == 0x0000) {
+                        AddCodeLine ("txa");
+                        AddCodeLine ("and #$%02X", (unsigned char)(Val >> 8));
+                        AddCodeLine ("tax");
+                        AddCodeLine ("lda #$00");
                     } else {
-                       AddCodeLine ("tay");
-                       AddCodeLine ("txa");
-                       AddCodeLine ("and #$%02X", (unsigned char)(Val >> 8));
-                       AddCodeLine ("tax");
-                       AddCodeLine ("tya");
-                       if ((Val & 0x00FF) != 0x00FF) {
-                                   AddCodeLine ("and #$%02X", (unsigned char)Val);
-                       }
+                        AddCodeLine ("tay");
+                        AddCodeLine ("txa");
+                        AddCodeLine ("and #$%02X", (unsigned char)(Val >> 8));
+                        AddCodeLine ("tax");
+                        AddCodeLine ("tya");
+                        if ((Val & 0x00FF) == 0x0000) {
+                            AddCodeLine ("lda #$00");
+                        } else if ((Val & 0x00FF) != 0x00FF) {
+                            AddCodeLine ("and #$%02X", (unsigned char)Val);
+                        }
                     }
                 }
                 return;
 
             case CF_LONG:
                 if (Val <= 0xFF) {
-                    ldxconst (0);
+                    AddCodeLine ("ldx #$00");
                     AddCodeLine ("stx sreg+1");
-                   AddCodeLine ("stx sreg");
+                    AddCodeLine ("stx sreg");
                     if ((Val & 0xFF) != 0xFF) {
-                        AddCodeLine ("and #$%02X", (unsigned char)Val);
+                         AddCodeLine ("and #$%02X", (unsigned char)Val);
                     }
                     return;
                 } else if (Val == 0xFF00) {
-                    ldaconst (0);
+                    AddCodeLine ("lda #$00");
                     AddCodeLine ("sta sreg+1");
                     AddCodeLine ("sta sreg");
                     return;
@@ -2937,62 +2929,106 @@ void g_asr (unsigned flags, unsigned long val)
      */
     if (flags & CF_CONST) {
 
-        switch (flags & CF_TYPE) {
+        switch (flags & CF_TYPEMASK) {
 
             case CF_CHAR:
             case CF_INT:
-                       if (val >= 8 && (flags & CF_UNSIGNED)) {
-                    AddCodeLine ("txa");
-                    ldxconst (0);
+                val &= 0x0F;
+                if (val >= 8) {
+                    if (flags & CF_UNSIGNED) {
+                        AddCodeLine ("txa");
+                        AddCodeLine ("ldx #$00");
+                    } else {
+                        unsigned L = GetLocalLabel();
+                        AddCodeLine ("cpx #$80");   /* Sign bit into carry */
+                        AddCodeLine ("txa");
+                        AddCodeLine ("ldx #$00");
+                        AddCodeLine ("bcc %s", LocalLabelName (L));
+                        AddCodeLine ("dex");        /* Make $FF */
+                        g_defcodelabel (L);
+                    }
                     val -= 8;
                 }
-                if (val == 0) {
-                    /* Done */
-                    return;
-                } else if (val >= 1 && val <= 4) {
+                if (val >= 4) {
                     if (flags & CF_UNSIGNED) {
-                               AddCodeLine ("jsr shrax%ld", val);
+                        AddCodeLine ("jsr shrax4");
                     } else {
-                               AddCodeLine ("jsr asrax%ld", val);
+                        AddCodeLine ("jsr asrax4");
                     }
-                    return;
-                       }
-                break;
-
-            case CF_LONG:
-                if (val == 0) {
-                    /* Nothing to do */
-                    return;
-                } else if (val >= 1 && val <= 4) {
+                    val -= 4;
+                }
+                if (val > 0) {
                     if (flags & CF_UNSIGNED) {
-                               AddCodeLine ("jsr shreax%ld", val);
+                        AddCodeLine ("jsr shrax%ld", val);
                     } else {
-                               AddCodeLine ("jsr asreax%ld", val);
+                        AddCodeLine ("jsr asrax%ld", val);
                     }
-                    return;
-                } else if (val == 8 && (flags & CF_UNSIGNED)) {
-                    AddCodeLine ("txa");
-                    AddCodeLine ("ldx sreg");
-                    AddCodeLine ("ldy sreg+1");
-                    AddCodeLine ("sty sreg");
-                    AddCodeLine ("ldy #$00");
-                    AddCodeLine ("sty sreg+1");
-                    return;
-                } else if (val == 16) {
+                }
+                return;
+
+            case CF_LONG:
+                val &= 0x1F;
+                if (val >= 24) {
+                    AddCodeLine ("ldx #$00");
+                    AddCodeLine ("lda sreg+1");
+                    if ((flags & CF_UNSIGNED) == 0) {
+                        unsigned L = GetLocalLabel();
+                        AddCodeLine ("bpl %s", LocalLabelName (L));
+                        AddCodeLine ("dex");
+                        g_defcodelabel (L);
+                    }
+                    AddCodeLine ("stx sreg");
+                    AddCodeLine ("stx sreg+1");
+                    val -= 24;
+                }
+                if (val >= 16) {
                     AddCodeLine ("ldy #$00");
                     AddCodeLine ("ldx sreg+1");
                     if ((flags & CF_UNSIGNED) == 0) {
-                               unsigned L = GetLocalLabel();
+                        unsigned L = GetLocalLabel();
                         AddCodeLine ("bpl %s", LocalLabelName (L));
                         AddCodeLine ("dey");
-                               g_defcodelabel (L);
+                        g_defcodelabel (L);
                     }
                     AddCodeLine ("lda sreg");
                     AddCodeLine ("sty sreg+1");
                     AddCodeLine ("sty sreg");
-                   return;
+                    val -= 16;
                 }
-                break;
+                if (val >= 8) {
+                    AddCodeLine ("txa");
+                    AddCodeLine ("ldx sreg");
+                    AddCodeLine ("ldy sreg+1");
+                    AddCodeLine ("sty sreg");
+                    if ((flags & CF_UNSIGNED) == 0) {
+                        unsigned L = GetLocalLabel();
+                        AddCodeLine ("cpy #$80");
+                        AddCodeLine ("ldy #$00");
+                        AddCodeLine ("bcc %s", LocalLabelName (L));
+                        AddCodeLine ("dey");
+                        g_defcodelabel (L);
+                    } else {
+                        AddCodeLine ("ldy #$00");
+                    }
+                    AddCodeLine ("sty sreg+1");
+                    val -= 8;
+                }
+                if (val >= 4) {
+                    if (flags & CF_UNSIGNED) {
+                        AddCodeLine ("jsr shreax4");
+                    } else {
+                        AddCodeLine ("jsr asreax4");
+                    }
+                    val -= 4;
+                }
+                if (val > 0) {
+                    if (flags & CF_UNSIGNED) {
+                        AddCodeLine ("jsr shreax%ld", val);
+                    } else {
+                        AddCodeLine ("jsr asreax%ld", val);
+                    }
+                }
+                return;
 
             default:
                 typeerror (flags);
@@ -3025,54 +3061,73 @@ void g_asl (unsigned flags, unsigned long val)
      */
     if (flags & CF_CONST) {
 
-        switch (flags & CF_TYPE) {
+        switch (flags & CF_TYPEMASK) {
 
             case CF_CHAR:
             case CF_INT:
+                val &= 0x0F;
                 if (val >= 8) {
                     AddCodeLine ("tax");
                     AddCodeLine ("lda #$00");
                     val -= 8;
                 }
-                if (val == 0) {
-                    /* Done */
-                    return;
-                } else if (val >= 1 && val <= 4) {
+                if (val >= 4) {
+                    if (flags & CF_UNSIGNED) {
+                        AddCodeLine ("jsr shlax4");
+                    } else {
+                        AddCodeLine ("jsr aslax4");
+                    }
+                    val -= 4;
+                }
+                if (val > 0) {
                     if (flags & CF_UNSIGNED) {
                         AddCodeLine ("jsr shlax%ld", val);
                     } else {
                         AddCodeLine ("jsr aslax%ld", val);
                     }
-                    return;
                 }
-                break;
+                return;
 
             case CF_LONG:
-                if (val == 0) {
-                    /* Nothing to do */
-                    return;
-                } else if (val >= 1 && val <= 4) {
-                    if (flags & CF_UNSIGNED) {
-                               AddCodeLine ("jsr shleax%ld", val);
-                    } else {
-                               AddCodeLine ("jsr asleax%ld", val);
-                    }
-                    return;
-                } else if (val == 8) {
-                    AddCodeLine ("ldy sreg");
-                    AddCodeLine ("sty sreg+1");
-                    AddCodeLine ("stx sreg");
-                    AddCodeLine ("tax");
+                val &= 0x1F;
+                if (val >= 24) {
+                    AddCodeLine ("sta sreg+1");
                     AddCodeLine ("lda #$00");
-                    return;
-                } else if (val == 16) {
+                    AddCodeLine ("tax");
+                    AddCodeLine ("sta sreg");
+                    val -= 24;
+                }
+                if (val >= 16) {
                     AddCodeLine ("stx sreg+1");
                     AddCodeLine ("sta sreg");
                     AddCodeLine ("lda #$00");
                     AddCodeLine ("tax");
-                    return;
+                    val -= 16;
                 }
-                break;
+                if (val >= 8) {
+                    AddCodeLine ("ldy sreg");
+                    AddCodeLine ("sty sreg+1");
+                    AddCodeLine ("stx sreg");
+                    AddCodeLine ("tax");
+                    AddCodeLine ("lda #$00");
+                    val -= 8;
+                }
+                if (val > 4) {
+                    if (flags & CF_UNSIGNED) {
+                        AddCodeLine ("jsr shleax4");
+                    } else {
+                        AddCodeLine ("jsr asleax4");
+                    }
+                    val -= 4;
+                }
+                if (val > 0) {
+                    if (flags & CF_UNSIGNED) {
+                        AddCodeLine ("jsr shleax%ld", val);
+                    } else {
+                        AddCodeLine ("jsr asleax%ld", val);
+                    }
+                }
+                return;
 
             default:
                 typeerror (flags);
@@ -3095,7 +3150,7 @@ void g_asl (unsigned flags, unsigned long val)
 void g_neg (unsigned Flags)
 /* Primary = -Primary */
 {
-    switch (Flags & CF_TYPE) {
+    switch (Flags & CF_TYPEMASK) {
 
         case CF_CHAR:
             if (Flags & CF_FORCECHAR) {
@@ -3124,7 +3179,7 @@ void g_neg (unsigned Flags)
 void g_bneg (unsigned flags)
 /* Primary = !Primary */
 {
-    switch (flags & CF_TYPE) {
+    switch (flags & CF_TYPEMASK) {
 
         case CF_CHAR:
             AddCodeLine ("jsr bnega");
@@ -3148,7 +3203,7 @@ void g_bneg (unsigned flags)
 void g_com (unsigned Flags)
 /* Primary = ~Primary */
 {
-    switch (Flags & CF_TYPE) {
+    switch (Flags & CF_TYPEMASK) {
 
         case CF_CHAR:
             if (Flags & CF_FORCECHAR) {
@@ -3182,15 +3237,15 @@ void g_inc (unsigned flags, unsigned long val)
 
     /* Generate code for the supported types */
     flags &= ~CF_CONST;
-    switch (flags & CF_TYPE) {
+    switch (flags & CF_TYPEMASK) {
 
         case CF_CHAR:
             if (flags & CF_FORCECHAR) {
                 if ((CPUIsets[CPU] & CPU_ISET_65SC02) != 0 && val <= 2) {
                     while (val--) {
-                               AddCodeLine ("ina");
+                        AddCodeLine ("ina");
                     }
-               } else {
+                } else {
                     AddCodeLine ("clc");
                     AddCodeLine ("adc #$%02X", (unsigned char)val);
                 }
@@ -3210,7 +3265,7 @@ void g_inc (unsigned flags, unsigned long val)
                 if (val <= 8) {
                     AddCodeLine ("jsr incax%lu", val);
                 } else if (val <= 255) {
-                    ldyconst (val);
+                    AddCodeLine ("ldy #$%02X", (unsigned char) val);
                     AddCodeLine ("jsr incaxy");
                 } else {
                     g_add (flags | CF_CONST, val);
@@ -3219,21 +3274,21 @@ void g_inc (unsigned flags, unsigned long val)
                 /* Inline the code */
                 if (val <= 0x300) {
                     if ((val & 0xFF) != 0) {
-                               unsigned L = GetLocalLabel();
-                               AddCodeLine ("clc");
-                               AddCodeLine ("adc #$%02X", (unsigned char) val);
-                               AddCodeLine ("bcc %s", LocalLabelName (L));
-                               AddCodeLine ("inx");
-                               g_defcodelabel (L);
+                        unsigned L = GetLocalLabel();
+                        AddCodeLine ("clc");
+                        AddCodeLine ("adc #$%02X", (unsigned char) val);
+                        AddCodeLine ("bcc %s", LocalLabelName (L));
+                        AddCodeLine ("inx");
+                        g_defcodelabel (L);
                     }
                     if (val >= 0x100) {
-                               AddCodeLine ("inx");
+                        AddCodeLine ("inx");
                     }
                     if (val >= 0x200) {
-                               AddCodeLine ("inx");
+                        AddCodeLine ("inx");
                     }
                     if (val >= 0x300) {
-                               AddCodeLine ("inx");
+                        AddCodeLine ("inx");
                     }
                 } else if ((val & 0xFF) != 0) {
                     AddCodeLine ("clc");
@@ -3256,7 +3311,7 @@ void g_inc (unsigned flags, unsigned long val)
 
         case CF_LONG:
             if (val <= 255) {
-                ldyconst (val);
+                AddCodeLine ("ldy #$%02X", (unsigned char) val);
                 AddCodeLine ("jsr inceaxy");
             } else {
                 g_add (flags | CF_CONST, val);
@@ -3281,17 +3336,17 @@ void g_dec (unsigned flags, unsigned long val)
 
     /* Generate code for the supported types */
     flags &= ~CF_CONST;
-    switch (flags & CF_TYPE) {
+    switch (flags & CF_TYPEMASK) {
 
         case CF_CHAR:
             if (flags & CF_FORCECHAR) {
                 if ((CPUIsets[CPU] & CPU_ISET_65SC02) != 0 && val <= 2) {
                     while (val--) {
-                       AddCodeLine ("dea");
+                        AddCodeLine ("dea");
                     }
                 } else {
                     AddCodeLine ("sec");
-                   AddCodeLine ("sbc #$%02X", (unsigned char)val);
+                    AddCodeLine ("sbc #$%02X", (unsigned char)val);
                 }
                 break;
             }
@@ -3303,7 +3358,7 @@ void g_dec (unsigned flags, unsigned long val)
                 if (val <= 8) {
                     AddCodeLine ("jsr decax%d", (int) val);
                 } else if (val <= 255) {
-                    ldyconst (val);
+                    AddCodeLine ("ldy #$%02X", (unsigned char) val);
                     AddCodeLine ("jsr decaxy");
                 } else {
                     g_sub (flags | CF_CONST, val);
@@ -3313,22 +3368,22 @@ void g_dec (unsigned flags, unsigned long val)
                 if (val < 0x300) {
                     if ((val & 0xFF) != 0) {
                         unsigned L = GetLocalLabel();
-                               AddCodeLine ("sec");
-                               AddCodeLine ("sbc #$%02X", (unsigned char) val);
-                               AddCodeLine ("bcs %s", LocalLabelName (L));
-                               AddCodeLine ("dex");
+                        AddCodeLine ("sec");
+                        AddCodeLine ("sbc #$%02X", (unsigned char) val);
+                        AddCodeLine ("bcs %s", LocalLabelName (L));
+                        AddCodeLine ("dex");
                         g_defcodelabel (L);
                     }
                     if (val >= 0x100) {
-                               AddCodeLine ("dex");
+                        AddCodeLine ("dex");
                     }
                     if (val >= 0x200) {
-                               AddCodeLine ("dex");
+                        AddCodeLine ("dex");
                     }
                 } else {
                     if ((val & 0xFF) != 0) {
                         AddCodeLine ("sec");
-                       AddCodeLine ("sbc #$%02X", (unsigned char) val);
+                        AddCodeLine ("sbc #$%02X", (unsigned char) val);
                         AddCodeLine ("pha");
                         AddCodeLine ("txa");
                         AddCodeLine ("sbc #$%02X", (unsigned char) (val >> 8));
@@ -3348,7 +3403,7 @@ void g_dec (unsigned flags, unsigned long val)
 
         case CF_LONG:
             if (val <= 255) {
-                ldyconst (val);
+                AddCodeLine ("ldy #$%02X", (unsigned char) val);
                 AddCodeLine ("jsr deceaxy");
             } else {
                 g_sub (flags | CF_CONST, val);
@@ -3385,7 +3440,7 @@ void g_eq (unsigned flags, unsigned long val)
      */
     if (flags & CF_CONST) {
 
-        switch (flags & CF_TYPE) {
+        switch (flags & CF_TYPEMASK) {
 
             case CF_CHAR:
                 if (flags & CF_FORCECHAR) {
@@ -3398,7 +3453,7 @@ void g_eq (unsigned flags, unsigned long val)
             case CF_INT:
                 L = GetLocalLabel();
                 AddCodeLine ("cpx #$%02X", (unsigned char)(val >> 8));
-                       AddCodeLine ("bne %s", LocalLabelName (L));
+                AddCodeLine ("bne %s", LocalLabelName (L));
                 AddCodeLine ("cmp #$%02X", (unsigned char)val);
                 g_defcodelabel (L);
                 AddCodeLine ("jsr booleq");
@@ -3439,7 +3494,7 @@ void g_ne (unsigned flags, unsigned long val)
      */
     if (flags & CF_CONST) {
 
-        switch (flags & CF_TYPE) {
+        switch (flags & CF_TYPEMASK) {
 
             case CF_CHAR:
                 if (flags & CF_FORCECHAR) {
@@ -3507,7 +3562,7 @@ void g_lt (unsigned flags, unsigned long val)
             }
 
             /* Look at the type */
-            switch (flags & CF_TYPE) {
+            switch (flags & CF_TYPEMASK) {
 
                 case CF_CHAR:
                     if (flags & CF_FORCECHAR) {
@@ -3548,13 +3603,13 @@ void g_lt (unsigned flags, unsigned long val)
         } else if (val == 0) {
 
             /* A signed compare against zero must only look at the sign bit */
-            switch (flags & CF_TYPE) {
+            switch (flags & CF_TYPEMASK) {
 
                 case CF_CHAR:
                     if (flags & CF_FORCECHAR) {
                         AddCodeLine ("asl a");          /* Bit 7 -> carry */
-                        AddCodeLine ("ldx #$00");
                         AddCodeLine ("lda #$00");
+                        AddCodeLine ("ldx #$00");
                         AddCodeLine ("rol a");
                         return;
                     }
@@ -3563,8 +3618,8 @@ void g_lt (unsigned flags, unsigned long val)
                 case CF_INT:
                     /* Just check the high byte */
                     AddCodeLine ("cpx #$80");           /* Bit 7 -> carry */
-                    AddCodeLine ("ldx #$00");
                     AddCodeLine ("lda #$00");
+                    AddCodeLine ("ldx #$00");
                     AddCodeLine ("rol a");
                     return;
 
@@ -3572,8 +3627,8 @@ void g_lt (unsigned flags, unsigned long val)
                     /* Just check the high byte */
                     AddCodeLine ("lda sreg+1");
                     AddCodeLine ("asl a");              /* Bit 7 -> carry */
-                    AddCodeLine ("ldx #$00");
                     AddCodeLine ("lda #$00");
+                    AddCodeLine ("ldx #$00");
                     AddCodeLine ("rol a");
                     return;
 
@@ -3584,7 +3639,7 @@ void g_lt (unsigned flags, unsigned long val)
         } else {
 
             /* Signed compare against a constant != zero */
-            switch (flags & CF_TYPE) {
+            switch (flags & CF_TYPEMASK) {
 
                 case CF_CHAR:
                     if (flags & CF_FORCECHAR) {
@@ -3595,8 +3650,8 @@ void g_lt (unsigned flags, unsigned long val)
                         AddCodeLine ("eor #$80");
                         g_defcodelabel (Label);
                         AddCodeLine ("asl a");          /* Bit 7 -> carry */
-                        AddCodeLine ("ldx #$00");
                         AddCodeLine ("lda #$00");
+                        AddCodeLine ("ldx #$00");
                         AddCodeLine ("rol a");
                         return;
                     }
@@ -3612,8 +3667,8 @@ void g_lt (unsigned flags, unsigned long val)
                     AddCodeLine ("eor #$80");
                     g_defcodelabel (Label);
                     AddCodeLine ("asl a");          /* Bit 7 -> carry */
-                    AddCodeLine ("ldx #$00");
                     AddCodeLine ("lda #$00");
+                    AddCodeLine ("ldx #$00");
                     AddCodeLine ("rol a");
                     return;
 
@@ -3655,34 +3710,34 @@ void g_le (unsigned flags, unsigned long val)
     if (flags & CF_CONST) {
 
         /* Look at the type */
-        switch (flags & CF_TYPE) {
+        switch (flags & CF_TYPEMASK) {
 
             case CF_CHAR:
                 if (flags & CF_FORCECHAR) {
                     if (flags & CF_UNSIGNED) {
                         /* Unsigned compare */
-                       if (val < 0xFF) {
-                           /* Use < instead of <= because the former gives
-                            * better code on the 6502 than the latter.
-                            */
+                        if (val < 0xFF) {
+                            /* Use < instead of <= because the former gives
+                             * better code on the 6502 than the latter.
+                             */
                             g_lt (flags, val+1);
-                       } else {
+                        } else {
                             /* Always true */
                             Warning ("Condition is always true");
                             AddCodeLine ("jsr return1");
-                       }
+                        }
                     } else {
                         /* Signed compare */
-                       if ((long) val < 0x7F) {
-                           /* Use < instead of <= because the former gives
-                            * better code on the 6502 than the latter.
-                            */
+                        if ((long) val < 0x7F) {
+                            /* Use < instead of <= because the former gives
+                             * better code on the 6502 than the latter.
+                             */
                             g_lt (flags, val+1);
-                       } else {
+                        } else {
                             /* Always true */
                             Warning ("Condition is always true");
                             AddCodeLine ("jsr return1");
-                       }
+                        }
                     }
                     return;
                 }
@@ -3692,10 +3747,10 @@ void g_le (unsigned flags, unsigned long val)
                 if (flags & CF_UNSIGNED) {
                     /* Unsigned compare */
                     if (val < 0xFFFF) {
-                       /* Use < instead of <= because the former gives
-                        * better code on the 6502 than the latter.
-                        */
-                       g_lt (flags, val+1);
+                        /* Use < instead of <= because the former gives
+                         * better code on the 6502 than the latter.
+                         */
+                        g_lt (flags, val+1);
                     } else {
                         /* Always true */
                         Warning ("Condition is always true");
@@ -3704,7 +3759,7 @@ void g_le (unsigned flags, unsigned long val)
                 } else {
                     /* Signed compare */
                     if ((long) val < 0x7FFF) {
-                               g_lt (flags, val+1);
+                        g_lt (flags, val+1);
                     } else {
                         /* Always true */
                         Warning ("Condition is always true");
@@ -3717,10 +3772,10 @@ void g_le (unsigned flags, unsigned long val)
                 if (flags & CF_UNSIGNED) {
                     /* Unsigned compare */
                     if (val < 0xFFFFFFFF) {
-                       /* Use < instead of <= because the former gives
-                        * better code on the 6502 than the latter.
-                        */
-                       g_lt (flags, val+1);
+                        /* Use < instead of <= because the former gives
+                         * better code on the 6502 than the latter.
+                         */
+                        g_lt (flags, val+1);
                     } else {
                         /* Always true */
                         Warning ("Condition is always true");
@@ -3729,7 +3784,7 @@ void g_le (unsigned flags, unsigned long val)
                 } else {
                     /* Signed compare */
                     if ((long) val < 0x7FFFFFFF) {
-                               g_lt (flags, val+1);
+                        g_lt (flags, val+1);
                     } else {
                         /* Always true */
                         Warning ("Condition is always true");
@@ -3770,32 +3825,32 @@ void g_gt (unsigned flags, unsigned long val)
     if (flags & CF_CONST) {
 
         /* Look at the type */
-        switch (flags & CF_TYPE) {
+        switch (flags & CF_TYPEMASK) {
 
             case CF_CHAR:
                 if (flags & CF_FORCECHAR) {
                     if (flags & CF_UNSIGNED) {
-                               if (val == 0) {
-                           /* If we have a compare > 0, we will replace it by
-                            * != 0 here, since both are identical but the
+                        if (val == 0) {
+                            /* If we have a compare > 0, we will replace it by
+                             * != 0 here, since both are identical but the
                              * latter is easier to optimize.
-                            */
+                             */
                             g_ne (flags, val);
-                       } else if (val < 0xFF) {
-                           /* Use >= instead of > because the former gives
-                            * better code on the 6502 than the latter.
-                            */
+                        } else if (val < 0xFF) {
+                            /* Use >= instead of > because the former gives
+                             * better code on the 6502 than the latter.
+                             */
                             g_ge (flags, val+1);
-                       } else {
+                        } else {
                             /* Never true */
                             Warning ("Condition is never true");
                             AddCodeLine ("jsr return0");
                         }
                     } else {
-                       if ((long) val < 0x7F) {
-                           /* Use >= instead of > because the former gives
-                            * better code on the 6502 than the latter.
-                            */
+                        if ((long) val < 0x7F) {
+                            /* Use >= instead of > because the former gives
+                             * better code on the 6502 than the latter.
+                             */
                             g_ge (flags, val+1);
                         } else {
                             /* Never true */
@@ -3810,23 +3865,23 @@ void g_gt (unsigned flags, unsigned long val)
             case CF_INT:
                 if (flags & CF_UNSIGNED) {
                     /* Unsigned compare */
-                   if (val == 0) {
-                       /* 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 == 0) {
+                        /* If we have a compare > 0, we will replace it by
+                         * != 0 here, since both are identical but the latter
+                         * is easier to optimize.
+                         */
                         g_ne (flags, val);
-                   } else if (val < 0xFFFF) {
-                       /* Use >= instead of > because the former gives better
-                        * code on the 6502 than the latter.
-                        */
-                       g_ge (flags, val+1);
+                    } else if (val < 0xFFFF) {
+                        /* Use >= instead of > because the former gives better
+                         * code on the 6502 than the latter.
+                         */
+                        g_ge (flags, val+1);
                     } else {
                         /* Never true */
                         Warning ("Condition is never true");
                         AddCodeLine ("jsr return0");
-                   }
-                       } else {
+                    }
+                } else {
                     /* Signed compare */
                     if ((long) val < 0x7FFF) {
                         g_ge (flags, val+1);
@@ -3834,30 +3889,30 @@ void g_gt (unsigned flags, unsigned long val)
                         /* Never true */
                         Warning ("Condition is never true");
                         AddCodeLine ("jsr return0");
-                   }
+                    }
                 }
                 return;
 
             case CF_LONG:
                 if (flags & CF_UNSIGNED) {
                     /* Unsigned compare */
-                   if (val == 0) {
-                       /* 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 == 0) {
+                        /* If we have a compare > 0, we will replace it by
+                         * != 0 here, since both are identical but the latter
+                         * is easier to optimize.
+                         */
                         g_ne (flags, val);
-                   } else if (val < 0xFFFFFFFF) {
-                       /* Use >= instead of > because the former gives better
-                        * code on the 6502 than the latter.
-                        */
-                       g_ge (flags, val+1);
+                    } else if (val < 0xFFFFFFFF) {
+                        /* Use >= instead of > because the former gives better
+                         * code on the 6502 than the latter.
+                         */
+                        g_ge (flags, val+1);
                     } else {
                         /* Never true */
                         Warning ("Condition is never true");
                         AddCodeLine ("jsr return0");
-                   }
-                       } else {
+                    }
+                } else {
                     /* Signed compare */
                     if ((long) val < 0x7FFFFFFF) {
                         g_ge (flags, val+1);
@@ -3865,12 +3920,12 @@ void g_gt (unsigned flags, unsigned long val)
                         /* Never true */
                         Warning ("Condition is never true");
                         AddCodeLine ("jsr return0");
-                   }
+                    }
                 }
                 return;
 
             default:
-               typeerror (flags);
+                typeerror (flags);
         }
 
         /* If we go here, we didn't emit code. Push the lhs on stack and fall
@@ -3894,6 +3949,8 @@ void g_ge (unsigned flags, unsigned long val)
         "tosgeax", "tosugeax", "tosgeeax", "tosugeeax",
     };
 
+    unsigned Label;
+
 
     /* If the right hand side is const, the lhs is not on stack but still
      * in the primary register.
@@ -3914,7 +3971,7 @@ void g_ge (unsigned flags, unsigned long val)
             }
 
             /* Look at the type */
-            switch (flags & CF_TYPE) {
+            switch (flags & CF_TYPEMASK) {
 
                 case CF_CHAR:
                     if (flags & CF_FORCECHAR) {
@@ -3934,7 +3991,7 @@ void g_ge (unsigned flags, unsigned long val)
                     AddCodeLine ("sbc #$%02X", (unsigned char)(val >> 8));
                     AddCodeLine ("lda #$00");
                     AddCodeLine ("ldx #$00");
-                    AddCodeLine ("rol a");              
+                    AddCodeLine ("rol a");
                     return;
 
                 case CF_LONG:
@@ -3958,7 +4015,7 @@ void g_ge (unsigned flags, unsigned long val)
         } else if (val == 0) {
 
             /* A signed compare against zero must only look at the sign bit */
-            switch (flags & CF_TYPE) {
+            switch (flags & CF_TYPEMASK) {
 
                 case CF_CHAR:
                     if (flags & CF_FORCECHAR) {
@@ -3983,8 +4040,51 @@ void g_ge (unsigned flags, unsigned long val)
                 default:
                     typeerror (flags);
             }
-        }
 
+        } else {
+
+            /* Signed compare against a constant != zero */
+            switch (flags & CF_TYPEMASK) {
+
+                case CF_CHAR:
+                    if (flags & CF_FORCECHAR) {
+                        Label = GetLocalLabel ();
+                        AddCodeLine ("sec");
+                        AddCodeLine ("sbc #$%02X", (unsigned char)val);
+                        AddCodeLine ("bvs %s", LocalLabelName (Label));
+                        AddCodeLine ("eor #$80");
+                        g_defcodelabel (Label);
+                        AddCodeLine ("asl a");          /* Bit 7 -> carry */
+                        AddCodeLine ("lda #$00");
+                        AddCodeLine ("ldx #$00");
+                        AddCodeLine ("rol a");
+                        return;
+                    }
+                    /* FALLTHROUGH */
+
+                case CF_INT:
+                    /* Do a subtraction */
+                    Label = GetLocalLabel ();
+                    AddCodeLine ("cmp #$%02X", (unsigned char)val);
+                    AddCodeLine ("txa");
+                    AddCodeLine ("sbc #$%02X", (unsigned char)(val >> 8));
+                    AddCodeLine ("bvs %s", LocalLabelName (Label));
+                    AddCodeLine ("eor #$80");
+                    g_defcodelabel (Label);
+                    AddCodeLine ("asl a");          /* Bit 7 -> carry */
+                    AddCodeLine ("lda #$00");
+                    AddCodeLine ("ldx #$00");
+                    AddCodeLine ("rol a");
+                    return;
+
+                case CF_LONG:
+                    /* This one is too costly */
+                    break;
+
+                default:
+                    typeerror (flags);
+            }
+        }
 
         /* If we go here, we didn't emit code. Push the lhs on stack and fall
          * into the normal, non-optimized stuff. Note: The standard stuff will
@@ -4001,7 +4101,7 @@ void g_ge (unsigned flags, unsigned long val)
 
 
 /*****************************************************************************/
-/*                         Allocating static storage                        */
+/*                         Allocating static storage                         */
 /*****************************************************************************/
 
 
@@ -4020,10 +4120,10 @@ void g_defdata (unsigned flags, unsigned long val, long offs)
     if (flags & CF_CONST) {
 
         /* Numeric constant */
-        switch (flags & CF_TYPE) {
+        switch (flags & CF_TYPEMASK) {
 
             case CF_CHAR:
-               AddDataLine ("\t.byte\t$%02lX", val & 0xFF);
+                AddDataLine ("\t.byte\t$%02lX", val & 0xFF);
                 break;
 
             case CF_INT:
@@ -4083,7 +4183,7 @@ void g_defbytes (const void* Bytes, unsigned Count)
         } while (Chunk);
 
         /* Output the line */
-        AddDataLine (Buf);
+        AddDataLine ("%s", Buf);
     }
 }
 
@@ -4104,7 +4204,7 @@ void g_initregister (unsigned Label, unsigned Reg, unsigned Size)
 {
     /* Register variables do always have less than 128 bytes */
     unsigned CodeLabel = GetLocalLabel ();
-    ldxconst (Size-1);
+    AddCodeLine ("ldx #$%02X", (unsigned char) (Size - 1));
     g_defcodelabel (CodeLabel);
     AddCodeLine ("lda %s,x", GetLabelName (CF_STATIC, Label, 0));
     AddCodeLine ("sta %s,x", GetLabelName (CF_REGVAR, Reg, 0));
@@ -4121,14 +4221,14 @@ void g_initauto (unsigned Label, unsigned Size)
 
     CheckLocalOffs (Size);
     if (Size <= 128) {
-        ldyconst (Size-1);
+        AddCodeLine ("ldy #$%02X", Size-1);
         g_defcodelabel (CodeLabel);
         AddCodeLine ("lda %s,y", GetLabelName (CF_STATIC, Label, 0));
         AddCodeLine ("sta (sp),y");
         AddCodeLine ("dey");
         AddCodeLine ("bpl %s", LocalLabelName (CodeLabel));
     } else if (Size <= 256) {
-        ldyconst (0);
+        AddCodeLine ("ldy #$00");
         g_defcodelabel (CodeLabel);
         AddCodeLine ("lda %s,y", GetLabelName (CF_STATIC, Label, 0));
         AddCodeLine ("sta (sp),y");
@@ -4145,7 +4245,7 @@ void g_initstatic (unsigned InitLabel, unsigned VarLabel, unsigned Size)
 {
     if (Size <= 128) {
         unsigned CodeLabel = GetLocalLabel ();
-        ldyconst (Size-1);
+        AddCodeLine ("ldy #$%02X", Size-1);
         g_defcodelabel (CodeLabel);
         AddCodeLine ("lda %s,y", GetLabelName (CF_STATIC, InitLabel, 0));
         AddCodeLine ("sta %s,y", GetLabelName (CF_STATIC, VarLabel, 0));
@@ -4153,7 +4253,7 @@ void g_initstatic (unsigned InitLabel, unsigned VarLabel, unsigned Size)
         AddCodeLine ("bpl %s", LocalLabelName (CodeLabel));
     } else if (Size <= 256) {
         unsigned CodeLabel = GetLocalLabel ();
-        ldyconst (0);
+        AddCodeLine ("ldy #$00");
         g_defcodelabel (CodeLabel);
         AddCodeLine ("lda %s,y", GetLabelName (CF_STATIC, InitLabel, 0));
         AddCodeLine ("sta %s,y", GetLabelName (CF_STATIC, VarLabel, 0));
@@ -4231,11 +4331,11 @@ void g_switch (Collection* Nodes, unsigned DefaultLabel, unsigned Depth)
 
             /* Determine the next label */
             if (I == CollCount (Nodes) - 1) {
-               /* Last node means not found */
+                /* Last node means not found */
                 g_truejump (0, DefaultLabel);
             } else {
-               /* Jump to the next check */
-               NextLabel = GetLocalLabel ();
+                /* Jump to the next check */
+                NextLabel = GetLocalLabel ();
                 g_truejump (0, NextLabel);
             }
 
@@ -4252,7 +4352,7 @@ void g_switch (Collection* Nodes, unsigned DefaultLabel, unsigned Depth)
 
 
 /*****************************************************************************/
-/*                       User supplied assembler code                       */
+/*                       User supplied assembler code                        */
 /*****************************************************************************/
 
 
@@ -4260,7 +4360,7 @@ void g_switch (Collection* Nodes, unsigned DefaultLabel, unsigned Depth)
 void g_asmcode (struct StrBuf* B)
 /* Output one line of assembler code. */
 {
-    AddCodeLine ("%.*s", SB_GetLen (B), SB_GetConstBuf (B));
+    AddCodeLine ("%.*s", (int) SB_GetLen (B), SB_GetConstBuf (B));
 }