#ifndef _INTERRUPTION
#define _INTERRUPTION

//Controleur maitre
#define Port1Maitre 0x20
#define Port2Maitre 0x21

//Controleur esclave
#define Port1Esclave 0xA0
#define Port2Esclave 0xA1

//Taille (en octet) de la structure d'une entrée dans l'idt
#define TAILLEINTGATE 8

//Le type d'une interrupt gate avec P=1 && DPL=0
#define INTGATETYPER0    0x8E00 //Interrupt Gate, P=1, DPL=0 1000111000000000

//Le type d'une trap gate avec P=1 && DPL=3 //Trag gate => le flag IF n'est pas touché
#define TRAPGATETYPER3   0xEF00 //Trap Gate, P=1, DPL=3 1110111100000000

//Macro qui va permet de masque l'interruption du clavier en allant dealer avec le controleur d'int
#define MasqueInterruptionClavier EcritureSurPort(Port2Maitre, 2); //00000010

//Macro qui va permet de masque l'interruption du clavier en allant dealer avec le controleur d'int
#define DemasqueInterruptionClavier EcritureSurPort(Port2Maitre, 0); //00000000

//La structure définissant les entrées de l'idt
typedef struct 
{
    unsigned short offset0_15;
    unsigned short segmentSelector;
    unsigned short type;
    unsigned short offset16_31;    
}__attribute__ ((packed)) INTERRUPTGATE, *PINTERRUPTGATE ;

//Structure du registre IDTR
typedef struct
{
	unsigned short limite;
	unsigned int    base;
} __attribute__ ((packed)) IDTR, *PIDTR;


//Fonction qui va créer, charger l'idt (interupt descriptor table)
void chargementIDT(void);

//Fonction qui va configurer les controleurs d'interruptions (maitre/esclave)
void configurationControleursInteruptions(void);

//Fonction qui va forger et remplir une structure du type INTERRUPTGATE
void initialiseDescripteurDeVecteurInt(void*, unsigned short, unsigned short, PINTERRUPTGATE);

//Fonction de traitement des interruptions du clavier ; cette fonction est appelé par traiteInterruptionClavier
void isrIntClavier(void);

//Fonction de traitement des defauts de page, cette fonction est appelé par traitePageFault
void isrPageFault(void);

//Fonction qui prend en charge le traitement des appels systèmes
void isrIntAppelSysteme(void);

//Fonction qui se charge de la protection general
void isrGP(void);

//Fonction de traitement des interruptions qui ne necessitent pas un traitement spécial
extern void traiteInterruptionParDefaut(void);

//Fonction de traitement des interruptions hardware qui ne necessitent pas un traitement spécial (pour le controleur maitre)
extern void traiteInterruptionHardwareParDefautCtrlM(void);

//Fonction de traitement des interruptions hardware qui ne necessitent pas un traitement spécial (pour le controleur esclave)
extern void traiteInterruptionHardwareParDefautCtrlE(void);

//Fonction de traitement des interruptions du clavier
extern void traiteInterruptionClavier(void);

//Fonction de traitement des defauts de pages
extern void traitePageFault(void);

//Fonction de traitement des appels systèmes
extern void traiteAppelSysteme(void);

//Fonction de traitement #GP
extern void traiteGP(void);

#endif