projects
/
fw
/
sdcc
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
version 0.5.2
[fw/sdcc]
/
sim
/
ucsim
/
avr.src
/
jump_inst.cc
diff --git
a/sim/ucsim/avr.src/jump_inst.cc
b/sim/ucsim/avr.src/jump_inst.cc
index 49c9769b55a3ec5ecd940e21269166ea84d8569f..54f98f9726054b84082eebceb27620861305bd53 100644
(file)
--- a/
sim/ucsim/avr.src/jump_inst.cc
+++ b/
sim/ucsim/avr.src/jump_inst.cc
@@
-42,7
+42,7
@@
cl_avr::ijmp(t_mem code)
t_addr z;
z= ram->get(ZH)*256 + ram->get(ZL);
t_addr z;
z= ram->get(ZH)*256 + ram->get(ZL);
- PC=
((PC & ~0xffff) | z) % rom->size
;
+ PC=
rom->validate_address((PC & ~0xffff) | z)
;
//FIXME: analyze
return(resGO);
}
//FIXME: analyze
return(resGO);
}
@@
-99,7
+99,7
@@
cl_avr::ret(t_mem code)
t_addr a;
pop_addr(&a);
t_addr a;
pop_addr(&a);
- PC=
a % rom->size
;
+ PC=
rom->validate_address(a)
;
tick(3);
return(resGO);
}
tick(3);
return(resGO);
}
@@
-118,7
+118,7
@@
cl_avr::reti(t_mem code)
t_addr a;
pop_addr(&a);
t_addr a;
pop_addr(&a);
- PC=
a % rom->size
;
+ PC=
rom->validate_address(a)
;
t_mem sreg= ram->read(SREG);
sreg|= BIT_I;
ram->write(SREG, sreg);
t_mem sreg= ram->read(SREG);
sreg|= BIT_I;
ram->write(SREG, sreg);
@@
-137,14
+137,11
@@
cl_avr::reti(t_mem code)
int
cl_avr::rjmp_k(t_mem code)
{
int
cl_avr::rjmp_k(t_mem code)
{
- long k= code & 0xfff
, pc
;
+ long k= code & 0xfff;
if (k & 0x800)
k|= -4096;
if (k & 0x800)
k|= -4096;
- pc= PC+k;
- if (pc < 0)
- pc= rom->size + pc;
- PC= pc % rom->size;
+ PC= rom->validate_address((signed)PC + (signed)k);
tick(1);
return(resGO);
}
tick(1);
return(resGO);
}
@@
-166,8
+163,7
@@
cl_avr::rcall_k(t_mem code)
k= code & 0xfff;
if (k & 0x800)
k|= ~0xfff;
k= code & 0xfff;
if (k & 0x800)
k|= ~0xfff;
- PC= (signed)PC + (signed)k;
- PC= PC % rom->size;
+ PC= rom->validate_address((signed)PC + (signed)k);
tick(2);
return(resGO);
tick(2);
return(resGO);
@@
-198,7
+194,7
@@
cl_avr::cpse_Rd_Rr(t_mem code)
i++;
if (dt[i].mnemonic != NULL)
{
i++;
if (dt[i].mnemonic != NULL)
{
- PC=
(PC + dt[i].length) % get_mem_size(MEM_ROM
);
+ PC=
rom->validate_address(PC + dt[i].length
);
tick(1);
}
else
tick(1);
}
else
@@
-223,7
+219,7
@@
cl_avr::jmp_k(t_mem code)
k= ((code&0x1f0)>>3)|(code&1);
k= (k<<16)|fetch();
k= ((code&0x1f0)>>3)|(code&1);
k= (k<<16)|fetch();
- PC=
k % rom->size
;
+ PC=
rom->validate_address(k)
;
tick(2);
return(resGO);
}
tick(2);
return(resGO);
}
@@
-245,7
+241,7
@@
cl_avr::call_k(t_mem code)
k= (((code&0x1f0)>>3)|(code&1))*0x10000;
k= k + fetch();
push_addr(PC);
k= (((code&0x1f0)>>3)|(code&1))*0x10000;
k= k + fetch();
push_addr(PC);
- PC=
k % rom->size
;
+ PC=
rom->validate_address(k)
;
tick(3);
return(resGO);
}
tick(3);
return(resGO);
}
@@
-271,7
+267,7
@@
cl_avr::brbs_s_k(t_mem code)
{
if (code&0x200)
k|= -128;
{
if (code&0x200)
k|= -128;
- PC=
(PC+k) % rom->size
;
+ PC=
rom->validate_address((signed)PC+k)
;
tick(1);
}
return(resGO);
tick(1);
}
return(resGO);
@@
-298,7
+294,7
@@
cl_avr::brbc_s_k(t_mem code)
{
if (code&0x200)
k|= -128;
{
if (code&0x200)
k|= -128;
- PC=
(PC+k) % rom->size
;
+ PC=
rom->validate_address((signed)PC+k)
;
tick(1);
}
return(resGO);
tick(1);
}
return(resGO);
@@
-328,7
+324,7
@@
cl_avr::sbrc_Rr_b(t_mem code)
i++;
if (dt[i].mnemonic != NULL)
{
i++;
if (dt[i].mnemonic != NULL)
{
- PC=
(PC + dt[i].length) % rom->size
;
+ PC=
rom->validate_address(PC + dt[i].length)
;
tick(1);
}
else
tick(1);
}
else
@@
-361,7
+357,7
@@
cl_avr::sbrs_Rr_b(t_mem code)
i++;
if (dt[i].mnemonic != NULL)
{
i++;
if (dt[i].mnemonic != NULL)
{
- PC=
(PC + dt[i].length) % rom->size
;
+ PC=
rom->validate_address(PC + dt[i].length)
;
tick(1);
}
else
tick(1);
}
else