J'ai un petit problème:
Je n'arrive pas a appeler les fonctions en asm68k depuis le C.
Le code en assembleur est precédé de: section ".data" lors de la création du fichier source ASM.
Mais comment appeler la fonction ?
Dans un exemple j'ai vu un truc du style:
extern void clearFakeScreen(void* source asm("a0"));
et la fonction est censée pouvoir etre appelée par: clearFakeScreen(pointeur_ecran_virtuel);
Mais a la compilation, j'ai le message:
1 undefined reference to 'clearFakeScreen'.
Quel est le probleme ?
What kind of technology is this?
Le problème est effectivement que tu n'exportes pas ta fonctions.
Tu dois rajouter un xdef clearFakeScreen dans ton fichier ASM.

« Quand le dernier arbre sera abattu, la dernière rivière empoisonnée, le dernier poisson capturé, alors vous découvrirez que l'argent ne se mange pas
. »
Au fait, y a-t-il moyen de voir l'equivalent assembleur 68k du code généré par le compilateur ?
What kind of technology is this?
PpHd Le 07/07/2004 à 11:47 1. section ".data"
n'est plus necessaire depuis tigcc 0.95
2. tigcc -S file.c
tigcc -S est une ligne a inclure dans le code ?
Ca doit etre ultra-illisible de toutes facons car il n'y a plus les noms de labels ...
What kind of technology is this?
Ok, merci beaucoup BiHi, je vais voir ce que permettent de modifier les préférences!
Je passe au C car j'en ai pas mal fait sur PC (enfin, c'était du C++) mais surtout pour faciliter la création de fichiers externes, la gestion des arguments, des interruptions, des niveaux de gris, mais la quasi integralité du code reste en ASM.
La perte de puissance se fera au niveau des appels des fonctions en assembleur, des passages d'arguments en registres, de la lecture du clavier.... plein plein de petits details comme ca.
La perte de puissance sera-t-elle sensible ?
What kind of technology is this?
BiHi Le 07/07/2004 à 12:37 création de fichiers externes: il vaut mieux utiliser les romcalls de vat.h, même en C.
interruptions: tigcc va sauver les registres, lancer une fonction normale en C, restaurer les registres et mettre un rte à la fin pour faire une interruption, c'est pas top surtout pour une interruption qui a lieu pleins de fois chaque seconde.
niveaux de gris: les gris de gray.h sont codés en gnu as, donc je vois pas le rapport avec le C.
appels de fonctions en assembleur ~= appels de fonction en C
passage d'argument par registre: comme tu l'as indiqué dans le post de départ il suffit de asm("a0") pour mettre dans le registre.
A part si tu codes les niveaux de gris et les routines de sprite en C normalement la vitesse sera pas énormement inférieure, mais la taille risque de grossir un peu (surtout si tu utilises fopen, etc.)

;)
Gros bug:
Meme en ayant ABSOLUMENT tout viré de la fonction _main, ca plante (la compilation se déroule bien cependant)!
Si je vire TOUS les fichiers .asm du projet, ca marche, mais la presence d'un seul suffit a faire bugger.
D'ou ca peut venir ?
What kind of technology is this?
PpHd Le 07/07/2004 à 13:36 Quelle version de tigcc ?
Ca me semble etre un probleme de section
0.94 SP4
Je l'ai DL aujourd'hui.
What kind of technology is this?
Merci PphD, ca marche maintenant ...
What kind of technology is this?
Dans un code, quand on met:
register signed short i;
Comment etre sur que i est bien sauvé dans un registre ASM ?
What kind of technology is this?
Pen^2 Le 07/07/2004 à 16:42 je ne sais pas s'il y a une extension GNU ou un truc du genre, mais je ne crois pas qu'on puisse en etre certain.
Enfin le mot clef "register" est ignoré par tigcc si le registre n'est pas précisé (bon ça va quand même faire une variable dans la pile hein).
(Toujours selon mes souvenir, le mieux c'est quand même la doc)

Que cache le pays des Dieux ? -
Forum Ghibli -
Forum LittéraireLa fin d'un monde souillé est venue. L'oiseau blanc plane dans le ciel annonçant le début d'une longue ère de purification. Détachons-nous à jamais de notre vie dans ce monde de souffrance. Ô toi l'oiseau blanc, l'être vêtu de bleu, guide nous vers ce monde de pureté. - Sutra originel dork.
Quand on passe des parametres a une fonction en assembleur (ex: register signed asm("d0")), le move.l d0,-(a7) et le move.l (a7)+,d0 sont-ils automatiqument effectués ?
What kind of technology is this?
signed n'est pas un type. Je crois que le standard précise que dans ce cas le type est int.
Quand tu appelles une fonction en C, tigcc sauvegarde les registres d0-d2/a0-a1 parce que la fonction a le droit de les détruire. Puis elle appelle la fonction et elle restaure les registres.

« Quand le dernier arbre sera abattu, la dernière rivière empoisonnée, le dernier poisson capturé, alors vous découvrirez que l'argent ne se mange pas
. »
Sasume> signed n'est pas moins un type que short... signed = abbrév pour "signed int", short = abbrév pour "short int" = abbrév pour "signed short int", etc...
« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)
Ah ok, je voulais dire register signed short asm("d0").
Merci.
Donc, tigcc sauvegarde les registres que l'on met en parametre, c'est bien ca?
Mais si par exemple j'ai un registre d0 qui vaut: 0xAAAA7777
Je veux passer 256 en parametre dans d0 mais garder l'octet de poids fort AAAA.
tigcc va faire:
move.l d0,-(a7)
moveq.l #256,d0
;puis le code ASM avec d0 initialisé a 0x00000100 et pas 0xAAAA0100
move.l (a7)+,d0
Y a-t-il un moyen de ne modifier que l'octet de poids faible par le passage en parametre ?
What kind of technology is this?
TIGCC ne sauvegarde rien d'autre que d0-d2/a0-a1 (en longwords), le reste, tu t'en occupes.
Donc pour ton problème à mon avis, il faut que tu utilises de l'ASM inline, ce sera plus simple.

« Quand le dernier arbre sera abattu, la dernière rivière empoisonnée, le dernier poisson capturé, alors vous découvrirez que l'argent ne se mange pas
. »