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

src/cc65/codeent.c
src/cc65/codeent.h
src/cc65/codeinfo.h
src/cc65/codeseg.c
src/cc65/opcodes.c
src/cc65/opcodes.h

index 2f980671a912bd2b6792169004ce6a222b7b4d5f..8dff3a528a7d7b4645e7426ba5e1bc6b8c73e086 100644 (file)
@@ -43,6 +43,7 @@
 
 /* b6502 */
 #include "codeinfo.h"
+#include "funcinfo.h"
 #include "label.h"
 #include "opcodes.h"
 #include "codeent.h"
 
 
 
-CodeEntry* NewCodeEntry (const OPCDesc* D, am_t AM, CodeLabel* JumpTo)
+CodeEntry* NewCodeEntry (const OPCDesc* D, am_t AM, const char* Arg, CodeLabel* JumpTo)
 /* Create a new code entry, initialize and return it */
 {
     /* Allocate memory */
     CodeEntry* E = xmalloc (sizeof (CodeEntry));
 
     /* Initialize the fields */
-    E->OPC     = D->OPC;
-    E->AM      = AM;
-    E->Size    = GetInsnSize (E->OPC, E->AM);
+    E->OPC     = D->OPC;
+    E->AM      = AM;
+    E->Size    = GetInsnSize (E->OPC, E->AM);
     E->Hints   = 0;
-    E->Arg     = 0;
-    E->Num     = 0;
+    E->Arg     = (Arg && Arg[0] != '\0')? xstrdup (Arg) : 0;
+    E->Num     = 0;
     E->Flags   = 0;
-    E->Info    = D->Info | GetAMUseInfo (AM);
+    E->Info            = D->Info;
+    if (E->OPC == OPC_JSR && E->Arg) {
+       /* A subroutine call */
+       E->Info |= GetFuncInfo (E->Arg);
+    } else {
+       /* Some other instruction */
+       E->Info |= GetAMUseInfo (AM);
+    }
     E->JumpTo  = JumpTo;
     InitCollection (&E->Labels);
 
index 77a1a7a12f32e1021607595e9389cf86453410c5..4140663a814c283521df928666d59d3a8fe0b9d1 100644 (file)
@@ -82,7 +82,7 @@ struct CodeEntry {
 
 
 
-CodeEntry* NewCodeEntry (const OPCDesc* D, am_t AM, CodeLabel* JumpTo);
+CodeEntry* NewCodeEntry (const OPCDesc* D, am_t AM, const char* Arg, CodeLabel* JumpTo);
 /* Create a new code entry, initialize and return it */
 
 void FreeCodeEntry (CodeEntry* E);
index 786652a01da48a681e59f399fd18cb43c37c54ff..b4fa4ce038ba8be81cbcce7cab4ce80fc6b56080 100644 (file)
@@ -6,10 +6,10 @@
 /*                                                                           */
 /*                                                                           */
 /*                                                                           */
-/* (C) 2001     Ullrich von Bassewitz                                        */
-/*              Wacholderweg 14                                              */
-/*              D-70597 Stuttgart                                            */
-/* EMail:       uz@musoftware.de                                             */
+/* (C) 2001      Ullrich von Bassewitz                                       */
+/*               Wacholderweg 14                                             */
+/*               D-70597 Stuttgart                                           */
+/* EMail:        uz@cc65.org                                                 */
 /*                                                                           */
 /*                                                                           */
 /* This software is provided 'as-is', without any expressed or implied       */
 #define CI_USE_A       0x0001U         /* Use the A register */
 #define CI_USE_X       0x0002U         /* Use the X register */
 #define CI_USE_Y       0x0004U         /* Use the Y register */
+#define CI_USE_ALL     0x0007U         /* Use all registers */
 #define CI_MASK_USE            0x000FU         /* Extract usage info */
 
 #define CI_CHG_NONE    0x0000U         /* Change nothing */
 #define CI_CHG_A       0x0010U         /* Change the A register */
 #define CI_CHG_X       0x0020U         /* Change the X register */
 #define CI_CHG_Y       0x0040U         /* Change the Y register */
+#define CI_CHG_ALL     0x0070U         /* Change all registers */
 #define CI_MASK_CHG    0x00F0U         /* Extract change info */
-                            
+
 #define CI_BRA         0x0100U         /* Instruction is a branch */
-#define CI_MASK_BRA    0x0100U         /* Extract branch info */       
+#define CI_MASK_BRA    0x0100U         /* Extract branch info */
 
 #define CI_NONE                0x0000U         /* Nothing used/changed */
 
index b67585d4e9ba33e384cd611550704b167c859821..aed667b854b0d3c184670ba50666fee82b0f2c2d 100644 (file)
@@ -297,11 +297,7 @@ static CodeEntry* ParseInsn (CodeSeg* S, const char* L)
     /* We do now have the addressing mode in AM. Allocate a new CodeEntry
      * structure and initialize it.
      */
-    E = NewCodeEntry (OPC, AM, Label);
-    if (Arg[0] != '\0') {
-       /* We have an additional expression */
-       E->Arg = xstrdup (Arg);
-    }
+    E = NewCodeEntry (OPC, AM, Arg, Label);
 
     /* Return the new code entry */
     return E;
index 8cca9cc6c7cb311f0d073c13fa4f130a99f120d5..b2165b20f474b58d4eda0f0d37832a99fab0616f 100644 (file)
@@ -40,6 +40,9 @@
 /* common */
 #include "check.h"
 
+/* cc65 */
+#include "error.h"
+
 /* b6502 */
 #include "codeinfo.h"
 #include "opcodes.h"
@@ -216,7 +219,7 @@ const OPCDesc* GetOPCDesc (opc_t OPC)
 unsigned GetAMUseInfo (am_t AM)
 /* Get usage info for the given addressing mode (addressing modes that use
  * index registers return CI_USE... info for these registers).
- */                           
+ */
 {
     /* Check the addressing mode. */
     switch (AM) {
@@ -232,3 +235,29 @@ unsigned GetAMUseInfo (am_t AM)
 
 
 
+opc_t GetInverseBranch (opc_t OPC)
+/* Return a brahcn that reverse the condition of the branch given in OPC */
+{
+    switch (OPC) {
+       case OPC_BCC:   return OPC_BCS;
+       case OPC_BCS:   return OPC_BCC;
+       case OPC_BEQ:   return OPC_BNE;
+       case OPC_BMI:   return OPC_BPL;
+       case OPC_BNE:   return OPC_BEQ;
+       case OPC_BPL:   return OPC_BMI;
+       case OPC_BVC:   return OPC_BVS;
+       case OPC_BVS:   return OPC_BVC;
+               case OPC_JCC:   return OPC_JCS;
+               case OPC_JCS:   return OPC_JCC;
+               case OPC_JEQ:   return OPC_JNE;
+               case OPC_JMI:   return OPC_JPL;
+               case OPC_JNE:   return OPC_JEQ;
+               case OPC_JPL:   return OPC_JMI;
+               case OPC_JVC:   return OPC_JVS;
+               case OPC_JVS:   return OPC_JVC;
+       default:        Internal ("GetInverseBranch: Invalid opcode: %d", OPC);
+    }
+}
+
+
+
index aac5832753468d16e737767999f41d40a563ffba..b4c372a534ccd9eefca92d95f456e3f5eacc67dd 100644 (file)
@@ -143,6 +143,10 @@ typedef struct {
     char       Mnemo[4];       /* Mnemonic */
     opc_t      OPC;            /* Opcode */
     unsigned   Size;           /* Size, 0 means "check addressing mode" */
+####
+    unsigned char Use;
+    unsigned char Load;
+
     unsigned           Info;           /* Usage flags */
 } OPCDesc;
 
@@ -170,6 +174,9 @@ unsigned GetAMUseInfo (am_t AM);
  * index registers return CI_USE... info for these registers).
  */
 
+opc_t GetInverseBranch (opc_t OPC);
+/* Return a brahcn that reverse the condition of the branch given in OPC */
+
 
 
 /* End of opcodes.h */