Ce qui est très limitatif une fois linké les sprites, fonds, sons...
Pourtant, une cartouche Lynx fait 256ko en moyenne.
Vous pouvez donc choisir de faire une compil en mettant plusieurs jeux sur le même cartouche, ou ajouter les datas en externes et les charger en mémoire vive.
Malheureusement, les fonctions de gestion des fichiers ne sont pas terminées dans le kit BLL (à priori, le source ASM existe dans les librairies, mais elles ne sont pas disponibles pour els développement C car pas finalisées), mais il est possible de se débrouiller en faisant des lectures par blocs.
C'est ce point que nous allons aborder maintenant :
Tout d'abord le source C
#include <stdlib.h> #include <lynx.h> #include <lynxlib.h> #include "titre.pal" /* LYNX-specific #defines: */ #define BUTTON_OUTER 0x01 extern char FileEntry[8]; /*_FileEntry : struct of 8 bytes FileStartBlock ds 1 FileBlockOffset ds 2 FileExecFlag ds 1 FileDestAddr ds 2 FileFileLen ds 2 */ char titre[2048]; char musak[35000]; char SCREEN[8160] at (0xfff8-16320); // screen 1 extern char SCB1[]; #asm _SCB1 dc.b $c7,$10,$20 dc.w 0,0 dc.w 0,0,$100,$100 ; Because we didn't use -C when calling SPRPCK we can ; use the same colour palette indexes for all tiles dc.b $01,$23,$45,$67,$89,$Ab,$cd,$ef #endasm /*********************/ /* wait for a button */ /*********************/ char WaitButton() { char key; while (joystick); while ( (key = joystick) != BUTTON_OUTER) ; /* wait for the button to be released */ while ( joystick ) ; return key; } /************************************************************************** ** ** ** ** **************************************************************************/ main() { char i; InitIRQ(); CLI; SetBuffers(SCREEN, 0,0); SmpInit(0,1); EnableIRQ(1); /* set the palette */ SetRGB(pal); LoadCartDir(2); DrawFBox(0,0,160,102,i); LoadCartBlock(FileEntry[0], titre); LoadCartBlock(FileEntry[0]+1, titre+1024); SCBDATA(SCB1) = titre; DrawSprite(SCB1); WaitButton(); LoadCartDir(5); for (i=0; i<33; i++) LoadCartBlock(FileEntry[0]+i, musak+i*1024); SmpStart(musak,0); for( ; ; ); }
Le programme est compilé, assemblé et liké, on obtient un fichier test.o
Il faut ensuite créer une image Lynx avec le programme LYNXER
Pour celà, on crée un fichier test.mak et on appelle la commande LYNXER test.mak
Contenu de test.mak :
INSERT.O test.o #ALIGN fond.spr #ALIGN ti002000.spr #ALIGN ti003000.spr #ALIGN test.lsf
insert.o = traitement d'init de la lynx
test.o = notre programme
Ensuite, il s'agit des fichiers à inclure, soit :
fond.spr
ti00200.spr
ti003000.spr : 3 sprites 160x102 dans ce cas (gérénés par sprpck sans préciser l'option -p0)
test.lsf : un sample généré par wav2lsf (voir tuto sonorisez votre lynx)
Pour simplifier la gestion, les fichiers sont alignés sur le début d'un bloc grâce à la commande #ALIGN à mettre sur la ligne précédente.
On obtient un fichier test.lyx à flasher sur cartouche.
Pour tester avec Handy, il faut le transformer en image avec make_lnx test.lyx -b0 256k
Bon, maintenant, l'explication du programme :
On définit donc 2 espaces mémoire titre (un sprite 160x102 prend 2048 octets) et musak (taille en fonction du fichier .lsf).
Chargement et affichage du fond :
LoadCartDir(2); LoadCartBlock(FileEntry[0], titre); LoadCartBlock(FileEntry[0]+1, titre+1024); SCBDATA(SCB1) = titre; DrawSprite(SCB1);
LoadCartDir permet d'initialiser le tableau FileEntry pour le fichier passé en paramètre (ici 2, donc fond.spr)
FileEntry[ 0] contient le n° de bloc contenant le début du fichier, comme on a spécifié #ALIGN, on sait que le fichier débute en début de bloc.
LoadCartBlock charge 1 bloc de 1024 octets spécifié en premier paramètre à l'adresse donnée dans le deuxième paramètre.
Comme un sprite fond fait 2 blocs, on duplique LoadCartBlock (chargement du bloc suivant 1024 octets plus loin dans titre)
Ensuite, on affiche le sprite
Pour le sample, chez moi, il fait 33 ko, donc au lieu de dupliquer 33 fois LoadCartBlock, j'ai fait une boucle, mais le principe est le même :
LoadCartDir(5); for (i=0; i<33; i++) LoadCartBlock(FileEntry[0]+i, musak+i*1024); SmpStart(musak,0);
Une fois musak chargée, il suffit de la jouer.
Voilà, c'est rapide et nouveau pour moi, mais je pense que ça peut être utile à quelqu'un.
et si vous avez des questions ou des précisions à apporter, n'hésitez pas.