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

x86 16-bits Assembleur Discussion :

Clignotement d'un caractère en mode graphique


Sujet :

x86 16-bits Assembleur

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2002
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 32
    Points : 23
    Points
    23
    Par défaut Clignotement d'un caractère en mode graphique
    Bonjour,
    J'ai un pb : Il s'agit de faire clignoter un caractere : cela marche tres bien en mode texte mais en mode graphique (12h) ca passe pas.
    Alors si quelqu'un a une solution...
    Merci

  2. #2
    Membre expérimenté
    Avatar de Juju_41
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Février 2003
    Messages
    974
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Février 2003
    Messages : 974
    Points : 1 557
    Points
    1 557
    Par défaut
    Bonjour !

    Le problème est que le bit de clignotement du mode texte n'existe pas en mode vidéo
    Pour ce qui est de trouver une solution tout dépend de ce que tu veux faire exactement, personnellement si il n'y a pas 36 couleurs différentes à faire clignoter, je redirigerai l'interruption 1Ch et je ferai un changement de couleur d'une entrée de la palette.

    Pour ce qui est de l'interruption 1Ch (qui découle de l'interruption 08h, l'IRQ 0 : l'horloge système), ou des instructions de modification de palette, si tu n'es pas à l'aise avec, il doit bien y avoir des tutoriels quelque part sur ce site

    Si tu as toutefois qques problèmes n'hésites pas

    Juju

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2002
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 32
    Points : 23
    Points
    23
    Par défaut
    Je n'est qu une couleur a faire clignoter.
    Je suis interesser par ta solution(une sorte de carre),mais je ne la comprends pas tres bien si tu pouvais m'en dire d'avantage.
    Merci

  4. #4
    Membre expérimenté
    Avatar de Juju_41
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Février 2003
    Messages
    974
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Février 2003
    Messages : 974
    Points : 1 557
    Points
    1 557
    Par défaut
    Re-bonjour !

    Tout d'abord j'espère que c'est un programme destiné à tourner sous DOS ou un mode DOS compatible.

    Il faut choisir un index de couleur qui sera la "couleur clignotante". Prenons par exemple le bleu foncé (01h si mes souvenirs sont bons).
    Ensuite supposons que nous voulons faire clignoter en vert puis rouge puis vert etc ... Nous allons exécuter le code suivant :

    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
    mov ax,1010h ; fonction vidéo 1010h
    mob bx,0001h ; index de couleur 0001h
    mov ch,63 ; quantité de vert (il faut noter que les valeurs vont de 0 à 63)
    mov cl,0 ; quantité de bleu
    mov dh,0 ; quantité de rouge
    int 10h ; appel de l'interruption
     
    ; puis après un certain temps
     
    mov ax,1010h ; fonction vidéo 1010h
    mob bx,0001h ; index de couleur 0001h
    mov ch,0 ; quantité de vert (il faut noter que les valeurs vont de 0 à 63)
    mov cl,0 ; quantité de bleu
    mov dh,63 ; quantité de rouge
    int 10h ; appel de l'interruption
    Maintenant le but du jeu va être de répéter cette opération régulièrement, en tâche de fond, sans que la vitesse dépende du matériel (sans que la vitesse de clignotement soit plus ou moins rapide suivant le processur par exemple).
    Pour cela nous allons rediriger, au début de ton programme l'interruption 1Ch. Cette interruption sera appelée 18,2 fois par seconde.

    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
    21
    22
    23
    24
    25
    26
    27
    28
     
    compteur DW 0 ; compteur
     
    ; notre nouvelle interruption
    nouvelleint LABEL byte
    inc cs:[compteur] ; incrémente le compteur
    cmp cs:[compteur],19 ; est-ce que ça fait 1 seconde ?
    jb @rienfaire ; non alors on fait rien
    mov cs:[compteur],0 ; sinon on remet le compteur à 0
    ; ...
    ; mettre ici les 2 changements de palette
    ; avec un deuxième compteur
    ; si compteur2 = 0 alors couleur 1 de la palette en vert et compteur2 = 1
    ; si compteur2 = 1 alors couleur 1 de la palette en rouge et compteur2 = 0
    ; ...
    @rienfaire:
    iret ; retour d'interruption
     
    ; ...
     
    ; début du programme
    mov ax,251Ch ; fonction redirection d'interruption 1Ch
    mov dx,OFFSET nouvelleint ; spécifie l'adresse
    push ds
    mov dx,cs
    mov ds,dx
    int 21h ; appel de la fonction
    pop ds
    Ainsi chaque pixel, chaque caractère avec un attribut de couleur 01h (bleu foncé à l'origine) sera une couleur clignotante vert puis rouge avec 1 seconde de délai. Noter que l'on peut aussi avoir 1/2 seconde de vert puis 2 secondes de rouge en modifiant un peu le programme
    Il est possible que quelques fautes de frappes ou erreurs se soient glissées, si tu ne comprends pas quelque chose n'hésites pas

    Juju

  5. #5
    Membre éclairé
    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
    Points : 742
    Points
    742
    Par défaut
    Salut

    Je ne connais pas trop l'assembleur, par contre tu peu essayer (si mode console ms-dos) d'écrire directement en mémoire vidéo. La base de la mémoire vidéo est B800:0000h. Pour afficher un caractère, il faut écrire 2 octets : Le premier à "Base" correspond au caractère propre, puis le seconde à "Base+1" correspond au mode vidéo du caractère.
    L'attribut vidéo du caractère est codé comme suit [7][6 5 4][3 2 1 0], avec les bits 0 à 3 qui correspondent à la couleur du caractère (16 couleurs), les bits 4 à 6 qui correspondent à la couleur du fond (8 couleurs), et le bit 7 qui correspond au clignotement.
    Les coordonnées correspondent à 0,0 en haut à gauche de l'écran Base = 0xB800:0000.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    BASE = B800:0000
     
    Pour les coordonnées (x,y)
    Caractère = BASE + (160*y) + (2*x)
    Attribut  = BASE + (160*y) + (2*x) + 1
    Voici une fonction en C :
    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
    unsigned char far *BaseVideo = (unsigned char far*)0xB8000000 ;
     
    // Affiche une chaîne de caractères directement en mémoire vidéo
    // x, y   : Coordonées d'affichage de 0 à 79, et de 0 à 23
    // chaine : Chaine de caractères
    // attr   : Attribut de la chaine (exp : 1Eh Jaune sur fond bleu)
    void putsxy(unsigned char x, unsigned char y, const char *chaine, unsigned char attribut)
      { unsigned char i = 0 ;
      while(*chaine)
        {
        *(BaseVideo + (160*y) + (2*(x+i))) = *chaine ;
        *(BaseVideo + (160*y) + (2*(x+i)) + 1) = attribut ;
        chaine++ ;
        i++ ;
        }
      }
    Je pense qu'en assembleur cela doit être relativement simple de coder une procédure d'écriture de chaine en x, y avec un attribut vidéo.

    Ensuite, pour revenir à ton problème ! Il te suffit de mettre à 1 le bit 7 de l'attribut vidéo du caractère pour l'avoir clignotant. Plus besoin de passer par l'IT de l'horloge pour avoir un clignotement.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    putsxy(0, 0, "Bonjour", 0x9E) ;    // Affiche "Bonjour" en jaune clignotant sur fond bleu
    Remarque : Ne fonctionne qu'en console ms-dos pleine écran. Lorsque la console dos est émulée graphiquement, le clignotement n'est pas géré.

    Bye...

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    842
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 842
    Points : 696
    Points
    696
    Par défaut
    Mode graphique et non texte demandé. Attention le mode 12h n'a pas ces accès en mémoire aussi simple que dans les autres modes.

  7. #7
    Membre éclairé
    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
    Points : 742
    Points
    742
    Par défaut
    Oups...désolé

    Effectivement, en mode 12h, ce n'est plus le même problème. Encore désolé.

    Bye...

Discussions similaires

  1. [TP] Texte clignotant en mode graphique
    Par diden138 dans le forum Turbo Pascal
    Réponses: 2
    Dernier message: 21/05/2006, 13h07
  2. [TP]Problème de modes graphiques sous Windows XP
    Par Gabi dans le forum Turbo Pascal
    Réponses: 11
    Dernier message: 04/04/2004, 17h25
  3. [TP][Mode Graphique]SetActivePage
    Par Giovanny Temgoua dans le forum Turbo Pascal
    Réponses: 7
    Dernier message: 17/01/2004, 18h39
  4. Réponses: 7
    Dernier message: 17/01/2004, 17h13
  5. [TP]Pb Mode Graphique
    Par John_win dans le forum Turbo Pascal
    Réponses: 5
    Dernier message: 29/11/2003, 22h05

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