![]() |
| Le forum de référence en programmation et développement. Articles, cours et tutoriels du débutant au chef de projet et DBA confirmé. | |||||||
|
|||||||
| x86 16-bits Architecture x86 16 bits et ses outils (assembleurs, debuggers, émulateurs...) |
![]() |
|
|
Outils de la discussion |
|
|
#1 (permalink) |
|
Futur Membre du Club
![]() Date d'inscription: août 2002
Messages: 32
|
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 (permalink) |
![]() Date d'inscription: février 2003
Localisation: Paris, Montpellier et Vendôme
Âge: 24
Messages: 978
|
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 |
|
|
|
|
|
#4 (permalink) |
![]() Date d'inscription: février 2003
Localisation: Paris, Montpellier et Vendôme
Âge: 24
Messages: 978
|
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 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 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 (permalink) |
|
Membre régulier
![]() Date d'inscription: avril 2003
Localisation: Taverny (95)
Âge: 39
Messages: 130
|
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 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++ ;
}
}
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 Bye...
__________________
Travailler dur n'a jamais tué personne, mais pourquoi prendre le risque (Edgar Bergen) |
|
|
|
|
|
#7 (permalink) |
|
Membre régulier
![]() Date d'inscription: avril 2003
Localisation: Taverny (95)
Âge: 39
Messages: 130
|
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) |
|
|
|
|
![]() |
![]() |
||
Clignotement d'un caractère en mode graphique
|
||
| Outils de la discussion | |
|
|