+ cl_event_break_operator(class cl_memory_cell *acell, t_addr addr,
+ t_mem *data_place, t_mem the_mask,
+ class cl_uc *auc, class cl_brk *the_bp):
+ cl_memory_operator(acell, addr, data_place, the_mask)
+ {
+ uc= auc;
+ bp= the_bp;
+ }
+
+ virtual bool match(class cl_brk *brk) { return(bp == brk); }
+};
+
+class cl_write_operator: public cl_event_break_operator
+{
+public:
+ cl_write_operator(class cl_memory_cell *acell, t_addr addr,
+ t_mem *data_place, t_mem the_mask,
+ class cl_uc *auc, class cl_brk *the_bp);
+
+ virtual t_mem write(t_mem val);
+};
+
+class cl_read_operator: public cl_event_break_operator
+{
+public:
+ cl_read_operator(class cl_memory_cell *acell, t_addr addr,
+ t_mem *data_place, t_mem the_mask,
+ class cl_uc *auc, class cl_brk *the_bp);
+
+ virtual t_mem read(void);
+};
+
+
+/*
+ * version 3 of cell
+ */
+
+class cl_memory_cell: public cl_base
+{
+#ifdef STATISTIC
+public:
+ unsigned long nuof_writes, nuof_reads;
+#endif
+protected:
+ t_mem *data;
+ t_mem mask;
+ uchar width;
+ TYPE_UBYTE flags;
+ class cl_memory_operator *operators;
+public:
+ cl_memory_cell(void);
+ virtual ~cl_memory_cell(void);
+ virtual int init(void);
+
+ virtual t_mem *get_data(void) { return(data); }
+ virtual t_mem get_mask(void) { return(mask); }
+ virtual TYPE_UBYTE get_flags(void);
+ virtual bool get_flag(enum cell_flag flag);
+ virtual void set_flags(TYPE_UBYTE what);
+ virtual void set_flag(enum cell_flag flag, bool val);
+
+ virtual void un_decode(void);
+ virtual void decode(class cl_memory_chip *chip, t_addr addr);
+
+ virtual t_mem read(void);
+ virtual t_mem read(enum hw_cath skip);
+ virtual t_mem get(void);
+ virtual t_mem write(t_mem val);
+ virtual t_mem set(t_mem val);
+
+ virtual t_mem add(long what);
+ virtual t_mem wadd(long what);
+
+ virtual void set_bit1(t_mem bits);
+ virtual void set_bit0(t_mem bits);
+
+ virtual void append_operator(class cl_memory_operator *op);
+ virtual void prepend_operator(class cl_memory_operator *op);
+ virtual void del_operator(class cl_brk *brk);
+
+ virtual class cl_memory_cell *add_hw(class cl_hw *hw, int *ith, t_addr addr);
+ //virtual class cl_hw *get_hw(int ith);
+ virtual class cl_event_handler *get_event_handler(void);
+};
+
+class cl_dummy_cell: public cl_memory_cell
+{
+public:
+ cl_dummy_cell(void): cl_memory_cell() {}
+
+ virtual t_mem write(t_mem val);
+ virtual t_mem set(t_mem val);
+};
+
+
+/*
+ * Address space
+ */
+
+class cl_memory_chip;
+
+class cl_address_space: public cl_memory
+{
+protected:
+ class cl_memory_cell **cells, *dummy;
+public:
+ class cl_decoder_list *decoders;
+public:
+ cl_address_space(char *id, t_addr astart, t_addr asize, int awidth);
+ virtual ~cl_address_space(void);
+
+ virtual bool is_address_space(void) { return(DD_TRUE); }
+
+ virtual t_mem read(t_addr addr);
+ virtual t_mem read(t_addr addr, enum hw_cath skip);
+ virtual t_mem get(t_addr addr);
+ virtual t_mem write(t_addr addr, t_mem val);
+ virtual void set(t_addr addr, t_mem val);
+ virtual t_mem wadd(t_addr addr, long what);
+ virtual void set_bit1(t_addr addr, t_mem bits);
+ virtual void set_bit0(t_addr addr, t_mem bits);
+
+ virtual class cl_address_decoder *get_decoder(t_addr addr);
+
+ virtual class cl_memory_cell *get_cell(t_addr addr);
+ virtual int get_cell_flag(t_addr addr);
+ virtual bool get_cell_flag(t_addr addr, enum cell_flag flag);
+ virtual void set_cell_flag(t_addr addr, bool set_to, enum cell_flag flag);
+
+ virtual bool decode_cell(t_addr addr,
+ class cl_memory_chip *chip, t_addr chipaddr);
+ virtual void undecode_cell(t_addr addr);
+ virtual void undecode_area(class cl_address_decoder *skip,
+ t_addr begin, t_addr end, class cl_console_base *con);
+
+ virtual class cl_memory_cell *register_hw(t_addr addr, class cl_hw *hw,
+ int *ith,
+ bool announce);
+
+ virtual void set_brk(t_addr addr, class cl_brk *brk);
+ virtual void del_brk(t_addr addr, class cl_brk *brk);
+
+#ifdef STATISTIC
+ virtual unsigned long get_nuof_reads(void) { return(0); }
+ virtual unsigned long get_nuof_writes(void) { return(0); }
+ virtual void set_nuof_reads(unsigned long value) {}
+ virtual void set_nuof_writes(unsigned long value) {}
+#endif
+};
+
+class cl_address_space_list: public cl_list
+{
+protected:
+ class cl_uc *uc;
+public:
+ cl_address_space_list(class cl_uc *the_uc);
+ virtual t_index add(class cl_address_space *mem);
+};
+
+
+/*
+ * Memory chip (storage)
+ */