2 * Simulator of microcontrollers (sim.src/memcl.h)
4 * Copyright (C) 1999,99 Drotos Daniel, Talker Bt.
6 * To contact author send email to drdani@mazsola.iit.uni-miskolc.hu
10 /* This file is part of microcontroller simulator: ucsim.
12 UCSIM is free software; you can redistribute it and/or modify
13 it under the terms of the GNU General Public License as published by
14 the Free Software Foundation; either version 2 of the License, or
15 (at your option) any later version.
17 UCSIM is distributed in the hope that it will be useful,
18 but WITHOUT ANY WARRANTY; without even the implied warranty of
19 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 GNU General Public License for more details.
22 You should have received a copy of the GNU General Public License
23 along with UCSIM; see the file COPYING. If not, write to the Free
24 Software Foundation, 59 Temple Place - Suite 330, Boston, MA
28 #ifndef SIM_MEMCL_HEADER
29 #define SIM_MEMCL_HEADER
42 class cl_event_handler;
46 #define CELL_NORMAL 0x00 /* Nothing special */
47 #define CELL_HW_READ 0x01 /* Hw handles read */
48 #define CELL_HW_WRITE 0x02 /* Hw catches write */
49 #define CELL_INST 0x04 /* Marked as instruction */
50 #define CELL_FETCH_BRK 0x08 /* Fetch breakpoint */
51 #define CELL_READ_BRK 0x10 /* Read event breakpoint */
52 #define CELL_WRITE_BRK 0x20 /* Write event breakpoint */
54 #define CELL_GENERAL (CELL_NORMAL|CELL_INST|CELL_FETCH_BRK)
57 class cl_cell: public cl_base
61 unsigned long nuof_writes, nuof_reads;
66 virtual TYPE_UBYTE get_type(void)= 0;
67 virtual void set_type(TYPE_UBYTE what)= 0;
68 virtual t_mem get_mask(void)= 0;
70 virtual t_mem read(void)=0 ;
71 virtual t_mem read(enum hw_cath /*skip*/)=0;
72 virtual t_mem get(void)=0;
73 virtual t_mem write(t_mem val)=0;
74 virtual t_mem set(t_mem val)=0;
75 virtual t_mem add(long what)=0;
76 virtual t_mem wadd(long what)=0;
78 virtual void set_bit1(t_mem bits)=0;
79 virtual void set_bit0(t_mem bits)=0;
81 virtual class cl_cell *add_hw(class cl_hw */*hw*/, int */*ith*/)=0;
82 virtual class cl_hw *get_hw(int ith)=0;
83 virtual class cl_event_handler *get_event_handler(void)=0;
86 class cl_normal_cell: public cl_cell
90 TYPE_UBYTE type; // See CELL_XXXX
96 cl_normal_cell(uchar awidth);
97 //virtual void destroy(void) {}
99 virtual TYPE_UBYTE get_type(void) { return(type); }
100 virtual void set_type(TYPE_UBYTE what) { type= what; }
101 virtual t_mem get_mask(void) { return(mask); }
103 virtual t_mem read(void) {
109 virtual t_mem read(enum hw_cath /*skip*/) { return(data); }
110 virtual t_mem get(void) { return(data); }
111 virtual t_mem write(t_mem val) {
118 virtual t_mem set(t_mem val) { return(data= val & mask); }
119 virtual t_mem add(long what);
120 virtual t_mem wadd(long what);
122 virtual void set_bit1(t_mem bits);
123 virtual void set_bit0(t_mem bits);
125 virtual class cl_cell *add_hw(class cl_hw */*hw*/, int */*ith*/)
127 virtual class cl_hw *get_hw(int ith) { return(0); }
128 //virtual class cl_brk *get_brk(void) { return(0); }
129 virtual class cl_event_handler *get_event_handler(void) { return(0); }
133 /* Memory location handled specially by a hw element */
135 /*class cl_memloc: public cl_base
142 cl_memloc(t_addr addr);
143 virtual ~cl_memloc(void);
145 virtual ulong read(class cl_mem *mem);
146 virtual void write(class cl_mem *mem, t_addr addr, t_mem *val);
149 /*class cl_memloc_coll: public cl_sorted_list
152 cl_memloc_coll(void);
154 virtual void *key_of(void *item);
155 virtual int compare(void *key1, void *key2);
157 class cl_memloc *get_loc(t_addr address);
162 class cl_mem: public cl_guiobj
167 char *addr_format, *data_format;
170 int width; // in bits
175 //class cl_memloc_coll *read_locs, *write_locs;
177 t_addr dump_finished;
180 cl_mem(enum mem_class atype, char *aclass_name, t_addr asize, int awidth,
182 virtual ~cl_mem(void);
183 virtual int init(void);
184 virtual char *id_string(void);
185 virtual int get_cell_flag(t_addr /*addr*/) { return(CELL_NORMAL); }
186 virtual bool get_cell_flag(t_addr /*addr*/, int /*flag*/)
187 { return(DD_FALSE); }
188 virtual void set_cell_flag(t_addr addr, bool set_to, int flag) {}
190 virtual t_mem read(t_addr addr);
191 virtual t_mem read(t_addr addr, enum hw_cath /*skip*/) {return(read(addr));}
192 virtual t_mem get(t_addr addr);
193 virtual t_mem write(t_addr addr, t_mem val);
194 virtual void set(t_addr addr, t_mem val);
195 virtual void set_bit1(t_addr addr, t_mem bits);
196 virtual void set_bit0(t_addr addr, t_mem bits);
197 virtual void write_bit1(t_addr addr, t_mem bits) { set_bit1(addr, bits); }
198 virtual void write_bit0(t_addr addr, t_mem bits) { set_bit0(addr, bits); }
199 virtual t_mem add(t_addr addr, long what);
200 virtual t_mem wadd(t_addr addr, long what) { return(add(addr, what)); }
201 virtual t_addr dump(t_addr start, t_addr stop, int bpl,
202 class cl_console *con);
203 virtual t_addr dump(class cl_console *con);
204 virtual bool search_next(bool case_sensitive,
205 t_mem *array, int len, t_addr *addr);
207 virtual class cl_cell *get_cell(t_addr addr) {return(0);}
208 virtual class cl_cell *register_hw(t_addr addr, class cl_hw *hw, int *ith,
211 virtual void set_brk(t_addr /*addr*/, class cl_brk */*brk*/) {}
212 virtual void del_brk(t_addr addr, class cl_brk *brk) {}
214 virtual unsigned long get_nuof_reads(void) {return(0);}
215 virtual unsigned long get_nuof_writes(void) {return(0);}
216 virtual void set_nuof_reads(unsigned long value) {}
217 virtual void set_nuof_writes(unsigned long value) {}
223 /*class cl_bitmap: public cl_base
229 cl_bitmap(t_addr asize);
230 virtual ~cl_bitmap(void);
231 virtual void set(t_addr pos);
232 virtual void clear(t_addr pos);
233 virtual bool get(t_addr pos);
234 virtual bool empty(void);
237 class cl_rom: public cl_mem
240 class cl_bitmap *bp_map;
241 class cl_bitmap *inst_map;
243 cl_rom(t_addr asize, int awidth, class cl_uc *auc);
244 virtual ~cl_rom(void);
248 * New type of memory simulation
251 class cl_registered_cell: public cl_normal_cell
254 //class cl_list *hws;
255 class cl_hw **hardwares;
258 cl_registered_cell(uchar awidth);
259 virtual ~cl_registered_cell(void);
260 //virtual void destroy(void);
262 virtual t_mem read(void);
263 virtual t_mem read(enum hw_cath skip);
264 virtual t_mem write(t_mem val);
266 virtual class cl_cell *add_hw(class cl_hw *hw, int *ith);
267 virtual class cl_hw *get_hw(int ith);
270 class cl_event_handler: public cl_base
273 class cl_list *read_bps, *write_bps;
276 cl_event_handler(class cl_uc *auc);
277 virtual ~cl_event_handler(void);
279 virtual void write(void);
280 virtual void read(void);
282 virtual int add_bp(class cl_brk *bp);
283 virtual int copy_from(class cl_event_handler *eh);
284 virtual bool del_bp(class cl_brk *bp);
287 class cl_event_cell: public cl_normal_cell
290 class cl_event_handler *eh;
292 cl_event_cell(uchar awidth, class cl_uc *auc);
293 virtual ~cl_event_cell(void);
295 virtual t_mem read(void);
296 virtual t_mem write(t_mem val);
297 //virtual void event(void);
299 //virtual class cl_brk *get_brk(void) { return(brk); }
300 virtual class cl_event_handler *get_event_handler(void) { return(eh); }
303 class cl_ev_reg_cell: public cl_registered_cell
306 class cl_event_handler *eh;
308 cl_ev_reg_cell(uchar awidth, class cl_uc *auc);
309 virtual ~cl_ev_reg_cell(void);
311 virtual t_mem read(void);
312 virtual t_mem write(t_mem val);
313 //virtual void event(void);
315 //virtual class cl_brk *get_brk(void) { return(brk); }
316 virtual class cl_event_handler *get_event_handler(void) { return(eh); }
319 class cl_mapped_cell: public cl_cell
322 class cl_cell *real_cell;
324 cl_mapped_cell(class cl_cell *realcell);
325 virtual ~cl_mapped_cell(void);
327 virtual t_mem read(void);
328 virtual t_mem read(enum hw_cath skip);
329 virtual t_mem get(void);
330 virtual t_mem write(t_mem val);
331 virtual t_mem set(t_mem val);
332 virtual t_mem add(long what);
333 virtual t_mem wadd(long what);
335 virtual void set_bit1(t_mem bits);
336 virtual void set_bit0(t_mem bits);
338 virtual class cl_cell *add_hw(class cl_hw *hw, int *ith);
339 virtual class cl_hw *get_hw(int ith);
340 virtual class cl_event_handler *get_event_handler(void);
343 class cl_m: public cl_mem
346 class cl_cell **array;
347 class cl_cell *dummy;
354 cl_m(enum mem_class atype, char *aclass_name, t_addr asize, int awidth,
356 cl_m(t_addr asize, int awidth);
358 virtual void err_inv_addr(t_addr addr);
359 virtual int get_cell_flag(t_addr addr);
360 virtual bool get_cell_flag(t_addr addr, int flag);
361 virtual void set_cell_flag(t_addr addr, bool set_to, int flag);
363 virtual t_mem read(t_addr addr);
364 virtual t_mem read(t_addr addr, enum hw_cath skip);
365 virtual t_mem get(t_addr addr);
366 virtual t_mem write(t_addr addr, t_mem val);
367 virtual void set(t_addr addr, t_mem val);
368 virtual class cl_cell *get_cell(t_addr addr);
370 virtual void set_bit1(t_addr addr, t_mem bits);
371 virtual void set_bit0(t_addr addr, t_mem bits);
372 virtual void write_bit1(t_addr addr, t_mem bits);
373 virtual void write_bit0(t_addr addr, t_mem bits);
374 virtual t_mem add(t_addr addr, long what);
375 virtual t_mem wadd(t_addr addr, long what);
377 virtual class cl_cell *register_hw(t_addr addr, class cl_hw *hw, int *ith,
379 virtual void set_brk(t_addr addr, class cl_brk *brk);
380 virtual void del_brk(t_addr addr, class cl_brk *brk);
383 virtual unsigned long get_nuof_reads(void);
384 virtual unsigned long get_nuof_writes(void);
385 virtual void set_nuof_reads(unsigned long value);
386 virtual void set_nuof_writes(unsigned long value);
394 * Errors in memory handling
397 class cl_err_inv_addr: public cl_error
403 cl_err_inv_addr(class cl_mem *amem, t_addr aaddr);
404 virtual void print(class cl_commander *c);