2 * Simulator of microcontrollers (brk.cc)
4 * Copyright (C) 1999,99 Drotos Daniel, Talker Bt.
6 * To contact author send email to drdani@mazsola.iit.uni-miskolc.hu
10 /* This file is part of microcontroller simulator: ucsim.
12 UCSIM is free software; you can redistribute it and/or modify
13 it under the terms of the GNU General Public License as published by
14 the Free Software Foundation; either version 2 of the License, or
15 (at your option) any later version.
17 UCSIM is distributed in the hope that it will be useful,
18 but WITHOUT ANY WARRANTY; without even the implied warranty of
19 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 GNU General Public License for more details.
22 You should have received a copy of the GNU General Public License
23 along with UCSIM; see the file COPYING. If not, write to the Free
24 Software Foundation, 59 Temple Place - Suite 330, Boston, MA
38 * Base object of breakpoints
41 cl_brk::cl_brk(class cl_address_space *imem, int inr, t_addr iaddr,
42 enum brk_perm iperm, int ihit):
57 cl_brk::activate(void)
60 mem->set_brk(addr, this);
64 cl_brk::inactivate(void)
67 mem->del_brk(addr, this);
84 * FETCH type of breakpoint
87 cl_fetch_brk::cl_fetch_brk(class cl_address_space *imem, int inr, t_addr iaddr,
88 enum brk_perm iperm, int ihit):
89 cl_brk(imem, inr, iaddr, iperm, ihit)
95 cl_fetch_brk::type(void)
102 * Base of EVENT type of breakpoints
105 cl_ev_brk::cl_ev_brk(class cl_address_space *imem, int inr, t_addr iaddr,
106 enum brk_perm iperm, int ihit,
107 enum brk_event ievent, const char *iid):
108 cl_brk(imem, inr, iaddr, iperm, ihit)
115 cl_ev_brk::cl_ev_brk(class cl_address_space *imem, int inr, t_addr iaddr,
116 enum brk_perm iperm, int ihit, char op):
117 cl_brk(imem, inr, iaddr, iperm, ihit)
120 if ((op= toupper(op)) == 'R')
138 cl_ev_brk::type(void)
144 cl_ev_brk::match(struct event_rec *ev)
151 * Collection of break-points
153 * This is a sorted collection, sorted by nr field of brk items.
156 brk_coll::brk_coll(t_index alimit, t_index adelta,
157 class cl_address_space *arom):
158 cl_sorted_list(alimit, adelta, "breakpoints")
164 brk_coll::key_of(void *item)
166 return((void *)&(((class cl_brk *)(item))->nr));
171 brk_coll::compare(void *key1, void *key2)
189 * Checking if there is an event breakpoint for the specified event
193 brk_coll::there_is_event(enum brk_event ev)
198 for (i= 0; i < count; i++)
200 b= (class cl_brk *)at(i);
201 if (b->type() == brkEVENT &&
202 ((class cl_ev_brk *)b)->event == ev)
209 brk_coll::make_new_nr(void)
213 class cl_brk *b= (class cl_brk *)(at(count-1));
218 brk_coll::add_bp(class cl_brk *bp)
224 bp->addr < rom->size)
225 / *rom->bp_map->set(bp->addr)* /rom->set_brk(bp->addr, bp);*/
229 brk_coll::del_bp(t_addr addr)
234 if ((bp= get_bp(addr, &idx)))
243 fprintf(stderr, "brk_coll::del_bp(0x%"_A_"x\n", addr);//FIXME
244 //rom->bp_map->clear(addr);
249 brk_coll::del_bp(t_index idx, int /*dummy*/)
255 bp= (class cl_brk *)(at(idx));
263 brk_coll::get_bp(t_addr addr, int *idx)
266 rom->valid_address(addr) &&
267 rom->get_cell_flag(addr, CELL_FETCH_BRK))
269 for (*idx= 0; *idx < count; (*idx)++)
271 class cl_brk *b= (class cl_brk *)(at(*idx));
280 brk_coll::get_bp(int nr)
284 for (i= 0; i < count; i++)
286 class cl_brk *bp= (class cl_brk *)(at(i));
294 brk_coll::bp_at(t_addr addr)
297 rom->valid_address(addr) &&
298 rom->get_cell_flag(addr, CELL_FETCH_BRK));