//A écrire dans le registre de contrôle pour:
//Démarrer le transfert
#define DMA_ENABLED 0x80000000
//Tout de suite, sont possibles aussi à la prochaine HBLANK, VBLANK ou FIFO (son).
#define DMA_TIMING_IMMEDIAT 0x00000000
//Transfert 16 bits.
#define DMA_16 0x00000000
//Transfert 32 bits.
#define DMA_32 0x04000000
//Décrémente le compteur de la destination
#define DMA_DSTDECREMENT (0x00200000)
//Décrémente le compteur de la source
#define DMA_SRCDECREMENT (0x00800000)
//Fixe le compteur de la source
#define DMA_SRCFIXE (0x01000000)


//Contient directement les options nécessaires pour commencer à copier 16 ou 32 bits.
#define DMA_16im (DMA_ENABLED | DMA_TIMING_IMMEDIAT | DMA_16)
#define DMA_32im (DMA_ENABLED | DMA_TIMING_IMMEDIAT | DMA_32)


//Fonction de copie DMA (un peu comme un memcpy)
void CopieDMA (void *source, void *dest, unsigned int nbval, unsigned int mode)     {
    if (mode==DMA_16im || mode==DMA_32im)        {
        //Remplissage des registres. Cf rapport.
        REG_DM3SAD = (unsigned int) source;
        REG_DM3DAD = (unsigned int) dest;
        REG_DM3CNT = nbval | mode;
    }
}

//Copie un objet entier de source vers destination. La taille de l'élément source doit
//être un multiple de deux octets.
#define CopieObjet(source,destination)   CopieDMA((void*)(source),(void*)(destination),sizeof(source)>>1,DMA_16im)

//Copie source vers destination. La taille doit être un multiple de deux octets.
#define Copie(source,destination,taille)   CopieDMA((void*)(source),(void*)(destination),(taille)>>1,DMA_16im)


