Vous n'êtes pas identifié.
Voila je fais un petit prog qui affiche déja plein de sprites en DB.
J'essaye alors d'afficher une ligne verticale qui ne depasse pas de l'ecran (j'en suis sure) avec la fonction de db-lib bvline.
Le fait d'afficher en double buffering cette ligne en plus des autres sprites ne fait pas bugger directement la calculatrice mais quand on quitte le programme, soit la calto se bloque ou au redemarrage de celle ci, j'ai la memoire principale effacée. :x
(J'affiche tout sur les segments 5 et 6 et je recopie tout sur 1 et 3 avec copyscreen)
Quand j'affiche la ligne verticale directement sur 1 et 3 (SEG) sans donc le double buffering, y'a pas de prob de bug et de plantage de calto.
C'est etonnant. J'affiche peut être trop de sprites ou d'éléments?
Enfin, j'en sais rien après tout. Il y a un bug connu?
Merci.
Hors ligne
poste le code source de ton programme (s'il est trop long simplifie le)
tu as peut etre faire des erreurs d'arguments avec copyscreen (t'as pas fait un truc du genre copyscreen(1,5) ?)
en tt cas tu as du écrire ds la mémoire de la calculatrice
Hors ligne
Ok je vous poste ca dès que possible, mais ca marchait très bien avant que je mette la ligne verticale et ca marche tjs bien quand je l'enlève.
C'est elle qui pose le prb.
voila :
copyscreen(SEG1,SEG4); copyscreen(SEG1,SEG5); copyscreen(SEG2,SEG6); d8_and(i,j,Chag[16],SEG1); d8_and(i,j,Chag[16],SEG3); d8_or(i,j,Chag[vg],SEG1); d8_or(i,j,Chag[vg+1],SEG3); d8_and(x,y,Chad[16],SEG1); d8_and(x,y,Chad[16],SEG3); d8_or(x,y,Chad[vd],SEG1); d8_or(x,y,Chad[vd+1],SEG3); Boucle // c'est une vraie boucle dans le programme hein copyscreen(SEG4,SEG5); copyscreen(SEG2,SEG6); bvline(0,degg,63,SEG5); bvline(0,degg,63,SEG6); bvline(127,degd,63,SEG5); bvline(127,degd,63,SEG6); /*AFFICHAGE DU SPRITE*/ d8_and(i,j,Chag[16],SEG5); d8_and(i,j,Chag[16],SEG6); d8_or(i,j,Chag[vg],SEG5); d8_or(i,j,Chag[vg+1],SEG6); d8_and(x,y,Chad[16],SEG5); d8_and(x,y,Chad[16],SEG6); d8_or(x,y,Chad[vd],SEG5); d8_or(x,y,Chad[vd+1],SEG6); copyscreen(SEG5,SEG1); copyscreen(SEG6,SEG3);
Evidemment, c'est hyper simplifié mais j'ai mis tous ce qui touchait au double buffering.
Merci
Hors ligne
En fait c'est toi qui utilise mal la fonction bvline... (Faut avouer que la doc n'est pas particulièrement précise)
Pour tracer une ligne noire, tu ne dois pas appeler cette fonction pour chacun des deux buffers du mode DB, mais uniquement pour le premier des deux...
Si tu fais bvline(0,degg,63,SEG6); tu écris à la fois sur le 6eme buffer et sur le 8eme, or ce dernier n'est pas un buffer video mais la table d'allocation des zones mémoires dans ta calc... (Autrement dit si tu modifies mal le contenu tu risques de perdre toutes les données comme tu t'en es rendu compte).
Donc pour afficher une ligne, n'utilise que le buffer 5
PS: t'as l'air de bien t'amuser pour afficher tes sprites dis-moi :P
Hors ligne
Effectivement Merci beaucoup d'ailleurs.
Mais je veux afficher sur le buffer 5 et 6 et non pas sur le buffer 5 et 7 car ça en saute un non?
Comment je peut modifier la fonction pour qu'elle remplisse le 5 et 6 en mettant SEG5 et non la 5 et 7?
Sinon ca me fait modifier tout le prog et j'en ais pour un bout de temps.
Effectivement, j'apprend beaucoup a programmer avec les sprites en C. J'essaye de faire un prog mais on verra... Pour le moment c'est le bordel.
Merci encore
Hors ligne
Tu vas devoir remplacer toutes les lignes du genre
or es:[di+0x800],dh
par
or es:[di+0x400],dh
pour que ça écrive sur le buffer qui suit et pas sur celui encore après...
Hors ligne
Ouais! ca marche, pas de prob
Merci encore.
Hors ligne
À propos du double buffering: il faut mieux utiliser le page flipping (pas besoin de copier d'écrans): on affiche un buffer pendant qu'on dessine dans un autre, quand ce dernier est fini on l'affiche et on écrit dans l'autre, on peut faire ça très facilement avec la calc (en utilisant les ports pour changer l'adresse du buffer affiché). Le seul inconvennient c'est qu'on ne peut pas utiliser les fonctions du genre printf() et compagnie parce qu'on ne peut pas les rediriger vers un buffer choisi...
(je n'ai pas lu tout le topic, je me suis arrêté à "copyscreen")
Hors ligne
en meme temps, si tu utilise printf uniquement pour afficher du texte...
tu peux utiliser les fonctions de db-lib : locate() et text(), qui elle te permettent de rediriger vers le buffer choisi...
evidemment comme tout n'est pas parfait, si tu veux afficher des nombres a partir d'une variable, faudra te creer tes fonction
Hors ligne
me semblait que le page flipping posait des problèmes, j'sais plus qui m'a dit ça mais quand j'avais fait le test j'ai aussi eu des problèmes, ça clignotait... et ça semblait pas venir de mon code...
à retester peut etre encore?
Hors ligne
J'avais fait les mêmes essais, et ça clignotait
Hors ligne
C'est peut-être qu'il faut "flipper" les écrans au bon moment (en cadence avec la fréquence de rafraîchissement).
Hors ligne
On pourrait hooker une fonction sur l'interruption, où, à l'aide d'une variable globale, on ferait en sorte que ça bascule au moment voulu...
Hors ligne
A ma connaissance on n'a aucun moyen de savoir à quel moment l'écran est raffraichi... (je le rappelle, l'int 53 n'a rien à voir dans cette histoire)
Hors ligne
le moyen de le savoir serait de mettre la vitesse de rafraichissement au minimum (ou on voit le défilement) via les ports et de monitorer toutes les interruptions afin de savoir si certaines auraient un rapport avec le rafraichissement
bien entendu faudrait faire des tests de fréquences et mesurer à l'oeil la fréquence du balayage
Hors ligne
Le problème c'est qu'on n'est même pas sûrs qu'une interruption logique soit bien générée lorsque le contrôleur de l'écran envoie une interruption matérielle au processeur (faut pas oublier non plus que ce n'est pas le processeur qui fait passer les données de la mémoire vidéo vers l'écran)...
Hors ligne