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 */
}
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...
effectivement tu as raison !
Merci !
ben
y<<5 == y * (2^5)
-y-y == - (2*y)
x>>4 == x / (2^4)
et
x&7 == x%8
vala

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.
mhhh en plus ça marche pas
null Le 31/05/2003 à 13:33 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
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

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.
Raphael > c tout de suite plus clair comme ça LOL ...
godzil > ok j'ai pigé merci
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.
trust Le 31/05/2003 à 13:46 a 4 cycle pres je pense pas...
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).
Ca le mettra a tous les coups ? pke j'ai lu qq part que ct pas tjrs le cas ...
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.
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...