X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=sim%2Fucsim%2Fsim.src%2Fuccl.h;h=54f4f605f5ca79f9b01eac905e90b41123bddf05;hb=34d14506fd0c12ee5434fec0f9dec27753e1aab5;hp=efa9045afaacbd5153026fac40e721f46e8a95f3;hpb=f27cbdc6513b26748661452e50ed3af99fac16a2;p=fw%2Fsdcc diff --git a/sim/ucsim/sim.src/uccl.h b/sim/ucsim/sim.src/uccl.h index efa9045a..54f4f605 100644 --- a/sim/ucsim/sim.src/uccl.h +++ b/sim/ucsim/sim.src/uccl.h @@ -36,13 +36,14 @@ 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 */ -#define TICK_RUN 0x01 -#define TICK_INISR 0x02 -#define TICK_IDLE 0x03 +#define TICK_RUN 0x01 +#define TICK_INISR 0x02 +#define TICK_IDLE 0x03 class cl_ticker: public cl_base { @@ -50,72 +51,95 @@ 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); - ~cl_ticker(void); + cl_ticker(int adir, int in_isr, const char *aname); + virtual ~cl_ticker(void); virtual int tick(int nr); virtual double get_rtime(double xtal); - virtual void dump(int nr, double xtal, class cl_console *con); + virtual void dump(int nr, double xtal, class cl_console_base *con); }; +/* 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 { public: - int type; // CPU family - int technology; // CMOS, HMOS - int state; // GO, IDLE, PD - class cl_list *options; - - t_addr PC; // Program Counter - class cl_ticker *ticks; // Nr of XTAL clocks - class cl_ticker *isr_ticks; // Time in ISRs - class cl_ticker *idle_ticks; // Time in idle mode - class cl_list *counters; // User definable timers (tickers) - double xtal; // Clock speed - - int brk_counter; // Number of breakpoints - class brk_coll *fbrk; // Collection of FETCH break-points - class brk_coll *ebrk; // Collection of EVENT breakpoints + int type; // CPU family + int technology; // CMOS, HMOS + int state; // GO, IDLE, PD + //class cl_list *options; + class cl_xtal_option *xtal_option; + + t_addr PC, instPC; // Program Counter + bool inst_exec; // Instruction is executed + class cl_ticker *ticks; // Nr of XTAL clocks + class cl_ticker *isr_ticks; // Time in ISRs + class cl_ticker *idle_ticks; // Time in idle mode + class cl_list *counters; // User definable timers (tickers) + int inst_ticks; // ticks of an instruction + double xtal; // Clock speed + + int brk_counter; // Number of breakpoints + 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 *hws; + //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 *stack_ops; // Track stack operations - class cl_list *it_sources; // Sources of interrupts - class cl_list *it_levels; // Follow interrupt services - class cl_list *st_ops; // Track stack operations + class cl_list *errors; // Errors of instruction execution + class cl_list *events; // Events happened during inst exec t_addr sp_max; t_addr sp_avg; public: cl_uc(class cl_sim *asim); - ~cl_uc(void); + virtual ~cl_uc(void); virtual int init(void); - virtual char *id_string(void); + virtual const char *id_string(void); 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 ulong read_mem(enum mem_class type, t_addr addr); - virtual ulong 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 TYPE_UBYTE *MEM(enum mem_class type); + virtual t_mem read_mem(const char *id, t_addr addr); + virtual t_mem get_mem(const char *id, t_addr addr); + virtual void write_mem(const char *id, t_addr addr, t_mem val); + virtual void set_mem(const char *id, t_addr addr, t_mem val); + virtual class cl_address_space *address_space(const char *id); + virtual class cl_memory *memory(const 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) {} @@ -125,21 +149,21 @@ public: virtual bool there_is_inst(void); // manipulating hw elements - virtual void register_hw_read(enum mem_class, t_addr addr, class cl_hw *hw); - virtual void register_hw_write(enum mem_class, t_addr addr, class cl_hw *hw); virtual class cl_hw *get_hw(enum hw_cath cath, int *idx); virtual class cl_hw *get_hw(char *id_string, int *idx); virtual class cl_hw *get_hw(enum hw_cath cath, int hwid, int *idx); virtual class cl_hw *get_hw(char *id_string, int hwid, int *idx); // "virtual" timers + virtual int tick_hw(int cycles); + 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); @@ -154,57 +178,90 @@ 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); virtual class cl_ev_brk *ebrk_at(t_addr addr, char *id); - //virtual void rm_fbrk(long addr); virtual class cl_brk *brk_by_nr(int nr); virtual class cl_brk *brk_by_nr(class brk_coll *bpcoll, int nr); virtual void rm_ebrk(t_addr addr, char *id); - virtual void rm_brk(int nr); + virtual bool rm_brk(int nr); 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, - char op, t_addr addr, int hit); + 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); // disassembling and symbol recognition - virtual char *disass(t_addr addr, char *sep); + virtual char *disass(t_addr addr, const char *sep); virtual struct dis_entry *dis_tbl(void); virtual struct name_entry *sfr_tbl(void); virtual struct name_entry *bit_tbl(void); - virtual void print_disass(t_addr addr, class cl_console *con); - virtual void print_regs(class cl_console *con); - virtual int inst_length(t_mem code); + virtual void print_disass(t_addr addr, class cl_console_base *con); + virtual void print_regs(class cl_console_base *con); + virtual int inst_length(t_addr addr); + 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 extract_bit_address(t_addr bit_address, - class cl_mem **mem, - t_addr *mem_addr, - t_mem *bit_mask) {return(DD_FALSE);} + 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, - t_addr mem_addr, - t_mem bit_mask); - + class cl_memory *mem, + t_addr mem_addr, + t_mem bit_mask); + + /* Converting abstract address spaces into real ones */ + 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 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); + virtual void check_errors(void); + /* Following fields and virtual methods defined in uc51 I don't have energy to redesign them:-( */ public: - uchar port_pins[4]; // Port pins -public: - virtual void proc_write(uchar *addr) {} - virtual void set_p_flag(void) {} - virtual uchar *get_bit(uchar bitaddr) { return(0); } virtual void eram2xram(void) {} // Dirty hack for 51R virtual void xram2eram(void) {} }; +/* + * 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_base *c); +}; + +class cl_uc_error_registry: public cl_error_registry +{ +public: + cl_uc_error_registry(void); +}; + #endif + /* End of uccl.h */