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

📄 cmdmem.cc

📁 sdcc是为51等小型嵌入式cpu设计的c语言编译器支持数种不同类型的cpu
💻 CC
字号:
/* * Simulator of microcontrollers (cmd.src/cmdmem.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#include "simcl.h"// local#include "cmdmemcl.h"/* * Command: memory createchip *---------------------------------------------------------------------------- *///int//cl_conf_addmem_cmd::do_work(class cl_sim *sim,//			    class cl_cmdline *cmdline, class cl_console *con)COMMAND_DO_WORK_UC(cl_memory_createchip_cmd){  class cl_cmd_arg *params[4]= { cmdline->param(0),				 cmdline->param(1),				 cmdline->param(2),				 cmdline->param(3) };  char *memid= NULL;  int size= -1;  int width= 8;  if (cmdline->syntax_match(uc, STRING NUMBER)) {    memid= params[0]->value.string.string;    size= params[1]->value.number;  }  else if (cmdline->syntax_match(uc, STRING NUMBER NUMBER)) {    memid= params[0]->value.string.string;    size= params[1]->value.number;    width= params[2]->value.number;  }  else    con->dd_printf("Syntax error.\n");  if (!memid ||      !*memid)    con->dd_printf("Wrong id\n");  else if (size < 1)    con->dd_printf("Wrong size\n");  else    {      class cl_memory *mem= new cl_memory_chip(memid, size, width);      mem->init();      uc->memchips->add(mem);      mem->set_uc(uc);    }  return(DD_FALSE);}/* * Command: memory createaddressspace *---------------------------------------------------------------------------- *///int//cl_conf_addmem_cmd::do_work(class cl_sim *sim,//			    class cl_cmdline *cmdline, class cl_console *con)COMMAND_DO_WORK_UC(cl_memory_createaddressspace_cmd){  class cl_cmd_arg *params[4]= { cmdline->param(0),				 cmdline->param(1),				 cmdline->param(2),				 cmdline->param(3) };  char *memid= NULL;  int start= 0, size= -1, width= 8;  if (cmdline->syntax_match(uc, STRING NUMBER)) {    memid= params[0]->value.string.string;    size= params[1]->value.number;  }  else if (cmdline->syntax_match(uc, STRING NUMBER NUMBER)) {    memid= params[0]->value.string.string;    start= params[1]->value.number;    size= params[2]->value.number;  }  else if (cmdline->syntax_match(uc, STRING NUMBER NUMBER NUMBER)) {    memid= params[0]->value.string.string;    start= params[1]->value.number;    size= params[2]->value.number;    width= params[3]->value.number;  }  else    con->dd_printf("Syntax error.\n");  if (!memid ||      !*memid)    con->dd_printf("Wrong id\n");  else if (size < 1)    con->dd_printf("Wrong size\n");  else    {      class cl_address_space *mem=	new cl_address_space(memid, start, size, width);      mem->init();      uc->address_spaces->add(mem);      mem->set_uc(uc);    }  return(DD_FALSE);}/* * Command: memory createaddressdecoder *---------------------------------------------------------------------------- *///int//cl_conf_addmem_cmd::do_work(class cl_sim *sim,//			    class cl_cmdline *cmdline, class cl_console *con)COMMAND_DO_WORK_UC(cl_memory_createaddressdecoder_cmd){  class cl_cmd_arg *params[5]= { cmdline->param(0),				 cmdline->param(1),				 cmdline->param(2),				 cmdline->param(3),				 cmdline->param(4) };  class cl_memory *as= 0, *chip= 0;  t_addr as_begin= 0, as_end= 0, chip_begin= 0;    if (cmdline->syntax_match(uc, MEMORY MEMORY)) {    as= params[0]->value.memory.memory;    as_end= as->highest_valid_address();    chip= params[1]->value.memory.memory;  }  else if (cmdline->syntax_match(uc, MEMORY MEMORY NUMBER)) {    as= params[0]->value.memory.memory;    as_end= as->highest_valid_address();    chip= params[1]->value.memory.memory;    chip_begin= params[2]->value.number;  }  else if (cmdline->syntax_match(uc, MEMORY NUMBER MEMORY)) {    as= params[0]->value.memory.memory;    as_begin= params[1]->value.number;    as_end= as->highest_valid_address();    chip= params[2]->value.memory.memory;  }  else if (cmdline->syntax_match(uc, MEMORY NUMBER MEMORY NUMBER)) {    as= params[0]->value.memory.memory;    as_begin= params[1]->value.number;    as_end= as->highest_valid_address();    chip= params[2]->value.memory.memory;    chip_begin= params[3]->value.number;  }  else if (cmdline->syntax_match(uc, MEMORY NUMBER NUMBER MEMORY)) {    as= params[0]->value.memory.memory;    as_begin= params[1]->value.number;    as_end= params[2]->value.number;    chip= params[3]->value.memory.memory;  }  else if (cmdline->syntax_match(uc, MEMORY NUMBER NUMBER MEMORY NUMBER)) {    as= params[0]->value.memory.memory;    as_begin= params[1]->value.number;    as_end= params[2]->value.number;    chip= params[3]->value.memory.memory;    chip_begin= params[4]->value.number;  }  else    con->dd_printf("Syntax error.\n");  if (!as->is_address_space())    con->dd_printf("%s is not an address space\n", as->get_name("unknown"));  else if (!chip->is_chip())    con->dd_printf("%s is not a memory chip\n", chip->get_name("unknown"));  else if (as_begin > as_end)    con->dd_printf("Wrong address area specification\n");  else if (chip_begin >= chip->get_size())    con->dd_printf("Wrong chip area specification\n");  else if (as_begin < as->start_address ||	   as_end >= as->highest_valid_address())    con->dd_printf("Specified area is out of address space\n");  else if (as_end-as_begin > chip->get_size()-chip_begin)    con->dd_printf("Specified area is out of chip size\n");  else    {      class cl_address_decoder *d=	new cl_address_decoder(as, chip, as_begin, as_end, chip_begin);      ((class cl_address_space *)as)->decoders->add(d);      d->activate(con);    }  return(DD_FALSE);}/* End of cmd.src/cmdmem.cc */

⌨️ 快捷键说明

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