90

printf est une routine de tigcclib.a, donc il faut que tu linkes tigcclib.a à ton projet pour que ça marche.
Renseigne-toi sur le fonctionnement de cette routine sur internet, il y a énormément de doc.
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. »

91

dsl, je comprends vraiment pas !

92

ou utilises spritnf puis drawstrXY
avatar
<<< Kernel Extremis©®™ >>> et Inventeur de la différence administratif/judiciaire ! (©Yoshi Noir)

<Vertyos> un poil plus mais elle suce bien quand même la mienne ^^
<Sabrina`> tinkiete flan c juste qu'ils sont jaloux que je te trouve aussi appétissant

93

Je ne trouves pas sprintf dans l'aide de tigcc!! Commeny çà marche, c'est une rom_call ?

94

t'as une fonction recherche dans la doc de tigcc tongue
sprintf Function (ROM Call 0x53)

--------------------------------------------------------------------------------
stdio.h, string.h

short sprintf (char *buffer, const char *format, ...);


Sends formatted output to a string.

sprintf sends formatted output to a string. In fact, it does the following:

accepts a series of arguments;
applies to each a format specifier contained in the format string pointed to by format;
outputs the formatted data to the string pointed to by buffer;
sprintf applies the first format specifier to the first argument, the second to the second, and so on. The format string, controls how sprintf will convert and format its arguments. See printf for more info about format specifiers.

sprintf returns the number of bytes output, not including the terminating null byte in the count.
avatar
<<< Kernel Extremis©®™ >>> et Inventeur de la différence administratif/judiciaire ! (©Yoshi Noir)

<Vertyos> un poil plus mais elle suce bien quand même la mienne ^^
<Sabrina`> tinkiete flan c juste qu'ils sont jaloux que je te trouve aussi appétissant

95

Qu'est-ce que tu ne comprends pas ?
Plus d'infos ici : http://www.tiwiki.org/Sprintf
Ou ici : [google]sprintf[/google]
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. »

96

pourquoi çà ne fonctionne pas ?
move.w #1000,d0
move.w #1,-(a7)
move.w d0,-(a7)
move.w sprintf*4(a5),a0
jsr (a0)

97

move.w sprintf*4(a5),a0 jsr (a0)

C'est pas une romCall ! (Edit: ah si)



Lis la doc pour les arguments qu'il faut passer à la fonction.
avatar
Combien de tas de bois une marmotte pourrait couper si une marmotte pouvait couper du bois ?

98

bin si, c'est un rom_call
avatar
<<< Kernel Extremis©®™ >>> et Inventeur de la différence administratif/judiciaire ! (©Yoshi Noir)

<Vertyos> un poil plus mais elle suce bien quand même la mienne ^^
<Sabrina`> tinkiete flan c juste qu'ils sont jaloux que je te trouve aussi appétissant

99

Ah merde j'ai cru lire printf cheeky
avatar
Combien de tas de bois une marmotte pourrait couper si une marmotte pouvait couper du bois ?

100

Dites en fouillant dans les posts, j'ai trouvé un bout de code de M. KK, je l'ai repris à ma sauce, çà marche pas !!! Vous savez pourquoi ? :

move.w #234,d0
move.w #23,d1
add.w d0,d1
move.w d1,-(a7) ;nombre
pea format(pc) ;format
pea buffer(pc) ;buffer
move.l sprintf*4(a5),a0
jsr (a0) ;appel de sprintf
addq.l #8,a7 ;adjuste la pile
move.w #1,(a7) ;Attr = A_NORMAL
pea.l buffer(PC) ;Il faut remettre str sur la pile car sprintf modifie l'adresse. dixit M.KK
clr.l -(a7) ;x = y = 0
move.l DrawStr*4(a5),a0
jsr (a0) ;appel de DrawStr

101

est-ce que tu as bien fait "move.l $C8,a5" au début de ton programme ?

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

102

c'est quoi l'erreur ?`
avatar
<<< Kernel Extremis©®™ >>> et Inventeur de la différence administratif/judiciaire ! (©Yoshi Noir)

<Vertyos> un poil plus mais elle suce bien quand même la mienne ^^
<Sabrina`> tinkiete flan c juste qu'ils sont jaloux que je te trouve aussi appétissant

103

M.Pollux, oui
M.Flanker est "illegal instruction"

104

et elle se passe à quel moment ?
insère des
debug:
 bra debug

dans ton code, puis F11 dans VTI pour entrer dans le débugueur une fois qu'il sera entré dans cette boucle infinie
avatar
<<< Kernel Extremis©®™ >>> et Inventeur de la différence administratif/judiciaire ! (©Yoshi Noir)

<Vertyos> un poil plus mais elle suce bien quand même la mienne ^^
<Sabrina`> tinkiete flan c juste qu'ils sont jaloux que je te trouve aussi appétissant

105

J'ai essayé le code de M.KK tout seul et il fonctionne, j'en déduis donc que c'est le reste de mon programme qui déconne !

106

J'ai trouvé ce qui n'allait pas, maintenant çà fonctionne. J'ai lu dans un post que la rom_call sprintf était lente surtout si elle est placée dans une boucle principale. Pour éviter ce problème, faut-il coder manuellement la conversion du chiffre en chaine, à afficher ?

107

bah ça dépend, comme toujours smile

si la vitesse te suffit, tu le gardes, ça te fait du temps gagné pour coder plus finement autre chose, sinon, tu peux effectivement la recoder, ça peut être utile dans un jeu où la vitesse sera critique
avatar
<<< Kernel Extremis©®™ >>> et Inventeur de la différence administratif/judiciaire ! (©Yoshi Noir)

<Vertyos> un poil plus mais elle suce bien quand même la mienne ^^
<Sabrina`> tinkiete flan c juste qu'ils sont jaloux que je te trouve aussi appétissant

108

C'est une possibilité smile
Et si tu affiches en base 16, ce sera encore plus rapide !
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. »

109

Je ne suis vraiment pas doué, qu'est-ce qui ne va pas là dedans ? :

move.l #0,d0
move.l #1,d1
loop5:
move.w d1,-(a7) ;nombre
pea format(pc) ;format
pea buffer(pc) ;buffer
move.l sprintf*4(a5),a0
jsr (a0) ;appel de sprintf
addq.l #8,a7 ;adjuste la pile
move.w #1,(a7) ;Attr = A_NORMAL
pea.l buffer(PC) ;Il faut remettre str sur la pile car sprintf modifie l'adresse.
clr.l -(a7) ;x = y = 0
move.l DrawStr*4(a5),a0
jsr (a0) ;appel de DrawStr
lea 10(a7),a7 ;nettoyage de la pile
add.l d0,d1
cmp.l #100,d1
bne loop5

110

de nouveau, il se passe quoi ?
avatar
<<< Kernel Extremis©®™ >>> et Inventeur de la différence administratif/judiciaire ! (©Yoshi Noir)

<Vertyos> un poil plus mais elle suce bien quand même la mienne ^^
<Sabrina`> tinkiete flan c juste qu'ils sont jaloux que je te trouve aussi appétissant

111

Désolé pour les embetements. En fait je veux faire une boucle qui affixhe 1,2,3...jusqu'à 100 ou plus. A l"écran, il doit y avoir 1 puis 2 sur le 1, l'écran reste figé et je crois que je reste dans la boucle !!! Je suis obligé de faire un reset sur vti!

112

En fait, j'ai changé la valeur de d0, j'ai mis 1 sinon c logique que çà ne marche pas mais çà ne marche toujours pas, on dirait que d1 se mets à 0 ! Bizarre

113

Ouais, d1 est modifié alors j'ai fait çà et çà marche :

move.l #1,d3
loop5:
move.l ScreenClear*4(a5),a0
jsr (a0)
move.w d3,-(a7) ;nombre
pea format(pc) ;format
pea buffer(pc) ;buffer
move.l sprintf*4(a5),a0
jsr (a0) ;appel de sprintf
addq.l #8,a7 ;adjuste la pile
move.w #1,(a7) ;Attr = A_NORMAL
pea.l buffer(PC) ;Il faut remettre str sur la pile car sprintf modifie l'adresse.
clr.l -(a7) ;x = y = 0
move.l DrawStr*4(a5),a0
jsr (a0) ;appel de DrawStr
lea 10(a7),a7 ;nettoyage de la pile
add.l #1,d3
cmp.l #1001,d3
bne loop5

114

Effectivement c'est très rapide par rapport au basic, environ 5 fois plus rapide. Est-ce que ce j'ai fait est optimisable encore ?

115

Carrément !
Tu peux éviter d'effacer tout l'écran à chaque fois.
Ne pas appeler sprintf qui est très lent, mais faire la conversion toi-même.
Ne pas appeler DrawStr, qui est lent aussi, mais afficher toi-même.
Mais de toute façon, même si tu triples la vitesse de ce code ça ne servira pas à grand chose, car ton code actuel est déjà vraiment nettement plus rapide que le TI-BASIC.
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. »

116

Merci M.Sasume,
Ok pour l'écran, pour la conversion je n'ai pas compris le principe et comment afficher sans utiliser drawstr ?

117

Pour la conversion, il faut comprendre qu'une chaîne de caractères est une suite d'octets, dont la valeur de chacun est vu comme un code ASCII.
Par exemple, le code de 'A' est 65.
Donc la chaîne de caractères "ABCD" est stockée en mémoire sous la forme dc.b 65,66,67,68,0 (il y a un caractère nul pour indiquer la fin de la chaîne, par convention).

Le code du caractère '0' est 48.
Donc là où ton nombre contient 0, il faudra écrire 48 dans la chaîne de caractères, pour 1 ce sera 49, et ainsi de suite.
En fait, cela revient à ajouter la valeur '0' (c'est-à-dire 48) à chaque chiffre du nombre.

Tu peux regarder dans les sources de tigcclib la fonction itoa pour avoir une idée de comment coder ça.


Ensuite, pour ce qui est de l'affichage... Tu peux ne pas utiliser DrawStr si tu écris ta propre routine d'affichage qui serait moins générique donc facilement plus rapide.
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. »

118

Merci M.Sasume, j'ai rien trouver sur itoa d'intéressant en ASM, c'est encore le meme soucis dans l'aide de tigcc...plein de trucs pour faire du C...quasiment rien pour faire de l'asm !!!

Je ne connais pas le principe d'affichage sans drawstr, doit-on utiliser sprintf ?

119

Non.
Essaie de lire des sources sur l'affichage de sprites.

Pour itoa, c'est dans les sources de tigcclib qu'il faut regarder.
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. »

120

j'ai étudier une source que je n'arrive pas à mettre en oeuvre :

move.l #50; x
move.l #50; y
lea croix,a0
move.l #LCD_MEM,a1

move.l d1,d2 ; d1 et d2 contiennent la même valeur
lsl.l #5,d1 ; On multiplie d1 par 2^5, soit 32
lsl.l #1,d2 ; On multiplie d2 par 2^1, soit 2
sub d2,d1 ; On soustrait d1*32 et d2*2, en factorisant on a d1*(32-2) d'ou d1*30 !

move.l d0,d2 ; On copie d0 dans d2
lsr #3,d0 ; On divise d0 par 2^3 soit 8
and #7,d2 ; l'instruction AND permet grâce à un miracle de la nature d'obtenir le reste de d2/8

add d0,d1 ; Ajout du reste à d1
add #1,d1
add d1,a1 ; Ajout du total à a1

move.b #8,d3
sub d2,d3
move.w #7,d1

boucle:

clr.w d0
move.b (a0)+,d0
lsl.w d3,d0
move.w d0,(a1)
add #20,a1

dbra d1,boucle

croix: ; Placer les données en fin de programme avec les autres variables.
dc.b %10000001
dc.b %01000010
dc.b %00100100
dc.b %00011000
dc.b %00011000
dc.b %00100100
dc.b %01000010
dc.b %10000001