Merge branch ucsim-034-pre3 to main trunk; new version 0.4
[fw/sdcc] / sim / ucsim / s51.src / mov.cc
index 885b33243e096130bc76d4dd65946f10573cf842..a3240154c05908702099aa782e61525a3c7c35b0 100644 (file)
@@ -51,7 +51,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
 int
 t_uc51::inst_mov_a_$data(uchar code)
 {
-  sfr->set(event_at.ws= ACC, fetch());
+  acc->write(fetch());
   return(resGO);
 }
 
@@ -65,11 +65,10 @@ t_uc51::inst_mov_a_$data(uchar code)
 int
 t_uc51::inst_mov_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(fetch());
   tick(1);
   return(resGO);
 }
@@ -84,13 +83,12 @@ t_uc51::inst_mov_addr_$data(uchar code)
 int
 t_uc51::inst_mov_$ri_$data(uchar code)
 {
-  uchar *addr;
-  int res;
-
-  addr= get_indirect(event_at.wi= *(get_reg(code & 0x01)), &res);
-  (*addr)= fetch();
-  proc_write(addr);
-  return(res);
+  class cl_cell *cell;
+  
+  cell= iram->get_cell(get_reg(code & 0x01)->read());
+  t_mem d= fetch();
+  cell->write(d);
+  return(resGO);
 }
 
 
@@ -103,10 +101,10 @@ t_uc51::inst_mov_$ri_$data(uchar code)
 int
 t_uc51::inst_mov_rn_$data(uchar code)
 {
-  uchar *reg;
+  class cl_cell *reg;
 
-  reg= get_reg(code & 0x07, &event_at.wi);
-  (*reg)= fetch();
+  reg= get_reg(code & 0x07);
+  reg->write(fetch());
   return(resGO);
 }
 
@@ -120,10 +118,7 @@ t_uc51::inst_mov_rn_$data(uchar code)
 int
 t_uc51::inst_movc_a_$a_pc(uchar code)
 {
-  //SFR[ACC]= EROM[event_at.rc= (PC + SFR[ACC]) & (EROM_SIZE - 1)];
-  sfr->set(ACC,
-          mem(MEM_ROM)->get(event_at.rc=
-                            (PC + sfr->get(ACC)))&(EROM_SIZE - 1));
+  acc->write(mem(MEM_ROM)->read(PC + acc->read()));
   tick(1);
   return(resGO);
 }
@@ -138,13 +133,12 @@ t_uc51::inst_movc_a_$a_pc(uchar code)
 int
 t_uc51::inst_mov_addr_addr(uchar code)
 {
-  uchar *d, *s;
+  class cl_cell *d, *s;
 
   /* SD reversed s & d here */
-  s= get_direct(fetch(), &event_at.ri, &event_at.rs);
-  d= get_direct(fetch(), &event_at.wi, &event_at.ws);
-  (*d)= read(s);
-  proc_write(d);
+  s= get_direct(fetch());
+  d= get_direct(fetch());
+  d->write(s->read());
   tick(1);
   return(resGO);
 }
@@ -159,15 +153,13 @@ t_uc51::inst_mov_addr_addr(uchar code)
 int
 t_uc51::inst_mov_addr_$ri(uchar code)
 {
-  uchar *d, *s;
-  int res;
+  class cl_cell *d, *s;
 
-  d= get_direct(fetch(), &event_at.wi, &event_at.ws);
-  s= get_indirect(event_at.ri= *(get_reg(code & 0x01)), &res);
-  *d= *s;
-  proc_write(d);
+  d= get_direct(fetch());
+  s= iram->get_cell(get_reg(code & 0x01)->read());
+  d->write(s->read());
   tick(1);
-  return(res);
+  return(resGO);
 }
 
 
@@ -180,11 +172,10 @@ t_uc51::inst_mov_addr_$ri(uchar code)
 int
 t_uc51::inst_mov_addr_rn(uchar code)
 {
-  uchar *addr;
+  class cl_cell *cell;
 
-  addr= get_direct(fetch(), &event_at.wi, &event_at.ws);
-  (*addr)= *(get_reg(code & 0x07, &event_at.ri));
-  proc_write(addr);
+  cell= get_direct(fetch());
+  cell->write(get_reg(code & 0x07)->read());
   tick(1);
   return(resGO);
 }
@@ -199,8 +190,8 @@ t_uc51::inst_mov_addr_rn(uchar code)
 int
 t_uc51::inst_mov_dptr_$data(uchar code)
 {
-  sfr->set(event_at.ws= DPH, fetch());
-  sfr->set(DPL, fetch());
+  sfr->write(DPH, fetch());
+  sfr->write(DPL, fetch());
   tick(1);
   return(resGO);
 }
@@ -215,10 +206,9 @@ t_uc51::inst_mov_dptr_$data(uchar code)
 int
 t_uc51::inst_movc_a_$a_dptr(uchar code)
 {
-  //SFR[ACC]= EROM[event_at.rc= (SFR[DPH]*256+SFR[DPL]+SFR[ACC])&(EROM_SIZE-1)];
-  sfr->set(ACC, get_mem(MEM_ROM, event_at.rc=
-                       (sfr->get(DPH)*256+sfr->get(DPL) +
-                        sfr->get(ACC)) & (EROM_SIZE-1)));
+  acc->write(get_mem(MEM_ROM,
+                    sfr->read(DPH)*256+sfr->read(DPL) +
+                    acc->read()));
   tick(1);
   return(resGO);
 }
@@ -233,14 +223,13 @@ t_uc51::inst_movc_a_$a_dptr(uchar code)
 int
 t_uc51::inst_mov_$ri_addr(uchar code)
 {
-  uchar *d, *s;
-  int res;
+  class cl_cell *d, *s;
 
-  d= get_indirect(event_at.wi= *(get_reg(code & 0x01)), &res);
-  s= get_direct(fetch(), &event_at.ri, &event_at.rs);
-  (*d)= read(s);
+  d= iram->get_cell(get_reg(code & 0x01)->read());
+  s= get_direct(fetch());
+  d->write(s->read());
   tick(1);
-  return(res);
+  return(resGO);
 }
 
 
@@ -253,11 +242,11 @@ t_uc51::inst_mov_$ri_addr(uchar code)
 int
 t_uc51::inst_mov_rn_addr(uchar code)
 {
-  uchar *reg, *addr;
+  class cl_cell *reg, *cell;
 
-  reg = get_reg(code & 0x07, &event_at.wi);
-  addr= get_direct(fetch(), &event_at.ri, &event_at.rs);
-  (*reg)= read(addr);
+  reg = get_reg(code & 0x07);
+  cell= get_direct(fetch());
+  reg->write(cell->read());
   tick(1);
   return(resGO);
 }
@@ -272,17 +261,15 @@ t_uc51::inst_mov_rn_addr(uchar code)
 int
 t_uc51::inst_push(uchar code)
 {
-  uchar *addr, *sp;
-  int res;
-
-  addr= get_direct(fetch(), &event_at.ri, &event_at.rs);
-  sfr->add(SP, 1);
-  sp= get_indirect(sfr->get(SP), &res);
-  if (res != resGO)
-    res= resSTACK_OV;
-  (*sp)= read(addr);
+  t_addr sp;
+  class cl_cell *stck, *cell;
+
+  cell= get_direct(fetch());
+  sp= sfr->wadd(SP, 1);
+  stck= iram->get_cell(sp);
+  stck->write(cell->read());
   tick(1);
-  return(res);
+  return(resGO);
 }
 
 
@@ -295,13 +282,13 @@ t_uc51::inst_push(uchar code)
 int
 t_uc51::inst_xch_a_addr(uchar code)
 {
-  uchar temp, *addr;
+  t_mem temp;
+  class cl_cell *cell;
 
-  addr= get_direct(fetch(), &event_at.ri, &event_at.rs);
-  temp= sfr->get(ACC);
-  sfr->set(event_at.ws= ACC, read(addr));
-  (*addr)= temp;
-  proc_write(addr);
+  cell= get_direct(fetch());
+  temp= acc->read();
+  acc->write(cell->read());
+  cell->write(temp);
   return(resGO);
 }
 
@@ -315,14 +302,14 @@ t_uc51::inst_xch_a_addr(uchar code)
 int
 t_uc51::inst_xch_a_$ri(uchar code)
 {
-  uchar temp, *addr;
-  int res;
-
-  addr= get_indirect(event_at.ri= *(get_reg(code & 0x01)), &res);
-  temp= sfr->get(ACC);
-  sfr->set(event_at.ws= ACC, *addr);
-  (*addr)= temp;
-  return(res);
+  t_mem temp;
+  class cl_cell *cell;
+
+  cell= iram->get_cell(get_reg(code & 0x01)->read());
+  temp= acc->read();
+  acc->write(cell->read());
+  cell->write(temp);
+  return(resGO);
 }
 
 
@@ -335,12 +322,13 @@ t_uc51::inst_xch_a_$ri(uchar code)
 int
 t_uc51::inst_xch_a_rn(uchar code)
 {
-  uchar temp, *reg;
+  t_mem temp;
+  class cl_cell *reg;
 
-  reg = get_reg(code & 0x07, &event_at.ri);
-  temp= sfr->get(ACC);
-  sfr->set(event_at.wi= ACC, *reg);
-  (*reg)= temp;
+  reg = get_reg(code & 0x07);
+  temp= acc->read();
+  acc->write(reg->read());
+  reg->write(temp);
   return(resGO);
 }
 
@@ -354,18 +342,15 @@ t_uc51::inst_xch_a_rn(uchar code)
 int
 t_uc51::inst_pop(uchar code)
 {
-  uchar *addr, *sp;
-  int res;
-
-  addr= get_direct(fetch(), &event_at.wi, &event_at.ws);
-  sp= get_indirect(get_mem(MEM_SFR, SP), &res);
-  if (res != resGO)
-    res= resSTACK_OV;
-  sfr->add(SP, -1);
-  (*addr)= *sp;
-  proc_write(addr);
+  t_addr sp;
+  class cl_cell *cell, *stck;
+
+  cell= get_direct(fetch());
+  stck= iram->get_cell(sfr->get(SP));
+  cell->write(stck->read());
+  sp= sfr->wadd(SP, -1);
   tick(1);
-  return(res);
+  return(resGO);
 }
 
 
@@ -378,14 +363,14 @@ t_uc51::inst_pop(uchar code)
 int
 t_uc51::inst_xchd_a_$ri(uchar code)
 {
-  uchar *addr, temp;
-  int res;
-
-  addr= get_indirect(event_at.ri= *(get_reg(code & 0x01)), &res);
-  temp= *addr & 0x0f;
-  (*addr) = (*addr & 0xf0) | (sfr->get(ACC) & 0x0f);
-  sfr->set(event_at.ws= ACC, (sfr->get(ACC) & 0xf0) | temp);
-  return(res);
+  t_mem temp, d;
+  class cl_cell *cell;
+
+  cell= iram->get_cell(get_reg(code & 0x01)->read());
+  temp= (d= cell->read()) & 0x0f;
+  cell->write((d & 0xf0) | (acc->read() & 0x0f));
+  acc->write((acc->get() & 0xf0) | temp);
+  return(resGO);
 }
 
 
@@ -398,8 +383,8 @@ t_uc51::inst_xchd_a_$ri(uchar code)
 int
 t_uc51::inst_movx_a_$dptr(uchar code)
 {
-  sfr->set(event_at.ws= ACC,
-          get_mem(MEM_XRAM, event_at.rx=sfr->get(DPH)*256+sfr->get(DPL)));
+  acc->write(read_mem(MEM_XRAM,
+                     sfr->read(DPH)*256 + sfr->read(DPL)));
   tick(1);
   return(resGO);
 }
@@ -414,12 +399,10 @@ t_uc51::inst_movx_a_$dptr(uchar code)
 int
 t_uc51::inst_movx_a_$ri(uchar code)
 {
-  uchar *addr;
+  t_mem d;
 
-  addr= get_reg(code & 0x01);
-  sfr->set(event_at.ws= ACC,
-          read_mem(MEM_XRAM,
-                   event_at.rx= (sfr->get(P2)&port_pins[2])*256+*addr));
+  d= get_reg(code & 0x01)->read();
+  acc->write(read_mem(MEM_XRAM, sfr->read(P2)*256 + d));
   tick(1);
   return(resGO);
 }
@@ -434,10 +417,10 @@ t_uc51::inst_movx_a_$ri(uchar code)
 int
 t_uc51::inst_mov_a_addr(uchar code)
 {
-  uchar *addr;
+  class cl_cell *cell;
 
-  addr= get_direct(fetch(), &event_at.ri, &event_at.rs);
-  sfr->set(event_at.ws= ACC, read(addr));
+  cell= get_direct(fetch());
+  acc->write(cell->read());
   return(resGO);
 }
 
@@ -451,12 +434,11 @@ t_uc51::inst_mov_a_addr(uchar code)
 int
 t_uc51::inst_mov_a_$ri(uchar code)
 {
-  uchar *addr;
-  int res;
+  class cl_cell *cell;
 
-  addr= get_indirect(event_at.ri= *(get_reg(code & 0x01)), &res);
-  sfr->set(event_at.ws= ACC, *addr);
-  return(res);
+  cell= iram->get_cell(get_reg(code & 0x01)->read());
+  acc->write(cell->read());
+  return(resGO);
 }
 
 
@@ -469,7 +451,7 @@ t_uc51::inst_mov_a_$ri(uchar code)
 int
 t_uc51::inst_mov_a_rn(uchar code)
 {
-  sfr->set(event_at.ws= ACC, *(get_reg(code & 0x07, &event_at.ri)));
+  acc->write(get_reg(code & 0x07)->read());
   return(resGO);
 }
 
@@ -483,8 +465,7 @@ t_uc51::inst_mov_a_rn(uchar code)
 int
 t_uc51::inst_movx_$dptr_a(uchar code)
 {
-  set_mem(MEM_XRAM, event_at.wx= sfr->get(DPH)*256+sfr->get(DPL),
-         sfr->get(event_at.rs= ACC));
+  write_mem(MEM_XRAM, sfr->read(DPH)*256 + sfr->read(DPL), acc->read());
   tick(1);
   return(resGO);
 }
@@ -499,12 +480,10 @@ t_uc51::inst_movx_$dptr_a(uchar code)
 int
 t_uc51::inst_movx_$ri_a(uchar code)
 {
-  uchar *addr;
+  t_mem d;
 
-  addr= get_reg(code & 0x01);
-  set_mem(MEM_XRAM,
-         event_at.wx= (sfr->get(P2) & port_pins[2])*256 + *addr,
-         sfr->get(ACC));
+  d= get_reg(code & 0x01)->read();
+  write_mem(MEM_XRAM, sfr->read(P2)*256 + d, acc->read());
   tick(1);
   return(resGO);
 }
@@ -519,11 +498,10 @@ t_uc51::inst_movx_$ri_a(uchar code)
 int
 t_uc51::inst_mov_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(acc->read());
   return(resGO);
 }
 
@@ -537,12 +515,11 @@ t_uc51::inst_mov_addr_a(uchar code)
 int
 t_uc51::inst_mov_$ri_a(uchar code)
 {
-  uchar *addr;
-  int res;
+  class cl_cell *cell;
 
-  addr= get_indirect(event_at.wi= *(get_reg(code & 0x01)), &res);
-  (*addr)= sfr->get(event_at.rs= ACC);
-  return(res);
+  cell= iram->get_cell(get_reg(code & 0x01)->read());
+  cell->write(acc->read());
+  return(resGO);
 }
 
 
@@ -555,10 +532,10 @@ t_uc51::inst_mov_$ri_a(uchar code)
 int
 t_uc51::inst_mov_rn_a(uchar code)
 {
-  uchar *reg;
+  class cl_cell *reg;
 
-  reg= get_reg(code &0x07, &event_at.wi);
-  (*reg)= sfr->get(event_at.rs= ACC);
+  reg= get_reg(code &0x07);
+  reg->write(acc->read());
   return(resGO);
 }