⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cmduc.cc

📁 Small Device C Compiler 面向Inter8051
💻 CC
字号:
/* * Simulator of microcontrollers (cmd.src/cmduc.cc) * * Copyright (C) 2001,01 Drotos Daniel, Talker Bt. *  * To contact author send email to drdani@mazsola.iit.uni-miskolc.hu * *//* This file is part of microcontroller simulator: ucsim.UCSIM is free software; you can redistribute it and/or modifyit under the terms of the GNU General Public License as published bythe Free Software Foundation; either version 2 of the License, or(at your option) any later version.UCSIM is distributed in the hope that it will be useful,but WITHOUT ANY WARRANTY; without even the implied warranty ofMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See theGNU General Public License for more details.You should have received a copy of the GNU General Public Licensealong with UCSIM; see the file COPYING.  If not, write to the FreeSoftware Foundation, 59 Temple Place - Suite 330, Boston, MA02111-1307, USA. *//*@1@*/// prj#include "globals.h"#include "utils.h"// sim.src#include "uccl.h"// local, cmd.src#include "cmduccl.h"/* * Command: state *---------------------------------------------------------------------------- *///int//cl_state_cmd::do_work(class cl_sim *sim,//		      class cl_cmdline *cmdline, class cl_console *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);  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);}/* * Command: file *---------------------------------------------------------------------------- *///int//cl_file_cmd::do_work(class cl_sim *sim,//		     class cl_cmdline *cmdline, class cl_console *con)COMMAND_DO_WORK_UC(cl_file_cmd){  char *fname= 0;  long l;    if ((cmdline->param(0) == 0) ||      ((fname= cmdline->param(0)->get_svalue()) == NULL))    {      con->dd_printf("File name is missing.\n");      return(0);    }  if ((l= uc->read_hex_file(fname)) >= 0)    con->dd_printf("%ld words read from %s\n", l, fname);  return(0);}/* * Command: download *---------------------------------------------------------------------------- *///int//cl_dl_cmd::do_work(class cl_sim *sim,//		   class cl_cmdline *cmdline, class cl_console *con)COMMAND_DO_WORK_UC(cl_dl_cmd){  long l;    if ((l= uc->read_hex_file(NULL)) >= 0)    con->dd_printf("%ld words loaded\n", l);  return(0);}/* * Command: pc *---------------------------------------------------------------------------- *///int//cl_pc_cmd::do_work(class cl_sim *sim,//		   class cl_cmdline *cmdline, class cl_console *con)COMMAND_DO_WORK_UC(cl_pc_cmd){  t_addr addr;  class cl_cmd_arg *params[1]= { cmdline->param(0) };  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;      if (!uc->inst_at(addr))	con->dd_printf("Warning: maybe not instruction at 0x%06x\n", addr);      uc->PC= addr;    }  uc->print_disass(uc->PC, con);  return(DD_FALSE);}/* * Command: reset *---------------------------------------------------------------------------- *///int//cl_reset_cmd::do_work(class cl_sim *sim,//		      class cl_cmdline *cmdline, class cl_console *con)COMMAND_DO_WORK_UC(cl_reset_cmd){  uc->reset();  return(0);}/* * Command: dump *---------------------------------------------------------------------------- *///int//cl_dump_cmd::do_work(class cl_sim *sim,//		     class cl_cmdline *cmdline, class cl_console *con)COMMAND_DO_WORK_UC(cl_dump_cmd){  class cl_mem *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) };  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);	}      if (params[0])	con->dd_printf("%s\n", short_help?short_help:"Error: wrong syntax\n");    }  else if (cmdline->syntax_match(uc, MEMORY))    {      mem= params[0]->value.memory;      mem->dump(con);    }  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);;}/* * Command: di *---------------------------------------------------------------------------- *///int//cl_di_cmd::do_work(class cl_sim *sim,//		   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"));  cl_dump_cmd::do_work(uc, cmdline, con);  return(0);}/* * Command: dx *---------------------------------------------------------------------------- *///int//cl_dx_cmd::do_work(class cl_sim *sim,//		   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"));  cl_dump_cmd::do_work(uc, cmdline, con);  return(0);}/* * Command: dch *---------------------------------------------------------------------------- *///int//cl_dch_cmd::do_work(class cl_sim *sim,//		    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"));  cl_dump_cmd::do_work(uc, cmdline, con);  return(0);}/* * Command: ds *---------------------------------------------------------------------------- *///int//cl_ds_cmd::do_work(class cl_sim *sim,//		   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"));  cl_dump_cmd::do_work(uc, cmdline, con);  return(0);}/* * Command: dc *---------------------------------------------------------------------------- *///int//cl_dc_cmd::do_work(class cl_sim *sim,//		   class cl_cmdline *cmdline, class cl_console *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);  if (!rom)    return(DD_FALSE);  if (params[0] == 0)    ;  else if (cmdline->syntax_match(uc, ADDRESS)) {    start= params[0]->value.address;    end= start+20;  }  else if (cmdline->syntax_match(uc, ADDRESS ADDRESS)) {    start= params[0]->value.address;    end= params[1]->value.address;  }  if (start >= rom->size)    {      con->dd_printf("Error: start address is wrong\n");      return(DD_FALSE);    }  if (end >= rom->size)    {      con->dd_printf("Error: end address is wrong\n");      return(DD_FALSE);    }  for (;       start <= end;       start+= uc->inst_length(start))    uc->print_disass(start, con);  last= start;  return(DD_FALSE);}/* * Command: disassemble *---------------------------------------------------------------------------- */static int disass_last_stop= 0;//int//cl_disassemble_cmd::do_work(class cl_sim *sim,//			    class cl_cmdline *cmdline, class cl_console *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) };  start= disass_last_stop;  if (params[0] == 0) ;  else if (cmdline->syntax_match(uc, ADDRESS)) {    start= params[0]->value.address;  }  else if (cmdline->syntax_match(uc, ADDRESS NUMBER)) {    start= params[0]->value.address;    offset= params[1]->value.number;  }  else if (cmdline->syntax_match(uc, ADDRESS NUMBER NUMBER)) {    start= params[0]->value.address;    offset= params[1]->value.number;    lines= params[2]->value.number;  }  else    {      con->dd_printf("%s\n", short_help?short_help:"Error: wrong syntax\n");      return(DD_FALSE);    }  if (lines < 1)    {      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);  if (!rom)    return(DD_FALSE);  while (realstart < rom->size &&	 !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;	}    }    while (lines)    {      uc->print_disass(realstart, con);      realstart= (realstart+1) % rom->size;      while (!uc->inst_at(realstart))	realstart= (realstart+1) % rom->size;      lines--;    }  disass_last_stop= realstart;  return(DD_FALSE);;}/* * Command: fill *---------------------------------------------------------------------------- *///int//cl_fill_cmd::do_work(class cl_sim *sim,//		     class cl_cmdline *cmdline, class cl_console *con)COMMAND_DO_WORK_UC(cl_fill_cmd){  class cl_mem *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) };  if (cmdline->syntax_match(uc, MEMORY ADDRESS ADDRESS NUMBER)) {    mem  = params[0]->value.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);      }  }  else    con->dd_printf("%s\n", short_help?short_help:"Error: wrong syntax\n");  return(DD_FALSE);;}/* * Command: where *---------------------------------------------------------------------------- */intcl_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_cmd_arg *params[2]= { cmdline->param(0),				 cmdline->param(1) };  if (cmdline->syntax_match(uc, MEMORY DATALIST)) {    mem= params[0]->value.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);      }    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);      }  }  else    con->dd_printf("%s\n", short_help?short_help:"Error: wrong syntax\n");  return(DD_FALSE);}//int//cl_where_cmd::do_work(class cl_sim *sim,//		      class cl_cmdline *cmdline, class cl_console *con)COMMAND_DO_WORK_UC(cl_where_cmd){  return(do_real_work(uc, cmdline, con, DD_FALSE));}//int//cl_Where_cmd::do_work(class cl_sim *sim,//		      class cl_cmdline *cmdline, class cl_console *con)COMMAND_DO_WORK_UC(cl_Where_cmd){  return(do_real_work(uc, cmdline, con, DD_TRUE));}/* End of cmd.src/cmduc.cc */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -