⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 uc.cc

📁 Small Device C Compiler 面向Inter8051
💻 CC
📖 第 1 页 / 共 3 页
字号:
      else	sym_name= 0;    }  if (!sym_name)    {      sym_name= (char *)malloc(16);      sprintf(sym_name, mem?(mem->addr_format):"0x%06x", mem_addr);    }  sym_name= (char *)realloc(sym_name, strlen(sym_name)+2);  strcat(sym_name, ".");  i= 0;  while (bit_mask > 1)    {      bit_mask>>=1;      i++;    }  char bitnumstr[10];  sprintf(bitnumstr, "%1d", i);  strcat(sym_name, bitnumstr);  return(sym_name);}/* * Messages to broadcast */voidcl_uc::mem_cell_changed(class cl_mem *mem, t_addr addr){  if (hws)    hws->mem_cell_changed(mem, addr);  else    printf("JAJ uc\n");//FIXME  if (mems &&      mems->count)    {      int i;      for (i= 0; i < mems->count; i++)	{	}    }}/* * Error handling */voidcl_uc::error(class cl_error *error){  errors->add(error);  if ((error->inst= inst_exec))    error->PC= instPC;}voidcl_uc::check_errors(void){  int i;  class cl_commander *c= sim->app->get_commander();  if (c)    {      for (i= 0; i < errors->count; i++)	{	  class cl_error *error= (class cl_error *)(errors->at(i));	  error->print(c);	  if (error->inst)	    {	      class cl_console *con;	      con= c->actual_console;	      if (!con)		con= c->frozen_console;	      if (con)		print_disass(error->PC, con);	    }	}      errors->free_all();    }  else    fprintf(stderr, "no actual console, %d errors\n", errors->count);}/* * Converting bit address into real memory */class cl_mem *cl_uc::bit2mem(t_addr bitaddr, t_addr *memaddr, t_mem *bitmask){  if (memaddr)    *memaddr= bitaddr;  if (bitmask)    *bitmask= 1 << (bitaddr & 0x7);  return(0); // abstract...}/* * Execution */intcl_uc::tick_hw(int cycles){  class cl_hw *hw;  int i;//, cpc= clock_per_cycle();  // tick hws  for (i= 0; i < hws->count; i++)    {      hw= (class cl_hw *)(hws->at(i));      if (hw->flags & HWF_INSIDE)	hw->tick(cycles);    }  do_extra_hw(cycles);  return(0);}voidcl_uc::do_extra_hw(int cycles){}intcl_uc::tick(int cycles){  //class cl_hw *hw;  int i, cpc= clock_per_cycle();  // increase time  ticks->tick(cycles * cpc);  class it_level *il= (class it_level *)(it_levels->top());  if (il->level >= 0)    isr_ticks->tick(cycles * cpc);  if (state == stIDLE)    idle_ticks->tick(cycles * cpc);  for (i= 0; i < counters->count; i++)    {      class cl_ticker *t= (class cl_ticker *)(counters->at(i));      if (t)	{	  if ((t->options&TICK_INISR) ||	      il->level < 0)	    t->tick(cycles * cpc);	}    }  // tick for hardwares  inst_ticks+= cycles;  return(0);}class cl_ticker *cl_uc::get_counter(int nr){  if (nr >= counters->count)    return(0);  return((class cl_ticker *)(counters->at(nr)));}class cl_ticker *cl_uc::get_counter(char *nam){  int i;  if (!nam)    return(0);  for (i= 0; i < counters->count; i++)    {      class cl_ticker *t= (class cl_ticker *)(counters->at(i));      if (t &&	  t->get_name() &&	  strcmp(t->get_name(), nam) == 0)	return(t);    }  return(0);}voidcl_uc::add_counter(class cl_ticker *ticker, int nr){  while (counters->count <= nr)    counters->add(0);  counters->put_at(nr, ticker);}voidcl_uc::add_counter(class cl_ticker *ticker, char */*nam*/){  int i;  if (counters->count < 1)    counters->add(0);  for (i= 1; i < counters->count; i++)    {      class cl_ticker *t= (class cl_ticker *)(counters->at(i));      if (!t)	{	  counters->put_at(i, ticker);	  return;	}    }  counters->add(ticker);}voidcl_uc::del_counter(int nr){  class cl_ticker *t;  if (nr >= counters->count)    return;  if ((t= (class cl_ticker *)(counters->at(0))) != 0)    delete t;  counters->put_at(nr, 0);}voidcl_uc::del_counter(char *nam){  int i;    if (!nam)    return;  for (i= 0; i < counters->count; i++)    {      class cl_ticker *t= (class cl_ticker *)(counters->at(i));      if (t &&	  t->get_name() &&	  strcmp(t->get_name(), nam) == 0)	{	  delete t;	  counters->put_at(i, 0);	  return;	}    }}/* * Fetch without checking for breakpoint hit */t_memcl_uc::fetch(void){  ulong code;  code= read_mem(MEM_ROM, PC);  PC++;  if (PC >= get_mem_size(MEM_ROM))    PC= 0;  return(code);}/* * Fetch but checking for breakpoint hit first, returns TRUE if * a breakpoint is hit */boolcl_uc::fetch(t_mem *code){  class cl_brk *brk;  int idx;  if (!code)    return(0);  if (sim->state & SIM_GO)    {      if (mem(MEM_ROM)->get_cell_flag(PC, CELL_FETCH_BRK) &&	  (brk= fbrk->get_bp(PC, &idx)) &&	  (brk->do_hit()))	{	  if (brk->perm == brkDYNAMIC)	    fbrk->del_bp(PC);	  return(1);	}    }  *code= fetch();  return(0);}intcl_uc::do_inst(int step){  int res= resGO;  if (step < 0)    step= 1;  while (step-- &&	 res == resGO)    {      pre_inst();      res= exec_inst();      post_inst();    }  if (res != resGO)    sim->stop(res);  return(res);}voidcl_uc::pre_inst(void){  inst_exec= DD_TRUE;  inst_ticks= 0;  events->disconn_all();}intcl_uc::exec_inst(void){  instPC= PC;  return(resGO);}voidcl_uc::post_inst(void){  tick_hw(inst_ticks);  if (errors->count)    check_errors();  if (events->count)    check_events();  inst_exec= DD_FALSE;}/* * Time related functions */doublecl_uc::get_rtime(void){  /*  double d;  d= (double)ticks/xtal;  return(d);*/  return(ticks->get_rtime(xtal));}intcl_uc::clock_per_cycle(void){  return(1);}/* * Stack tracking system */voidcl_uc::st_push(class cl_stack_op *op){  st_ops->push(op);}voidcl_uc::st_call(class cl_stack_op *op){  st_ops->push(op);}intcl_uc::st_pop(class cl_stack_op *op){  class cl_stack_op *sop= (class cl_stack_op *)(st_ops->pop());  if (!sop)    return(1);  return(0);}intcl_uc::st_ret(class cl_stack_op *op){  class cl_stack_op *sop= (class cl_stack_op *)(st_ops->pop());  if (!sop)    return(1);  return(0);}/* * Breakpoint handling */class cl_fetch_brk *cl_uc::fbrk_at(t_addr addr){  int idx;    return((class cl_fetch_brk *)(fbrk->get_bp(addr, &idx)));}class cl_ev_brk *cl_uc::ebrk_at(t_addr addr, char *id){  int i;  class cl_ev_brk *eb;  for (i= 0; i < ebrk->count; i++)    {      eb= (class cl_ev_brk *)(ebrk->at(i));      if (eb->addr == addr &&	  !strcmp(eb->id, id))	return(eb);    }  return(0);}/*voidcl_uc::rm_fbrk(long addr){  fbrk->del_bp(addr);}*//* Get a breakpoint specified by its number */class cl_brk *cl_uc::brk_by_nr(int nr){  class cl_brk *bp;  if ((bp= fbrk->get_bp(nr)))    return(bp);  if ((bp= ebrk->get_bp(nr)))    return(bp);  return(0);}/* Get a breakpoint from the specified collection by its number */class cl_brk *cl_uc::brk_by_nr(class brk_coll *bpcoll, int nr){  class cl_brk *bp;  if ((bp= bpcoll->get_bp(nr)))    return(bp);  return(0);}/* Remove an event breakpoint specified by its address and id */voidcl_uc::rm_ebrk(t_addr addr, char *id){  int i;  class cl_ev_brk *eb;  for (i= 0; i < ebrk->count; i++)    {      eb= (class cl_ev_brk *)(ebrk->at(i));      if (eb->addr == addr &&	  !strcmp(eb->id, id))	ebrk->del_bp(i, 0);    }}/* Remove a breakpoint specified by its number */boolcl_uc::rm_brk(int nr){  class cl_brk *bp;  if ((bp= brk_by_nr(fbrk, nr)))    {      fbrk->del_bp(bp->addr);      return(DD_TRUE);    }  else if ((bp= brk_by_nr(ebrk, nr)))    {      ebrk->del_bp(ebrk->index_of(bp), 0);      return(DD_TRUE);    }  return(DD_FALSE);}voidcl_uc::put_breaks(void){}/* Remove all fetch and event breakpoints */voidcl_uc::remove_all_breaks(void){  while (fbrk->count)    {      class cl_brk *brk= (class cl_brk *)(fbrk->at(0));      fbrk->del_bp(brk->addr);    }  while (ebrk->count)    ebrk->del_bp(ebrk->count-1, 0);}intcl_uc::make_new_brknr(void){  if (brk_counter == 0)    return(brk_counter= 1);  if (fbrk->count == 0 &&      ebrk->count == 0)    return(brk_counter= 1);  return(++brk_counter);}class cl_ev_brk *cl_uc::mk_ebrk(enum brk_perm perm, class cl_mem *mem,	       char op, t_addr addr, int hit){  class cl_ev_brk *b;  op= toupper(op);  b= new cl_ev_brk(mem, make_new_brknr(), addr, perm, hit, op);  b->init();  return(b);}voidcl_uc::check_events(void){  sim->stop(resBREAKPOINT);}/* End of uc.cc */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -