diff options
| author | Xavier ASUS <xavi92psx@gmail.com> | 2019-10-18 00:31:54 +0200 |
|---|---|---|
| committer | Xavier ASUS <xavi92psx@gmail.com> | 2019-10-18 00:31:54 +0200 |
| commit | 268a53de823a6750d6256ee1fb1e7707b4b45740 (patch) | |
| tree | 42c1799a9a82b2f7d9790ee9fe181d72a7274751 /sim/ucsim/xa.src/xacl.h | |
| download | sdcc-gas-268a53de823a6750d6256ee1fb1e7707b4b45740.tar.gz | |
sdcc-3.9.0 fork implementing GNU assembler syntax
This fork aims to provide better support for stm8-binutils
Diffstat (limited to 'sim/ucsim/xa.src/xacl.h')
| -rw-r--r-- | sim/ucsim/xa.src/xacl.h | 400 |
1 files changed, 400 insertions, 0 deletions
diff --git a/sim/ucsim/xa.src/xacl.h b/sim/ucsim/xa.src/xacl.h new file mode 100644 index 0000000..c1ee5ce --- /dev/null +++ b/sim/ucsim/xa.src/xacl.h @@ -0,0 +1,400 @@ +/* + * 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 modify +it under the terms of the GNU General Public License as published by +the 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 of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with UCSIM; see the file COPYING. If not, write to the Free +Software Foundation, 59 Temple Place - Suite 330, Boston, MA +02111-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 */ +//#endif + +public: + 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, const char *sep); + virtual void print_regs(class cl_console_base *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 */ |
