1

Comme vous le savez, la ram de la Lynx fait 64ko, donc cotre programme ne peut pas dépasser cette taille.
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.
avatar
De nouveaux jeux pour vos vieilles consoles ? En 2024 ?
https://yastuna-games.com

2

top
avatar
Webmaster du site Ti-FRv3 (et aussi de DevLynx)
Si moins de monde enculait le système, alors celui ci aurait plus de mal à nous sortir de si grosses merdes !
"L'erreur humaine est humaine"©Nil (2006) // topics/6238-moved-jamais-jaurais-pense-faire-ca

3

Merci Fadest, l'explication est assez claire je pense, j'ai quand même 2 petites questions :
extern char FileEntry[8];  
/*_FileEntry : struct of 8 bytes 
FileStartBlock  ds 1 
FileBlockOffset ds 2 
FileExecFlag    ds 1 
FileDestAddr    ds 2 
FileFileLen     ds 2 
*/ 

extern char FileEntry[ 8] c'est pour permettre la lecture par blocs?
Tout ce qui est commenté après, ça sert à quoi?
Previously known as Damdam

4

En fait, les commentaires proviennent du source assembleur de la librairie.
La structure FileEntry est initialisé par la fonction LoadCartDir.
FileEntry est définie comme une structure de 8 octets :
- bloc contenant le début du fichier
- offset dans le bloc du début du fichier (par exemble, commence au 528° octet)
- flag indiquant si c'est un programme je présume
???
???

Il n'y a pas trop de doc, donc je devine au nom ce que font les variables.

FileEntry n'est pas exportée par la librairie, ni définie dans les fichiers include, c'est pourquoi je le défini dans mon programme.
Je l'ai déclaré sous la forme d'un tableau de 8 octet et non d'un struct uniquement parce que je n'ai besoin que du premier octet (FileEntry[0] = FileStartBlock). En effet, je trouve polus simple d'aligner le début de fichier sur un bloc pour ne pas avoir à gérer l'offset, vu qu'on ne paut lire que bloc par bloc pour l'instant (les routines lecture de fichier et octet / octet semblent exister, mais comme elles ne sont pas déclarées en externe et que j'ai lu quelque part que la gestion de fichiers n'était pas terminée...)


[EDIT(vince)] la moitié du texte en blanc ça le faisait pas...
avatar
De nouveaux jeux pour vos vieilles consoles ? En 2024 ?
https://yastuna-games.com

5

???=>adresse de chargement mémoire il me semble mais elle ne doit pas être exmploitée par le soft actuel
???=>longueur réelle de l'entrée dans le block

à vérifier bien entendu.


pour la lecture par octet, ça sous entends de parcourir autant d'adresses que sur un bloc, l'adressage se faisant par compteur...

je vais tenter de virer le [ 0 ] de ton texte...
avatar
Webmaster du site Ti-FRv3 (et aussi de DevLynx)
Si moins de monde enculait le système, alors celui ci aurait plus de mal à nous sortir de si grosses merdes !
"L'erreur humaine est humaine"©Nil (2006) // topics/6238-moved-jamais-jaurais-pense-faire-ca

6

Oups, merci Vince, je m'étais déjà fait avoir sur le premier post, c'est vrai que [ 0] sans espace, ça veut dire blanc sur les posts Yaronet wink
Sinon, je n'ai pas trop regardé la lecture d'un fichier, mais octet par octet, ça risque d'être un peu long pour un fichier de 35000 octets par exemple.
Il vaudrait mieux combiner le octet par octet sur les blocs incomplets et bloc par bloc sur les autres.
Mais comme on ne sait pas ce qui n'est pas sensé marcher dans les routines BLL...
avatar
De nouveaux jeux pour vos vieilles consoles ? En 2024 ?
https://yastuna-games.com

7

oki, merci Fadest et Vince. C'est clair qu'aligner au début de chaque bloc fait quelque chose de bien plus facile à gérer. Manque plus qu'à essayer maintenant wink
Previously known as Damdam

8

up parce que j'en aurais besoin ce soir wink
avatar
De nouveaux jeux pour vos vieilles consoles ? En 2024 ?
https://yastuna-games.com