1

J'ai un petit problème : j'ai une table de cosinus et de sinus, leurs valeurs sont données en virgule fixe (décalées de 6 bits vers la gauche).
Je voudrais les multiplier avec d'autres variables, elles aussi en virgule fixe.
Mes variables sont des short, et la table précalculée est faite de char (par souci de taille, bien que ce ne soit pas tellement grand non plus).
Mais j'ai un problème qui semblerait venir du fait que les cosinus et les sinus peuvent avoir des valeurs négatives.
=(Cos64[angle]*zoom)>>6;Voici ma ligne de code : dir.y dir.y est décaré en short, ainsi que zoom. Je multiplie mes deux valeurs et je décale de 6 bits vers la droite pour me retrouver avec un nombre à virgule fixe décalé de 6 bits vers la gauche (puisque les deux nombres multpliés sont tous les deux décalés de 6 bits vers la gauche).
asr.w #6,%d2 move.w %d2,(%a3)
Voici le code généré par TIGCC :	move.w angle,%a1
	lea Sin64,%a0
	move.b (%a0,%a1.l),%d4
	move.w zoom,%d1
	move.w %d4,%d2
	muls.w %d1,%d2
(a3 contient l'adresse de la variable dir.y, qui est une variable globale)
Le problème, je pense vient du fait que TIGCC ne fait pas d'extension de signe avant le muls, alors que la valeur renvoyée par Cos64 est un char signé négatif. Ce qui génère des erreurs de calculs. Comment faire pour que TIGCC prenne en compte le fait que les char peuvent être négatifs ?
Ensuite, j'aimerais bien que le asr.w #6,%d2 soit plutôt un asr.l au cas où le résultat de la multiplication ne tient pas sur les 16bits d'un short.

2

Bon, en fait c'est bon. Un éclair de génie m'a traversé l'esprit au moment où j'ai cliqué sur envoyer.
J'avais déclaré ma table de cosinus en unsigned char triso #jesors#
Désolé donc pour ce topic inutile.
Enfin, si, j'aimerais quand même savoir comment faire pour que le asr s'applique aux 32 bits du registre d2... (j'ai essayé en transtypant de différentes façon, mais rien n'y faisait)

3

dir.y= (long)(Cos64[angle]*zoom) >> 6;Peut-être ?
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.

4

Non, tu penses bien que j'avais déjà essayé.
Si je fais ((long)Cos64[angle]*(long)zoom)>>6; j'ai bien un asr.l mais je n'ai plus de muls sad
Pourtant, plus loin dans le code, je fais un autre truc dans le genre : ((long)x1*(long)x2+(long)y1*(long)y2)>>6; et j'ai bien des muls et des asr.l confus

5

Essaye:
((long)(short)(Cos64[angle])*(long)zoom)>>6;
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é

6

Ça ne marche pas non plus sad J'ai bien un asr.l, mais plus de muls).
Et j'ai essayé ((long)(short)(Cos64[angle])*(long)zoom)>>6;, ça n'a pas plus marché...

7

Essaye ((short)(Cos64[angle])*(long)zoom)>>6;.
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é

8

Pareil sad J'ai bien un asr.l, mais pas de muls.

Mais je ne comprends vraiment pas pouequoi plus loin dans le prog, j'ai une opération du type : var=((long)x1*(long)x2+(long)y1*(long)y2)>>6; (toutes les variables sont des shorts à la base) et j'ai des beaux muls et des magnifiques asr.l confus