X-Git-Url: https://git.gag.com/?a=blobdiff_plain;ds=sidebyside;f=sim%2Fucsim%2Fsim.src%2Fhwcl.h;h=70917db6b98061f4ecf177731d754a2ab298721c;hb=f7003552f3b3cbe77914bedaac032e3356e0c0b2;hp=daf35b63ae5305adf46f6e7148663afa463fd2b5;hpb=6ba6105dc5975c3b0cc0d1ce53f47a1ddf4be9cf;p=fw%2Fsdcc diff --git a/sim/ucsim/sim.src/hwcl.h b/sim/ucsim/sim.src/hwcl.h index daf35b63..70917db6 100644 --- a/sim/ucsim/sim.src/hwcl.h +++ b/sim/ucsim/sim.src/hwcl.h @@ -32,11 +32,61 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA #include "stypes.h" #include "pobjcl.h" -#include "uccl.h" #include "guiobjcl.h" +// cmd.src #include "newcmdcl.h" +// local +#include "memcl.h" +#include "uccl.h" + + +enum what_to_do_on_cell_change { + wtd_none = 0x01, + wtd_write = 0x02, + wtd_restore = 0x04, + wtd_restore_write = 0x08 +}; + +#define WTD_WRITE (wtd_write|wtd_restore_write) +#define WTD_RESTORE (wtd_restore|wtd_restore_write) + +class cl_hw; // forward + +class cl_watched_cell: public cl_base +{ +protected: + class cl_address_space *mem; + t_addr addr; + class cl_memory_cell *cell; + class cl_memory_cell **store; +public: + enum what_to_do_on_cell_change wtd; +public: + cl_watched_cell(class cl_address_space *amem, t_addr aaddr, + class cl_memory_cell **astore, + enum what_to_do_on_cell_change awtd); + + virtual void mem_cell_changed(class cl_address_space *amem, t_addr aaddr, + class cl_hw *hw); + virtual void address_space_added(class cl_address_space *amem, + class cl_hw *hw); +}; + +class cl_used_cell: public cl_watched_cell +{ +public: + cl_used_cell(class cl_address_space *amem, t_addr aaddr, + class cl_memory_cell **astore, + enum what_to_do_on_cell_change awtd): + cl_watched_cell(amem, aaddr, astore, awtd) {} + + virtual void mem_cell_changed(class cl_address_space *amem, t_addr aaddr, + class cl_hw *hw); + virtual void address_space_added(class cl_address_space *amem, + class cl_hw *hw); +}; class cl_hw: public cl_guiobj { @@ -46,25 +96,68 @@ public: enum hw_cath cathegory; int id; char *id_string; - +protected: + class cl_list *partners; + class cl_list *watched_cells; public: - cl_hw(class cl_uc *auc, enum hw_cath cath, int aid, char *aid_string); - ~cl_hw(void); - - virtual void adding(class cl_hw *new_hw) {} - virtual void added(class cl_hw *new_hw) {} - virtual t_mem read(class cl_mem *mem, t_addr addr); - virtual void write(class cl_mem *mem, t_addr addr, t_mem *val); + cl_hw(class cl_uc *auc, enum hw_cath cath, int aid, const char *aid_string); + virtual ~cl_hw(void); + + virtual void new_hw_adding(class cl_hw *new_hw); + virtual void new_hw_added(class cl_hw *new_hw); + virtual void added_to_uc(void) {} + virtual class cl_hw *make_partner(enum hw_cath cath, int id); + + virtual t_mem read(class cl_memory_cell *cell) { return(cell->get()); } + virtual void write(class cl_memory_cell * /*cell*/, t_mem * /*val*/) {} + + virtual void set_cmd(class cl_cmdline *cmdline, class cl_console_base *con); + virtual class cl_memory_cell *register_cell(class cl_address_space *mem, + t_addr addr, + class cl_memory_cell **store, + enum what_to_do_on_cell_change + awtd); + virtual class cl_memory_cell *use_cell(class cl_address_space *mem, + t_addr addr, + class cl_memory_cell **store, + enum what_to_do_on_cell_change awtd); + virtual void mem_cell_changed(class cl_address_space *mem, t_addr addr); + virtual void address_space_added(class cl_address_space *as); virtual int tick(int cycles); - virtual void print_info(class cl_console *con); + virtual void reset(void) {} + virtual void happen(class cl_hw * /*where*/, enum hw_event /*he*/, + void * /*params*/) {} + virtual void inform_partners(enum hw_event he, void *params); + + virtual void print_info(class cl_console_base *con); }; class cl_hws: public cl_list { public: - cl_hws(void): cl_list(2, 2) {} + cl_hws(void): cl_list(2, 2, "hws") {} virtual t_index add(void *item); + virtual void mem_cell_changed(class cl_address_space *mem, t_addr addr); + virtual void address_space_added(class cl_address_space *as); +}; + + +class cl_partner_hw: public cl_base +{ +protected: + class cl_uc *uc; + enum hw_cath cathegory; + int id; + class cl_hw *partner; +public: + cl_partner_hw(class cl_uc *auc, enum hw_cath cath, int aid); + + virtual class cl_hw *get_partner(void); + virtual void refresh(void); + virtual void refresh(class cl_hw *new_hw); + + virtual void happen(class cl_hw *where, enum hw_event he, void *params); };