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_mem *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_mem *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_mem *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_mem *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 * WRITE IRAM type of EVENT breakpoints
154 /*cl_wi_brk::cl_wi_brk(class cl_mem *imem, int inr, t_addr iaddr,
155 enum brk_perm iperm, int ihit):
156 cl_ev_brk(imem, inr, iaddr, iperm, ihit, brkWIRAM, "wi")
160 cl_wi_brk::match(struct event_rec *ev)
162 return(ev->wi == addr);
167 * READ IRAM type of EVENT breakpoints
170 /*cl_ri_brk::cl_ri_brk(class cl_mem *imem, int inr, t_addr iaddr,
171 enum brk_perm iperm, int ihit):
172 cl_ev_brk(imem, inr, iaddr, iperm, ihit, brkRIRAM, "ri")
176 cl_ri_brk::match(struct event_rec *ev)
178 return(ev->ri == addr);
183 * WRITE XRAM type of EVENT breakpoints
186 /*cl_wx_brk::cl_wx_brk(class cl_mem *imem, int inr, t_addr iaddr,
187 enum brk_perm iperm, int ihit):
188 cl_ev_brk(imem, inr, iaddr, iperm, ihit, brkWXRAM, "wx")
192 cl_wx_brk::match(struct event_rec *ev)
194 return(ev->wx == addr);
199 * READ XRAM type of EVENT breakpoints
202 /*cl_rx_brk::cl_rx_brk(class cl_mem *imem, int inr, t_addr iaddr,
203 enum brk_perm iperm, int ihit):
204 cl_ev_brk(imem, inr, iaddr, iperm, ihit, brkRXRAM, "rx")
208 cl_rx_brk::match(struct event_rec *ev)
210 return(ev->rx == addr);
215 * WRITE SFR type of EVENT breakpoints
218 /*cl_ws_brk::cl_ws_brk(class cl_mem *imem, int inr, t_addr iaddr,
219 enum brk_perm iperm, int ihit):
220 cl_ev_brk(imem, inr, iaddr, iperm, ihit, brkWSFR, "ws")
224 cl_ws_brk::match(struct event_rec *ev)
226 return(ev->ws == addr);
231 * READ SFR type of EVENT breakpoints
234 /*cl_rs_brk::cl_rs_brk(class cl_mem *imem, int inr, t_addr iaddr,
235 enum brk_perm iperm, int ihit):
236 cl_ev_brk(imem, inr, iaddr, iperm, ihit, brkRSFR, "rs")
240 cl_rs_brk::match(struct event_rec *ev)
242 return(ev->rs == addr);
247 * READ CODE type of EVENT breakpoints
250 /*cl_rc_brk::cl_rc_brk(class cl_mem *imem, int inr, t_addr iaddr,
251 enum brk_perm iperm, int ihit):
252 cl_ev_brk(imem, inr, iaddr, iperm, ihit, brkRCODE, "rc")
256 cl_rc_brk::match(struct event_rec *ev)
258 return(ev->rc == addr);
263 * Collection of break-points
265 * This is a sorted collection, sorted by nr field of brk items.
268 brk_coll::brk_coll(t_index alimit, t_index adelta, class cl_mem *arom):
269 cl_sorted_list(alimit, adelta)
275 brk_coll::key_of(void *item)
277 return((void *)&(((class cl_brk *)(item))->nr));
282 brk_coll::compare(void *key1, void *key2)
300 * Checking if there is an event breakpoint for the specified event
304 brk_coll::there_is_event(enum brk_event ev)
309 for (i= 0; i < count; i++)
311 b= (class cl_brk *)at(i);
312 if (b->type() == brkEVENT &&
313 ((class cl_ev_brk *)b)->event == ev)
320 brk_coll::make_new_nr(void)
324 class cl_brk *b= (class cl_brk *)(at(count-1));
329 brk_coll::add_bp(class cl_brk *bp)
335 bp->addr < rom->size)
336 / *rom->bp_map->set(bp->addr)* /rom->set_brk(bp->addr, bp);*/
340 brk_coll::del_bp(t_addr addr)
345 if ((bp= get_bp(addr, &idx)))
354 fprintf(stderr, "brk_coll::del_bp(0x%"_A_"x\n", addr);//FIXME
355 //rom->bp_map->clear(addr);
360 brk_coll::del_bp(t_index idx, int /*dummy*/)
366 bp= (class cl_brk *)(at(idx));
374 brk_coll::get_bp(t_addr addr, int *idx)
378 /*rom->bp_map->get(addr)*/
379 rom->get_cell_flag(addr, CELL_FETCH_BRK))
381 for (*idx= 0; *idx < count; (*idx)++)
383 class cl_brk *b= (class cl_brk *)(at(*idx));
392 brk_coll::get_bp(int nr)
396 for (i= 0; i < count; i++)
398 class cl_brk *bp= (class cl_brk *)(at(i));
406 brk_coll::bp_at(t_addr addr)
410 /*rom->bp_map->get(addr)*/
411 rom->get_cell_flag(addr, CELL_FETCH_BRK));