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
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
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
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
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 :
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).
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
Pour cela nous allons rediriger, au début de ton programme l'interruption 1Ch. Cette interruption sera appelée 18,2 fois par seconde.
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
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
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
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.Voici une fonction en C :
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) + 1Je 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.
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++ ; } }
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.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é.
Code : Sélectionner tout - Visualiser dans une fenêtre à part putsxy(0, 0, "Bonjour", 0x9E) ; // Affiche "Bonjour" en jaune clignotant sur fond bleu
Bye...
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.
Oups...désolé
Effectivement, en mode 12h, ce n'est plus le même problème. Encore désolé.
Bye...
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager