:: PlayerAdvance.org ::  

Précédent   :: PlayerAdvance.org :: > :: Développement Amateur :: > Tutoriels

Publicité

Réponse
 
Outils de la discussion Modes d'affichage
Vieux 11/09/2006, 11h24   #1
Dr.Vince
Administrateur
 
Date d'inscription: 10/11/2005
Messages: 4 965
Voir les codes amis Nintendo DS Voir les codes amis Wii
Par défaut Gbfs

GBFS: Le tutoriel
Auteur: xFlash

I-Introduction

-Qu'est-ce-que GBFS?

GBFS est un système d'accès a des fichiers sur votre Gameboy. En effet la GBA ne possède pas de FileSystem(FS) et on n'accède à la mémoire de nos cartouches que sous la forme d'un énorme bloc mémoire accessible depuis 0x08000000h

-Pourquoi utiliser un système de fichiers?


Utiliser un tel système possède plein d'avantages dans le developemment sur GBA. Cela evites les transformations ou convertions de bon nombre des ressources (gfx/sfx/map/dialogue/...) necessaires au projet, car on les inclut directement, tel quel, sans changement. Adieu les bin2h, bin2obj ,...
Cela implique aussi des gains de temps dans les phases de compilation, car on evite les conversions/transformations de ses ressources lorsqu'on les modifie.

-Qui a écrit GBFS?

L'auteur de GBFS est Damian Yerrick-
Site internet : PinEight[

-Ou peut-on récupérer ces outils?

Ici : http://www.pineight.com/gba/gbfs.zip
ou ici : Mirroir PA



II-Comment ca marche?

Chaque fichier de données que vous désirez inclure à votre ROM est ajouté à la fin de votre ROM compilé. On accède à ces fichiers à l'aide de fonctions C présentes dans l'API de Damian.
Si on regrade en detail le resultat d'une ROM dans lequel est inclus GBFS et 2 fichiers par exemple, l'on obtiendrait ceci :

La "ROM compilé" est le resultat produit le linker d'un compilo, le fichier .bin ou .gba de votre projet.
Le "Header GBFS" est un fichier produit par l'outil (GBFS.exe fournit dans l'archive) qui decrit les entrées, noms et tailles de chaque fichiers inclus
Les Fichiers "TXT01.DLG" et "TXT02.DLG" sont les fichiers de ressources désirés


III-Comment l'inclure dans mon projet?


- Exemple

Imaginons que tel l'exemple précédent, vous ayez besoin d'inclure des fichiers de dialogues à longueur évidemment variable dans le temps et pour lequels, vous voulez y accéder depuis votre code.
Attention ceci est une exemple, vous pourrez tout aussi bien le faire avec des fichiers d'images, sons, map, etc.

- Procédure

Il faut ordonner a Make, plusieurs operations supplementaires :
  1. Generer le fichier .GBFS(le Header GBFS precedemment decrit + les fichiers désirés)
  2. Aligner la ROM a un pas de 256
  3. Inclure les fichiers de ressources

Que vous utilisez HAM ou non, la procedure est la meme. Je partirais d'un makefile issu d'un projet de HAM, car je vous sais nombreux à l'utiliser. Pour les autres, vous connaissez certainement très bien votre makefile et son langage, donc la modif ne devrait pas vous poser de soucis.

- Les modifications du makefile

Dans votre makefile, vous aviez avant une entrée du style:
Code PHP:

all 
: $(PROGNAME).$(EXT
Avec GBFS, Make ne doit pas s'arréter une fois la cible $(PROGNAME).$(EXT) générée.
Aussi on éditera le makefile ainsi:
Code PHP:

OFILES 
+= $(GBFS_HOME)\libgbfs.o
INCDIR 
+= $(GBFS_HOME)
DAT_FILES dlg\TXT02.DLG dlg\TXT02.DLG

$(PROGNAME).gbfs:
@$(
GBFS_HOME)\tools\gbfs.exe $(PROGNAME).gbfs $(DAT_FILES)

$(
PROGNAME)_GBFS.$(EXT): $(PROGNAME).$(EXT) $(PROGNAME).gbfs
@$(GBFS_HOME)\tools\padbin 256 $(PROGNAME).$(EXT)
@
copy /$(PROGNAME).$(EXT)+$(PROGNAME).gbfs $(PROGNAME)_GBFS.$(EXT)

all : $(PROGNAME)_GBFS.$(EXT
Vous remarquerez plusieurs choses:

- GBFS_HOME est une variable d'environnement contenant le chemin d'acces à votre distribution de GBFS décompressé.
- On rajoutes aux aobjet a compiler et a linker la librairie de gbfs
- GBFS.exe est l'outil qui vous générera un fichier .gbfs dans le repertoir de votre projet contenant une entete GBFS et les 2 fichiers de datas désirés. C'est ce qui est encadré en gris dans mon exemple plus haut.
- PADBIN.exe est un outil permettant d'aligner votre ROM a une valeur multiple de 2. Ils remplit le trou restant avec des 00. Ceci etant necessaire car le code de GBFS scanne la ROM de manière optimale avec une plage a 256. Explication de l'auteur :

Citation:
Envoyé par Damian

Note that this does a slow linear search at 256-byte strides, so make sure that your files are aligned to 256-byte boundaries and that you pass a start location close to (but not past) the beginning of the GBFS file.
De plus cette operation peut etre faite avec d'autres outils. Personnellement j'utilise GBAFIX de DarkFader permettant en plus de fixer le nom de la ROM dans la meme operation.
- La copie binaire concatène simplement la ROM et le fichier GBFS ensemble dans un nouveau fichier
- Ne pas oublier d'inclure

- Utilisation de GBFS dans le code

Une fois dans votre code, l'utilisation de GBFS est assez simple. La complexité réside plus dans ce que vous allez faire de la ressource incluse, ex: Décompression, lecture de BMP/JPG, ...
Aussi voici un exemple de ce que vous pouvez faire avec l'exe^mple precedent.
Code PHP:

#include <gbfs.h>

#define GBFS_ENTRY_NAME_LGMAX 24

/**
Variables globales
**/
//pointeurs sur données de texte
static const char*   pTxt1 NULL;
static const 
char*   pTxt2 NULL;
//pointeur sur la premiere structure GBFS trouvée
static GBFS_FILE*  pGBFSFile=NULL;

int main()
{
/**
Variables locales
**/
u32  uFileSizeuNbFiles;
char pFileName[GBFS_ENTRY_NAME_LGMAX];

//init
uFileSize 0;

//on recupere un pointeur sur la structure GBFS cherchée
pGBFSFile find_first_gbfs_file(find_first_gbfs_file);

//Attention:
// la subtilité ici est d'indiquer a GBFS de commencer sa recherche de la structure
// GBFS ajoutée à la ROM au plus proche de la ou elle pourrait etre.
// on pourrait tout a fait remplacer la ligne par :
// pGBFSFile = find_first_gbfs_file(0);
// auquel cas, GBFS commencerait a chercher depuis le debut de la Memoire
// ce qui pourrait etre très très lent...
// aussi on lui donne l'adresse de la fonction find_first_gbfs_file qui en memoire
// est l'une des derniere ajoutées a la ROM compilé donc une bonne estimation du
// plus proche endroit de la structure recherchée...
 
//on peut recuperer le nombre de fichiers presents
uNbFiles gbfs_count_objs(pGBFSFile);

//recuperation pointeur sur le premier fichier par son nom
pTxt1 gbfs_get_obj(pGBFSFile"TXT01.DLG", &uFileSize);

// on peut recuperer le 2eme fichier par son ordre dans la structure
pTxt2 gbfs_get_nth_obj(pGBFSFile1pFileName, &uFileSize);

//On peut a partir de la manipuler les données de notre fichier comme on le désire
//...

return 0;

IV-Autres choses?

Ne pas oubliez avec GBFS:
  • Le padding de la ROM a 256
  • Inclure libgfs.o en tout dernier lieu dans la chaine du linker
  • Les sources de GBFS sont fournies!! N'hesitez pas a y jeter un oeil. C'est assez instructif
  • Remercier l'auteur Damian Yerrick
  • Poser des questions ici, si vous avez des doutes.
Dr.Vince est déconnecté   Réponse avec citation

Publicité

Vieux 02/08/2008, 18h12   #2
greg15
Membre
 
Date d'inscription: 31/07/2008
Messages: 6
Par défaut

Merci pour ces explications

Dernière modification par greg15 ; 02/08/2008 à 18h27.
greg15 est déconnecté   Réponse avec citation
Réponse

Liens sociaux

Publicité



Utilisateurs regardant la discussion actuelle : 1 (0 membre(s) et 1 invité(s))
 
Outils de la discussion
Modes d'affichage

Règles de messages
Vous ne pouvez pas créer de nouvelles discussions
Vous ne pouvez pas envoyer des réponses
Vous ne pouvez pas envoyer des pièces jointes
Vous ne pouvez pas modifier vos messages

Les balises BB sont activées : oui
Les smileys sont activés : oui
La balise [IMG] est activée : oui
Le code HTML peut être employé : non
Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 03h04.


Édité par : vBulletin® version 3.7.2
Copyright ©2000 - 2022, Jelsoft Enterprises Ltd. Tous droits réservés.
Version française #16 par l'association vBulletin francophone
Design par Ass-Itch, DJP et Dr.Vince