/* PICCOLO project
 * Copyright (c) 2009-2010 Istvan Cserny (cserny@atomki.hu)
 *
 */

/** \file
 *  Ez a header állomány gondoskodik a RESET és az interupt vektorok
 *  áthelyezéséről, s a PIC18F14K50 és a PIC18F4550 kísérleti áramkörök közötti
 *  triviális eltérések feloldásáról. 
 */

/** Konfigurálás ***************************************************/
//-- Aktiválja a következő sort a programmegszakítások használatához! 
//#define USE_INTERRUPT 

/* BOOTLOADER *********************************************************
* Az itteni definícióval szinkronban a Linker számára is definiálja
* a HID_BOOTLOADER vagy MCHPUSB_BOOTLOADER szimbólumot az MPLAB
* Project/Build options/Project menüpontban az MPLINK Linker fülre
* kattintva, s az Use Alternate Settings kiválasztása után, /u kapcsolóval!  
**********************************************************************/
//--- Aktiválja az alábbi sort a HID BOOTLOADER használatához
#define HID_BOOTLOADER

//--- Aktiválja az alábbi sort az MCHPUSB BOOTLOADER használatához
//#define MCHPUSB_BOOTLOADER



/** INCLUDE állományok *********************************************/
#include <p18cxxx.h>


/** PRIVATE prototípusok *******************************************/
  void hi_isr(void);
  void lo_isr(void);


/** Vektorok áthelyezése  ******************************************/
	
	#if defined(HID_BOOTLOADER)
		#define RESET_VECTOR			0x1000
		#define HIGH_INTERRUPT_VECTOR	0x1008
		#define LOW_INTERRUPT_VECTOR	0x1018
	#elif defined(MCHPUSB_BOOTLOADER)	
		#define RESET_VECTOR			0x0800
		#define HIGH_INTERRUPT_VECTOR	0x0808
		#define LOW_INTERRUPT_VECTOR	0x0818
	#else	
	  	#define RESET_VECTOR			0x0000
		#define HIGH_INTERRUPT_VECTOR	0x0008
		#define LOW_INTERRUPT_VECTOR	0x0018
	#endif

    #if defined(HID_BOOTLOADER)||defined(MCHPUSB_BOOTLOADER)	
	extern void _startup (void);
	#pragma code REMAPPED_RESET_VECTOR = RESET_VECTOR
	void _reset (void)
	{
	    _asm goto _startup _endasm
	}
    #endif

	#pragma code REMAPPED_HIGH_INTERRUPT_VECTOR = HIGH_INTERRUPT_VECTOR
	void Remapped_High_ISR (void)
	{
          #if defined(USE_INTERRUPT)
	         _asm goto hi_isr _endasm
          #endif            
	}

	#pragma code REMAPPED_LOW_INTERRUPT_VECTOR = LOW_INTERRUPT_VECTOR
	void Remapped_Low_ISR (void)
	{
          #if defined(USE_INTERRUPT)
            _asm goto lo_isr _endasm
          #endif  
	}	

	#pragma code	
/*********************************************************************
 *  Üres eljárások az elszabadult interruptok megfékezésére,
 *  ha a felhasználó nem akar programmegszakítást használni!
 ********************************************************************/
#ifndef USE_INTERRUPT
	#pragma interrupt hi_isr
	void hi_isr()
	{
	   _asm return 1 _endasm
	}	
	
	#pragma interruptlow lo_isr
	void lo_isr()
	{
	   _asm return 1 _endasm		
	}
#endif



/** DECLARATIONS ***************************************************/
#if defined(__18F14K50)
  #define LEDport LATC
  #define LEDtris TRISC
  #define LED1 LATCbits.LATC0
  #define LED2 LATCbits.LATC1
  #define LED3 LATCbits.LATC2
  #define LED4 LATCbits.LATC3
  #define SW1 PORTAbits.RA3
#elif defined(__18F4550)
  #define LEDport LATD
  #define LEDtris TRISD
  #define LED1 LATDbits.LATD0
  #define LED2 LATDbits.LATD1
  #define LED3 LATDbits.LATD2
  #define LED4 LATDbits.LATD3
  #define SW1 PORTBbits.RB4
#else
   #error "A választott mikrovezérlő típust nem támogatja a PICCOLO project!"
#endif
