]> git.sur5r.net Git - cc65/commitdiff
Use MakeHexArg, replace STX and STY by STZ if possible
authorcuz <cuz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Sat, 16 Mar 2002 10:24:55 +0000 (10:24 +0000)
committercuz <cuz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Sat, 16 Mar 2002 10:24:55 +0000 (10:24 +0000)
git-svn-id: svn://svn.cc65.org/cc65/trunk@1191 b7a2c559-68d2-44c3-8de9-860c34a00d81

src/cc65/codeent.c
src/cc65/coptadd.c
src/cc65/coptc02.c
src/cc65/coptpush.c
src/cc65/coptstop.c

index 5f0346b9a812aeba34ddeada187ad3c58d8d711c..dd79be34d09437d12c2832c24e2197468f213e7e 100644 (file)
@@ -214,7 +214,7 @@ const char* MakeHexArg (unsigned Num)
  * safe).
  */
 {
-    static char Buf[4];
+    static char Buf[16];
     xsprintf (Buf, sizeof (Buf), "$%02X", (char) Num);
     return Buf;
 }
index 7e9f92d6c9ac14b68c2af040ce8249738f1f3073..93d2a70fc11b577755fc473ded2dffa1010227a7 100644 (file)
@@ -6,7 +6,7 @@
 /*                                                                           */
 /*                                                                           */
 /*                                                                           */
-/* (C) 2001      Ullrich von Bassewitz                                       */
+/* (C) 2001-2002 Ullrich von Bassewitz                                       */
 /*               Wacholderweg 14                                             */
 /*               D-70597 Stuttgart                                           */
 /* EMail:        uz@cc65.org                                                 */
@@ -33,9 +33,6 @@
 
 
 
-/* common */
-#include "xsprintf.h"
-
 /* cc65 */
 #include "codeent.h"
 #include "codeinfo.h"
@@ -191,12 +188,12 @@ unsigned OptAdd2 (CodeSeg* S)
                    (GetRegInfo (S, I+4, REG_AX) & REG_AX) == 0) {
 
            /* Insert new code behind the addeqysp */
-           char Buf [20];
+           const char* Arg;
            CodeEntry* X;
 
            /* ldy     #xx-1 */
-           xsprintf (Buf, sizeof (Buf), "$%02X", (int)(L[0]->Num-1));
-           X = NewCodeEntry (OP65_LDY, AM65_IMM, Buf, 0, L[0]->LI);
+           Arg = MakeHexArg (L[0]->Num-1);
+           X = NewCodeEntry (OP65_LDY, AM65_IMM, Arg, 0, L[0]->LI);
            CS_InsertEntry (S, X, I+4);
 
            /* lda     (sp),y */
@@ -228,8 +225,8 @@ unsigned OptAdd2 (CodeSeg* S)
            CS_InsertEntry (S, X, I+11);
 
            /* ldy     #yy+1 */
-           xsprintf (Buf, sizeof (Buf), "$%02X", (int)(L[2]->Num+1));
-           X = NewCodeEntry (OP65_LDY, AM65_IMM, Buf, 0, L[2]->LI);
+           Arg = MakeHexArg (L[2]->Num+1);
+           X = NewCodeEntry (OP65_LDY, AM65_IMM, Arg, 0, L[2]->LI);
            CS_InsertEntry (S, X, I+12);
 
            /* adc     (sp),y */
index 816f92c52e95f6c44f080ff248eb86efbafe57f3..4ba8a30323ae7f70ff2994d3e16d0ff9aa4a9449 100644 (file)
@@ -201,11 +201,14 @@ unsigned Opt65C02Stores (CodeSeg* S)
        /* Get next entry */
                CodeEntry* E = CS_GetEntry (S, I);
 
-       /* Check for the sequence */
-       if (E->OPC == OP65_STA                          &&
+       /* Check for a store with a register value of zero and an addressing
+        * mode available with STZ.
+        */
+               if (((E->OPC == OP65_STA && E->RI->In.RegA == 0) ||
+            (E->OPC == OP65_STX && E->RI->In.RegX == 0) ||
+            (E->OPC == OP65_STY && E->RI->In.RegY == 0))       &&
             (E->AM == AM65_ZP  || E->AM == AM65_ABS ||
-             E->AM == AM65_ZPX || E->AM == AM65_ABSX )  &&
-            E->RI->In.RegA == 0) {
+             E->AM == AM65_ZPX || E->AM == AM65_ABSX)) {
 
             /* Replace by STZ */
             CodeEntry* X = NewCodeEntry (OP65_STZ, E->AM, E->Arg, 0, E->LI);
index 187db0fd67f39720aac1f8433fa997558dad115e..1be755f9ef1a4697629421948e0d1b0277d23e7d 100644 (file)
@@ -6,7 +6,7 @@
 /*                                                                           */
 /*                                                                           */
 /*                                                                           */
-/* (C) 2001      Ullrich von Bassewitz                                       */
+/* (C) 2001-2002 Ullrich von Bassewitz                                       */
 /*               Wacholderweg 14                                             */
 /*               D-70597 Stuttgart                                           */
 /* EMail:        uz@cc65.org                                                 */
 
 
 
-/* common */
-#include "xsprintf.h"
-
-/* cc65 */                       
+/* cc65 */
 #include "codeent.h"
 #include "codeinfo.h"
 #include "coptpush.h"
@@ -86,12 +83,12 @@ unsigned OptPush1 (CodeSeg* S)
                    (GetRegInfo (S, I+3, REG_AX) & REG_AX) == 0) {
 
            /* Insert new code behind the pushax */
-           char Buf [20];
+           const char* Arg;
            CodeEntry* X;
 
            /* ldy     #xx+1 */
-           xsprintf (Buf, sizeof (Buf), "$%02X", (int)(L[0]->Num+2));
-           X = NewCodeEntry (OP65_LDY, AM65_IMM, Buf, 0, L[0]->LI);
+           Arg = MakeHexArg (L[0]->Num+2);
+           X = NewCodeEntry (OP65_LDY, AM65_IMM, Arg, 0, L[0]->LI);
            CS_InsertEntry (S, X, I+3);
 
            /* jsr pushwysp */
index dcb405709cbbe23c9818096192f66c06bd85dbb4..9466002ff5db1aa3155672d488bf294407ceed9f 100644 (file)
@@ -6,7 +6,7 @@
 /*                                                                           */
 /*                                                                           */
 /*                                                                           */
-/* (C) 2001      Ullrich von Bassewitz                                       */
+/* (C) 2001-2002 Ullrich von Bassewitz                                       */
 /*               Wacholderweg 14                                             */
 /*               D-70597 Stuttgart                                           */
 /* EMail:        uz@cc65.org                                                 */
@@ -35,9 +35,6 @@
 
 #include <stdlib.h>
 
-/* common */
-#include "xsprintf.h"
-
 /* cc65 */
 #include "codeent.h"
 #include "codeinfo.h"
@@ -89,10 +86,8 @@ static unsigned AdjustStackOffset (CodeSeg* S, unsigned Start, unsigned Stop,
            } else {
 
                /* Insert a new load instruction before the stack access */
-               char Buf [16];
-               CodeEntry* X;
-               xsprintf (Buf, sizeof (Buf), "$%02X", E->RI->In.RegY - Offs);
-               X = NewCodeEntry (OP65_LDY, AM65_IMM, Buf, 0, E->LI);
+               const char* Arg = MakeHexArg (E->RI->In.RegY - Offs);
+               CodeEntry* X = NewCodeEntry (OP65_LDY, AM65_IMM, Arg, 0, E->LI);
                CS_InsertEntry (S, X, I);
 
                /* One more inserted entries */
@@ -185,9 +180,8 @@ static unsigned Opt_staxspidx (CodeSeg* S, unsigned Push, unsigned Store,
     CS_InsertEntry (S, X, Store+2);
     if (StoreEntry->RI->In.RegX >= 0) {
        /* Value of X is known */
-       char Buf [16];
-       xsprintf (Buf, sizeof (Buf), "$%02X", StoreEntry->RI->In.RegX);
-               X = NewCodeEntry (OP65_LDA, AM65_IMM, Buf, 0, StoreEntry->LI);
+       const char* Arg = MakeHexArg (StoreEntry->RI->In.RegX);
+               X = NewCodeEntry (OP65_LDA, AM65_IMM, Arg, 0, StoreEntry->LI);
     } else {
        /* Value unknown */
        X = NewCodeEntry (OP65_TXA, AM65_IMP, 0, 0, StoreEntry->LI);
@@ -271,9 +265,8 @@ static unsigned Opt_tosaddax (CodeSeg* S, unsigned Push, unsigned Add,
        CodeLabel* L;
        if (PushEntry->RI->In.RegX >= 0) {
            /* Value of first op high byte is known */
-           char Buf [16];
-           xsprintf (Buf, sizeof (Buf), "$%02X", PushEntry->RI->In.RegX);
-           X = NewCodeEntry (OP65_LDX, AM65_IMM, Buf, 0, AddEntry->LI);
+           const char* Arg = MakeHexArg (PushEntry->RI->In.RegX);
+           X = NewCodeEntry (OP65_LDX, AM65_IMM, Arg, 0, AddEntry->LI);
        } else {
            /* Value of first op high byte is unknown */
            X = NewCodeEntry (OP65_LDX, AM65_ZP, ZPHi, 0, AddEntry->LI);
@@ -429,10 +422,8 @@ static unsigned Opt_tosorax (CodeSeg* S, unsigned Push, unsigned Or,
     CS_InsertEntry (S, X, Or+1);
     if (PushEntry->RI->In.RegX >= 0 && OrEntry->RI->In.RegX >= 0) {
        /* Both values known, precalculate the result */
-       char Buf [16];
-       int Val = (PushEntry->RI->In.RegX | OrEntry->RI->In.RegX);
-       xsprintf (Buf, sizeof (Buf), "$%02X", Val);
-               X = NewCodeEntry (OP65_LDX, AM65_IMM, Buf, 0, OrEntry->LI);
+       const char* Arg = MakeHexArg (PushEntry->RI->In.RegX | OrEntry->RI->In.RegX);
+               X = NewCodeEntry (OP65_LDX, AM65_IMM, Arg, 0, OrEntry->LI);
        CS_InsertEntry (S, X, Or+2);
     } else if (PushEntry->RI->In.RegX != 0) {
        /* High byte is unknown */
@@ -506,10 +497,8 @@ static unsigned Opt_tosxorax (CodeSeg* S, unsigned Push, unsigned Xor,
     CS_InsertEntry (S, X, Xor+1);
     if (PushEntry->RI->In.RegX >= 0 && XorEntry->RI->In.RegX >= 0) {
        /* Both values known, precalculate the result */
-       char Buf [16];
-       int Val = (PushEntry->RI->In.RegX ^ XorEntry->RI->In.RegX);
-       xsprintf (Buf, sizeof (Buf), "$%02X", Val);
-               X = NewCodeEntry (OP65_LDX, AM65_IMM, Buf, 0, XorEntry->LI);
+       const char* Arg = MakeHexArg (PushEntry->RI->In.RegX ^ XorEntry->RI->In.RegX);
+               X = NewCodeEntry (OP65_LDX, AM65_IMM, Arg, 0, XorEntry->LI);
        CS_InsertEntry (S, X, Xor+2);
     } else if (PushEntry->RI->In.RegX != 0) {
        /* High byte is unknown */