diff options
-rw-r--r-- | sim/ucsim/src/sims/rxk.src/imove.cc | 10 | ||||
-rw-r--r-- | sim/ucsim/src/sims/rxk.src/rmem.cc | 4 |
2 files changed, 9 insertions, 5 deletions
diff --git a/sim/ucsim/src/sims/rxk.src/imove.cc b/sim/ucsim/src/sims/rxk.src/imove.cc index 4a5d5f26a..87cb32eb5 100644 --- a/sim/ucsim/src/sims/rxk.src/imove.cc +++ b/sim/ucsim/src/sims/rxk.src/imove.cc @@ -558,10 +558,11 @@ cl_rxk::ld_imn_ss(u16_t src) int cl_rxk::ldp_irp_rp(u16_t addr, u16_t src) { - t_addr a= ((u32_t)rA << 16) + addr; + u32_t rAl= rA & 0xf; + t_addr a= ((u32_t)rAl << 16) + addr; mem->phwrite(a, src&0xff); addr++; - a= ((u32_t)rA << 16) + addr; // LDP wraps around 64k page boundary + a= ((u32_t)rAl << 16) + addr; // LDP wraps around 64k page boundary mem->phwrite(a, (src>>8)&0xff); vc.wr+= 2; tick(11); @@ -571,10 +572,11 @@ cl_rxk::ldp_irp_rp(u16_t addr, u16_t src) int cl_rxk::ldp_rp_irp(class cl_cell16 &dest, u16_t addr) { - t_addr a= ((u32_t)rA >> 16) + addr; + u32_t rAl= rA & 0xf; + t_addr a= ((u32_t)rAl << 16) + addr; u8_t l= mem->phread(a); addr++; - a= ((u32_t)rA >> 16) + addr; + a= ((u32_t)rAl << 16) + addr; u8_t h= mem->phread(a); dest.W(h*256+l); vc.rd+= 2; diff --git a/sim/ucsim/src/sims/rxk.src/rmem.cc b/sim/ucsim/src/sims/rxk.src/rmem.cc index cfc8a44df..fde027120 100644 --- a/sim/ucsim/src/sims/rxk.src/rmem.cc +++ b/sim/ucsim/src/sims/rxk.src/rmem.cc @@ -181,6 +181,7 @@ cl_ras::set(t_addr addr, t_mem val) { err_inv_addr(addr); dummy->set(val); + return; } cella[addr].set(val); } @@ -193,10 +194,11 @@ cl_ras::set(t_addr addr, t_mem val) void cl_ras::phset(t_addr phaddr, t_mem val) { - if (phaddr >- chip->get_size()) + if (phaddr >= chip->get_size()) { err_inv_addr(phaddr); dummy->set(val); + return; } u8_t *slot= (u8_t*)(chip->get_slot(phaddr)); *slot= val; |