Merge branch ucsim-034-pre3 to main trunk; new version 0.4
[fw/sdcc] / sim / ucsim / s51.src / logic.cc
index 32e936b909e4d8a653edddd84c92903a6ba6f4e4..b908912c658988f29680688d19240286e5556e88 100644 (file)
@@ -44,11 +44,10 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
 int
 t_uc51::inst_orl_addr_a(uchar code)
 {
-  uchar *addr;
+  class cl_cell *cell;
 
-  addr= get_direct(fetch(), &event_at.wi, &event_at.ws);
-  (*addr)|= sfr->get(event_at.rs= ACC);
-  proc_write(addr);
+  cell= get_direct(fetch());
+  cell->write(cell->read(HW_PORT) | acc->read());
   return(resGO);
 }
 
@@ -62,13 +61,14 @@ t_uc51::inst_orl_addr_a(uchar code)
 int
 t_uc51::inst_orl_addr_$data(uchar code)
 {
-  uchar *addr;
+  class cl_cell *cell;
+  int res= resGO;
 
-  addr= get_direct(fetch(), &event_at.wi, &event_at.ws);
-  (*addr)|= fetch();
-  proc_write(addr);
+  cell= get_direct(fetch());
+  t_mem d= fetch();
+  cell->write(cell->read(HW_PORT) | d);
   tick(1);
-  return(resGO);
+  return(res);
 }
 
 
@@ -83,8 +83,8 @@ t_uc51::inst_orl_a_$data(uchar code)
 {
   uchar d;
 
-  d= sfr->get(event_at.ws= ACC);
-  sfr->set(ACC, d|= fetch());
+  d= acc->read();
+  acc->write(d|= fetch());
   return(resGO);
 }
 
@@ -98,11 +98,12 @@ t_uc51::inst_orl_a_$data(uchar code)
 int
 t_uc51::inst_orl_a_addr(uchar code)
 {
-  uchar *addr, d;
+  t_mem d;
+  class cl_cell *cell;
 
-  addr= get_direct(fetch(), &event_at.ri, &event_at.rs);
-  d= sfr->get(event_at.ws= ACC);
-  sfr->set(ACC, d|= read(addr));
+  cell= get_direct(fetch());
+  d= acc->read();
+  acc->write(d|= cell->read());
   return(resGO);
 }
 
@@ -116,13 +117,13 @@ t_uc51::inst_orl_a_addr(uchar code)
 int
 t_uc51::inst_orl_a_$ri(uchar code)
 {
-  uchar *addr, d;
-  int res;
+  t_mem d;
+  class cl_cell *cell;
 
-  addr= get_indirect(event_at.ri= *(get_reg(code & 0x01)), &res);
-  d= sfr->get(event_at.ws= ACC);
-  sfr->set(ACC, d|= *addr);
-  return(res);
+  cell= iram->get_cell(get_reg(code & 0x01)->read());
+  d= acc->read();
+  acc->write(d|= cell->read());
+  return(resGO);
 }
 
 
@@ -135,10 +136,10 @@ t_uc51::inst_orl_a_$ri(uchar code)
 int
 t_uc51::inst_orl_a_rn(uchar code)
 {
-  uchar d;
+  t_mem d;
 
-  d= sfr->get(event_at.ws= ACC);
-  sfr->set(ACC, d|= *(get_reg(code & 0x07, &event_at.ri)));
+  d= acc->read();
+  acc->write(d|= get_reg(code & 0x07)->read());
   return(resGO);
 }
 
@@ -152,11 +153,10 @@ t_uc51::inst_orl_a_rn(uchar code)
 int
 t_uc51::inst_anl_addr_a(uchar code)
 {
-  uchar *addr;
-
-  addr= get_direct(fetch(), &event_at.wi, &event_at.ws);
-  (*addr)&= sfr->get(event_at.rs= ACC);
-  proc_write(addr);
+  class cl_cell *cell;
+  
+  cell= get_direct(fetch());
+  cell->write(cell->read(HW_PORT) & acc->read());
   return(resGO);
 }
 
@@ -170,11 +170,12 @@ t_uc51::inst_anl_addr_a(uchar code)
 int
 t_uc51::inst_anl_addr_$data(uchar code)
 {
-  uchar *addr;
+  class cl_cell *cell;
+  t_mem d;
 
-  addr= get_direct(fetch(), &event_at.wi, &event_at.ws);
-  (*addr)&= fetch();
-  proc_write(addr);
+  cell= get_direct(fetch());
+  d= fetch();
+  cell->write(cell->read(HW_PORT) & d);
   tick(1);
   return(resGO);
 }
@@ -191,8 +192,8 @@ t_uc51::inst_anl_a_$data(uchar code)
 {
   uchar d;
 
-  d= sfr->get(event_at.ws= ACC);
-  sfr->set(ACC, d&= fetch());
+  d= acc->read();
+  acc->write(d & fetch());
   return(resGO);
 }
 
@@ -206,11 +207,12 @@ t_uc51::inst_anl_a_$data(uchar code)
 int
 t_uc51::inst_anl_a_addr(uchar code)
 {
-  uchar *addr, d;
+  t_mem d;
+  class cl_cell *cell;
 
-  addr= get_direct(fetch(), &event_at.ri, &event_at.rs);
-  d= sfr->get(event_at.ws= ACC);
-  sfr->set(ACC, d&= read(addr));
+  cell= get_direct(fetch());
+  d= acc->read();
+  acc->write(d & cell->read());
   return(resGO);
 }
 
@@ -224,13 +226,13 @@ t_uc51::inst_anl_a_addr(uchar code)
 int
 t_uc51::inst_anl_a_$ri(uchar code)
 {
-  uchar *addr, d;
-  int res;
+  t_mem d;
+  class cl_cell *cell;
 
-  addr= get_indirect(event_at.ri= *(get_reg(code & 0x01)), &res);
-  d= sfr->get(event_at.ws= ACC);
-  sfr->set(ACC, d&= *addr);
-  return(res);
+  cell= iram->get_cell(get_reg(code & 0x01)->read());
+  d= acc->read();
+  acc->write(d & cell->read());
+  return(resGO);
 }
 
 
@@ -245,8 +247,8 @@ t_uc51::inst_anl_a_rn(uchar code)
 {
   uchar d;
 
-  d= sfr->get(event_at.ws= ACC);
-  sfr->set(ACC, d&= *(get_reg(code & 0x07, &event_at.ri)));
+  d= acc->read();
+  acc->write(d & get_reg(code & 0x07)->read());
   return(resGO);
 }
 
@@ -260,11 +262,10 @@ t_uc51::inst_anl_a_rn(uchar code)
 int
 t_uc51::inst_xrl_addr_a(uchar code)
 {
-  uchar *addr;
+  class cl_cell *cell;
 
-  addr= get_direct(fetch(), &event_at.wi, &event_at.ws);
-  (*addr)^= sfr->get(event_at.rs= ACC);
-  proc_write(addr);
+  cell= get_direct(fetch());
+  cell->write(cell->read(HW_PORT) ^ acc->read());
   return(resGO);
 }
 
@@ -278,11 +279,10 @@ t_uc51::inst_xrl_addr_a(uchar code)
 int
 t_uc51::inst_xrl_addr_$data(uchar code)
 {
-  uchar *addr;
+  class cl_cell *cell;
 
-  addr= get_direct(fetch(), &event_at.wi, &event_at.ws);
-  (*addr)^= fetch();
-  proc_write(addr);
+  cell= get_direct(fetch());
+  cell->write(cell->read(HW_PORT) ^ fetch());
   tick(1);
   return(resGO);
 }
@@ -299,8 +299,8 @@ t_uc51::inst_xrl_a_$data(uchar code)
 {
   uchar d;
 
-  d= sfr->get(event_at.ws= ACC);
-  sfr->set(ACC, d^= fetch());
+  d= acc->read();
+  acc->write(d ^ fetch());
   return(resGO);
 }
 
@@ -314,12 +314,12 @@ t_uc51::inst_xrl_a_$data(uchar code)
 int
 t_uc51::inst_xrl_a_addr(uchar code)
 {
-  uchar d;
+  t_mem d;
+  class cl_cell *cell;
 
-  d= sfr->get(event_at.ws= ACC);
-  sfr->set(ACC, d^= read(get_direct(fetch(),
-                                   &event_at.ri,
-                                   &event_at.ri)));
+  cell= get_direct(fetch());
+  d= acc->read();
+  acc->write(d ^ cell->read());
   return(resGO);
 }
 
@@ -333,13 +333,13 @@ t_uc51::inst_xrl_a_addr(uchar code)
 int
 t_uc51::inst_xrl_a_$ri(uchar code)
 {
-  uchar *addr, d;
-  int res;
+  t_mem d;
+  class cl_cell *cell;
 
-  addr= get_indirect(event_at.ri= *(get_reg(code & 0x01)), &res);
-  d= sfr->get(event_at.ws= ACC);
-  sfr->set(ACC, d^= *addr);
-  return(res);
+  cell= iram->get_cell(get_reg(code & 0x01)->read());
+  d= acc->read();
+  acc->write(d ^ cell->read());
+  return(resGO);
 }
 
 
@@ -352,10 +352,10 @@ t_uc51::inst_xrl_a_$ri(uchar code)
 int
 t_uc51::inst_xrl_a_rn(uchar code)
 {
-  uchar d;
+  t_mem d;
 
-  d= sfr->get(event_at.ws= ACC);
-  sfr->set(ACC, d^= *(get_reg(code & 0x07, &event_at.ri)));
+  d= acc->read();
+  acc->write(d ^ get_reg(code & 0x07)->read());
   return(resGO);
 }
 
@@ -369,7 +369,7 @@ t_uc51::inst_xrl_a_rn(uchar code)
 int
 t_uc51::inst_cpl_a(uchar code)
 {
-  sfr->set(event_at.ws= ACC, ~(sfr->get(ACC)));
+  acc->write(~(acc->read()));
   return(resGO);
 }