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

📄 xacl.h

📁 sdcc是为51等小型嵌入式cpu设计的c语言编译器支持数种不同类型的cpu
💻 H
字号:
/* * Simulator of microcontrollers (xacl.h) * * Copyright (C) 1999,99 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 johan.knol@iduna.nl * *//* 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@*/#ifndef XACL_HEADER#define XACL_HEADER#include "uccl.h"#include "regsxa.h"/* * Base type of XA microcontrollers */class cl_xa: public cl_uc{public:  class cl_address_space *ram;  class cl_address_space *rom;  struct t_regs regs;  class cl_address_space *sfr, *iram;  // for now make it as simple as possible//  TYPE_UBYTE mem_direct[1024*2];//#ifndef WORDS_BIGENDIAN//  TYPE_UWORD *wmem_direct;  /* word pointer at mem_direct *///#endifpublic:  cl_xa(class cl_sim *asim);  virtual int init(void);  virtual char *id_string(void);  //virtual class cl_m *mk_mem(enum mem_class type, char *class_name);  //virtual t_addr get_mem_size(enum mem_class type);  virtual void mk_hw_elements(void);  virtual void make_memories(void);  virtual struct dis_entry *dis_tbl(void);  virtual struct name_entry *sfr_tbl(void);  virtual struct name_entry *bit_tbl(void);  virtual char *get_dir_name(short);  virtual char *get_bit_name(short);  virtual int inst_length(t_addr addr);  virtual int inst_branch(t_addr addr);  virtual int longest_inst(void);  virtual int get_disasm_info(t_addr addr,                       int *ret_len,                       int *ret_branch,                       int *immed_offset,                       int *parms,                       int *mnemonic);  virtual char *disass(t_addr addr, char *sep);  virtual void print_regs(class cl_console *con);  virtual int exec_inst(void);  virtual int get_reg(int word_flag, unsigned int index);  virtual void store1(t_addr addr, unsigned char val);  virtual void store2(t_addr addr, unsigned short val);  virtual unsigned char get1(t_addr addr);  virtual unsigned short get2(t_addr addr);  virtual bool get_bit(int bit);  virtual void set_bit(int bit, int value);#include "instcl.h"  private :   /* following are macros which get substituted for FUNC1() and FUNC2()      in the inst.cc to form the body of ADD,ADDC,SUB,XOR,... */  /* can I put these in the .cc file and still have them do the inline thing? */  /*-------------------------------------    add - flags changed:C,AC,V,N,Z.  |---------------------------------------*/  inline unsigned char add1(unsigned char dst, unsigned char src)  {    unsigned int result;    unsigned char flags;    flags = get_psw();    flags &= ~BIT_ALL; /* clear these bits */    result = dst + src;    if (result == 0) flags |= BIT_Z;    if (result > 0xff) flags |= BIT_C;    if (result & 0x80) flags |= BIT_N;    /* fixme: do AC, V */    set_psw(flags);    return (unsigned char) result;  }  inline unsigned short add2(unsigned short dst, unsigned short src)  {    unsigned int result;    unsigned char flags;    flags = get_psw();    flags &= ~BIT_ALL; /* clear these bits */    result = dst + src;    if (result == 0) flags |= BIT_Z;    if (result > 0xff) flags |= BIT_C;    if (result & 0x80) flags |= BIT_N;    /* fixme: do AC, V */    set_psw(flags);    return (unsigned short) result;  }  /*-------------------------------------    addc - flags changed:C,AC,V,N,Z.  |---------------------------------------*/  inline unsigned char addc1(unsigned char dst, unsigned char src)  {    unsigned int result;    unsigned char flags;    flags = get_psw();    if (flags & BIT_C) {      flags &= ~BIT_ALL; /* clear these bits */      result = dst + src + 1;    } else {      flags &= ~BIT_ALL; /* clear these bits */      result = dst + src;    }    if (result == 0) flags |= BIT_Z;    if (result > 0xff) flags |= BIT_C;    if (result & 0x80) flags |= BIT_N;    /* fixme: do AC, V */    set_psw(flags);    return (unsigned char) result;  }  inline unsigned short addc2(unsigned short dst, unsigned short src)  {    unsigned int result;    unsigned char flags;    flags = get_psw();    flags &= ~BIT_ALL; /* clear these bits */    if (flags & BIT_C) {      flags &= ~BIT_ALL; /* clear these bits */      result = dst + src + 1;    } else {      flags &= ~BIT_ALL; /* clear these bits */      result = dst + src;    }    if (result == 0) flags |= BIT_Z;    if (result > 0xff) flags |= BIT_C;    if (result & 0x80) flags |= BIT_N;    /* fixme: do AC, V */    set_psw(flags);    return (unsigned short) result;  }  /*-------------------------------------    sub - flags changed:C,AC,V,N,Z.  |---------------------------------------*/  inline unsigned char sub1(unsigned char dst, unsigned char src)  {    unsigned int result;    unsigned char flags;    flags = get_psw();    flags &= ~BIT_ALL; /* clear these bits */    result = dst - src;    if (result == 0) flags |= BIT_Z;    if (result > 0xff) flags |= BIT_C;    if (dst < src) flags |= BIT_N;    /* fixme: do AC, V */    set_psw(flags);    return (unsigned char) result;  }  inline unsigned short sub2(unsigned short dst, unsigned short src)  {    unsigned int result;    unsigned char flags;    flags = get_psw();    flags &= ~BIT_ALL; /* clear these bits */    result = dst - src;    if (result == 0) flags |= BIT_Z;    if (result > 0xff) flags |= BIT_C;    if (dst < src) flags |= BIT_N;    /* fixme: do AC, V */    set_psw(flags);    return (unsigned short) result;  }  /*-------------------------------------    subb - flags changed:C,AC,V,N,Z.  |---------------------------------------*/  inline unsigned char subb1(unsigned char dst, unsigned char src)  {    unsigned int result;    unsigned char flags;    flags = get_psw();    if (flags & BIT_C) {      flags &= ~BIT_ALL; /* clear these bits */      result = dst - src - 1;    } else {      flags &= ~BIT_ALL; /* clear these bits */      result = dst - src;    }    if (result == 0) flags |= BIT_Z;    if (result > 0xff) flags |= BIT_C;    if (dst < src) flags |= BIT_N;    /* fixme: do AC, V */    set_psw(flags);    return (unsigned char) result;  }  inline unsigned short subb2(unsigned short dst, unsigned short src)  {    unsigned int result;    unsigned char flags;    flags = get_psw();    flags &= ~BIT_ALL; /* clear these bits */    if (flags & BIT_C) {      flags &= ~BIT_ALL; /* clear these bits */      result = dst - src - 1;    } else {      flags &= ~BIT_ALL; /* clear these bits */      result = dst - src;    }    if (result == 0) flags |= BIT_Z;    if (result > 0xff) flags |= BIT_C;    if (dst < src) flags |= BIT_N;    /* fixme: do AC, V */    set_psw(flags);    return (unsigned short) result;  }  /*-------------------------------------    cmp - flags changed:C,AC,V,N,Z.  |---------------------------------------*/  inline unsigned char cmp1(unsigned char dst, unsigned char src)  {    unsigned int result;    unsigned char flags;    flags = get_psw();    flags &= ~BIT_ALL; /* clear these bits */    result = dst - src;    if (result == 0) flags |= BIT_Z;    if (result > 0xff) flags |= BIT_C;    if (dst < src) flags |= BIT_N;    /* fixme: do AC, V */    set_psw(flags);    return (unsigned char) dst;  }  inline unsigned short cmp2(unsigned short dst, unsigned short src)  {    unsigned int result;    unsigned char flags;    flags = get_psw();    flags &= ~BIT_ALL; /* clear these bits */    result = dst - src;    if (result == 0) flags |= BIT_Z;    if (result > 0xff) flags |= BIT_C;    if (dst < src) flags |= BIT_N;    /* fixme: do AC, V */    set_psw(flags);    return (unsigned short) dst;  }  /*-------------------------------------    and - flags changed:N,Z.  |---------------------------------------*/  inline unsigned char and1(unsigned char dst, unsigned char src)  {    unsigned int result;    unsigned char flags;    flags = get_psw() & ~(BIT_N | BIT_Z); /* clear these bits */    result = dst & src;    if (result == 0) flags |= BIT_Z;    if (result & 0x80) flags |= BIT_N;    set_psw(flags);    return (unsigned char) result;  }  inline unsigned short and2(unsigned short dst, unsigned short src)  {    unsigned int result;    unsigned char flags;    flags = get_psw() & ~(BIT_N | BIT_Z); /* clear these bits */    result = dst & src;    if (result == 0) flags |= BIT_Z;    if (result & 0x80) flags |= BIT_N;    set_psw(flags);    return (unsigned short) result;  }  /*-------------------------------------    or - flags changed:N,Z.  |---------------------------------------*/  inline unsigned char or1(unsigned char dst, unsigned char src)  {    unsigned int result;    unsigned char flags;    flags = get_psw() & ~(BIT_N | BIT_Z); /* clear these bits */    result = dst | src;    if (result == 0) flags |= BIT_Z;    if (result & 0x80) flags |= BIT_N;    set_psw(flags);    return (unsigned char) result;  }  inline unsigned short or2(unsigned short dst, unsigned short src)  {    unsigned int result;    unsigned char flags;    flags = get_psw() & ~(BIT_N | BIT_Z); /* clear these bits */    result = dst | src;    if (result == 0) flags |= BIT_Z;    if (result & 0x80) flags |= BIT_N;    set_psw(flags);    return (unsigned short) result;  }  /*-------------------------------------    xor - flags changed:N,Z.  |---------------------------------------*/  inline unsigned char xor1(unsigned char dst, unsigned char src)  {    unsigned char flags;    flags = get_psw() & ~(BIT_N | BIT_Z); /* clear these bits */    dst ^= src;    if (dst == 0) flags |= BIT_Z;    if (dst & 0x80) flags |= BIT_N;    set_psw(flags);    return (unsigned char) dst;  }  inline unsigned short xor2(unsigned short dst, unsigned short src)  {    unsigned char flags;    flags = get_psw() & ~(BIT_N | BIT_Z); /* clear these bits */    dst ^= src;    if (dst == 0) flags |= BIT_Z;    if (dst & 0x8000) flags |= BIT_N;    set_psw(flags);    return (unsigned short) dst;  }  /*-------------------------------------    mov - flags changed:N,Z.  |---------------------------------------*/  inline unsigned char mov1(unsigned char dst, unsigned char src)  {    unsigned char flags;    flags = get_psw() & ~(BIT_N | BIT_Z); /* clear these bits */    dst = src;    if (dst == 0) flags |= BIT_Z;    if (dst & 0x80) flags |= BIT_N;    set_psw(flags);    return (unsigned char) dst;  }  inline unsigned short mov2(unsigned short dst, unsigned short src)  {    unsigned char flags;    flags = get_psw() & ~(BIT_N | BIT_Z); /* clear these bits */    dst = src;    if (dst == 0) flags |= BIT_Z;    if (dst & 0x8000) flags |= BIT_N;    set_psw(flags);    return (unsigned short) dst;  }};#endif/* End of xa.src/xacl.h */

⌨️ 快捷键说明

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