1

Je ne peux pas remplir un tableau de grande taille, surement parce qu'il n'y a plus assez de mémoire...Faut il que j'utilise les transferts DMA? comment ça marche pour un tableau comme ça:

int zbuffer[160][240];

for (i=0; i<160; i++)
{
for (j=0; j<240; j++)
{
zbuffer[i][j]=0;
}
}

2

GUNNM a écrit :
Je ne peux pas remplir un tableau de grande taille, surement parce qu'il n'y a plus assez de mémoire...Faut il que j'utilise les transferts DMA? comment ça marche pour un tableau comme ça:

int zbuffer[160][240];

for (i=0; i<160; i++)
{
for (j=0; j<240; j++)
{
zbuffer[i][j]=0;
} }



Ben en faisant DmaClear(3, 0, Zbuffer, (Size du tableau colonne*ligne), 16);

Sinon voila la définition de la fonction de chez nintendo (intégré au gnu)

/////////////

#define DmaClear(DmaNo, Data, Destp, Size, Bit)
{
vu##Bit Tmp = (vu##Bit )(Data);
DmaSet(DmaNo, &Tmp, Destp, (
DMA_ENABLE | DMA_TIMMING_IMM |
DMA_SRC_FIX | DMA_DEST_INC |
DMA_##Bit##BIT_BUS | ((Size)/(Bit/8))));
}

#define DmaClearIf(DmaNo, Data, Destp, Size, Bit)
{
vu##Bit Tmp = (vu##Bit )(Data);
DmaSet(DmaNo, &Tmp, Destp, (
DMA_ENABLE | DMA_TIMMING_IMM |
DMA_IF_ENABLE |
DMA_SRC_FIX | DMA_DEST_INC |
DMA_##Bit##BIT_BUS | ((Size)/(Bit/8))));
}

#define DmaArrayClear( DmaNo, Data, Destp, Bit)
DmaClear( DmaNo, Data, Destp, sizeof(Destp), Bit)

#define DmaArrayClearIf(DmaNo, Data, Destp, Bit)
DmaClearIf( DmaNo, Data, Destp, sizeof(Destp), Bit)

//* Clear RAM with DMA.
//* Clear Data is placed in a Stack and copied to the Destination.
//* DmaClearIf/DmaArrayClearIf generates an Interrupt Request when ending.
//* DmaArrayClear/DmaArrayClearIf clears the entire Destination Array.
//
//* Arguments:
// DmaNo DMA Number
// Data Clear Data
// Destp Destination Address
// Size Clear Byte Size
// Bit Transfer Bit Width (16|32)
//
//
// *By running DMA with a program in the CPU internal RAM,
// the instruction immediately following is executed first.
// Due to this, when you attempt to change the transfer
// destination with the CPU directly following DMA, the DMA
// will run during Read/Rewrite. Thus, there are cases when
// the DMA destination data can become a value that was not
// intended. In this case, if you insert DmaWait() directly
// following, you can check if DMA has finished and be sure to
// avoid any impact on following code.
-=Rh@ziel=-

3

Merci beaucoup rhaziel top
C'est bien plus compliqué que tout ce que j'ai fait maintenant....Va falloir que je m'accroche...mad

4

DMA_ENABLE | DMA_TIMMING_IMM |
Ca fait partie d'une librairie? pour GCC?

5

GUNNM a écrit :
DMA_ENABLE | DMA_TIMMING_IMM | Ca fait partie d'une librairie? pour GCC?


C des define que j'ai dans un .h mais je sais plus ou je l'ai eu....

#define DMA_TIMMING_MASK 0x30000000 // Start Timing
#define DMA_COUNT_MASK 0x0000ffff // Transmission Count

#define DMA_TIMMING_SHIFT 30
#define DMA_COUNT_SHIFT 0

#define DMA_ENABLE 0x80000000 // DMA Enable
#define DMA_IF_ENABLE 0x40000000 // Interrupt Request Enable
#define DMA_TIMMING_IMM 0x00000000 // Run Immediately
#define DMA_TIMMING_V_BLANK 0x10000000 // Run V Blank
#define DMA_TIMMING_H_BLANK 0x20000000 // Run H Blank
#define DMA_TIMMING_DISP 0x30000000 // Run Display
#define DMA_TIMMING_SOUND 0x30000000 // Run Sound FIFO Request
#define DMA_DREQ_ON 0x08000000 // Data Request Synchronize Mode ON
#define DMA_16BIT_BUS 0x00000000 // Select Bus Size 16Bit
#define DMA_32BIT_BUS 0x04000000 // Select Bus Size 32Bit
#define DMA_CONTINUOUS_ON 0x02000000 // Continuous Mode ON
#define DMA_SRC_INC 0x00000000 // Select Source Increment
#define DMA_SRC_DEC 0x00800000 // Select Source Decrement
#define DMA_SRC_FIX 0x01000000 // Select Source Fixed
#define DMA_DEST_INC 0x00000000 // Select Destination Increment
#define DMA_DEST_DEC 0x00200000 // Select Destination Decrement
#define DMA_DEST_FIX 0x00400000 // Select Destination Fixed
#define DMA_DEST_RELOAD 0x00600000 // Select Destination
// Increment/Reload
-=Rh@ziel=-

6

si t'as plus de place en mémoire c'est pas en utilisant les accés dma que ça ira mieux (ils servent juste à aller plus vite).

rhaziel> ça fait partie de quelle bibliothèque le bout de code que tu nous a montré?
Vive le coding gba.
www.codegba.fr.st

7

Mat -> C'est un fichier Include qui fait partie de la librairie de developpement de Nintendo....

GunnM -> Mat a raison pour le problème de mémoire, les DMA vont juste accelerer les transferts mémoire, si tu as besoin de tableau de grande taille, je te conseille de les définir à partir de l'adresse 0x2000000, en Ram Externe donc, elle est moins rapide que la Ram Interne en temps d'acces mais tu disposes de 256 Kbytes, au lieu des 32KBytes de la Ram interne smile ......
-=Rh@ziel=-

8

Ok, ..."definir à partir de l'adresse 0x2000000, en Ram Externe " C'est comme un Malloc? comment tu fais ça sur GBA?

9

GUNNM
a écrit : Ok, ..."definir à partir de l'adresse 0x2000000, en Ram Externe " C'est comme un Malloc? comment tu fais ça sur GBA?


Non c pas vraiment comme un malloc, en fait si tu veux j'ai un fichier qui s'appelle GameExtRam.c, à l'intérieur de ce fichier je ne définis aucune fonction mais seulement toutes les variables, les tableaux ...etc.... que je veux voir apparaitre dans la ram externe, et ce fichier je le link en précisant à la compilation que je veux qu'il soit placé dans la ram externe à l'adresse 0x2000000, pour faire ça j'utilise un fichier script particuliers que je rajoute dans le makefile. Tu peux trouver des renseignements sur les fichiers de link à cette adresse

http://www.redhat.com/docs/manuals/gnupro/GNUPro-Toolkit-98r2/5_ut/b_Usingld/ldLinker_scripts.html

Par exemple dans ton cas tu pourrais avoir un fichier GameExtRam.c qui ressemblerait à ça

// GameExtRam.c

int zbuffer[160][240];

// End GameExtRam.c

Et un fichier .h

// GameExtRam.h

extern int zbuffer[160][240];

// End GameExtRam.h

et pour le module qui utilise ton tableau tu as juste au début du fichier à mettre

#include"GameExtRam.h"

pour le reste la gestion de la plage mémoire est gerée directement par le compilateur et le fichier de script smile.... voila c'est un peu compliqué je sais sad mais à partir du moment ou tu maitrise bien la mémoire tu as toute la place que tu veux smile....
-=Rh@ziel=-

10

Tu peux aussi spécifier la section dans laquelle mettre une variable directement dans GCC avec un __attribute__((section("toto"))) - cf. http://gcc.gnu.org/onlinedocs/gcc-3.2/gcc/Variable-Attributes.html. (Pas besoin de passer par un linker script.)

D'ailleurs, la définition des macros DmaClear et DmaClearIf n'est pas idéale.

Il faudrait plutôt mettre:

#define DmaClear(DmaNo, Data, Destp, Size, Bit)
({
vu##Bit Tmp = (vu##Bit )(Data);
DmaSet(DmaNo, &Tmp, Destp, (
DMA_ENABLE | DMA_TIMMING_IMM |
DMA_SRC_FIX | DMA_DEST_INC |
DMA_##Bit##BIT_BUS | ((Size)/(Bit/8))));
})

#define DmaClearIf(DmaNo, Data, Destp, Size, Bit)
({
vu##Bit Tmp = (vu##Bit )(Data);
DmaSet(DmaNo, &Tmp, Destp, (
DMA_ENABLE | DMA_TIMMING_IMM |
DMA_IF_ENABLE |
DMA_SRC_FIX | DMA_DEST_INC |
DMA_##Bit##BIT_BUS | ((Size)/(Bit/8))));
})


ou, sans extensions GNU:

#define DmaClear(DmaNo, Data, Destp, Size, Bit)
do {
vu##Bit Tmp = (vu##Bit )(Data);
DmaSet(DmaNo, &Tmp, Destp, (
DMA_ENABLE | DMA_TIMMING_IMM |
DMA_SRC_FIX | DMA_DEST_INC |
DMA_##Bit##BIT_BUS | ((Size)/(Bit/8))));
} while (0)

#define DmaClearIf(DmaNo, Data, Destp, Size, Bit)
do {
vu##Bit Tmp = (vu##Bit )(Data);
DmaSet(DmaNo, &Tmp, Destp, (
DMA_ENABLE | DMA_TIMMING_IMM |
DMA_IF_ENABLE |
DMA_SRC_FIX | DMA_DEST_INC |
DMA_##Bit##BIT_BUS | ((Size)/(Bit/8))));
} while (0)
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

11

__attribute__((section("toto")))
Comment je déclare la section "toto", j'ai bien lus la doc mais c'est justement pas très clair pour arm.
Y'a t'il un linker script par defaut? Où des sections specifiques? (j'ai vus .iwram et .ewram sur http://www.devrs.com/gba/files/gbadevfaqs.php#Sections mais ce sont des pointeurs vers un linker script je pense...)

12

Tu utilises __attribute__ ((section (".iwram"))) ou __attribute__ ((section (".ewram"))), le linker (ou plus précisément son script linker standard) s'occupe du reste normalement.
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

13

Kevin Kofler a écrit :
Tu utilises __attribute__ ((section (".iwram"))) ou __attribute__ ((section (".ewram"))), le linker (ou plus précisément son script linker standard) s'occupe du reste normalement.


Je connaissais pas je vais tester ça smile
-=Rh@ziel=-

14

Ouaip, ça a marché nickel, merci Kevin top

15

-

16

Dejà demandé wink serait'ce un developpeur NINTENDO ?

17

GUNNM a écrit :
Dejà demandé wink serait'ce un developpeur NINTENDO ?


euh oué je développe des jeux sur Gba.... mais bon le .h ke j'ai mis en extrait n'a rien de particuliers c juste les principaux registres d'axx Dma de la Gba rien de plus, je crois kil y a l'équivalent dans le devkit advance mé pas avec lé même define c tout....
-=Rh@ziel=-

18

-

19

Ou des infos sur ce qu'il y a dans la rom? comme des tables sin/cos?

20

Avec le kit officiel de nintendo tu n'as absolument aucune routine de fournit sad que ce soit en 2d ou en 3d, idem pour les cos/sin, c'est a toi de te faire tes propres tableaux. Le kit officiel en fait comprends toutes les lib/include pour tout ce qui est sytème et pile de sauvegarde, mais c tout le reste c o developpeur de se débrouiller.... Pour ce qui est de la zic, nintendo livre offciellement Music Player 2000, ki est il faut l'avouer pas mal du tout (y a aussi Musik X mais lui est payant), mais bon c'est tout, en fait nintendo livre le minimum, aprés c'est a la recherche & developpement de créer ses propres moteurs de jeu, gestion sprites/maps/game.....etc.... Ce kil y a de bien c'est le kit de dev avec un bon débugger, mais c'est tout le reste c'est pratiquement kom développer sur dev kit advance en fait.....
-=Rh@ziel=-

21

Terrible top

22

-

23

non nintendo ne fournit pas de routines particulières, juste kelke exemple de programmes c'est tout. Pour le kit de developpement je ne sais pas combien il vaut mais c'est très cher... c'est en fait un boitier SCSI relié au Pc avec une Gba spéciale auto alimenté connecté en permanence au boitier par une nappe souple style nappe ide.Et le kit est livré avec un débugger Temps réél qui permet de tracer au pas a pas son code C++.
-=Rh@ziel=-

24

j'en veux un, j'en veux un wink
Reunion Island Powaaaa