X-Git-Url: https://oss.titaniummirror.com/gitweb/?a=blobdiff_plain;f=include%2Fmsp430%2Fmpy32.h;fp=include%2Fmsp430%2Fmpy32.h;h=dbdefafb1ab058a31524beb528aa4179e14b92f4;hb=6f720ff00773571c2fa2d35e67bff68547617639;hp=0000000000000000000000000000000000000000;hpb=807b2dd5b7365eb87b482197af3b4a3f520c14f7;p=msp430-libc.git diff --git a/include/msp430/mpy32.h b/include/msp430/mpy32.h new file mode 100644 index 0000000..dbdefaf --- /dev/null +++ b/include/msp430/mpy32.h @@ -0,0 +1,125 @@ +#ifndef __MSP430_HEADERS_MPY32_H +#define __MSP430_HEADERS_MPY32_H + +/* mpy.h + * + * mspgcc project: MSP430 device headers + * Hardware 32-bit multiplier + * + * (c) 2008 by Sergey A. Borshch + * Originally based in MSP430F543x datasheet (slas609) + * and MSP430x5xx Family User's Guide (slau208). + * + * $Id: mpy32.h,v 1.3 2008/12/15 12:48:20 sb-sf Exp $ + */ + +/* Switches: + +__MSP430_MPY32_BASE__ - base address of MPY32 module + +*/ +#if defined(__MSP430_MPY32_BASE__) +#define MPY_ __MSP430_MPY32_BASE__ + 0x00 /* 16-bit operand 1 - multiply */ +sfrw(MPY, MPY_); +#define MPYS_ __MSP430_MPY32_BASE__ + 0x02 /* 16-bit operand 1 - signed multiply */ +sfrw(MPYS, MPYS_); +#define MAC_ __MSP430_MPY32_BASE__ + 0x04 /* 16-bit operand 1 - multiply accumulate */ +sfrw(MAC, MAC_); +#define MACS_ __MSP430_MPY32_BASE__ + 0x06 /* 16-bit operand 1 - signed multiply accumulate */ +sfrw(MACS, MACS_); +#define OP2_ __MSP430_MPY32_BASE__ + 0x08 /* 16-bit operand 2 */ +sfrw(OP2, OP2_); +#define RESLO_ __MSP430_MPY32_BASE__ + 0x0A /* 16x16 result low word */ +sfrw(RESLO, RESLO_); +#define RESHI_ __MSP430_MPY32_BASE__ + 0x0C /* 16x16 result high word */ +sfrw(RESHI, RESHI_); +#define SUMEXT_ __MSP430_MPY32_BASE__ + 0x0E /* 16x16 sum extension */ +sfrw(SUMEXT, SUMEXT_); +#define MPY32L_ __MSP430_MPY32_BASE__ + 0x10 /* 32-bit operand 1 - multiply low word */ +sfrw(MPY32L, MPY32L_); +#define MPY32H_ __MSP430_MPY32_BASE__ + 0x12 /* 32-bit operand 1 - multiply high word */ +sfrw(MPY32H, MPY32H_); +#define MPYS32L_ __MSP430_MPY32_BASE__ + 0x14 /* 32-bit operand 1 - signed multiply low word */ +sfrw(MPYS32L, MPYS32L_); +#define MPYS32H_ __MSP430_MPY32_BASE__ + 0x16 /* 32-bit operand 1 - signed multiply high word */ +sfrw(MPYS32H, MPYS32H_); +#define MAC32L_ __MSP430_MPY32_BASE__ + 0x18 /* 32-bit operand 1 - multiply accumulate low word */ +sfrw(MAC32L, MAC32L_); +#define MAC32H_ __MSP430_MPY32_BASE__ + 0x1A /* 32-bit operand 1 - multiply accumulate high word */ +sfrw(MAC32H, MAC32H_); +#define MACS32L_ __MSP430_MPY32_BASE__ + 0x1C /* 32-bit operand 1 - signed multiply accumulate low word */ +sfrw(MACS32L, MACS32L_); +#define MACS32H_ __MSP430_MPY32_BASE__ + 0x1E /* 32-bit operand 1 - signed multiply accumulate high word */ +sfrw(MACS32H, MACS32H_); +#define OP2L_ __MSP430_MPY32_BASE__ + 0x20 /* 32-bit operand 2 - low word */ +sfrw(OP2L, OP2L_); +#define OP2H_ __MSP430_MPY32_BASE__ + 0x22 /* 32-bit operand 2 - high word */ +sfrw(OP2H, OP2H_); +#define RES0_ __MSP430_MPY32_BASE__ + 0x24 /* 32x32 result 3 - least significant word */ +sfrw(RES0,RES0_); +#define RES1_ __MSP430_MPY32_BASE__ + 0x26 +sfrw(RES1,RES1_); +#define RES2_ __MSP430_MPY32_BASE__ + 0x28 +sfrw(RES2,RES2_); +#define RES3_ __MSP430_MPY32_BASE__ + 0x2A /* 32x32 result 3 - most significant word */ +sfrw(RES3,RES3_); +#define MPY32CTL0_ __MSP430_MPY32_BASE__ + 0x2C /* MPY32 control register 0 */ +sfrw(MPY32CTL0,MPY32CTL0_); +#endif /* defined(__MSP430_MPY32_BASE__) */ + +#define MPYDLY32 (1<<9) /* Delayed write mode */ +#define MPYDLYWRTEN (1<<8) /* Delayed write enable */ +#define MPYPO2_32 (1<<7) /* Multiplier bit width of operand 2 */ +#define MPYPO1_32 (1<<6) /* Multiplier bit width of operand 1 */ +#define MPYM1 (1<<5) /* Multiplier mode */ +#define MPYM0 (1<<4) /* -- // -- */ +#define MPYSAT (1<<3) /* Saturation mode */ +#define MPYFRAC (1<<2) /* Fractional mode */ +#define MPYC (1<<0) /* Carry of the multiplier */ + +#define MPYM_0 (0<<4) /* Multiply */ +#define MPYM_1 (1<<4) /* Signed multiply */ +#define MPYM_2 (2<<4) /* Multiply accumulate */ +#define MPYM_3 (3<<4) /* Signed multiply accumulate */ + + +#ifndef __ASSEMBLER__ +/* Structured declaration */ + +#undef __xstr +#undef __str +#define __xstr(x) __str(x) +#define __str(x) #x + +typedef struct +{ + volatile unsigned int MPY; /* 16-bit operand 1 - multiply */ + volatile unsigned int MPYS; /* 16-bit operand 1 - signed multiply */ + volatile unsigned int MAC; /* 16-bit operand 1 - multiply accumulate */ + volatile unsigned int MACS; /* 16-bit operand 1 - signed multiply accumulate */ + volatile unsigned int OP2; /* 16-bit operand 2 */ + volatile unsigned int RESLO; /* 16x16 result low word */ + volatile unsigned int RESHI; /* 16x16 result high word */ + volatile unsigned int SUMEXT; /* 16x16 sum extension */ + volatile unsigned int MPY32L; /* 32-bit operand 1 - multiply low word */ + volatile unsigned int MPY32H; /* 32-bit operand 1 - multiply high word */ + volatile unsigned int MPYS32L; /* 32-bit operand 1 - signed multiply low word */ + volatile unsigned int MPYS32H; /* 32-bit operand 1 - signed multiply high word */ + volatile unsigned int MAC32L; /* 32-bit operand 1 - multiply accumulate low word */ + volatile unsigned int MAC32H; /* 32-bit operand 1 - multiply accumulate high word */ + volatile unsigned int MACS32L; /* 32-bit operand 1 - signed multiply accumulate low word */ + volatile unsigned int MACS32H; /* 32-bit operand 1 - signed multiply accumulate high word */ + volatile unsigned int OP2L; /* 32-bit operand 2 - low word */ + volatile unsigned int OP2H; /* 32-bit operand 2 - high word */ + volatile unsigned int RES0; /* 32x32 result 3 - least significant word */ + volatile unsigned int RES1; + volatile unsigned int RES2; + volatile unsigned int RES3; /* 32x32 result 3 - most significant word */ + volatile unsigned int MPY32CTL0; /* MPY32 control register 0 */ +} mpy32_t; +mpy32_t mpy32 asm(__xstr(__MSP430_MPY32_BASE__)); +#undef __str +#undef __xstr +#endif /* __ASSEMBLER__ */ + +#endif /* __MSP430_HEADERS_MPY32_H */