#include "xacl.h"
#include "regsxa.h"
+
+void cl_xa::store1(t_addr addr, unsigned char val)
+{
+ if (addr < 0x2000) {
+ set_idata1(addr, val);
+ } else {
+ set_xdata1(addr, val);
+ }
+}
+
+void cl_xa::store2(t_addr addr, unsigned char val)
+{
+ if (addr < 0x2000) {
+ set_idata2(addr, val);
+ } else {
+ set_xdata2(addr, val);
+ }
+}
+
+unsigned char cl_xa::get1(t_addr addr)
+{
+ if (addr < 0x2000) {
+ return get_idata1(addr);
+ } else {
+ return get_xdata1(addr);
+ }
+}
+
+unsigned short cl_xa::get2(t_addr addr)
+{
+ if (addr < 0x2000) {
+ return get_idata2(addr);
+ } else {
+ return get_xdata2(addr);
+ }
+}
+
int cl_xa::get_reg(int word_flag, unsigned int index)
{
int result;
break;
case REG_DATA8 :
+#if 0
+ {
+ unsigned char dat = fetch();
+ unsigned char res;
+ res = FUNC1( reg1(RI_F0), dat);
+ set_reg1( RI_F0, res );
+ printf("reg_data8 code=%x dat=%x, res=%x r=%x\n", code, dat, res, reg1( RI_F0) );
+ }
+#endif
set_reg1( RI_F0, FUNC1( reg1(RI_F0), fetch()) );
break;
case REG_DATA16 :
{
unsigned short dat = fetch2();
- //unsigned short res;
- //res = FUNC2( reg2(RI_F0), dat);
- //set_reg2( RI_F0, res );
-//printf("reg_data16 code=%x dat=%x, res=%x\n", code, dat, res);
set_reg2( RI_F0, FUNC2( reg2(RI_F0), dat) );
}
break;
#define get_byte_direct(addr) sfr->get((t_addr) (addr))
#define get_word_direct(addr) (sfr->get((t_addr) (addr)) | (sfr->get((t_addr) (addr+1)) << 8) )
+/* store to idata(onchip) ram */
+#define set_idata2(addr, val) { iram->set((t_addr) (addr), (val) & 0xff); \
+ iram->set((t_addr) (addr+1), ((val) >> 8) & 0xff); }
+#define set_idata1(addr, val) iram->set((t_addr) (addr), (val) )
+
+/* get from idata(onchip) ram */
+#define get_idata1(addr) iram->get((t_addr) (addr))
+#define get_idata2(addr) (iram->get((t_addr) (addr)) | (iram->get((t_addr) (addr+1)) << 8) )
+
+/* store to xdata(external) ram */
+#define set_xdata2(addr, val) { ram->set((t_addr) (addr), (val) & 0xff); \
+ ram->set((t_addr) (addr+1), ((val) >> 8) & 0xff); }
+#define set_xdata1(addr, val) ram->set((t_addr) (addr), val)
+
+/* get from xdata(external) ram */
+#define get_xdata1(addr) ram->get((t_addr) (addr))
+#define get_xdata2(addr) (ram->get((t_addr) (addr)) | (ram->get((t_addr) (addr+1)) << 8) )
+
+#if 0
+ moved to inst.cc as functions
/* store to ram */
#define store2(addr, val) { ram->set((t_addr) (addr), (val) & 0xff); \
ram->set((t_addr) (addr+1), ((val) >> 8) & 0xff); }
/* get from ram */
#define get1(addr) ram->get((t_addr) (addr))
#define get2(addr) (ram->get((t_addr) (addr)) | (ram->get((t_addr) (addr+1)) << 8) )
+#endif
/* get from code */
#define getcode1(addr) rom->get((t_addr) (addr))
#define reg1(_index) (unsigned char)get_reg(0, (_index))
#define set_reg1(_index, _value) { \
- set_byte_direct((REGS_OFFSET+(_index<<1)), _value); \
+ set_byte_direct((REGS_OFFSET+(_index)), _value); \
}
#define set_reg2(_index, _value) { \
virtual int exec_inst(void);
virtual int get_reg(int word_flag, unsigned int index);
+
+ virtual void store1(t_addr addr, unsigned char val);
+ virtual void store2(t_addr addr, unsigned char val);
+ virtual unsigned char get1(t_addr addr);
+ virtual unsigned short get2(t_addr addr);
+
virtual bool get_bit(int bit);
virtual void set_bit(int bit, int value);