#ifndef __MSP430_HEADERS_SYS_H
#define __MSP430_HEADERS_SYS_H

/* sys.h
 *
 * mspgcc project: MSP430 device headers
 * system control module
 *
 * (c) 2008 by Sergey A. Borshch <sb-sf@users.sf.net>
 * Originally based in MSP430F543x datasheet (slas609)
 *    and MSP430x5xx Family User's Guide (slau208).
 *
 * $Id: sys.h,v 1.2 2008/12/10 22:32:12 sb-sf Exp $
 */

/* Switches:

__MSP430_SYS_BASE__ - base address of SYS module

*/

#define SYSCTL_             __MSP430_SYS_BASE__ + 0x00  /* System control register */
sfrw(SYSCTL, SYSCTL_);
#define SYSCTL_L_           __MSP430_SYS_BASE__ + 0x00  /* low byte */
sfrb(SYSCTL_L, SYSCTL_L_);
#define SYSCTL_H_           __MSP430_SYS_BASE__ + 0x01  /* high byte */
sfrb(SYSCTL_H, SYSCTL_H_);

#define SYSBSLC_            __MSP430_SYS_BASE__ + 0x02  /* Bootstrap loader configuration register */
sfrw(SYSBSLC, SYSBSLC_);
#define SYSBSLC_L_          __MSP430_SYS_BASE__ + 0x02  /* low byte */
sfrb(SYSBSLC_L, SYSBSLC_L_);
#define SYSBSLC_H_          __MSP430_SYS_BASE__ + 0x03  /* high byte */
sfrb(SYSBSLC_H, SYSBSLC_H_);

#define SYSARB_             __MSP430_SYS_BASE__ + 0x04  /* Arbitration configuration register */
sfrw(SYSARB, SYSARB_);
#define SYSARB_L_           __MSP430_SYS_BASE__ + 0x04  /* low byte */
sfrb(SYSARB_L, SYSARB_L_);
#define SYSARB_H_           __MSP430_SYS_BASE__ + 0x05  /* high byte */
sfrb(SYSARB_H, SYSARB_H_);

#define SYSJMBC_            __MSP430_SYS_BASE__ + 0x06  /* JTAG Mailbox control register */
sfrw(SYSJMBC, SYSJMBC_);
#define SYSJMBC_L_          __MSP430_SYS_BASE__ + 0x06  /* low byte */
sfrb(SYSJMBC_L, SYSJMBC_L_);
#define SYSJMBC_H_          __MSP430_SYS_BASE__ + 0x07  /* high byte */
sfrb(SYSJMBC_H, SYSJMBC_H_);

#define SYSJMBI0_           __MSP430_SYS_BASE__ + 0x08  /* JTAG Mailbox input register #0 */
sfrw(SYSJMBI0, SYSJMBI0_);
#define SYSJMBI0_L_         __MSP430_SYS_BASE__ + 0x08  /* low byte */
sfrb(SYSJMBI0_L, SYSJMBI0_L_);
#define SYSJMBI0_H_         __MSP430_SYS_BASE__ + 0x09  /* high byte */
sfrb(SYSJMBI0_H, SYSJMBI0_H_);

#define SYSJMBI1_           __MSP430_SYS_BASE__ + 0x0A  /* JTAG Mailbox input register #1 */
sfrw(SYSJMBI1, SYSJMBI1_);
#define SYSJMBI1_L_         __MSP430_SYS_BASE__ + 0x0A  /* low byte */
sfrb(SYSJMBI1_L, SYSJMBI1_L_);
#define SYSJMBI1_H_         __MSP430_SYS_BASE__ + 0x0B  /* high byte */
sfrb(SYSJMBI1_H, SYSJMBI1_H_);

#define SYSJMBO0_           __MSP430_SYS_BASE__ + 0x0C  /* JTAG Mailbox output register #0 */
sfrw(SYSJMBO0, SYSJMBO0_);
#define SYSJMBO0_L_         __MSP430_SYS_BASE__ + 0x0C  /* low byte */
sfrb(SYSJMBO0_L, SYSJMBO0_L_);
#define SYSJMBO0_H_         __MSP430_SYS_BASE__ + 0x0D  /* high byte */
sfrb(SYSJMBO0_H, SYSJMBO0_H_);

#define SYSJMBO1_           __MSP430_SYS_BASE__ + 0x0E  /* JTAG Mailbox output register #1 */
sfrw(SYSJMBO1, SYSJMBO1_);
#define SYSJMBO1_L_         __MSP430_SYS_BASE__ + 0x0E  /* low byte */
sfrb(SYSJMBO1_L, SYSJMBO1_L_);
#define SYSJMBO1_H_         __MSP430_SYS_BASE__ + 0x0F  /* high byte */
sfrb(SYSJMBO1_H, SYSJMBO1_H_);

#define SYSBERRIV_          __MSP430_SYS_BASE__ + 0x18  /* Bus error vector generator */
sfrw(SYSBERRIV, SYSBERRIV_);
#define SYSUNIV_            __MSP430_SYS_BASE__ + 0x1A  /* User NMI vector generator */
sfrw(SYSUNIV, SYSUNIV_);
#define SYSSNIV_            __MSP430_SYS_BASE__ + 0x1C  /* System NMI vector generator */
sfrw(SYSSNIV, SYSSNIV_);
#define SYSRSTIV_           __MSP430_SYS_BASE__ + 0x1E  /* System reset vector generator */
sfrw(SYSRSTIV, SYSRSTIV_);

/* SYSCTL, SYSCTL_L */
#define SYSJTAGPIN          (1<<5)  /* Dedicated JTAG pins enable */
#define SYSBSLIND           (1<<4)  /* TCK/RST entry BSL indication detected */
#define SYSPMMPE            (1<<2)  /* PMM access protect */
#define SYSRIVECT           (1<<0)  /* RAM based interrupt vectors */

/* SYSBSLC, SYSBSLC_L, SYSBSLC_H */
#define SYSBSLPE            (1<<15) /* BSL memory protection enable */
#define SYSBSLOFF           (1<<14) /* BSL memory disable for size covered in SYSBSLSIZE */
/* defines for SYSBSLC_H byte access?? */
#define SYSBSLR             (1<<2)  /* RAM assigned to BSL */
#define SYSBSLSIZE1         (1<<1)  /* BSL size */
#define SYSBSLSIZE0         (1<<0)  /* BSL size */

#define SYSBSLSIZE_0        (0<<0)  /* size 512 bytes, BSL_SEG_3 */
#define SYSBSLSIZE_1        (1<<0)  /* size 1024 bytes, BSL_SEG_2,3 */
#define SYSBSLSIZE_2        (2<<0)  /* size 1536 bytes, BSL_SEG_1,2,3 */
#define SYSBSLSIZE_3        (3<<0)  /* size 2048 bytes, BSL_SEG_0,1,2,3 */

/* SYSJMBC, SYSJMBC_L */
#define JMBCLR1OFF          (1<<7)  /* Incomming JTAG mailbox 1 flag auto-clear disable */
#define MBCLR0OFF           (1<<6)  /* Incomming JTAG mailbox 0 flag auto-clear disable */
/* RESERVED                 (1<<5)  */
#define JMBMODE             (1<<4)  /* Operation mode of JMB for JMBI0/1 and JMBO0/1 */
#define JMBOUT1FG           (1<<3)  /* Outgoing JTAG mailbox 1 flag */
#define JMBOUT0FG           (1<<2)  /* Outgoing JTAG mailbox 0 flag */
#define JMBIN1FG            (1<<1)  /* Incoming JTAG mailbox 1 flag */
#define JMBIN0FG            (1<<0)  /* Incoming JTAG mailbox 0 flag */


#ifndef __ASSEMBLER__
/* Structured declaration */

#undef  __xstr
#undef  __str
#define __xstr(x)     __str(x)
#define __str(x)      #x

typedef struct
{
    union
    {
        volatile unsigned int CTL;              /* System control register */
        struct
        {
            volatile unsigned char CTL_L;       /* low byte */
            volatile unsigned char CTL_H;       /* high byte */
        };
    };
    union
    {
        volatile unsigned int BSLC;             /* Bootstrap loader configuration register */
        struct
        {
            volatile unsigned char BSLC_L;      /* low byte */
            volatile unsigned char BSLC_H;      /* high byte */
        };
    };
    union
    {
        volatile unsigned int ARB;              /* Arbitration configuration register */
        struct
        {
            volatile unsigned char ARB_L;       /* low byte */
            volatile unsigned char ARB_H;       /* high byte */
        };
    };
    union
    {
        volatile unsigned int JMBC;             /* JTAG Mailbox control register */
        struct
        {
            volatile unsigned char JMBC_L;      /* low byte */
            volatile unsigned char JMBC_H;      /* high byte */
        };
    };
    union
    {
        volatile unsigned int JMBI0;            /* JTAG Mailbox input register #0 */
        struct
        {
            volatile unsigned char JMBI0_L;     /* low byte */
            volatile unsigned char JMBI0_H;     /* high byte */
        };
    };
    union
    {
        volatile unsigned int JMBI1;            /* JTAG Mailbox input register #1 */
        struct
        {
            volatile unsigned char JMBI1_L;     /* low byte */
            volatile unsigned char JMBI1_H;     /* high byte */
        };
    };
    union
    {
        volatile unsigned int JMBO0;            /* JTAG Mailbox output register #0 */
        struct
        {
            volatile unsigned char JMBO0_L;     /* low byte */
            volatile unsigned char JMBO0_H;     /* high byte */
        };
    };
    union
    {
        volatile unsigned int JMBO1;            /* JTAG Mailbox output register #1 */
        struct
        {
            volatile unsigned char JMBO1_L;     /* low byte */
            volatile unsigned char JMBO1_H;     /* high byte */
        };
    };
    unsigned int dummy[4];
    volatile unsigned int BERRIV;               /* Bus error vector generator */
    volatile unsigned int UNIV;                 /* User NMI vector generator */
    volatile unsigned int SNIV;                 /* System NMI vector generator */
    volatile unsigned int RSTIV;                /* System reset vector generator */
} sys_t;
sys_t SYS asm(__xstr(__MSP430_SYS_BASE__));

#endif  /* __ASSEMBLER__ */

#endif /* __MSP430_HEADERS_SYS_H */
