X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=device%2Finclude%2Fmcs51%2Fcompiler.h;h=a21bc0fdda06a08a7df68151ebd0c92c269ae78d;hb=f6431c56845af81fc20774e0cfc3f4eac16f1d73;hp=149826dd4d179fc6285324195ff4d4f42061793f;hpb=976b6c5e009dbfffa9e8281f1af2b17a959de5ad;p=fw%2Fsdcc diff --git a/device/include/mcs51/compiler.h b/device/include/mcs51/compiler.h index 149826dd..a21bc0fd 100644 --- a/device/include/mcs51/compiler.h +++ b/device/include/mcs51/compiler.h @@ -1,171 +1,177 @@ -/** \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. - * SFR16X and SFR32X for 16 bit and 32 bit xdata registers are not defined - * to avoid portability issues because of compiler endianness. - * 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 - * - * SFRX (CPUCS, 0xE600); // Cypress FX2 Control and Status register in xdata memory at 0xE600 - * - * 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 SFRX(name, addr) xdata volatile unsigned char __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 SFRX(name, addr) volatile unsigned char xdata name _at_ 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 SFRX(name, addr) xdata at addr volatile unsigned char 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 SFRX(name, addr) __xdata __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 SFRX(name, addr) _xdat volatile unsigned char 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 SFRX(name, addr) volatile far 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 SFRX(name, addr) volatile unsigned char _xdata name _at 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 SFRX(name, addr) xdata 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 */ - -/** default - * unknown compiler - */ -#elif -# warning unknown compiler -# define SBIT(name, addr, bit) volatile bool name -# define SFR(name, addr) volatile unsigned char name -# define SFRX(name, addr) volatile unsigned char name -# define SFR16(name, addr) volatile unsigned short name -# define SFR16E(name, fulladdr) volatile unsigned short name -# define SFR32(name, fulladdr) volatile unsigned long name -# define SFR32E(name, fulladdr) volatile unsigned long name - -#endif - -#endif //COMPILER_H +/** \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. The compilers are identified by + * their unique predefined macros. See also: + * http://predef.sourceforge.net/precomp.html + * + * 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. + * SFR16X and SFR32X for 16 bit and 32 bit xdata registers are not defined + * to avoid portability issues because of compiler endianness. + * 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 + * + * SFRX (CPUCS, 0xE600); // Cypress FX2 Control and Status register in xdata memory at 0xE600 + * + * 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 SFRX(name, addr) xdata volatile unsigned char __at(addr) name +# define SFR16(name, addr) __sfr16 __at(((addr+1U)<<8) | addr) name +# define SFR16E(name, fulladdr) __sfr16 __at(fulladdr) name +# define SFR32(name, addr) __sfr32 __at(((addr+3UL)<<24) | ((addr+2UL)<<16) | ((addr+1UL)<<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 SFRX(name, addr) volatile unsigned char xdata name _at_ 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 SFRX(name, addr) xdata at addr volatile unsigned char 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 SFRX(name, addr) __xdata __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 SFRX(name, addr) _xdat volatile unsigned char name _at(addr) +#if _CC51 > 71 +# define SFR16(name, addr) _sfrword _little name _at(addr) +#else +# define SFR16(name, addr) /* not supported */ +#endif +# 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 SFRX(name, addr) volatile far 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 SFRX(name, addr) volatile unsigned char _xdata name _at 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 SFRX(name, addr) xdata 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 */ + +/** default + * unknown compiler + */ +#elif +# warning unknown compiler +# define SBIT(name, addr, bit) volatile bool name +# define SFR(name, addr) volatile unsigned char name +# define SFRX(name, addr) volatile unsigned char name +# define SFR16(name, addr) volatile unsigned short name +# define SFR16E(name, fulladdr) volatile unsigned short name +# define SFR32(name, fulladdr) volatile unsigned long name +# define SFR32E(name, fulladdr) volatile unsigned long name + +#endif + +#endif //COMPILER_H