IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Acces memoire video


Sujet :

C

  1. #1
    Membre très actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 277
    Par défaut Acces memoire video
    Bonjour,

    Je suis sous DOS, et j'essai d'effacer l'ecran en mode texte, je fais:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    main()
    {
       unsigned char *vidmem = (unsigned char *)0xB8000;
       const long size = 80*25;
       long loop;
       for (loop=0; loop<size; loop++) 
       {
          *vidmem++ = 0;
          *vidmem++ = 0xF;
       }
       printf ( "toto\n" );
       return(0);
    }
    Je compile avec turbo C, mais que ce sois sous DOS ou sous emulation de DOS sous Windows, il m'affiche bien toto mais ne m'efface pas l'écran.

    D'ou peut venir le probleme ?

    Cordialement.

  2. #2
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Lovmy
    Je suis sous DOS, et j'essai d'effacer l'ecran en mode texte, je fais:
    Je compile avec turbo C, mais que ce sois sous DOS ou sous emulation de DOS sous Windows, il m'affiche bien toto mais ne m'efface pas l'écran.
    Tu es bien en modèle de mémoire large ?

    Ceci fonctionne (émulation 16-bit sous Windows XP SP2)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    #include <stdio.h>
    #include <dos.h>
     
    int main (void)
    {
       unsigned char *vidmem = MK_FP (0xB800, 0);
       const long size = 80 * 25;
       long loop;
       for (loop = 0; loop < size; loop++)
       {
          *vidmem = 0x20;
          vidmem++;
          *vidmem = 0x0F;
          vidmem++;
       }
       printf ("toto\n");
       return (0);
    }

  3. #3
    Membre très actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 277
    Par défaut Ca marche pas chez moi
    Bonjour,

    J'ai ajouté une ligne dans le code pour savoir l'adresse reelle de la memoire video:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    #include <stdio.h>
    #include <dos.h>
     
    main()
    {
       unsigned char *vidmem = MK_FP( 0xB800, 0 );
       const long size = 80 * 25;
       long loop;
       printf( "vidmem = %08X\n", &vidmem );
       for (loop = 0; loop < size; loop++)
       {
          *vidmem = 0x20;
          vidmem++;
          *vidmem = 0x0F;
          vidmem++;
       }
       printf ( "toto\n" );
       return(0);
    }
    et j'ai comme resultat:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    F:\TC\BIN>test
    vidmem = 00000FFC
    toto
    Ce qui me semble bizarre c'est que l'adresse complete de vidmem est FFCh et non B8000. Je compile avec Turbo C en modele de memoire large.

    Je n'ai pas l'ecran qui s'efface, mais le toto apparait bien.

    Cordialement.

  4. #4
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Lovmy
    Bonjour,

    J'ai ajouté une ligne dans le code pour savoir l'adresse reelle de la memoire video:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #include <stdio.h>
    #include <dos.h>
     
    main()
    {
       unsigned char *vidmem = MK_FP( 0xB800, 0 );
       printf( "vidmem = %08X\n", &vidmem );
    Tu fais n'importe quoi... Si tu ne connais pas le C ni la programmation 16-bit, ce que tu veux faire n'est pas de ton niveau, désolé.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
       printf( "vidmem = %p\n", (void *) vidmem );

  5. #5
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Par défaut Re:
    Ca m'étonne que ca marche pas, j'ai pas testé mais ca devrait marcher à mon avis. Peut être que ta carte vidéo n'est pas VGA compatible (t'es sur un 80186?), essaye avec comme adresse de segment B000 au lieu de B800. Sinon décalre le pointeur unsingned char far * pour s'assurer que ca marchera que ce soit en modèle de mémoire small ou large. Et enfin si tu veux juste éffacer l'écran, tu peux aussi te tourner vers la fonction 6 de l'interruption 10h avec : nombre de lignes à déplacer = 0.

  6. #6
    Membre émérite
    Avatar de Elijha
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Avril 2003
    Messages
    314
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Avril 2003
    Messages : 314
    Par défaut
    Salut,

    De mémoire, avec turboC, je crois qu'il faut déclarer le pointeur de type char far.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    #include <stdio.h>
    #include <dos.h>
     
    int main(void)
    {
      char texte[] = "Bonjour" ;
      char *pTexte = NULL ;
      char far *pEcran = NULL ;
     
      pEcran = MK_FP(0xB800,0) ;
     
      for(pTexte=texte; *pTexte; pTexte++)
      {
        *pEcran = *pTexte ;   // Caractère
        pEcran++ ;
        *pEcran = 0x07 ;      // Blink(1 bit) | Fond(3 bits) | Couleur (4 bits)
        pEcran++ ;
      }
      return 0 ;
    }
    Attention, j'ai pas testé.

    Sinon pour effacer ton écran, c'est pas 0 qu'il faut écrire mais 0x20 qui correspond au caractère espace.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    *vidmem++ = 0x20 ;  // ou ' '
    Edit : Dsl, je n'avais pas vu que Emmanuel avait donné la réponse.

  7. #7
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Elijha
    De mémoire, avec turboC, je crois qu'il faut déclarer le pointeur de type char far.
    Inutile en modèle de mémoire large...

  8. #8
    Membre très actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 277
    Par défaut C'est bon
    Bonjour,

    En fait c'est bon, j'ai regardé avec Turbo Debuger, il utilise ES:BX pour pointer sur l'adresse memoire video, et en mettant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    unsigned char *vidmem = (unsigned char *)0xB8000;
    Il me prenait ES=000Bh et BX=8000, ce qui ne correspond pas a l'adresse de la memoire video en mode text qui est B800:0000, donc j'ai remplacé par:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    unsigned char *vidmem = (unsigned char *)0xB8000000;
    Et la ca marche, il commence bien en ES:BX = B800:0000 et incremente BX pour remplir tout l'ecran. Effectivement tu as raison Elijha c'est bien des espace qu'il faut utiliser (20h) et non des caractere null (0), dans le dernier cas on ne voit pas de changement.

    Melem, mon but au final et de faire fonctionner ce bout de code apres un boot fait maison en assembleur en mode protégé donc je n'utilise pas d'interruption du bios.

    Merci de vos reponses.

  9. #9
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Lovmy
    En fait c'est bon, j'ai regardé avec Turbo Debuger, il utilise ES:BX pour pointer sur l'adresse memoire video, et en mettant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    unsigned char *vidmem = (unsigned char *)0xB8000;
    Il me prenait ES=000Bh et BX=8000, ce qui ne correspond pas a l'adresse de la memoire video en mode text qui est B800:0000, donc j'ai remplacé par:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    unsigned char *vidmem = (unsigned char *)0xB8000000;
    Et la ca marche,<...>
    Comme je l'avais indiqué, MK_FP() fait ça tout seul...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Acces a la memoire video en ecriture
    Par Overcrash dans le forum Débuter
    Réponses: 13
    Dernier message: 28/09/2008, 22h50
  2. acces a la memoire video
    Par duplo dans le forum Windows
    Réponses: 4
    Dernier message: 09/08/2007, 20h08
  3. Acces memoire d'un processus
    Par geekrider dans le forum Langage
    Réponses: 7
    Dernier message: 23/07/2007, 10h51
  4. calculer la memoire video disponible et le fps
    Par gaut dans le forum DirectX
    Réponses: 1
    Dernier message: 28/09/2006, 03h00
  5. récupération de la taille de la memoire video!!
    Par fatmamed dans le forum C++
    Réponses: 1
    Dernier message: 21/01/2006, 09h50

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo