Aide sur SDCC pour Amstrad CPC Z80 nombres float
3 participants
Page 1 sur 1
Aide sur SDCC pour Amstrad CPC Z80 nombres float
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 mais si quelqu'un a de l'expérience sur le sujet, toute aide sera la bienvenue.
Merci d'avance !
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 mais si quelqu'un a de l'expérience sur le sujet, toute aide sera la bienvenue.
Merci d'avance !
pmass- Patient contaminé
- Nombre de messages : 618
Age : 53
Localisation : Vendée
Date d'inscription : 10/01/2012
Re: Aide sur SDCC pour Amstrad CPC Z80 nombres float
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 !
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- Patient contaminé
- Nombre de messages : 618
Age : 53
Localisation : Vendée
Date d'inscription : 10/01/2012
Re: Aide sur SDCC pour Amstrad CPC Z80 nombres float
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- Patient incurable
- Nombre de messages : 1381
Age : 44
Localisation : 82
Date d'inscription : 17/12/2013
Re: Aide sur SDCC pour Amstrad CPC Z80 nombres float
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- Patient contaminé
- Nombre de messages : 618
Age : 53
Localisation : Vendée
Date d'inscription : 10/01/2012
Re: Aide sur SDCC pour Amstrad CPC Z80 nombres float
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
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
vingazole- Infirmier
- Nombre de messages : 4522
Age : 50
Localisation : Midian
Date d'inscription : 05/01/2012
Re: Aide sur SDCC pour Amstrad CPC Z80 nombres float
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 :
avec :
J'obtiens un superbe NO FLOAT :
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 :
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- Patient contaminé
- Nombre de messages : 618
Age : 53
Localisation : Vendée
Date d'inscription : 10/01/2012
Re: Aide sur SDCC pour Amstrad CPC Z80 nombres float
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 :
...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 :)
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- Infirmier
- Nombre de messages : 4522
Age : 50
Localisation : Midian
Date d'inscription : 05/01/2012
Re: Aide sur SDCC pour Amstrad CPC Z80 nombres float
Merci pour tes tests. De mon côté j'ai essayé ceci :
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:
#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- Patient contaminé
- Nombre de messages : 618
Age : 53
Localisation : Vendée
Date d'inscription : 10/01/2012
Re: Aide sur SDCC pour Amstrad CPC Z80 nombres float
Comme test sur les floats j'ai fait ce genre de truc :
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 )
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)
- 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 )
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- Infirmier
- Nombre de messages : 4522
Age : 50
Localisation : Midian
Date d'inscription : 05/01/2012
Re: Aide sur SDCC pour Amstrad CPC Z80 nombres float
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 ?
tu pourrais me donner ton deuxième exemple avec les rand() STP ?
pmass- Patient contaminé
- Nombre de messages : 618
Age : 53
Localisation : Vendée
Date d'inscription : 10/01/2012
Re: Aide sur SDCC pour Amstrad CPC Z80 nombres float
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é :
Pour ce que je te disais avec les rand() ça te donnerait ça :
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- Infirmier
- Nombre de messages : 4522
Age : 50
Localisation : Midian
Date d'inscription : 05/01/2012
Re: Aide sur SDCC pour Amstrad CPC Z80 nombres float
Gloups, en effet je n'avais pas les yeux en face des trous !
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
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 !
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
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 !
pmass- Patient contaminé
- Nombre de messages : 618
Age : 53
Localisation : Vendée
Date d'inscription : 10/01/2012
Re: Aide sur SDCC pour Amstrad CPC Z80 nombres float
De rien, ça fait plaisir d'échanger sur un sujet aussi spécifique (en plus en français !)
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
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
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
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
vingazole- Infirmier
- Nombre de messages : 4522
Age : 50
Localisation : Midian
Date d'inscription : 05/01/2012
Re: Aide sur SDCC pour Amstrad CPC Z80 nombres float
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
sinon bonne chance pour demain. En tant que dev SDCC je t'embauche tout de suite
pmass- Patient contaminé
- Nombre de messages : 618
Age : 53
Localisation : Vendée
Date d'inscription : 10/01/2012
Re: Aide sur SDCC pour Amstrad CPC Z80 nombres float
Héhé, merci ! C'est bien pour de la programmation mais dans un autre genre (tours à commande numérique)
vingazole- Infirmier
- Nombre de messages : 4522
Age : 50
Localisation : Midian
Date d'inscription : 05/01/2012
Sujets similaires
» J'ai besoin d'aide pour mon amstrad ! Pleeeeeeease....
» [ESTIM] Bon nombres de jeux pour le fofo
» Besoin d'aide , 5€ a la clé pour celui qui m'aide !
» [Amstrad CPC] Missile Command, la conversion pour Amstrad !
» [Aide] Amstrad CPC 6128
» [ESTIM] Bon nombres de jeux pour le fofo
» Besoin d'aide , 5€ a la clé pour celui qui m'aide !
» [Amstrad CPC] Missile Command, la conversion pour Amstrad !
» [Aide] Amstrad CPC 6128
Page 1 sur 1
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum