GAMOPAT
Vous souhaitez réagir à ce message ? Créez un compte en quelques clics ou connectez-vous pour continuer.

Aide sur SDCC pour Amstrad CPC Z80 nombres float

3 participants

Aller en bas

Aide sur SDCC pour Amstrad CPC Z80 nombres float Empty Aide sur SDCC pour Amstrad CPC Z80 nombres float

Message par pmass Jeu 5 Juin 2014 - 17:59

Bonjour,

j'essaie actuellement de porter un jeu Apple 2 sur Amstrad CPC (potentiellement toute machine Z80). J'ai choisi d'utiliser SDCC que je découvre et j'ai des problèmes avec les nombres float.

Je sais que le C n'est pas trop en odeur de sainteté ici  MDR mais si quelqu'un a de l'expérience sur le sujet, toute aide sera la bienvenue.

Merci d'avance !
pmass
pmass
Patient contaminé

Masculin Nombre de messages : 618
Age : 53
Localisation : Vendée
Date d'inscription : 10/01/2012

Revenir en haut Aller en bas

Aide sur SDCC pour Amstrad CPC Z80 nombres float Empty Re: Aide sur SDCC pour Amstrad CPC Z80 nombres float

Message par pmass Lun 9 Juin 2014 - 10:26

Il n'y a aucun gamopathe qui utilise SDCC ?

je trouve l'outil vraiment pratique car il est multiplateforme (Mac, Linux, PC) et permet facilement d'intégrer de l'assembleur (c'est indispensable car SDCC génère du code Z80 "pur" sans tenir compte de la plateforme cible). Du coup, on peut avoir un code compatible à 80% avec pas mal de micros 8 bits.

Sinon j'ai suivi ce tuto très bien fait : http://www.cpcmania.com/Docs/Programming/Programming.htm


Mais voilà, il ne traite pas le sujet des nombres flottants. J'ai cherché sur le net, il est dit qu'il faut recompiler SDCC mais je n'ai pas trouvé comment...


Si quelqu'un a de l'expérience, merci d'avance !
pmass
pmass
Patient contaminé

Masculin Nombre de messages : 618
Age : 53
Localisation : Vendée
Date d'inscription : 10/01/2012

Revenir en haut Aller en bas

Aide sur SDCC pour Amstrad CPC Z80 nombres float Empty Re: Aide sur SDCC pour Amstrad CPC Z80 nombres float

Message par vincent2105 Lun 9 Juin 2014 - 13:02

Bonjour pmass, je ne connais pas SDCC, mais a tout hasard, j'ai fait une petite recherche qui semble coller avec ton problème http://sourceforge.net/p/sdcc/support-requests/66/. Désolé de ne pas pouvoir mieux te renseigner.
vincent2105
vincent2105
Patient incurable

Masculin Nombre de messages : 1381
Age : 44
Localisation : 82
Date d'inscription : 17/12/2013

Revenir en haut Aller en bas

Aide sur SDCC pour Amstrad CPC Z80 nombres float Empty Re: Aide sur SDCC pour Amstrad CPC Z80 nombres float

Message par pmass Lun 9 Juin 2014 - 14:14

Merci pour ta réponse. J'avais trouvé ce post mais je n'ai réussi aucune des deux méthodes proposées. Par exemple, si j'essaie juste de compiler printf_large.c pour le Z80 :
Code:
sdcc -mz80 -DUSE_FLOATS=1 -c printf_large.c
printf_large.c:116: syntax error: token -> '_Bool' ; column 38
pmass
pmass
Patient contaminé

Masculin Nombre de messages : 618
Age : 53
Localisation : Vendée
Date d'inscription : 10/01/2012

Revenir en haut Aller en bas

Aide sur SDCC pour Amstrad CPC Z80 nombres float Empty Re: Aide sur SDCC pour Amstrad CPC Z80 nombres float

Message par vingazole Lun 9 Juin 2014 - 23:14

Salut pmass !

J'utilise aussi SDCC sur z80 (pour programmer la Sega Master System), j'avais essayé "juste pour voir" les nombres de type float et il me semble qu'il n'y avait rien de spécial à définir/ajouter pour les utiliser...

Je n'ai pas bien compris quel est ton problème; tu pourrais peut-être nous afficher ta fameuse ligne 116 de "printf_large.c" qui te cause une erreur de compil' pour qu'on puisse se faire une idée scratch
vingazole
vingazole
Infirmier

Masculin Nombre de messages : 4522
Age : 50
Localisation : Midian
Date d'inscription : 05/01/2012

Revenir en haut Aller en bas

Aide sur SDCC pour Amstrad CPC Z80 nombres float Empty Re: Aide sur SDCC pour Amstrad CPC Z80 nombres float

Message par pmass Mar 10 Juin 2014 - 10:25

En fait, je suis un peu dans le flou... En résumé je ne sais pas si j'ai accès aux nombres float.

Si je fais ceci : 
Code:
#include<stdio.h>

int main()
{
float fvalue = 1.02;
printf("fvalue: %f\n",fvalue);
return 0;
}

avec :
Code:
sdcc -DUSE_FLOATS=1 -mz80 test.c


J'obtiens un superbe NO FLOAT :

Spoiler:

Est-ce que c'est juste l'affichage (le printf) qui ne fonctionne pas mais que je peux utiliser les floats pour des calculs, ou bien est-ce que je n'ai accès qu'aux nombres entiers ? Je n'arrive pas à trouver d'information précise à ce sujet...

Recompiler juste le fichier printf_large donne le problème ci-dessus (le fichier est bourré de directives de préprocesseur, je ne sais plus comment on obtient le fichier après le préprocesseur et avant la compilation).

Parfois, il est mentionné qu'il faut utiliser le mode mémoire "large" afin d'avoir accès aux floats mais dans ce cas j'obtiens le warning :
Code:
sdcc -DUSE_FLOATS=1 -mz80 --model-large -c test.c

at 1: warning 133: Model '--model-large' not supported for z80, ignored.
pmass
pmass
Patient contaminé

Masculin Nombre de messages : 618
Age : 53
Localisation : Vendée
Date d'inscription : 10/01/2012

Revenir en haut Aller en bas

Aide sur SDCC pour Amstrad CPC Z80 nombres float Empty Re: Aide sur SDCC pour Amstrad CPC Z80 nombres float

Message par vingazole Mar 10 Juin 2014 - 11:45

Alors j'ai essayé ton exemple de mon côté et ça me donne aussi un joli NO FLOAT à l'endroit où la valeur devrait être affichée.

Par contre apparemment c'est juste le printf qui pose problème.

Si tu fais :

Code:
printf("fvalue: %d\n",(int)fvalue);


...il va bien t'afficher la valeur (tronquée à l'entier inférieur) de fvalue !

J'ai aussi essayé de modifier fvalue avec les 4 opérations de base (+,-,*,/) et ça marche sans problème :)
vingazole
vingazole
Infirmier

Masculin Nombre de messages : 4522
Age : 50
Localisation : Midian
Date d'inscription : 05/01/2012

Revenir en haut Aller en bas

Aide sur SDCC pour Amstrad CPC Z80 nombres float Empty Re: Aide sur SDCC pour Amstrad CPC Z80 nombres float

Message par pmass Mar 10 Juin 2014 - 15:01

Merci pour tes tests. De mon côté j'ai essayé ceci :

Code:
#include<stdio.h>
#include<stdlib.h>

int main()
{
   int a=rand();
   int b=rand();
   float f=0.0F;
   
   printf("%d\n", a);
   printf("%d\n", b);
   
   if(a < b) f = b/a;
   else f = a/b;
   
   printf("--> fvalue: %d\n",(int)f);
   
        return 0;
}


et j'obtiens : -32768 !

Je ne sais pas quels tests tu as fais mais si tu as essayé avec des constantes je me suis aperçu que SDCC fais les calculs au moment de la compilation...

J'ai même essayé en version "parano" et même résultat :
Code:
   if(a < b) f = (float)((float)b/(float)a);
   else f = (float)((float)a/(float)b);
pmass
pmass
Patient contaminé

Masculin Nombre de messages : 618
Age : 53
Localisation : Vendée
Date d'inscription : 10/01/2012

Revenir en haut Aller en bas

Aide sur SDCC pour Amstrad CPC Z80 nombres float Empty Re: Aide sur SDCC pour Amstrad CPC Z80 nombres float

Message par vingazole Mar 10 Juin 2014 - 20:20

Comme test sur les floats j'ai fait ce genre de truc :



Code:
  float fvalue = 1.9;

  while (1) {
                        fvalue = fvalue * 1.01;
                        gotoxy(1,1); printf("fvalue: %d\n",(int) fvalue);
                 }       


Et on voit bien (la valeur entière de) fvalue augmenter comme prévu (j'ai fait le même genre de tests avec les autres opérations Wink )



J'ai aussi essayé ton exemple mais dans mon cas rand() me donnait a = 0 et b = 21468, donc forcément le calcul donnait une division par zéro et par suite un résultat loufoque (-1 dans mon cas !).

En changeant int a = rand() par int a = rand()+rand() j'obtiens a = 21468 et b = 9988 et ainsi une valeur cohérente pour la division (troncature de f = 2)
vingazole
vingazole
Infirmier

Masculin Nombre de messages : 4522
Age : 50
Localisation : Midian
Date d'inscription : 05/01/2012

Revenir en haut Aller en bas

Aide sur SDCC pour Amstrad CPC Z80 nombres float Empty Re: Aide sur SDCC pour Amstrad CPC Z80 nombres float

Message par pmass Mar 10 Juin 2014 - 21:08

Par rapport à l'exemple que tu donnes, si tu regardes l'assembleur généré, la valeur de fvalue est précalculée puisqu'il s'agit de deux constantes multipliées. C'est pourquoi j'ai essayé avec des nombres aléatoires.

tu pourrais me donner ton deuxième exemple avec les rand() STP ?
pmass
pmass
Patient contaminé

Masculin Nombre de messages : 618
Age : 53
Localisation : Vendée
Date d'inscription : 10/01/2012

Revenir en haut Aller en bas

Aide sur SDCC pour Amstrad CPC Z80 nombres float Empty Re: Aide sur SDCC pour Amstrad CPC Z80 nombres float

Message par vingazole Mar 10 Juin 2014 - 21:32

Non-non, dans mon exemple ce n'est pas un produit de constantes à cause du while (fvalue est modifiée à chaque tour de boucle).

D'ailleurs on voit bien que la routine de produit de floats est appelée quand on regarde l'asm généré :

Code:


;sportspad.c:208: while (1) {
00102$:
;sportspad.c:211: fvalue = fvalue *1.01;
 push de
 push bc
 ld hl,#0x3F81
 push hl
 ld hl,#0x47AE
 push hl
 call ___fsmul
 pop af
 pop af
 pop af



Pour ce que je te disais avec les rand() ça te donnerait ça :


Code:
#include<stdio.h>
#include<stdlib.h>

int main()
{
   int a=rand()+rand();
   int b=rand();
   float f=0.0F;
   
   printf("%d\n", a);
   printf("%d\n", b);
   
   if(a < b) f = b/a;
   else f = a/b;
   
   printf("--> fvalue: %d\n",(int)f);
   
        return 0;
}


vingazole
vingazole
Infirmier

Masculin Nombre de messages : 4522
Age : 50
Localisation : Midian
Date d'inscription : 05/01/2012

Revenir en haut Aller en bas

Aide sur SDCC pour Amstrad CPC Z80 nombres float Empty Re: Aide sur SDCC pour Amstrad CPC Z80 nombres float

Message par pmass Mer 11 Juin 2014 - 6:44

Gloups, en effet je n'avais pas les yeux en face des trous !  Boulet 

Sinon, j'ai recompilé ton programme avec le while (que j'avais fait sauté précédemment), j'ai regardé l'assembleur et j'obtiens la même chose que toi.
Or avec mon émulateur, je vois toujours -32768 en affichage   Aide sur SDCC pour Amstrad CPC Z80 nombres float 418468 

En désespoir de cause, j'ai essayé un autre émulateur (http://www.cpcbox.com/) et là ça fonctionne !

Donc depuis le début c'est l'émulateur qui bugge (mais qui marche très bien par ailleurs) :
Arnold (pas maintenu depuis 5 ans).

Un grand merci à toi Vingazole ! thumleft
pmass
pmass
Patient contaminé

Masculin Nombre de messages : 618
Age : 53
Localisation : Vendée
Date d'inscription : 10/01/2012

Revenir en haut Aller en bas

Aide sur SDCC pour Amstrad CPC Z80 nombres float Empty Re: Aide sur SDCC pour Amstrad CPC Z80 nombres float

Message par vingazole Mer 11 Juin 2014 - 13:03

De rien, ça fait plaisir d'échanger sur un sujet aussi spécifique (en plus en français !) Very Happy

C'est dingue le coup de l'émulateur qui te fait bugger ton programme, comme s'il n'y avait pas déjà assez de sources d'erreur possibles dans nos codes Rolling Eyes 


HS : j'ai un entretien d'embauche demain aux Herbiers, si tout se passe bien le nombre d'utilisateurs de SDCC/z80 va exploser en Vendée MDR
vingazole
vingazole
Infirmier

Masculin Nombre de messages : 4522
Age : 50
Localisation : Midian
Date d'inscription : 05/01/2012

Revenir en haut Aller en bas

Aide sur SDCC pour Amstrad CPC Z80 nombres float Empty Re: Aide sur SDCC pour Amstrad CPC Z80 nombres float

Message par pmass Mer 11 Juin 2014 - 15:02

ce qui est bizarre, c'est que j'ai essayé quelques jeux et je n'ai vu aucun problème... Mais bon, j'ai changé et je suis passé à Caprice32 depuis no problemo.

sinon bonne chance pour demain. En tant que dev SDCC je t'embauche tout de suite   MDR
pmass
pmass
Patient contaminé

Masculin Nombre de messages : 618
Age : 53
Localisation : Vendée
Date d'inscription : 10/01/2012

Revenir en haut Aller en bas

Aide sur SDCC pour Amstrad CPC Z80 nombres float Empty Re: Aide sur SDCC pour Amstrad CPC Z80 nombres float

Message par vingazole Mer 11 Juin 2014 - 15:05

Héhé, merci !  C'est bien pour de la programmation mais dans un autre genre (tours à commande numérique)  Aide sur SDCC pour Amstrad CPC Z80 nombres float 418468
vingazole
vingazole
Infirmier

Masculin Nombre de messages : 4522
Age : 50
Localisation : Midian
Date d'inscription : 05/01/2012

Revenir en haut Aller en bas

Revenir en haut

- Sujets similaires

 
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum