]> git.sur5r.net Git - cc65/commitdiff
Added info about changed leaa0sp and leaaxsp. Rewrote g_leasp to cope with 16
authoruz <uz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Mon, 31 Aug 2009 12:41:38 +0000 (12:41 +0000)
committeruz <uz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Mon, 31 Aug 2009 12:41:38 +0000 (12:41 +0000)
stack offsets, because it's rather easy in this case.

git-svn-id: svn://svn.cc65.org/cc65/trunk@4093 b7a2c559-68d2-44c3-8de9-860c34a00d81

src/cc65/codegen.c
src/cc65/codeinfo.c
src/cc65/coptsize.c

index 212a07fb4971d8e20cc23f07a34b08cf49ce5754..6756cf853f3c896265a81232e3d794d81fb13e79 100644 (file)
@@ -921,38 +921,63 @@ void g_getind (unsigned flags, unsigned offs)
 
 
 
-void g_leasp (int offs)
+void g_leasp (int Offs)
 /* Fetch the address of the specified symbol into the primary register */
 {
+    /* Get low and high byte */
+    unsigned char Lo = (unsigned char) Offs;
+    unsigned char Hi = (unsigned char) (Offs >> 8);
+
     /* 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 */
+    /* 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", (unsigned char) Offs);
+        AddCodeLine ("pha");
+        AddCodeLine ("lda sp+1");
+        AddCodeLine ("adc #$%02X", (unsigned char) (Offs >> 8));
+        AddCodeLine ("tax");
+        AddCodeLine ("pla");
     }
 }
 
@@ -989,7 +1014,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 */
index 39f111a3c35dba87b36c8800714c908cea604840..50052d59de82ff0f13a830ae8b9c28bfbccd7cd2 100644 (file)
@@ -162,7 +162,8 @@ static const FuncInfo FuncInfoTable[] = {
     { "ldeaxi",         REG_AX,               REG_EAXY | REG_PTR1            },
     { "ldeaxidx",       REG_AXY,              REG_EAXY | REG_PTR1            },
     { "ldeaxysp",       REG_Y,                REG_EAXY                       },
-    { "leaasp",         REG_A,                REG_AX                        },
+    { "leaa0sp",        REG_A,                REG_AX                        },
+    { "leaaxsp",        REG_AX,               REG_AX                        },
     { "lsubeq",         REG_EAXY|REG_PTR1_LO, REG_EAXY | REG_PTR1_HI         },
     { "lsubeq0sp",      REG_EAX,              REG_EAXY                       },
     { "lsubeq1",        REG_Y | REG_PTR1_LO,  REG_EAXY | REG_PTR1_HI         },
index 8957f28c8caa3f1570b2ae230a1d1bbf3cc7dd05..c7d8a9bc6c699412d91f5f575273ad6e94c8f848 100644 (file)
@@ -153,6 +153,16 @@ static const CallDesc CallTable [] = {
         },
         F_NONE,
         "ldeax0sp"
+    },{
+        "leaaxsp",
+        {
+            /*     A               X               Y             SRegLo   */
+            UNKNOWN_REGVAL,              0, UNKNOWN_REGVAL, UNKNOWN_REGVAL,
+            /*   SRegHi          Ptr1Lo          Ptr1Hi           Tmp1    */
+            UNKNOWN_REGVAL, UNKNOWN_REGVAL, UNKNOWN_REGVAL, UNKNOWN_REGVAL
+        },
+        F_NONE,
+        "leaa0sp"
     },{
         "lsubeq",
         {