+ t_addr start_address;
+protected:
+ class cl_uc *uc;
+ t_addr size;
+public:
+ char *addr_format, *data_format;
+ int width; // in bits
+ t_mem data_mask;
+
+ //char *class_name; // used by cl_m!!
+protected:
+ t_addr dump_finished;
+public:
+ cl_memory(char *id, t_addr asize, int awidth);
+ virtual ~cl_memory(void);
+ virtual int init(void);
+
+ t_addr get_start_address(void) { return(start_address); }
+ t_addr get_size(void) { return(size); }
+ virtual void set_uc(class cl_uc *auc) { uc= auc; }
+ virtual bool valid_address(t_addr addr);
+ virtual t_addr inc_address(t_addr addr, int val);
+ virtual t_addr inc_address(t_addr addr);
+ virtual t_addr validate_address(t_addr addr);
+
+ virtual bool is_chip(void) { return(DD_FALSE); }
+ virtual bool is_address_space(void) { return(DD_FALSE); }
+
+ virtual void err_inv_addr(t_addr addr);
+ virtual void err_non_decoded(t_addr addr);
+
+ virtual t_addr dump(t_addr start, t_addr stop, int bpl,
+ class cl_console *con);
+ virtual t_addr dump(class cl_console *con);
+ virtual bool search_next(bool case_sensitive,
+ t_mem *array, int len, t_addr *addr);
+
+
+ virtual t_addr lowest_valid_address(void) { return(start_address); }
+ virtual t_addr highest_valid_address(void) { return(start_address+size-1); }
+
+
+ virtual t_mem read(t_addr addr)=0;
+ virtual t_mem read(t_addr addr, enum hw_cath skip)=0;
+ virtual t_mem get(t_addr addr)=0;
+ virtual t_mem write(t_addr addr, t_mem val)=0;
+ virtual void set(t_addr addr, t_mem val)=0;
+ virtual void set_bit1(t_addr addr, t_mem bits)=0;
+ virtual void set_bit0(t_addr addr, t_mem bits)=0;
+};
+
+
+/*
+ * Operators for memory cells
+ */
+
+class cl_memory_operator: public cl_base
+{
+protected: