//////////////////////////////////////////////////////////////////////////////
//
//				defs.h
//
//	Header file for "all" SRI projects.
//
//////////////////////////////////////////////////////////////////////////////
//
//		SRI, Inc.
//		111 Prospect Street
//		Westfield, NJ
//		908-654-4000
//
//////////////////////////////////////////////////////////////////////////////
//
//	Version		1.2
//	Date		4 Dec 97
//	Programmer	AK
//
//	Added macros "is*" from MPLABC.
//
//////////////////////////////////////////////////////////////////////////////
//
//	Version		1.1
//	Date		13 Nov 97
//	Programmer	AK
//
//	This version implements changes to support MSVC++ v1.5 and
//	Hi-Tech PIC C v7.72-1.  As you add new compilers, use the same
//	notation found below.  The Microsoft version is the default -
//	all others should refer to compiler switches defined by the
//	vendor, with nestings so as to generate the final #else to
//	default to MSVC++.
//
//////////////////////////////////////////////////////////////////////////////
//
//	Project		Generic Module
//	Version		1.0 (original, not verified)
//	Date		11 Nov 97
//	Programmer	AK
//
//////////////////////////////////////////////////////////////////////////////

#ifndef _DEFS_H

#define	_DEFS_H

#if HI_TECH_C
//////////////////////////////////////////////////////////////////////////////
//
//			Hi-Tech C Compiler (PIC C v7.72-1)
//
//////////////////////////////////////////////////////////////////////////////

typedef bit			BOOLEAN;	/* Bit flag */
typedef	bit			BIT;		/* Bit flag */

typedef unsigned char 		BYTE;		/* Unsigned 8-bit */
typedef unsigned char 		byte;		/* Unsigned 8-bit */
typedef	unsigned char		UCHAR;		/* Unsigned 8-bit */
typedef	signed char		SBYTE;		/* Signed 8-bit */
typedef signed char		SCHAR;		/* Signed 8-bit */

typedef unsigned int		WORD;		/* Unsigned 16-bit */
typedef	unsigned int		UINT;		/* Unsigned 16-bit */

typedef	long int		LONG;		/* Signed 32-bit */
typedef	long int		LONGINT;	/* Signed 32-bit */

typedef	unsigned long int	ULONG;		/* Unsigned 32-bit */
typedef	unsigned long int	LWORD;		/* Unsigned 32-bit */

#define	ALL_BITS_SET	(~0)
#define	NOP()			asm("nop")
#else
//////////////////////////////////////////////////////////////////////////////
//
//			Default (MSVC++ v1.5)
//
//////////////////////////////////////////////////////////////////////////////

typedef unsigned char		BOOLEAN;	/* Unsigned 8-bit to hold TRUE/FALSE */
typedef unsigned char 		BYTE;		/* Unsigned 8-bit */
typedef unsigned int		WORD;		/* Unsigned 16-bit */
typedef	unsigned long int	LWORD;		/* Unsigned 32-bit */

typedef	unsigned char		UCHAR;		/* Unsigned 8-bit */
typedef	unsigned int		UINT;		/* Unsigned 16-bit */
typedef	unsigned long int	ULONG;		/* Unsigned 32-bit */

typedef	long int			LONGINT;	/* Signed 32-bit */
typedef	long int			LONG;		/* Signed 32-bit */
#define	ALL_BITS_SET	(~0)
#endif

//////////////////////////////////////////////////////////////////////////////

#define	TRUE		(1)
#define	FALSE		(0)
#define	YES		(1)
#define	NO		(0)

#define LOBYTE(w)	((BYTE)(w))
#define HIBYTE(w)	((BYTE)(((UINT)(w) >> 8) & 0xFF))

//////////////////////////////////////////////////////////////////////////////

#define   isalnum(c)  (isalpha(c) || isdigit(c))
#define   isalpha(c)  (islower(c) || isupper(c))
#define   isascii(c)  (((c) >= 0) && ((c) <= 0x7f))
#define   iscntrl(c)  ((((c) >= 0) && ((c) <= 0x1f)) || ((c) == 0x7f))
#define   isdigit(c)  (((c) >= '0') && ((c) <= '9'))
//#define   isgraph(c)  (((c) >= 0x21) && ((c) <= 0x7e))
#define   islower(c)  (((c) >= 'a') && ((c) <= 'z'))
#define   isprint(c)  (((c) >= 0x20) && ((c) <= 0x7e))
#define   ispunct(c)  ((((c) >= 0x20) && ((c) <= 0x2f)) || \
                       (((c) >= 0x3a) && ((c) <= 0x40)) || \
                       (((c) >= 0x5b) && ((c) <= 0x60)) || \
                       (((c) >= 0x7b) && ((c) <= 0x7e)))
#define   isspace(c)  (((c) == 0x09) || ((c) == 0x0a) || \
                       ((c) == 0x0b) || ((c) == 0x0c) || \
                       ((c) == 0x0d) || ((c) == 0x20))
#define   isupper(c)  (((c) >= 'A') && ((c) <= 'Z'))
#define   isxdigit(c) (isdigit(c) || (((c) >= 'a') && ((c) <= 'f')) || \
                       (((c) >= 'A') && ((c) <= 'F')))
#define   tolower(c)  (isupper(c) ? ((c) + 'a' - 'A'): (c))
#define   toupper(c)  (islower(c) ? ((c) - 'a' + 'A'): (c))

#define IDFUSE_ADDR	0x2000

#if defined(_16C74)
#define	LP_OSC		0b00000000
#define	XT_OSC		0b00000001
#define	HS_OSC		0b00000010
#define	RC_OSC		0b00000011

#define	WDT_ENABLED	0b00000100
#define	WDT_DISABLED	0b00000000

#define	PWRT_ENABLED	0b00001000
#define	PWRT_DISABLED	0b00000000

#define	CP_OFF		0x3FB0
#define	CP_1_2		0x2AA0
#define	CP_3_4		0x1590
#define	CP_FULL		0x0080
#endif

#if defined(_16C74A)
#define	LP_OSC		0x00
#define	XT_OSC		0x01
#define	HS_OSC		0x02
#define	RC_OSC		0x03

#define	WDT_ENABLED	0x04
#define	WDT_DISABLED	0x00

#define	PWRT_ENABLED	0x00
#define	PWRT_DISABLED	0x08

#define	BOD_ENABLED	0x40
#define	BOD_DISABLED	0x00

#define	CP_OFF		0x3FB0
#define	CP_1_2		0x2AA0
#define	CP_3_4		0x1590
#define	CP_FULL		0x0080
#endif

#if defined(_16C77)
#define	LP_OSC		0x00
#define	XT_OSC		0x01
#define	HS_OSC		0x02
#define	RC_OSC		0x03

#define	WDT_ENABLED	0x04
#define	WDT_DISABLED	0x00

#define	PWRT_ENABLED	0x00
#define	PWRT_DISABLED	0x08

#define	BOD_ENABLED	0x40
#define	BOD_DISABLED	0x00

#define	CP_OFF		0x3FB0
#define	CP_1_2		0x2AA0
#define	CP_3_4		0x1590
#define	CP_FULL		0x0080
#endif

#if defined(_16C873) || defined(_16C874) || defined(_16C876) || defined(_16C877) || defined(_16F873) || defined(_16F874) || defined(_16F876) || defined(_16F877)
#define	LP_OSC		0x0000
#define	XT_OSC		0x0001
#define	HS_OSC		0x0002
#define	RC_OSC		0x0003

#define	WDT_ENABLED	0x0004		// Watchdog runs
#define	WDT_DISABLED	0x0000

#define	PWRT_ENABLED	0x0000		// Power-up Timer runs
#define	PWRT_DISABLED	0x0008

#define	BOD_ENABLED	0x0040		// Brown-Out Detect active
#define	BOD_DISABLED	0x0000

#define	LVP_ENABLED	0x0080		// Low-voltage programming available
#define	LVP_DISABLED	0x0000

#define	CPD_ENABLED	0x0000		// Data EE Protected
#define	CPD_DISABLED	0x0100

#define	WRT_ENABLED	0x0200		// Internal self-write enabled
#define	WRT_DISABLED	0x0000

#define	DEBUG_ENABLED	0x0000		// RB6/7 are DEBUG pins
#define	DEBUG_DISABLED	0x0800

#define	CP_OFF		0x3430		// Protects nothing
#define	CP_TOP		0x2420		// Protects only top 256 words
#define	CP_HALF		0x1410		// Protects only top 1/2 of program space
#define	CP_FULL		0x0400		// Protects entire chip
#endif

#define	__CHIPID(x)	asm("\tpsect idfuse,class=IDFUSE,delta=2");\
			asm("\tglobal\tchipid_word"); \
			asm("chipid_word"); \
			asm("\tdw "___mkstr(x>>24&0xFF|0x3400));\
			asm("\tdw "___mkstr(x>>16&0xFF|0x3400));\
			asm("\tdw "___mkstr(x>>8&0xFF|0x3400));\
			asm("\tdw "___mkstr(x&0xFF|0x3400))

//Sample command line to use this addition:
//     picc -16C73a -Zg1 -O -L-Pidfuse=2000h sdd.c

#if defined(_16C62)|| defined(_16C64) || defined(_16C65) || defined(_16C73) || defined(_16C74)
#define	LP_OSC		0x00
#define	XT_OSC		0x01
#define	HS_OSC		0x02
#define	RC_OSC		0x03

#define	WDT_ENABLED	0x04
#define	WDT_DISABLED	0x00

#define	PWRT_ENABLED	0x08
#define	PWRT_DISABLED	0x00

#define	CP_OFF		0x3FB0
#define	CP_1_2		0x2AA0
#define	CP_3_4		0x1590
#define	CP_FULL		0x0080
#endif

#if defined(_16C62A) || defined(_16C63) || defined(_16C64A) || defined(_16C65A) || defined(_16C72) || defined(_16C73A) || defined(_16C74A)
#define	LP_OSC		0x00
#define	XT_OSC		0x01
#define	HS_OSC		0x02
#define	RC_OSC		0x03

#define	WDT_ENABLED	0x04
#define	WDT_DISABLED	0x00

#define	PWRT_ENABLED	0x00
#define	PWRT_DISABLED	0x08

#define	BOD_ENABLED	0x40
#define	BOD_DISABLED	0x00

#define	CP_OFF		0x3F30
#define	CP_1_2		0x2A20
#define	CP_3_4		0x1510
#define	CP_FULL		0x0000
#endif

#if defined(_16C76) || defined(_16C77)
#define	LP_OSC		0x00
#define	XT_OSC		0x01
#define	HS_OSC		0x02
#define	RC_OSC		0x03

#define	WDT_ENABLED	0x04
#define	WDT_DISABLED	0x00

#define	PWRT_ENABLED	0x00
#define	PWRT_DISABLED	0x08

#define	BOD_ENABLED	0x40
#define	BOD_DISABLED	0x00

#define	CP_OFF		0x3FB0
#define	CP_1_2		0x2AA0
#define	CP_3_4		0x1590
#define	CP_FULL		0x0080
#endif

#endif