« GCC 4.2 | Main | Accélération acces mémoire carte vidéo »

vendredi, novembre 10, 2006

Un problème en moins sur la carte

Les ldg en PureC ainsi que de nombreux autres logiciels compilés avec ce logiciel plantaient.

Après debugguage, la fonction mise en cause est memset() utilisée à l'initialisation des ldg. Partant de cette donnée Didier à découvert le problème, je vous recopie son explication:

<didier>

au début de la routine memset je vois :

move.b d0,-(a0)

move.b d0,-(sp) => SP est décrémenté de 2 sur 68K et 1 sur le coldfire !

move.w (sp)+,d2

move.b d0,d2

Pure C utilise cette astuce pour avoir le contenu de d2 bit 15-8 <=> d2 bit 7-0., J'ai jamais écrit un truc comme ca en assembleur ! ce n'est pas très logique. Résultat le pointeur de pile ne correspond plus à rien, il est sur une adresse impaire.

Je vais essayer de patcher la chose sur xcontrol.

il faudrait écrire

move.b d0,-(a0)

move.b d0,d2

lsl.l #8,d2

move.b d0,d2

Au niveau place c'est la même chose (4 octets à changer). 1f00341f => 1400e18a

</didier>

Après divers échanges, et de se dire que ce n'était pas l'émulateur qui était fautif donc qu'il n'y avait donc pas d'exception pour fonction manquante (donc a priori irrécupérable), et patcher une flopée de logiciels à la main ce n'était pas trop la solution idéale, la solution retenue à été le patch dynamique à l'exécution du code, la routine de didier reconnaît la signature du code du memset et la modifie à la volée. Résultat, le windframe par défaut de MyAeS fonctionne, comme Everest, Hddrutils, Yukon et pas mal d'autres logiciels daignent démarrer. Pas encore de quoi crier au miracle mais cela fait plaisir de voir la progression.

Allez au bug suivant!

Ecrit par OL at 1:30 PM
Categories: Coldfire