1

voila j'ai ma 89 sous la rom 2.08,
et j'ai resortis qqes vieux programmes made in moi des tirroirs, ds lesquels j'avais utilisé des très longues boucle "for" pour pouvoir ralentir certaine partie du jeux

mais ces progs avait ete compilé et fait a l'epoque pour ma rom 2.05, ça marchait tres bien

et maintenant il se trouve que qd j'essaye de les refaire marcher, c 1000 fois trop lent !!!

que puis je faire ? reduire ts les for ? ou alors c un probleme de compilation ou autre ? (j'ai la derniere version de tigcc)

danke shön

2

Normalement il ne devrait pas y avoir de différence entre AMS 2.05 et 2.08, mais ralentir des programmes avec des boucles for c'est on-ne-peut plus crade sick.

T'as au moins deux méthode simples : la première, tu vas chercher la fonction WaitForMillis de Ti-Chess, elle marche bien, mais ça provoque une différence de vitesse entre HW1 et HW2 (ou alors faut coller deux valeurs à chaque fois).
La deuxième, tu détourne un AUTO_INT, tu lui colle une interruption qui incrémente une variable volatile, et comme ça tu peux faire un truc genre "counter = 0; while (counter < delay);" (la variable delay peut être définie différement en fonction de HW1 / HW2 au début du programme, c'est comme ça que je fais).
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

3

ouai menfin j'avais tt etalonné pile poil ça m'embete de tt devoir refaire
menfin si c la seule chose...
j'espere que les millisecondes ne sont pas une echelles trop elevé pour le genre de ralentissement que j'utilise

domage...

4

Si tu fais un truc basé sur l'AI1, tu as une fréquence de 255 / 350Hz (HW2 / HW1), ça devrait être largement assez précis pour ralentir un truc, au delà ça serait quasiment imperceptible neutral
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

5

Quant a la difference de vitesse, j'ai eu la meme chose.
Donc je suis repasse a la 2.05.
J'ai aucune explication!
Visitez mon site : http://www.bobti89.fr.st
Testez mon forum ici

6

Es-tu sûr que ce n'est pas plutôt une question de version de TIGCC? Même si ça m'étonnerait qu'il y ait ralentissement avec des versions plus récentes, GCC ayant tendance à faire plutôt le contraire (virer complètement les for dans le vide dans les versions plus récentes).
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

7

(virer complètement les for dans le vide dans les versions plus récentes)

Ce serait un bug, si je ne m'abuse? Tu crois vraiment qu'un prog qui ne termine pas est une "undefined behaviour"? hum

« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)

8

Je veux dire les for dans le vide (c'est-à-dire à contenu vide) pour lesquels GCC peut prouver qu'ils terminent.
Les for dans le vide pour lesquels GCC peut prouver qui ne terminent pas sont remplacés par un .Ln jbra .Ln, aussi compliqués qu'ils étaient, et tout le code qu'il y avait après est reconnu comme inatteignible et viré.
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

9

Euh oui j'ai dû trop picol, il n'y a pas de boucle infinie.
Enfin bon, "même" (grin) GTC fait à peu près pareil (pour les boucles infinies). Il laisse les boucles finies qui ne font rien telles quelles, parce que de toute façon un programmeur peut difficilement avoir fait ça intentionnellement... (oui, je sais, on peut toujours trouver des contre-exemples avec des if(0), mais c presque intentionnel smile)

« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)

10

Les développeurs de GCC pensaient comme toi au début, mais ils ont changé d'avis parce qu'il arrive que des optimisations rendent vide le corps d'une boucle qui n'était pas vide au départ, et dans ce cas-là, le programmeur attend en général que la boucle soit virée. Et plutôt de chercher à savoir quand c'est une bonne idée de virer la boucle et quand c'est une mauvaise, GCC les vire toutes. Si on ne veut pas que la boucle soit virée, il faut déclarer le compteur en volatile.
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

11

Ouais, mais a priori si le programmeur s'est fait chier à mettre un for, c'est pas pour rien.

« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)

12

Oui, mais a priori si le comité de standardisation du C s'est fait ch**r à inventer volatile, ce n'est pas pour rien. tongue
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

13

je vais reduire mes for alors, tt simplement
je compte pas me remettre a la programmation et tt remodifier, c juste pour compatibilisé mes progs avec la derniere rom (histoire de pas s'ennuyer en geo ana...)

14

Kevin> euh je vois absolument pas le rapport... "volatile" ne concerne pas les boucles, mais la mise en registre temporaire du contenu d'une adresse mémoire (et ça, c'est vraiment indispensable)

« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)

15

Si le compteur de la boucle est déclaré volatile, toutes les incrémentations du compteur doivent être gardées (parce que ce sont des écritures dans la variable), donc la boucle doit être gardée (ou déroulée, mais l'effet de ralentissement voulu reste en tout cas).

volatile ne se limite pas à empêcher la mise en registres. Ça veut dire: toutes les lectures et écritures dans la variable doivent être gardées, la règle as-if permettant les optimisations qui s'applique normalement ne s'applique ici que dans le cadre de cette contrainte.
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

16

Ça veut dire: toutes les lectures et écritures dans la variable doivent être gardées, la règle as-if permettant les optimisations qui s'applique normalement ne s'applique ici que dans le cadre de cette contrainte.

Euh, je ne comprends pas : si je fais
volatile int x=0;
x=1;
f(x);

le compilateur est _obligé_ d'allouer un registre/un emplacement pile pour x, puis mettre 0 puis 1 à cet endroit?
Ce serait profondément idiot neutral

Moi tel que je comprends cette règle ce serait plutôt : la règle as-if continue à valoir, mais toute procédure capable d'obtenir "légalement" l'adresse de cette variable a le droit de la modifier ou de supposer que son contenu est correct n'importe quand. Dans l'exemple qui s'applique, il n'y a aucun moyen d'obtenir légalement l'adresse de x (sauf via &x, qui n'apparaît pas dans cet exemple), donc je serais tenté de dire que le compilo a le droit de faire tout ce qu'il veut. Je me trompe?

« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)

17

Pollux
:
Ça veut dire: toutes les lectures et écritures dans la variable doivent être gardées, la règle as-if permettant les optimisations qui s'applique normalement ne s'applique ici que dans le cadre de cette contrainte.

Euh, je ne comprends pas : si je fais
volatile int x=0;
x=1;
f(x);
le compilateur est _obligé_ d'allouer un registre/un emplacement pile pour x, puis mettre 0 puis 1 à cet endroit?

Oui. (Et ça doit être un emplacement mémoire, pas un registre.)
Ce serait profondément idiot neutral

Mais c'est comme ça.
Moi tel que je comprends cette règle ce serait plutôt : la règle as-if continue à valoir, mais toute procédure capable d'obtenir "légalement" l'adresse de cette variable a le droit de la modifier ou de supposer que son contenu est correct n'importe quand. Dans l'exemple qui s'applique, il n'y a aucun moyen d'obtenir légalement l'adresse de x (sauf via &x, qui n'apparaît pas dans cet exemple), donc je serais tenté de dire que le compilo a le droit de faire tout ce qu'il veut. Je me trompe?

Cette interprétation marche peut-être avec une simple variable (mais est quand-même contre le standard à mon avis), mais dès que tu as un pointeur vers un point I/O, la suppression de toute écriture serait fatale. Mais bon, dans ce cas, tu as une adresse connue...
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

18

Et si tu ne me crois pas, essaye:
void f(int);

void _main() 
{
volatile int x=0;
x=1;
f(x);
}

avec TIGCC et tu auras:
__main:
	link.w %a6,#-4
	move.w #0,-2(%a6)
	move.w #1,-2(%a6)
	move.w -2(%a6),-(%sp)
	jbsr f
	unlk %a6
	rts

Je peux t'assurer que GCC ne ferait pas ça s'il n'y était pas obligé (du moins à l'avis des implémenteurs de GCC - comme déjà dit, les volatile sont un truc très subtil parce qu'ils vont à l'encontre le la règle as-if habituelle)!

Et le move.w #0 est aussi volontaire, parce que clr lit avant de lire, ce qui est interdit ici parce que la variable est volatile.
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

19

Je doute vraiment de ça. Peut-être que le code généré par TIGCC est simplement lié à leur façon de gérer les volatile (ça évite de distinguer entre le cas où l'adresse ne peut pas être obtenue légalement et le cas général), ou alors c'est une "extension" GCC qui te permet de compiler un projet avec l'optimisation activée tout en pouvant débugger certaines variables avec volatile neutral
Kevin Kofler
:
Moi tel que je comprends cette règle ce serait plutôt : la règle as-if continue à valoir, mais toute procédure capable d'obtenir "légalement" l'adresse de cette variable a le droit de la modifier ou de supposer que son contenu est correct n'importe quand. Dans l'exemple qui s'applique, il n'y a aucun moyen d'obtenir légalement l'adresse de x (sauf via &x, qui n'apparaît pas dans cet exemple), donc je serais tenté de dire que le compilo a le droit de faire tout ce qu'il veut. Je me trompe?
Cette interprétation marche peut-être avec une simple variable (mais est quand-même contre le standard à mon avis), mais dès que tu as un pointeur vers un point I/O, la suppression de toute écriture serait fatale. Mais bon, dans ce cas, tu as une adresse connue...

Oui, je précisais bien que je parlais des cas où il n'y a "aucun moyen d'obtenir légalement l'adresse de x". Je suis à peu près sûr que la règle as-if du C s'applique; tout ce que ça veut dire, c'est que le programmeur a le droit de prendre &x et de faire tout un tas de suppositions sur son contenu. Mais avant d'avoir pris &x, je ne vois absolument pas ce qui empêcherait le compilo d'optimiser tout ce qu'il veut. La règle "as-if" est tout de même fondamentale : elle permet non seulement l'optimisation, mais aussi la portabilité.

« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)

20

Kevin Kofler :
Et le move.w #0 est aussi volontaire, parce que clr lit avant de lire, ce qui est interdit ici parce que la variable est volatile.
Je ne comprends pas ce que tu veux dire confus
avatar
« Quand le dernier arbre sera abattu, la dernière rivière empoisonnée, le dernier poisson capturé, alors vous découvrirez que l'argent ne se mange pas. »

21

clr <ea> lit <ea> puis l'efface, ce qui fait que c'est plus lent que move dn,<ea>, et que ça peut poser pb avec les variables volatile...

« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)

22

Ah ok, je n'avais jamais remarqué.
Question un peu hors-sujet : mais pourquoi est-ce que le 68000 lit l'opérande avant de l'effacer ??
Question dans le sujet : pourquoi ça pose problème de lire, si la variable est volatile ? (puisqu'on efface après de toute façon).
avatar
« Quand le dernier arbre sera abattu, la dernière rivière empoisonnée, le dernier poisson capturé, alors vous découvrirez que l'argent ne se mange pas. »

23

Il lit pour positionner les flags je suppose. Comme ça, en 1 opération on efface et on sait comment se positionnait l'ancienne valeur par rapport à zéro.
avatar
Un site complet sur lequel vous trouverez des programmes et des jeux pour votre calculatrice TI 89 / Titanium / 92+ / Voyage 200 : www.ti-fr.com.
Quelques idées personnelles ici.

24

Non, il me semble que les flags après un clr sont toujours : Z=1 C=0 N=0 V=0 X=non-affecté
avatar
« Quand le dernier arbre sera abattu, la dernière rivière empoisonnée, le dernier poisson capturé, alors vous découvrirez que l'argent ne se mange pas. »

25

Sasume
: Question dans le sujet : pourquoi ça pose problème de lire, si la variable est volatile ? (puisqu'on efface après de toute façon).

Parce qu'on n'a pas le droit d'accéder à une variable volatile autrement que demandé dans la source.
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

26

Pollux
: Je doute vraiment de ça. [...] Mais avant d'avoir pris &x, je ne vois absolument pas ce qui empêcherait le compilo d'optimiser tout ce qu'il veut. La règle "as-if" est tout de même fondamentale : elle permet non seulement l'optimisation, mais aussi la portabilité.

Standard C99, paragraphes 5.1.2.3 [#2], [#3] et [#5], 6.7.3 [#6].
La partie 5.1.2.3 spécifie la règle as-if, et il y a écrit explicitement que volatile veut dire ce que j'ai décrit.
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

27

Tiens, et voilà une référence de tes amis de chez M$ (chez lesquels tu as pris ta syntaxe d'assembleur inline affreuse) qui dit la même chose: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vccelng/htm/key_s-z_10.asp.
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

28

Kevin, réfléchit un petit peu quand tu réponds. La syntaxe de Pollux est mille fois plus claire que la vôtre, pleine de %.
De plus, tu es comparable à M$ autant que lui. On te l'a déjà dit plusieurs fois : inutile de te rappeler ta propagande anti-kernel, ta croisade contre Xlib 1.0, tes commentaires immatures et ridicules sur GTC...
avatar
Un site complet sur lequel vous trouverez des programmes et des jeux pour votre calculatrice TI 89 / Titanium / 92+ / Voyage 200 : www.ti-fr.com.
Quelques idées personnelles ici.

29

La syntaxe de Pollux est mille fois plus claire que la vôtre, pleine de %.
pencil
avatar
Le scénario de notre univers a été rédigée par un bataillon de singes savants. Tout s'explique enfin.
T'as un problème ? Tu veux un bonbon ?
[CrystalMPQ] C# MPQ Library/Tools - [CrystalBoy] C# GB Emulator - [Monoxide] C# OSX library - M68k Opcodes

30

Kevin Kofler
:
Pollux
: Je doute vraiment de ça. [...] Mais avant d'avoir pris &x, je ne vois absolument pas ce qui empêcherait le compilo d'optimiser tout ce qu'il veut. La règle "as-if" est tout de même fondamentale : elle permet non seulement l'optimisation, mais aussi la portabilité.

Standard C99, paragraphes 5.1.2.3 [#2], [#3] et [#5], 6.7.3 [#6].
La partie 5.1.2.3 spécifie la règle as-if, et il y a écrit explicitement que volatile veut dire ce que j'ai décrit.

Tu rigoles? La règle 5.1.2.3 n'entre absolument pas en contradiction avec ce que j'ai dit. En particulier, ils ne contredisent pas la règle "as-if", et ils n'obligent pas à créer une "case mémoire". Ils disent juste qu'il faut mettre un agreement point à chaque modification d'un volatile, ce qui est effectivement le cas même si le compilo met la variable dans un registre. La règle 6.7.3 ne parle pas vraiment de la chose.

Non, franchement, cite-moi quelque chose qui prouve indubitablement qu'on n'a pas le droit de compiler :
void f() { volatile int i=0; i=1; g(i); }
en
f:
  moveq #1,d0
  bra g

Pour moi c'est parfaitement légal.

Quant à l'URL de Microsoft, elle est volontairement vague et dit juste "si vous voulez être sûr que ça écrit tout le temps, utilisez volatile". Ca n'a pas la vocation d'une règle infaillible. Ca marche comme si ça écrivait tout le temps.


Et je ne vois pas le rapport entre Microsoft et GTC, si ce n'est qu'on a choisi une syntaxe bien plus pratique que celle de GNU (qui, dois-je le rappeler, est plus ou moins justifiée par le nombre incalculable de plateformes qui doivent être supportées, mais n'est pas conçue pour un usage intensif...)

« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)