[C] écrire dans la mémoire video...

écrire dans la mémoire video... [C] - Programmation

Marsh Posté le 01-04-2001 à 23:12:57    

Voila je doit faire une méthode qui doit écrire directement dans la mêmoire video...
 
Je me doute que je doit utiliser l'intrruption 10h, fonction 09h
 
mais quel registre je doit modifier, et si quel registre joue quel rôle ?
 
Un simple exemple me suffirait !
 
 
merci :)

Reply

Marsh Posté le 01-04-2001 à 23:12:57   

Reply

Marsh Posté le 02-04-2001 à 02:19:05    

C'est bien via int 10h que tu dois prendre pour écrire directement dans la mémoire vidéo. Pour le DOS, ces exemples suivants fonctionnement bien.
 
1er exemple : afficher un simple caractère  
 
void AfficherCar(char Car, int Coul)
{
 union REGS rin, rout;
 rin.h.ah = 9;            /* No du service */
 rin.h.al = Car;          /* CaractŠre … afficher */
 rin.h.bh = 0;            /* No de page */
 rin.h.bl = Coul;         /* Couleur */
 rin.x.cx = 1;            /* Nb d'exemplaires */
 int86(0x10,&rin, &rout); /* Interruption logicielle */
}
 
2e exemple : effacer l'écran en noir ou de n'importe quelle couleur.
 
void EffacerEcran(Byte Coul)
{
 int i;
 Byte far *ptrVideo = (Byte far *) 0xB8000000;
 for (i = 0; i < 2000; i++)
   {
    *ptrVideo++ = '█';    //caractère à afficher
    *ptrVideo++ = Coul;
   }
}
 
On met dans le début du programme les DEFINEs suivants qui serviront de paramètre pour la variable Coul utilisée comme simple paramètre.
 
#define NOIR 0x00
#define BLEU 0x01
#define VERT 0x02
#define CYAN 0x03
#define ROUGE 0x04
#define JAUNE 0x0E
#define BLANC 0x0F
 
 
3e exemple: Écriture d'une chaîne de caractères à l'écran. *ch représente le texte ou la variable contenant le texte.
 
void EcrireChaine(Byte *ch, int Lig, int Col, Byte Couleur)
{
 Byte far *ptrVideo = (Byte far *) 0xB8000000;
 Byte far *ptr = ptrVideo + 160 * (Lig-1) + 2 * (Col-1);
 for( ; *ch; ch++)
   {
    *ptr++ = *ch;
    *ptr++ = Couleur;
   }
}
 
Un appel à cette procédure pourrait être comme suit:
 
EcrireChaine("Menu Option 1",10,30, BLANC);
 
Ce sont des exemples bien basiques... mais il existe un programme qui s'appelle Helppc pour se documenter sur les interruptions, les registres.

 

[edit]--Message édité par AlphaT--[/edit]

Reply

Marsh Posté le 02-04-2001 à 03:00:38    

wow, merci pour ta réponse très détaillé et très clair !
 
J'aurais pas pu demander mieux !
 
 
merci!

Reply

Marsh Posté le 02-04-2001 à 03:10:52    

:jap:
 
ça évites pas mal de recherches parce que ce n'est pas un truc qu'on rencontre souvent aujourd'hui parce qu'on a des compilateurs de 3e et 4e génération utilisés dans des environnement de développement intégrés.

 

[edit]--Message édité par AlphaT--[/edit]

Reply

Marsh Posté le 03-04-2001 à 01:28:13    

Ben sinon, il faut la BiblePC (ça existe encore, ce truc, d'ailleurs ? Moi je l'ai achetée il y a plus de 10 ans...)

Reply

Marsh Posté le 03-04-2001 à 02:15:00    

Ca doit se trouver d'occase.
C'est vrai que c'etait un bon bouquin.
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 03-04-2001 à 03:32:18    

ben j'ai un help de la bible du PC pour les interuptions...
 
uhh mais j'ai essayer le effacerEcran et sa marche pas du tout... (passe même pas la compilation)...
 
 
pourquoi?... :(

Reply

Marsh Posté le 03-04-2001 à 03:48:34    

Essayes de degotter le Graphics Programming Black Book de Michael Abrash, tu devrais y trouver les infos necessaires.
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 03-04-2001 à 15:16:10    

BelzME a écrit a écrit :

ben j'ai un help de la bible du PC pour les interuptions...
 
uhh mais j'ai essayer le effacerEcran et sa marche pas du tout... (passe même pas la compilation)...
 
 
pourquoi?... :(




 
Ca marche nickel dans mon cas.
C'est quoi les messages d'erreur du compilateur?
 
Aussi dans ce module je précise que le caractère à afficher n'était pas le bon... la ligne en cause devient :
 
 *ptrVideo++ = '█';

 

[edit]--Message édité par AlphaT--[/edit]

Reply

Marsh Posté le 03-04-2001 à 15:25:51    

Le bouquin d'Abrash était disponible officiellement en download:
http://www.ddj.com/articles/2001/0165/0165f/0165f.htm
 
Mais le serveur n'a pas de tenu la charge.
N'empêche qu'on doit pouvoir le trouver maintenant sur des serveurs officieux.

 

[edit]--Message édité par Verdoux--[/edit]

Reply

Marsh Posté le 03-04-2001 à 15:25:51   

Reply

Marsh Posté le 03-04-2001 à 16:34:52    

hehe ok je vais aller voir :)
 
uh erreur de compilation :
 
ben le Byte il c'est même pas que sa existe...
j'ai essayer avec int , long etc sa veut pas passer (j'ai aussi de reduire a b8000 juste pour tester...)
 
ook vais regarder pour le bouquin sauf que je doit remettre sa pour demain :p

Reply

Marsh Posté le 03-04-2001 à 21:37:48    

Oupppss...
 
Ajoute ça au début (avec les définitions des procédures) de ton code et ton compilateur va aimer!
 
/* **** Types **** */
typedef unsigned char Byte;    /* Inventer le type Byte */

 

[edit]--Message édité par AlphaT--[/edit]

Reply

Marsh Posté le 03-04-2001 à 21:40:55    

Voici un autre truc que j'avais dans le mien :
 
void CacherCurseur(void)
{
   /* Pour faire disparaitre le curseur, il faut fournir  */
   /* des valeurs de ligne debut et fin superieures aux   */
   /* valeurs normales                                    */
 union REGS rin, rout;
 rin.h.ch = 255;           /* Ligne début */
 rin.h.cl = 255;           /* Ligne fin */
 rin.h.ah = 1;             /* No du service désiré */
 int86(0x10, &rin, &rout);
}

Reply

Marsh Posté le 06-04-2001 à 15:04:58    

Le bouquin d'Abrash a été remis en ligne.
http://www.ddj.com/articles/2001/0165/0165f/0165f.htm

Reply

Sujets relatifs:

Leave a Replay

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