Vous n'êtes pas identifié.
ben dans ce cas multiplie la variable des fps par 10 pour l'avoir sur 10 sec, o moins ça fera qqchose de sup ke 1!
Hors ligne
AVIS LA POPULATION: je vais peut etre dire une connerie !
2072 dit que TurboC transforme le code C en ASM. C'est pas plutot du C au binaire ???
Hors ligne
C'était effectivement incorrect, le compilateur transforme le code C en code machine, mais vu les similitudes qu'il y a entre l'assembleur et le code machine...
Hors ligne
hey chhhhhhhtttttttttt!!!! 2072 n'a plus de calmants!!!! :ptdr: :ptdr: :langue:
ben en fait TC passe par l'asm, d'ailleurs, lors du dev de mxdraw j'avais tout plein d'erreurs, mais dans "mxdraw.asm" et non '"mxdraw.c"
TC optimise en assembleur, puis génère un code asm, qui est ensuite passé en binaire pour le proc! sinon ça ne passe pas directo, sinon y'aurait pas d'opti, et les progz seraient vraiment lents!
Hors ligne
8O Erps, j'ignorais que TC passait par l'asm ( mais si c'est seulement TC ca explique mon ignorance... c'ets pas le seul? :oops: )...
On peu récupérer le code asm d'un prog qu'on a fait en C :?:
Ou ca? :vert: Ou ca? :vert: Ou ca? :vert: Ou ca? :vert: Ou ca?
Hors ligne
alors hum hum
Voila, ebn fait le compilauteur transforme bien le C en Asm aprés etre passé par le Precompileur (qui change des trucs)
Ensuite il transforme par exmple :
si cous mettez
...
printf("Caca");
getch();
...
il met :
...
push addr_CACA
load _printf
load _getch
...
et aprés il assemble !
Hors ligne
ben oui ca on sans doute
Mais y'a pas moyen de récupérer ce code asm? :?:
Hors ligne
et aussi avec Borland C++ 5 , on peur sortir que le code asm (fada de code !!!)
et voila
Hors ligne
... Superna ou l'art de répondre précisément a la question posée...
Hors ligne
ben moi g une ruse!
tu fais une routine en asm, ou tout simplement ça:
void RuZ(void) {asm mov [es:si],ax}
lors de la compilation TC devrait te mettre une erreur dans le style qqchose ignored.
ben la tu vas sur l'erreur, tu fais entrée, et la hop! le code asm tu prog!!! t'as plus k'à l'enregistrer!
en fait cette erreur vient de la notation:
pour ne pas avoir cette erreur, il faut mettre:
es:[si],ax
(le registre es pas entre crochets)
voila!
sinon je sais pas comment faire autrement!
Hors ligne
ah bon intéressant ca :twisted:
merci
Hors ligne
TOUT les compilateurs font ça. En principe il y a toujours une option pour lui dire de ne pas assembler (il faut regarder dans les options de la ligne de commande).
Hors ligne
ben oui mais je sais po où il le génère dc je m'arrange comme ça! en crééant volontairement une erreur ki peut être comprise unikement par le compilo asm interne de TC.
Hors ligne
Hors ligne
Bon voila j'ai modifié quelques trucs mais ca n'a pas changé grand chose...
Tout est la:
3dgraph.zip
(lecteur, exe et sources)
Ces sources sont la pour que vous jetiez un oeil, par pitié si vous voyez quelque chose a améliorer (ca doit pas manquer :? ), dites le moi!!
Hors ligne
Ya 100 fois plus rapide pour effacer l'écran :
void clearpage(short page) { asm { pushf; push es; push di; push cx; push ax; mov ax,page; shl ax,6; add ax,0x1A20; mov es, ax; xor di, di; mov cx, 1024; shr cx,1; xor ax, ax; cld; rep stosw; mov cx, 1023; xor di,di; add di, cx; mov es:[di],al; pop ax; pop cx; pop di; pop es; popf; } return; }
Voilà il est impossible de faire plus rapide (c'est une modification de la fonction qui met à zero les zones mémoires dans ma lib). Pense à mettre mon pseudo à coté de cette formidable fonction !
Tu devrais mettre la fonction setpix en inline dans ta fonction line ça ira bcp plus vite.
Puis le fait d'utiliser l'émulation de la virgule flotante doit ralentir énormément le programme, les améliorations que je t'ai donné n'auront peut-être aucune incidence sur la vitesse à cause de ça...
Hors ligne
dsl 2072 mais il y a lpus rapide!
la même fonction mais sans les sauvegardes des registres!
sinon en fonctio nqui marche à coup sûr:
void clearpage(short page) { int i; asm { xor i,i mov ax,page mov es,ax mov si,i mov ax,0x0000 mov es:[si],ax add i,2 cmp i,1024 jbe dboucle } }
voila celle là c'est sûr elle marche
ou sinon:
void clearpage(short page) { asm mov ax,page asm xor si,si asm xor di,di asm mov cx,0x200 asm cld asm rep movsw }
et cette routine là te permet carrément de te passer de double buffering!
par contre vu ke g pas testé a routine de 2072 je sias pas ce k'elle vaut comparé à elle.
Hors ligne
En effet j'ai été moi meme assez étonné de voir comment fonctionnait la fonction clearpage... Pourtant je l'ai prise de casio2b.h donc je me suis dit qu'il devait y avoir une raison valable a faire ca! :?
En tout cas je vais comparer avec les différentes fonctions ci-dessus et je vous dirai quoi
( au fait si j'ai bien vu la fonction de 2072 a besoin d'un nombre entre 0 et 4 (?) comme parametre pour page, tandis que celles de casiomax ont besoin de l'adresse mémoire du buffer video... alors ou bien je modifie celles de casiomax ( ), ou bien... ou bien je sais pas :? )
Sinon, pas de remarques au niveau de la structure du programme?? :?:
Hors ligne
Et 2072 je n'ai pas compris ta remarque sur la fonction Line...
Je dois intégrer setpix a Line plutot que d'avoir une fonction indépendante pour afficher un pixel? C'est ca? :?:
Hors ligne
Euh casiomax t'aurais pas oublié le dboucle dans ta fonction?
void clearpage(short page) { int i; asm { xor i,i mov ax,page mov es,ax dboucle: mov si,i mov ax,0x0000 mov es:[si],ax add i,2 cmp i,1024 jbe dboucle } }
C'est pas mieux? :idea:
Hors ligne
Le préfixe rep c'est ce qu'il y a de plus rapide, et la sauvegarde des registres et plutôt utile sinon tu t'exposes à des problèmes... puis c'est pas ça qui prend le plus de temps de toute façon, le gain est totalement négligeable si tu ne le fais pas...
J'ai modifié ma fonction pour qu'elle marche avec des numéros de page comme celle que tu utilises.
Oui pour ta fonction line, intègre directement setpix ça ira plus vite.
sinon pour ma fonction il y a quelques lignes que l'on peut enlever :
void clearpage(short page) { asm { pushf; push es; push di; push cx; push ax; mov ax,page; shl ax,6; add ax,0x1A20; mov es, ax; xor di, di; mov cx, 1024; shr cx,1; xor ax, ax; cld; rep stosw; pop ax; pop cx; pop di; pop es; popf; } return; }
ces lignes étaient là pour assurer la copie du dernier caractère si le nombre d'octets à initialiser est impair mais ici ça n'est pas le cas...
C@siomax: ta dernière fonction est fausse, elle copie n'importe quoi sur la page vidéo, la mienne remplie la page avec la valeur contenue dans ax.
Hors ligne
elle est fausse ? pourtant chez moi elle efface l'ecran.
y aquand meme deux trois bugs: elle n'efface les printf et y a des merde quand on passe d'un mode video à un autre sinon ca va.
Hors ligne
merci bien je vais regarder ca...
Sinon j'ai pensé a possibilités:
- remplacer les float par autre chose, par exemple un tableau de entiers ( signe, partie entiere, partie frac ), mais alors pour les calculs bonjour le boulot :oops:
- ecrire une procédure de produits de matrice en asm, je vais voir ce que je peux faire ( j'aurai sans doute besoin d'un coup de pouce ), mais je pense que si les elements de la mat sont des floats ca risque de pas etre facile... :?
Hors ligne
elle est fausse ? pourtant chez moi elle efface l'ecran.
y aquand meme deux trois bugs: elle n'efface les printf et y a des merde quand on passe d'un mode video à un autre sinon ca va.
La mienne marche toujours et n'a aucun bug.
Hors ligne