Accueil Ti-Gen Foire Aux Questions Chat sur le chan #tigcc sur IRC
Liste des membres Rechercher Aide
Bienvenue Invité !   Se connecter             Mes sujets   
Administrer
0 membre(s) et 1 visiteur(s) actif(s) durant les 5 dernières minutes Utilisateurs actifs : Aucun membre + 1 visiteur
Avant de poster sur le forum, il y a des régles de bases à respecter pour une bonne entente et un respect de tous.
Veuillez lire la charte du forum.
  :: Index » Forum Ti68K » Programmation C » Copie d'écran avec mask (23 réponse(s))
./POST DE DEPART (post n°0)   Marquer comme non lu.
Nul Ecrit le: Vendredi 15 juillet 2005 à 19:27 Déconnecté(e)    Voir le profil de Nul Envoyer un email à Nul Envoyer un message privé à Nul  

Bonjour !

J'ai besoin d'une fonction très rapide (donc en ASM; je l'ai faite en C mais c'est "lent") pour copier un écran dans un autre de cette façon (en argument on a un écran mask, un écran source et un écran destination):
on fait un AND entre le mask et l'écran de destination puis un OR avec l'écran source; on copie ça ensuite dans l'écran de destination. En modifiant un peu la fonction 'FastCopyScreen' de Extgraph, ça devrait être faisable (pour ceux qui savent programmer en ASM ...)

Toute aide sera la bienvenue #gni#
"De tous les animaux, l'homme a le plus de pente,
A se porter dedans l'excès."

Jean de la Fontaine
    
./Post n°1   Marquer comme non lu.
Folco Ecrit le: Vendredi 15 juillet 2005 à 19:41 Déconnecté(e)    Voir le profil de Folco Envoyer un email à Folco Envoyer un message privé à Folco  


Ah oui, tu veux carrément qu'on te ponde la routine quoi %)
T'as pas des spécifiactions plus précises? ou la simple copie d'un buffer de 3840 octets te suffirait?
<<< Kernel Extremist©®™ >>>
Pas la peine d'aller là plus d'une fois tous les six mois...

"Il faut apprendre pour savoir qu'il faut apprendre pour savoir."
    
./Post n°2   Marquer comme non lu.
Nul Ecrit le: Vendredi 15 juillet 2005 à 20:02 Déconnecté(e)    Voir le profil de Nul Envoyer un email à Nul Envoyer un message privé à Nul  

Heu oui c'est ça #rougir# Je ne pense pas que ce soit trop long à faire ...
C'est vrai, j'ai oublié de préciser la taille: c'est 3840 effectivement.

Merci d'avance =)
"De tous les animaux, l'homme a le plus de pente,
A se porter dedans l'excès."

Jean de la Fontaine
    
./Post n°3   Marquer comme non lu.
Jfg Ecrit le: Vendredi 15 juillet 2005 à 20:11 Déconnecté(e)    Voir le profil de Jfg Envoyer un email à Jfg Visiter le site WEB de Jfg Envoyer un message privé à Jfg  


ce que tu peux déja faire c'est utiliser SpriteX8_MASK_R d'extgraph:

char * source;
char * mask;
char * dest;
SpriteX8_MASK_R(0,0,1,source,mask,LCD_SIZE/8,dest);



un peu HS:
petite question, est ce que c'est plus rapide que:
SpriteX8_MASK_R(0,0,128,source,mask,30,dest);
?
Kill Mario
    
./Post n°4   Marquer comme non lu.
Folco Ecrit le: Vendredi 15 juillet 2005 à 20:32 Déconnecté(e)    Voir le profil de Folco Envoyer un email à Folco Envoyer un message privé à Folco  


Voici l'idée:
  lea.l  source,%a0
  lea.l  mask,%a1
  lea.l  dest,%a2
  move.w  #(3840)/4-1,%d0
  loop:
  move.l  (%a2),%d1
  and.l  (%a1)+,%d1    |copie du masque
  or.l  (%a0)+,%d1    |copie du dessin
  move.l  %d1,(%a2)+    |enregistrement du résultat dans dest
  dbra  %d0,loop

C'est peut-être très optimisable? je sais pas.
<<< Kernel Extremist©®™ >>>
Pas la peine d'aller là plus d'une fois tous les six mois...

"Il faut apprendre pour savoir qu'il faut apprendre pour savoir."
    
./Post n°5   Marquer comme non lu.
Nul Ecrit le: Vendredi 15 juillet 2005 à 20:32 Déconnecté(e)    Voir le profil de Nul Envoyer un email à Nul Envoyer un message privé à Nul  

Je n'y avais même pas pensé à cette fonction (qu'est-ce-que je peux être c.. #tsss# ) ! Merci Jfg ! Je vais customiser cette fonction et ça ira (je pense ...)
A mon avis, les deux fonctions seront aussi rapides. C'est juste une histoire de boucle.
"De tous les animaux, l'homme a le plus de pente,
A se porter dedans l'excès."

Jean de la Fontaine
    
./Post n°6   Marquer comme non lu.
Folco Ecrit le: Vendredi 15 juillet 2005 à 20:35 Déconnecté(e)    Voir le profil de Folco Envoyer un email à Folco Envoyer un message privé à Folco  


je suis __sûr__ d'être __bcp__ plus rapide (ben voui, pas de bsr.s vers la fonction de EG, pas de rts pour relancer à nouveau etc... =)
<<< Kernel Extremist©®™ >>>
Pas la peine d'aller là plus d'une fois tous les six mois...

"Il faut apprendre pour savoir qu'il faut apprendre pour savoir."
    
./Post n°7   Marquer comme non lu.
Jfg Ecrit le: Vendredi 15 juillet 2005 à 20:39 Déconnecté(e)    Voir le profil de Jfg Envoyer un email à Jfg Visiter le site WEB de Jfg Envoyer un message privé à Jfg  


Je pense qu'il répondait à ma question
Kill Mario
    
./Post n°8   Marquer comme non lu.
Nul Ecrit le: Vendredi 15 juillet 2005 à 20:40 Déconnecté(e)    Voir le profil de Nul Envoyer un email à Nul Envoyer un message privé à Nul  

C'est pas plus rapide avec 'SpriteX8_MASK_R' :(
Merci Martial pour le code, sympa #top# Je l'essaie !
"De tous les animaux, l'homme a le plus de pente,
A se porter dedans l'excès."

Jean de la Fontaine
    
./Post n°9   Marquer comme non lu.
Folco Ecrit le: Vendredi 15 juillet 2005 à 20:42 Déconnecté(e)    Voir le profil de Folco Envoyer un email à Folco Envoyer un message privé à Folco  


Jfg-> effectivement, on a crossé, mais j'ai posté ça après, parceque je ne savais pas qu'il allait essayer ta fonction quand j'ai posté mon code. :)
-Edité le Vendredi 15 juillet 2005 à 20:43 par Martial Demolins-
<<< Kernel Extremist©®™ >>>
Pas la peine d'aller là plus d'une fois tous les six mois...

"Il faut apprendre pour savoir qu'il faut apprendre pour savoir."
    
./Post n°10   Marquer comme non lu.
Nul Ecrit le: Vendredi 15 juillet 2005 à 20:52 Déconnecté(e)    Voir le profil de Nul Envoyer un email à Nul Envoyer un message privé à Nul  

Heu ça plante ...
Désolé, je sais pourquoi, c'est de ma faute.
-Edité le Vendredi 15 juillet 2005 à 20:53 par Nul-
Par contre, je ne sais si c'est vraiment plus rapide, ça ne se voit pas trop. Mais merci en tous cas pour votre aide !
-Edité le Vendredi 15 juillet 2005 à 20:54 par Nul-
"De tous les animaux, l'homme a le plus de pente,
A se porter dedans l'excès."

Jean de la Fontaine
    
./Post n°11   Marquer comme non lu.
Folco Ecrit le: Vendredi 15 juillet 2005 à 20:57 Déconnecté(e)    Voir le profil de Folco Envoyer un email à Folco Envoyer un message privé à Folco  


Ah oui, j'ai pas précisé, je ne sais pas inliner de l'assembleur pour du C, et j'ai mis des labels qui ne se trouvent sûrement pas dans ton code #hehe#
Attends qu'un connaisseur (Kevin, Lionel, LionelA?) passe pour te dire comment faire.

En tout cas, chez moi le code compile impeccable.
Voici le source complet:

  xdef  _ti89
  xdef  _nostub

  lea.l  source,%a0
  lea.l  mask,%a1
  lea.l  dest,%a2
  move.w #(3840)/4-1,%d0
  loop:
  move.l  (%a2),%d1
  and.l  (%a1)+,%d1    |copie du masque
  or.l  (%a0)+,%d1    |copie du dessin
  move.l  %d1,(%a2)+    |enregistrement du résultat dans dest
  dbra  %d0,loop
  rts
source:
mask:
dest:
  .long  0

Evidemment, ça demande une adaptation pour le C. :)
(mais attention, essaye surtout pas de faire tourner ça en assembleur, ça va lire/écrire à 0x00, plantage garanti!)
-Edité le Vendredi 15 juillet 2005 à 20:57 par Martial Demolins-
<<< Kernel Extremist©®™ >>>
Pas la peine d'aller là plus d'une fois tous les six mois...

"Il faut apprendre pour savoir qu'il faut apprendre pour savoir."
    
./Post n°12   Marquer comme non lu.
Folco Ecrit le: Vendredi 15 juillet 2005 à 21:53 Déconnecté(e)    Voir le profil de Folco Envoyer un email à Folco Envoyer un message privé à Folco  


mieux, vas voir dans la doc coment faire. :)
<<< Kernel Extremist©®™ >>>
Pas la peine d'aller là plus d'une fois tous les six mois...

"Il faut apprendre pour savoir qu'il faut apprendre pour savoir."
    
./Post n°13   Marquer comme non lu.
Nul Ecrit le: Vendredi 15 juillet 2005 à 22:02 Déconnecté(e)    Voir le profil de Nul Envoyer un email à Nul Envoyer un message privé à Nul  

Merci pour ton aide Martial parce qu'il y avait un méchant plantage ...
Le problème, c'est que mon code en C doit être aussi rapide puisque j'utilise les mêmes instructions (mais en C). Je te le donne (ici c'est en niveaux de gris mais ça ne change rien):

void CopieBordsToScreen(void * bords_0, void * bords_1, void * mask, void * dest_0, void * dest_1)
{
register short i;
register unsigned long * ptr_m = (unsigned long *)(mask);
register unsigned long * ptr_b0 = (unsigned long *)(bords_0);
register unsigned long * ptr_b1 = (unsigned long *)(bords_1);
register unsigned long * ptr_d0 = (unsigned long *)(dest_0);
register unsigned long * ptr_d1 = (unsigned long *)(dest_1);

for(i = 0; i < 960; i ++)
{
*ptr_d0 = (*ptr_m&*ptr_d0)|*(ptr_b0 ++);
*ptr_d1 = (*ptr_m&*ptr_d1)|*(ptr_b1 ++);
ptr_m ++;
ptr_d0 ++;
ptr_d1 ++;
}

}

Et je ne vois vraiment pas comment optimiser ça #question#
"De tous les animaux, l'homme a le plus de pente,
A se porter dedans l'excès."

Jean de la Fontaine
    
./Post n°14   Marquer comme non lu.
LionelA Ecrit le: Vendredi 15 juillet 2005 à 22:23 Déconnecté(e)    Voir le profil de LionelA Envoyer un email à LionelA Visiter le site WEB de LionelA Envoyer un message privé à LionelA  


static inline void CopieBordsToScreen(long * bords_0, long * bords_1, long * mask,
                                      long * dest_0, long * dest_1) {
  unsigned short i;
  unsigned long d0, d1;
  for(i=LCD_SIZE/4;i--; ) {
   d0 = *(dest_0), d0 &= *(mask), d0 |= *(bords_0++), *(dest_0++) = d0;
   d1 = *(dest_1), d1 &= *(mask++), d1 |= *(bords_1++), *(dest_1++) = d1;
  }
}


Peut etre un peu plus rapide :)
-Edité le Vendredi 15 juillet 2005 à 22:23 par LionelA-
Auteur de Mode7 Engine pour ti68k
Auteur de F-ZERO for TI68k
Membre de Orage Studio
Mon site perso : http://www.tigen.org/lionela/
Le gite de mes parents à coté de Narbonne :
http://chaletdenis.free.fr/
    
./Post n°15   Marquer comme non lu.
Kevin Kofler Ecrit le: Vendredi 15 juillet 2005 à 22:32 Déconnecté(e)    Voir le profil de Kevin Kofler Envoyer un email à Kevin Kofler Visiter le site WEB de Kevin Kofler Envoyer un message privé à Kevin Kofler  


Essaie ça:
#define CopieBordsToScreen(bords_0,bords_1,mask,dest_0,dest_1) \
({ \
long *dummy1,*dummy2,*dummy3,*dummy4,*dummy5; \
asm("
  move.w #(3840)/4-1,%%d0
  loop:
  move.l  (%3),%%d1
  and.l  (%2),%%d1    |copie du masque
  or.l  (%0)+,%%d1    |copie du dessin
  move.l  %%d1,(%3)+    |enregistrement du résultat dans dest
  move.l  (%4),%%d1
  and.l  (%2)+,%%d1    |copie du masque
  or.l  (%1)+,%%d1    |copie du dessin
  move.l  %%d1,(%4)+    |enregistrement du résultat dans dest
  dbra  %%d0,loop
" \
:"=a"(dummy1),"=a"(dummy2),"=a"(dummy3),"=a"(dummy4),"=a"(dummy5): \
"0"(bords_0),"1"(bords_1),"2"(mask),"3"(dest_0),"4"(dest_1): \
"d0","d1","cc","memory"); \
})
Membre de l'équipe de TIGCC: http://tigcc.ticalc.org
Mainteneur du portage Linux/Unix de TIGCC: http://tigcc.ticalc.org/linux/
Membre de l'équipe de CalcForge: http://www.calcforge.org:70/

Participez à la reprise de Ti-Gen!
    
./Post n°16   Marquer comme non lu.
Folco Ecrit le: Vendredi 15 juillet 2005 à 23:50 Déconnecté(e)    Voir le profil de Folco Envoyer un email à Folco Envoyer un message privé à Folco  


tu déroules plus que moi non?
<<< Kernel Extremist©®™ >>>
Pas la peine d'aller là plus d'une fois tous les six mois...

"Il faut apprendre pour savoir qu'il faut apprendre pour savoir."
    
./Post n°17   Marquer comme non lu.
Kevin Kofler Ecrit le: Samedi 16 juillet 2005 à 02:36 Déconnecté(e)    Voir le profil de Kevin Kofler Envoyer un email à Kevin Kofler Visiter le site WEB de Kevin Kofler Envoyer un message privé à Kevin Kofler  


Regarde mieux son code: Tu copies un seul plan, moi j'en copie 2. Ton code ne correspond pas à ce qu'il veut faire.
Membre de l'équipe de TIGCC: http://tigcc.ticalc.org
Mainteneur du portage Linux/Unix de TIGCC: http://tigcc.ticalc.org/linux/
Membre de l'équipe de CalcForge: http://www.calcforge.org:70/

Participez à la reprise de Ti-Gen!
    
./Post n°18   Marquer comme non lu.
Folco Ecrit le: Samedi 16 juillet 2005 à 03:15 Déconnecté(e)    Voir le profil de Folco Envoyer un email à Folco Envoyer un message privé à Folco  


arf, j'avais pas fais gaffe ^^
<<< Kernel Extremist©®™ >>>
Pas la peine d'aller là plus d'une fois tous les six mois...

"Il faut apprendre pour savoir qu'il faut apprendre pour savoir."
    
./Post n°19   Marquer comme non lu.
Nul Ecrit le: Samedi 16 juillet 2005 à 11:15 Déconnecté(e)    Voir le profil de Nul Envoyer un email à Nul Envoyer un message privé à Nul  

Merci Kevin pour le code mais je ne comprends pas, les bords ne sont pas copiés. En fait je l'ai modifié sur le modèle d'un code de Malcom Smith et ça marche:

static inline void CopieBordsToScreen(void * bords_0, void * bords_1, void * mask, void * dest_0, void * dest_1)
{
long *dummy1,*dummy2,*dummy3,*dummy4,*dummy5;
asm volatile("
move.w #(3840)/4-1,%%d0
loop:
move.l (%3),%%d1
and.l (%2),%%d1 |copie du masque
or.l (%0)+,%%d1 |copie du dessin
move.l %%d1,(%3)+ |enregistrement du résultat dans dest
move.l (%4),%%d1
and.l (%2)+,%%d1 |copie du masque
or.l (%1)+,%%d1 |copie du dessin
move.l %%d1,(%4)+ |enregistrement du résultat dans dest
dbra %%d0,loop
" \
:"=a"(dummy1),"=a"(dummy2),"=a"(dummy3),"=a"(dummy4),"=a"(dummy5)
:"0"(bords_0),"1"(bords_1),"2"(mask),"3"(dest_0),"4"(dest_1)
:"d0","d1","cc","memory");
}

Cette fois-ci les bords sont copiés. Merci à tous pour votre aide ! #love#

Mais est-ce-que c'est plus rapide que mon code en C puisque c'est exactement les mêmes opérations que je fais (mais en C quoi) ?
-Edité le Samedi 16 juillet 2005 à 11:17 par Nul-
"De tous les animaux, l'homme a le plus de pente,
A se porter dedans l'excès."

Jean de la Fontaine
    
  :: Index » Forum Ti68K » Programmation C » Copie d'écran avec mask (23 réponse(s))
Pages : 1/2     « [1] 2 » »|

.Répondre à ce sujet
Les boutons de code
[B]old[I]talic[U]nderline[S]trikethrough[L]ine Flip Hori[Z]ontallyFlip [V]erticallySha[D]ow[G]low[S]poilerCode [G][C]ite
Bullet [L]istList Item [K] Link [H][E]mail[P]icture SmileysHelp
Couleurs :
Saisissez votre message
Activer les smileys
     

Forum de Ti-Gen v3.0 Copyright ©2004 by Geoffrey ANNEHEIM
Webmaster: Kevin KOFLER, Content Admins: list, Server Admins: Tyler CASSIDY and Kevin KOFLER, DNS Admin: squalyl
Page générée en 79.48ms avec 18 requetes