*/
int
-t_uc51::inst_ajmp_addr(uchar code)
+cl_51core::inst_ajmp_addr(uchar code)
{
uchar h, l;
*/
int
-t_uc51::inst_jbc_bit_addr(uchar code)
+cl_51core::inst_jbc_bit_addr(uchar code)
{
uchar bitaddr, jaddr;
jaddr = fetch();
t_addr a;
t_mem m;
- class cl_mem *mem;
+ class cl_address_space *mem;
if ((mem= bit2mem(bitaddr, &a, &m)) == 0)
return(resBITADDR);
t_mem d= mem->read(a, HW_PORT);
mem->write(a, d & ~m);
if (d & m)
- PC= (PC + (signed char)jaddr) & (EROM_SIZE - 1);
+ PC= rom->validate_address(PC + (signed char)jaddr);
tick(1);
return(resGO);
}
*/
int
-t_uc51::inst_ljmp(uchar code)
+cl_51core::inst_ljmp(uchar code)
{
PC= fetch()*256 + fetch();
tick(1);
*/
int
-t_uc51::inst_acall_addr(uchar code)
+cl_51core::inst_acall_addr(uchar code)
{
uchar h, l;
- class cl_cell *stck;
- t_mem sp;
+ class cl_memory_cell *stck;
+ t_mem sp, sp_before/*, sp_after*/;
h= (code >> 5) & 0x07;
l= fetch();
+ sp_before= sfr->get(SP);
sp= sfr->wadd(SP, 1);
//proc_write_sp(sp);
stck= iram->get_cell(sp);
stck->write(PC & 0xff); // push low byte
tick(1);
- sp= sfr->wadd(SP, 1);
+ sp= /*sp_after*= */sfr->wadd(SP, 1);
//proc_write_sp(sp);
stck= iram->get_cell(sp);
stck->write((PC >> 8) & 0xff); // push high byte
+ t_mem pushed= PC;
PC= (PC & 0xf800) | (h*256 + l);
+ class cl_stack_op *so= new cl_stack_call(instPC, PC, pushed, sp_before, sp);
+ so->init();
+ stack_write(so);
return(resGO);
}
*/
int
-t_uc51::inst_lcall(uchar code, uint addr)
+cl_51core::inst_lcall(uchar code, uint addr, bool intr)
{
uchar h= 0, l= 0;
- t_mem sp;
- class cl_cell *stck;
+ t_mem sp, sp_before/*, sp_after*/;
+ class cl_memory_cell *stck;
if (!addr)
{
h= fetch();
l= fetch();
}
+ sp_before= sfr->get(SP);
sp= sfr->wadd(SP, 1);
//proc_write_sp(sp);
stck= iram->get_cell(sp);
//proc_write_sp(sp);
stck= iram->get_cell(sp);
stck->write((PC >> 8) & 0xff); // push high byte
+ t_mem pushed= PC;
if (addr)
PC= addr;
else
PC= h*256 + l;
+ class cl_stack_op *so;
+ if (intr)
+ so= new cl_stack_intr(instPC, PC, pushed, sp_before, sp/*_after*/);
+ else
+ so= new cl_stack_call(instPC, PC, pushed, sp_before, sp/*_after*/);
+ so->init();
+ stack_write(so);
return(resGO);
}
*/
int
-t_uc51::inst_jb_bit_addr(uchar code)
+cl_51core::inst_jb_bit_addr(uchar code)
{
uchar bitaddr, jaddr;
t_addr a;
t_mem m;
- class cl_mem *mem;
+ class cl_address_space *mem;
if ((mem= bit2mem(bitaddr= fetch(), &a, &m)) == 0)
return(resBITADDR);
tick(1);
jaddr= fetch();
if (mem->read(a) & m)
- PC= (PC + (signed char)jaddr) & (EROM_SIZE-1);
+ PC= rom->validate_address(PC + (signed char)jaddr);
return(resGO);
}
*/
int
-t_uc51::inst_ret(uchar code)
+cl_51core::inst_ret(uchar code)
{
uchar h= 0, l= 0;
- t_mem sp;
- class cl_cell *stck;
+ t_mem sp, sp_before/*, sp_after*/;
+ class cl_memory_cell *stck;
- sp= sfr->read(SP);
+ sp= sp_before= sfr->read(SP);
stck= iram->get_cell(sp);
h= stck->read();
sp= sfr->wadd(SP, -1);
l= stck->read();
sp= sfr->wadd(SP, -1);
PC= h*256 + l;
+ class cl_stack_op *so= new cl_stack_ret(instPC, PC, sp_before, sp/*_after*/);
+ so->init();
+ stack_read(so);
return(resGO);
}
*/
int
-t_uc51::inst_jnb_bit_addr(uchar code)
+cl_51core::inst_jnb_bit_addr(uchar code)
{
uchar bitaddr, jaddr;
t_mem m;
t_addr a;
- class cl_mem *mem;
+ class cl_address_space *mem;
if ((mem= bit2mem(bitaddr= fetch(), &a, &m)) == 0)
return(resBITADDR);
tick(1);
jaddr= fetch();
if (!(mem->read(a) & m))
- PC= (PC + (signed char)jaddr) & (get_mem_size(MEM_ROM)-1);
+ PC= rom->validate_address(PC + (signed char)jaddr);
return(resGO);
}
*/
int
-t_uc51::inst_reti(uchar code)
+cl_51core::inst_reti(uchar code)
{
uchar h= 0, l= 0;
- t_mem sp;
- class cl_cell *stck;
+ t_mem sp, sp_before, sp_after;
+ class cl_memory_cell *stck;
- sp= sfr->read(SP);
+ sp= sp_before= sfr->read(SP);
stck= iram->get_cell(sp);
h= stck->read();
sp= sfr->wadd(SP, -1);
stck= iram->get_cell(sp);
l= stck->read();
- sp= sfr->wadd(SP, -1);
+ sp= sp_after= sfr->wadd(SP, -1);
PC= h*256 + l;
interrupt->was_reti= DD_TRUE;
il= (class it_level *)(it_levels->pop());
delete il;
}
+ class cl_stack_op *so=
+ new cl_stack_iret(instPC, PC, sp_before, sp_after);
+ so->init();
+ stack_read(so);
return(resGO);
}
*/
int
-t_uc51::inst_jc_addr(uchar code)
+cl_51core::inst_jc_addr(uchar code)
{
uchar jaddr;
jaddr= fetch();
tick(1);
if (SFR_GET_C)
- PC= (PC + (signed char)jaddr) & (EROM_SIZE-1);
+ PC= rom->validate_address(PC + (signed char)jaddr);
return(resGO);
}
*/
int
-t_uc51::inst_jnc_addr(uchar code)
+cl_51core::inst_jnc_addr(uchar code)
{
uchar jaddr;
jaddr= fetch();
tick(1);
if (!SFR_GET_C)
- PC= (PC + (signed char)jaddr) & (EROM_SIZE-1);
+ PC= rom->validate_address(PC + (signed char)jaddr);
return(resGO);
}
*/
int
-t_uc51::inst_jz_addr(uchar code)
+cl_51core::inst_jz_addr(uchar code)
{
uchar jaddr;
jaddr= fetch();
tick(1);
if (!acc->read())
- PC= (PC + (signed char)jaddr) & (EROM_SIZE-1);
+ PC= rom->validate_address(PC + (signed char)jaddr);
return(resGO);
}
*/
int
-t_uc51::inst_jnz_addr(uchar code)
+cl_51core::inst_jnz_addr(uchar code)
{
uchar jaddr;
jaddr= fetch();
tick(1);
if (acc->read())
- PC= (PC + (signed char)jaddr) & (EROM_SIZE-1);
+ PC= rom->validate_address(PC + (signed char)jaddr);
return(resGO);
}
*/
int
-t_uc51::inst_jmp_Sa_dptr(uchar code)
+cl_51core::inst_jmp_Sa_dptr(uchar code)
{
- PC= (sfr->read(DPH)*256 + sfr->read(DPL) + acc->read()) &
- (EROM_SIZE - 1);
+ PC= rom->validate_address(sfr->read(DPH)*256 + sfr->read(DPL) + acc->read());
tick(1);
return(resGO);
}
*/
int
-t_uc51::inst_sjmp(uchar code)
+cl_51core::inst_sjmp(uchar code)
{
signed char target= fetch();
- PC= (PC + target) & (EROM_SIZE -1);
+ PC= rom->validate_address(PC + target);
tick(1);
return(resGO);
}
*/
int
-t_uc51::inst_cjne_a_Sdata_addr(uchar code)
+cl_51core::inst_cjne_a_Sdata_addr(uchar code)
{
uchar data, jaddr, ac;
tick(1);
SFR_SET_C((ac= acc->read()) < data);
if (ac != data)
- PC= (PC + (signed char)jaddr) & (EROM_SIZE - 1);
+ PC= rom->validate_address(PC + (signed char)jaddr);
return(resGO);
}
*/
int
-t_uc51::inst_cjne_a_addr_addr(uchar code)
+cl_51core::inst_cjne_a_addr_addr(uchar code)
{
uchar data, jaddr;
t_addr a;
- class cl_cell *cell;
+ class cl_memory_cell *cell;
cell= get_direct(a= fetch());
jaddr= fetch();
data= cell->read();
SFR_SET_C(acc->get() < data);
if (acc->read() != data)
- PC= (PC + (signed char)jaddr) & (EROM_SIZE - 1);
+ PC= rom->validate_address(PC + (signed char)jaddr);
return(resGO);
}
*/
int
-t_uc51::inst_cjne_Sri_Sdata_addr(uchar code)
+cl_51core::inst_cjne_Sri_Sdata_addr(uchar code)
{
uchar data, jaddr;
- class cl_cell *cell;
+ class cl_memory_cell *cell;
cell= iram->get_cell(get_reg(code & 0x01)->read());
data = fetch();
t_mem d;
SFR_SET_C((d= cell->read()) < data);
if (d != data)
- PC= (PC + (signed char)jaddr) & (EROM_SIZE - 1);
+ PC= rom->validate_address(PC + (signed char)jaddr);
return(resGO);
}
*/
int
-t_uc51::inst_cjne_rn_Sdata_addr(uchar code)
+cl_51core::inst_cjne_rn_Sdata_addr(uchar code)
{
uchar data, jaddr;
- class cl_cell *reg;
+ class cl_memory_cell *reg;
reg = get_reg(code & 0x07);
data = fetch();
t_mem r;
SFR_SET_C((r= reg->read()) < data);
if (r != data)
- PC= (PC + (signed char)jaddr) & (EROM_SIZE - 1);
+ PC= rom->validate_address(PC + (signed char)jaddr);
return(resGO);
}
*/
int
-t_uc51::inst_djnz_addr_addr(uchar code)
+cl_51core::inst_djnz_addr_addr(uchar code)
{
uchar jaddr;
- class cl_cell *cell;
+ class cl_memory_cell *cell;
cell = get_direct(fetch());
jaddr= fetch();
t_mem d= cell->read(HW_PORT);//cell->wadd(-1);
d= cell->write(d-1);
if (d)
- PC= (PC + (signed char)jaddr) & (EROM_SIZE-1);
+ PC= rom->validate_address(PC + (signed char)jaddr);
return(resGO);
}
*/
int
-t_uc51::inst_djnz_rn_addr(uchar code)
+cl_51core::inst_djnz_rn_addr(uchar code)
{
uchar jaddr;
- class cl_cell *reg;
+ class cl_memory_cell *reg;
reg = get_reg(code & 0x07);
jaddr= fetch();
tick(1);
t_mem r= reg->wadd(-1);
if (r)
- PC= (PC + (signed char)jaddr) & (EROM_SIZE-1);
+ PC= rom->validate_address(PC + (signed char)jaddr);
return(resGO);
}