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
Candidat au titre de Membre du Club
 
Inscription : août 2002
Messages : 32
Détails du profil
Informations forums :
Inscription : août 2002
Messages : 32
Points : 13
Points : 13
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 00
Vieux 27/11/2003, 11h08   #2
Membre Expert
 
Avatar de Juju_41
 
Inscription : février 2003
Messages : 973
Détails du profil
Informations personnelles :
Âge : 27

Informations forums :
Inscription : février 2003
Messages : 973
Points : 1 058
Points : 1 058
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 00
Vieux 27/11/2003, 11h37   #3
Candidat au titre de Membre du Club
 
Inscription : août 2002
Messages : 32
Détails du profil
Informations forums :
Inscription : août 2002
Messages : 32
Points : 13
Points : 13
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 00
Vieux 28/11/2003, 00h10   #4
Membre Expert
 
Avatar de Juju_41
 
Inscription : février 2003
Messages : 973
Détails du profil
Informations personnelles :
Âge : 27

Informations forums :
Inscription : février 2003
Messages : 973
Points : 1 058
Points : 1 058
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 :
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 :
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
Juju_41 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/12/2003, 14h05   #5
Membre éprouvé
 
Avatar de Elijha
 
Homme Laurent Nahoum
Ingénieur développement matériel électronique
Inscription : avril 2003
Messages : 249
Détails du profil
Informations personnelles :
Nom : Homme Laurent Nahoum
Âge : 42
Localisation : France, Val d'Oise (Île de France)

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

Informations forums :
Inscription : avril 2003
Messages : 249
Points : 462
Points : 462
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 :
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 :
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 :
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...
__________________
- Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !
- 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 00
Vieux 08/12/2003, 14h56   #6
Membre chevronné
 
Inscription : juillet 2002
Messages : 842
Détails du profil
Informations forums :
Inscription : juillet 2002
Messages : 842
Points : 647
Points : 647
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 00
Vieux 08/12/2003, 14h59   #7
Membre éprouvé
 
Avatar de Elijha
 
Homme Laurent Nahoum
Ingénieur développement matériel électronique
Inscription : avril 2003
Messages : 249
Détails du profil
Informations personnelles :
Nom : Homme Laurent Nahoum
Âge : 42
Localisation : France, Val d'Oise (Île de France)

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

Informations forums :
Inscription : avril 2003
Messages : 249
Points : 462
Points : 462
Oups...désolé

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

Bye...
__________________
- Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !
- 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 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +1. Il est actuellement 12h50.


 
 
 
 
Partenaires

Hébergement Web