1

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?

2

-

3

Le problème est effectivement que tu n'exportes pas ta fonctions.
Tu dois rajouter un xdef clearFakeScreen dans ton fichier ASM.
avatar
« 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. »

4

Thanks, ca marche !
What kind of technology is this?

5

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?

6

1. section ".data"
n'est plus necessaire depuis tigcc 0.95

2. tigcc -S file.c

7

avatar
;)

8

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?

9

Au lieu de compiler avec tigcc file.c il faut compiler avec tigcc -S file.c
Sinon tu peux aussi aller dans les préfèrences de TIGCC IDE et enlever 'Delete Assembly Files after successful linking'. Et je crois que si tu vas dans les options du projet, et que tu mets 'Generate debug information', tu auras dans tes .s le code C correspondant en commentaire à côté du code assembleur.

Et apparement cette option correspond à -g...
http://tigcc.ticalc.org/doc/comopts.html#SEC3
avatar
;)

10

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?

11

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.)
avatar
;)

12

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?

13

Quelle version de tigcc ?
Ca me semble etre un probleme de section

14

0.94 SP4

Je l'ai DL aujourd'hui.
What kind of technology is this?

15

Passe a la 0.95 beta 11.

16

Merci PphD, ca marche maintenant ...
What kind of technology is this?

17

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?

18

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.

19

Tu n'en est jamais certain, en plus sous tigcc ce code là ne fera strictement rien, il faut préciser le registre que tu veux affecter.
Je ne sais plus la syntaxe exacte, quelquechose du genre:
register signed short i asm("%a0");
peut être (va jeter un coup dans la doc hehe)
avatar
Que cache le pays des Dieux ? - Forum Ghibli - Forum Littéraire

La 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.

20

ce code là ne fera strictement rien,

ah bon ??

21

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)
avatar
Que cache le pays des Dieux ? - Forum Ghibli - Forum Littéraire

La 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.

22

Je crois que c'est ca.

23

Oui, Kevin avait dit ça.
avatar
« 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. »

24

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?

25

Comment ça ?

« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)

26

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.
avatar
« 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. »

27

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)

28

Ah ok, merci.
avatar
« 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. »

29

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?

30

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.
avatar
« 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. »