version 0.5.2
[fw/sdcc] / sim / ucsim / sim.src / sim.cc
index 982532984692b7ff660bec537436af8e7d9f531f..ed6fb4675d96aa2eba551e25d08605b3a7891e4e 100644 (file)
@@ -157,39 +157,47 @@ cl_sim::stop(int reason)
       if (reason == resUSER &&
          cmd->frozen_console->input_avail())
        cmd->frozen_console->read_line();
-      cmd->frozen_console->printf("Stop at 0x%06x: (%d) ", uc->PC, reason);
+      cmd->frozen_console->dd_printf("Stop at 0x%06x: (%d) ", uc->PC, reason);
       switch (reason)
        {
        case resHALT:
-         cmd->frozen_console->printf("Halted\n");
+         cmd->frozen_console->dd_printf("Halted\n");
          break;
        case resINV_ADDR:
-         cmd->frozen_console->printf("Invalid address\n");
+         cmd->frozen_console->dd_printf("Invalid address\n");
          break;
        case resSTACK_OV:
-         cmd->frozen_console->printf("Stack overflow\n");
+         cmd->frozen_console->dd_printf("Stack overflow\n");
          break;
        case resBREAKPOINT:
-         cmd->frozen_console->printf("Breakpoint\n");
+         cmd->frozen_console->dd_printf("Breakpoint\n");
+         uc->print_regs(cmd->frozen_console);
          break;
        case resINTERRUPT:
-         cmd->frozen_console->printf("Interrupt\n");
+         cmd->frozen_console->dd_printf("Interrupt\n");
          break;
        case resWDTRESET:
-         cmd->frozen_console->printf("Watchdog reset\n");
+         cmd->frozen_console->dd_printf("Watchdog reset\n");
          break;
        case resUSER:
-         cmd->frozen_console->printf("User stopped\n");
+         cmd->frozen_console->dd_printf("User stopped\n");
          break;
        case resINV_INST:
-         cmd->frozen_console->printf("Invalid instruction 0x%04x\n",
-                                     uc->get_mem(MEM_ROM, uc->PC));
+         {
+           cmd->frozen_console->dd_printf("Invalid instruction");
+           if (uc->rom)
+             cmd->frozen_console->dd_printf(" 0x%04x\n",
+                                            uc->rom->get(uc->PC));
+         }
+         break;
+       case resERROR:
+         // uc::check_error prints error messages...
          break;
        default:
-         cmd->frozen_console->printf("Unknown reason\n");
+         cmd->frozen_console->dd_printf("Unknown reason\n");
          break;
        }
-      cmd->frozen_console->printf("F 0x%06x\n", uc->PC); // for sdcdb
+      cmd->frozen_console->dd_printf("F 0x%06x\n", uc->PC); // for sdcdb
       //if (cmd->actual_console != cmd->frozen_console)
       cmd->frozen_console->flags&= ~CONS_FROZEN;
       cmd->frozen_console->print_prompt();
@@ -198,6 +206,31 @@ cl_sim::stop(int reason)
   cmd->set_fd_set();
 }
 
+void
+cl_sim::stop(class cl_ev_brk *brk)
+{
+  class cl_commander *cmd= app->get_commander();
+
+  state&= ~SIM_GO;
+  if (cmd->frozen_console)
+    {
+      class cl_console *con= cmd->frozen_console;
+      /*
+      if (reason == resUSER &&
+         cmd->frozen_console->input_avail())
+       cmd->frozen_console->read_line();
+      */
+      //con->dd_printf("Stop at 0x%06x\n", uc->PC);
+      con->dd_printf("Event `%s' at %s[0x%"_A_"x]: 0x%"_A_"x %s\n",
+                    brk->id, brk->get_mem()->get_name(), brk->addr,
+                    uc->instPC,
+                    uc->disass(uc->instPC, " "));
+      //con->flags&= ~CONS_FROZEN;
+      //con->print_prompt();
+      //cmd->frozen_console= 0;
+    }
+}
+
 
 /*
  */
@@ -220,13 +253,13 @@ cl_sim::build_cmdset(class cl_cmdset *cmdset)
 "long help of stop"));
   cmd->init();
 
-  cmdset->add(cmd= new cl_step_cmd("step", 0,
+  cmdset->add(cmd= new cl_step_cmd("step", DD_TRUE,
 "step               Step",
 "long help of step"));
   cmd->init();
   cmd->add_name("s");
 
-  cmdset->add(cmd= new cl_next_cmd("next", 0,
+  cmdset->add(cmd= new cl_next_cmd("next", DD_TRUE,
 "next               Next",
 "long help of next"));
   cmd->init();
@@ -251,4 +284,18 @@ cl_sim::build_cmdset(class cl_cmdset *cmdset)
 }
 
 
+/*
+ * Messages to broadcast
+ */
+/*
+void
+cl_sim::mem_cell_changed(class cl_address_space *mem, t_addr addr)
+{
+  if (uc)
+    uc->mem_cell_changed(mem, addr);
+  else
+    printf("JAJ sim\n");
+}
+*/
+
 /* End of sim.src/sim.cc */