* device/include/mcs51/compiler.h: added SFRX for xdata based special
[fw/sdcc] / device / include / mcs51 / compiler.h
1 /** \file compiler.h\r
2   * \author Maarten Brock\r
3   *\r
4   * This library is free software; you can redistribute it and/or\r
5   * modify it under the terms of the GNU Lesser General Public\r
6   * License as published by the Free Software Foundation; either\r
7   * version 2.1 of the License, or (at your option) any later version.\r
8   *\r
9   * This library is distributed in the hope that it will be useful,\r
10   * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
11   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\r
12   * Lesser General Public License for more details.\r
13   *\r
14   * You should have received a copy of the GNU Lesser General Public\r
15   * License along with this library; if not, write to the Free Software\r
16   * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA\r
17   *\r
18   * In other words, you are welcome to use, share and improve this program.\r
19   * You are forbidden to forbid anyone else to use, share and improve\r
20   * what you give them. Help stamp out software-hoarding!\r
21   *\r
22   * Header file to overcome 8051 compiler differences for specifying\r
23   * special function registers. The following compilers are supported:\r
24   * SDCC, Keil, Raisonance, IAR, Hi-Tech, Tasking, Crossware, Wickenhäuser.\r
25   * Unfortunately not for use with Dunfield.\r
26   *\r
27   * SBIT and SFR define special bit and special function registers at the given\r
28   * address. SFR16 and SFR32 define sfr combinations at adjacent addresses in\r
29   * little-endian format. SFR16E and SFR32E define sfr combinations without\r
30   * prerequisite byte order or adjacency. None of these multi-byte sfr\r
31   * combinations will guarantee the order in which they are accessed when read\r
32   * or written.\r
33   * SFR16X and SFR32X for 16 bit and 32 bit xdata registers are not defined\r
34   * to avoid portability issues because of compiler endianness.\r
35   * This file is to be included in every microcontroller specific header file.\r
36   * Example:\r
37   *\r
38   * // my_mcu.h: sfr definitions for my mcu\r
39   * #include <compiler.h>\r
40   *\r
41   * SBIT  (P0_1, 0x80, 1);      // Port 0 pin 1\r
42   *\r
43   * SFR   (P0, 0x80);           // Port 0\r
44   *\r
45   * SFRX  (CPUCS, 0xE600);      // Cypress FX2 Control and Status register in xdata memory at 0xE600\r
46   *\r
47   * SFR16 (TMR2, 0xCC);         // Timer 2, lsb at 0xCC, msb at 0xCD\r
48   *\r
49   * SFR16E(TMR0, 0x8C8A);       // Timer 0, lsb at 0x8A, msb at 0x8C\r
50   *\r
51   * SFR32 (MAC0ACC, 0x93);      // SiLabs C8051F120 32 bits MAC0 Accumulator, lsb at 0x93, msb at 0x96\r
52   *\r
53   * SFR32E(SUMR, 0xE5E4E3E2);   // TI MSC1210 SUMR 32 bits Summation register, lsb at 0xE2, msb at 0xE5\r
54   *\r
55  */\r
56 \r
57 #ifndef COMPILER_H\r
58 #define COMPILER_H\r
59 \r
60 /** SDCC - Small Device C Compiler\r
61   * http://sdcc.sf.net\r
62  */\r
63 #if defined SDCC\r
64 # define SBIT(name, addr, bit)  __sbit  __at(addr+bit)                  name\r
65 # define SFR(name, addr)        __sfr   __at(addr)                      name\r
66 # define SFRX(name, addr)       xdata volatile unsigned char __at(addr) name\r
67 # define SFR16(name, addr)      __sfr16 __at(((addr+1)<<8) | addr)      name\r
68 # define SFR16E(name, fulladdr) __sfr16 __at(fulladdr)                  name\r
69 # define SFR32(name, addr)      __sfr32 __at(((addr+3)<<24) | ((addr+2)<<16) | ((addr+1)<<8) | addr) name\r
70 # define SFR32E(name, fulladdr) __sfr32 __at(fulladdr)                  name\r
71 \r
72 /** Keil C51\r
73   * http://www.keil.com\r
74  */\r
75 #elif defined __CX51__\r
76 # define SBIT(name, addr, bit)  sbit  name = addr^bit\r
77 # define SFR(name, addr)        sfr   name = addr\r
78 # define SFRX(name, addr)       volatile unsigned char xdata name _at_ addr\r
79 # define SFR16(name, addr)      sfr16 name = addr\r
80 # define SFR16E(name, fulladdr) /* not supported */\r
81 # define SFR32(name, fulladdr)  /* not supported */\r
82 # define SFR32E(name, fulladdr) /* not supported */\r
83 \r
84 /** Raisonance\r
85   * http://www.raisonance.com\r
86  */\r
87 #elif defined __RC51__\r
88 # define SBIT(name, addr, bit)  at (addr+bit) sbit                   name\r
89 # define SFR(name, addr)        sfr at addr                          name\r
90 # define SFRX(name, addr)       xdata at addr volatile unsigned char name\r
91 # define SFR16(name, addr)      sfr16 at addr                        name\r
92 # define SFR16E(name, fulladdr) /* not supported */\r
93 # define SFR32(name, fulladdr)  /* not supported */\r
94 # define SFR32E(name, fulladdr) /* not supported */\r
95 \r
96 /** IAR 8051\r
97   * http://www.iar.com\r
98  */\r
99 #elif defined __ICC8051__\r
100 # define SBIT(name, addr, bit)  __bit __no_init volatile bool name @ (addr+bit)\r
101 # define SFR(name, addr)        __sfr __no_init volatile unsigned char name @ addr\r
102 # define SFRX(name, addr)       __xdata __no_init volatile unsigned char name @ addr\r
103 # define SFR16(name, addr)      __sfr __no_init volatile unsigned int  name @ addr\r
104 # define SFR16E(name, fulladdr) /* not supported */\r
105 # define SFR32(name, fulladdr)  __sfr __no_init volatile unsigned long name @ addr\r
106 # define SFR32E(name, fulladdr) /* not supported */\r
107 \r
108 /** Tasking / Altium\r
109   * http://www.altium.com/tasking\r
110  */\r
111 #elif defined _CC51\r
112 # define SBIT(name, addr, bit)  _sfrbit  name _at(addr+bit)\r
113 # define SFR(name, addr)        _sfrbyte name _at(addr)\r
114 # define SFRX(name, addr)       _xdat volatile unsigned char name _at(addr)\r
115 # define SFR16(name, addr)      /* not supported */\r
116 # define SFR16E(name, fulladdr) /* not supported */\r
117 # define SFR32(name, fulladdr)  /* not supported */\r
118 # define SFR32E(name, fulladdr) /* not supported */\r
119 \r
120 /** Hi-Tech 8051\r
121   * http://www.htsoft.com\r
122  */\r
123 #elif defined HI_TECH_C\r
124 # define SBIT(name, addr, bit)  volatile bit           name @ (addr+bit)\r
125 # define SFR(name, addr)        volatile unsigned char name @ addr\r
126 # define SFRX(name, addr)       volatile far unsigned char name @ addr\r
127 # define SFR16(name, addr)      /* not supported */\r
128 # define SFR16E(name, fulladdr) /* not supported */\r
129 # define SFR32(name, fulladdr)  /* not supported */\r
130 # define SFR32E(name, fulladdr) /* not supported */\r
131 \r
132 /** Crossware\r
133   * http://www.crossware.com\r
134  */\r
135 #elif defined _XC51_VER\r
136 # define SBIT(name, addr, bit)  _sfrbit  name = (addr+bit)\r
137 # define SFR(name, addr)        _sfr     name = addr\r
138 # define SFRX(name, addr)       volatile unsigned char _xdata name _at addr\r
139 # define SFR16(name, addr)      _sfrword name = addr\r
140 # define SFR16E(name, fulladdr) /* not supported */\r
141 # define SFR32(name, fulladdr)  /* not supported */\r
142 # define SFR32E(name, fulladdr) /* not supported */\r
143 \r
144 /** Wickenhäuser\r
145   * http://www.wickenhaeuser.de\r
146  */\r
147 #elif defined __UC__\r
148 # define SBIT(name, addr, bit)  unsigned char bit  name @ (addr+bit)\r
149 # define SFR(name, addr)        near unsigned char name @ addr\r
150 # define SFRX(name, addr)       xdata volatile unsigned char name @ addr\r
151 # define SFR16(name, addr)      /* not supported */\r
152 # define SFR16E(name, fulladdr) /* not supported */\r
153 # define SFR32(name, fulladdr)  /* not supported */\r
154 # define SFR32E(name, fulladdr) /* not supported */\r
155 \r
156 /** default\r
157   * unknown compiler\r
158  */\r
159 #elif\r
160 # warning unknown compiler\r
161 # define SBIT(name, addr, bit)  volatile bool           name\r
162 # define SFR(name, addr)        volatile unsigned char  name\r
163 # define SFRX(name, addr)       volatile unsigned char  name\r
164 # define SFR16(name, addr)      volatile unsigned short name\r
165 # define SFR16E(name, fulladdr) volatile unsigned short name\r
166 # define SFR32(name, fulladdr)  volatile unsigned long  name\r
167 # define SFR32E(name, fulladdr) volatile unsigned long  name\r
168 \r
169 #endif\r
170 \r
171 #endif //COMPILER_H\r