work on instr
authorkbongers <kbongers@4a8a32a2-be11-0410-ad9d-d568d2c75423>
Thu, 31 Jan 2002 05:58:27 +0000 (05:58 +0000)
committerkbongers <kbongers@4a8a32a2-be11-0410-ad9d-d568d2c75423>
Thu, 31 Jan 2002 05:58:27 +0000 (05:58 +0000)
git-svn-id: https://sdcc.svn.sourceforge.net/svnroot/sdcc/trunk/sdcc@1881 4a8a32a2-be11-0410-ad9d-d568d2c75423

sim/ucsim/xa.src/inst.cc
sim/ucsim/xa.src/inst_gen.cc
sim/ucsim/xa.src/regsxa.h

index cfb91214598f38e50ec6c62e74ca439d10840959..d32e909b70e4f97086d51ff70c2d345535dabb73 100644 (file)
@@ -235,6 +235,30 @@ cl_xa::inst_MOVS(uint code, int operands)
 int
 cl_xa::inst_MOVC(uint code, int operands)
 {
+  switch (operands) {
+    case REG_IREGINC:
+    {
+      short srcreg = reg2(RI_07);
+      if (code & 0x0800) {  /* word op */
+        set_reg2( RI_F0,
+                  mov2( reg2(RI_F0),
+                        getcode2(srcreg)
+                      )
+                );
+      } else {
+        set_reg1( RI_F0,
+                  mov1( reg1(RI_F0),
+                        getcode1(srcreg)
+                      )
+                );
+      }
+      if (operands == REG_IREGINC) {
+        set_reg2(RI_07,  srcreg+1);
+      }
+    }
+    break;
+    // fixme, 2 more
+  }
   return(resGO);
 }
 int
@@ -245,11 +269,56 @@ cl_xa::inst_MOVX(uint code, int operands)
 int
 cl_xa::inst_PUSH(uint code, int operands)
 {
+  switch(operands) {
+    case DIRECT_ALONE:
+    {
+      unsigned short sp;
+      unsigned short direct_addr = ((operands & 0x7) << 8) | fetch();
+
+      sp = get_sp()-2;
+      set_sp(sp);
+      if (code & 0x0800) {  /* word op */
+        store2( sp, get_word_direct(direct_addr));
+      } else {
+        store2( sp, get_byte_direct(direct_addr));
+      }
+    }
+    break;
+
+    case RLIST:
+      // fixme: implement
+      unsigned char rlist = fetch();
+      rlist = rlist; //shutup compiler
+    break;
+  }
+  
   return(resGO);
 }
 int
 cl_xa::inst_POP(uint code, int operands)
 {
+  switch(operands) {
+    case DIRECT_ALONE:
+    {
+      unsigned short sp;
+      unsigned short direct_addr = ((operands & 0x7) << 8) | fetch();
+
+      sp = get_sp();
+      if (code & 0x0800) {  /* word op */
+        set_word_direct(direct_addr, get2(sp) );
+      } else {
+        set_byte_direct(direct_addr, get2(sp) & 0xff );
+      }
+      set_sp(sp+2);
+    }
+    break;
+
+    case RLIST:
+      // fixme: implement
+      unsigned char rlist = fetch();
+      rlist = rlist; //shutup compiler
+    break;
+  }
   return(resGO);
 }
 int
@@ -304,11 +373,12 @@ cl_xa::inst_JMP(uint code, int operands)
       saddr = fetch2();
       jmpaddr = saddr;
       jmpaddr *= 2;
-      PC = (PC + 3) + jmpaddr;
+      PC = (PC + jmpaddr) & 0xfffffffe;
     }
     break;
     case IREG:
-      PC = reg2(RI_07) & 0xfffe;  /* word aligned */
+      PC &= 0xffff0000;
+      PC |= (reg2(RI_07) & 0xfffe);  /* word aligned */
     break;
     /* fixme 2 more... */
   }
@@ -317,11 +387,45 @@ cl_xa::inst_JMP(uint code, int operands)
 int
 cl_xa::inst_CALL(uint code, int operands)
 {
+  unsigned int jmpaddr;
+  unsigned int sp;
+
+  switch(operands) {
+    case REL16:
+    {
+      jmpaddr = fetch2();
+      sp = get_sp() - 4;
+      set_sp(sp);
+      store2(sp, PC);
+      store2(sp+2, 0);  /* segment(not sure about ordering...) */
+      jmpaddr *= 2;
+      PC = (PC + jmpaddr) & 0xfffffffe;
+    }
+    break;
+    case IREG:
+    {
+      sp = get_sp() - 4;
+      set_sp(sp);
+      store2(sp, PC);
+      store2(sp+2, 0);  /* segment(not sure about ordering...) */
+      jmpaddr = reg2(RI_07);
+      jmpaddr *= 2;
+      PC = (PC + jmpaddr) & 0xfffffffe;
+    }
+    break;
+    /* fixme 2 more... */
+  }
   return(resGO);
 }
 int
 cl_xa::inst_RET(uint code, int operands)
 {
+  unsigned int retaddr;
+  unsigned short sp;
+  sp = get_sp();
+  retaddr = get2(sp);
+  //retaddr |= get2(sp+2) << 16);
+  PC = retaddr;
   return(resGO);
 }
 int
@@ -352,11 +456,19 @@ cl_xa::inst_DJNZ(uint code, int operands)
 int
 cl_xa::inst_JZ(uint code, int operands)
 {
+  short saddr = (fetch1() * 2);
+  if (get_psw() & BIT_Z) {
+      PC += saddr;
+  }
   return(resGO);
 }
 int
 cl_xa::inst_JNZ(uint code, int operands)
 {
+  short saddr = (fetch1() * 2);
+  if (!(get_psw() & BIT_Z)) {
+      PC += saddr;
+  }
   return(resGO);
 }
 int
index d37890dd76522aa579e96d325f725dc73a2d1468..1b621719aa4fef5982fb02f87d1a3cd5d28cde7c 100644 (file)
@@ -45,7 +45,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
     case REG_IREGINC :
     case REG_IREG:
     {
-      short srcreg = reg2(RI_0F);
+      short srcreg = reg2(RI_07);
       if (code & 0x0800) {  /* word op */
         set_reg2( RI_F0,
                   FUNC2( reg2(RI_F0),
@@ -60,7 +60,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
                 );
       }
       if (operands == REG_IREGINC) {
-        set_reg2(RI_0F,  srcreg+1);
+        set_reg2(RI_07,  srcreg+1);
       }
     }
     break;
@@ -79,7 +79,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
         store1(addr, total);
       }
       if (operands == IREGINC_REG) {
-        set_reg2(RI_0F, addr+1);
+        set_reg2(RI_07, addr+1);
       }
     }
     break;
@@ -94,13 +94,13 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
         offset = (int)((short)fetch2());
       }
       if (code & 0x0800) {  /* word op */
-        t_mem addr = reg2(RI_07) + offset;
+        t_mem addr = reg2(RI_70) + offset;
         unsigned short wtmp, wtotal;
         wtmp = get2(addr);
         wtotal = FUNC2( wtmp, reg2(RI_F0) );
         store2(addr, wtotal);
       } else {
-        t_mem addr = reg2(RI_07) + ((short) fetch2());
+        t_mem addr = reg2(RI_70) + ((short) fetch2());
         unsigned char total;
         total = FUNC1( get1(addr), reg1(RI_F0) );
         store1(addr, total);
@@ -137,7 +137,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
 
     case DIRECT_REG :
     {
-      int addr = ((code & 0x3) << 8) | fetch();
+      int addr = ((code & 0x7) << 8) | fetch();
       if (code & 0x0800) {  /* word op */
         unsigned short wtmp = get_word_direct(addr);
         set_word_direct( addr,
@@ -154,7 +154,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
 
     case REG_DIRECT :
     {
-      int addr = ((code & 0x3) << 8) | fetch();
+      int addr = ((code & 0x7) << 8) | fetch();
       if (code & 0x0800) {  /* word op */
         set_reg2( RI_F0,
                   FUNC2( reg2(RI_F0),
@@ -176,7 +176,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
     break;
 
     case REG_DATA16 :
-      set_reg2( RI_F0, FUNC2( reg2(RI_F0), fetch()) );
+      set_reg2( RI_F0, FUNC2( reg2(RI_F0), fetch2()) );
     break;
 
     case IREGINC_DATA8 :
@@ -184,12 +184,12 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
     {
       unsigned char total;
       unsigned char tmp;
-      t_mem addr = reg2(RI_07);
+      t_mem addr = reg2(RI_70);
       tmp = get1(addr);
       total = FUNC1(tmp, fetch() );
       store1(addr, total);
       if (operands == IREGINC_DATA8) {
-        set_reg2(RI_07, addr+1);
+        set_reg2(RI_70, addr+1);
       }
     }
     break;
@@ -204,7 +204,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
       total = FUNC2(tmp, fetch2() );
       store2(addr, total);
       if (operands == IREGINC_DATA16) {
-        set_reg2(RI_07, addr+1);
+        set_reg2(RI_70, addr+1);
       }
     }
     break;
@@ -221,9 +221,9 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
         offset = (int)((short)fetch2());
       }
       tmp = fetch();
-      addr = reg2(RI_07);
+      addr = reg2(RI_70);
 
-      store1( addr
+      store1( addr+offset,
                   FUNC1( tmp,
                         get1(addr+offset)
                       )
@@ -243,9 +243,9 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
         offset = (int)((short)fetch2());
       }
       tmp = fetch2();
-      addr = reg2(RI_07);
+      addr = reg2(RI_70);
 
-      store2( addr
+      store2( addr+offset,
                   FUNC2( tmp,
                         get2(addr+offset)
                       )
@@ -255,7 +255,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
 
     case DIRECT_DATA8 :
     {
-      int addr = ((code & 0x3) << 8) | fetch();
+      int addr = ((code & 0x70) << 4) | fetch();
       unsigned char bdir = get_byte_direct(addr);
       unsigned char bdat = fetch();
       set_byte_direct( addr,  FUNC1( bdir, bdat) );
@@ -264,7 +264,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
 
     case DIRECT_DATA16 :
     {
-      int addr = ((code & 0x3) << 8) | fetch();
+      int addr = ((code & 0x70) << 4) | fetch();
       unsigned short wdir = get_word_direct(addr);
       unsigned short wdat = fetch2();
       set_word_direct( addr,  FUNC2( wdir, wdat) );
index 72729827cb0211fd8c1b532ed03fe10e8bad1396..a5bb55fe5c4edef6eeae95de8ebde1838ac34114 100644 (file)
@@ -66,6 +66,10 @@ struct t_regs
 #define get1(addr) ram->get((t_addr) (addr))
 #define get2(addr) (ram->get((t_addr) (addr)) | (ram->get((t_addr) (addr+1)) << 8) )
 
+/* get from code */
+#define getcode1(addr) rom->get((t_addr) (addr))
+#define getcode2(addr) (rom->get((t_addr) (addr)) | (rom->get((t_addr) (addr+1)) << 8) )
+
 /* fetch from opcode code space */
 #define fetch2() ((fetch() << 8) | fetch())
 #define fetch1() fetch()