version 0.5.2
[fw/sdcc] / sim / ucsim / s51.src / bit.cc
index 4d7e44cb8aba4104155c1beefb0a9df4e072ac6d..7b55a33ad170265c594abb6ce28576b29c91e050 100644 (file)
@@ -30,6 +30,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
 // local
 #include "uc51cl.h"
 #include "regs51.h"
+#include "types51.h"
 
 
 /*
@@ -39,14 +40,16 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
  */
 
 int
-t_uc51::inst_orl_c_bit(uchar code)
+cl_51core::inst_orl_c_bit(uchar code)
 {
-  uchar *addr, bitaddr;
-
-  addr= get_bit(bitaddr= fetch(), &event_at.ri, &event_at.rs);
-  SET_C(GET_C ||
-       (read(addr) & BIT_MASK(bitaddr)));
-  event_at.ws= PSW;
+  uchar bitaddr;
+
+  t_addr a;
+  t_mem m;
+  class cl_address_space *mem;
+  mem= bit2mem(bitaddr= fetch(), &a, &m);
+  SFR_SET_C(SFR_GET_C ||
+           (mem->read(a) & m));
   tick(1);
   return(resGO);
 }
@@ -59,14 +62,15 @@ t_uc51::inst_orl_c_bit(uchar code)
  */
 
 int
-t_uc51::inst_anl_c_bit(uchar code)
+cl_51core::inst_anl_c_bit(uchar code)
 {
-  uchar *addr, bitaddr;
+  t_mem m;
+  t_addr a;
+  class cl_address_space *mem;
 
-  addr= get_bit(bitaddr= fetch(), &event_at.ri, &event_at.rs);
-  SET_C(GET_C &&
-       (read(addr) & BIT_MASK(bitaddr)));
-  event_at.ws= PSW;
+  mem= bit2mem(fetch(), &a, &m);
+  SFR_SET_C(SFR_GET_C &&
+           (mem->read(a) & m));
   tick(1);
   return(resGO);
 }
@@ -79,17 +83,18 @@ t_uc51::inst_anl_c_bit(uchar code)
  */
 
 int
-t_uc51::inst_mov_bit_c(uchar code)
+cl_51core::inst_mov_bit_c(uchar code)
 {
-  uchar *addr, bitaddr;
-
-  addr= get_bit(bitaddr= fetch(), &event_at.wi, &event_at.ws);
-  if (GET_C)
-    (*addr)|= BIT_MASK(bitaddr);
+  t_addr a;
+  t_mem m, d;
+  class cl_address_space *mem;
+
+  mem= bit2mem(fetch(), &a, &m);
+  d= mem->read(a, HW_PORT);
+  if (SFR_GET_C)
+    mem->write(a, d|m);
   else
-    (*addr)&= ~BIT_MASK(bitaddr);
-  event_at.rs= PSW;
-  proc_write(addr);
+    mem->write(a, d&~m);
   tick(1);
   return(resGO);
 }
@@ -102,13 +107,35 @@ t_uc51::inst_mov_bit_c(uchar code)
  */
 
 int
-t_uc51::inst_mov_c_bit(uchar code)
+cl_51core::inst_mov_c_bit(uchar code)
 {
-  uchar *addr, bitaddr;
+  t_addr a;
+  t_mem m;
+  class cl_address_space *mem;
+
+  mem= bit2mem(fetch(), &a, &m);
+  SFR_SET_C(mem->read(a) & m);
+  return(resGO);
+}
+
 
-  addr= get_bit(bitaddr= fetch(), &event_at.ri, &event_at.rs);
-  SET_C(read(addr) & BIT_MASK(bitaddr));
-  event_at.ws= PSW;
+/*
+ * 0xa0 2 24 ORL C,/bit
+ *____________________________________________________________________________
+ *
+ */
+
+int
+cl_51core::inst_orl_c_Sbit(uchar code)
+{
+  t_mem m;
+  t_addr a;
+  class cl_address_space *mem;
+
+  mem= bit2mem(fetch(), &a, &m);
+  SFR_SET_C(SFR_GET_C ||
+           !(mem->read(a) & m));
+  tick(1);
   return(resGO);
 }
 
@@ -120,14 +147,15 @@ t_uc51::inst_mov_c_bit(uchar code)
  */
 
 int
-t_uc51::inst_anl_c_$bit(uchar code)
+cl_51core::inst_anl_c_Sbit(uchar code)
 {
-  uchar *addr, bitaddr;
+  t_mem m;
+  t_addr a;
+  class cl_address_space *mem;
 
-  addr= get_bit(bitaddr= fetch(), &event_at.ri, &event_at.rs);
-  SET_C(GET_C &&
-       !(read(addr) & BIT_MASK(bitaddr)));
-  event_at.ws= PSW;
+  mem= bit2mem(fetch(), &a, &m);
+  SFR_SET_C(SFR_GET_C &&
+           !(mem->read(a) & m));
   tick(1);
   return(resGO);
 }
@@ -140,13 +168,15 @@ t_uc51::inst_anl_c_$bit(uchar code)
  */
 
 int
-t_uc51::inst_cpl_bit(uchar code)
+cl_51core::inst_cpl_bit(uchar code)
 {
-  uchar *addr, bitaddr;
+  t_addr a;
+  t_mem m, d;
+  class cl_address_space *mem;
 
-  addr= get_bit(bitaddr= fetch(), &event_at.wi, &event_at.ws);
-  (*addr)^= BIT_MASK(bitaddr);
-  proc_write(addr);
+  mem= bit2mem(fetch(), &a, &m);
+  d= mem->read(a, HW_PORT);
+  mem->write(a, d^m);
   return(resGO);
 }
 
@@ -158,10 +188,9 @@ t_uc51::inst_cpl_bit(uchar code)
  */
 
 int
-t_uc51::inst_cpl_c(uchar code)
+cl_51core::inst_cpl_c(uchar code)
 {
-  sfr->set(PSW, sfr->get(PSW) ^ bmCY);
-  event_at.ws= PSW;
+  psw->write(psw->read() ^ bmCY);
   return(resGO);
 }
 
@@ -173,13 +202,15 @@ t_uc51::inst_cpl_c(uchar code)
  */
 
 int
-t_uc51::inst_clr_bit(uchar code)
+cl_51core::inst_clr_bit(uchar code)
 {
-  uchar *addr, bitaddr;
+  t_addr a;
+  t_mem m;
+  class cl_address_space *mem;
 
-  addr= get_bit(bitaddr= fetch(), &event_at.wi, &event_at.ws);
-  (*addr)&= ~BIT_MASK(bitaddr);
-  proc_write(addr);
+  mem= bit2mem(fetch(), &a, &m);
+  t_mem d= mem->read(a, HW_PORT);
+  mem->write(a, d&~m);
   return(resGO);
 }
 
@@ -191,10 +222,9 @@ t_uc51::inst_clr_bit(uchar code)
  */
 
 int
-t_uc51::inst_clr_c(uchar code)
+cl_51core::inst_clr_c(uchar code)
 {
-  sfr->set(PSW, sfr->get(PSW) & ~bmCY);
-  event_at.ws= PSW;
+  psw->write(psw->read() & ~bmCY);
   return(resGO);
 }
 
@@ -206,13 +236,15 @@ t_uc51::inst_clr_c(uchar code)
  */
 
 int
-t_uc51::inst_setb_bit(uchar code)
+cl_51core::inst_setb_bit(uchar code)
 {
-  uchar *addr, bitaddr;
+  t_addr a;
+  t_mem m, d;
+  class cl_address_space *mem;
 
-  addr= get_bit(bitaddr= fetch(), &event_at.wi, &event_at.ws);
-  (*addr)|= BIT_MASK(bitaddr);
-  proc_write(addr);
+  mem= bit2mem(fetch(), &a, &m);
+  d= mem->read(a, HW_PORT);
+  mem->write(a, d|m);
   return(resGO);
 }
 
@@ -224,10 +256,9 @@ t_uc51::inst_setb_bit(uchar code)
  */
 
 int
-t_uc51::inst_setb_c(uchar code)
+cl_51core::inst_setb_c(uchar code)
 {
-  sfr->set(PSW, sfr->get(PSW) | bmCY);
-  event_at.ws= PSW;
+  psw->write(psw->read() | bmCY);
   return(resGO);
 }