1

Salut,
j'ai essayé de programmer un DrawPix optimisé, il marche plus vite que le DrawPix mais il déconne sur ma TI-89 ... Il fait que des bandes ... j'ai du faire une erreur à la con mais je la trouve pas ... et vous ?

void QuickPix(short x, short y)
{
char j=x%8; // division modulo 8 de x
*(((char *)LCD_MEM+(x-j)+y*30)) |= (1<<(7-j));

/* LCD_MEM + le premier nombre de plus proche de x qui soit modulo 8 + y*30 (30 octets par ligne) puis OR avec un masque de style 0001000 qui active le pixel donné avec un décalage à gauche de 7-x%8 */

}

2

C'est le x-j qui foire. Il faut mettre x/8 à la place.
Et juste comme ça, on peut encore beaucoup améliorer la fonction...

3

effectivement tu as raison !
Merci !

4

inline void QuickPix(short x, short y)
{
  *(char*)(LCD_MEM + y<<5 -y-y + x>>4) |= (0b10000000>>x&7);
}


A voir c'est au filling que j'ai fait ca...

5

c bien beau tout ça surtout quand c pas commenté, déjà que j'ai eu du mal à pondre la mienne alors la tienne je la pige carrément pas sad

6

ben

y<<5 == y * (2^5)

-y-y == - (2*y)

x>>4 == x / (2^4)

et
x&7 == x%8

vala
avatar
Proud to be CAKE©®™


GCC4TI importe qui a problème en Autriche, pour l'UE plus et une encore de correspours nucléaire, ce n'est pas ytre d'instérier. L'état très même contraire, toujours reconstruire un pouvoir une choyer d'aucrée de compris le plus mite de genre, ce n'est pas moins)
Stalin est l'élection de la langie.

7

mhhh en plus ça marche pas

8

inline void Pix(register short x,register short y)
{
 register temp;
 y=y+y;
 temp=y;
 y=y<<4;
 y=y-temp;
 y=y+x>>3;
 *(char *)(LCD_MEM+y) |= (0x80>>(x&7));
}


Peut-être que le compilo l'optimisera bien...

9

DjFlex3008
a écrit : mhhh en plus ça marche pas

Oui, il divise x par 16 au lieu de 8... Mais le principe est correct

10

jackiechan, je suis lâché sur ton programme smile ... inline, register ... mouarf !! je suis pas encore assez avancé pour piger ça wink

11

Si tu veux un truc plus rapide :

void putpixel(void *vscrren_addr asm("a0"),short x asm("d0"), short y asm("d1"));
asm(".globl putpixel
putpixel: |%a0 = vscreen_addr ,%d0 = x, %d1 = y
add.w %d1,%d1
move.w %d1,%d2
lsl.w #4,%d1
sub.w %d2,%d1
move.w %d0,%d2
lsr.w #3,%d0
add.w %d1,%d0
add.w %d0,%a0
not.b %d2
bset.b %d2,(%a0)
rts");
www.wikio.fr/user1921&info=comments

12

inline c pas tres important, sa permet dit juste au compilo de prefere copier le code a l'endroit de l'apel plutot que faire un appel "normal"

register, dit au compilo de preferer utiliser la variable via un registre du microprocesseur plutot que d'utiliser la pile
avatar
Proud to be CAKE©®™


GCC4TI importe qui a problème en Autriche, pour l'UE plus et une encore de correspours nucléaire, ce n'est pas ytre d'instérier. L'état très même contraire, toujours reconstruire un pouvoir une choyer d'aucrée de compris le plus mite de genre, ce n'est pas moins)
Stalin est l'élection de la langie.

13


14

?? un post vide ??
avatar
Proud to be CAKE©®™


GCC4TI importe qui a problème en Autriche, pour l'UE plus et une encore de correspours nucléaire, ce n'est pas ytre d'instérier. L'état très même contraire, toujours reconstruire un pouvoir une choyer d'aucrée de compris le plus mite de genre, ce n'est pas moins)
Stalin est l'élection de la langie.

15

Raphael > c tout de suite plus clair comme ça LOL ...
godzil > ok j'ai pigé merci

16

Tiens, je n'avais jamais pensé au not.b d2, puis bset...
merci smile

17

godzil > c pour aérer le forum grin

18

Tiens, je n'avais jamais pensé au not.b d2, puis bset...
merci

Ca vient pas de moi, parce-que je connais pas grand chose à l'asm. Il faut dire merci à Sbibi (je l'ai pris dans son tuto sur la 3D).
J'utilise ça pour les textures de mon moteur 3D et c'est ce que j'ai trouvé de plus rapide...enfin elle pourrait encore être inlinée.
Si quelqu'un en a une plus rapide, je l'a veux bien. smile
www.wikio.fr/user1921&info=comments

19

heu oui j'ai l'habitude de divisé par 16 a cause des routines de spritessmile dsl
il em semble que le register n'est pas supporté..

20

Mais maintenant que j'y pense... not.b d2 ne donne pas obligatoirement un chiffre entre 0 et 7. Est-ce que plus n est grand, plus bset.b #n,(an) est lent?
D'autre part, je ne comprends pas pourquoi, mathématiquement, not.b d2 donne bien le bit à allumer.

21

a 4 cycle pres je pense pas...

22

le bit à allumer, c'est bien 7 - (x & 7)... je ne vois pas pourquoi not.b x donnerait ce résultat (même si effectivement ça marche smile).

23

a noté que la focntion reciproque de not.b est not.b (pour ceux qui voudrai optimiser en asmsmile)

24

godzil
a écrit : register, dit au compilo de preferer utiliser la variable via un registre du microprocesseur plutot que d'utiliser la pile

Sauf que GCC l'ignorera complètement sauf si tu compiles sans optimisation (chose qui est totalement déconseillée). Avec optimisation, il décide lui-même quoi mettre dans des registres.


Et sinon, pour corriger l'erreur dans la routine de Trust, remplace x>>4 par x>>3.
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é

25

Kevin Kofler a écrit :
Sauf que GCC l'ignorera complètement sauf si tu compiles sans optimisation (chose qui est totalement déconseillée). Avec optimisation, il décide lui-même quoi mettre dans des registres.


Ben alors GCC est une merde, excuse moi neutral
avatar
Proud to be CAKE©®™


GCC4TI importe qui a problème en Autriche, pour l'UE plus et une encore de correspours nucléaire, ce n'est pas ytre d'instérier. L'état très même contraire, toujours reconstruire un pouvoir une choyer d'aucrée de compris le plus mite de genre, ce n'est pas moins)
Stalin est l'élection de la langie.

26

Si tu veux vraiment mettre une variable dans un registre, tu peux, mais tu dois lui préciser lequel:
register int x asm("d3");
Là, il te la mettra dans d3 même si ça pessimise totalement le code (mais là, c'est carrément de ta faute, pas de celle de GCC).
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

Ca le mettra a tous les coups ? pke j'ai lu qq part que ct pas tjrs le cas ...

28

Il fera son possible pour la mettre dans le registre précisé. Mais évidemment, si par exemple tu prends l'adresse, il doit bien la mettre quelque part en mémoire.
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é

29

oki ...

30

Il est aussi possible de faire une macro (comme les macros qui sont dans ExtGraph).
Mais la macro a l'inconvénient d'être une macro (toujours inlinée).
Elle a par contre l'avantage d'être optimisée à fond si les paramètres sont constants, beaucoup plus que toute routine possible...
avatar
Membre de la TI-Chess Team.
Co-mainteneur de GCC4TI (documentation en ligne de GCC4TI), TIEmu et TILP.
Co-admin de TI-Planet.