* sim/ucsim/avr.src/arith_inst.cc: fixed bug #1088372- savr is not
[fw/sdcc] / sim / ucsim / cmd.src / cmduc.cc
index 0bd30a982bfc5bfe86b7207f0680eef13287c473..cb3aa557b994dfbcbadb0fe1ce833dbeff0f3ffb 100644 (file)
@@ -46,26 +46,26 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
 //                   class cl_cmdline *cmdline, class cl_console *con)
 COMMAND_DO_WORK_UC(cl_state_cmd)
 {
-  con->printf("CPU state= %s PC= 0x%06x XTAL= %g\n",
-             get_id_string(cpu_states, uc->state),
-             uc->PC, 
-             uc->xtal);
-  con->printf("Total time since last reset= %g sec (%lu clks)\n",
-             uc->get_rtime(), uc->ticks->ticks);
-  con->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))));
-  con->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))));
-  con->printf("Max value of stack pointer= 0x%06x, avg= 0x%06x\n",
-             uc->sp_max, uc->sp_avg);
+  con->dd_printf("CPU state= %s PC= 0x%06x XTAL= %g\n",
+                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);
+  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))));
+  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))));
+  con->dd_printf("Max value of stack pointer= 0x%06x, avg= 0x%06x\n",
+                uc->sp_max, uc->sp_avg);
   return(0);
 }
 
@@ -86,11 +86,11 @@ COMMAND_DO_WORK_UC(cl_file_cmd)
   if ((cmdline->param(0) == 0) ||
       ((fname= cmdline->param(0)->get_svalue()) == NULL))
     {
-      con->printf("File name is missing.\n");
+      con->dd_printf("File name is missing.\n");
       return(0);
     }
   if ((l= uc->read_hex_file(fname)) >= 0)
-    con->printf("%ld words read from %s\n", l, fname);
+    con->dd_printf("%ld words read from %s\n", l, fname);
 
   return(0);
 }
@@ -109,7 +109,7 @@ COMMAND_DO_WORK_UC(cl_dl_cmd)
   long l;
   
   if ((l= uc->read_hex_file(NULL)) >= 0)
-    con->printf("%ld words loaded\n", l);
+    con->dd_printf("%ld words loaded\n", l);
 
   return(0);
 }
@@ -132,13 +132,17 @@ COMMAND_DO_WORK_UC(cl_pc_cmd)
     {
       if (!(params[0]->get_address(uc, &addr)))
        {
-         con->printf("Error: wrong parameter\n");
+         con->dd_printf("Error: wrong parameter\n");
          return(DD_FALSE);
        }
-      if (addr >= uc->get_mem_size(MEM_ROM))
-       addr= 0;
+      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->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);
@@ -171,7 +175,7 @@ COMMAND_DO_WORK_UC(cl_reset_cmd)
 //                  class cl_cmdline *cmdline, class cl_console *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),
@@ -194,43 +198,52 @@ COMMAND_DO_WORK_UC(cl_dump_cmd)
                                  mem,
                                  params[0]->value.bit.mem_address,
                                  params[0]->value.bit.mask);
-         con->printf("%10s ", sn?sn:"");
-         con->printf(mem->addr_format, params[0]->value.bit.mem_address);
-         con->printf(" ");
-         con->printf(mem->data_format, m);
-         con->printf(" %c\n", (m&(params[0]->value.bit.mask))?'1':'0');
+         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->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->printf("%s\n", short_help?short_help:"Error: wrong syntax\n");
 
   return(DD_FALSE);;
 }
@@ -246,7 +259,7 @@ COMMAND_DO_WORK_UC(cl_dump_cmd)
 //                class cl_cmdline *cmdline, class cl_console *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);
 }
@@ -262,7 +275,7 @@ COMMAND_DO_WORK_UC(cl_di_cmd)
 //                class cl_cmdline *cmdline, class cl_console *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);
 }
@@ -278,7 +291,7 @@ COMMAND_DO_WORK_UC(cl_dx_cmd)
 //                 class cl_cmdline *cmdline, class cl_console *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);
 }
@@ -294,7 +307,7 @@ COMMAND_DO_WORK_UC(cl_dch_cmd)
 //                class cl_cmdline *cmdline, class cl_console *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);
 }
@@ -313,7 +326,7 @@ 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);
+  class cl_address_space *rom= uc->address_space(MEM_ROM_ID);
 
   if (!rom)
     return(DD_FALSE);
@@ -327,20 +340,20 @@ 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->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->printf("Error: end address is wrong\n");
+      con->dd_printf("Error: end address is too high\n");
       return(DD_FALSE);
     }
 
   for (;
        start <= end;
-       start+= uc->inst_length(rom->get(start)))
+       start+= uc->inst_length(start))
     uc->print_disass(start, con);
   last= start;
   return(DD_FALSE);
@@ -382,22 +395,22 @@ COMMAND_DO_WORK_UC(cl_disassemble_cmd)
   }
   else
     {
-      con->printf("%s\n", short_help?short_help:"Error: wrong syntax\n");    
+      con->dd_printf("%s\n", short_help?short_help:"Error: wrong syntax\n");
       return(DD_FALSE);
     }
 
   if (lines < 1)
     {
-      con->printf("Error: wrong `lines' parameter\n");
+      con->dd_printf("Error: wrong `lines' parameter\n");
       return(DD_FALSE);
     }
   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 &&
+  while (realstart <= rom->highest_valid_address() &&
         !uc->inst_at(realstart))
     realstart= realstart+1;
   if (offset)
@@ -405,9 +418,9 @@ COMMAND_DO_WORK_UC(cl_disassemble_cmd)
       dir= (offset < 0)?-1:+1;
       while (offset)
        {
-         realstart= (realstart+dir) % rom->size;
+         realstart= rom->inc_address(realstart, dir);
          while (!uc->inst_at(realstart))
-           realstart= (realstart+dir) % rom->size;
+           realstart= rom->inc_address(realstart, dir);
          offset+= -dir;
        }
     }
@@ -415,9 +428,9 @@ COMMAND_DO_WORK_UC(cl_disassemble_cmd)
   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--;
     }
 
@@ -437,7 +450,7 @@ COMMAND_DO_WORK_UC(cl_disassemble_cmd)
 //                  class cl_cmdline *cmdline, class cl_console *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),
@@ -446,7 +459,7 @@ COMMAND_DO_WORK_UC(cl_fill_cmd)
                                 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;
@@ -455,11 +468,11 @@ COMMAND_DO_WORK_UC(cl_fill_cmd)
       {
        t_mem d;
        d= what;
-       mem->write(i, &d);
+       mem->write(i, d);
       }
   }
   else
-    con->printf("%s\n", short_help?short_help:"Error: wrong syntax\n");
+    con->dd_printf("%s\n", short_help?short_help:"Error: wrong syntax\n");
 
   return(DD_FALSE);;
 }
@@ -475,17 +488,17 @@ cl_where_cmd::do_real_work(class cl_uc *uc,
                           class cl_cmdline *cmdline, class cl_console *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) };
 
   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->printf("Error: nothing to search for\n");
+       con->dd_printf("Error: nothing to search for\n");
        return(DD_FALSE);
       }
     t_addr addr= 0;
@@ -498,7 +511,7 @@ cl_where_cmd::do_real_work(class cl_uc *uc,
       }
   }
   else
-    con->printf("%s\n", short_help?short_help:"Error: wrong syntax\n");
+    con->dd_printf("%s\n", short_help?short_help:"Error: wrong syntax\n");
 
   return(DD_FALSE);
 }