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

📄 inst_gen.cc

📁 sdcc是为51等小型嵌入式cpu设计的c语言编译器支持数种不同类型的cpu
💻 CC
字号:
/* * Simulator of microcontrollers (inst_gen.cc) * this code pulled into various parts   of inst.cc with FUNC1 and FUNC2 defined as   various operations to implement ADD, ADDC, ... * * Copyright (C) 1999,2002 Drotos Daniel, Talker Bt. *  * To contact author send email to drdani@mazsola.iit.uni-miskolc.hu * Other contributors include: *   Karl Bongers karl@turbobit.com, *   Johan Knol  * *//* 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@*/  switch (operands) {    case REG_REG:      if (code & 0x0800) {  /* word op */        set_reg2( RI_F0,                  FUNC2( reg2(RI_F0), reg2(RI_0F) )                );      } else {        set_reg1( RI_F0,                  FUNC1( reg1(RI_F0), reg1(RI_0F) )                );      }    break;    case REG_IREGINC :    case REG_IREG:    {      short srcreg = reg2(RI_07);      if (code & 0x0800) {  /* word op */        set_reg2( RI_F0,                  FUNC2( reg2(RI_F0),                        get2(srcreg)                      )                );      } else {        set_reg1( RI_F0,                  FUNC1( reg1(RI_F0),                        get1(srcreg)                      )                );      }      if (operands == REG_IREGINC) {        set_reg2(RI_07,  srcreg+1);      }    }    break;    case IREGINC_REG :    case IREG_REG :    {      short addr = reg2(RI_07);      if (code & 0x0800) {  /* word op */        unsigned short wtmp, wtotal;        wtmp = get2(addr);        wtotal = FUNC2( wtmp, reg2(RI_F0) );        store2(addr, wtotal);      } else {        unsigned char total;        total = FUNC1( get1(addr), reg1(RI_F0) );        store1(addr, total);      }      if (operands == IREGINC_REG) {        set_reg2(RI_07, addr+1);      }    }    break;    case IREGOFF8_REG :    case IREGOFF16_REG :    {      int offset;      if (operands == IREGOFF8_REG) {        offset = (int)((char) fetch());      } else {        offset = (int)((short)fetch2());      }      if (code & 0x0800) {  /* word op */        t_mem addr = reg2(RI_07) + offset;        unsigned short wtotal;        wtotal = FUNC2( get2(addr), reg2(RI_F0) );        store2(addr, wtotal);      } else {        t_mem addr = reg2(RI_07) + offset;        unsigned char total;        total = FUNC1( get1(addr), reg1(RI_F0) );        store1(addr, total);      }    }    break;    case REG_IREGOFF8 :    case REG_IREGOFF16 :    {      int offset;      if (operands == REG_IREGOFF8) {        offset = (int)((char) fetch());      } else {        offset = (int)((short)fetch2());      }      if (code & 0x0800) {  /* word op */        set_reg2( RI_F0,                  FUNC2( reg2(RI_F0),                        get2(reg2(RI_07)+offset)                      )                );      } else {        set_reg1( RI_F0,                  FUNC1( reg1(RI_F0),                        get1(reg2(RI_07)+offset)                      )                );      }    }    break;    case DIRECT_REG :    {      int addr = ((code & 0x7) << 8) | fetch();      if (code & 0x0800) {  /* word op */        unsigned short wtmp = get_word_direct(addr);        set_word_direct( addr,                  FUNC2( wtmp, reg2(RI_F0) )                );      } else {        unsigned char tmp = get_byte_direct(addr);        set_byte_direct( addr,                  FUNC1( tmp, reg1(RI_F0) )                );      }    }    break;    case REG_DIRECT :    {      int addr = ((code & 0x7) << 8) | fetch();      if (code & 0x0800) {  /* word op */        set_reg2( RI_F0,                  FUNC2( reg2(RI_F0),                        get_word_direct(addr)                      )                );      } else {        set_reg1( RI_F0,                  FUNC1( reg1(RI_F0),                        get_byte_direct(addr)                      )                );      }    }    break;    case REG_DATA8 :#if 0      {        unsigned char dat = fetch();        unsigned char res;        res = FUNC1( reg1(RI_F0), dat);        set_reg1( RI_F0, res );   printf("reg_data8 code=%x dat=%x, res=%x r=%x\n", code, dat, res, reg1( RI_F0) );      }#endif      set_reg1( RI_F0, FUNC1( reg1(RI_F0), fetch()) );    break;    case REG_DATA16 :      {        unsigned short dat = fetch2();        set_reg2( RI_F0, FUNC2( reg2(RI_F0), dat) );      }    break;    case IREGINC_DATA8 :    case IREG_DATA8 :    {      unsigned char total;      unsigned char tmp;      t_mem addr = reg2(RI_70);      tmp = get1(addr);      total = FUNC1(tmp, fetch() );      store1(addr, total);      if (operands == IREGINC_DATA8) {        set_reg2(RI_70, addr+1);      }    }    break;    case IREGINC_DATA16 :    case IREG_DATA16 :    {      unsigned short total;      unsigned short tmp;      t_mem addr = reg2(RI_70);      tmp = get2(addr);      total = FUNC2(tmp, fetch2() );      store2(addr, total);      if (operands == IREGINC_DATA16) {        set_reg2(RI_70, addr+1);      }    }    break;    case IREGOFF8_DATA8 :    case IREGOFF16_DATA8 :    {      unsigned short addr;      int offset;      unsigned char tmp;      if (operands == IREGOFF8_DATA8) {        offset = (int)((char) fetch());      } else {        offset = (int)((short)fetch2());      }      tmp = fetch();      addr = reg2(RI_70);      store1( addr+offset,                  FUNC1( tmp,                        get1(addr+offset)                      )                );    }    break;    case IREGOFF8_DATA16 :    case IREGOFF16_DATA16 :    {      unsigned short addr;      int offset;      unsigned short tmp;      if (operands == IREGOFF8_DATA16) {        offset = (int)((char) fetch());      } else {        offset = (int)((short)fetch2());      }      tmp = fetch2();      addr = reg2(RI_70);      store2( addr+offset,                  FUNC2( tmp,                        get2(addr+offset)                      )                );    }    break;    case DIRECT_DATA8 :    {      int addr = ((code & 0x70) << 4) | fetch();      unsigned char bdir = get_byte_direct(addr);      unsigned char bdat = fetch();      set_byte_direct( addr,  FUNC1( bdir, bdat) );    }    break;    case DIRECT_DATA16 :    {      int addr = ((code & 0x70) << 4) | fetch();      unsigned short wdir = get_word_direct(addr);      unsigned short wdat = fetch2();      set_word_direct( addr,  FUNC2( wdir, wdat) );    }    break;  }

⌨️ 快捷键说明

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