Turbo C [oldies inside] Mode graphique...

Turbo C [oldies inside] Mode graphique... - C - Programmation

Marsh Posté le 11-03-2005 à 11:10:47    

Bonjour !!
 
J'ai installé Turbo C 1.1 sur un vieux 386 portable monochrome, et je cherche a afficher un mode graphique 640x480 monochrome (portable vga tt de meme).
 
J'ai le code pour un mode 13h (320x200, 256 couleurs), mais je le trouve pas tres fin et inutile puisque le portable est monochrome...
 

Code :
  1. #include <dos.h>
  2. #define LARGEUR             320
  3. typedef unsigned char  byte;
  4. typedef unsigned short word;
  5. byte *VGA=(byte *)0xA0000000L;
  6. void set_mode(byte mode)
  7. {
  8.   union REGS regs;
  9.   regs.h.ah = 0x00;
  10.   regs.h.al = mode;
  11.   int86(0x10, &regs, &regs);
  12. }
  13. void pixel(int x,int y,byte color)
  14. {
  15.   VGA[y*LARGEUR+x]=color;
  16. }
  17. void main()
  18. {
  19.   int x,y,color;
  20.   set_mode(0x13);
  21.     pixel(100,100,15);
  22.   return;
  23. }


 
J'ai donc ce code qui s'initialise en mode 13h affiche un pixel en 100x100 et en blanc.
Lorsque je passe en mode 12h (celui qui m'interesse: 640x480 mono), ca marche plus. Aucun pixel ne s'allume.
J'ai biensur changer la LARGEUR dans le define...
 
Quelles modif. je devrais faire pour que cela marche en mode 12h ?
De plus en mode 13h les couleurs sont facile a nommer, mais en monochrome, donc 1 bit par pixel, quelles valeur pour quelles "couleurs" ? (0=noir, 1=blanc ? (c just pour etre sur)).
 
Merci beaucoup d'avance !!!


---------------
http://reopen911.online.fr/?page_id=45
Reply

Marsh Posté le 11-03-2005 à 11:10:47   

Reply

Marsh Posté le 11-03-2005 à 13:00:21    

Bonjour
Je ne me rapelle plus très bien comment marche tout ça mais il ne faut pas oublier qu'en monochrome un point est codé sur 1 bit et non 1 octet donc quand on affecte une valeur à un point il faut faire un savant calcul d'adressage.
adr = y * 80 + (x >> 3); calcul l'octet du pixel
a = x & 7; calcul la position du bit dans l'octet
val = 1 << a; positionne le bit au bon endroit
if (v)
  *adr |= val; allume le point
else
  *adr &= val ^ 0xff; éteint le point
adr est le déplacement dans le segment vidéo 0xa000
v est 0 pour éteint autre valeur pour alumé
x et y la position du point en commençant par 0
le tout est à mettre en forme.
Tout ça est infiniment plus simple en assembleur.
Cordialement

Reply

Marsh Posté le 11-03-2005 à 13:11:12    

oki merci bcp db_ !!!


---------------
http://reopen911.online.fr/?page_id=45
Reply

Sujets relatifs:

Leave a Replay

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