X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=sim%2Fucsim%2Favr.src%2Fjump_inst.cc;h=54f98f9726054b84082eebceb27620861305bd53;hb=f27da39dbcab5678aca6d8462f1cc37a643f37e9;hp=49c9769b55a3ec5ecd940e21269166ea84d8569f;hpb=8c8f34ff4281a55d2f535335c02999246e9e12f2;p=fw%2Fsdcc diff --git a/sim/ucsim/avr.src/jump_inst.cc b/sim/ucsim/avr.src/jump_inst.cc index 49c9769b..54f98f97 100644 --- 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); - PC= ((PC & ~0xffff) | z) % rom->size; + PC= rom->validate_address((PC & ~0xffff) | z); //FIXME: analyze return(resGO); } @@ -99,7 +99,7 @@ cl_avr::ret(t_mem code) t_addr a; pop_addr(&a); - PC= a % rom->size; + PC= rom->validate_address(a); tick(3); return(resGO); } @@ -118,7 +118,7 @@ cl_avr::reti(t_mem code) 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); @@ -137,14 +137,11 @@ cl_avr::reti(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; - 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); } @@ -166,8 +163,7 @@ cl_avr::rcall_k(t_mem code) 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); @@ -198,7 +194,7 @@ cl_avr::cpse_Rd_Rr(t_mem code) 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 @@ -223,7 +219,7 @@ cl_avr::jmp_k(t_mem code) k= ((code&0x1f0)>>3)|(code&1); k= (k<<16)|fetch(); - PC= k % rom->size; + PC= rom->validate_address(k); 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); - PC= k % rom->size; + PC= rom->validate_address(k); tick(3); return(resGO); } @@ -271,7 +267,7 @@ cl_avr::brbs_s_k(t_mem code) { if (code&0x200) k|= -128; - PC= (PC+k) % rom->size; + PC= rom->validate_address((signed)PC+k); tick(1); } return(resGO); @@ -298,7 +294,7 @@ cl_avr::brbc_s_k(t_mem code) { if (code&0x200) k|= -128; - PC= (PC+k) % rom->size; + PC= rom->validate_address((signed)PC+k); tick(1); } return(resGO); @@ -328,7 +324,7 @@ cl_avr::sbrc_Rr_b(t_mem code) i++; if (dt[i].mnemonic != NULL) { - PC= (PC + dt[i].length) % rom->size; + PC= rom->validate_address(PC + dt[i].length); tick(1); } else @@ -361,7 +357,7 @@ cl_avr::sbrs_Rr_b(t_mem code) i++; if (dt[i].mnemonic != NULL) { - PC= (PC + dt[i].length) % rom->size; + PC= rom->validate_address(PC + dt[i].length); tick(1); } else