* sim/ucsim/*.*, sim/ucsim/configure, sim/ucsim/configure.in:
[fw/sdcc] / sim / ucsim / sim.src / uccl.h
index 32ce9fd7140a3450d2f7e21c20b5936cd0e2cc37..54f4f605f5ca79f9b01eac905e90b41123bddf05 100644 (file)
@@ -36,13 +36,14 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
 #include "hwcl.h"
 #include "memcl.h"
 #include "brkcl.h"
+#include "stackcl.h"
 
 
 /* Counter to count clock ticks */
 
-#define TICK_RUN       0x01
-#define TICK_INISR     0x02
-#define TICK_IDLE      0x03
+#define TICK_RUN        0x01
+#define TICK_INISR      0x02
+#define TICK_IDLE       0x03
 
 class cl_ticker: public cl_base
 {
@@ -50,49 +51,66 @@ public:
   unsigned long ticks;
   int options; // see TICK_XXX above
   int dir;
-  char *name;
+  //char *name;
 
-  cl_ticker(int adir, int in_isr, char *aname);
+  cl_ticker(int adir, int in_isr, const char *aname);
   virtual ~cl_ticker(void);
   
   virtual int tick(int nr);
   virtual double get_rtime(double xtal);
-  virtual void dump(int nr, double xtal, class cl_console *con);
+  virtual void dump(int nr, double xtal, class cl_console_base *con);
 };
 
 
+/* Options of the microcontroller */
+class cl_xtal_option: public cl_optref
+{
+protected:
+  class cl_uc *uc;
+public:
+  cl_xtal_option(class cl_uc *the_uc);
+  virtual void option_changed(void);
+};
+
 /* Abstract microcontroller */
 
 class cl_uc: public cl_base
 {
 public:
-  int type;                    // CPU family
-  int technology;              // CMOS, HMOS
-  int state;                   // GO, IDLE, PD
-  class cl_list *options;
-
-  t_addr PC, instPC;           // Program Counter
-  bool inst_exec;              // Instruction is executed
-  class cl_ticker *ticks;      // Nr of XTAL clocks
-  class cl_ticker *isr_ticks;  // Time in ISRs
-  class cl_ticker *idle_ticks; // Time in idle mode
-  class cl_list *counters;     // User definable timers (tickers)
-  int inst_ticks;              // ticks of an instruction
-  double xtal;                 // Clock speed
-
-  int brk_counter;             // Number of breakpoints
-  class brk_coll *fbrk;                // Collection of FETCH break-points
-  class brk_coll *ebrk;                // Collection of EVENT breakpoints
+  int type;                     // CPU family
+  int technology;               // CMOS, HMOS
+  int state;                    // GO, IDLE, PD
+  //class cl_list *options;
+  class cl_xtal_option *xtal_option;
+
+  t_addr PC, instPC;            // Program Counter
+  bool inst_exec;               // Instruction is executed
+  class cl_ticker *ticks;       // Nr of XTAL clocks
+  class cl_ticker *isr_ticks;   // Time in ISRs
+  class cl_ticker *idle_ticks;  // Time in idle mode
+  class cl_list *counters;      // User definable timers (tickers)
+  int inst_ticks;               // ticks of an instruction
+  double xtal;                  // Clock speed
+
+  int brk_counter;              // Number of breakpoints
+  class brk_coll *fbrk;         // Collection of FETCH break-points
+  class brk_coll *ebrk;         // Collection of EVENT breakpoints
   class cl_sim *sim;
-  class cl_list *mems;
+  //class cl_list *mems;
   class cl_hws *hws;
+  
+  class cl_list *memchips;      // v3
+  class cl_address_space_list *address_spaces;
+  class cl_address_space *rom;  // Required for almost every uc
+
+  //class cl_list *address_decoders;
 
-  class cl_irqs *it_sources;   // Sources of interrupts
-  class cl_list *it_levels;    // Follow interrupt services
-  class cl_list *st_ops;       // Track stack operations
+  class cl_irqs *it_sources;    // Sources of interrupts
+  class cl_list *it_levels;     // Follow interrupt services
+  class cl_list *stack_ops;     // Track stack operations
 
-  class cl_list *errors;       // Errors of instruction execution
-  class cl_list *events;       // Events happened during inst exec
+  class cl_list *errors;        // Errors of instruction execution
+  class cl_list *events;        // Events happened during inst exec
 
   t_addr sp_max;
   t_addr sp_avg;
@@ -101,26 +119,27 @@ public:
   cl_uc(class cl_sim *asim);
   virtual ~cl_uc(void);
   virtual int init(void);
-  virtual char *id_string(void);
+  virtual const char *id_string(void);
   virtual void reset(void);
 
   // making objects
-  virtual class cl_mem *mk_mem(enum mem_class type, char *class_name);
-  virtual t_addr get_mem_size(enum mem_class type);
-  virtual int get_mem_width(enum mem_class type);
+  //virtual class cl_m *mk_mem(enum mem_class type, char *class_name);
+  virtual void make_memories(void);
+  //virtual t_addr get_mem_size(char *id);
+  //virtual int get_mem_width(char *id);
   virtual void mk_hw_elements(void);
   virtual void build_cmdset(class cl_cmdset *cmdset);
 
   // manipulating memories
-  virtual t_mem read_mem(enum mem_class type, t_addr addr);
-  virtual t_mem get_mem(enum mem_class type, t_addr addr);
-  virtual void write_mem(enum mem_class type, t_addr addr, t_mem val);
-  virtual void set_mem(enum mem_class type, t_addr addr, t_mem val);
-  virtual class cl_mem *mem(enum mem_class type);
-  virtual class cl_mem *mem(char *class_name);
+  virtual t_mem read_mem(const char *id, t_addr addr);
+  virtual t_mem get_mem(const char *id, t_addr addr);
+  virtual void write_mem(const char *id, t_addr addr, t_mem val);
+  virtual void set_mem(const char *id, t_addr addr, t_mem val);
+  virtual class cl_address_space *address_space(const char *id);
+  virtual class cl_memory *memory(const char *id);
 
   // file handling
-  virtual long read_hex_file(const char *name);
+  virtual long read_hex_file(const char *nam);
 
   // instructions, code analyzer
   virtual void analyze(t_addr addr) {}
@@ -140,11 +159,11 @@ public:
   virtual void do_extra_hw(int cycles);
   virtual int tick(int cycles);
   virtual class cl_ticker *get_counter(int nr);
-  virtual class cl_ticker *get_counter(char *name);
+  virtual class cl_ticker *get_counter(char *nam);
   virtual void add_counter(class cl_ticker *ticker, int nr);
-  virtual void add_counter(class cl_ticker *ticker, char *name);
+  virtual void add_counter(class cl_ticker *ticker, char *nam);
   virtual void del_counter(int nr);
-  virtual void del_counter(char *name);
+  virtual void del_counter(char *nam);
   virtual double get_rtime(void);
   virtual int clock_per_cycle(void);
 
@@ -159,10 +178,8 @@ public:
   virtual int it_priority(uchar ie_mask) {return(0);}
 
   // stack tracking
-  virtual void st_push(class cl_stack_op *op);
-  virtual void st_call(class cl_stack_op *op);
-  virtual int st_pop(class cl_stack_op *op);
-  virtual int st_ret(class cl_stack_op *op);
+  virtual void stack_write(class cl_stack_op *op);
+  virtual void stack_read(class cl_stack_op *op);
 
   // breakpoints
   virtual class cl_fetch_brk *fbrk_at(t_addr addr);
@@ -174,32 +191,41 @@ public:
   virtual void put_breaks(void);
   virtual void remove_all_breaks(void);
   virtual int make_new_brknr(void);
-  virtual class cl_ev_brk *mk_ebrk(enum brk_perm perm, class cl_mem *mem,
-                                  char op, t_addr addr, int hit);
+  virtual class cl_ev_brk *mk_ebrk(enum brk_perm perm,
+                                   class cl_address_space *mem,
+                                   char op, t_addr addr, int hit);
   virtual void check_events(void);
 
   // disassembling and symbol recognition
-  virtual char *disass(t_addr addr, char *sep);
+  virtual char *disass(t_addr addr, const char *sep);
   virtual struct dis_entry *dis_tbl(void);
   virtual struct name_entry *sfr_tbl(void);
   virtual struct name_entry *bit_tbl(void);
-  virtual void print_disass(t_addr addr, class cl_console *con);
-  virtual void print_regs(class cl_console *con);
+  virtual void print_disass(t_addr addr, class cl_console_base *con);
+  virtual void print_regs(class cl_console_base *con);
   virtual int inst_length(t_addr addr);
   virtual int inst_branch(t_addr addr);
   virtual int longest_inst(void);
   virtual bool get_name(t_addr addr, struct name_entry tab[], char *buf);
+  virtual bool symbol2address(char *sym, struct name_entry tab[],
+                              t_addr *addr);
   virtual char *symbolic_bit_name(t_addr bit_address,
-                                 class cl_mem *mem,
-                                 t_addr mem_addr,
-                                 t_mem bit_mask);
+                                  class cl_memory *mem,
+                                  t_addr mem_addr,
+                                  t_mem bit_mask);
 
   /* Converting abstract address spaces into real ones */
-  virtual class cl_mem *bit2mem(t_addr bitaddr,
-                               t_addr *memaddr, t_mem *bitmask);
-
+  virtual class cl_address_space *bit2mem(t_addr bitaddr,
+                                          t_addr *memaddr,
+                                          t_mem *bitmask);
+  virtual t_addr bit_address(class cl_memory *mem,
+                             t_addr mem_address,
+                             int bit_number) { return(-1); }
+  
   // messages from app to handle and broadcast
-  virtual void mem_cell_changed(class cl_mem *mem, t_addr addr);
+  virtual bool handle_event(class cl_event &event);
+  //virtual void mem_cell_changed(class cl_address_space *mem, t_addr addr);
+  virtual void address_space_added(class cl_address_space *as);
 
   // Error handling
   virtual void error(class cl_error *error);
@@ -213,6 +239,29 @@ public:
 };
 
 
+/*
+ * Errors
+ */
+
+#include "errorcl.h"
+
+class cl_error_unknown_code: public cl_error
+{
+protected:
+  class cl_uc *uc;
+public:
+  cl_error_unknown_code(class cl_uc *the_uc);
+
+  virtual void print(class cl_commander_base *c);
+};
+
+class cl_uc_error_registry: public cl_error_registry
+{
+public:
+  cl_uc_error_registry(void);
+};
+
 #endif
 
+
 /* End of uccl.h */