Voir la version complète : [GBA][Aide] utilisation du dma avec libgba
Bonsoir,
Est-ce que quelqu'un a deja utilise le dma3 avec l'api de la libgba. Si oui est ce que cette personne pourrait me coller juste un bout de code?
Merci bien et a bientot surement. :)
désolé j'avais pas vu ce message. :hum:
le code est tellement simple (3 lignes) que tu peut ne pas passer par une lib. ;)
//## Def: Game Pak/Internal Memory <--> Internal Memory
void GBA_CopyDMA3(void *pdst, void *psrc, unsigned long size, unsigned long type){
#define GBA_DMA_ENABLE 0x80000000 // dma actif
#define GBA_DMA_TIMING_IMMEDIAT 0x00000000 // lance la copie immediatement
#define GBA_REG_DMA3SAD *(volatile unsigned long*)0x40000D4 // source
#define GBA_REG_DMA3DAD *(volatile unsigned long*)0x40000D8 // destination
#define GBA_REG_DMA3CNT *(volatile unsigned long*)0x40000DC // opt
GBA_REG_DMA3SAD = (unsigned long)psrc ;
GBA_REG_DMA3DAD = (unsigned long)pdst ;
GBA_REG_DMA3CNT = type | size | GBA_DMA_TIMING_IMMEDIAT | GBA_DMA_ENABLE ;
#undef GBA_DMA_ENABLE
#undef GBA_DMA_TIMING_IMMEDIAT
#undef GBA_REG_DMA3SAD
#undef GBA_REG_DMA3DAD
#undef GBA_REG_DMA3CNT
}
désolé j'avais pas vu ce message. :hum:
le code est tellement simple (3 lignes) que tu peut ne pas passer par une lib. ;)
//## Def: Game Pak/Internal Memory <--> Internal Memory
void GBA_CopyDMA3(void *pdst, void *psrc, unsigned long size, unsigned long type){
#define GBA_DMA_ENABLE 0x80000000 // dma actif
#define GBA_DMA_TIMING_IMMEDIAT 0x00000000 // lance la copie immediatement
#define GBA_REG_DMA3SAD *(volatile unsigned long*)0x40000D4 // source
#define GBA_REG_DMA3DAD *(volatile unsigned long*)0x40000D8 // destination
#define GBA_REG_DMA3CNT *(volatile unsigned long*)0x40000DC // opt
GBA_REG_DMA3SAD = (unsigned long)psrc ;
GBA_REG_DMA3DAD = (unsigned long)pdst ;
GBA_REG_DMA3CNT = type | size | GBA_DMA_TIMING_IMMEDIAT | GBA_DMA_ENABLE ;
#undef GBA_DMA_ENABLE
#undef GBA_DMA_TIMING_IMMEDIAT
#undef GBA_REG_DMA3SAD
#undef GBA_REG_DMA3DAD
#undef GBA_REG_DMA3CNT
}
Merci Nesgba. :)
Tu as raison, j'ai surement voulu choisir un truc un peu inadequat comparé a ton code qui est precis et concis.
Sinon ne soit pas désolé de ne pas avoir vu le message. :) De toute facon, la patience est la mère de toutes les vertues. :D (la preuve en est.).
Merci pour ton code ca m'a bien aidé ;D Je suppose que type c'est pour annoncer a la gba quel type de bloc elle va devoir traité pour envoyer les donnees sur le bus? genre par paquets de 4 ou 8 octets?
en fait c'est plutôt des paquets de 2 ou 4 octets ;), après tu as des petites options sur la source et la destination (source/destination fixe, décrementation, j'aurai également aimé un offset entre chaque pixel :bave: mais bon)
unsigned char tsrc[240*160] ;
unsigned char tdst[240*160] ;
#define GBA_DMA_16 0x00000000 // copie en 16 bits
#define GBA_DMA_32 0x04000000 // copie en 32 bits
GBA_CopyDMA3(tdst,tsrc, (240*160)/2, GBA_DMA_16) ;
GBA_CopyDMA3(tdst,tsrc, (240*160)/4, GBA_DMA_32) ;
tout en sachant que les copies en 16 ou 32 bits vont pratiquement à la même vitesse. :hum:
Sinon, avec libgba, c'est très simple aussi:
dmaCopy(src, dst, size); // utilise la DMA3 par défaut, et sélectionne automatiquement le mode (32bits/16bits) selon la taille qu'on demande, et l'alignement des adresses.
Merci a tous les deux.
Thoduv, j'avais utilise cela et je n'avais aucun rendu de mon image.
J'ai utilise le code de nes, a savoir :
BA_REG_DMA3SAD = (unsigned long)psrc ;
GBA_REG_DMA3DAD = (unsigned long)pdst ;
GBA_REG_DMA3CNT = ... etc ...
et cela a fonctionne. :)
Merci du coup de mains ;)
Balou
vBulletin® v.3.7.2, Copyright ©2000-2008, Jelsoft Enterprises Ltd. Tous droits réservés - Version française vbulletin-fr.org