1

Salut,

Comme toujours j'arrive après la bataille et donc je tombe dans 70% des cas sur des sites qui ont disparu !
Peu nombreux sont les sites encore dispo évoquant la programmation sur lynx.
Je compte 2 forums et 2 sites, dont 1 en anglais germanique avec tous les liens morts.
- sections/424-255-developpeurs-lynx
- http://www.atariage.com/forums/index.php?s=3e628324787a56219f97a38fc6299ec5&showforum=53
- http://www.geocities.com/SiliconValley/Byte/4242/lynx/ (lien des Harware Addresses, mort c'est bien dommage)
- http://www.uni-giessen.de/~gd1113/lynx/kurs/

Bien sûr je connais le site qui est remit à toutes les sauces sur atariage : http://jum.pdroms.de/lynx/lynxprog.html et quelques autres, mais on est loin des explications pour débutants!

Quoiqu'il en soit, j'ai commencé à étudier les demos de Matthias et la première source de Fadest dans le topic de Rygar, mais j'aime bien comprendre ce que je fais et pourquoi je le fais.
Je suis donc parti à la recherche d'une description des fonctions, avec leurs arguments, ainsi que les valeurs possibles de ces derniers, mais j'ai trouvé que ca : http://www.geocities.com/SiliconValley/Byte/4242/lynx/lib_lynx.html
C'est bien maigre comme info. Je me demandais donc si vous aviez ce genre de manuel entre stock?!

Parce que rien que des trucs comme ca: (code de Fadest)
char SCREEN[8160] at (MEMTOP-16320);
char RENDER[8160] at (MEMTOP-8160);

Ca ne veut rien dire pour moi! Ok, on définit 2 constantes mais pourquoi 8160 et les "at (MEMTOP-16320); " et "at (MEMTOP-8160); "

Sachant qu'ensuite on les retrouve dans "SetBuffers(SCREEN, RENDER ,0); "
Si je regarde du côté des demos de Mister Domin on a "SetBuffers(0x9000,0,0);"
Quant à Bjoern c'est "SetBuffers(0xc000, 0xc000, 0x0);"
Hormis le dernier argument qui est toujours à 0, les 2 premiers non. Et surtout que d'un côté on a de l'hexa et de l'autre une constante système ou je ne sais quoi! ^^

Ca me laisse dubitatif toute cette histoire...


Ensuite "DrawFBox(0,0,160,102,0);", on définit la taille de l'écran mais la dernière variable peut changer (apparement le 15 donne du blanc). Quelles sont les valeurs possibles et le résultat final?

Et pour finir : "Vsync();" et "SwapBuffers();" qu'est-ce que ca fait?


PS: Vince j'ai bien reçu le PCB, merci. Maintenant va falloir me dire où souder les 13 fils! grin

Merci pour votre aide smile

-[DL]-

2

Darkline (./1) :
Salut,

Parce que rien que des trucs comme ca: (code de Fadest)



Ca ne veut rien dire pour moi! Ok, on définit 2 constantes mais pourquoi 8160 et les "at (MEMTOP-16320); " et "at (MEMTOP-8160); "

Sachant qu'ensuite on les retrouve dans "SetBuffers(SCREEN, RENDER ,0); "
Si je regarde du côté des demos de Mister Domin on a "SetBuffers(0x9000,0,0);"
Quant à Bjoern c'est "SetBuffers(0xc000, 0xc000, 0x0);"
Hormis le dernier argument qui est toujours à 0, les 2 premiers non. Et surtout que d'un côté on a de l'hexa et de l'autre une constante système ou je ne sais quoi! ^^

Ca me laisse dubitatif toute cette histoire...


Ensuite "DrawFBox(0,0,160,102,0);", on définit la taille de l'écran mais la dernière variable peut changer (apparement le 15 donne du blanc). Quelles sont les valeurs possibles et le résultat final?

Et pour finir : "Vsync();" et "SwapBuffers();" qu'est-ce que ca fait?


PS: Vince j'ai bien reçu le PCB, merci. Maintenant va falloir me dire où souder les 13 fils! grin

Merci pour votre aide smile

-[DL]-


Coucou smile

Je suis pas un specialiste de la Lynx, je suis une grosse b.... en C, mais certaines choses je peux t'expliquer par exemple :

char SCREEN[8160] at (MEMTOP-16320);
char RENDER[8160] at (MEMTOP-8160);

Cela permet de se reserver de la place pour un ecran virtuel, la Lynx a un ecran de 160*102 pixels, Fadest / Vince corrigez moi si je me trompes, une ligne de 160 pixels consomme 80 octets car un pixel est codé sur 4 bits (16 couleurs) donc un demi octet, donc 160 / 2=80 et si tu mutiplies par 102 cela te fait 80*102=8160 et hop le tour est joué.

Par exemple SCREEN sera une suite de 8160 octets. MEMTOP signifie le haut de la memoire, je supposes que c'est defini dans un fichier d'init ou d'autres et 16320 ben c'est 8160*2. Voili voila

Le setbuffer doit permetre de definir l'ecran logique et physique, en gros celui affiche par la console (Physique) et celui ou on gribouille (Logique).

Par exemple Domin a juste un ecran physique situé en $9000 dans la ram, bour Bjoern en $c0000, pour l'ecran physique et logique, donc il representeront exactement la meme chose. Pour Fadest c'est simple son premier ecran sera situe a Memtop-16320 et le Second a Memtop-8160, cela revient pareil, excepté que Fadest a pris des versions plus lisibles pour l'etre humain et surtout plus pratique.

DrawFBox(0,0,160,102,0)

Je supposes que cela permet de dessiner une boite de couleur derniere variable mais on attendra les pros pour confirmation.

Vsync pareil que partout cela permet d'attendre un signal de redessin de l'ecran, en gros cela permet de se synchroniser sur l'affichage de la console, je te l'expliquerais plus longuement mais pas ce soir, j'ai un code a debugger en urgences et Swapbuffer est liee au Vsync et permet je supposes (Encore une fois) d'echanger les deux ecrans pour faire de l'animation sur deux ecrans.


Plus de details par nos amis Lynxistes, sinon peut etre a demain soir smile

GT a la bourre top
avatar
Accrochez vous ca va être Cerebral !!

3

Voilà, c'est bien ça, 8160 c'est la taille mémoire pour un écran Lynx.
MEMTOP, c'est un variable définie qui correspond à la taille de la Ram dispo. Pourquoi utiliser une variable ? Ben, parce qu'il est possible d'activer le chargement du loader BLL et que celui ci se mettra derrière MEMTOP pour ne pas être effacé par notre programme.

Donc char SCREEN[8160] at (MEMTOP-16320); réserve 8160 octets pour y mettre un écran de travail (je n'ai que moyennement confiance dans le malloc du compilo Lynx, donc je préfère passer par une réservation expicite à l'initialisation).

SetBuffers permet de définir les 3 écrans :
- écran physique (celui affiché à l'écran)
- écran logique (celui sur lequel on dessine)
- écran de collision (qui permet à la Lynx de gérer les collisions au pixel prêt)

Si une valeur est à 0, c'est qu'on ne gère pas cet écran. si l'écran logique n'est pas utilisé, on dessine directement à l'écran. C'est plutôt déconseillé sauf pour des applis ne nécessitant pas d'anims.

SwapBuffers() permet d'achanger les écrans logiques et physiques (ainsi, o naffiche le nouvel écran).
Le princeipe est simple :
- on a un truc à l'écran
- on constuit l'écran suivant dans un coin de mémoire non affiché
- on échange de manière à ce que notre nouvel écran soit affiché

Le Vsync, c'est effectivement pour la synchronisation, histoire de faire la permutation au moment ou le faisceau de pixels est en haut à gauche et pas en plein milieu de l'écran (ça évite des scientillements et autres effets bizarre).
C'est très proche du mode de fonctionnement du ST (sauf le buffer de collision qui n'existe pas).

Pour le DrawFBox , c'est coordonnées x, y , largeur, hauteur, couleur (suivant ta palette). Il n'existe pas de fonction pour dessiner un rectangle, seulement une boite (pour la petite histoire, en fait, le DrawFbox est un sprite de 1 pixel x 1 pixel de la couleur voulue et zoomé par hard à la bonne dimension - et oui, tout est sprite sur la Lynx wink )


Pour le reste, tu dois pouvoir trouver des trucs ici : http://fadest.free.fr/spip (les tutos que j'avais fait pour Revival, sur Yaronet fut un temps). Je crois que Rigar les a également repris sur son site (et ça doit moins être fouilli que le spip mal foutu que j'ai lachement abandonné).

J'espère que ça t'aura aidé
avatar
De nouveaux jeux pour vos vieilles consoles ? En 2024 ?
https://yastuna-games.com

4

Merci à vous deux c'est clair. Enfin hormis le Vsync()!
Quand je regarde la source de Rygar (son aquarium), je ne comprends pas trop quand l'utiliser! A chaque "nouvelle page"?

Et il y a un truc qui m'est incompréhensible

POKE(0xFDA2, 0);

  TextOut(26, 20, 15, 0, "JEAN-PHILIPPE");
  TextOut(58, 36, 15, 0, "GARIN");
  TextOut(46, 65, 2, 0, "PRESENTE");
  SwapBuffers();

  for(j=0; 150 > j; j++) Vsync();  //temps avant que presente s'allume//

  for(i=0; 16 > i; i++) 
{ 

POKE(0xFDA2, i);for(j=0; 10 > j; j++) Vsync();

}
  

for(j=0; 255 > j; j++) Vsync();

Déjà le POKE()
Puis toujours et encore le Vsync!
Les 3 textOut sont à la suite, comment le programme peut comprendre que la boucle est là pour le "PRESENTE"? confus



Sinon Fadest j'ai un problème avec ton .bat!

Voici la structure de mes fichiers :
c:\lynx\bll\...
c:\lynx\newcc65\...
f:\lynx\projet_bis\...


et mon c.bat

cls
set PATH=c:\lynx\newcc65\bin
cd "%1"

cc65 -Ic:\lynx\newcc65\include\ "%1.c"

xopt "%1.m65"

ra65 "%1.m65" -o "f:\lynx\projet_bis\%1\%1.obj"  
del "%1.m65"

link65 "%1.obj" "%1.olb" "c:\lynx\newcc65\lib\c.olb" "c:\lynx\newcc65\lib\lynx.olb" -o "..\%1.o" 
del "%1.obj"

cd ..


Le truc c'est que lorsque je lance le BAT, j'ai une succession de "can't open x" où x est .c, puis .m65, ...

Où qu'il est le problème?
je me demande surtout comment le BAT va aller chercher le répertoire /test/ tout seul confus
En revanche, si je change les '%1' par 'test' ca marche sans problème! Ce qui est logique.
Enfin avec DOS faut pas trop m'en demander...
Z'auraient pu faire un GUI depuis le temps embarrassed *mode faignant*

Autre question (quand je commence je ne m'arrête plus...). Tu dis à Rygar que pour convertir les .bmp il faut faire : "SPRPCK -t6 -S160102 -p0 fond.bmp"
Alors que dans ton zip (kit d'aventure), c'est : "SPRPCK -t6 -S160102 -r001001 -o000000 -p0 fond.bmp fond"
Et dans le zip projet_bis, c'est : "-t6 -S009009 -r001001 -o000000 -p0 building2.bmp s0"

J'en profite pour une petite dernière. Comment ton kit d'aventure fait pour récupérer le fichier .txt? J'ai beau chercher, il n'y a à aucun moment dans les BATs ou la source une référence au fichier!

Comment... je me pose trop de questions! picol
J'suis curieux c'est pour ça... boing

-[DL]-

5

POKE ça met une valeur à une adresse

OR sur lynx la palette est de 16 couleurs parmi 4096 donc tu définis ta palette quelque part.

Le quelque part, c'est l'adresse 0xFDA0 (et les 32 octets suivants). 0xFDA2, c'est la couleur d'index 2 (on commence à 0) dans la palette, donc (cf la doc lynx) il s'agit de la valeur du vert sur les 4 bits de poids faible (valeurs 0 à 15).

On a vu que "PRESENTE" est affiché avec (comme par hasard) le rang de palette 2, donc la valeur verte sera à 0XFDA2. En faisant varier la valeur à cette adresse (avec un POKE), on change la couleur du sprite et on a donc l'impression de le voir apparaître.

for(j=0; 150 > j; j++) Vsync();

Pour la variable J partant de 0 et allant jusqu'à 149, on attends une synchronisation de l'écran, on augmente la variable J de 1 et on reboucle
(à 50 Hz ou 60Hz on aura respectivement 3secondes ou 2,5 secondes d'attente)


(à ce moment, "PRESENTE" n'est toujours pas différenciable du fond d'écran, la même couleur est utilisée)
  for(i=0; 16 > i; i++)  
{  
 
POKE(0xFDA2, i);
for(j=0; 10 > j; j++) Vsync(); 
 
} 

Pour la variable I allant de 0 à 15, on met la valeur de I comme couleur verte de l'index 2 de palette (l'adresse FDA2)
Ensuite on commence une boucle pour attendre 10 fois la synchronisation de l'écran ce qui donne un cinquième ou un sixième de seconde en fonction de la fréquence d'affichage.
A ce moment on augmente la valeur de I d'une unité et reboucle sur la première boucle...


Pour le .bat, il faut que tu appelles "c.bat test" le %1 est là pour indiquer qu'il faut récupérer le premier paramètre de la ligne de commande.

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

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

7

A moins que je n'ai pas compris, tu ne m'as pas dit à quoi servait le 2ème argument de POKE. confus

Mais mon problème en fait c'est que je ne comprends pas comment fonctionne l'affichage.
Dans ma logique, ca donne quelque chose comme ca : (pour le même résultat que Rygar)
char main(){
  InitIRQ();
  CLI;

  SetBuffers(SCREEN, RENDER ,0);
  SetRGB(pal);
  DrawFBox(0,0,160,102,0);  	  
  
  for(i=0;i<150;i++){	  	
    TextOut(26, 20, 15, 0, "JEAN-PHILIPPE");
    TextOut(58, 36, 15, 0, "GARIN");
    Vsync();	  
    SwapBuffers();	
  }
  TextOut(46, 65, 2, 0, "PRESENTE");	
  Vsync();	  
  SwapBuffers();

  for( ; ; );
}


-[DL]-

8

POKE : premier paramètre c'est l'adresse où écrire, second paramètre, c'est la valeur à écrire (un octet)
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

9

La lynx fonctionne avec un moteur de sprite, il se charge d'afficher les sprites que tu y affectes avec la palette que tu as défini. L'idée de l'exemple c'est de faire apparaitre le texte en jouant sur la palette alors que dans les faits, l'image reste tout le temps la même, c'est la définition des couleurs dans la palette qui font progressivement apparaitre "PRESENTE" mais il garde tout le temps l'index 2 de la palette.

On s'aligne sur les synchros (vsync) pour s'assurer qu'on ne va pas changer la valeur d'un pinceau (un index de palette est appelé "pencil" dans la doc d'origine) en plein milieu du raffraichissement de l'écran.


Ton code aurait pour effet d'initaliser le moteur de sprite avec deux buffers, affichage et rendu. Ensuite, tu positionnes la palette et tu remplis l'écran avec le pinceau n°0. Après tu boucles 150 fois et tu affiches 150 fois la même chose (Jean-Philippe Garin) sur le buffer de rendu, tu attends la synchro et tu swapes rendu<=>affichage. (un peu inutile de faire 150 fois la même chose sachant que ça ne change rien) Tu affiches alors PRESENTE et tu boucles à l'infini.
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

10

vince (./9) :
un peu inutile de faire 150 fois la même chose sachant que ça ne change rien

Oui je le conçois. tongue Mais y'a-t-il une fonction du même genre que delay() ou sleep()? Ou la seule solution c'est POKE()?


-[DL]-

11

//fonction qui attends nb_vbl (une vbl = 0,02 sec à 50Hz)
void attendre_sync (int nb_vbl){
     int i;
     for(i=0;i<nb_vbl;i++) Vsync();
}

//fonction qui attends nb_sec secondes
void attendre_sec(int nb_sec){
    int i;
    char j;
    char j_max;
    if (PEEK(0xFD93)==0X29) j_max=60; else j_max=50;
    for(i=0;i<nb_sec;i++){
        for(j=0;j<j_max;j++) Vsync();
    }
}
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

12

Le compilateur n'est pas content! grin Il n'accepte pas qu'on lui dise qu'on veut que nb_sec soit un entier.

Sinon j'ai un petit problème! Quand je passe à "PRESENTE" le texte d'avant s'en va...
C'est pas très gentil de me faire autant de misères sad

Donc si je comprends bien, c'est du C sans les fonctions.
Il faut toutes les réécrire. picol

13

c'est du C mais y'a pas de librairies par défaut.

cependant, rien ne t'empêche de les récupérer sur d'autres compilateurs (vu que le processeur central de la console est assez standard)
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

14

C'est bien ce que je voulais dire! oui

Et sinon pour mes 2 petits problèmes? Une idée?

15

le présente qui fait disparaitre le reste, c'est ptet une confusion entre buffer de rendu et d'affichage, pour le bout de code que j'ai improvisé, tu dois pouvoir le tester en remplaçant int par char
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

16

Pour ta fonction ca marche si j'enlève le int, mais je me demandais pourquoi.

Et c'est bien ce que je dis, j'y comprends rien à ces questions d'affichage.
Voila ce que j'ai fais :
char main(){
  InitIRQ();
  CLI;

  SetBuffers(SCREEN, RENDER ,0);
  SetRGB(pal);
  
  DrawFBox(0,0,160,102,0); 

  TextOut(26, 20, 15, 0, "JEAN-PHILIPPE");
  TextOut(58, 36, 15, 0, "GARIN");
  Vsync();
  SwapBuffers();
  
  attendre_sec(10);

  TextOut(46, 65, 2, 0, "PRESENTE");
  Vsync();
  SwapBuffers();

  for( ; ; );
}


embarrassed

17

C'est tout à fait normal, avant le swap buffer tu mets les deux premiers textes, après tu mets le troisième, tu as donc les deux premiers sur un buffer, et le troisième sur l'autre, le fait de swapper fait disparaitre les deux premiers et apparaitres le troisième

solution : travailler sur un seul buffer dans un premier temps (avec setbuffers(SCREEN, 0, 0); )
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

18

ah ben fallait le dire tout de suite, qu'il y avait un rapport entre SetBuffers and SwapBuffers embarrassed
Je te l'accorde je n'ai pas était fute fute sur ce coup tout de même. grin

Et donc pour nettoyer le screen, il faut faire un "DrawFBox(0,0,160,102,0);"
Par exemple, pour faire une balle (enfin un 'o') qui rebondie à l'horizontale, j'ai fait ca:
char main(){
  InitIRQ();
  CLI;

  SetBuffers(SCREEN, 0, 0);
  SetRGB(pal);

  y=0; lock=0;	
  
  for( ; ; ){
    if(y==156) lock=1; 
    else if(y==-4) lock=0; 
    	 
    if(lock==0) y+=2; 
    else y-=2; 
    	 
    DrawFBox(0,0,160,102,0);   	 
    TextOut(y, 36, 15, 0, "o"); 
    Vsync(); 	
  }

J'ai bon?

19

Hop, je reprends 3 questions en attente
Darkline (./4) :
Le truc c'est que lorsque je lance le BAT, j'ai une succession de "can't open x" où x est .c, puis .m65, ...

Où qu'il est le problème?
je me demande surtout comment le BAT va aller chercher le répertoire /test/ tout seul confus.gif En revanche, si je change les '%1' par 'test' ca marche sans problème! Ce qui est logique.

en fait, %1 en DOS, c'est l'utilisation d'un parametre. donc il faut taper la commande :
c test
pour compiler le projet test (%1 sera remplacer par test à l'exécution, un peu comme tu l'as fait une fois pour toutes à la main)
L'avantage d'utiliser des parametres, c'est que ça permet d'avoir plusieurs projets, mais un seul batch pour compiler. Maintenant, si tu te sens plus à l'aise avec les makefiles standard, tu devrais aussi pouvoir les utiliser, à toi de voir. Personnellement, je suis plutôt hermétique sad
Darkline (./4) :
Autre question (quand je commence je ne m'arrête plus...). Tu dis à Rygar que pour convertir les .bmp il faut faire : "SPRPCK -t6 -S160102 -p0 fond.bmp"
Alors que dans ton zip (kit d'aventure), c'est : "SPRPCK -t6 -S160102 -r001001 -o000000 -p0 fond.bmp fond" Et dans le zip projet_bis, c'est : "-t6 -S009009 -r001001 -o000000 -p0 building2.bmp s0"

En fait, il y a plein de parametres possibles pour SPRPCK

-t6 c'est pour dire que c'est un fichier BMP
-SXXXYYY c'est pour donner la taille du sprite à créer (XXX pixels de large par YYY pixels de haut)
- oXXXYYY c 'est l'offset (au cas ou le sprite ne soit pas en haut à gauche, on dit qu'il faut travailler à partir du pixel position XXX,YYY)
-rXXXYYY c'est pour découper un "tableau" de sprite. Par exemple, si tu a un perso avec n positions différentes pour son animation toutes à la suite, tu mettras -r010001
-p0 c'est pour forcer une création de sprite en objet linkable C, si on ne mets pas -p0, ce sera au format assembleur (ou alors à charger depuis la ROM en C à la main)

Je crois que si tu tapes sprpck sans rien tu peux récuperer l'aide
En tapant sprpck > sprpck.txt tu la récupèrera dans un fichier texte.

sinon, la voici :
Usage :
sprpck [-c][-v][-s#][-t#][-u][-p#]
[-axxxyyy][-Swwwhhh][-oxxxyyy][-iwwwhhh]
[-rxxxyyy] [-z] in [out]
or
sprpck batchfile
-c : compress color index
-v : don't be quiet
-s : sprite-depth 4,3,2,1 bit(s) per pixel (4 default)
-t : type 0 = 4bit raw, 1 = 8bit raw, 2 = SPS, 3 = PCX (3 is default)
type 4 = 1bit raw type 5 = PI1 (Atari ST), 6 = MS Windows BMP
-u : unpacked (packed is default)
-p : palette output-format : 0 - C, 1 - ASM, 2 - LYXASS(default)
-axxxyyy : action point (e.g. -a200020)
-Swwwhhh : sprite width and height (input-size is default)
-oxxxyyy : offset in data (e.g. -o010200 )
-iwwwhhh : input size (not needed for PCX)
-rxxxyyy : split picture into yyy * xxx tiles
-z : (only possible with -c) auto-set sprite-depth
in : input data
out : output filename, optional, default is in.spr

Note: With -p0 the sprite is saveed as cc65-Object file !

In batchmode, lines must have the same format as in command
line-mode, only if a input-file is defined in one line it can be
omitted in the following lines.

1bit raw = 8 pels per byte ( => -s1 is default )
4bit raw => 2 pels per byte
8bit raw => 1 pel per byte
SPS => ASCII-hex-number per pel (blank = 0)
PCX => either 8 bits / 1 plane or 1 bit /4 planes
PI1 => 1 bit / 4 planes , Atari ST Low Rez-format
BMP => either 8 bits or 4 bits not RLE encoded


Si tu veux des exemples des possibilités de sprpck, télécharges le yastuna 2 graphic pack (sur http://fadest.free.fr/Yastuna2 ) et regarde les fichiers .txt qui sont avec les bmp. Ce sont des lignes pour sprpck en mode batch, ça te permettra de faire le lien entre l'image bmp et son découpage. pour utiliser un de ces fichiers, il suffit de lancer :
sprpck fichier.txt et tout sera généré.
Darkline (./4) :
J'en profite pour une petite dernière. Comment ton kit d'aventure fait pour récupérer le fichier .txt? J'ai beau chercher, il n'y a à aucun moment dans les BATs ou la source une référence au fichier!

Oui parce que la Lynx ne gère pas de système de fichier comme on l'netend sur PC. Il y a juste une succession de fichiers, et on y accède par leur numéro.
J'avais fait un tuto la dessus (je pense qu'il est sur mon spip), mais pour résumer :
le premier fichier est toujours insert.o
le fichier suivant est exécuté automatiquement (jeu ou menu)
ensuite, c'est au programmeur de faire comme il veut (avec le BLL PC, on est limité à 14 fichiers, Rajah a dépassé cette limite dans sa version de compilo ST je crois)
Donc, pour lire un fichier en C, il faut déclarer un descripteur de structure fichier :
extern char FileEntry[8];
/*_FileEntry : struct of 8 bytes
FileStartBlock ds 1
FileBlockOffset ds 2
FileExecFlag ds 1
FileDestAddr ds 2
FileFileLen ds 2
*/

connaitre son numéro de rang dans la rom et utiliser la fonction LoadCartDir(numero) pour se positionner au début du bloc (ce sera lstocké dans FileEntry[0]) de contenant le début du fichier (pour des raisons pratiques, j'aligne le fichier au début d'un bloc), et ensuite utiliser la fonction LoadCartBlock(FileEntry[0], destination) pour lire un bloc (de 1024 octets sur une rom de 256ko). Donc, il faut faire une boucle pour lire tout un fichier (et connaitre sa taille à l'avance aussi). Tu retrouveras ces 2 fonctions dans le kit aventure pour plus de détails.

Dans le jeu d'aventure, la rom contient donc :
insert.o
aventure.o
aventure.txt (aligné)

Comme je n'ai pas le détail du kit aventure sous les yeux, je ne peux pas te dire dans quel fichier texte c'est spécifié (celui en .mak). c'est la programme lynxer qui regroupe tous ces fichiers en une seule rom à partir du fichier .mak.

Voilà, j'espère que ça t'aura aidé.


EDIT : (vince) j'ai corrigé les erreurs de balise
avatar
De nouveaux jeux pour vos vieilles consoles ? En 2024 ?
https://yastuna-games.com

20

Fadest (./19) :
Voilà, j'espère que ça t'aura aidé.

C'est nickel merci Fadest. Et merci Vince aussi, vous m'êtes d'une aide précieuse top

J'ai juste 3 questions. Après je pense que je vais pouvoir un peu avancer tout seul.
- Que vérifie la condition suivante : "if (PEEK(0xFD93)==0X29)" ?
- Dans les sources que j'ai trouvé sur cette page il y a des fichiers .raw A quoi servent-ils, hormis mettre plusieurs images dans un fichier?
- Prenons par exemple la labyrinthe du jeu Befok (lien au dessus). Pour que le personnage ne traverse pas les murs, faut-il tous les mapper, en faisant des conditions pour chacun de manière à ce que le personnage n'avance plus même si on appuie sur le touche?

Voila c'est tout.
En attendant, je vais essayer d'adapter un petit jeu flash qui ne paye pas de mine mais qui est bien sympa pour commencer smile

Bonne fin de week end!

@+

-[DL]-

21

Darkline (./20) :
- Que vérifie la condition suivante : "if (PEEK(0xFD93)==0X29)" ?


Ca permete de consulter le registre système PBKUP dont la valeur représente la fréquence d'affichage. C'est 0x29 pour 60Hz et je ne sais plus combien pour 50Hz...
Darkline (./20) :
- Dans les sources que j'ai trouvé sur cette page il y a des fichiers .raw A quoi servent-ils, hormis mettre plusieurs images dans un fichier?


Il s'agit de la représentation binaire (au format direct de la lynx) des données qu'ils contiennent. Il peut s'agir de n'importe quoi et il n'y a de limite que la taille de la RAM de la console.
Darkline (./20) :
- Prenons par exemple la labyrinthe du jeu Befok (lien au dessus). Pour que le personnage ne traverse pas les murs, faut-il tous les mapper, en faisant des conditions pour chacun de manière à ce que le personnage n'avance plus même si on appuie sur le touche?


Il y a plusieurs façons de procéder mais les deux plus "évidentes" sont :
- Utiliser le moteur de sprite et exploiter les colisions à l'affichage pour les limites du labyrinthe
- Créer une map (un tableau de N cases) qui contient des 1 quand il y a un mur et 0 sinon. Quand on essaye de se déplacer, si la case destination vaut 1, on ne bouge pas, si elle vaut 0, on effectue le traitement pour se déplacer.
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

22

vince (./21) :
Ca permete de consulter le registre système PBKUP dont la valeur représente la fréquence d'affichage. C'est 0x29 pour 60Hz et je ne sais plus combien pour 50Hz...

31 d'après la doc smile

Pour le reste je verrais plus tard j'ai déjà beaucoup à faire. tongue
A chaud je vois comment ca fonctionne mais pas du tout comment l'utiliser. Je ne vais pas partir dans de telles considérations aujourd'hui parce qu'on n'en finirait plus!

-[DL]-

23

Darkline (./4) :
Merci à vous deux c'est clair. Enfin hormis le Vsync()!


Bon le slide show est fini, j'ai un peu de temps, pour expliquer l'animation sur deux ecrans. Mais d'abord il y a une chose a bien comprendre, ce qu'on voit sur un ecran, moniteur, etc... n'est qu'une representation graphique d'un morceau de memoire, ou je veux en venir ? C'est simple, on peu travailleur sur un autre morceau de memoire ailleurs qui n'est pas affiche a l'ecran. Ecran qu'on baptise courament ecran logique et celui qu'on voit ecran physique car on le voit 'physiquement'...

Fadest a expliquer la chose, si tu dessines directement a l'ecran, car personne ou aucun materiel ne te l'interdit, ca avoir des effets de scintillement, clignotements.

Donc on dessine dans l'ecran logique bien cache hors ecran, et quand l'afficheur va vouloir recommencer a redessiner tout l'ecran, on a un signal baptisé Vsync (Vertical synchro) qui indique ce moment et pour des raisons techniques il faut echanger ton ecran logique et physique a ce moment, d'ou les swap buffers a cote des vsync.

Vsync presente aussi un chouette coté, on peut l'utiliser comme horloge, car ce signal est genere exactement a la meme periode (Sinon on aurait une image 'variable'), ce qui fait qu'on l'utilise parfois pour faire des pauses. Par contre ne faite cela que sur console, car sur un micro suivant la resolution d'affichage, le type de moniteur, ce signal pourra passer de 50 Hz a 70 Hz, etc... donc un changement de vitesse, qui fait que par exemples certaines musiques ST sur un Falcon en Vga tourne trop vite.


GT smile
avatar
Accrochez vous ca va être Cerebral !!

24

Merci de ton aide GT.
Va falloir que je trouve un moment pour avancer, mais la semaine c'est du genre impossible! Ca serait pas mal des journées de 48h grin

-[DL]-

25

mon patron applique déjà ça
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

26

On est deux alors grin Mais c'est du temps libre que je veux, pas du boulot en plus... tongue