#include <mygba.h>
#include "ecran.h"
#include "interruptions.h"

//On doit utiliser notre propre fonction RGB
#undef RGB
#define RGB(r,g,b)          ((r)+((g)<<5)+((b)<<10))

//Gestionnaire d'interruptions
void InterruptHandler(void);

int main(void)          {
    REG_DISPCNT=0x100;
	REG_IME=0;
	REG_IE = INT_HBLANK;
	REG_DISPSTAT = (1<<4);
	REG_INTERRUPT=(u32)&InterruptHandler;
	REG_IME=1;
	
	while(1)               {
	    //On peut effectuer notre travail indépendamment ici.
    }
	
    return 0;
}

//Gestionnaire d'interruptions
void InterruptHandler(void)
{
    u32 Int_Flag, i;
    //Désactive les interruptions (on ne doit pas être interrompu pendant les interruptions sinon en
    //général, c'est le plantage garanti).
    REG_IME = 0x00;
    //Sauve le contenu de Interrupt Flag pour plus tard.
    Int_Flag = REG_IF;
    //On vérifie quand-même que c'est la bonne interruption même si c'est la seule possible.
    if (REG_IF & INT_HBLANK)            {
        i=R_VCNT;				//La ligne en cours de dessin
        if (i<32)				//Rouge -> jaune
            Palette[0]=RGB(31,i,0);
        else if (i<64)				//Jaune -> vert
            Palette[0]=RGB(31-(i-32),31,0);
        else if (i<96)				//Vert -> cyan
            Palette[0]=RGB(0,31,i-96);
        else if (i<128)			//Cyan -> bleu
            Palette[0]=RGB(0,31-(i-96),31);
        else if (i<160)			//Bleu -> magenta
            Palette[0]=RGB(i-128,0,31);
        else					//Retour au rouge
            Palette[0]=RGB(31,0,0);
    }
    //Comme pour le PIC16F777A du cours uP1, on doit écrire sur IF pour acquiescer l'interruption (sinon
    //elle serait déclenchée en boucle).
    REG_IF = Int_Flag;
    //Réactive Interrupt Master Enable.
    REG_IME = 0x01;
}


/* END OF FILE */
