1

Salut, tout le monde !
Je sais l' affichage d' un pixel à déjà été traité mais, je voudrais que vous m' aidiez à résoudre mon problème.
Voilà, j' ai une routine en ASM et je voulais l' utiliser dans mes créations dans un programme en C alors je me suis dit que je la passerais en Extended ASM.Le problème c'est que ça n'affiche rien...
Voilà la source:

void putpixel(short x ,short y ,unsigned char *scr_mem ) //d0 = x, d1 = y, a0 = vscreen_addr
{
asm (" moveq.w %0,%%d0
moveq.w %1,%%d1
move.w %2,%%a0
add.w %%d1,%%d1
move.w %%d1,%%d2
lsl.w #4,%%d1
sub.w %%d2,%%d1
move.w %%d0,%%d2
lsr.w #3,%%d0
add.w %%d1,%%d0
add.w %%d0,%%a0
not.b %%d2
bset %%d2,(%%a0)"
: // no outputs
: "g"(x), "g"(y), "g"(scr_mem)
: "d0", "d1", "d2", "a0" );
}

dans l' Header elle est défini comme suit:

void putpixel(short ,short ,unsigned char * );

c'est pour une utilisation directe avec LCD_MEM mais ,je veux pouvoir l' adapter après avec un écran virtuel.

Autre question,(je sais j'abuse smile)vaut mieux utiliser l' extended ASM ou le GNU ASM ?

Merci d' avance smile

2

Déjà, c'est bizarre que ça compile parce que moveq.w n'existe pas, d'autre part, tu ne peux pas faire de moveq avec une valeur dynamique (sans SMC).
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. »

3

Oui. Ce que je te conseillerais, c'est d'écrire :
asm ("
putpixel:
  add.w %d1,%d1 
  move.w %d1,%d2 
  lsl.w #4,%d1 
  sub.w %d2,%d1 
  move.w %d0,%d2 
  lsr.w #3,%d0 
  add.w %d1,%d0 
  add.w %d0,%a0 
  not.b %d2 
  bset %d2,(%a0)"
  rts
");

void __attribute__((regparm)) putpixel(short,short,unsigned char *);

Les valeurs sont automatiquement passées dans d0 et d1 pour x et y, et a0 pour scr_mem. Il vaut mieux éviter l'ASM inline quand toute ta fonction est en ASM, parce que le compilateur peut rajouter un peu n'importe quoi autour.

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

4

Le moveq c'est une erreur de ma part. j' ai tout écrit de tête la source est pas sur l' ordi que j' utilise.Désolé triso

5

Donc, vaut mieux utiliser le GNU ASM.

/Attention question peut-être débile

void __attribute__((regparm)) ça fait quoi exactement?
Comme je débute je connais pas tout je pourrais avoir une explication? happy

/fin Attention question peut-être débile

6

DarkS
: void __attribute__((regparm)) ça fait quoi exactement?

Passage des paramètres par registres. Mais pour des routines codées en assembleur, tu ferais mieux de donner des spécifications explicites plutôt que d'utiliser cet attribut qui fait faire le choix au compilateur, c'est plus sûr (même si le choix du compilateur est fait d'une manière bien précise). C'est à dire:
void putpixel(short asm("d0"),short asm("d1"),unsigned char * asm("a0"));
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

7

En fait, j'avais ma routine d'affichage de pixel en ASM que j' avais créé sous AS92 et je voulais l'implémenter pour une utilisation en C.
Alors en fait, la vrai question c'est comment je fait pour le faire de manière propre? confus

8

Bah, de la manière décrite par Pollux. Sauf que tu utilises mon prototype et pas le sien (c'est-à-dire la spécification explicite des registres et pas l'attribut regparm), c'est plus lisible et plus propre (tu sais tout de suite dans quel registre se trouveront tes variables, et tu peux aussi en choisir un autre si c'est plus efficace pour une raison ou pour une autre).
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

9

Ah,OK. tongue
Merci Kevin et Pollux j'essaierais le plus vite possible. love

10

Non, pas besoin d'utiliser les trucs en plus de Kevin. La façon dont les registres sont alloués est bien définie : les pointeurs sont alloués dans l'ordre à partir de a0, et les variables qui ne sont pas des pointeurs dans l'ordre à partir de d0. C'est de toute façon le placement le plus efficace, parce que ce sont ces registres-là qu'une fonction peut détruire.

Sinon qu'appelles-tu l'"Extended ASM" ? L'assembleur A68k ? C'est possible aussi, enlève simplement les % et met tout ça dans un fichier .asm.

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

11

Ce qu'il appelle "extended ASM", c'est l'assembleur inline à l'intérieur d'une fonction, avec opérandes, clobbers etc.

Et je trouve la spécification explicite des registres nettement plus claire.
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

12

Bon, soyez objectifs grin
Il vaut mieux qu'il n'explicite pas les registres s'il souhaite que son programme soit compilé par GTC plus tard. Sinon, il peut expliciter.
avatar
Un site complet sur lequel vous trouverez des programmes et des jeux pour votre calculatrice TI 89 / Titanium / 92+ / Voyage 200 : www.ti-fr.com.
Quelques idées personnelles ici.

13

tongue J' entend parler de ci de là de GTC mais est ce qu' il y a déjà des release de ce prog et quelle sont ses caracréristiques principales ?
A propos, j' ai implémenté cette routine comme l' a décrit Kevin et elle marche très bien, au pire je peut l' implémenter comme Pollux me l' a suggéré c' est pas bien dur .tongue
J' ai essayé d' optimiser la routine ça donne ça:

putpixel:
addx.w %d1,%d1
move.w %d1,%d2
lsl.w #4,%d1
subx.w %d2,%d1
move.w %d0,%d2
lsr.w #3,%d0
addx.w %d1,%d0
not.b %d2
bset %d2,(%a0,%d0.w)
rts

J' avais dans l' idée d' utiliser une table pour le masque du genre:

dc.b 0x10000000
dc.b 0x01000000
dc.b 0x00100000
dc.b 0x00010000
dc.b 0x00001000
dc.b 0x00000100
dc.b 0x00000010
dc.b 0x00000001

Vous en pensez quoi ? C' est judicieux ? confus

14

Compte les cycles.
Par contre, c'est judicieux d'utiliser une table pour le y*30 smile
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. »

15

(pour les y*30) bof, ça ne gagne pas tant que ça, sauf en la générant à la volée et en en profitant pour rajouter l'adresse du buffer mémoire.

Pour les masques, c'est à mon humble avis une perte de temps.

Accessoirement je te recommanderais fortement d'utiliser add/sub au lieu de addx/subx, et 0b au lieu de 0x.

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

16

dc.b 0x00000001 mur quel imbécile...

Je vous remercie des indicessmile.J' ai fait comme ça:

je défini la table tel que dc.w Adresse_Ecran + numéro_de_ligne(allant de 0 à 127) * 30(nombre d'octets par ligne)
Ensuite, je charge la table dans a0 avec un offset de y * 2 (Faut un décalage de 2 octets)

En fait, j' ai plus besoin de "unsigned char * asm("a0")" puisque j' utilise directement l' adresse 0x4C00.
Pollux :
pour les y*30) bof, ça ne gagne pas tant que ça, sauf en la générant à la volée et en en profitant pour rajouter l'adresse du buffer mémoire.

Tu veux dire quoi par là ? En la générant a la volée ?
Pollux :
Accessoirement je te recommanderais fortement d'utiliser add/sub au lieu de addx/subx, et 0b au lieu de 0x.

Vaut mieux laisser faire le compilo ?

17

DarkS
:
Pollux :
Accessoirement je te recommanderais fortement d'utiliser add/sub au lieu de addx/subx, et 0b au lieu de 0x.
Vaut mieux laisser faire le compilo ?

Non, addx et subx sont tout simplement faux ici.
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

18

DarkS
: Tu veux dire quoi par là ? En la générant a la volée ?
Ça correspond à ce que tu as fait : il disait que c'est plus intéressant de générer la table quand on connaît déjà l'adresse de l'écran sur lequel on veut afficher.
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. »

19

Bon, je crois que j' ai encore pas mal de chemin a faire avant de programmer correctement sad

Mais, je garde l' espoir car je progresse et je progresserais encore beaucoup en grande partie grace a ce forum et aux personnes qui m' aident. grin