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

📄 uc390hw.cc

📁 Small Device C Compiler 面向Inter8051
💻 CC
字号:
/* * Simulator of microcontrollers (serial.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>#include <stdlib.h>// local#include "uc390hwcl.h"#include "regs51.h"#include "uc51cl.h"cl_uc390_hw::cl_uc390_hw (class cl_uc *auc):  cl_hw (auc, HW_DUMMY, 0, "ds390hw"){  uc390 = (class t_uc390 *) uc;}intcl_uc390_hw::init(void){  class cl_mem *sfr;  sfr = uc->mem (MEM_SFR);  if (sfr)    {      /*cell_dps   = sfr->register_hw (DPS  , this, 0);      cell_p4cnt = sfr->register_hw (P4CNT, this, 0);      cell_exif  = sfr->register_hw (EXIF , this, 0);      cell_acon  = sfr->register_hw (ACON , this, 0);      cell_p5cnt = sfr->register_hw (P5CNT, this, 0);      cell_c0c   = sfr->register_hw (C0C  , this, 0);      cell_pmr   = sfr->register_hw (PMR  , this, 0);      cell_mcon  = sfr->register_hw (MCON , this, 0);      cell_ta    = sfr->register_hw (TA   , this, 0);      cell_cor   = sfr->register_hw (COR  , this, 0);      cell_mcnt0 = sfr->register_hw (MCNT0, this, 0);      cell_mcnt1 = sfr->register_hw (MCNT1, this, 0);      cell_ma    = sfr->register_hw (MA   , this, 0);      cell_mb    = sfr->register_hw (MB   , this, 0);      cell_mc    = sfr->register_hw (MC   , this, 0);      cell_wdcon = sfr->register_hw (WDCON, this, 0);      cell_c1c   = sfr->register_hw (C1C  , this, 0);*/      register_cell (sfr, DPS  , &cell_dps  , wtd_restore);      register_cell (sfr, P4CNT, &cell_p4cnt, wtd_restore);      register_cell (sfr, EXIF , &cell_exif , wtd_restore);      register_cell (sfr, ACON , &cell_acon , wtd_restore);      register_cell (sfr, P5CNT, &cell_p5cnt, wtd_restore);      register_cell (sfr, C0C  , &cell_c0c  , wtd_restore);      register_cell (sfr, PMR  , &cell_pmr  , wtd_restore);      register_cell (sfr, MCON , &cell_mcon , wtd_restore);      register_cell (sfr, TA   , &cell_ta   , wtd_restore);      register_cell (sfr, COR  , &cell_cor  , wtd_restore);      register_cell (sfr, MCNT0, &cell_mcnt0, wtd_restore);      register_cell (sfr, MCNT1, &cell_mcnt1, wtd_restore);      register_cell (sfr, MA   , &cell_ma   , wtd_restore);      register_cell (sfr, MB   , &cell_mb   , wtd_restore);      register_cell (sfr, MC   , &cell_mc   , wtd_restore);      register_cell (sfr, WDCON, &cell_wdcon, wtd_restore);      register_cell (sfr, C1C  , &cell_c1c  , wtd_restore);    }  return 0;}t_memcl_uc390_hw::read (class cl_cell *cell){  if (cell == cell_exif)    {      if (ctm_ticks &&          uc390->ticks->ticks >= ctm_ticks + 65535)	{	  ctm_ticks = 0;	  cell->set (cell->get() | 0x08); /* set CKRDY */	}    }  return cell->get();}voidcl_uc390_hw::write (class cl_cell *cell, t_mem *val){  if (cell == cell_dps)    *val = (*val & 0xe5) | 0x04;  else if (cell == cell_exif)    {      /* Bit 0 (BGS) is TA-protected */      if (timed_access_state != 2 ||          timed_access_ticks + 2*12 < uc390->ticks->ticks) // fixme: 3 cycles	*val = (*val & ~0x01) | (cell_exif->get() & 0x01);      /* CKRDY and RGMD are read-only */      *val = (*val & 0x0c) | (*val & ~0x0c);    }  else if (cell == cell_p4cnt)    {      /* P4CNT is TA-protected */      if (timed_access_state != 2 ||          timed_access_ticks + 2*12 < uc390->ticks->ticks) // fixme: 3 cycles        *val = cell_p4cnt->get();      *val |= 0x80; /* always 1 */    }  else if (cell == cell_acon)    {      /* ACON is TA-protected */      if (timed_access_state != 2 ||          timed_access_ticks + 2*12 < uc390->ticks->ticks) // fixme: 3 cycles        *val = cell_acon->get();      else	{	  /* lockout: IDM1:IDM0 and SA can't be set at the same time */	    if ((cell_mcon->get() & 0xc0) == 0xc0) /* IDM1 and IDM0 set? */	      *val &= ~0x04; /* lockout SA */	}      *val |= 0xf8; /* always 1 */    }  else if (cell == cell_p5cnt)    {      /* Bits 0...2 are TA-protected */      if (timed_access_state != 2 ||          timed_access_ticks + 2*12 < uc390->ticks->ticks) // fixme: 3 cycles	*val = (*val & ~0x07) | (cell_p5cnt->get() & 0x07);    }  else if (cell == cell_c0c)    {      /* Bit 3 (CRST) is TA-protected */      if (timed_access_state != 2 ||          timed_access_ticks + 2*12 < uc390->ticks->ticks) // fixme: 3 cycles	*val = (*val & ~0x08) | (cell_c0c->get() & 0x08);    }  else if (cell == cell_pmr)    {      /* fixme: check previous state */      if ((*val & 0xd0) == 0x90) /* CD1:CD0 set to 10, CTM set */        {	  ctm_ticks = uc390->ticks->ticks;	  cell_exif->set (cell_exif->get() & ~0x08); /* clear CKRDY */        }      else        ctm_ticks = 0;      *val |= 0x03; /* always 1 */    }  else if (cell == cell_mcon)    {      /* MCON is TA-protected */      if (timed_access_state != 2 ||          timed_access_ticks + 2*12 < uc390->ticks->ticks) // fixme: 3 cycles	*val = cell_mcon->get();      else        /* lockout: IDM1:IDM0 and SA can't be set at the same time */        if ((cell_acon->get() & 0x04) == 0x04) /* SA set? */          *val &= ~0xc0; /* lockout IDM1:IDM0 */      *val |= 0x10; /* always 1 */    }  else if (cell == cell_ta)    {      if (*val == 0xAA)        {          timed_access_state = 1;          timed_access_ticks = uc390->ticks->ticks;        }      else if (*val == 0x55 &&               timed_access_state == 1 &&               timed_access_ticks + 2*12 >= uc390->ticks->ticks) // fixme: 3 cycles        {          timed_access_state = 2;          timed_access_ticks = uc390->ticks->ticks;        }      else        timed_access_state = 0;    }  else if (cell == cell_cor)    {      /* COR is TA-protected */      if (timed_access_state != 2 ||          timed_access_ticks + 2*12 < uc390->ticks->ticks) // fixme: 3 cycles	*val = cell_cor->get();    }  else if (cell == cell_mcnt0)    {      ;    }  else if (cell == cell_mcnt1)    {      *val |= 0x0f; /* always 1 */    }  else if (cell == cell_ma)    {      ;    }  else if (cell == cell_mb)    {      ;    }  else if (cell == cell_mc)    {      ;    }  else if (cell == cell_wdcon)    {      /* Bits 0, 1, 3 and 6 are TA-protected */      if (timed_access_state != 2 ||          timed_access_ticks + 2*12 < uc390->ticks->ticks) // fixme: 3 cycles	*val = (*val & ~0x4b) | (cell_wdcon->get() & 0x4b);    }  else if (cell == cell_c1c)    {      /* Bit 3 (CRST) is TA-protected */      if (timed_access_state != 2 ||          timed_access_ticks + 2*12 < uc390->ticks->ticks) // fixme: 3 cycles	*val = (*val & ~0x08) | (cell_c1c->get() & 0x08);    }}/*voidcl_uc390_hw::mem_cell_changed (class cl_mem *mem, t_addr addr){  class cl_mem *sfr = uc->mem (MEM_SFR);  if (mem && sfr && mem == sfr)    switch (addr)      {	case DPS:   cell_dps   = sfr->get_cell (DPS);   break;	case P4CNT: cell_p4cnt = sfr->get_cell (P4CNT); break;	case EXIF:  cell_exif  = sfr->get_cell (EXIF);  break;	case ACON:  cell_acon  = sfr->get_cell (ACON);  break;	case P5CNT: cell_p5cnt = sfr->get_cell (P5CNT); break;	case C0C:   cell_c0c   = sfr->get_cell (C0C);   break;	case PMR:   cell_pmr   = sfr->get_cell (PMR);   break;	case MCON:  cell_mcon  = sfr->get_cell (MCON);  break;	case TA:    cell_ta    = sfr->get_cell (TA);    break;	case COR:   cell_cor   = sfr->get_cell (COR);   break;	case MCNT0: cell_mcnt0 = sfr->get_cell (MCNT0); break;	case MCNT1: cell_mcnt1 = sfr->get_cell (MCNT1); break;	case MA:    cell_ma    = sfr->get_cell (MA);    break;	case MB:    cell_mb    = sfr->get_cell (MB);    break;	case MC:    cell_mc    = sfr->get_cell (MC);    break;	case WDCON: cell_wdcon = sfr->get_cell (WDCON); break;	case C1C:   cell_c1c   = sfr->get_cell (C1C);   break;      }}*/voidcl_uc390_hw::reset(void){  ctm_ticks = 0;  timed_access_state = 0;}voidcl_uc390_hw::print_info(class cl_console *con){  int i;  long l;  i = uc->get_mem (MEM_SFR, EXIF);  con->dd_printf ("%s"                  " EXIF 0x%02x: IE5 %c IE4 %c IE3 %c IE2 %c CKRDY %c RGMD %c RGSL %c BGS %c\n",                  id_string,		  i,                  (i & 0x80) ? '1' : '0',                  (i & 0x40) ? '1' : '0',                  (i & 0x20) ? '1' : '0',                  (i & 0x10) ? '1' : '0',                  (i & 0x08) ? '1' : '0',                  (i & 0x04) ? '1' : '0',                  (i & 0x02) ? '1' : '0',                  (i & 0x01) ? '1' : '0');  i = uc->get_mem (MEM_SFR, DPS);  con->dd_printf ("\tDPS  0x%02x: ID1 %c ID0 %c TSL %c SEL %c\n",		  i,                  (i & 0x80) ? '1' : '0',                  (i & 0x40) ? '1' : '0',                  (i & 0x20) ? '1' : '0',                  (i & 0x01) ? '1' : '0');  l = uc->get_mem (MEM_SFR, DPX) * 256*256 +      uc->get_mem (MEM_SFR, DPH) * 256 +      uc->get_mem (MEM_SFR, DPL);  con->dd_printf ("\tDPTR  0x%06x\n", l);  l = uc->get_mem (MEM_SFR, DPX1) * 256*256 +      uc->get_mem (MEM_SFR, DPH1) * 256 +      uc->get_mem (MEM_SFR, DPL1);  con->dd_printf ("\tDPTR1 0x%06x\n", l);}/* End of s51.src/uc390hw.cc */

⌨️ 快捷键说明

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