* device/include/mcs51/compiler.h: added SFRX for xdata based special
[fw/sdcc] / device / include / mcs51 / compiler.h
index 3886d7aee73202f80525e5dea910e6615e74a462..149826dd4d179fc6285324195ff4d4f42061793f 100644 (file)
@@ -30,6 +30,8 @@
   * prerequisite byte order or adjacency. None of these multi-byte sfr\r
   * combinations will guarantee the order in which they are accessed when read\r
   * or written.\r
+  * SFR16X and SFR32X for 16 bit and 32 bit xdata registers are not defined\r
+  * to avoid portability issues because of compiler endianness.\r
   * This file is to be included in every microcontroller specific header file.\r
   * Example:\r
   *\r
@@ -40,6 +42,8 @@
   *\r
   * SFR   (P0, 0x80);           // Port 0\r
   *\r
+  * SFRX  (CPUCS, 0xE600);      // Cypress FX2 Control and Status register in xdata memory at 0xE600\r
+  *\r
   * SFR16 (TMR2, 0xCC);         // Timer 2, lsb at 0xCC, msb at 0xCD\r
   *\r
   * SFR16E(TMR0, 0x8C8A);       // Timer 0, lsb at 0x8A, msb at 0x8C\r
@@ -47,6 +51,7 @@
   * SFR32 (MAC0ACC, 0x93);      // SiLabs C8051F120 32 bits MAC0 Accumulator, lsb at 0x93, msb at 0x96\r
   *\r
   * SFR32E(SUMR, 0xE5E4E3E2);   // TI MSC1210 SUMR 32 bits Summation register, lsb at 0xE2, msb at 0xE5\r
+  *\r
  */\r
 \r
 #ifndef COMPILER_H\r
   * http://sdcc.sf.net\r
  */\r
 #if defined SDCC\r
-# define SBIT(name, addr, bit)  __sbit  __at(addr+bit)             name\r
-# define SFR(name, addr)        __sfr   __at(addr)                 name\r
-# define SFR16(name, addr)      __sfr16 __at(((addr+1)<<8) | addr) name\r
-# define SFR16E(name, fulladdr) __sfr16 __at(fulladdr)             name\r
+# define SBIT(name, addr, bit)  __sbit  __at(addr+bit)                  name\r
+# define SFR(name, addr)        __sfr   __at(addr)                      name\r
+# define SFRX(name, addr)       xdata volatile unsigned char __at(addr) name\r
+# define SFR16(name, addr)      __sfr16 __at(((addr+1)<<8) | addr)      name\r
+# define SFR16E(name, fulladdr) __sfr16 __at(fulladdr)                  name\r
 # define SFR32(name, addr)      __sfr32 __at(((addr+3)<<24) | ((addr+2)<<16) | ((addr+1)<<8) | addr) name\r
-# define SFR32E(name, fulladdr) __sfr32 __at(fulladdr)             name\r
+# define SFR32E(name, fulladdr) __sfr32 __at(fulladdr)                  name\r
 \r
 /** Keil C51\r
   * http://www.keil.com\r
@@ -69,6 +75,7 @@
 #elif defined __CX51__\r
 # define SBIT(name, addr, bit)  sbit  name = addr^bit\r
 # define SFR(name, addr)        sfr   name = addr\r
+# define SFRX(name, addr)       volatile unsigned char xdata name _at_ addr\r
 # define SFR16(name, addr)      sfr16 name = addr\r
 # define SFR16E(name, fulladdr) /* not supported */\r
 # define SFR32(name, fulladdr)  /* not supported */\r
   * http://www.raisonance.com\r
  */\r
 #elif defined __RC51__\r
-# define SBIT(name, addr, bit)  at (addr+bit) sbit         name\r
-# define SFR(name, addr)        sfr at addr                name\r
-# define SFR16(name, addr)      sfr16 at addr              name\r
+# define SBIT(name, addr, bit)  at (addr+bit) sbit                   name\r
+# define SFR(name, addr)        sfr at addr                          name\r
+# define SFRX(name, addr)       xdata at addr volatile unsigned char name\r
+# define SFR16(name, addr)      sfr16 at addr                        name\r
 # define SFR16E(name, fulladdr) /* not supported */\r
 # define SFR32(name, fulladdr)  /* not supported */\r
 # define SFR32E(name, fulladdr) /* not supported */\r
@@ -91,6 +99,7 @@
 #elif defined __ICC8051__\r
 # define SBIT(name, addr, bit)  __bit __no_init volatile bool name @ (addr+bit)\r
 # define SFR(name, addr)        __sfr __no_init volatile unsigned char name @ addr\r
+# define SFRX(name, addr)       __xdata __no_init volatile unsigned char name @ addr\r
 # define SFR16(name, addr)      __sfr __no_init volatile unsigned int  name @ addr\r
 # define SFR16E(name, fulladdr) /* not supported */\r
 # define SFR32(name, fulladdr)  __sfr __no_init volatile unsigned long name @ addr\r
 #elif defined _CC51\r
 # define SBIT(name, addr, bit)  _sfrbit  name _at(addr+bit)\r
 # define SFR(name, addr)        _sfrbyte name _at(addr)\r
+# define SFRX(name, addr)       _xdat volatile unsigned char name _at(addr)\r
 # define SFR16(name, addr)      /* not supported */\r
 # define SFR16E(name, fulladdr) /* not supported */\r
 # define SFR32(name, fulladdr)  /* not supported */\r
 #elif defined HI_TECH_C\r
 # define SBIT(name, addr, bit)  volatile bit           name @ (addr+bit)\r
 # define SFR(name, addr)        volatile unsigned char name @ addr\r
+# define SFRX(name, addr)       volatile far unsigned char name @ addr\r
 # define SFR16(name, addr)      /* not supported */\r
 # define SFR16E(name, fulladdr) /* not supported */\r
 # define SFR32(name, fulladdr)  /* not supported */\r
 #elif defined _XC51_VER\r
 # define SBIT(name, addr, bit)  _sfrbit  name = (addr+bit)\r
 # define SFR(name, addr)        _sfr     name = addr\r
+# define SFRX(name, addr)       volatile unsigned char _xdata name _at addr\r
 # define SFR16(name, addr)      _sfrword name = addr\r
 # define SFR16E(name, fulladdr) /* not supported */\r
 # define SFR32(name, fulladdr)  /* not supported */\r
 #elif defined __UC__\r
 # define SBIT(name, addr, bit)  unsigned char bit  name @ (addr+bit)\r
 # define SFR(name, addr)        near unsigned char name @ addr\r
+# define SFRX(name, addr)       xdata volatile unsigned char name @ addr\r
 # define SFR16(name, addr)      /* not supported */\r
 # define SFR16E(name, fulladdr) /* not supported */\r
 # define SFR32(name, fulladdr)  /* not supported */\r
   * unknown compiler\r
  */\r
 #elif\r
-# define SBIT(name, addr, bit)  volatile bool\r
-# define SFR(name, addr)        volatile unsigned char\r
-# define SFR16(name, addr)      volatile short\r
-# define SFR16E(name, fulladdr) volatile short\r
-# define SFR32(name, fulladdr)  volatile int\r
-# define SFR32E(name, fulladdr) volatile int\r
+# warning unknown compiler\r
+# define SBIT(name, addr, bit)  volatile bool           name\r
+# define SFR(name, addr)        volatile unsigned char  name\r
+# define SFRX(name, addr)       volatile unsigned char  name\r
+# define SFR16(name, addr)      volatile unsigned short name\r
+# define SFR16E(name, fulladdr) volatile unsigned short name\r
+# define SFR32(name, fulladdr)  volatile unsigned long  name\r
+# define SFR32E(name, fulladdr) volatile unsigned long  name\r
 \r
 #endif\r
 \r