cl_uc(asim)
{
type= CPU_AVR;
+ sleep_executed= 0;
}
int
case MEM_IRAM: return(0x10000);
default: return(0);
}
- return(cl_uc::get_mem_size(type));
+ //return(0);
+ //return(cl_uc::get_mem_size(type));
}
int
return(ijmp(code));
if ((code & 0xff00) == 0x9600)
return(adiw_Rdl_K(code));
+ if ((code & 0xff00) == 0x9700)
+ return(sbiw_Rdl_K(code));
switch (code & 0xfc00)
{
case 0x9000:
}
+/*
+ */
+
+int
+cl_avr::push_data(t_mem data)
+{
+ t_addr sp;
+ t_mem spl, sph;
+
+ spl= ram->read(SPL);
+ sph= ram->read(SPH);
+ sp= 0xffff & (256*sph + spl);
+ ram->write(sp, &data);
+ sp= 0xffff & (sp-1);
+ spl= sp & 0xff;
+ sph= (sp>>8) & 0xff;
+ ram->write(SPL, &spl);
+ ram->write(SPH, &sph);
+ return(resGO);
+}
+
+int
+cl_avr::push_addr(t_addr addr)
+{
+ t_addr sp;
+ t_mem spl, sph, al, ah;
+
+ spl= ram->read(SPL);
+ sph= ram->read(SPH);
+ sp= 0xffff & (256*sph + spl);
+ al= addr & 0xff;
+ ah= (addr>>8) & 0xff;
+ ram->write(sp, &ah);
+ sp= 0xffff & (sp-1);
+ ram->write(sp, &al);
+ sp= 0xffff & (sp-1);
+ spl= sp & 0xff;
+ sph= (sp>>8) & 0xff;
+ ram->write(SPL, &spl);
+ ram->write(SPH, &sph);
+ return(resGO);
+}
+
+int
+cl_avr::pop_data(t_mem *data)
+{
+ t_addr sp;
+ t_mem spl, sph;
+
+ spl= ram->read(SPL);
+ sph= ram->read(SPH);
+ sp= 256*sph + spl;
+ sp= 0xffff & (sp+1);
+ *data= ram->read(sp);
+ spl= sp & 0xff;
+ sph= (sp>>8) & 0xff;
+ ram->write(SPL, &spl);
+ ram->write(SPH, &sph);
+
+ return(resGO);
+}
+
+int
+cl_avr::pop_addr(t_addr *addr)
+{
+ t_addr sp;
+ t_mem spl, sph, al, ah;
+
+ spl= ram->read(SPL);
+ sph= ram->read(SPH);
+ sp= 256*sph + spl;
+ sp= 0xffff & (sp+1);
+ al= ram->read(sp);
+ sp= 0xffff & (sp+1);
+ ah= ram->read(sp);
+ *addr= ah*256 + al;
+ spl= sp & 0xff;
+ sph= (sp>>8) & 0xff;
+ ram->write(SPL, &spl);
+ ram->write(SPH, &sph);
+
+ return(resGO);
+}
+
+
/*
* Set Z, N, V, S bits of SREG after logic instructions and some others
*/