* sim/ucsim/*.*, sim/ucsim/configure, sim/ucsim/configure.in:
[fw/sdcc] / sim / ucsim / sim.src / brk.cc
index ab50bc157cf4c6969c4f6fb18179ea558d5af2ee..12b87d6c034adb7d8ecbb078ffe61ed92dabe5c6 100644 (file)
@@ -28,6 +28,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
 #include "ddconfig.h"
 
 #include <stdio.h>
+#include <ctype.h>
 
 #include "pobjcl.h"
 #include "brkcl.h"
@@ -37,9 +38,11 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
  * Base object of breakpoints
  */
 
-cl_brk::cl_brk(int inr, t_addr iaddr, enum brk_perm iperm, int ihit):
+cl_brk::cl_brk(class cl_address_space *imem, int inr, t_addr iaddr,
+              enum brk_perm iperm, int ihit):
   cl_base()
 {
+  mem  = imem;
   nr   = inr;
   addr = iaddr;
   perm = iperm;
@@ -50,6 +53,20 @@ cl_brk::cl_brk(int inr, t_addr iaddr, enum brk_perm iperm, int ihit):
 cl_brk::~cl_brk(void)
 {}
 
+void
+cl_brk::activate(void)
+{
+  if (mem)
+    mem->set_brk(addr, this);
+}
+
+void
+cl_brk::inactivate(void)
+{
+  if (mem)
+    mem->del_brk(addr, this);
+}
+
 bool
 cl_brk::do_hit(void)
 {
@@ -67,8 +84,9 @@ cl_brk::do_hit(void)
  * FETCH type of breakpoint
  */
 
-cl_fetch_brk::cl_fetch_brk(int inr, t_addr iaddr, enum brk_perm iperm, int ihit):
-  cl_brk(inr, iaddr, iperm, ihit)
+cl_fetch_brk::cl_fetch_brk(class cl_address_space *imem, int inr, t_addr iaddr,
+                          enum brk_perm iperm, int ihit):
+  cl_brk(imem, inr, iaddr, iperm, ihit)
 {
   code = 0;
 }
@@ -84,12 +102,36 @@ cl_fetch_brk::type(void)
  * Base of EVENT type of breakpoints
  */
 
-cl_ev_brk::cl_ev_brk(int inr, t_addr iaddr, enum brk_perm iperm, int ihit,
+cl_ev_brk::cl_ev_brk(class cl_address_space *imem, int inr, t_addr iaddr,
+                    enum brk_perm iperm, int ihit,
                     enum brk_event ievent, const char *iid):
-  cl_brk(inr, iaddr, iperm, ihit)
+  cl_brk(imem, inr, iaddr, iperm, ihit)
 {
   event= ievent;
   id   = iid;
+  mem  = imem;
+}
+
+cl_ev_brk::cl_ev_brk(class cl_address_space *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_type
@@ -101,112 +143,7 @@ cl_ev_brk::type(void)
 bool
 cl_ev_brk::match(struct event_rec *ev)
 {
-  return(FALSE);
-}
-
-
-/*
- * WRITE IRAM type of EVENT breakpoints
- */
-
-cl_wi_brk::cl_wi_brk(int inr, t_addr iaddr, enum brk_perm iperm, int ihit):
-  cl_ev_brk(inr, iaddr, iperm, ihit, brkWIRAM, "wi")
-{}
-
-bool
-cl_wi_brk::match(struct event_rec *ev)
-{
-  return(ev->wi == addr);
-}
-
-
-/*
- * READ IRAM type of EVENT breakpoints
- */
-
-cl_ri_brk::cl_ri_brk(int inr, t_addr iaddr, enum brk_perm iperm, int ihit):
-  cl_ev_brk(inr, iaddr, iperm, ihit, brkRIRAM, "ri")
-{}
-
-bool
-cl_ri_brk::match(struct event_rec *ev)
-{
-  return(ev->ri == addr);
-}
-
-
-/*
- * WRITE XRAM type of EVENT breakpoints
- */
-
-cl_wx_brk::cl_wx_brk(int inr, t_addr iaddr, enum brk_perm iperm, int ihit):
-  cl_ev_brk(inr, iaddr, iperm, ihit, brkWXRAM, "wx")
-{}
-
-bool
-cl_wx_brk::match(struct event_rec *ev)
-{
-  return(ev->wx == addr);
-}
-
-
-/*
- * READ XRAM type of EVENT breakpoints
- */
-
-cl_rx_brk::cl_rx_brk(int inr, t_addr iaddr, enum brk_perm iperm, int ihit):
-  cl_ev_brk(inr, iaddr, iperm, ihit, brkRXRAM, "rx")
-{}
-
-bool
-cl_rx_brk::match(struct event_rec *ev)
-{
-  return(ev->rx == addr);
-}
-
-
-/*
- * WRITE SFR type of EVENT breakpoints
- */
-
-cl_ws_brk::cl_ws_brk(int inr, t_addr iaddr, enum brk_perm iperm, int ihit):
-  cl_ev_brk(inr, iaddr, iperm, ihit, brkWSFR, "ws")
-{}
-
-bool
-cl_ws_brk::match(struct event_rec *ev)
-{
-  return(ev->ws == addr);
-}
-
-
-/*
- * READ SFR type of EVENT breakpoints
- */
-
-cl_rs_brk::cl_rs_brk(int inr, t_addr iaddr, enum brk_perm iperm, int ihit):
-  cl_ev_brk(inr, iaddr, iperm, ihit, brkRSFR, "rs")
-{}
-
-bool
-cl_rs_brk::match(struct event_rec *ev)
-{
-  return(ev->rs == addr);
-}
-
-
-/*
- * READ CODE type of EVENT breakpoints
- */
-
-cl_rc_brk::cl_rc_brk(int inr, t_addr iaddr, enum brk_perm iperm, int ihit):
-  cl_ev_brk(inr, iaddr, iperm, ihit, brkRCODE, "rc")
-{}
-
-bool
-cl_rc_brk::match(struct event_rec *ev)
-{
-  return(ev->rc == addr);
+  return(DD_FALSE);
 }
 
 
@@ -216,13 +153,14 @@ cl_rc_brk::match(struct event_rec *ev)
  * This is a sorted collection, sorted by nr field of brk items.
  */
 
-brk_coll::brk_coll(t_index alimit, t_index adelta, class cl_rom *arom):
-  cl_sorted_list(alimit, adelta)
+brk_coll::brk_coll(t_index alimit, t_index adelta,
+                  class cl_address_space *arom):
+  cl_sorted_list(alimit, adelta, "breakpoints")
 {
   rom= arom;
 }
 
-void *
+const void *
 brk_coll::key_of(void *item)
 {
   return((void *)&(((class cl_brk *)(item))->nr));
@@ -230,7 +168,7 @@ brk_coll::key_of(void *item)
 
 
 int
-brk_coll::compare(void *key1, void *key2)
+brk_coll::compare(const void *key1, const void *key2)
 {
   int k1, k2;
 
@@ -262,47 +200,71 @@ brk_coll::there_is_event(enum brk_event ev)
       b= (class cl_brk *)at(i);
       if (b->type() == brkEVENT &&
          ((class cl_ev_brk *)b)->event == ev)
-       return(TRUE);
+       return(DD_TRUE);
     }
-  return(FALSE);
+  return(DD_FALSE);
 }
 
-int
+/*int
 brk_coll::make_new_nr(void)
 {
   if (count == 0)
     return(1);
   class cl_brk *b= (class cl_brk *)(at(count-1));
   return(b->nr+1);
-}
+}*/
 
 void
 brk_coll::add_bp(class cl_brk *bp)
 {
   add(bp);
-  if (rom &&
+  bp->activate();
+  return;
+  /*if (rom &&
       bp->addr < rom->size)
-    rom->bp_map->set(bp->addr);
+      / *rom->bp_map->set(bp->addr)* /rom->set_brk(bp->addr, bp);*/
 }
 
 void
 brk_coll::del_bp(t_addr addr)
 {
   int idx;
+  class cl_brk *bp;
 
-  if (get_bp(addr, &idx))
-    free_at(idx);
-  if (rom &&
+  if ((bp= get_bp(addr, &idx)))
+    {
+      bp->inactivate();
+      free_at(idx);
+    }
+  return;
+  /*if (rom &&
       addr < rom->size)
-    rom->bp_map->clear(addr);
+    {
+      fprintf(stderr, "brk_coll::del_bp(0x%"_A_"x\n", addr);//FIXME
+      //rom->bp_map->clear(addr);
+      }*/
+}
+
+void
+brk_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->valid_address(addr) &&
+      rom->get_cell_flag(addr, CELL_FETCH_BRK))
     {
       for (*idx= 0; *idx < count; (*idx)++)
        {
@@ -314,12 +276,26 @@ brk_coll::get_bp(t_addr addr, int *idx)
   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);
+}
+
 bool
 brk_coll::bp_at(t_addr addr)
 {
   return(rom &&
-        addr < rom->size &&
-        rom->bp_map->get(addr));
+        rom->valid_address(addr) &&
+        rom->get_cell_flag(addr, CELL_FETCH_BRK));
 }