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

📄 uc51r.cc

📁 sdcc是为51等小型嵌入式cpu设计的c语言编译器支持数种不同类型的cpu
💻 CC
字号:
/* * Simulator of microcontrollers (uc51r.cc) * * Copyright (C) 1999,99 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@*/#include "ddconfig.h"#include <stdio.h>// local#include "uc51rcl.h"#include "regs51.h"#include "types51.h"#include "wdtcl.h"/* * Making an 8051r CPU object */cl_uc51r::cl_uc51r(int Itype, int Itech, class cl_sim *asim):  cl_uc52(Itype, Itech, asim){  /*  int i;  for (i= 0; i < ERAM_SIZE; i++)  ERAM[i]= 0;*/  clock_out= 0;}voidcl_uc51r::mk_hw_elements(void){  class cl_hw *h;  cl_uc52::mk_hw_elements();  hws->add(h= new cl_wdt(this, 0x3fff));  h->init();  hws->add(h= new cl_uc51r_dummy_hw(this));  h->init();}voidcl_uc51r::make_memories(void){  class cl_address_space *as;  rom= as= new cl_address_space("rom", 0, 0x10000, 8);  as->init();  address_spaces->add(as);  iram= as= new cl_address_space("iram", 0, 0x100, 8);  as->init();  address_spaces->add(as);  sfr= as= new cl_address_space("sfr", 0x80, 0x80, 8);  as->init();  address_spaces->add(as);  xram= as= new cl_address_space("xram", 0, 0x10000, 8);  as->init();  address_spaces->add(as);  class cl_address_decoder *ad;  class cl_memory_chip *chip;  chip= new cl_memory_chip("rom_chip", 0x10000, 8);  chip->init();  memchips->add(chip);  ad= new cl_address_decoder(as= address_space("rom"), chip, 0, 0xffff, 0);  ad->init();  as->decoders->add(ad);  ad->activate(0);  chip= new cl_memory_chip("iram_chip", 0x100, 8);  chip->init();  memchips->add(chip);  ad= new cl_address_decoder(as= address_space("iram"), chip, 0, 0xff, 0);  ad->init();  as->decoders->add(ad);  ad->activate(0);  chip= new cl_memory_chip("xram_chip", 0x10000, 8);  chip->init();  memchips->add(chip);  ad= new cl_address_decoder(as= address_space("xram"), chip, 0, 0xffff, 0);  ad->init();  as->decoders->add(ad);  ad->activate(0);  chip= new cl_memory_chip("eram_chip", 0x100, 8);  chip->init();  memchips->add(chip);  chip= new cl_memory_chip("sfr_chip", 0x80, 8);  chip->init();  memchips->add(chip);  ad= new cl_address_decoder(as= address_space("sfr"), chip, 0x80, 0xff, 0);  ad->init();  as->decoders->add(ad);  ad->activate(0);  acc= sfr->get_cell(ACC);  psw= sfr->get_cell(PSW);}/* * Resetting of the microcontroller * * Original method is extended with handling of WDT. */voidcl_uc51r::reset(void){  cl_uc52::reset();  sfr->write(SADDR, 0);  sfr->write(SADEN, 0);  sfr->write(AUXR, 0);}voidcl_uc51r::clear_sfr(void){  cl_uc52::clear_sfr();  sfr->write(SADDR, 0);  sfr->write(SADEN, 0);  sfr->write(AUXR, 0);  sfr->write(IPH, 0);}voidcl_uc51r::received(int c){  t_mem br= sfr->get(SADDR) | sfr->get(SADEN);  int scon= sfr->get(SCON);  if ((0 < scon >> 6) &&      (scon & bmSM2))    {      if (/* Check for individual address */	  ((sfr->get(SADDR) & sfr->get(SADEN)) == (c & sfr->get(SADEN)))	  ||	  /* Check for broadcast address */	  (br == (br & c)))	sfr->set_bit1(SCON, bmRI);      return;    }  sfr->set_bit1(SCON, bmRI);}/* */cl_uc51r_dummy_hw::cl_uc51r_dummy_hw(class cl_uc *auc):  cl_hw(auc, HW_DUMMY, 0, "_51r_dummy"){}intcl_uc51r_dummy_hw::init(void){  class cl_address_space *sfr= uc->address_space(MEM_SFR_ID);  if (!sfr)    {      fprintf(stderr, "No SFR to register %s[%d] into\n", id_string, id);    }  //use_cell(sfr, PSW, &cell_psw, wtd_restore);  register_cell(sfr, AUXR, &cell_auxr, wtd_restore);  return(0);}voidcl_uc51r_dummy_hw::write(class cl_memory_cell *cell, t_mem *val){  if (cell == cell_auxr)    {      class cl_address_space *xram= uc->address_space(MEM_XRAM_ID);      class cl_memory_chip *eram=	dynamic_cast<class cl_memory_chip *>(uc->memory("eram_chip"));      class cl_address_decoder *d;      if (eram &&	  xram)	{	  if (*val & bmEXTRAM)	    d= new cl_address_decoder(xram, uc->memory("xram_chip"), 0,0xff,0);	  else	    d= new cl_address_decoder(xram, eram, 0, 0xff, 0);	  d->init();	  xram->decoders->add(d);	  d->activate(0);	}    }  /*else if (cell == cell_pcon)    {      printf("PCON write 0x%x (PC=0x%x)\n", *val, uc->PC);      uc->sim->stop(0);      }*/}/*voidcl_uc51r_dummy_hw::happen(class cl_hw *where, enum hw_event he, void *params){  struct ev_port_changed *ep= (struct ev_port_changed *)params;  if (where->cathegory == HW_PORT &&      he == EV_PORT_CHANGED &&      ep->id == 3)    {      t_mem p3o= ep->pins & ep->prev_value;      t_mem p3n= ep->new_pins & ep->new_value;      if ((p3o & bm_INT0) &&	  !(p3n & bm_INT0))	uc51->p3_int0_edge++;      if ((p3o & bm_INT1) &&	  !(p3n & bm_INT1))	uc51->p3_int1_edge++;    }}*//* End of s51.src/uc51r.cc */

⌨️ 快捷键说明

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