X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=sim%2Fucsim%2Fsim.src%2Fuccl.h;h=d26af2076a3aa65f8227ddb15bb4003f552c1617;hb=3b43f23c5dbf36898e8d316569e1ec3b6193c4c5;hp=32ce9fd7140a3450d2f7e21c20b5936cd0e2cc37;hpb=8c8f34ff4281a55d2f535335c02999246e9e12f2;p=fw%2Fsdcc diff --git a/sim/ucsim/sim.src/uccl.h b/sim/ucsim/sim.src/uccl.h index 32ce9fd7..d26af207 100644 --- a/sim/ucsim/sim.src/uccl.h +++ b/sim/ucsim/sim.src/uccl.h @@ -36,6 +36,7 @@ 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 */ @@ -50,7 +51,7 @@ 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); virtual ~cl_ticker(void); @@ -61,6 +62,16 @@ public: }; +/* 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 @@ -69,7 +80,8 @@ public: int type; // CPU family int technology; // CMOS, HMOS int state; // GO, IDLE, PD - class cl_list *options; + //class cl_list *options; + class cl_xtal_option *xtal_option; t_addr PC, instPC; // Program Counter bool inst_exec; // Instruction is executed @@ -84,12 +96,18 @@ public: 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_list *stack_ops; // Track stack operations class cl_list *errors; // Errors of instruction execution class cl_list *events; // Events happened during inst exec @@ -105,22 +123,23 @@ public: 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(char *id, t_addr addr); + virtual t_mem get_mem(char *id, t_addr addr); + virtual void write_mem(char *id, t_addr addr, t_mem val); + virtual void set_mem(char *id, t_addr addr, t_mem val); + virtual class cl_address_space *address_space(char *id); + virtual class cl_memory *memory(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,7 +191,8 @@ 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, + 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); @@ -189,17 +207,25 @@ public: 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, + 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 *c); +}; + +class cl_uc_error_registry: public cl_error_registry +{ +public: + cl_uc_error_registry(void); +}; + #endif + /* End of uccl.h */