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

📄 brk.cc

📁 Small Device C Compiler 面向Inter8051
💻 CC
字号:
/* * Simulator of microcontrollers (brk.cc) * * Copyright (C) 1999,99 Drotos Daniel, Talker Bt. *  * To contact author send email to drdani@mazsola.iit.uni-miskolc.hu * *//* This file is part of microcontroller simulator: ucsim.UCSIM is free software; you can redistribute it and/or modifyit under the terms of the GNU General Public License as published bythe Free Software Foundation; either version 2 of the License, or(at your option) any later version.UCSIM is distributed in the hope that it will be useful,but WITHOUT ANY WARRANTY; without even the implied warranty ofMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See theGNU General Public License for more details.You should have received a copy of the GNU General Public Licensealong with UCSIM; see the file COPYING.  If not, write to the FreeSoftware Foundation, 59 Temple Place - Suite 330, Boston, MA02111-1307, USA. *//*@1@*/#include "ddconfig.h"#include <stdio.h>#include <ctype.h>#include "pobjcl.h"#include "brkcl.h"/* * Base object of breakpoints */cl_brk::cl_brk(class cl_mem *imem, int inr, t_addr iaddr,	       enum brk_perm iperm, int ihit):  cl_base(){  mem  = imem;  nr   = inr;  addr = iaddr;  perm = iperm;  hit  = ihit;  cnt  = ihit;}cl_brk::~cl_brk(void){}voidcl_brk::activate(void){  if (mem)    mem->set_brk(addr, this);}voidcl_brk::inactivate(void){  if (mem)    mem->del_brk(addr, this);}boolcl_brk::do_hit(void){  cnt--;  if (cnt <= 0)    {      cnt= hit;      return(1);    }  return(0);}/* * FETCH type of breakpoint */cl_fetch_brk::cl_fetch_brk(class cl_mem *imem, int inr, t_addr iaddr,			   enum brk_perm iperm, int ihit):  cl_brk(imem, inr, iaddr, iperm, ihit){  code = 0;}enum brk_typecl_fetch_brk::type(void){  return(brkFETCH);}/* * Base of EVENT type of breakpoints */cl_ev_brk::cl_ev_brk(class cl_mem *imem, int inr, t_addr iaddr,		     enum brk_perm iperm, int ihit,		     enum brk_event ievent, const char *iid):  cl_brk(imem, inr, iaddr, iperm, ihit){  event= ievent;  id   = iid;  mem  = imem;}cl_ev_brk::cl_ev_brk(class cl_mem *imem, int inr, t_addr iaddr,		     enum brk_perm iperm, int ihit, char op):  cl_brk(imem, inr, iaddr, iperm, ihit){  mem  = imem;  if ((op= toupper(op)) == 'R')    {      event= brkREAD;      id= "read";    }  else if (op == 'W')    {      event= brkWRITE;      id= "write";    }  else    {      event= brkACCESS;      id= "access";    }}enum brk_typecl_ev_brk::type(void){  return(brkEVENT);}boolcl_ev_brk::match(struct event_rec *ev){  return(DD_FALSE);}/* * WRITE IRAM type of EVENT breakpoints *//*cl_wi_brk::cl_wi_brk(class cl_mem *imem, int inr, t_addr iaddr,		     enum brk_perm iperm, int ihit):  cl_ev_brk(imem, inr, iaddr, iperm, ihit, brkWIRAM, "wi"){}boolcl_wi_brk::match(struct event_rec *ev){  return(ev->wi == addr);}*//* * READ IRAM type of EVENT breakpoints *//*cl_ri_brk::cl_ri_brk(class cl_mem *imem, int inr, t_addr iaddr,		     enum brk_perm iperm, int ihit):  cl_ev_brk(imem, inr, iaddr, iperm, ihit, brkRIRAM, "ri"){}boolcl_ri_brk::match(struct event_rec *ev){  return(ev->ri == addr);}*//* * WRITE XRAM type of EVENT breakpoints *//*cl_wx_brk::cl_wx_brk(class cl_mem *imem, int inr, t_addr iaddr,		     enum brk_perm iperm, int ihit):  cl_ev_brk(imem, inr, iaddr, iperm, ihit, brkWXRAM, "wx"){}boolcl_wx_brk::match(struct event_rec *ev){  return(ev->wx == addr);}*//* * READ XRAM type of EVENT breakpoints *//*cl_rx_brk::cl_rx_brk(class cl_mem *imem, int inr, t_addr iaddr,		     enum brk_perm iperm, int ihit):  cl_ev_brk(imem, inr, iaddr, iperm, ihit, brkRXRAM, "rx"){}boolcl_rx_brk::match(struct event_rec *ev){  return(ev->rx == addr);}*//* * WRITE SFR type of EVENT breakpoints *//*cl_ws_brk::cl_ws_brk(class cl_mem *imem, int inr, t_addr iaddr,		     enum brk_perm iperm, int ihit):  cl_ev_brk(imem, inr, iaddr, iperm, ihit, brkWSFR, "ws"){}boolcl_ws_brk::match(struct event_rec *ev){  return(ev->ws == addr);}*//* * READ SFR type of EVENT breakpoints *//*cl_rs_brk::cl_rs_brk(class cl_mem *imem, int inr, t_addr iaddr,		     enum brk_perm iperm, int ihit):  cl_ev_brk(imem, inr, iaddr, iperm, ihit, brkRSFR, "rs"){}boolcl_rs_brk::match(struct event_rec *ev){  return(ev->rs == addr);}*//* * READ CODE type of EVENT breakpoints *//*cl_rc_brk::cl_rc_brk(class cl_mem *imem, int inr, t_addr iaddr,		     enum brk_perm iperm, int ihit):  cl_ev_brk(imem, inr, iaddr, iperm, ihit, brkRCODE, "rc"){}boolcl_rc_brk::match(struct event_rec *ev){  return(ev->rc == addr);}*//* * Collection of break-points * * This is a sorted collection, sorted by nr field of brk items. */brk_coll::brk_coll(t_index alimit, t_index adelta, class cl_mem *arom):  cl_sorted_list(alimit, adelta){  rom= arom;}void *brk_coll::key_of(void *item){  return((void *)&(((class cl_brk *)(item))->nr));}intbrk_coll::compare(void *key1, void *key2){  int k1, k2;  k1= *(int *)key1;  k2= *(int *)key2;  if (k1 == k2)    return(0);  else    if (k1 < k2)      return(-1);    else      return(+1);}/* * Checking if there is an event breakpoint for the specified event */boolbrk_coll::there_is_event(enum brk_event ev){  class cl_brk *b;  int   i;  for (i= 0; i < count; i++)    {      b= (class cl_brk *)at(i);      if (b->type() == brkEVENT &&	  ((class cl_ev_brk *)b)->event == ev)	return(DD_TRUE);    }  return(DD_FALSE);}/*intbrk_coll::make_new_nr(void){  if (count == 0)    return(1);  class cl_brk *b= (class cl_brk *)(at(count-1));  return(b->nr+1);}*/voidbrk_coll::add_bp(class cl_brk *bp){  add(bp);  bp->activate();  return;  /*if (rom &&      bp->addr < rom->size)      / *rom->bp_map->set(bp->addr)* /rom->set_brk(bp->addr, bp);*/}voidbrk_coll::del_bp(t_addr addr){  int idx;  class cl_brk *bp;  if ((bp= get_bp(addr, &idx)))    {      bp->inactivate();      free_at(idx);    }  return;  /*if (rom &&      addr < rom->size)    {      fprintf(stderr, "brk_coll::del_bp(0x%"_A_"x\n", addr);//FIXME      //rom->bp_map->clear(addr);      }*/}voidbrk_coll::del_bp(t_index idx, int /*dummy*/){  class cl_brk *bp;  if (idx >= count)    return;  bp= (class cl_brk *)(at(idx));  if (!bp)    return;  bp->inactivate();  free_at(idx);}class cl_brk *brk_coll::get_bp(t_addr addr, int *idx){  if (rom &&      addr < rom->size &&      /*rom->bp_map->get(addr)*/      rom->get_cell_flag(addr,  CELL_FETCH_BRK))    {      for (*idx= 0; *idx < count; (*idx)++)	{	  class cl_brk *b= (class cl_brk *)(at(*idx));	  if (b->addr == addr)	    return(b);	}    }  return(0);}class cl_brk *brk_coll::get_bp(int nr){  int i;  for (i= 0; i < count; i++)    {      class cl_brk *bp= (class cl_brk *)(at(i));      if (bp->nr == nr)	return(bp);    }  return(0);}boolbrk_coll::bp_at(t_addr addr){  return(rom &&	 addr < rom->size &&	 /*rom->bp_map->get(addr)*/	 rom->get_cell_flag(addr, CELL_FETCH_BRK));}/* End of brk.cc */

⌨️ 快捷键说明

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