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);
}
t_addr a;
pop_addr(&a);
- PC= a % rom->size;
+ PC= rom->validate_address(a);
tick(3);
return(resGO);
}
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);
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);
}
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);
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
k= ((code&0x1f0)>>3)|(code&1);
k= (k<<16)|fetch();
- PC= k % rom->size;
+ PC= rom->validate_address(k);
tick(2);
return(resGO);
}
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);
}
{
if (code&0x200)
k|= -128;
- PC= (PC+k) % rom->size;
+ PC= rom->validate_address((signed)PC+k);
tick(1);
}
return(resGO);
{
if (code&0x200)
k|= -128;
- PC= (PC+k) % rom->size;
+ PC= rom->validate_address((signed)PC+k);
tick(1);
}
return(resGO);
i++;
if (dt[i].mnemonic != NULL)
{
- PC= (PC + dt[i].length) % rom->size;
+ PC= rom->validate_address(PC + dt[i].length);
tick(1);
}
else
i++;
if (dt[i].mnemonic != NULL)
{
- PC= (PC + dt[i].length) % rom->size;
+ PC= rom->validate_address(PC + dt[i].length);
tick(1);
}
else