/****************************************************************************

  System header file for BoostC compiler

  Don't include this file directly into your code.
  It will be included via system.h

  Copyright(C) 2003-2009 Pavel Baranov
  Copyright(C) 2003-2009 David Hobday

****************************************************************************/
#DEVICE P18F4455
#ifndef _BOOSTC_H_
#define _BOOSTC_H_

////////////////////////////////////////////////////////////
//NULL macro
#define NULL   0

////////////////////////////////////////////////////////////
//Helper macros
#define clear_bit( reg, bitNumb )   ((reg) &= ~(1 << (bitNumb)))
#define set_bit( reg, bitNumb )      ((reg) |= (1 << (bitNumb)))
#define test_bit( reg, bitNumb )   ((reg) & (1 << (bitNumb)))
#define toggle_bit( reg, bitNumb )   ((reg) ^= (1 << (bitNumb)))

////////////////////////////////////////////////////////////
//
#define abs(a) (((a)>=0)?(a):(-a)) 

////////////////////////////////////////////////////////////
//Make a 16 bit long value from two 8-bit long values
#define MAKESHORT( dst, lobyte, hibyte )   asm movf _##lobyte, W \
                  asm movwf _##dst \
                  asm movf _##hibyte, W \
                  asm movwf _##dst##+1

////////////////////////////////////////////////////////////
//Get low byte from 'src' and write it into 'dst'
#define LOBYTE( dst, src )      if( sizeof(dst) > 1 ) \
                  asm clrf _##dst##+1 \
               asm movf _##src, W \
               asm movwf _##dst
                        
////////////////////////////////////////////////////////////
//Get high byte from 'src' and write it into 'dst'
#define HIBYTE( dst, src )      if( sizeof(dst) > 1 ) \
                  asm clrf _##dst##+1 \
               asm movf _##src##+1, W \
               asm movwf _##dst

////////////////////////////////////////////////////////////
//Delay functions generated by linker
extern void delay_us( unsigned char t );
extern void delay_10us( unsigned char t );
extern void delay_100us( unsigned char t );
extern void delay_ms( unsigned char t );
extern void delay_s( unsigned char t );

////////////////////////////////////////////////////////////
//Built-in assembly
inline void nop( void )
{
   asm nop
}

inline void clear_wdt( void )
{
   asm clrwdt
}

inline void sleep( void )
{
   asm sleep
}

#ifdef _PIC16
  #ifdef PCLATH
  #ifdef PCL
inline void reset( void )
{
   pclath = 0;
   pcl = 0;
}
  #endif
  #endif
#elif _PIC18
inline void reset( void )
{
   asm reset
}
#endif

///////////////////////////////////////////////////////////////////
//String manipulation routine prototypes were moved to string.h
//
//Memory manipulation routine prototypes were moved to memory.h
//
//Character manipulation routine prototypes were moved to ctype.h
///////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////
//Dynamic memory allocation
extern void* alloc( unsigned char size );
extern void free( void *ptr );

////////////////////////////////////////////////////////////
//Functions used internally
extern unsigned long    __div_32_32( unsigned long a, unsigned long b );
extern unsigned long    __rem_32_32( unsigned long a, unsigned long b );
extern unsigned short   __div_16_16( unsigned short a, unsigned short b );
extern unsigned short   __rem_16_16( unsigned short a, unsigned short b );
extern unsigned char    __div_8_8( unsigned char a, unsigned char b );
extern unsigned char    __rem_8_8( unsigned char a, unsigned char b );

#ifdef _PIC16
extern unsigned char    __mul_8_8__8( unsigned char a, unsigned char b );
extern unsigned short   __mul_8u_8u( unsigned char a, unsigned char b );
extern signed short     __mul_8s_8u( signed char a, unsigned char b );
extern signed short     __mul_8s_8s( signed char a, signed char b );
extern unsigned long    __mul_16u_16u( unsigned short a, unsigned short b );
extern signed long      __mul_16s_16u( signed short a, unsigned short b );
extern signed long      __mul_16s_16s( signed short a, signed short b );
extern unsigned short   __mul_16u_16u__16( unsigned short a, unsigned short b );
extern signed short     __mul_16s_16u__16( signed short a, unsigned short b );
extern signed short     __mul_16s_16s__16( signed short a, signed short b );
extern unsigned long    __mul_32u_32u( unsigned long a, unsigned long b );
extern unsigned long    __mul_32s_32s( unsigned long a, unsigned long b );
#elif _PIC18
extern unsigned short __mul_8_8( unsigned char a, unsigned char b );
extern unsigned long __mul_16_16( unsigned short a, unsigned short b );
extern unsigned long __mul_32_32( unsigned long a, unsigned long b );
#endif

extern void __rom_get( unsigned char id, unsigned char idx );

#endif //_BOOSTC_H_
