Précédent   Forum des professionnels en informatique > Autres langages > Assembleur > x86 16-bits
x86 16-bits Architecture x86 16 bits et ses outils (assembleurs, debuggers, émulateurs...)
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
Vieux 27/11/2003, 10h11   #1 (permalink)
Futur Membre du Club
 
Date d'inscription: août 2002
Messages: 32
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
julson est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 27/11/2003, 11h08   #2 (permalink)
Rédacteur/Modérateur
 
Avatar de Juju_41
 
Date d'inscription: février 2003
Localisation: Paris, Montpellier et Vendôme
Âge: 25
Messages: 978
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
Juju_41 est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 27/11/2003, 11h37   #3 (permalink)
Futur Membre du Club
 
Date d'inscription: août 2002
Messages: 32
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
julson est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 28/11/2003, 00h10   #4 (permalink)
Rédacteur/Modérateur
 
Avatar de Juju_41
 
Date d'inscription: février 2003
Localisation: Paris, Montpellier et Vendôme
Âge: 25
Messages: 978
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 :
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 :
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
Juju_41 est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 08/12/2003, 14h05   #5 (permalink)
Membre régulier
 
Avatar de Elijha
 
Date d'inscription: avril 2003
Localisation: Taverny (95)
Âge: 40
Messages: 138
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 :
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 :
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 :
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...
__________________
Travailler dur n'a jamais tué personne, mais pourquoi prendre le risque (Edgar Bergen)
Elijha est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 08/12/2003, 14h56   #6 (permalink)
Membre émérite
 
Date d'inscription: juillet 2002
Messages: 815
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.
Blustuff est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 08/12/2003, 14h59   #7 (permalink)
Membre régulier
 
Avatar de Elijha
 
Date d'inscription: avril 2003
Localisation: Taverny (95)
Âge: 40
Messages: 138
Par défaut

Oups...désolé

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

Bye...
__________________
Travailler dur n'a jamais tué personne, mais pourquoi prendre le risque (Edgar Bergen)
Elijha est déconnecté   Envoyer un message privé Réponse avec citation
NEWS ASSEMBLEURFAQ ASSEMBLEURCOURS ASSEMBLEURLIVRES ASSEMBLEUR

Réponse Proposer ce sujet en actualité

Précédent   Forum des professionnels en informatique > Autres langages > Assembleur > x86 16-bits



Outils de la discussion

Règles de messages
Vous ne pouvez pas créer de nouvelles discussions
Vous ne pouvez pas envoyer des réponses
Vous ne pouvez pas envoyer des pièces jointes
Vous ne pouvez pas modifier vos messages

Les balises BB sont activées : oui
Les smileys sont activés : oui
La balise [IMG] est activée : oui
Le code HTML peut être employé : non
Trackbacks are non
Pingbacks are non
Refbacks are non



Fuseau horaire GMT +1. Il est actuellement 08h10.


Vos questions techniques : forum d'entraide Assembleur - Publiez vos articles, tutoriels et cours
et rejoignez-nous dans l'équipe de rédaction du club d'entraide des développeurs francophones
Nous contacter - Hébergement - Participez - Copyright © 2000-2010 www.developpez.com - Legal informations.