* sim/ucsim/cmd.src/newcmdposix.cc, sim/ucsim/cmd.src/newcmdposixcl.h,
[fw/sdcc] / sim / ucsim / xa.src / xacl.h
index e21d4f0e709cc15a47b4d87dcde62f5a9f37d025..172f923587ef3247ce8d4dfbfaaf398382a55773 100644 (file)
@@ -3,9 +3,10 @@
  *
  * Copyright (C) 1999,99 Drotos Daniel, Talker Bt.
  *
- * Written by Karl Bongers karl@turbobit.com
- * 
  * To contact author send email to drdani@mazsola.iit.uni-miskolc.hu
+ * Other contributors include:
+ *   Karl Bongers karl@turbobit.com,
+ *   Johan Knol johan.knol@iduna.nl
  *
  */
 
@@ -41,26 +42,35 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
 class cl_xa: public cl_uc
 {
 public:
-  cl_mem *ram;
-  cl_mem *rom;
+  class cl_address_space *ram;
+  class cl_address_space *rom;
   struct t_regs regs;
 
+  class cl_address_space *sfr, *iram;
+
   // for now make it as simple as possible
-  TYPE_UBYTE mem_direct[1024*2];
-#ifndef WORDS_BIGENDIAN
-  TYPE_UWORD *wmem_direct;  /* word pointer at mem_direct */
-#endif
+//  TYPE_UBYTE mem_direct[1024*2];
+//#ifndef WORDS_BIGENDIAN
+//  TYPE_UWORD *wmem_direct;  /* word pointer at mem_direct */
+//#endif
 
 public:
   cl_xa(class cl_sim *asim);
   virtual int init(void);
   virtual char *id_string(void);
 
-  virtual t_addr get_mem_size(enum mem_class type);
+  //virtual class cl_m *mk_mem(enum mem_class type, char *class_name);
+  //virtual t_addr get_mem_size(enum mem_class type);
   virtual void mk_hw_elements(void);
+  virtual void make_memories(void);
 
   virtual struct dis_entry *dis_tbl(void);
 
+  virtual struct name_entry *sfr_tbl(void);
+  virtual struct name_entry *bit_tbl(void);
+  virtual char *get_dir_name(short);
+  virtual char *get_bit_name(short);
+
   virtual int inst_length(t_addr addr);
   virtual int inst_branch(t_addr addr);
   virtual int longest_inst(void);
@@ -73,14 +83,317 @@ public:
                        int *mnemonic);
 
   virtual char *disass(t_addr addr, char *sep);
-  virtual void print_regs(class cl_console *con);
+  virtual void print_regs(class cl_console_base *con);
 
   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 short 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);
+
 #include "instcl.h"
-};
 
+  private :
+
+   /* following are macros which get substituted for FUNC1() and FUNC2()
+      in the inst.cc to form the body of ADD,ADDC,SUB,XOR,... */
+  /* can I put these in the .cc file and still have them do the inline thing? */
+  /*-------------------------------------
+    add - flags changed:C,AC,V,N,Z.
+  |---------------------------------------*/
+  inline unsigned char add1(unsigned char dst, unsigned char src)
+  {
+    unsigned int result;
+    unsigned char flags;
+    flags = get_psw();
+    flags &= ~BIT_ALL; /* clear these bits */
+    result = dst + src;
+    if (result == 0) flags |= BIT_Z;
+    if (result > 0xff) flags |= BIT_C;
+    if (result & 0x80) flags |= BIT_N;
+    /* fixme: do AC, V */
+    set_psw(flags);
+    return (unsigned char) result;
+  }
+
+  inline unsigned short add2(unsigned short dst, unsigned short src)
+  {
+    unsigned int result;
+    unsigned char flags;
+    flags = get_psw();
+    flags &= ~BIT_ALL; /* clear these bits */
+    result = dst + src;
+    if (result == 0) flags |= BIT_Z;
+    if (result > 0xff) flags |= BIT_C;
+    if (result & 0x80) flags |= BIT_N;
+    /* fixme: do AC, V */
+    set_psw(flags);
+    return (unsigned short) result;
+  }
+
+  /*-------------------------------------
+    addc - flags changed:C,AC,V,N,Z.
+  |---------------------------------------*/
+  inline unsigned char addc1(unsigned char dst, unsigned char src)
+  {
+    unsigned int result;
+    unsigned char flags;
+    flags = get_psw();
+    if (flags & BIT_C) {
+      flags &= ~BIT_ALL; /* clear these bits */
+      result = dst + src + 1;
+    } else {
+      flags &= ~BIT_ALL; /* clear these bits */
+      result = dst + src;
+    }
+    if (result == 0) flags |= BIT_Z;
+    if (result > 0xff) flags |= BIT_C;
+    if (result & 0x80) flags |= BIT_N;
+    /* fixme: do AC, V */
+    set_psw(flags);
+    return (unsigned char) result;
+  }
+
+  inline unsigned short addc2(unsigned short dst, unsigned short src)
+  {
+    unsigned int result;
+    unsigned char flags;
+    flags = get_psw();
+    flags &= ~BIT_ALL; /* clear these bits */
+    if (flags & BIT_C) {
+      flags &= ~BIT_ALL; /* clear these bits */
+      result = dst + src + 1;
+    } else {
+      flags &= ~BIT_ALL; /* clear these bits */
+      result = dst + src;
+    }
+    if (result == 0) flags |= BIT_Z;
+    if (result > 0xff) flags |= BIT_C;
+    if (result & 0x80) flags |= BIT_N;
+    /* fixme: do AC, V */
+    set_psw(flags);
+    return (unsigned short) result;
+  }
+
+  /*-------------------------------------
+    sub - flags changed:C,AC,V,N,Z.
+  |---------------------------------------*/
+  inline unsigned char sub1(unsigned char dst, unsigned char src)
+  {
+    unsigned int result;
+    unsigned char flags;
+    flags = get_psw();
+    flags &= ~BIT_ALL; /* clear these bits */
+    result = dst - src;
+    if (result == 0) flags |= BIT_Z;
+    if (result > 0xff) flags |= BIT_C;
+    if (dst < src) flags |= BIT_N;
+    /* fixme: do AC, V */
+    set_psw(flags);
+    return (unsigned char) result;
+  }
+
+  inline unsigned short sub2(unsigned short dst, unsigned short src)
+  {
+    unsigned int result;
+    unsigned char flags;
+    flags = get_psw();
+    flags &= ~BIT_ALL; /* clear these bits */
+    result = dst - src;
+    if (result == 0) flags |= BIT_Z;
+    if (result > 0xff) flags |= BIT_C;
+    if (dst < src) flags |= BIT_N;
+    /* fixme: do AC, V */
+    set_psw(flags);
+    return (unsigned short) result;
+  }
+
+  /*-------------------------------------
+    subb - flags changed:C,AC,V,N,Z.
+  |---------------------------------------*/
+  inline unsigned char subb1(unsigned char dst, unsigned char src)
+  {
+    unsigned int result;
+    unsigned char flags;
+    flags = get_psw();
+    if (flags & BIT_C) {
+      flags &= ~BIT_ALL; /* clear these bits */
+      result = dst - src - 1;
+    } else {
+      flags &= ~BIT_ALL; /* clear these bits */
+      result = dst - src;
+    }
+    if (result == 0) flags |= BIT_Z;
+    if (result > 0xff) flags |= BIT_C;
+    if (dst < src) flags |= BIT_N;
+    /* fixme: do AC, V */
+    set_psw(flags);
+    return (unsigned char) result;
+  }
+
+  inline unsigned short subb2(unsigned short dst, unsigned short src)
+  {
+    unsigned int result;
+    unsigned char flags;
+    flags = get_psw();
+    flags &= ~BIT_ALL; /* clear these bits */
+    if (flags & BIT_C) {
+      flags &= ~BIT_ALL; /* clear these bits */
+      result = dst - src - 1;
+    } else {
+      flags &= ~BIT_ALL; /* clear these bits */
+      result = dst - src;
+    }
+    if (result == 0) flags |= BIT_Z;
+    if (result > 0xff) flags |= BIT_C;
+    if (dst < src) flags |= BIT_N;
+    /* fixme: do AC, V */
+    set_psw(flags);
+    return (unsigned short) result;
+  }
+
+  /*-------------------------------------
+    cmp - flags changed:C,AC,V,N,Z.
+  |---------------------------------------*/
+  inline unsigned char cmp1(unsigned char dst, unsigned char src)
+  {
+    unsigned int result;
+    unsigned char flags;
+    flags = get_psw();
+    flags &= ~BIT_ALL; /* clear these bits */
+    result = dst - src;
+    if (result == 0) flags |= BIT_Z;
+    if (result > 0xff) flags |= BIT_C;
+    if (dst < src) flags |= BIT_N;
+    /* fixme: do AC, V */
+    set_psw(flags);
+    return (unsigned char) dst;
+  }
+
+  inline unsigned short cmp2(unsigned short dst, unsigned short src)
+  {
+    unsigned int result;
+    unsigned char flags;
+    flags = get_psw();
+    flags &= ~BIT_ALL; /* clear these bits */
+    result = dst - src;
+    if (result == 0) flags |= BIT_Z;
+    if (result > 0xff) flags |= BIT_C;
+    if (dst < src) flags |= BIT_N;
+    /* fixme: do AC, V */
+    set_psw(flags);
+    return (unsigned short) dst;
+  }
+
+  /*-------------------------------------
+    and - flags changed:N,Z.
+  |---------------------------------------*/
+  inline unsigned char and1(unsigned char dst, unsigned char src)
+  {
+    unsigned int result;
+    unsigned char flags;
+    flags = get_psw() & ~(BIT_N | BIT_Z); /* clear these bits */
+    result = dst & src;
+    if (result == 0) flags |= BIT_Z;
+    if (result & 0x80) flags |= BIT_N;
+    set_psw(flags);
+    return (unsigned char) result;
+  }
+
+  inline unsigned short and2(unsigned short dst, unsigned short src)
+  {
+    unsigned int result;
+    unsigned char flags;
+    flags = get_psw() & ~(BIT_N | BIT_Z); /* clear these bits */
+    result = dst & src;
+    if (result == 0) flags |= BIT_Z;
+    if (result & 0x80) flags |= BIT_N;
+    set_psw(flags);
+    return (unsigned short) result;
+  }
+
+  /*-------------------------------------
+    or - flags changed:N,Z.
+  |---------------------------------------*/
+  inline unsigned char or1(unsigned char dst, unsigned char src)
+  {
+    unsigned int result;
+    unsigned char flags;
+    flags = get_psw() & ~(BIT_N | BIT_Z); /* clear these bits */
+    result = dst | src;
+    if (result == 0) flags |= BIT_Z;
+    if (result & 0x80) flags |= BIT_N;
+    set_psw(flags);
+    return (unsigned char) result;
+  }
+
+  inline unsigned short or2(unsigned short dst, unsigned short src)
+  {
+    unsigned int result;
+    unsigned char flags;
+    flags = get_psw() & ~(BIT_N | BIT_Z); /* clear these bits */
+    result = dst | src;
+    if (result == 0) flags |= BIT_Z;
+    if (result & 0x80) flags |= BIT_N;
+    set_psw(flags);
+    return (unsigned short) result;
+  }
+
+  /*-------------------------------------
+    xor - flags changed:N,Z.
+  |---------------------------------------*/
+  inline unsigned char xor1(unsigned char dst, unsigned char src)
+  {
+    unsigned char flags;
+    flags = get_psw() & ~(BIT_N | BIT_Z); /* clear these bits */
+    dst ^= src;
+    if (dst == 0) flags |= BIT_Z;
+    if (dst & 0x80) flags |= BIT_N;
+    set_psw(flags);
+    return (unsigned char) dst;
+  }
+
+  inline unsigned short xor2(unsigned short dst, unsigned short src)
+  {
+    unsigned char flags;
+    flags = get_psw() & ~(BIT_N | BIT_Z); /* clear these bits */
+    dst ^= src;
+    if (dst == 0) flags |= BIT_Z;
+    if (dst & 0x8000) flags |= BIT_N;
+    set_psw(flags);
+    return (unsigned short) dst;
+  }
+
+  /*-------------------------------------
+    mov - flags changed:N,Z.
+  |---------------------------------------*/
+  inline unsigned char mov1(unsigned char dst, unsigned char src)
+  {
+    unsigned char flags;
+    flags = get_psw() & ~(BIT_N | BIT_Z); /* clear these bits */
+    dst = src;
+    if (dst == 0) flags |= BIT_Z;
+    if (dst & 0x80) flags |= BIT_N;
+    set_psw(flags);
+    return (unsigned char) dst;
+  }
+
+  inline unsigned short mov2(unsigned short dst, unsigned short src)
+  {
+    unsigned char flags;
+    flags = get_psw() & ~(BIT_N | BIT_Z); /* clear these bits */
+    dst = src;
+    if (dst == 0) flags |= BIT_Z;
+    if (dst & 0x8000) flags |= BIT_N;
+    set_psw(flags);
+    return (unsigned short) dst;
+  }
+};
 
 #endif