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
37 * Base object of breakpoints
40 cl_brk::cl_brk(int inr, t_addr iaddr, enum brk_perm iperm, int ihit):
67 * FETCH type of breakpoint
70 cl_fetch_brk::cl_fetch_brk(int inr, t_addr iaddr, enum brk_perm iperm, int ihit):
71 cl_brk(inr, iaddr, iperm, ihit)
77 cl_fetch_brk::type(void)
84 * Base of EVENT type of breakpoints
87 cl_ev_brk::cl_ev_brk(int inr, t_addr iaddr, enum brk_perm iperm, int ihit,
88 enum brk_event ievent, const char *iid):
89 cl_brk(inr, iaddr, iperm, ihit)
102 cl_ev_brk::match(struct event_rec *ev)
109 * WRITE IRAM type of EVENT breakpoints
112 cl_wi_brk::cl_wi_brk(int inr, t_addr iaddr, enum brk_perm iperm, int ihit):
113 cl_ev_brk(inr, iaddr, iperm, ihit, brkWIRAM, "wi")
117 cl_wi_brk::match(struct event_rec *ev)
119 return(ev->wi == addr);
124 * READ IRAM type of EVENT breakpoints
127 cl_ri_brk::cl_ri_brk(int inr, t_addr iaddr, enum brk_perm iperm, int ihit):
128 cl_ev_brk(inr, iaddr, iperm, ihit, brkRIRAM, "ri")
132 cl_ri_brk::match(struct event_rec *ev)
134 return(ev->ri == addr);
139 * WRITE XRAM type of EVENT breakpoints
142 cl_wx_brk::cl_wx_brk(int inr, t_addr iaddr, enum brk_perm iperm, int ihit):
143 cl_ev_brk(inr, iaddr, iperm, ihit, brkWXRAM, "wx")
147 cl_wx_brk::match(struct event_rec *ev)
149 return(ev->wx == addr);
154 * READ XRAM type of EVENT breakpoints
157 cl_rx_brk::cl_rx_brk(int inr, t_addr iaddr, enum brk_perm iperm, int ihit):
158 cl_ev_brk(inr, iaddr, iperm, ihit, brkRXRAM, "rx")
162 cl_rx_brk::match(struct event_rec *ev)
164 return(ev->rx == addr);
169 * WRITE SFR type of EVENT breakpoints
172 cl_ws_brk::cl_ws_brk(int inr, t_addr iaddr, enum brk_perm iperm, int ihit):
173 cl_ev_brk(inr, iaddr, iperm, ihit, brkWSFR, "ws")
177 cl_ws_brk::match(struct event_rec *ev)
179 return(ev->ws == addr);
184 * READ SFR type of EVENT breakpoints
187 cl_rs_brk::cl_rs_brk(int inr, t_addr iaddr, enum brk_perm iperm, int ihit):
188 cl_ev_brk(inr, iaddr, iperm, ihit, brkRSFR, "rs")
192 cl_rs_brk::match(struct event_rec *ev)
194 return(ev->rs == addr);
199 * READ CODE type of EVENT breakpoints
202 cl_rc_brk::cl_rc_brk(int inr, t_addr iaddr, enum brk_perm iperm, int ihit):
203 cl_ev_brk(inr, iaddr, iperm, ihit, brkRCODE, "rc")
207 cl_rc_brk::match(struct event_rec *ev)
209 return(ev->rc == addr);
214 * Collection of break-points
216 * This is a sorted collection, sorted by nr field of brk items.
219 brk_coll::brk_coll(t_index alimit, t_index adelta, class cl_rom *arom):
220 cl_sorted_list(alimit, adelta)
226 brk_coll::key_of(void *item)
228 return((void *)&(((class cl_brk *)(item))->nr));
233 brk_coll::compare(void *key1, void *key2)
251 * Checking if there is an event breakpoint for the specified event
255 brk_coll::there_is_event(enum brk_event ev)
260 for (i= 0; i < count; i++)
262 b= (class cl_brk *)at(i);
263 if (b->type() == brkEVENT &&
264 ((class cl_ev_brk *)b)->event == ev)
271 brk_coll::make_new_nr(void)
275 class cl_brk *b= (class cl_brk *)(at(count-1));
280 brk_coll::add_bp(class cl_brk *bp)
284 bp->addr < rom->size)
285 rom->bp_map->set(bp->addr);
289 brk_coll::del_bp(t_addr addr)
293 if (get_bp(addr, &idx))
297 rom->bp_map->clear(addr);
301 brk_coll::get_bp(t_addr addr, int *idx)
305 rom->bp_map->get(addr))
307 for (*idx= 0; *idx < count; (*idx)++)
309 class cl_brk *b= (class cl_brk *)(at(*idx));
318 brk_coll::bp_at(t_addr addr)
322 rom->bp_map->get(addr));