summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordrdani <drdani@4a8a32a2-be11-0410-ad9d-d568d2c75423>2025-07-05 19:30:57 +0000
committerdrdani <drdani@4a8a32a2-be11-0410-ad9d-d568d2c75423>2025-07-05 19:30:57 +0000
commitfd08cd53786279e1b5f280deb7459b51c0040963 (patch)
tree0bc820373390c7a2a33eabcd093adb156cf908e8
parentc6307172a5ee8ffa195693c3afe1e52da790727e (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.cc10
-rw-r--r--sim/ucsim/src/sims/rxk.src/rmem.cc4
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;