erreur dans un programme graphique

erreur dans un programme graphique - C - Programmation

Marsh Posté le 06-11-2006 à 19:10:41    

salut
 
voila mon code (mon premier vrais programme graphique depuis que j'ai découvert TurboC ilya quelques jours), c'ets un effet plasma sous VGA, comme en qbasic
Code : C
Code:
 

Code :
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <dos.h>
  4. #include <io.h>
  5. static char Palette[4*3] = {0,0,0,0,0,63,0,63,0,63,0,0};
  6. union REGS regset;
  7. struct SREGS sregs;
  8. void load13h()
  9. {
  10. regset.x.ax = 0x0013;
  11. int86(0x10, &regset, &regset);
  12. }
  13. void exit13h()
  14. {
  15. getch();
  16. regset.x.ax = 0x0003;
  17. int86(0x10, &regset, &regset);
  18. }
  19. void drawpx(int x, int y, int coul)
  20. {
  21. int ptr = (320*y+x);
  22. pokeb(0xA000,ptr,coul);
  23. }
  24. int getpx(int x, int y)
  25. {
  26. int ptr = (320*y+x);
  27. return peekb(0xA000,ptr);
  28. }
  29. void pal( unsigned char i, unsigned char r, unsigned char v, unsigned char b)
  30. {
  31. outp(0x3c8, i);
  32. outp(0x3c9, r);
  33. outp(0x3c9, v);
  34. outp(0x3c9, b);
  35. }
  36. int main()
  37. {
  38. int color;
  39. int CA,CB,CC,CD,CE,CF,CG,CH,CI;
  40. long ptr;
  41. load13h();
  42. for(ptr=0; ptr<=64000;ptr++)
  43. {
  44.  color=rand()%255;
  45.  pokeb(0xA000,ptr,color);
  46. }
  47. for(ptr=321; ptr<=63677;ptr++)
  48. {
  49.  CA=peekb(0xA000,ptr+321);
  50.  CB=peekb(0xA000,ptr+320);
  51.  CC=peekb(0xA000,ptr-321);
  52.  CD=peekb(0xA000,ptr-320);
  53.  CE=peekb(0xA000,ptr+319);
  54.  CF=peekb(0xA000,ptr-319);
  55.  CG=peekb(0xA000,ptr+1);
  56.  CH=peekb(0xA000,ptr-1);
  57.  CI=peekb(0xA000,ptr);
  58.  color = (CA+CB+CC+CD+CE+CF+CG+CH+CI)/9;
  59.  pokeb(0xA000,ptr,color);
  60. }
  61. exit13h();
  62. }


 
mais voila, il me plante windows avec une opération non conforme.
 
voyez vous une erreur ?
 
 
[EDIT] voila, ce programme fonctionne maintenant, la source a étée modifiée.[/edit]
merci, ++ Tix.
__________________


Message édité par transisterix le 09-11-2006 à 08:43:53
Reply

Marsh Posté le 06-11-2006 à 19:10:41   

Reply

Marsh Posté le 06-11-2006 à 22:15:25    

On est en 2006 cammarade ;)

Reply

Marsh Posté le 06-11-2006 à 22:33:23    

certe, et en 2006, mon 386 tourne toujours, et 386 != windows != sdl/glu ... donc VGA inside seulement ;)
 
si vous avez des idées quant a mon probleme , je serai ravis, je le serai aussi en cosant air du temps mais bon ,ca aidera pas mon darxhigher d'amuuuuuur ^3^
 
enfin voila, ++ Tix.

Reply

Marsh Posté le 06-11-2006 à 22:49:26    

Le mode 13h fonctionne en 8 bit non? Dans drawpx, la couleur est un int, du coup ça ne se comporte pas comme il faut, et à la fin de la mémoire vidéo, crash, il écrit ailleurs.
Enfin, je crois :)
 
Edit: je viens de relire, et en fait tu l'appelles nul part :/
Ceci dit c'est peut-être lié; plutôt que peek et poke, tu devrais utiliser peekb et pokeb. Ou alors, modifier ton code de façon à écrire 2 pixels à la fois (mais je sais pas si c'est trop possible avec cet effet).


Message édité par IrmatDen le 06-11-2006 à 23:32:33

---------------
.
Reply

Marsh Posté le 07-11-2006 à 03:49:10    

tout est sous quoi comme Windows ?
pourquoi ne pas rester sous DOS ? (c'est bien un binaire DOS que tu fais au moins ? :D)
 
j'ai jamais aimé les peek/poke (ça sert à rien avec un langage comme le C, c'était bon pour le basic ça)
 
par contre si tu veux aller vite, il vaux mieux actualiser le plasma dans un buffer en mémoire système et copier ce buffer vers la ram vidéo ensuite. (rester en cache tout ça, adressage non continu rendement PCI/AGP merdique tout ça)

Reply

Marsh Posté le 07-11-2006 à 18:43:11    

oui, c'est pour un PC sous dos, un 386 exactement :) j'essay peekb t pokeb, mais quelle est la différence avec peek et poke ?
 
merci, ++ Tix. ;)

Reply

Marsh Posté le 07-11-2006 à 19:43:53    

Le b à la fin laisse à penser qu'il agit en byte ;)
 
Par contre, si tu veux travailler ton effet suis les conseils de bjone (et d'harko s'il passe par là) ;)

Reply

Marsh Posté le 07-11-2006 à 20:05:27    

haha, j'azi pensé a l'histoire du buffer, mais je m'y suis pas encor attelé, je prévois une fonction qui affiche le contenu de 5 buffers avec leurs mask 1/0 , si quelq'un a une idée pour la transparence partielle ...
 
je teste, ++ Tix.

Reply

Marsh Posté le 07-11-2006 à 23:04:12    

transisterix a écrit :

oui, c'est pour un PC sous dos, un 386 exactement :) j'essay peekb t pokeb, mais quelle est la différence avec peek et poke ?
 
merci, ++ Tix. ;)


 
on est en C, en C y'a pas besoin de peek et poke pour écrire un octet laisse ça au basic.

Reply

Marsh Posté le 07-11-2006 à 23:05:18    

sous quel Windows est-tu ?

Reply

Marsh Posté le 07-11-2006 à 23:05:18   

Reply

Marsh Posté le 08-11-2006 à 00:07:03    

bjone a écrit :

sous quel Windows est-tu ?


Citation :

oui, c'est pour un PC sous dos, un 386 exactement



---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 08-11-2006 à 00:14:01    

Citation :


mais voila, il me plante windows avec une opération non conforme


 
 [:spamafote]

Message cité 1 fois
Message édité par bjone le 08-11-2006 à 00:14:10
Reply

Marsh Posté le 08-11-2006 à 00:34:14    

bjone a écrit :

Citation :


mais voila, il me plante windows avec une opération non conforme


 
 [:spamafote]


C'est vrai que ce n'est pas clair. Je suppose qu'il essaye de développer son bazar sur un PC Windows récent, genre XP et évidemment, ça banane dur...
 
L'objectif étant de le faire tourner sur son 386/DOS, probablement pour un musée de l'informatique...


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 08-11-2006 à 00:43:27    

bjone a écrit :

tout est sous quoi comme Windows ?
pourquoi ne pas rester sous DOS ? (c'est bien un binaire DOS que tu fais au moins ? :D)
 
j'ai jamais aimé les peek/poke (ça sert à rien avec un langage comme le C, c'était bon pour le basic ça)
 
par contre si tu veux aller vite, il vaux mieux actualiser le plasma dans un buffer en mémoire système et copier ce buffer vers la ram vidéo ensuite. (rester en cache tout ça, adressage non continu rendement PCI/AGP merdique tout ça)


 
vu le code qu'il nous balance et l'age de sa becanne je dirais Windows 95/98 ....  
je le vois mal compiler sous win puis rebooter sous dos a chaque fois, et ce genre de fantaisies sous XP => :S

Reply

Marsh Posté le 09-11-2006 à 08:42:20    

rhoo;lala, excusez moi
 
j edévellope sur un PC 233Mhz, windows 98, un programme destiné a un 386. voila pour l'environnement
 
mon programme tourne désormais, il suffisait de remplacer poke et peek par pokeb et peekb ^^ mais j ene comprend pas la différence entre les deux.
 
ensuite, je vois mal comment faire mon truc sans poke et peek, je sui snovice en C :)
 
voila, merci a vous, ++ Tix. ;)

Reply

Marsh Posté le 09-11-2006 à 09:19:02    

transisterix a écrit :

mon programme tourne désormais, il suffisait de remplacer poke et peek par pokeb et peekb ^^ mais j ene comprend pas la différence entre les deux.


C'est dans la doc de Turbo C (F1):  
 
poke()/peek() : accès en mémoire 16-bit sur x86 mode réel
pokeb()/peekb() : accès en mémoire 8-bit sur x86 mode réel


Message édité par Emmanuel Delahaye le 09-11-2006 à 09:21:28

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 09-11-2006 à 12:25:01    

transisterix a écrit :

ensuite, je vois mal comment faire mon truc sans poke et peek, je sui snovice en C :)


ASM roulaize ;)
Des tutoriaux sur le sujet, il y en a des tas; google sur mode 13h. Comme celui-ci par exemple.
Ceci dit, si tu ne comprends pas encore la différence entre un int et un byte, continue d'apprendre le C, et les pointeurs avant de t'attaquer à ça (ça = prog graphique, surtout en asm)...

Reply

Marsh Posté le 09-11-2006 à 18:23:23    

transisterix a écrit :

rhoo;lala, excusez moi
 
j edévellope sur un PC 233Mhz, windows 98, un programme destiné a un 386. voila pour l'environnement
 
mon programme tourne désormais, il suffisait de remplacer poke et peek par pokeb et peekb ^^ mais j ene comprend pas la différence entre les deux.
 
ensuite, je vois mal comment faire mon truc sans poke et peek, je sui snovice en C :)
 
voila, merci a vous, ++ Tix. ;)


 
unsigned char far *ptr=0xA0000000;
 
/* ptr[y*360+x]=.... */
 
unsigned char far *wptr=ptr;
unsigned char far *rptr=ptr;
 
for( int i=0 ; i < 200 ; ++i )
{
    for( int x=1 ; x < 319 ; ++x )
    {
       unsigned int sum=rptr[x-1];
       sum+=rptr[x+1];
       wptr[x]=sum>>1;  
    }          
 
    rptr+=320;
    wptr+=320;
}
 
par exemple je dirais (si je ne m'abuse).
 

Reply

Marsh Posté le 09-11-2006 à 18:26:06    

et prends pas TurboC, prends OpenWatcom ou DJGPP si tu veux un vrai compilateur DOS.

Reply

Marsh Posté le 09-11-2006 à 19:39:59    

@bjone, je n'ai jamais testé en C; il n'y a pas de différence de perf entre une routine C et une asm pour faire ça?

Reply

Marsh Posté le 09-11-2006 à 19:45:21    

ça dépends du compilo, mais dans l'absolu en asm tu produira la boucle la plus imbriquée la plus efficace. (mais bon il faut bien connaitre les règles d'optimisations vis à vis des cpu cibles, moi je me suis arrêté au Pentium 1).
 
de toutes manières, avant l'asm, l'aspect algo et cache-friendly est de loin le plus important.

Reply

Marsh Posté le 09-11-2006 à 19:52:02    

ha oui et en VGA, les composantes RVB de la palette ne sont pas sur 8 bits.

Reply

Marsh Posté le 09-11-2006 à 22:17:37    

bjone a écrit :

et prends pas TurboC, prends OpenWatcom ou DJGPP si tu veux un vrai compilateur DOS.


c bizarre comme borland n'a jamais eu la cote, c la mm chose avec Delphi, pourtant je trouve leurs produit tres bien   :o

Reply

Marsh Posté le 09-11-2006 à 22:25:39    

salut
 
merci pour vos réponses, je vais cependant m'en tenir a ca pour l'instant.
 
cependant, voila un nouveau dileme :)
 
est il possible de stoquer une pseudo image de l'écran pour la restituer ? si oui, comment faire cela ?
 
merci, ++ Tix.

Reply

Marsh Posté le 10-11-2006 à 02:58:52    

Merci bjone :jap:
J'ai jamais testé sur autre chose qu'un P2, et c'était  que des tests destinés à tourner sur ma machine pour apprendre un peu tout ça. Donc j'étais loin de l'optimisation dont tu parles :D
 

transisterix a écrit :

est il possible de stoquer une pseudo image de l'écran pour la restituer ? si oui, comment faire cela ?


C'est un double buffer. Il faut que tu alloues une zone mémoire de la taille de ton écran et que tu "dessines", c-a-d, la modifie, au lieu de la mémoire VGA que tu utilises actuellement. Après, il ne reste plus quà copier le bloc de ton double buffer vers la mémoire VGA, avec memcpy.


Message édité par IrmatDen le 10-11-2006 à 02:59:30

---------------
.
Reply

Marsh Posté le 10-11-2006 à 03:23:27    

red faction a écrit :

c bizarre comme borland n'a jamais eu la cote, c la mm chose avec Delphi, pourtant je trouve leurs produit tres bien   :o


 
TurboC date de 1989 ou un truc du genre et fait que du mode réel :D
 
c'était bien TurboC, moi j'ai commençé a faire le con avec au tout début, mais pour du dev DOS, Watcom & DJGPP restent les maitres incontestés pour l'éternité (vu que y'aura plus jamais de nouveau compilo de quelque chose pour le DOS).
 
sinon perso j'avais adoré C++ Builder.

Message cité 1 fois
Message édité par bjone le 10-11-2006 à 03:24:52
Reply

Marsh Posté le 10-11-2006 à 15:36:19    

bjone a écrit :

TurboC date de 1989 ou un truc du genre et fait que du mode réel :D


C'est exactement de que fait le P.O. avec ses int 13h


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 10-11-2006 à 16:01:48    

pas compris.
 
mais Watcom et DJGPP, d'une part optimisent le code plus que correctement, et permettent du faire du mode protégé avec un dos-extender fourni.

Reply

Marsh Posté le 10-11-2006 à 17:01:02    

bjone a écrit :

pas compris.
 
mais Watcom et DJGPP, d'une part optimisent le code plus que correctement, et permettent du faire du mode protégé avec un dos-extender fourni.


INT 13h, c'est du mode réel 16-bit (AX, et non EAX, pas de GDT etc.). Je ne vois pas ce qu'un compilateur pour DOS en mode protégé va apporter..
 


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 10-11-2006 à 17:56:35    

bin le dos-extender wrappe de manière transparente les interruptions du dos et bios (tant qu'il y a pas d'adresse segment: offset en paramètre/retour), permet un adressage linéaire jusqu'à 64Mo (il te libère de la construction segment: offset, les pointeurs far...), et permet d'utiliser un cpu moderne a pleine efficacité en 32bits.  
 
ndlr puisque que par exemple un pentium 1 ne peux pairer que des instructions 16bits en mode réel, et que des instructions 32bits en mode protégé (dû à l'octet de préfixe), et que sur tous les cpus modernes c'est pareil ou pire (un P2 est encore plus boeuf si tu fais du 32bits en mode réel ou du 16 en pm).
 
même si il compte cibler du 386, c'est toujours ça de pris.


Message édité par bjone le 10-11-2006 à 18:04:24
Reply

Marsh Posté le 10-11-2006 à 20:04:08    

:) ... j'ai pas tout compris  
 
bon bha j evais déja bosser un peu ma technique, pi on verra apres.
 
merci tous, ++ Tix.

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed