* sim/ucsim/cmd.src/newcmdposix.cc, sim/ucsim/cmd.src/newcmdposixcl.h,
[fw/sdcc] / sim / ucsim / cmd.src / cmduc.cc
index 3623bd7a539d98d2ec1937ae89a3427bdd4f9354..02330e4f1bc80dd3c666942a95f607aacff94095 100644 (file)
@@ -43,29 +43,29 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
 
 //int
 //cl_state_cmd::do_work(class cl_sim *sim,
-//                   class cl_cmdline *cmdline, class cl_console *con)
+//                    class cl_cmdline *cmdline, class cl_console_base *con)
 COMMAND_DO_WORK_UC(cl_state_cmd)
 {
   con->dd_printf("CPU state= %s PC= 0x%06x XTAL= %g\n",
-                get_id_string(cpu_states, uc->state),
-                uc->PC, 
-                uc->xtal);
+                 get_id_string(cpu_states, uc->state),
+                 uc->PC, 
+                 uc->xtal);
   con->dd_printf("Total time since last reset= %g sec (%lu clks)\n",
-                uc->get_rtime(), uc->ticks->ticks);
+                 uc->get_rtime(), uc->ticks->ticks);
   con->dd_printf("Time in isr = %g sec (%lu clks) %3.2g%%\n",
-                uc->isr_ticks->get_rtime(uc->xtal),
-                uc->isr_ticks->ticks,
-                (uc->ticks->ticks == 0)?0.0:
-                (100.0*((double)(uc->isr_ticks->ticks)/
-                        (double)(uc->ticks->ticks))));
+                 uc->isr_ticks->get_rtime(uc->xtal),
+                 uc->isr_ticks->ticks,
+                 (uc->ticks->ticks == 0)?0.0:
+                 (100.0*((double)(uc->isr_ticks->ticks)/
+                         (double)(uc->ticks->ticks))));
   con->dd_printf("Time in idle= %g sec (%lu clks) %3.2g%%\n",
-                uc->idle_ticks->get_rtime(uc->xtal),
-                uc->idle_ticks->ticks,
-                (uc->ticks->ticks == 0)?0.0:
-                (100.0*((double)(uc->idle_ticks->ticks)/
-                        (double)(uc->ticks->ticks))));
+                 uc->idle_ticks->get_rtime(uc->xtal),
+                 uc->idle_ticks->ticks,
+                 (uc->ticks->ticks == 0)?0.0:
+                 (100.0*((double)(uc->idle_ticks->ticks)/
+                         (double)(uc->ticks->ticks))));
   con->dd_printf("Max value of stack pointer= 0x%06x, avg= 0x%06x\n",
-                uc->sp_max, uc->sp_avg);
+                 uc->sp_max, uc->sp_avg);
   return(0);
 }
 
@@ -77,7 +77,7 @@ COMMAND_DO_WORK_UC(cl_state_cmd)
 
 //int
 //cl_file_cmd::do_work(class cl_sim *sim,
-//                  class cl_cmdline *cmdline, class cl_console *con)
+//                   class cl_cmdline *cmdline, class cl_console_base *con)
 COMMAND_DO_WORK_UC(cl_file_cmd)
 {
   char *fname= 0;
@@ -103,7 +103,7 @@ COMMAND_DO_WORK_UC(cl_file_cmd)
 
 //int
 //cl_dl_cmd::do_work(class cl_sim *sim,
-//                class cl_cmdline *cmdline, class cl_console *con)
+//                 class cl_cmdline *cmdline, class cl_console_base *con)
 COMMAND_DO_WORK_UC(cl_dl_cmd)
 {
   long l;
@@ -122,7 +122,7 @@ COMMAND_DO_WORK_UC(cl_dl_cmd)
 
 //int
 //cl_pc_cmd::do_work(class cl_sim *sim,
-//                class cl_cmdline *cmdline, class cl_console *con)
+//                 class cl_cmdline *cmdline, class cl_console_base *con)
 COMMAND_DO_WORK_UC(cl_pc_cmd)
 {
   t_addr addr;
@@ -131,14 +131,18 @@ COMMAND_DO_WORK_UC(cl_pc_cmd)
   if (params[0])
     {
       if (!(params[0]->get_address(uc, &addr)))
-       {
-         con->dd_printf("Error: wrong parameter\n");
-         return(DD_FALSE);
-       }
-      if (addr >= uc->get_mem_size(MEM_ROM))
-       addr= 0;
+        {
+          con->dd_printf("Error: wrong parameter\n");
+          return(DD_FALSE);
+        }
+      class cl_address_space *rom= uc->address_space(MEM_ROM_ID);
+      if (rom)
+        {
+          if (addr > rom->highest_valid_address())
+            addr= rom->highest_valid_address();
+        }
       if (!uc->inst_at(addr))
-       con->dd_printf("Warning: maybe not instruction at 0x%06x\n", addr);
+        con->dd_printf("Warning: maybe not instruction at 0x%06x\n", addr);
       uc->PC= addr;
     }
   uc->print_disass(uc->PC, con);
@@ -153,7 +157,7 @@ COMMAND_DO_WORK_UC(cl_pc_cmd)
 
 //int
 //cl_reset_cmd::do_work(class cl_sim *sim,
-//                   class cl_cmdline *cmdline, class cl_console *con)
+//                    class cl_cmdline *cmdline, class cl_console_base *con)
 COMMAND_DO_WORK_UC(cl_reset_cmd)
 {
   uc->reset();
@@ -168,69 +172,78 @@ COMMAND_DO_WORK_UC(cl_reset_cmd)
 
 //int
 //cl_dump_cmd::do_work(class cl_sim *sim,
-//                  class cl_cmdline *cmdline, class cl_console *con)
+//                   class cl_cmdline *cmdline, class cl_console_base *con)
 COMMAND_DO_WORK_UC(cl_dump_cmd)
 {
-  class cl_mem *mem= 0;
+  class cl_memory *mem= 0;
   long bpl= 8;
   t_addr start= 0, end;
   class cl_cmd_arg *params[4]= { cmdline->param(0),
-                                cmdline->param(1),
-                                cmdline->param(2),
-                                cmdline->param(3) };
+                                 cmdline->param(1),
+                                 cmdline->param(2),
+                                 cmdline->param(3) };
 
   if (params[0] &&
       params[0]->as_bit(uc))
     {
       int i= 0;
       while (params[0] &&
-            params[0]->as_bit(uc))
-       {
-         t_mem m;
-         mem= params[0]->value.bit.mem;
-         m= mem->read(params[0]->value.bit.mem_address);
-         char *sn=
-           uc->symbolic_bit_name((t_addr)-1,
-                                 mem,
-                                 params[0]->value.bit.mem_address,
-                                 params[0]->value.bit.mask);
-         con->dd_printf("%10s ", sn?sn:"");
-         con->dd_printf(mem->addr_format, params[0]->value.bit.mem_address);
-         con->dd_printf(" ");
-         con->dd_printf(mem->data_format, m);
-         con->dd_printf(" %c\n", (m&(params[0]->value.bit.mask))?'1':'0');
-         i++;
-         params[0]= cmdline->param(i);
-       }
+             params[0]->as_bit(uc))
+        {
+          t_mem m;
+          mem= params[0]->value.bit.mem;
+          m= mem->read(params[0]->value.bit.mem_address);
+          char *sn=
+            uc->symbolic_bit_name((t_addr)-1,
+                                  mem,
+                                  params[0]->value.bit.mem_address,
+                                  params[0]->value.bit.mask);
+          con->dd_printf("%10s ", sn?sn:"");
+          con->dd_printf(mem->addr_format, params[0]->value.bit.mem_address);
+          con->dd_printf(" ");
+          con->dd_printf(mem->data_format, m);
+          con->dd_printf(" %c\n", (m&(params[0]->value.bit.mask))?'1':'0');
+          i++;
+          params[0]= cmdline->param(i);
+        }
       if (params[0])
-       con->dd_printf("%s\n", short_help?short_help:"Error: wrong syntax\n");
+        con->dd_printf("%s\n", short_help?short_help:"Error: wrong syntax\n");
     }
-  else if (cmdline->syntax_match(uc, MEMORY))
+  else
     {
-      mem= params[0]->value.memory;
-      mem->dump(con);
+      if (!params[0] ||
+          !params[0]->as_memory(uc))
+        {
+          con->dd_printf("No memory specified. Use \"info memory\" for available memories\n");
+          return(DD_FALSE);
+        }
+      if (cmdline->syntax_match(uc, MEMORY))
+        {
+          mem= params[0]->value.memory.memory;
+          mem->dump(con);
+        }
+      else if (cmdline->syntax_match(uc, MEMORY ADDRESS)) {
+        mem  = params[0]->value.memory.memory;
+        start= params[1]->value.address;
+        end  = start+10*8-1;
+        mem->dump(start, end, bpl, con);
+      }
+      else if (cmdline->syntax_match(uc, MEMORY ADDRESS ADDRESS)) {
+        mem  = params[0]->value.memory.memory;
+        start= params[1]->value.address;
+        end  = params[2]->value.address;
+        mem->dump(start, end, bpl, con);
+      }
+      else if (cmdline->syntax_match(uc, MEMORY ADDRESS ADDRESS NUMBER)) {
+        mem  = params[0]->value.memory.memory;
+        start= params[1]->value.address;
+        end  = params[2]->value.address;
+        bpl  = params[3]->value.number;
+        mem->dump(start, end, bpl, con);
+      }
+      else
+        con->dd_printf("%s\n", short_help?short_help:"Error: wrong syntax\n");
     }
-  else if (cmdline->syntax_match(uc, MEMORY ADDRESS)) {
-    mem  = params[0]->value.memory;
-    start= params[1]->value.address;
-    end  = start+10*8-1;
-    mem->dump(start, end, bpl, con);
-  }
-  else if (cmdline->syntax_match(uc, MEMORY ADDRESS ADDRESS)) {
-    mem  = params[0]->value.memory;
-    start= params[1]->value.address;
-    end  = params[2]->value.address;
-    mem->dump(start, end, bpl, con);
-  }
-  else if (cmdline->syntax_match(uc, MEMORY ADDRESS ADDRESS NUMBER)) {
-    mem  = params[0]->value.memory;
-    start= params[1]->value.address;
-    end  = params[2]->value.address;
-    bpl  = params[3]->value.number;
-    mem->dump(start, end, bpl, con);
-  }
-  else
-    con->dd_printf("%s\n", short_help?short_help:"Error: wrong syntax\n");
 
   return(DD_FALSE);;
 }
@@ -243,10 +256,10 @@ COMMAND_DO_WORK_UC(cl_dump_cmd)
 
 //int
 //cl_di_cmd::do_work(class cl_sim *sim,
-//                class cl_cmdline *cmdline, class cl_console *con)
+//                 class cl_cmdline *cmdline, class cl_console_base *con)
 COMMAND_DO_WORK_UC(cl_di_cmd)
 {
-  cmdline->insert_param(0, new cl_cmd_sym_arg("i"));
+  cmdline->insert_param(0, new cl_cmd_sym_arg("iram"));
   cl_dump_cmd::do_work(uc, cmdline, con);
   return(0);
 }
@@ -259,10 +272,10 @@ COMMAND_DO_WORK_UC(cl_di_cmd)
 
 //int
 //cl_dx_cmd::do_work(class cl_sim *sim,
-//                class cl_cmdline *cmdline, class cl_console *con)
+//                 class cl_cmdline *cmdline, class cl_console_base *con)
 COMMAND_DO_WORK_UC(cl_dx_cmd)
 {
-  cmdline->insert_param(0, new cl_cmd_sym_arg("x"));
+  cmdline->insert_param(0, new cl_cmd_sym_arg("xram"));
   cl_dump_cmd::do_work(uc, cmdline, con);
   return(0);
 }
@@ -275,10 +288,10 @@ COMMAND_DO_WORK_UC(cl_dx_cmd)
 
 //int
 //cl_dch_cmd::do_work(class cl_sim *sim,
-//                 class cl_cmdline *cmdline, class cl_console *con)
+//                  class cl_cmdline *cmdline, class cl_console_base *con)
 COMMAND_DO_WORK_UC(cl_dch_cmd)
 {
-  cmdline->insert_param(0, new cl_cmd_sym_arg("r"));
+  cmdline->insert_param(0, new cl_cmd_sym_arg("rom"));
   cl_dump_cmd::do_work(uc, cmdline, con);
   return(0);
 }
@@ -291,10 +304,10 @@ COMMAND_DO_WORK_UC(cl_dch_cmd)
 
 //int
 //cl_ds_cmd::do_work(class cl_sim *sim,
-//                class cl_cmdline *cmdline, class cl_console *con)
+//                 class cl_cmdline *cmdline, class cl_console_base *con)
 COMMAND_DO_WORK_UC(cl_ds_cmd)
 {
-  cmdline->insert_param(0, new cl_cmd_sym_arg("s"));
+  cmdline->insert_param(0, new cl_cmd_sym_arg("sfr"));
   cl_dump_cmd::do_work(uc, cmdline, con);
   return(0);
 }
@@ -307,13 +320,13 @@ COMMAND_DO_WORK_UC(cl_ds_cmd)
 
 //int
 //cl_dc_cmd::do_work(class cl_sim *sim,
-//                class cl_cmdline *cmdline, class cl_console *con)
+//                 class cl_cmdline *cmdline, class cl_console_base *con)
 COMMAND_DO_WORK_UC(cl_dc_cmd)
 {
   t_addr start= last, end= last+20;
   class cl_cmd_arg *params[2]= { cmdline->param(0),
-                                cmdline->param(1) };
-  class cl_mem *rom= uc->mem(MEM_ROM);
+                                 cmdline->param(1) };
+  class cl_address_space *rom= uc->address_space(MEM_ROM_ID);
 
   if (!rom)
     return(DD_FALSE);
@@ -327,14 +340,14 @@ COMMAND_DO_WORK_UC(cl_dc_cmd)
     start= params[0]->value.address;
     end= params[1]->value.address;
   }
-  if (start >= rom->size)
+  if (start > rom->highest_valid_address())
     {
-      con->dd_printf("Error: start address is wrong\n");
+      con->dd_printf("Error: start address is too high\n");
       return(DD_FALSE);
     }
-  if (end >= rom->size)
+  if (end > rom->highest_valid_address())
     {
-      con->dd_printf("Error: end address is wrong\n");
+      con->dd_printf("Error: end address is too high\n");
       return(DD_FALSE);
     }
 
@@ -356,15 +369,15 @@ static int disass_last_stop= 0;
 
 //int
 //cl_disassemble_cmd::do_work(class cl_sim *sim,
-//                         class cl_cmdline *cmdline, class cl_console *con)
+//                          class cl_cmdline *cmdline, class cl_console_base *con)
 COMMAND_DO_WORK_UC(cl_disassemble_cmd)
 {
   t_addr start, realstart;
   int offset= -1, dir, lines= 20;
   class cl_cmd_arg *params[4]= { cmdline->param(0),
-                                cmdline->param(1),
-                                cmdline->param(2),
-                                cmdline->param(3) };
+                                 cmdline->param(1),
+                                 cmdline->param(2),
+                                 cmdline->param(3) };
 
   start= disass_last_stop;
   if (params[0] == 0) ;
@@ -394,30 +407,30 @@ COMMAND_DO_WORK_UC(cl_disassemble_cmd)
   if (!uc->there_is_inst())
     return(DD_FALSE);
   realstart= start;
-  class cl_mem *rom= uc->mem(MEM_ROM);
+  class cl_address_space *rom= uc->address_space(MEM_ROM_ID);
   if (!rom)
     return(DD_FALSE);
-  while (realstart < rom->size &&
-        !uc->inst_at(realstart))
+  while (realstart <= rom->highest_valid_address() &&
+         !uc->inst_at(realstart))
     realstart= realstart+1;
   if (offset)
     {
       dir= (offset < 0)?-1:+1;
       while (offset)
-       {
-         realstart= (realstart+dir) % rom->size;
-         while (!uc->inst_at(realstart))
-           realstart= (realstart+dir) % rom->size;
-         offset+= -dir;
-       }
+        {
+          realstart= rom->inc_address(realstart, dir);
+          while (!uc->inst_at(realstart))
+            realstart= rom->inc_address(realstart, dir);
+          offset+= -dir;
+        }
     }
   
   while (lines)
     {
       uc->print_disass(realstart, con);
-      realstart= (realstart+1) % rom->size;
+      realstart= rom->inc_address(realstart, +1) + rom->start_address;
       while (!uc->inst_at(realstart))
-       realstart= (realstart+1) % rom->size;
+        realstart= rom->inc_address(realstart, +1) + rom->start_address;
       lines--;
     }
 
@@ -434,28 +447,28 @@ COMMAND_DO_WORK_UC(cl_disassemble_cmd)
 
 //int
 //cl_fill_cmd::do_work(class cl_sim *sim,
-//                  class cl_cmdline *cmdline, class cl_console *con)
+//                   class cl_cmdline *cmdline, class cl_console_base *con)
 COMMAND_DO_WORK_UC(cl_fill_cmd)
 {
-  class cl_mem *mem= 0;
+  class cl_memory *mem= 0;
   t_mem what= 0;
   t_addr start= 0, end;
   class cl_cmd_arg *params[4]= { cmdline->param(0),
-                                cmdline->param(1),
-                                cmdline->param(2),
-                                cmdline->param(3) };
+                                 cmdline->param(1),
+                                 cmdline->param(2),
+                                 cmdline->param(3) };
 
   if (cmdline->syntax_match(uc, MEMORY ADDRESS ADDRESS NUMBER)) {
-    mem  = params[0]->value.memory;
+    mem  = params[0]->value.memory.memory;
     start= params[1]->value.address;
     end  = params[2]->value.address;
     what = params[3]->value.number;
     t_addr i;
     for (i= start; i <= end; i++)
       {
-       t_mem d;
-       d= what;
-       mem->write(i, d);
+        t_mem d;
+        d= what;
+        mem->write(i, d);
       }
   }
   else
@@ -472,29 +485,29 @@ COMMAND_DO_WORK_UC(cl_fill_cmd)
 
 int
 cl_where_cmd::do_real_work(class cl_uc *uc,
-                          class cl_cmdline *cmdline, class cl_console *con,
-                          bool case_sensitive)
+                           class cl_cmdline *cmdline, class cl_console_base *con,
+                           bool case_sensitive)
 {
-  class cl_mem *mem= 0;
+  class cl_memory *mem= 0;
   class cl_cmd_arg *params[2]= { cmdline->param(0),
-                                cmdline->param(1) };
+                                 cmdline->param(1) };
 
   if (cmdline->syntax_match(uc, MEMORY DATALIST)) {
-    mem= params[0]->value.memory;
+    mem= params[0]->value.memory.memory;
     t_mem *array= params[1]->value.data_list.array;
     int len= params[1]->value.data_list.len;
     if (!len)
       {
-       con->dd_printf("Error: nothing to search for\n");
-       return(DD_FALSE);
+        con->dd_printf("Error: nothing to search for\n");
+        return(DD_FALSE);
       }
     t_addr addr= 0;
     bool found= mem->search_next(case_sensitive, array, len, &addr);
     while (found)
       {
-       mem->dump(addr, addr+len-1, 8, con);
-       addr++;
-       found= mem->search_next(case_sensitive, array, len, &addr);
+        mem->dump(addr, addr+len-1, 8, con);
+        addr++;
+        found= mem->search_next(case_sensitive, array, len, &addr);
       }
   }
   else
@@ -505,7 +518,7 @@ cl_where_cmd::do_real_work(class cl_uc *uc,
 
 //int
 //cl_where_cmd::do_work(class cl_sim *sim,
-//                   class cl_cmdline *cmdline, class cl_console *con)
+//                    class cl_cmdline *cmdline, class cl_console_base *con)
 COMMAND_DO_WORK_UC(cl_where_cmd)
 {
   return(do_real_work(uc, cmdline, con, DD_FALSE));
@@ -513,7 +526,7 @@ COMMAND_DO_WORK_UC(cl_where_cmd)
 
 //int
 //cl_Where_cmd::do_work(class cl_sim *sim,
-//                   class cl_cmdline *cmdline, class cl_console *con)
+//                    class cl_cmdline *cmdline, class cl_console_base *con)
 COMMAND_DO_WORK_UC(cl_Where_cmd)
 {
   return(do_real_work(uc, cmdline, con, DD_TRUE));