📄 xacl.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 + -