From fbce3b5dc99c2dae3e30bcc55a49a20a8fc4e149 Mon Sep 17 00:00:00 2001 From: MaartenBrock Date: Fri, 9 Jun 2006 23:16:10 +0000 Subject: [PATCH] * device/include/mcs51/compiler.h: new, added header file to enable creating common sfr definition header files for different compilers git-svn-id: https://sdcc.svn.sourceforge.net/svnroot/sdcc/trunk/sdcc@4210 4a8a32a2-be11-0410-ad9d-d568d2c75423 --- ChangeLog | 5 + device/include/mcs51/compiler.h | 156 ++++++++++++++++++++++++++++++++ 2 files changed, 161 insertions(+) create mode 100644 device/include/mcs51/compiler.h diff --git a/ChangeLog b/ChangeLog index d4565648..c92c3a1a 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2006-06-10 Maarten Brock + + * device/include/mcs51/compiler.h: new, added header file to enable + creating common sfr definition header files for different compilers + 2006-06-05 Raphael Neider * src/pic16/{pcode.h,genarith.c}: diff --git a/device/include/mcs51/compiler.h b/device/include/mcs51/compiler.h new file mode 100644 index 00000000..3886d7ae --- /dev/null +++ b/device/include/mcs51/compiler.h @@ -0,0 +1,156 @@ +/** \file compiler.h + * \author Maarten Brock + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * In other words, you are welcome to use, share and improve this program. + * You are forbidden to forbid anyone else to use, share and improve + * what you give them. Help stamp out software-hoarding! + * + * Header file to overcome 8051 compiler differences for specifying + * special function registers. The following compilers are supported: + * SDCC, Keil, Raisonance, IAR, Hi-Tech, Tasking, Crossware, Wickenhäuser. + * Unfortunately not for use with Dunfield. + * + * SBIT and SFR define special bit and special function registers at the given + * address. SFR16 and SFR32 define sfr combinations at adjacent addresses in + * little-endian format. SFR16E and SFR32E define sfr combinations without + * prerequisite byte order or adjacency. None of these multi-byte sfr + * combinations will guarantee the order in which they are accessed when read + * or written. + * This file is to be included in every microcontroller specific header file. + * Example: + * + * // my_mcu.h: sfr definitions for my mcu + * #include + * + * SBIT (P0_1, 0x80, 1); // Port 0 pin 1 + * + * SFR (P0, 0x80); // Port 0 + * + * SFR16 (TMR2, 0xCC); // Timer 2, lsb at 0xCC, msb at 0xCD + * + * SFR16E(TMR0, 0x8C8A); // Timer 0, lsb at 0x8A, msb at 0x8C + * + * SFR32 (MAC0ACC, 0x93); // SiLabs C8051F120 32 bits MAC0 Accumulator, lsb at 0x93, msb at 0x96 + * + * SFR32E(SUMR, 0xE5E4E3E2); // TI MSC1210 SUMR 32 bits Summation register, lsb at 0xE2, msb at 0xE5 + */ + +#ifndef COMPILER_H +#define COMPILER_H + +/** SDCC - Small Device C Compiler + * http://sdcc.sf.net + */ +#if defined SDCC +# define SBIT(name, addr, bit) __sbit __at(addr+bit) name +# define SFR(name, addr) __sfr __at(addr) name +# define SFR16(name, addr) __sfr16 __at(((addr+1)<<8) | addr) name +# define SFR16E(name, fulladdr) __sfr16 __at(fulladdr) name +# define SFR32(name, addr) __sfr32 __at(((addr+3)<<24) | ((addr+2)<<16) | ((addr+1)<<8) | addr) name +# define SFR32E(name, fulladdr) __sfr32 __at(fulladdr) name + +/** Keil C51 + * http://www.keil.com + */ +#elif defined __CX51__ +# define SBIT(name, addr, bit) sbit name = addr^bit +# define SFR(name, addr) sfr name = addr +# define SFR16(name, addr) sfr16 name = addr +# define SFR16E(name, fulladdr) /* not supported */ +# define SFR32(name, fulladdr) /* not supported */ +# define SFR32E(name, fulladdr) /* not supported */ + +/** Raisonance + * http://www.raisonance.com + */ +#elif defined __RC51__ +# define SBIT(name, addr, bit) at (addr+bit) sbit name +# define SFR(name, addr) sfr at addr name +# define SFR16(name, addr) sfr16 at addr name +# define SFR16E(name, fulladdr) /* not supported */ +# define SFR32(name, fulladdr) /* not supported */ +# define SFR32E(name, fulladdr) /* not supported */ + +/** IAR 8051 + * http://www.iar.com + */ +#elif defined __ICC8051__ +# define SBIT(name, addr, bit) __bit __no_init volatile bool name @ (addr+bit) +# define SFR(name, addr) __sfr __no_init volatile unsigned char name @ addr +# define SFR16(name, addr) __sfr __no_init volatile unsigned int name @ addr +# define SFR16E(name, fulladdr) /* not supported */ +# define SFR32(name, fulladdr) __sfr __no_init volatile unsigned long name @ addr +# define SFR32E(name, fulladdr) /* not supported */ + +/** Tasking / Altium + * http://www.altium.com/tasking + */ +#elif defined _CC51 +# define SBIT(name, addr, bit) _sfrbit name _at(addr+bit) +# define SFR(name, addr) _sfrbyte name _at(addr) +# define SFR16(name, addr) /* not supported */ +# define SFR16E(name, fulladdr) /* not supported */ +# define SFR32(name, fulladdr) /* not supported */ +# define SFR32E(name, fulladdr) /* not supported */ + +/** Hi-Tech 8051 + * http://www.htsoft.com + */ +#elif defined HI_TECH_C +# define SBIT(name, addr, bit) volatile bit name @ (addr+bit) +# define SFR(name, addr) volatile unsigned char name @ addr +# define SFR16(name, addr) /* not supported */ +# define SFR16E(name, fulladdr) /* not supported */ +# define SFR32(name, fulladdr) /* not supported */ +# define SFR32E(name, fulladdr) /* not supported */ + +/** Crossware + * http://www.crossware.com + */ +#elif defined _XC51_VER +# define SBIT(name, addr, bit) _sfrbit name = (addr+bit) +# define SFR(name, addr) _sfr name = addr +# define SFR16(name, addr) _sfrword name = addr +# define SFR16E(name, fulladdr) /* not supported */ +# define SFR32(name, fulladdr) /* not supported */ +# define SFR32E(name, fulladdr) /* not supported */ + +/** Wickenhäuser + * http://www.wickenhaeuser.de + */ +#elif defined __UC__ +# define SBIT(name, addr, bit) unsigned char bit name @ (addr+bit) +# define SFR(name, addr) near unsigned char name @ addr +# define SFR16(name, addr) /* not supported */ +# define SFR16E(name, fulladdr) /* not supported */ +# define SFR32(name, fulladdr) /* not supported */ +# define SFR32E(name, fulladdr) /* not supported */ + +/** default + * unknown compiler + */ +#elif +# define SBIT(name, addr, bit) volatile bool +# define SFR(name, addr) volatile unsigned char +# define SFR16(name, addr) volatile short +# define SFR16E(name, fulladdr) volatile short +# define SFR32(name, fulladdr) volatile int +# define SFR32E(name, fulladdr) volatile int + +#endif + +#endif //COMPILER_H -- 2.47.2