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 Assembleur 68K » Problème :( (12 réponse(s))
./POST DE DEPART (post n°0)   Marquer comme non lu.
Orage Ecrit le: Vendredi 25 juin 2004 à 13:13 Déconnecté(e)    Voir le profil de Orage Envoyer un email à Orage Envoyer un message privé à Orage  


J'ai un problème : Quand je code une fonction en ASM 68k qui utilise les registres de données d0, d1, et d2, la fonction marche correctement ( en étant employée dans un code en C ), sauf quand elle est dans une boucle :s. Par exemple, pour une fonction d'affichage d'un point, - void PxlOn(short x asm("%d0"), short y asm("%d1"), void *plane asm("%a0")) -, alors elle marchera bien si je l'utilise ponctuellement dans le code, mais si je l'emploie dans une boucle du genre :
for(i=0 ; i<LCD_WIDTH ; i++)
PxlOn(i, 2, LCD_MEM);
Alors ça affiche des points un peu partout :s sur l'écran... ALors que
for(i=0 ; i<LCD_WIDTH ; i++)
{
PxlOn(i, 2, LCD_MEM);
ngetchx();
}
marche normalement !

J'ai remarqué que si je sauvais les registres et les restaurais, alors ça fonctionnait, et qu'il suffisait de mettre à la fin de la fonction :
clr.l d0

Quelqu'un sait pourquoi j'ai ce problème ?

Merci beaucoup !

Voici les sources ( il doit y avoir une erreur dedans )

; prototype : extern void PxlOn(short int x asm("%d0"), short int y asm("%d1"), void *plane asm("%a0"));


xdef PxlOn

PxlOn:
muls.w #30,d1
move.w d0,d2
divs.w #8,d0
and.w #7,d2

add.w d1,d0
adda.w d0,a0

move.b #%10000000,d0
lsr.b d2,d0

or.b d0,(a0)

;clr.l d0 ; Indispensable pour que ça marche... ?

rts
    
./Post n°1   Marquer comme non lu.
geogeo Ecrit le: Vendredi 25 juin 2004 à 13:15 Déconnecté(e)    Voir le profil de geogeo Envoyer un email à geogeo Visiter le site WEB de geogeo Envoyer un message privé à geogeo  


La boucle est sans doute optimisée.
Tu pourrais donner le code en ASM généré par TIGCC?
Webmaster du site.
Programmeur sur TI68K. Arkanoid, Nebulus, GFA-Basic.

Plus d'informations sur GFA-Basic (un langage Basic pour TI68K).
http://www.tigen.org/gfabasic
    
./Post n°2   Marquer comme non lu.
Sasume Ecrit le: Vendredi 25 juin 2004 à 13:20 Déconnecté(e)    Voir le profil de Sasume Envoyer un email à Sasume Visiter le site WEB de Sasume Envoyer un message privé à Sasume  

Je ne comprends pas. Normalement, TIGCC utilise la convention d'AMS, à savoir qu'une fonction a le droit de détruire les registres d0-d2/a0-a1.
Est-ce que tu peux me montrer le code généré par ta boucle for ?

Sinon, pour info, ta fonction est optimisable :)
    
./Post n°3   Marquer comme non lu.
Orage Ecrit le: Vendredi 25 juin 2004 à 14:03 Déconnecté(e)    Voir le profil de Orage Envoyer un email à Orage Envoyer un message privé à Orage  


Merci pour votre aide :) Le code généré est disp à http://oragestudio.free.fr/autre/main.asm
    
./Post n°4   Marquer comme non lu.
geogeo Ecrit le: Vendredi 25 juin 2004 à 14:12 Déconnecté(e)    Voir le profil de geogeo Envoyer un email à geogeo Visiter le site WEB de geogeo Envoyer un message privé à geogeo  


Tu as donné le code avec ngetch qui focntionne normalement? Faudrait plutôt donner le code qui ne fonctionne pas. :)
Webmaster du site.
Programmeur sur TI68K. Arkanoid, Nebulus, GFA-Basic.

Plus d'informations sur GFA-Basic (un langage Basic pour TI68K).
http://www.tigen.org/gfabasic
    
./Post n°5   Marquer comme non lu.
Sasume Ecrit le: Vendredi 25 juin 2004 à 14:12 Déconnecté(e)    Voir le profil de Sasume Envoyer un email à Sasume Visiter le site WEB de Sasume Envoyer un message privé à Sasume  

Ben d'après le code généré, TIGCC tient compte du fait que des registres sont détruits.
Ça doit être une erreur toute bête qu'on ne voit pas :)
    
./Post n°6   Marquer comme non lu.
Sasume Ecrit le: Vendredi 25 juin 2004 à 14:14 Déconnecté(e)    Voir le profil de Sasume Envoyer un email à Sasume Visiter le site WEB de Sasume Envoyer un message privé à Sasume  

geogeo> Non, il a donné le code où ngetchx n'est pas dans la boucle.
    
./Post n°7   Marquer comme non lu.
Sasume Ecrit le: Vendredi 25 juin 2004 à 14:17 Déconnecté(e)    Voir le profil de Sasume Envoyer un email à Sasume Visiter le site WEB de Sasume Envoyer un message privé à Sasume  

Orage> Tu peux me montrer le code de tous les fichiers que tu utilises ?
    
./Post n°8   Marquer comme non lu.
Kevin Kofler Ecrit le: Vendredi 25 juin 2004 à 14:46 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  


divs.w #8,d0 = erreur!
Cela divise le long en %d0 par 8 et donne le résultat en tant que word. Or, tu n'as pas du tout défini ce qui se trouve dans la partie haute de %d0 (ton paramètre est un short int).

D'ailleurs, c'est aussi:
1. inefficace
2. faux pour les x négatifs (troncature dans le mauvais sens)
Le code correct est asr.w #3,d0.

Et au passage, pourquoi utilises-tu l'assembleur A68k? L'assembleur GNU est plus pratique...
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°9   Marquer comme non lu.
Sasume Ecrit le: Vendredi 25 juin 2004 à 14:51 Déconnecté(e)    Voir le profil de Sasume Envoyer un email à Sasume Visiter le site WEB de Sasume Envoyer un message privé à Sasume  

Arf, j'aurais mis du temps à la trouver celle-là :)
    
./Post n°10   Marquer comme non lu.
Invité Ecrit le: Vendredi 25 juin 2004 à 15:05 Déconnecté(e)    
 
le simple fait que la commande clr.l d0 permette au programme de fonctionner indique deja grandement sur la nature de l'erreur...!

    
./Post n°11   Marquer comme non lu.
Orage Ecrit le: Vendredi 25 juin 2004 à 16:22 Déconnecté(e)    Voir le profil de Orage Envoyer un email à Orage Envoyer un message privé à Orage  


OK, ça marche maintenant je suis content :) Merci à tous !
    
./Post n°12   Marquer comme non lu.
Lionel Debroux Ecrit le: Vendredi 25 juin 2004 à 18:09 Déconnecté(e)    Voir le profil de Lionel Debroux Envoyer un email à Lionel Debroux Visiter le site WEB de Lionel Debroux Envoyer un message privé à Lionel Debroux  

FI, clr.l d0 -> moveq #0,d0 (+/- 0 octets, -2 clocks).
Lionel Debroux - membre de TICT.
    
  :: Index » Forum Ti68K » Programmation Assembleur 68K » Problème :( (12 réponse(s))
Pages : 1/1     « [1] » »|

.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 41.63ms avec 19 requetes