diff options
author | drdani <drdani@4a8a32a2-be11-0410-ad9d-d568d2c75423> | 2025-07-05 19:30:57 +0000 |
---|---|---|
committer | drdani <drdani@4a8a32a2-be11-0410-ad9d-d568d2c75423> | 2025-07-05 19:30:57 +0000 |
commit | fd08cd53786279e1b5f280deb7459b51c0040963 (patch) | |
tree | 0bc820373390c7a2a33eabcd093adb156cf908e8 | |
parent | c6307172a5ee8ffa195693c3afe1e52da790727e (diff) |
[ucsim-rxk] Fix [#3858] uCsim crash
git-svn-id: http://svn.code.sourceforge.net/p/sdcc/code/trunk/sdcc@15512 4a8a32a2-be11-0410-ad9d-d568d2c75423
-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; |